shadow-claw 1.59.6 → 1.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/.well-known/mcp/server-card.json +1 -1
  2. package/.well-known/mcp.json +1 -1
  3. package/README.md +6 -2
  4. package/dist/cli/build/build.js +1 -1
  5. package/dist/cli/chunk-3C5izdQW.js +1 -0
  6. package/dist/cli/chunk-B-75h9gX.js +1 -0
  7. package/dist/cli/{chunk-C9o6lXP3.js → chunk-B7Kn-otm.js} +1 -1
  8. package/dist/cli/{chunk-YX32FcN7.js → chunk-BBczgswQ.js} +1 -1
  9. package/dist/cli/{chunk-DcNxjqH6.js → chunk-BE-lYWcn.js} +1 -1
  10. package/dist/cli/{chunk-DJqHK-qS.js → chunk-BECr0WxI.js} +11 -11
  11. package/dist/cli/chunk-BEz1PD1_.js +1 -0
  12. package/dist/cli/chunk-BLzI1Fp2.js +1 -0
  13. package/dist/cli/{chunk-yiVdvGCJ.js → chunk-BVSC1MNQ.js} +11 -11
  14. package/dist/cli/{chunk-CX2itile.js → chunk-BdWcep6o.js} +1 -1
  15. package/dist/cli/{chunk-DLde6nuO.js → chunk-BfTpnSS4.js} +1 -1
  16. package/dist/cli/{chunk-D2_eAO83.js → chunk-BgvqTf7w.js} +1 -1
  17. package/dist/cli/chunk-BwsJfUT3.js +1 -0
  18. package/dist/cli/{chunk--PFY91kE.js → chunk-C9b4b7c_.js} +1 -1
  19. package/dist/cli/{chunk-D3y7h9Xe.js → chunk-CAw9XYFe.js} +1 -1
  20. package/dist/cli/chunk-CFCcbFs2.js +396 -0
  21. package/dist/cli/{chunk-Cnjb8Usu.js → chunk-CTarF4FC.js} +1 -1
  22. package/dist/cli/{chunk-DM4xsTry.js → chunk-Cbq5hpjb.js} +4 -4
  23. package/dist/cli/chunk-CjTjKy_v.js +310 -0
  24. package/dist/cli/chunk-Cjyu4cr_.js +36 -0
  25. package/dist/cli/{chunk-DUGZPka_.js → chunk-ClMKygjZ.js} +1 -1
  26. package/dist/cli/chunk-Cppnq1KF.js +1 -0
  27. package/dist/cli/{chunk-DvemF16v.js → chunk-D9QCNFMO.js} +1 -1
  28. package/dist/cli/chunk-DB21BMqt.js +7 -0
  29. package/dist/cli/{chunk-_Vo-o_e3.js → chunk-DHoIWvCc.js} +1 -1
  30. package/dist/cli/chunk-DZEN9T5y.js +1 -0
  31. package/dist/cli/{chunk-5rLO4DWS.js → chunk-Dl14OyYO.js} +9 -9
  32. package/dist/cli/chunk-Dl_vv0dI.js +1 -0
  33. package/dist/cli/chunk-Dpmfhlyl.js +1 -0
  34. package/dist/cli/{chunk-BrR1DOBS.js → chunk-Du7Xtucq.js} +1 -1
  35. package/dist/cli/{chunk-Bc_weULz.js → chunk-DxcDFUi_.js} +1 -1
  36. package/dist/cli/{chunk-Dt7-hzJU.js → chunk-DyyEWbV7.js} +1 -1
  37. package/dist/cli/chunk-N0x3mXU0.js +1 -0
  38. package/dist/cli/{chunk-CGoE4llV.js → chunk-V-w0Bata.js} +1 -1
  39. package/dist/cli/{chunk-C8DBACtx.js → chunk-ZxDxSSn-.js} +1 -1
  40. package/dist/cli/chunk-lPvFUkd5.js +7 -0
  41. package/dist/cli/{chunk-Ctg5L55n.js → chunk-n5s-sCdU.js} +1 -1
  42. package/dist/cli/{chunk-Dw8GndPD.js → chunk-nD9VPVMq.js} +1 -1
  43. package/dist/cli/{chunk-Cq_kQohv.js → chunk-rFuy8aS_.js} +1 -1
  44. package/dist/cli/{chunk-Bq38OubR.js → chunk-wjM6JXWa.js} +1 -1
  45. package/dist/cli/{chunk-3wTukVof.js → chunk-zcES9rut.js} +1 -1
  46. package/dist/cli/cli.js +3 -3
  47. package/dist/headless-agent.js +2 -2
  48. package/dist/lib/{app-routes-DJdIjp2V.js → app-routes-BXiRvlNl.js} +7 -25
  49. package/dist/lib/{app-routes-DJdIjp2V.js.map → app-routes-BXiRvlNl.js.map} +1 -1
  50. package/dist/lib/{attachment-capabilities-Dbb-4ZP5.js → attachment-capabilities-BjkEPip8.js} +2 -2
  51. package/dist/lib/{attachment-capabilities-Dbb-4ZP5.js.map → attachment-capabilities-BjkEPip8.js.map} +1 -1
  52. package/dist/lib/{channel-Dlru5ofR.js → channel-DB77spML.js} +3 -3
  53. package/dist/lib/{channel-Dlru5ofR.js.map → channel-DB77spML.js.map} +1 -1
  54. package/dist/lib/{chat-template-BuuLY8l7.js → chat-template-DPEKGJhB.js} +2 -2
  55. package/dist/lib/{chat-template-BuuLY8l7.js.map → chat-template-DPEKGJhB.js.map} +1 -1
  56. package/dist/lib/{compact-context-BtR55YPU.js → compact-context-Q9t9aL1e.js} +19 -19
  57. package/dist/lib/{compact-context-BtR55YPU.js.map → compact-context-Q9t9aL1e.js.map} +1 -1
  58. package/dist/lib/components/common/shadow-claw-provider-model-picker.js +1 -1
  59. package/dist/lib/components/index.js +27 -27
  60. package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
  61. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  62. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  63. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  64. package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
  65. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  66. package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
  67. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  68. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  69. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  70. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  71. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  72. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  73. package/dist/lib/components/shadow-claw-a2ui.js +1 -1
  74. package/dist/lib/components/shadow-claw-accounts.js +1 -1
  75. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  76. package/dist/lib/components/shadow-claw-channels.js +1 -1
  77. package/dist/lib/components/shadow-claw-chat.js +1 -1
  78. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  79. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  80. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  81. package/dist/lib/components/shadow-claw-files.js +1 -1
  82. package/dist/lib/components/shadow-claw-git.js +1 -1
  83. package/dist/lib/components/shadow-claw-integrations.js +1 -1
  84. package/dist/lib/components/shadow-claw-llm.js +1 -1
  85. package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
  86. package/dist/lib/components/shadow-claw-networking.js +1 -1
  87. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  88. package/dist/lib/components/shadow-claw-page-header.js +1 -1
  89. package/dist/lib/components/shadow-claw-pages.js +1 -1
  90. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  91. package/dist/lib/components/shadow-claw-provider-model-picker.js +1 -1
  92. package/dist/lib/components/shadow-claw-settings.js +1 -1
  93. package/dist/lib/components/shadow-claw-storage.js +1 -1
  94. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  95. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  96. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  97. package/dist/lib/components/shadow-claw-tools.js +1 -1
  98. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  99. package/dist/lib/components/shadow-claw.js +1 -1
  100. package/dist/lib/{config-DxNI3TlW.js → config-BrHR97zt.js} +2 -2
  101. package/dist/lib/{config-DxNI3TlW.js.map → config-BrHR97zt.js.map} +1 -1
  102. package/dist/lib/{configure-peer-js-ChDhOZU4.js → configure-peer-js-CgFiwoxY.js} +3 -3
  103. package/dist/lib/{configure-peer-js-ChDhOZU4.js.map → configure-peer-js-CgFiwoxY.js.map} +1 -1
  104. package/dist/lib/{connections-DC4NZkJE.js → connections-C1FWsBsE.js} +2 -2
  105. package/dist/lib/{connections-DC4NZkJE.js.map → connections-C1FWsBsE.js.map} +1 -1
  106. package/dist/lib/content/build-attachment-content-blocks.d.ts +2 -0
  107. package/dist/lib/{credentials-5vpz0XPk.js → credentials-CZbngHXW.js} +2 -2
  108. package/dist/lib/{credentials-5vpz0XPk.js.map → credentials-CZbngHXW.js.map} +1 -1
  109. package/dist/lib/{discover-skills-CD0sKvAI.js → discover-skills-CXyaWHKi.js} +13 -13
  110. package/dist/lib/{discover-skills-CD0sKvAI.js.map → discover-skills-CXyaWHKi.js.map} +1 -1
  111. package/dist/lib/{download-group-file-Dk3qaxhJ.js → download-group-file-D0wgg10Q.js} +2 -2
  112. package/dist/lib/{download-group-file-Dk3qaxhJ.js.map → download-group-file-D0wgg10Q.js.map} +1 -1
  113. package/dist/lib/{file-viewer-B4pRW-_G.js → file-viewer-DOfvX6yy.js} +5 -5
  114. package/dist/lib/{file-viewer-B4pRW-_G.js.map → file-viewer-DOfvX6yy.js.map} +1 -1
  115. package/dist/lib/{get-or-create-subscriber-id-HCcgDEPz.js → get-or-create-subscriber-id-wyzaML7Z.js} +2 -2
  116. package/dist/lib/{get-or-create-subscriber-id-HCcgDEPz.js.map → get-or-create-subscriber-id-wyzaML7Z.js.map} +1 -1
  117. package/dist/lib/{git-B3Q1euc5.js → git-CogDRlEz.js} +5 -5
  118. package/dist/lib/{git-B3Q1euc5.js.map → git-CogDRlEz.js.map} +1 -1
  119. package/dist/lib/{iframe-bridge-scripts-D8iuFhUk.js → iframe-bridge-scripts-Dx825LLG.js} +2 -2
  120. package/dist/lib/{iframe-bridge-scripts-D8iuFhUk.js.map → iframe-bridge-scripts-Dx825LLG.js.map} +1 -1
  121. package/dist/lib/index.js +28 -28
  122. package/dist/lib/{init-chat-split-resize-B0ODULx9.js → init-chat-split-resize-Cc0bd2z9.js} +2 -2
  123. package/dist/lib/{init-chat-split-resize-B0ODULx9.js.map → init-chat-split-resize-Cc0bd2z9.js.map} +1 -1
  124. package/dist/lib/{init-control-plane-C1FRRmjC.js → init-control-plane-CEGdzgWX.js} +15 -15
  125. package/dist/lib/{init-control-plane-C1FRRmjC.js.map → init-control-plane-CEGdzgWX.js.map} +1 -1
  126. package/dist/lib/{invoke-agent-CzN7sVh-.js → invoke-agent-cac3gCsj.js} +11 -11
  127. package/dist/lib/{invoke-agent-CzN7sVh-.js.map → invoke-agent-cac3gCsj.js.map} +1 -1
  128. package/dist/lib/{markdown-mbNo7cV3.js → markdown--6vTAPEH.js} +2 -2
  129. package/dist/lib/{markdown-mbNo7cV3.js.map → markdown--6vTAPEH.js.map} +1 -1
  130. package/dist/lib/{mcp-reconnect-3T7yWGEY.js → mcp-reconnect-BeqQvNWO.js} +3 -3
  131. package/dist/lib/{mcp-reconnect-3T7yWGEY.js.map → mcp-reconnect-BeqQvNWO.js.map} +1 -1
  132. package/dist/lib/{model-ranking-DGNSWYwN.js → model-ranking-BhsJV7vb.js} +2 -2
  133. package/dist/lib/{model-ranking-DGNSWYwN.js.map → model-ranking-BhsJV7vb.js.map} +1 -1
  134. package/dist/lib/{move-group-entry-NMTJ59M9.js → move-group-entry-D8dptMg0.js} +5 -5
  135. package/dist/lib/{move-group-entry-NMTJ59M9.js.map → move-group-entry-D8dptMg0.js.map} +1 -1
  136. package/dist/lib/{orchestrator-B8FV1V7x.js → orchestrator-BBAwy9Nm.js} +24 -24
  137. package/dist/lib/{orchestrator-B8FV1V7x.js.map → orchestrator-BBAwy9Nm.js.map} +1 -1
  138. package/dist/lib/{orchestrator-i_QJ-o22.js → orchestrator-cRBe3lhq.js} +11 -11
  139. package/dist/lib/orchestrator-cRBe3lhq.js.map +1 -0
  140. package/dist/lib/{parse-path-DPCn-HwI.js → parse-path-BOHQP_IQ.js} +3 -3
  141. package/dist/lib/{parse-path-DPCn-HwI.js.map → parse-path-BOHQP_IQ.js.map} +1 -1
  142. package/dist/lib/{peerjs-z5zeioPV.js → peerjs-BLg8aGUj.js} +8 -8
  143. package/dist/lib/{peerjs-z5zeioPV.js.map → peerjs-BLg8aGUj.js.map} +1 -1
  144. package/dist/lib/{process-peer-query-param-CJp7w7AU.js → process-peer-query-param-BnsVnxzH.js} +5 -5
  145. package/dist/lib/{process-peer-query-param-CJp7w7AU.js.map → process-peer-query-param-BnsVnxzH.js.map} +1 -1
  146. package/dist/lib/{process-pending-shared-payloads-B6_TlBFA.js → process-pending-shared-payloads-DBZfZOOa.js} +4 -4
  147. package/dist/lib/{process-pending-shared-payloads-B6_TlBFA.js.map → process-pending-shared-payloads-DBZfZOOa.js.map} +1 -1
  148. package/dist/lib/{process-room-query-param-C3FFGGn6.js → process-room-query-param-B8EYg_-r.js} +4 -4
  149. package/dist/lib/{process-room-query-param-C3FFGGn6.js.map → process-room-query-param-B8EYg_-r.js.map} +1 -1
  150. package/dist/lib/{provider-DcQZypu5.js → provider-BC9KPI14.js} +3 -3
  151. package/dist/lib/{provider-DcQZypu5.js.map → provider-BC9KPI14.js.map} +1 -1
  152. package/dist/lib/{push-client-Cx5rMs6J.js → push-client-CAm6UMvE.js} +5 -5
  153. package/dist/lib/{push-client-Cx5rMs6J.js.map → push-client-CAm6UMvE.js.map} +1 -1
  154. package/dist/lib/{read-group-file-bytes-CXOG_YyM.js → read-group-file-bytes-UQIk1eJG.js} +2 -2
  155. package/dist/lib/{read-group-file-bytes-CXOG_YyM.js.map → read-group-file-bytes-UQIk1eJG.js.map} +1 -1
  156. package/dist/lib/{rooms-CwlkYLDU.js → rooms-Dzphx3rK.js} +2 -2
  157. package/dist/lib/{rooms-CwlkYLDU.js.map → rooms-Dzphx3rK.js.map} +1 -1
  158. package/dist/lib/{shadow-claw-DoQ7fgl5.js → shadow-claw-CGl8tXtG.js} +17 -20
  159. package/dist/lib/shadow-claw-CGl8tXtG.js.map +1 -0
  160. package/dist/lib/{shadow-claw-a2ui-Br6qJMs1.js → shadow-claw-a2ui-lG0vQbW8.js} +2 -2
  161. package/dist/lib/{shadow-claw-a2ui-Br6qJMs1.js.map → shadow-claw-a2ui-lG0vQbW8.js.map} +1 -1
  162. package/dist/lib/{shadow-claw-accounts-BTDILfWw.js → shadow-claw-accounts-CkqyCxwp.js} +3 -3
  163. package/dist/lib/{shadow-claw-accounts-BTDILfWw.js.map → shadow-claw-accounts-CkqyCxwp.js.map} +1 -1
  164. package/dist/lib/{shadow-claw-channel-config-IKiL34tI.js → shadow-claw-channel-config-BNIWCdsL.js} +4 -4
  165. package/dist/lib/{shadow-claw-channel-config-IKiL34tI.js.map → shadow-claw-channel-config-BNIWCdsL.js.map} +1 -1
  166. package/dist/lib/{shadow-claw-channels-JgEzuHWK.js → shadow-claw-channels-C2QSn4Ew.js} +3 -3
  167. package/dist/lib/{shadow-claw-channels-JgEzuHWK.js.map → shadow-claw-channels-C2QSn4Ew.js.map} +1 -1
  168. package/dist/lib/{shadow-claw-chat-SGUDT31r.js → shadow-claw-chat-Wx3y9y6c.js} +15 -15
  169. package/dist/lib/{shadow-claw-chat-SGUDT31r.js.map → shadow-claw-chat-Wx3y9y6c.js.map} +1 -1
  170. package/dist/lib/{shadow-claw-control-plane-CRWFZ3vD.js → shadow-claw-control-plane-D5E4cFGu.js} +7 -7
  171. package/dist/lib/{shadow-claw-control-plane-CRWFZ3vD.js.map → shadow-claw-control-plane-D5E4cFGu.js.map} +1 -1
  172. package/dist/lib/{shadow-claw-conversations-D23GJ7qo.js → shadow-claw-conversations-BtDv7GRW.js} +7 -7
  173. package/dist/lib/{shadow-claw-conversations-D23GJ7qo.js.map → shadow-claw-conversations-BtDv7GRW.js.map} +1 -1
  174. package/dist/lib/{shadow-claw-file-viewer-C1V8WTiU.js → shadow-claw-file-viewer-CG40kwWV.js} +10 -10
  175. package/dist/lib/{shadow-claw-file-viewer-C1V8WTiU.js.map → shadow-claw-file-viewer-CG40kwWV.js.map} +1 -1
  176. package/dist/lib/{shadow-claw-files-DN7irmE1.js → shadow-claw-files-BOUULrlX.js} +11 -11
  177. package/dist/lib/{shadow-claw-files-DN7irmE1.js.map → shadow-claw-files-BOUULrlX.js.map} +1 -1
  178. package/dist/lib/{shadow-claw-git-D-1oIh65.js → shadow-claw-git-BeHV73_9.js} +6 -6
  179. package/dist/lib/{shadow-claw-git-D-1oIh65.js.map → shadow-claw-git-BeHV73_9.js.map} +1 -1
  180. package/dist/lib/{shadow-claw-integrations-CZjnm7cM.js → shadow-claw-integrations-RZZ-m-Id.js} +4 -4
  181. package/dist/lib/{shadow-claw-integrations-CZjnm7cM.js.map → shadow-claw-integrations-RZZ-m-Id.js.map} +1 -1
  182. package/dist/lib/{shadow-claw-llm-4Gefh5FN.js → shadow-claw-llm-KONyWKZM.js} +9 -9
  183. package/dist/lib/{shadow-claw-llm-4Gefh5FN.js.map → shadow-claw-llm-KONyWKZM.js.map} +1 -1
  184. package/dist/lib/{shadow-claw-mcp-remote-B9ssb3YV.js → shadow-claw-mcp-remote-BKFROurv.js} +4 -4
  185. package/dist/lib/{shadow-claw-mcp-remote-B9ssb3YV.js.map → shadow-claw-mcp-remote-BKFROurv.js.map} +1 -1
  186. package/dist/lib/{shadow-claw-networking-BN5BB4hb.js → shadow-claw-networking-Diy3JJkc.js} +2 -2
  187. package/dist/lib/{shadow-claw-networking-BN5BB4hb.js.map → shadow-claw-networking-Diy3JJkc.js.map} +1 -1
  188. package/dist/lib/{shadow-claw-notifications-71KARtkY.js → shadow-claw-notifications-C-upPa-4.js} +3 -3
  189. package/dist/lib/{shadow-claw-notifications-71KARtkY.js.map → shadow-claw-notifications-C-upPa-4.js.map} +1 -1
  190. package/dist/lib/{shadow-claw-page-header-DMGO-TSe.js → shadow-claw-page-header-C_Qr3xZM.js} +2 -2
  191. package/dist/lib/{shadow-claw-page-header-DMGO-TSe.js.map → shadow-claw-page-header-C_Qr3xZM.js.map} +1 -1
  192. package/dist/lib/{shadow-claw-pages-BiRM6qiA.js → shadow-claw-pages-CfAjUKgd.js} +11 -11
  193. package/dist/lib/{shadow-claw-pages-BiRM6qiA.js.map → shadow-claw-pages-CfAjUKgd.js.map} +1 -1
  194. package/dist/lib/{shadow-claw-peerjs-BZu7jNSe.js → shadow-claw-peerjs-t4YibS9s.js} +6 -6
  195. package/dist/lib/{shadow-claw-peerjs-BZu7jNSe.js.map → shadow-claw-peerjs-t4YibS9s.js.map} +1 -1
  196. package/dist/lib/{shadow-claw-provider-model-picker-BXYXEobD.js → shadow-claw-provider-model-picker-B-Ct4yW-.js} +2 -2
  197. package/dist/lib/{shadow-claw-provider-model-picker-BXYXEobD.js.map → shadow-claw-provider-model-picker-B-Ct4yW-.js.map} +1 -1
  198. package/dist/lib/{shadow-claw-settings-CcT5EK08.js → shadow-claw-settings-Cg5V0e9g.js} +7 -7
  199. package/dist/lib/{shadow-claw-settings-CcT5EK08.js.map → shadow-claw-settings-Cg5V0e9g.js.map} +1 -1
  200. package/dist/lib/{shadow-claw-storage-eTOpbvpi.js → shadow-claw-storage-C7tCnsSG.js} +5 -5
  201. package/dist/lib/{shadow-claw-storage-eTOpbvpi.js.map → shadow-claw-storage-C7tCnsSG.js.map} +1 -1
  202. package/dist/lib/{shadow-claw-task-server-DFImTUbw.js → shadow-claw-task-server-BObsRdf8.js} +2 -2
  203. package/dist/lib/{shadow-claw-task-server-DFImTUbw.js.map → shadow-claw-task-server-BObsRdf8.js.map} +1 -1
  204. package/dist/lib/{shadow-claw-tasks-BjaxsmUx.js → shadow-claw-tasks-B2EEqrcY.js} +9 -9
  205. package/dist/lib/{shadow-claw-tasks-BjaxsmUx.js.map → shadow-claw-tasks-B2EEqrcY.js.map} +1 -1
  206. package/dist/lib/{shadow-claw-terminal-C-4wreFe.js → shadow-claw-terminal-DSHfO2b9.js} +2 -2
  207. package/dist/lib/{shadow-claw-terminal-C-4wreFe.js.map → shadow-claw-terminal-DSHfO2b9.js.map} +1 -1
  208. package/dist/lib/{shadow-claw-tools-COdrGZJk.js → shadow-claw-tools-DwPBADua.js} +7 -7
  209. package/dist/lib/{shadow-claw-tools-COdrGZJk.js.map → shadow-claw-tools-DwPBADua.js.map} +1 -1
  210. package/dist/lib/{shadow-claw-webvm-sxqVjO0L.js → shadow-claw-webvm-CY4qGaMB.js} +3 -3
  211. package/dist/lib/{shadow-claw-webvm-sxqVjO0L.js.map → shadow-claw-webvm-CY4qGaMB.js.map} +1 -1
  212. package/dist/lib/{sync-web-mcp-registration-D4hdUwtv.js → sync-web-mcp-registration-BiOZvW-R.js} +6 -6
  213. package/dist/lib/{sync-web-mcp-registration-D4hdUwtv.js.map → sync-web-mcp-registration-BiOZvW-R.js.map} +1 -1
  214. package/dist/lib/{system-prompt-DT_KeYaL.js → system-prompt-CxJ3Nx4c.js} +9 -8
  215. package/dist/lib/system-prompt-CxJ3Nx4c.js.map +1 -0
  216. package/dist/lib/{tools-Beuyh8y1.js → tools-B8OJ4sMF.js} +4 -4
  217. package/dist/lib/{tools-Beuyh8y1.js.map → tools-B8OJ4sMF.js.map} +1 -1
  218. package/dist/lib/{transformers-DydnReu4.js → transformers-BMURofG6.js} +2 -2
  219. package/dist/lib/{transformers-DydnReu4.js.map → transformers-BMURofG6.js.map} +1 -1
  220. package/dist/lib/{trusted-types-CfwZl_rr.js → trusted-types-HwsGS5Nj.js} +19 -17
  221. package/dist/lib/{trusted-types-CfwZl_rr.js.map → trusted-types-HwsGS5Nj.js.map} +1 -1
  222. package/dist/lib/{upload-group-file-BbBzjTcN.js → upload-group-file-CJpoNjEb.js} +3 -3
  223. package/dist/lib/{upload-group-file-BbBzjTcN.js.map → upload-group-file-CJpoNjEb.js.map} +1 -1
  224. package/dist/lib/utils/index.js +1 -1
  225. package/dist/lib/utils/namespaced-storage.js +1 -1
  226. package/dist/lib/utils/runtime-assets.js +1 -1
  227. package/dist/lib/utils/utils.js +1 -1
  228. package/dist/lib/{webmcp-DCfAFiIO.js → webmcp-BoMTvgmX.js} +3 -3
  229. package/dist/lib/{webmcp-DCfAFiIO.js.map → webmcp-BoMTvgmX.js.map} +1 -1
  230. package/dist/lib/{write-group-file-bytes-Ccn-VFUU.js → write-group-file-bytes-CNT7DqOZ.js} +3 -3
  231. package/dist/lib/{write-group-file-bytes-Ccn-VFUU.js.map → write-group-file-bytes-CNT7DqOZ.js.map} +1 -1
  232. package/dist/public/.well-known/mcp/server-card.json +1 -1
  233. package/dist/public/.well-known/mcp.json +1 -1
  234. package/dist/public/AGENTS.md +3 -1
  235. package/dist/public/README.md +6 -2
  236. package/dist/public/agent.worker.js +1 -1
  237. package/dist/public/attachment-capabilities-AdwXt3--.js +1 -0
  238. package/dist/public/{channel-BylT3rJC.js → channel-DIpDQekL.js} +1 -1
  239. package/dist/public/{chat-template-DPHJy7tr.js → chat-template-CXKs8lFR.js} +1 -1
  240. package/dist/public/compact-context-BQ2ZXoAc.js +5 -0
  241. package/dist/public/{compact-context-BINQh64w.js → compact-context-dHitmPsV.js} +2 -2
  242. package/dist/public/config-C16fFWtP.js +1 -0
  243. package/dist/public/{configure-peer-js-DChhcOfe.js → configure-peer-js-DV1rqvFX.js} +1 -1
  244. package/dist/public/{connections-CHaw0VqP.js → connections-Dxwj8yK_.js} +1 -1
  245. package/dist/public/{create-model-cache-fetch-DQebkoPL.js → create-model-cache-fetch-B0mSCEk6.js} +1 -1
  246. package/dist/public/{credentials-CgVqS119.js → credentials-CJUQ5Ep2.js} +1 -1
  247. package/dist/public/{custom-element-security-kiDhPfb8.js → custom-element-security-B2daIE5r.js} +2 -2
  248. package/dist/public/{discover-skills-Cvmx5I9V.js → discover-skills-BWJB8HUA.js} +6 -6
  249. package/dist/public/docs/architecture/overview.md +1 -1
  250. package/dist/public/docs/example/article/index.html +29 -30
  251. package/dist/public/docs/example/article.html +29 -30
  252. package/dist/public/docs/publishing/index.html +29 -30
  253. package/dist/public/docs/publishing.html +29 -30
  254. package/dist/public/docs/skill-creator/index.html +29 -30
  255. package/dist/public/docs/skill-creator.html +29 -30
  256. package/dist/public/docs/subsystems/attachment-capabilities.md +14 -1
  257. package/dist/public/docs/subsystems/cli.md +95 -51
  258. package/dist/public/docs/subsystems/pages.md +5 -0
  259. package/dist/public/{download-group-file-BapoRgfU.js → download-group-file-BkMH-JKi.js} +1 -1
  260. package/dist/public/e2e/README.md +1 -1
  261. package/dist/public/{e2e-bridge-C0g8vZKr.js → e2e-bridge-lP2qqiv3.js} +1 -1
  262. package/dist/public/get-group-dir-D--BiEyk.js +1 -0
  263. package/dist/public/{get-or-create-subscriber-id-GvRZYXwA.js → get-or-create-subscriber-id-jVHnQfbr.js} +1 -1
  264. package/dist/public/{git-CaAAZfVd.js → git-DjmQ16rm.js} +2 -2
  265. package/dist/public/{iframe-bridge-scripts-BnqtKhE4.js → iframe-bridge-scripts-CO0izGjW.js} +1 -1
  266. package/dist/public/index.html +29 -30
  267. package/dist/public/index.js +1 -1
  268. package/dist/public/{init-chat-split-resize-Btonoy8u.js → init-chat-split-resize-C8AqCCiK.js} +1 -1
  269. package/dist/public/init-control-plane-Ctz7FI8M.js +1 -0
  270. package/dist/public/{invoke-agent-B3Osw6K7.js → invoke-agent-C_geruwq.js} +1 -1
  271. package/dist/public/llms.txt +1 -1
  272. package/dist/public/main/index.html +29 -30
  273. package/dist/public/main/memory/index.html +29 -30
  274. package/dist/public/main/memory.html +29 -30
  275. package/dist/public/main.html +29 -30
  276. package/dist/public/{markdown-CPbU4r1U.js → markdown-CDSb5Hrl.js} +1 -1
  277. package/dist/public/{mcp-reconnect-CzROVsXG.js → mcp-reconnect-iPZPihwX.js} +1 -1
  278. package/dist/public/{memory-storage-BkoMlxOr.js → memory-storage-2m7KZ-aP.js} +1 -1
  279. package/dist/public/{model-ranking-CK0iBo3Z.js → model-ranking-BgOSaNIy.js} +1 -1
  280. package/dist/public/{move-group-entry-CTxoq7lw.js → move-group-entry-QQ9Hkk54.js} +1 -1
  281. package/dist/public/{orchestrator-BrDjQbGf.js → orchestrator-C1kaTltu.js} +2 -2
  282. package/dist/public/orchestrator-Li1UAsv7.js +63 -0
  283. package/dist/public/{peerjs-CgF4Iz5W.js → peerjs-DbBryE-9.js} +1 -1
  284. package/dist/public/{process-peer-query-param-BL2k0Hu-.js → process-peer-query-param-DQIgr3KL.js} +1 -1
  285. package/dist/public/{process-pending-shared-payloads-C1AgGvn8.js → process-pending-shared-payloads-Ctb-TFqB.js} +1 -1
  286. package/dist/public/{process-room-query-param-DM0QCq3_.js → process-room-query-param-F-XnIVoZ.js} +1 -1
  287. package/dist/public/provider-YPZmsuHR.js +1 -0
  288. package/dist/public/{push-client-DJEOz7bi.js → push-client-DRx9Eggz.js} +1 -1
  289. package/dist/public/{rooms-C6LXIJl4.js → rooms-BurBI7is.js} +1 -1
  290. package/dist/public/service-worker/init.js +1 -1
  291. package/dist/public/service-worker.js +1 -1
  292. package/dist/public/shadow-claw-Bg9AQ5x_.js +1176 -0
  293. package/dist/public/{shadow-claw-accounts--4hd_oCz.js → shadow-claw-accounts-B3mjYI0M.js} +1 -1
  294. package/dist/public/{shadow-claw-card-IbNlZAdK.js → shadow-claw-card-tcXRS1GF.js} +1 -1
  295. package/dist/public/{shadow-claw-channels-Vq_pPGa2.js → shadow-claw-channels-BiSfLvWv.js} +1 -1
  296. package/dist/public/{shadow-claw-chat-D7_GS25e.js → shadow-claw-chat-N5jMsXZZ.js} +3 -3
  297. package/dist/public/{shadow-claw-control-plane-WTMEV8_p.js → shadow-claw-control-plane-DFVe_Xdq.js} +2 -2
  298. package/dist/public/{shadow-claw-conversations-CLQgU1IT.js → shadow-claw-conversations-wAR06_ya.js} +1 -1
  299. package/dist/public/{shadow-claw-empty-state-D4CrFGsN.js → shadow-claw-empty-state-CnPm3NVM.js} +1 -1
  300. package/dist/public/{shadow-claw-file-viewer-BhqiqLWQ.js → shadow-claw-file-viewer-sZN_FCDW.js} +4 -4
  301. package/dist/public/{shadow-claw-files-senDiG9l.js → shadow-claw-files-CnvkCbd4.js} +2 -2
  302. package/dist/public/{shadow-claw-git-DOOCqY23.js → shadow-claw-git-BBHfClGk.js} +2 -2
  303. package/dist/public/{shadow-claw-integrations-Bsvc3Agq.js → shadow-claw-integrations-DvdBqzRJ.js} +1 -1
  304. package/dist/public/{shadow-claw-llm-actYICAk.js → shadow-claw-llm-YfohG519.js} +2 -2
  305. package/dist/public/{shadow-claw-mcp-remote-BYUgrK3v.js → shadow-claw-mcp-remote-BAVbf5pi.js} +1 -1
  306. package/dist/public/{shadow-claw-networking-Dk3p5Ny_.js → shadow-claw-networking-CZ4LWPW7.js} +1 -1
  307. package/dist/public/{shadow-claw-notifications-CzPAlay8.js → shadow-claw-notifications-BHwyREkG.js} +1 -1
  308. package/dist/public/{shadow-claw-page-header-CjJpVkyL.js → shadow-claw-page-header-De6Qf6eY.js} +1 -1
  309. package/dist/public/{shadow-claw-page-header-action-button-2DH5O1TD.js → shadow-claw-page-header-action-button-FSOhTc9z.js} +1 -1
  310. package/dist/public/{shadow-claw-pages-3r5I-wI8.js → shadow-claw-pages-D_oPyDca.js} +6 -6
  311. package/dist/public/{shadow-claw-pdf-viewer-BiCEwsoY.js → shadow-claw-pdf-viewer-CrU4wqRq.js} +1 -1
  312. package/dist/public/{shadow-claw-settings-DgB9RSZN.js → shadow-claw-settings-DkUhvxVr.js} +2 -2
  313. package/dist/public/{shadow-claw-storage-JB_43nd8.js → shadow-claw-storage-D0o56Tjw.js} +1 -1
  314. package/dist/public/{shadow-claw-task-server-oi5UIxdA.js → shadow-claw-task-server-4rkroO9K.js} +1 -1
  315. package/dist/public/{shadow-claw-tasks-CnyiOt81.js → shadow-claw-tasks-BdP7lmvu.js} +3 -3
  316. package/dist/public/{shadow-claw-terminal-BC3RynHt.js → shadow-claw-terminal-DVHX7Fsu.js} +1 -1
  317. package/dist/public/{shadow-claw-toast-YjG--2Za.js → shadow-claw-toast-B9Y9tSkW.js} +1 -1
  318. package/dist/public/{shadow-claw-tools-Bbwk4vlT.js → shadow-claw-tools-BwwY53Lr.js} +1 -1
  319. package/dist/public/{shadow-claw-webvm-HZqzl2H5.js → shadow-claw-webvm-CXGdkCNM.js} +1 -1
  320. package/dist/public/{sync-web-mcp-registration-BaH2nAP0.js → sync-web-mcp-registration-DVK_IhXZ.js} +1 -1
  321. package/dist/public/{system-prompt-Dck3N8T0.js → system-prompt-BmswoQwF.js} +2 -2
  322. package/dist/public/{tools-DHA1dK2I.js → tools-D-52Zmfc.js} +1 -1
  323. package/dist/public/{transformers-C-DuTM2K.js → transformers-CQ9ss9rD.js} +1 -1
  324. package/dist/public/{upload-group-file-Cejr3zo1.js → upload-group-file-A8kB7lvO.js} +1 -1
  325. package/dist/public/{webmcp-CMRtu57-.js → webmcp-DIUZjVF5.js} +1 -1
  326. package/dist/public/{workbox-92eae37e.js → workbox-e4022e15.js} +1 -1
  327. package/dist/public/{write-group-file-CmJuVQNO.js → write-group-file-R67DjJ-q.js} +1 -1
  328. package/dist/public/{write-group-file-bytes-Cejr3zo1.js → write-group-file-bytes-A8kB7lvO.js} +1 -1
  329. package/dist/public/{zip-reader-CuQ13eLe.js → zip-reader-JHoTbATw.js} +1 -1
  330. package/dist/server.js +6 -6
  331. package/package.json +1 -1
  332. package/dist/cli/chunk-2gZFafgY.js +0 -1
  333. package/dist/cli/chunk-BFziiMKt.js +0 -7
  334. package/dist/cli/chunk-BM3llsxb.js +0 -1
  335. package/dist/cli/chunk-BUNoeMKY.js +0 -36
  336. package/dist/cli/chunk-Bj5qFsDi.js +0 -7
  337. package/dist/cli/chunk-Bj95zm-y.js +0 -1
  338. package/dist/cli/chunk-BpyP-esT.js +0 -1
  339. package/dist/cli/chunk-CX696s3_.js +0 -1
  340. package/dist/cli/chunk-DRxCrCAA.js +0 -139
  341. package/dist/cli/chunk-DjbCHa0h.js +0 -1
  342. package/dist/cli/chunk-Ds5-K-9o.js +0 -1
  343. package/dist/cli/chunk-DsQhAF31.js +0 -1
  344. package/dist/cli/chunk-VM-dECyG.js +0 -1
  345. package/dist/cli/chunk-gvNsvav0.js +0 -225
  346. package/dist/cli/chunk-heu2xRw1.js +0 -1
  347. package/dist/lib/orchestrator-i_QJ-o22.js.map +0 -1
  348. package/dist/lib/shadow-claw-DoQ7fgl5.js.map +0 -1
  349. package/dist/lib/system-prompt-DT_KeYaL.js.map +0 -1
  350. package/dist/public/app-routes-V_-URXc5.js +0 -1
  351. package/dist/public/attachment-capabilities-B6ibLwQB.js +0 -1
  352. package/dist/public/compact-context-CX4H8V57.js +0 -5
  353. package/dist/public/config-C-YdSFZB.js +0 -1
  354. package/dist/public/get-group-dir-DL44kvqW.js +0 -1
  355. package/dist/public/init-control-plane-BoJijVtf.js +0 -1
  356. package/dist/public/orchestrator-CaUpEVkQ.js +0 -63
  357. package/dist/public/provider-DNIL4-Hw.js +0 -1
  358. package/dist/public/shadow-claw-DdgeYPg5.js +0 -1176
@@ -1,7 +1,7 @@
1
1
  import { n as __exportAll } from "./rolldown-runtime-DwyhSnWe.js";
2
2
  import { r as txPromise, t as getConfig } from "./get-config-BWhs5HFF.js";
3
- import { r as CONFIG_KEYS, x as OPFS_ROOT } from "./config-DxNI3TlW.js";
4
- import { o as getDeploymentNamespace } from "./app-routes-DJdIjp2V.js";
3
+ import { r as CONFIG_KEYS, x as OPFS_ROOT } from "./config-BrHR97zt.js";
4
+ import { a as getDeploymentNamespace } from "./app-routes-BXiRvlNl.js";
5
5
 
6
6
  //#region src/config/headless.ts
7
7
  /**
@@ -586,4 +586,4 @@ function parsePath(filePath) {
586
586
 
587
587
  //#endregion
588
588
  export { getStorageRoot as a, isStaleHandleError as c, memory_storage_exports as d, BROWSER_ONLY_TOOLS as f, getOpfsRootDirName as i, resetStorageDirectory as l, isHeadlessMode as m, getGroupDir as n, getStorageStatus as o, filterHeadlessTools as p, get_group_dir_exports as r, invalidateStorageRoot as s, parsePath as t, setStorageRoot as u };
589
- //# sourceMappingURL=parse-path-DPCn-HwI.js.map
589
+ //# sourceMappingURL=parse-path-BOHQP_IQ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse-path-DPCn-HwI.js","names":[],"sources":["../../src/config/headless.ts","../../src/storage/get-nested-dir.ts","../../src/db/delete-config.ts","../../src/storage/memory-storage.ts","../../src/storage/storage.ts","../../src/storage/get-group-dir.ts","../../src/storage/parse-path.ts"],"sourcesContent":["/**\n * Headless mode flag.\n *\n * Set to `true` when the agent is running in the headless CLI participant\n * mode (i.e. `npx shadow-claw agent`). Browser-only tools check this flag\n * and return a clear error rather than silently failing.\n */\n\nlet _headless = false;\n\n/**\n * Tools that require an interactive browser environment (DOM, canvas, Web Components,\n * PeerJS rooms, Web Share, Web Push notifications, or subagents).\n * In headless mode, these tools are never presented to the LLM or executed.\n */\nexport const BROWSER_ONLY_TOOLS: ReadonlySet<string> = new Set([\n \"ask_user\",\n \"attach_file_to_chat\",\n \"clear_chat\",\n \"create_room\",\n \"invite_to_room\",\n \"leave_room\",\n \"list_components\",\n \"list_room_members\",\n \"open_file\",\n \"render_component\",\n \"send_file\",\n \"send_notification\",\n \"show_toast\",\n \"spawn_subagent\",\n]);\n\n/**\n * Returns true if the tool can be safely presented and executed in headless CLI mode.\n */\nexport function isToolHeadlessSafe(toolName: string): boolean {\n return !BROWSER_ONLY_TOOLS.has(toolName);\n}\n\n/**\n * Filters a list of tool definitions or schemas to retain only headless-safe tools.\n */\nexport function filterHeadlessTools<T extends { name: string }>(\n tools: T[],\n): T[] {\n return tools.filter((t) => !BROWSER_ONLY_TOOLS.has(t.name));\n}\n\n/**\n * Returns true when the process is running as a headless CLI agent,\n * not in a browser Web Worker.\n */\nexport function isHeadlessMode(): boolean {\n return _headless;\n}\n\n/**\n * Enable or disable headless mode. Call `setHeadlessMode(true)` early in\n * the CLI agent bootstrap, before any tool execution.\n */\nexport function setHeadlessMode(value: boolean): void {\n _headless = value;\n}\n","/**\n * Get a handle to a nested directory, creating intermediate dirs.\n */\nexport async function getNestedDir(\n root: FileSystemDirectoryHandle,\n ...segments: string[]\n): Promise<FileSystemDirectoryHandle> {\n let current = root;\n\n for (const seg of segments) {\n const child = await current.getDirectoryHandle(seg, { create: true });\n\n // Guard against stale handles (e.g. Electron after app restart) where\n // getDirectoryHandle returns the same directory instead of navigating.\n if (\n typeof current.isSameEntry === \"function\" &&\n (await current.isSameEntry(child))\n ) {\n throw new Error(\n `Directory navigation failed: \"${seg}\" resolved to the same directory as its parent. ` +\n \"The stored directory handle may be stale — try re-selecting the storage folder.\",\n );\n }\n\n current = child;\n }\n\n return current;\n}\n","import { txPromise } from \"./tx-promise.js\";\nimport type { ShadowClawDatabase } from \"./types.js\";\n\n/**\n * Delete a config value\n */\nexport function deleteConfig(\n db: ShadowClawDatabase,\n key: string,\n): Promise<void> {\n return txPromise(db, \"config\", \"readwrite\", (store) =>\n store.delete(key),\n ).then(() => undefined);\n}\n","import { OPFS_ROOT } from \"../config/config.js\";\n\nfunction createDOMException(message: string, name: string): DOMException {\n if (typeof DOMException !== \"undefined\") {\n try {\n return new DOMException(message, name);\n } catch {\n // Fall back if constructor fails\n }\n }\n\n const err = new Error(message) as any;\n err.name = name;\n\n return err;\n}\n\nfunction makeAsyncIterator<T>(\n gen: () => AsyncGenerator<T>,\n): FileSystemDirectoryHandleAsyncIterator<T> {\n const iterator = gen();\n (iterator as any)[Symbol.asyncDispose ?? Symbol.for(\"Symbol.asyncDispose\")] =\n async () => {};\n\n return iterator as any;\n}\n\n/**\n * In-memory implementation of FileSystemSyncAccessHandle.\n */\nexport class MemorySyncAccessHandle {\n private _file: MemoryFileHandle;\n private _closed = false;\n\n constructor(file: MemoryFileHandle) {\n this._file = file;\n }\n\n close(): void {\n this._closed = true;\n }\n\n flush(): void {\n // No-op for in-memory storage\n }\n\n getSize(): number {\n if (this._closed) {\n throw createDOMException(\n \"SyncAccessHandle is closed\",\n \"InvalidStateError\",\n );\n }\n\n return this._file.getRawData().byteLength;\n }\n\n read(buffer: ArrayBufferView, options?: { at?: number }): number {\n if (this._closed) {\n throw createDOMException(\n \"SyncAccessHandle is closed\",\n \"InvalidStateError\",\n );\n }\n const data = this._file.getRawData();\n const at = options?.at ?? 0;\n if (at >= data.byteLength) {\n return 0;\n }\n const target = new Uint8Array(\n buffer.buffer,\n buffer.byteOffset,\n buffer.byteLength,\n );\n const source = data.subarray(at, at + target.byteLength);\n target.set(source);\n\n return source.byteLength;\n }\n\n write(buffer: ArrayBufferView, options?: { at?: number }): number {\n if (this._closed) {\n throw createDOMException(\n \"SyncAccessHandle is closed\",\n \"InvalidStateError\",\n );\n }\n const src = new Uint8Array(\n buffer.buffer,\n buffer.byteOffset,\n buffer.byteLength,\n );\n const at = options?.at ?? 0;\n const current = this._file.getRawData();\n const needed = at + src.byteLength;\n let newBuf: Uint8Array;\n if (needed > current.byteLength) {\n newBuf = new Uint8Array(needed);\n newBuf.set(current);\n } else {\n newBuf = new Uint8Array(current);\n }\n newBuf.set(src, at);\n this._file.setRawData(newBuf);\n\n return src.byteLength;\n }\n\n truncate(newSize: number): void {\n if (this._closed) {\n throw createDOMException(\n \"SyncAccessHandle is closed\",\n \"InvalidStateError\",\n );\n }\n const current = this._file.getRawData();\n const newBuf = new Uint8Array(newSize);\n newBuf.set(current.subarray(0, Math.min(current.byteLength, newSize)));\n this._file.setRawData(newBuf);\n }\n}\n\n/**\n * In-memory implementation of FileSystemWritableFileStream.\n */\nexport class MemoryWritableStream {\n private _file: MemoryFileHandle;\n private _buffer: Uint8Array;\n private _position = 0;\n private _length = 0;\n private _closed = false;\n\n constructor(file: MemoryFileHandle, keepExistingData = false) {\n this._file = file;\n const existing = file.getRawData();\n if (keepExistingData) {\n this._buffer = new Uint8Array(existing);\n this._length = existing.byteLength;\n } else {\n this._buffer = new Uint8Array(1024);\n this._length = 0;\n }\n }\n\n async write(chunk: any): Promise<void> {\n if (this._closed) {\n throw createDOMException(\"WritableStream is closed\", \"InvalidStateError\");\n }\n\n let bytes: Uint8Array;\n if (typeof chunk === \"string\") {\n bytes = new TextEncoder().encode(chunk);\n } else if (chunk instanceof Uint8Array) {\n bytes = chunk;\n } else if (chunk instanceof ArrayBuffer) {\n bytes = new Uint8Array(chunk);\n } else if (typeof Blob !== \"undefined\" && chunk instanceof Blob) {\n if (typeof chunk.arrayBuffer === \"function\") {\n bytes = new Uint8Array(await chunk.arrayBuffer());\n } else if (typeof (chunk as any).text === \"function\") {\n bytes = new TextEncoder().encode(await (chunk as any).text());\n } else if (typeof FileReader !== \"undefined\") {\n bytes = await new Promise<Uint8Array>((resolve) => {\n const reader = new FileReader();\n reader.onload = () => {\n resolve(new Uint8Array(reader.result as ArrayBuffer));\n };\n reader.onerror = () => resolve(new Uint8Array(0));\n reader.readAsArrayBuffer(chunk);\n });\n } else {\n bytes = new Uint8Array(0);\n }\n } else if (chunk && typeof chunk === \"object\" && \"type\" in chunk) {\n if (chunk.type === \"write\") {\n if (typeof chunk.position === \"number\") {\n this._position = chunk.position;\n }\n const data = chunk.data;\n if (typeof data === \"string\") {\n bytes = new TextEncoder().encode(data);\n } else if (data instanceof Uint8Array) {\n bytes = data;\n } else if (data instanceof ArrayBuffer) {\n bytes = new Uint8Array(data);\n } else if (typeof Blob !== \"undefined\" && data instanceof Blob) {\n if (typeof data.arrayBuffer === \"function\") {\n bytes = new Uint8Array(await data.arrayBuffer());\n } else {\n bytes = new Uint8Array(0);\n }\n } else {\n bytes = new Uint8Array(0);\n }\n } else if (chunk.type === \"seek\") {\n this._position = chunk.position ?? 0;\n\n return;\n } else if (chunk.type === \"truncate\") {\n this._truncate(chunk.size ?? 0);\n\n return;\n } else {\n bytes = new Uint8Array(0);\n }\n } else {\n bytes = new Uint8Array(0);\n }\n\n const needed = this._position + bytes.length;\n if (needed > this._buffer.length) {\n const newCapacity = Math.max(this._buffer.length * 2, needed, 1024);\n const newBuf = new Uint8Array(newCapacity);\n newBuf.set(this._buffer);\n this._buffer = newBuf;\n }\n\n this._buffer.set(bytes, this._position);\n this._position += bytes.length;\n if (this._position > this._length) {\n this._length = this._position;\n }\n }\n\n private _truncate(newSize: number): void {\n if (newSize < this._length) {\n this._length = newSize;\n } else if (newSize > this._length) {\n if (newSize > this._buffer.length) {\n const newBuf = new Uint8Array(newSize);\n newBuf.set(this._buffer);\n this._buffer = newBuf;\n }\n this._length = newSize;\n }\n if (this._position > newSize) {\n this._position = newSize;\n }\n }\n\n async seek(position: number): Promise<void> {\n if (this._closed) {\n throw createDOMException(\"WritableStream is closed\", \"InvalidStateError\");\n }\n this._position = position;\n }\n\n async truncate(size: number): Promise<void> {\n if (this._closed) {\n throw createDOMException(\"WritableStream is closed\", \"InvalidStateError\");\n }\n this._truncate(size);\n }\n\n async close(): Promise<void> {\n if (this._closed) {\n return;\n }\n this._closed = true;\n const finalData = this._buffer.slice(0, this._length);\n this._file.setRawData(finalData);\n }\n\n async abort(): Promise<void> {\n this._closed = true;\n }\n}\n\n/**\n * In-memory implementation of FileSystemFileHandle.\n */\nexport class MemoryFileHandle implements FileSystemFileHandle {\n readonly kind = \"file\" as const;\n readonly name: string;\n private _data: Uint8Array;\n private _lastModified: number;\n\n constructor(name: string, initialData: Uint8Array = new Uint8Array()) {\n this.name = name;\n this._data = initialData;\n this._lastModified = Date.now();\n }\n\n getRawData(): Uint8Array {\n return this._data;\n }\n\n setRawData(data: Uint8Array): void {\n this._data = data;\n this._lastModified = Date.now();\n }\n\n private _getArrayBuffer(): ArrayBuffer {\n const ab = new ArrayBuffer(this._data.byteLength);\n new Uint8Array(ab).set(this._data);\n\n return ab;\n }\n\n async getFile(): Promise<File> {\n const arrayBuffer = this._getArrayBuffer();\n const data = this._data;\n const name = this.name;\n const lastModified = this._lastModified;\n\n const fileObj = {\n name,\n size: data.byteLength,\n type: \"\",\n lastModified,\n async text(): Promise<string> {\n return new TextDecoder().decode(data);\n },\n async arrayBuffer(): Promise<ArrayBuffer> {\n return arrayBuffer;\n },\n slice(start = 0, end = data.byteLength): Blob {\n return new Blob([arrayBuffer.slice(start, end)]);\n },\n };\n\n if (typeof File !== \"undefined\") {\n try {\n const file = new File([arrayBuffer], this.name, {\n lastModified: this._lastModified,\n });\n if (typeof (file as any).text !== \"function\") {\n (file as any).text = fileObj.text;\n }\n if (typeof (file as any).arrayBuffer !== \"function\") {\n (file as any).arrayBuffer = fileObj.arrayBuffer;\n }\n\n return file;\n } catch {\n // Continue to fallback\n }\n }\n\n return fileObj as any;\n }\n\n async createWritable(\n options?: FileSystemCreateWritableOptions,\n ): Promise<FileSystemWritableFileStream> {\n return new MemoryWritableStream(\n this,\n options?.keepExistingData ?? false,\n ) as any;\n }\n\n async createSyncAccessHandle(): Promise<any> {\n return new MemorySyncAccessHandle(this);\n }\n\n async isSameEntry(other: FileSystemHandle): Promise<boolean> {\n return this === (other as any);\n }\n\n async queryPermission(): Promise<PermissionState> {\n return \"granted\";\n }\n\n async requestPermission(): Promise<PermissionState> {\n return \"granted\";\n }\n}\n\n/**\n * In-memory implementation of FileSystemDirectoryHandle.\n */\nexport class MemoryDirectoryHandle implements FileSystemDirectoryHandle {\n readonly kind = \"directory\" as const;\n readonly name: string;\n private _entries = new Map<\n string,\n MemoryDirectoryHandle | MemoryFileHandle\n >();\n\n constructor(name: string) {\n this.name = name;\n }\n\n _setEntry(\n name: string,\n handle: MemoryDirectoryHandle | MemoryFileHandle,\n ): void {\n this._entries.set(name, handle);\n }\n\n async getDirectoryHandle(\n name: string,\n options?: FileSystemGetDirectoryOptions,\n ): Promise<FileSystemDirectoryHandle> {\n if (name === \".\" || name === \"\") {\n return this;\n }\n if (name === \"..\") {\n throw createDOMException(\n \"Cannot navigate to parent directory with '..'\",\n \"SecurityError\",\n );\n }\n\n const existing = this._entries.get(name);\n if (existing) {\n if (existing.kind === \"directory\") {\n return existing as MemoryDirectoryHandle;\n }\n throw createDOMException(\n `\"${name}\" is a file, not a directory`,\n \"TypeMismatchError\",\n );\n }\n\n if (options?.create) {\n const newDir = new MemoryDirectoryHandle(name);\n this._entries.set(name, newDir);\n\n return newDir;\n }\n\n throw createDOMException(\n `A requested file or directory could not be found at \"${name}\"`,\n \"NotFoundError\",\n );\n }\n\n async getFileHandle(\n name: string,\n options?: FileSystemGetFileOptions,\n ): Promise<FileSystemFileHandle> {\n if (name === \".\" || name === \"..\" || name === \"\") {\n throw createDOMException(\n `Invalid file name \"${name}\"`,\n \"TypeMismatchError\",\n );\n }\n\n const existing = this._entries.get(name);\n if (existing) {\n if (existing.kind === \"file\") {\n return existing as MemoryFileHandle;\n }\n throw createDOMException(\n `\"${name}\" is a directory, not a file`,\n \"TypeMismatchError\",\n );\n }\n\n if (options?.create) {\n const newFile = new MemoryFileHandle(name);\n this._entries.set(name, newFile);\n\n return newFile;\n }\n\n throw createDOMException(\n `A requested file could not be found at \"${name}\"`,\n \"NotFoundError\",\n );\n }\n\n async removeEntry(\n name: string,\n options?: FileSystemRemoveOptions,\n ): Promise<void> {\n const existing = this._entries.get(name);\n if (!existing) {\n throw createDOMException(`Entry \"${name}\" not found`, \"NotFoundError\");\n }\n\n if (\n existing.kind === \"directory\" &&\n (existing as MemoryDirectoryHandle)._entries.size > 0 &&\n !options?.recursive\n ) {\n throw createDOMException(\n `Directory \"${name}\" is not empty`,\n \"InvalidModificationError\",\n );\n }\n\n this._entries.delete(name);\n }\n\n async resolve(\n possibleDescendant: FileSystemHandle,\n ): Promise<string[] | null> {\n if (this === (possibleDescendant as any)) {\n return [];\n }\n\n for (const [name, handle] of this._entries.entries()) {\n if (handle === (possibleDescendant as any)) {\n return [name];\n }\n if (handle.kind === \"directory\") {\n const childPath = await (handle as MemoryDirectoryHandle).resolve(\n possibleDescendant,\n );\n if (childPath) {\n return [name, ...childPath];\n }\n }\n }\n\n return null;\n }\n\n entries(): FileSystemDirectoryHandleAsyncIterator<\n [string, FileSystemDirectoryHandle | FileSystemFileHandle]\n > {\n const self = this;\n\n return makeAsyncIterator(async function* () {\n for (const [name, handle] of self._entries.entries()) {\n yield [name, handle as any];\n }\n });\n }\n\n values(): FileSystemDirectoryHandleAsyncIterator<\n FileSystemDirectoryHandle | FileSystemFileHandle\n > {\n const self = this;\n\n return makeAsyncIterator(async function* () {\n for (const handle of self._entries.values()) {\n yield handle as any;\n }\n });\n }\n\n keys(): FileSystemDirectoryHandleAsyncIterator<string> {\n const self = this;\n\n return makeAsyncIterator(async function* () {\n for (const name of self._entries.keys()) {\n yield name;\n }\n });\n }\n\n [Symbol.asyncIterator](): FileSystemDirectoryHandleAsyncIterator<\n [string, FileSystemDirectoryHandle | FileSystemFileHandle]\n > {\n return this.entries();\n }\n\n async isSameEntry(other: FileSystemHandle): Promise<boolean> {\n return this === (other as any);\n }\n\n async queryPermission(): Promise<PermissionState> {\n return \"granted\";\n }\n\n async requestPermission(): Promise<PermissionState> {\n return \"granted\";\n }\n}\n\nlet memoryOpfsRoot: MemoryDirectoryHandle | null = null;\n\n/**\n * Get or create the singleton in-memory root for OPFS fallback.\n */\nexport function getMemoryOpfsRoot(): FileSystemDirectoryHandle {\n if (!memoryOpfsRoot) {\n const root = new MemoryDirectoryHandle(\"memory-root\");\n const opfsChild = new MemoryDirectoryHandle(OPFS_ROOT);\n root._setEntry(OPFS_ROOT, opfsChild);\n memoryOpfsRoot = opfsChild;\n }\n\n return memoryOpfsRoot;\n}\n\n/**\n * Check if the in-memory storage fallback is currently active.\n */\nexport function isMemoryStorageFallbackActive(): boolean {\n return memoryOpfsRoot !== null;\n}\n\n/**\n * Clear the in-memory OPFS root (primarily for tests).\n */\nexport function resetMemoryOpfsRoot(): void {\n memoryOpfsRoot = null;\n}\n","import { CONFIG_KEYS, OPFS_ROOT } from \"../config/config.js\";\nimport { getDeploymentNamespace } from \"../core/app-routes.js\";\nimport { deleteConfig } from \"../db/delete-config.js\";\nimport { getConfig } from \"../db/get-config.js\";\nimport { getMemoryOpfsRoot } from \"./memory-storage.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\nexport interface StorageStatus {\n type: \"opfs\" | \"local\";\n permission: \"granted\" | \"denied\" | \"prompt\";\n name: string | null;\n}\n\nlet explicitRoot: FileSystemDirectoryHandle | null = null;\n\n/**\n * Set the storage root to a real filesystem directory (headless CLI mode).\n * Call this early in the agent bootstrap, before any tool or skill execution.\n */\nexport function setStorageRootFromPath(fsPath: string): void {\n const handler = (globalThis as any).__setStorageRootFromPath;\n if (typeof handler === \"function\") {\n handler(fsPath);\n return;\n }\n throw new Error(\n \"setStorageRootFromPath requires node-fs-handle in Node.js environments\",\n );\n}\n\n/**\n * Verify whether a directory handle is actually functional by attempting\n * to iterate its entries.\n */\nasync function probeHandleAccess(\n handle: FileSystemDirectoryHandle,\n reportedPermission: \"granted\" | \"denied\" | \"prompt\",\n): Promise<\"granted\" | \"denied\" | \"prompt\"> {\n try {\n const iter = (handle as any).entries();\n await iter.next();\n\n // I/O succeeded — the handle is functional regardless of what\n // queryPermission reported.\n\n return \"granted\";\n } catch {\n return reportedPermission;\n }\n}\n\n/**\n * Get the OPFS root directory name taking into account deployment namespace.\n */\nexport function getOpfsRootDirName(): string {\n const ns = getDeploymentNamespace();\n\n return ns ? `${OPFS_ROOT}-${ns}` : OPFS_ROOT;\n}\n\nasync function getOpfsRoot(): Promise<FileSystemDirectoryHandle> {\n try {\n if (\n typeof navigator !== \"undefined\" &&\n navigator.storage &&\n typeof navigator.storage.getDirectory === \"function\"\n ) {\n const opfsRoot = await navigator.storage.getDirectory();\n const opfsRootName = getOpfsRootDirName();\n\n return await opfsRoot.getDirectoryHandle(opfsRootName, {\n create: true,\n });\n }\n } catch (err) {\n console.warn(\n \"OPFS is unavailable (e.g. Firefox Private Browsing). Using in-memory storage fallback:\",\n err,\n );\n }\n\n return getMemoryOpfsRoot();\n}\n\n/**\n * Determine whether a value behaves like a FileSystemDirectoryHandle.\n */\nfunction isDirectoryHandle(handle: any): handle is FileSystemDirectoryHandle {\n if (!handle || typeof handle !== \"object\") {\n return false;\n }\n\n const ctor = globalThis.FileSystemDirectoryHandle;\n if (typeof ctor !== \"undefined\" && handle instanceof ctor) {\n return true;\n }\n\n return (\n typeof handle.getDirectoryHandle === \"function\" &&\n typeof handle.getFileHandle === \"function\"\n );\n}\n\n/**\n * Get the current storage root handle.\n */\nexport async function getStorageRoot(\n db: ShadowClawDatabase,\n): Promise<FileSystemDirectoryHandle> {\n if (explicitRoot) {\n return explicitRoot;\n }\n\n try {\n const storedHandle = await getConfig(db, CONFIG_KEYS.STORAGE_HANDLE);\n if (isDirectoryHandle(storedHandle)) {\n const handle = storedHandle as any;\n // Check if we still have permission (main thread only)\n if (typeof handle.queryPermission === \"function\") {\n const status = await handle.queryPermission({\n mode: \"readwrite\",\n });\n\n // Electron (and some other embedders) report \"prompt\" even when the\n // handle is functional. Try to silently re-activate the permission\n // so downstream code doesn't hit stale-handle errors.\n if (\n status !== \"granted\" &&\n typeof handle.requestPermission === \"function\"\n ) {\n try {\n await handle.requestPermission({ mode: \"readwrite\" });\n } catch {\n // requestPermission may throw in some contexts — that's OK\n }\n }\n }\n\n // If we have a handle but no permission, we still return it so tools\n // fail with a clear \"permission denied\" error instead of silently\n // falling back to OPFS and causing \"split brain\".\n\n return handle;\n }\n } catch (err) {\n console.warn(\"Failed to retrieve local storage handle from DB:\", err);\n }\n\n // Fallback to OPFS root only if NO local handle is configured\n\n return getOpfsRoot();\n}\n\n/**\n * Set an explicit storage root handle (used to sync handle to workers or in headless CLI mode).\n */\nexport function setStorageRoot(handle: FileSystemDirectoryHandle | null): void {\n explicitRoot = handle;\n}\n\n/**\n * Clear the cached storage root so the next call to getStorageRoot()\n * re-acquires a fresh handle. Call this when an InvalidStateError\n * indicates the cached handle has gone stale.\n */\nexport function invalidateStorageRoot() {\n explicitRoot = null;\n}\n\n/**\n * Detect a stale-handle DOMException (\"InvalidStateError\") thrown by\n * the File System Access API when the underlying entry has changed\n * since the handle was obtained.\n */\nexport function isStaleHandleError(err: unknown): boolean {\n if (!(err instanceof DOMException)) {\n return false;\n }\n\n return err.name === \"InvalidStateError\";\n}\n\n/**\n * Reset storage to use browser-internal OPFS.\n */\nexport async function resetStorageDirectory(\n db: ShadowClawDatabase,\n): Promise<void> {\n await deleteConfig(db, CONFIG_KEYS.STORAGE_HANDLE);\n\n explicitRoot = null;\n}\n\n/**\n * Get the current storage status.\n */\nexport async function getStorageStatus(\n db: ShadowClawDatabase,\n): Promise<StorageStatus> {\n if (explicitRoot) {\n try {\n const permission = await (explicitRoot as any).queryPermission({\n mode: \"readwrite\",\n });\n\n // Electron may report \"prompt\" even when the handle works.\n // Test actual functionality before reporting the permission level.\n const effectivePermission =\n permission === \"granted\"\n ? \"granted\"\n : await probeHandleAccess(explicitRoot, permission);\n\n return {\n type: \"local\",\n permission: effectivePermission,\n name: explicitRoot.name,\n };\n } catch {\n // If queryPermission fails, explicitRoot might be stale\n console.warn(\"Getting storage status failed for explicit storage root.\");\n }\n }\n\n try {\n const storedHandle = await getConfig(db, CONFIG_KEYS.STORAGE_HANDLE);\n\n if (isDirectoryHandle(storedHandle)) {\n const handle = storedHandle as any;\n const permission = await handle.queryPermission({\n mode: \"readwrite\",\n });\n\n const effectivePermission =\n permission === \"granted\"\n ? \"granted\"\n : await probeHandleAccess(handle, permission);\n\n return {\n type: \"local\",\n permission: effectivePermission,\n name: handle.name,\n };\n }\n } catch (err) {\n console.warn(\"Failed to check storage status:\", err);\n }\n\n return { type: \"opfs\", permission: \"granted\", name: \"OPFS\" };\n}\n","import { isHeadlessMode } from \"../config/headless.js\";\nimport { getNestedDir } from \"./get-nested-dir.js\";\nimport { getStorageRoot } from \"./storage.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Get the group workspace directory.\n * In headless mode, the storage root is the workspace directory directly.\n */\nexport async function getGroupDir(\n db: ShadowClawDatabase,\n groupId: string,\n): Promise<FileSystemDirectoryHandle> {\n const root = await getStorageRoot(db);\n if (isHeadlessMode()) {\n return root;\n }\n // Sanitize groupId for filesystem: replace colons with dashes\n const safeId = groupId.replace(/:/g, \"-\");\n\n return getNestedDir(root, \"groups\", safeId);\n}\n","/**\n * Parse a path into directory segments and filename.\n */\nexport function parsePath(filePath: string): {\n dirs: string[];\n filename: string;\n} {\n const normalized = filePath\n .replace(/\\\\/g, \"/\")\n .replace(/^\\/home\\/user\\//, \"/\")\n .replace(/^\\/+/, \"\");\n const parts = normalized.split(\"/\").filter(Boolean);\n\n if (parts.length === 0) {\n throw new Error(\"Empty file path\");\n }\n\n const filename = parts.pop();\n\n if (\n parts.some((p) => p === \"..\" || p === \".\") ||\n filename === \"..\" ||\n filename === \".\"\n ) {\n const err: any = new Error(\n `SecurityError: Path traversal is not allowed: \"${filePath}\"`,\n );\n err.name = \"SecurityError\";\n throw err;\n }\n\n return { dirs: parts, filename: filename || \"\" };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"parse-path-BOHQP_IQ.js","names":[],"sources":["../../src/config/headless.ts","../../src/storage/get-nested-dir.ts","../../src/db/delete-config.ts","../../src/storage/memory-storage.ts","../../src/storage/storage.ts","../../src/storage/get-group-dir.ts","../../src/storage/parse-path.ts"],"sourcesContent":["/**\n * Headless mode flag.\n *\n * Set to `true` when the agent is running in the headless CLI participant\n * mode (i.e. `npx shadow-claw agent`). Browser-only tools check this flag\n * and return a clear error rather than silently failing.\n */\n\nlet _headless = false;\n\n/**\n * Tools that require an interactive browser environment (DOM, canvas, Web Components,\n * PeerJS rooms, Web Share, Web Push notifications, or subagents).\n * In headless mode, these tools are never presented to the LLM or executed.\n */\nexport const BROWSER_ONLY_TOOLS: ReadonlySet<string> = new Set([\n \"ask_user\",\n \"attach_file_to_chat\",\n \"clear_chat\",\n \"create_room\",\n \"invite_to_room\",\n \"leave_room\",\n \"list_components\",\n \"list_room_members\",\n \"open_file\",\n \"render_component\",\n \"send_file\",\n \"send_notification\",\n \"show_toast\",\n \"spawn_subagent\",\n]);\n\n/**\n * Returns true if the tool can be safely presented and executed in headless CLI mode.\n */\nexport function isToolHeadlessSafe(toolName: string): boolean {\n return !BROWSER_ONLY_TOOLS.has(toolName);\n}\n\n/**\n * Filters a list of tool definitions or schemas to retain only headless-safe tools.\n */\nexport function filterHeadlessTools<T extends { name: string }>(\n tools: T[],\n): T[] {\n return tools.filter((t) => !BROWSER_ONLY_TOOLS.has(t.name));\n}\n\n/**\n * Returns true when the process is running as a headless CLI agent,\n * not in a browser Web Worker.\n */\nexport function isHeadlessMode(): boolean {\n return _headless;\n}\n\n/**\n * Enable or disable headless mode. Call `setHeadlessMode(true)` early in\n * the CLI agent bootstrap, before any tool execution.\n */\nexport function setHeadlessMode(value: boolean): void {\n _headless = value;\n}\n","/**\n * Get a handle to a nested directory, creating intermediate dirs.\n */\nexport async function getNestedDir(\n root: FileSystemDirectoryHandle,\n ...segments: string[]\n): Promise<FileSystemDirectoryHandle> {\n let current = root;\n\n for (const seg of segments) {\n const child = await current.getDirectoryHandle(seg, { create: true });\n\n // Guard against stale handles (e.g. Electron after app restart) where\n // getDirectoryHandle returns the same directory instead of navigating.\n if (\n typeof current.isSameEntry === \"function\" &&\n (await current.isSameEntry(child))\n ) {\n throw new Error(\n `Directory navigation failed: \"${seg}\" resolved to the same directory as its parent. ` +\n \"The stored directory handle may be stale — try re-selecting the storage folder.\",\n );\n }\n\n current = child;\n }\n\n return current;\n}\n","import { txPromise } from \"./tx-promise.js\";\nimport type { ShadowClawDatabase } from \"./types.js\";\n\n/**\n * Delete a config value\n */\nexport function deleteConfig(\n db: ShadowClawDatabase,\n key: string,\n): Promise<void> {\n return txPromise(db, \"config\", \"readwrite\", (store) =>\n store.delete(key),\n ).then(() => undefined);\n}\n","import { OPFS_ROOT } from \"../config/config.js\";\n\nfunction createDOMException(message: string, name: string): DOMException {\n if (typeof DOMException !== \"undefined\") {\n try {\n return new DOMException(message, name);\n } catch {\n // Fall back if constructor fails\n }\n }\n\n const err = new Error(message) as any;\n err.name = name;\n\n return err;\n}\n\nfunction makeAsyncIterator<T>(\n gen: () => AsyncGenerator<T>,\n): FileSystemDirectoryHandleAsyncIterator<T> {\n const iterator = gen();\n (iterator as any)[Symbol.asyncDispose ?? Symbol.for(\"Symbol.asyncDispose\")] =\n async () => {};\n\n return iterator as any;\n}\n\n/**\n * In-memory implementation of FileSystemSyncAccessHandle.\n */\nexport class MemorySyncAccessHandle {\n private _file: MemoryFileHandle;\n private _closed = false;\n\n constructor(file: MemoryFileHandle) {\n this._file = file;\n }\n\n close(): void {\n this._closed = true;\n }\n\n flush(): void {\n // No-op for in-memory storage\n }\n\n getSize(): number {\n if (this._closed) {\n throw createDOMException(\n \"SyncAccessHandle is closed\",\n \"InvalidStateError\",\n );\n }\n\n return this._file.getRawData().byteLength;\n }\n\n read(buffer: ArrayBufferView, options?: { at?: number }): number {\n if (this._closed) {\n throw createDOMException(\n \"SyncAccessHandle is closed\",\n \"InvalidStateError\",\n );\n }\n const data = this._file.getRawData();\n const at = options?.at ?? 0;\n if (at >= data.byteLength) {\n return 0;\n }\n const target = new Uint8Array(\n buffer.buffer,\n buffer.byteOffset,\n buffer.byteLength,\n );\n const source = data.subarray(at, at + target.byteLength);\n target.set(source);\n\n return source.byteLength;\n }\n\n write(buffer: ArrayBufferView, options?: { at?: number }): number {\n if (this._closed) {\n throw createDOMException(\n \"SyncAccessHandle is closed\",\n \"InvalidStateError\",\n );\n }\n const src = new Uint8Array(\n buffer.buffer,\n buffer.byteOffset,\n buffer.byteLength,\n );\n const at = options?.at ?? 0;\n const current = this._file.getRawData();\n const needed = at + src.byteLength;\n let newBuf: Uint8Array;\n if (needed > current.byteLength) {\n newBuf = new Uint8Array(needed);\n newBuf.set(current);\n } else {\n newBuf = new Uint8Array(current);\n }\n newBuf.set(src, at);\n this._file.setRawData(newBuf);\n\n return src.byteLength;\n }\n\n truncate(newSize: number): void {\n if (this._closed) {\n throw createDOMException(\n \"SyncAccessHandle is closed\",\n \"InvalidStateError\",\n );\n }\n const current = this._file.getRawData();\n const newBuf = new Uint8Array(newSize);\n newBuf.set(current.subarray(0, Math.min(current.byteLength, newSize)));\n this._file.setRawData(newBuf);\n }\n}\n\n/**\n * In-memory implementation of FileSystemWritableFileStream.\n */\nexport class MemoryWritableStream {\n private _file: MemoryFileHandle;\n private _buffer: Uint8Array;\n private _position = 0;\n private _length = 0;\n private _closed = false;\n\n constructor(file: MemoryFileHandle, keepExistingData = false) {\n this._file = file;\n const existing = file.getRawData();\n if (keepExistingData) {\n this._buffer = new Uint8Array(existing);\n this._length = existing.byteLength;\n } else {\n this._buffer = new Uint8Array(1024);\n this._length = 0;\n }\n }\n\n async write(chunk: any): Promise<void> {\n if (this._closed) {\n throw createDOMException(\"WritableStream is closed\", \"InvalidStateError\");\n }\n\n let bytes: Uint8Array;\n if (typeof chunk === \"string\") {\n bytes = new TextEncoder().encode(chunk);\n } else if (chunk instanceof Uint8Array) {\n bytes = chunk;\n } else if (chunk instanceof ArrayBuffer) {\n bytes = new Uint8Array(chunk);\n } else if (typeof Blob !== \"undefined\" && chunk instanceof Blob) {\n if (typeof chunk.arrayBuffer === \"function\") {\n bytes = new Uint8Array(await chunk.arrayBuffer());\n } else if (typeof (chunk as any).text === \"function\") {\n bytes = new TextEncoder().encode(await (chunk as any).text());\n } else if (typeof FileReader !== \"undefined\") {\n bytes = await new Promise<Uint8Array>((resolve) => {\n const reader = new FileReader();\n reader.onload = () => {\n resolve(new Uint8Array(reader.result as ArrayBuffer));\n };\n reader.onerror = () => resolve(new Uint8Array(0));\n reader.readAsArrayBuffer(chunk);\n });\n } else {\n bytes = new Uint8Array(0);\n }\n } else if (chunk && typeof chunk === \"object\" && \"type\" in chunk) {\n if (chunk.type === \"write\") {\n if (typeof chunk.position === \"number\") {\n this._position = chunk.position;\n }\n const data = chunk.data;\n if (typeof data === \"string\") {\n bytes = new TextEncoder().encode(data);\n } else if (data instanceof Uint8Array) {\n bytes = data;\n } else if (data instanceof ArrayBuffer) {\n bytes = new Uint8Array(data);\n } else if (typeof Blob !== \"undefined\" && data instanceof Blob) {\n if (typeof data.arrayBuffer === \"function\") {\n bytes = new Uint8Array(await data.arrayBuffer());\n } else {\n bytes = new Uint8Array(0);\n }\n } else {\n bytes = new Uint8Array(0);\n }\n } else if (chunk.type === \"seek\") {\n this._position = chunk.position ?? 0;\n\n return;\n } else if (chunk.type === \"truncate\") {\n this._truncate(chunk.size ?? 0);\n\n return;\n } else {\n bytes = new Uint8Array(0);\n }\n } else {\n bytes = new Uint8Array(0);\n }\n\n const needed = this._position + bytes.length;\n if (needed > this._buffer.length) {\n const newCapacity = Math.max(this._buffer.length * 2, needed, 1024);\n const newBuf = new Uint8Array(newCapacity);\n newBuf.set(this._buffer);\n this._buffer = newBuf;\n }\n\n this._buffer.set(bytes, this._position);\n this._position += bytes.length;\n if (this._position > this._length) {\n this._length = this._position;\n }\n }\n\n private _truncate(newSize: number): void {\n if (newSize < this._length) {\n this._length = newSize;\n } else if (newSize > this._length) {\n if (newSize > this._buffer.length) {\n const newBuf = new Uint8Array(newSize);\n newBuf.set(this._buffer);\n this._buffer = newBuf;\n }\n this._length = newSize;\n }\n if (this._position > newSize) {\n this._position = newSize;\n }\n }\n\n async seek(position: number): Promise<void> {\n if (this._closed) {\n throw createDOMException(\"WritableStream is closed\", \"InvalidStateError\");\n }\n this._position = position;\n }\n\n async truncate(size: number): Promise<void> {\n if (this._closed) {\n throw createDOMException(\"WritableStream is closed\", \"InvalidStateError\");\n }\n this._truncate(size);\n }\n\n async close(): Promise<void> {\n if (this._closed) {\n return;\n }\n this._closed = true;\n const finalData = this._buffer.slice(0, this._length);\n this._file.setRawData(finalData);\n }\n\n async abort(): Promise<void> {\n this._closed = true;\n }\n}\n\n/**\n * In-memory implementation of FileSystemFileHandle.\n */\nexport class MemoryFileHandle implements FileSystemFileHandle {\n readonly kind = \"file\" as const;\n readonly name: string;\n private _data: Uint8Array;\n private _lastModified: number;\n\n constructor(name: string, initialData: Uint8Array = new Uint8Array()) {\n this.name = name;\n this._data = initialData;\n this._lastModified = Date.now();\n }\n\n getRawData(): Uint8Array {\n return this._data;\n }\n\n setRawData(data: Uint8Array): void {\n this._data = data;\n this._lastModified = Date.now();\n }\n\n private _getArrayBuffer(): ArrayBuffer {\n const ab = new ArrayBuffer(this._data.byteLength);\n new Uint8Array(ab).set(this._data);\n\n return ab;\n }\n\n async getFile(): Promise<File> {\n const arrayBuffer = this._getArrayBuffer();\n const data = this._data;\n const name = this.name;\n const lastModified = this._lastModified;\n\n const fileObj = {\n name,\n size: data.byteLength,\n type: \"\",\n lastModified,\n async text(): Promise<string> {\n return new TextDecoder().decode(data);\n },\n async arrayBuffer(): Promise<ArrayBuffer> {\n return arrayBuffer;\n },\n slice(start = 0, end = data.byteLength): Blob {\n return new Blob([arrayBuffer.slice(start, end)]);\n },\n };\n\n if (typeof File !== \"undefined\") {\n try {\n const file = new File([arrayBuffer], this.name, {\n lastModified: this._lastModified,\n });\n if (typeof (file as any).text !== \"function\") {\n (file as any).text = fileObj.text;\n }\n if (typeof (file as any).arrayBuffer !== \"function\") {\n (file as any).arrayBuffer = fileObj.arrayBuffer;\n }\n\n return file;\n } catch {\n // Continue to fallback\n }\n }\n\n return fileObj as any;\n }\n\n async createWritable(\n options?: FileSystemCreateWritableOptions,\n ): Promise<FileSystemWritableFileStream> {\n return new MemoryWritableStream(\n this,\n options?.keepExistingData ?? false,\n ) as any;\n }\n\n async createSyncAccessHandle(): Promise<any> {\n return new MemorySyncAccessHandle(this);\n }\n\n async isSameEntry(other: FileSystemHandle): Promise<boolean> {\n return this === (other as any);\n }\n\n async queryPermission(): Promise<PermissionState> {\n return \"granted\";\n }\n\n async requestPermission(): Promise<PermissionState> {\n return \"granted\";\n }\n}\n\n/**\n * In-memory implementation of FileSystemDirectoryHandle.\n */\nexport class MemoryDirectoryHandle implements FileSystemDirectoryHandle {\n readonly kind = \"directory\" as const;\n readonly name: string;\n private _entries = new Map<\n string,\n MemoryDirectoryHandle | MemoryFileHandle\n >();\n\n constructor(name: string) {\n this.name = name;\n }\n\n _setEntry(\n name: string,\n handle: MemoryDirectoryHandle | MemoryFileHandle,\n ): void {\n this._entries.set(name, handle);\n }\n\n async getDirectoryHandle(\n name: string,\n options?: FileSystemGetDirectoryOptions,\n ): Promise<FileSystemDirectoryHandle> {\n if (name === \".\" || name === \"\") {\n return this;\n }\n if (name === \"..\") {\n throw createDOMException(\n \"Cannot navigate to parent directory with '..'\",\n \"SecurityError\",\n );\n }\n\n const existing = this._entries.get(name);\n if (existing) {\n if (existing.kind === \"directory\") {\n return existing as MemoryDirectoryHandle;\n }\n throw createDOMException(\n `\"${name}\" is a file, not a directory`,\n \"TypeMismatchError\",\n );\n }\n\n if (options?.create) {\n const newDir = new MemoryDirectoryHandle(name);\n this._entries.set(name, newDir);\n\n return newDir;\n }\n\n throw createDOMException(\n `A requested file or directory could not be found at \"${name}\"`,\n \"NotFoundError\",\n );\n }\n\n async getFileHandle(\n name: string,\n options?: FileSystemGetFileOptions,\n ): Promise<FileSystemFileHandle> {\n if (name === \".\" || name === \"..\" || name === \"\") {\n throw createDOMException(\n `Invalid file name \"${name}\"`,\n \"TypeMismatchError\",\n );\n }\n\n const existing = this._entries.get(name);\n if (existing) {\n if (existing.kind === \"file\") {\n return existing as MemoryFileHandle;\n }\n throw createDOMException(\n `\"${name}\" is a directory, not a file`,\n \"TypeMismatchError\",\n );\n }\n\n if (options?.create) {\n const newFile = new MemoryFileHandle(name);\n this._entries.set(name, newFile);\n\n return newFile;\n }\n\n throw createDOMException(\n `A requested file could not be found at \"${name}\"`,\n \"NotFoundError\",\n );\n }\n\n async removeEntry(\n name: string,\n options?: FileSystemRemoveOptions,\n ): Promise<void> {\n const existing = this._entries.get(name);\n if (!existing) {\n throw createDOMException(`Entry \"${name}\" not found`, \"NotFoundError\");\n }\n\n if (\n existing.kind === \"directory\" &&\n (existing as MemoryDirectoryHandle)._entries.size > 0 &&\n !options?.recursive\n ) {\n throw createDOMException(\n `Directory \"${name}\" is not empty`,\n \"InvalidModificationError\",\n );\n }\n\n this._entries.delete(name);\n }\n\n async resolve(\n possibleDescendant: FileSystemHandle,\n ): Promise<string[] | null> {\n if (this === (possibleDescendant as any)) {\n return [];\n }\n\n for (const [name, handle] of this._entries.entries()) {\n if (handle === (possibleDescendant as any)) {\n return [name];\n }\n if (handle.kind === \"directory\") {\n const childPath = await (handle as MemoryDirectoryHandle).resolve(\n possibleDescendant,\n );\n if (childPath) {\n return [name, ...childPath];\n }\n }\n }\n\n return null;\n }\n\n entries(): FileSystemDirectoryHandleAsyncIterator<\n [string, FileSystemDirectoryHandle | FileSystemFileHandle]\n > {\n const self = this;\n\n return makeAsyncIterator(async function* () {\n for (const [name, handle] of self._entries.entries()) {\n yield [name, handle as any];\n }\n });\n }\n\n values(): FileSystemDirectoryHandleAsyncIterator<\n FileSystemDirectoryHandle | FileSystemFileHandle\n > {\n const self = this;\n\n return makeAsyncIterator(async function* () {\n for (const handle of self._entries.values()) {\n yield handle as any;\n }\n });\n }\n\n keys(): FileSystemDirectoryHandleAsyncIterator<string> {\n const self = this;\n\n return makeAsyncIterator(async function* () {\n for (const name of self._entries.keys()) {\n yield name;\n }\n });\n }\n\n [Symbol.asyncIterator](): FileSystemDirectoryHandleAsyncIterator<\n [string, FileSystemDirectoryHandle | FileSystemFileHandle]\n > {\n return this.entries();\n }\n\n async isSameEntry(other: FileSystemHandle): Promise<boolean> {\n return this === (other as any);\n }\n\n async queryPermission(): Promise<PermissionState> {\n return \"granted\";\n }\n\n async requestPermission(): Promise<PermissionState> {\n return \"granted\";\n }\n}\n\nlet memoryOpfsRoot: MemoryDirectoryHandle | null = null;\n\n/**\n * Get or create the singleton in-memory root for OPFS fallback.\n */\nexport function getMemoryOpfsRoot(): FileSystemDirectoryHandle {\n if (!memoryOpfsRoot) {\n const root = new MemoryDirectoryHandle(\"memory-root\");\n const opfsChild = new MemoryDirectoryHandle(OPFS_ROOT);\n root._setEntry(OPFS_ROOT, opfsChild);\n memoryOpfsRoot = opfsChild;\n }\n\n return memoryOpfsRoot;\n}\n\n/**\n * Check if the in-memory storage fallback is currently active.\n */\nexport function isMemoryStorageFallbackActive(): boolean {\n return memoryOpfsRoot !== null;\n}\n\n/**\n * Clear the in-memory OPFS root (primarily for tests).\n */\nexport function resetMemoryOpfsRoot(): void {\n memoryOpfsRoot = null;\n}\n","import { CONFIG_KEYS, OPFS_ROOT } from \"../config/config.js\";\nimport { getDeploymentNamespace } from \"../core/app-routes.js\";\nimport { deleteConfig } from \"../db/delete-config.js\";\nimport { getConfig } from \"../db/get-config.js\";\nimport { getMemoryOpfsRoot } from \"./memory-storage.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\nexport interface StorageStatus {\n type: \"opfs\" | \"local\";\n permission: \"granted\" | \"denied\" | \"prompt\";\n name: string | null;\n}\n\nlet explicitRoot: FileSystemDirectoryHandle | null = null;\n\n/**\n * Set the storage root to a real filesystem directory (headless CLI mode).\n * Call this early in the agent bootstrap, before any tool or skill execution.\n */\nexport function setStorageRootFromPath(fsPath: string): void {\n const handler = (globalThis as any).__setStorageRootFromPath;\n if (typeof handler === \"function\") {\n handler(fsPath);\n return;\n }\n throw new Error(\n \"setStorageRootFromPath requires node-fs-handle in Node.js environments\",\n );\n}\n\n/**\n * Verify whether a directory handle is actually functional by attempting\n * to iterate its entries.\n */\nasync function probeHandleAccess(\n handle: FileSystemDirectoryHandle,\n reportedPermission: \"granted\" | \"denied\" | \"prompt\",\n): Promise<\"granted\" | \"denied\" | \"prompt\"> {\n try {\n const iter = (handle as any).entries();\n await iter.next();\n\n // I/O succeeded — the handle is functional regardless of what\n // queryPermission reported.\n\n return \"granted\";\n } catch {\n return reportedPermission;\n }\n}\n\n/**\n * Get the OPFS root directory name taking into account deployment namespace.\n */\nexport function getOpfsRootDirName(): string {\n const ns = getDeploymentNamespace();\n\n return ns ? `${OPFS_ROOT}-${ns}` : OPFS_ROOT;\n}\n\nasync function getOpfsRoot(): Promise<FileSystemDirectoryHandle> {\n try {\n if (\n typeof navigator !== \"undefined\" &&\n navigator.storage &&\n typeof navigator.storage.getDirectory === \"function\"\n ) {\n const opfsRoot = await navigator.storage.getDirectory();\n const opfsRootName = getOpfsRootDirName();\n\n return await opfsRoot.getDirectoryHandle(opfsRootName, {\n create: true,\n });\n }\n } catch (err) {\n console.warn(\n \"OPFS is unavailable (e.g. Firefox Private Browsing). Using in-memory storage fallback:\",\n err,\n );\n }\n\n return getMemoryOpfsRoot();\n}\n\n/**\n * Determine whether a value behaves like a FileSystemDirectoryHandle.\n */\nfunction isDirectoryHandle(handle: any): handle is FileSystemDirectoryHandle {\n if (!handle || typeof handle !== \"object\") {\n return false;\n }\n\n const ctor = globalThis.FileSystemDirectoryHandle;\n if (typeof ctor !== \"undefined\" && handle instanceof ctor) {\n return true;\n }\n\n return (\n typeof handle.getDirectoryHandle === \"function\" &&\n typeof handle.getFileHandle === \"function\"\n );\n}\n\n/**\n * Get the current storage root handle.\n */\nexport async function getStorageRoot(\n db: ShadowClawDatabase,\n): Promise<FileSystemDirectoryHandle> {\n if (explicitRoot) {\n return explicitRoot;\n }\n\n try {\n const storedHandle = await getConfig(db, CONFIG_KEYS.STORAGE_HANDLE);\n if (isDirectoryHandle(storedHandle)) {\n const handle = storedHandle as any;\n // Check if we still have permission (main thread only)\n if (typeof handle.queryPermission === \"function\") {\n const status = await handle.queryPermission({\n mode: \"readwrite\",\n });\n\n // Electron (and some other embedders) report \"prompt\" even when the\n // handle is functional. Try to silently re-activate the permission\n // so downstream code doesn't hit stale-handle errors.\n if (\n status !== \"granted\" &&\n typeof handle.requestPermission === \"function\"\n ) {\n try {\n await handle.requestPermission({ mode: \"readwrite\" });\n } catch {\n // requestPermission may throw in some contexts — that's OK\n }\n }\n }\n\n // If we have a handle but no permission, we still return it so tools\n // fail with a clear \"permission denied\" error instead of silently\n // falling back to OPFS and causing \"split brain\".\n\n return handle;\n }\n } catch (err) {\n console.warn(\"Failed to retrieve local storage handle from DB:\", err);\n }\n\n // Fallback to OPFS root only if NO local handle is configured\n\n return getOpfsRoot();\n}\n\n/**\n * Set an explicit storage root handle (used to sync handle to workers or in headless CLI mode).\n */\nexport function setStorageRoot(handle: FileSystemDirectoryHandle | null): void {\n explicitRoot = handle;\n}\n\n/**\n * Clear the cached storage root so the next call to getStorageRoot()\n * re-acquires a fresh handle. Call this when an InvalidStateError\n * indicates the cached handle has gone stale.\n */\nexport function invalidateStorageRoot() {\n explicitRoot = null;\n}\n\n/**\n * Detect a stale-handle DOMException (\"InvalidStateError\") thrown by\n * the File System Access API when the underlying entry has changed\n * since the handle was obtained.\n */\nexport function isStaleHandleError(err: unknown): boolean {\n if (!(err instanceof DOMException)) {\n return false;\n }\n\n return err.name === \"InvalidStateError\";\n}\n\n/**\n * Reset storage to use browser-internal OPFS.\n */\nexport async function resetStorageDirectory(\n db: ShadowClawDatabase,\n): Promise<void> {\n await deleteConfig(db, CONFIG_KEYS.STORAGE_HANDLE);\n\n explicitRoot = null;\n}\n\n/**\n * Get the current storage status.\n */\nexport async function getStorageStatus(\n db: ShadowClawDatabase,\n): Promise<StorageStatus> {\n if (explicitRoot) {\n try {\n const permission = await (explicitRoot as any).queryPermission({\n mode: \"readwrite\",\n });\n\n // Electron may report \"prompt\" even when the handle works.\n // Test actual functionality before reporting the permission level.\n const effectivePermission =\n permission === \"granted\"\n ? \"granted\"\n : await probeHandleAccess(explicitRoot, permission);\n\n return {\n type: \"local\",\n permission: effectivePermission,\n name: explicitRoot.name,\n };\n } catch {\n // If queryPermission fails, explicitRoot might be stale\n console.warn(\"Getting storage status failed for explicit storage root.\");\n }\n }\n\n try {\n const storedHandle = await getConfig(db, CONFIG_KEYS.STORAGE_HANDLE);\n\n if (isDirectoryHandle(storedHandle)) {\n const handle = storedHandle as any;\n const permission = await handle.queryPermission({\n mode: \"readwrite\",\n });\n\n const effectivePermission =\n permission === \"granted\"\n ? \"granted\"\n : await probeHandleAccess(handle, permission);\n\n return {\n type: \"local\",\n permission: effectivePermission,\n name: handle.name,\n };\n }\n } catch (err) {\n console.warn(\"Failed to check storage status:\", err);\n }\n\n return { type: \"opfs\", permission: \"granted\", name: \"OPFS\" };\n}\n","import { isHeadlessMode } from \"../config/headless.js\";\nimport { getNestedDir } from \"./get-nested-dir.js\";\nimport { getStorageRoot } from \"./storage.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Get the group workspace directory.\n * In headless mode, the storage root is the workspace directory directly.\n */\nexport async function getGroupDir(\n db: ShadowClawDatabase,\n groupId: string,\n): Promise<FileSystemDirectoryHandle> {\n const root = await getStorageRoot(db);\n if (isHeadlessMode()) {\n return root;\n }\n // Sanitize groupId for filesystem: replace colons with dashes\n const safeId = groupId.replace(/:/g, \"-\");\n\n return getNestedDir(root, \"groups\", safeId);\n}\n","/**\n * Parse a path into directory segments and filename.\n */\nexport function parsePath(filePath: string): {\n dirs: string[];\n filename: string;\n} {\n const normalized = filePath\n .replace(/\\\\/g, \"/\")\n .replace(/^\\/home\\/user\\//, \"/\")\n .replace(/^\\/+/, \"\");\n const parts = normalized.split(\"/\").filter(Boolean);\n\n if (parts.length === 0) {\n throw new Error(\"Empty file path\");\n }\n\n const filename = parts.pop();\n\n if (\n parts.some((p) => p === \"..\" || p === \".\") ||\n filename === \"..\" ||\n filename === \".\"\n ) {\n const err: any = new Error(\n `SecurityError: Path traversal is not allowed: \"${filePath}\"`,\n );\n err.name = \"SecurityError\";\n throw err;\n }\n\n return { dirs: parts, filename: filename || \"\" };\n}\n"],"mappings":"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"}
@@ -1,13 +1,13 @@
1
1
  import { o as getDb } from "./get-config-BWhs5HFF.js";
2
2
  import { t as Signal } from "./dist-Bxg3C_zy.js";
3
- import { S as PEERJS_DEFAULT_HOST } from "./config-DxNI3TlW.js";
4
- import { s as groupFileExists } from "./tools-Beuyh8y1.js";
5
- import { t as readGroupFileBytes } from "./read-group-file-bytes-CXOG_YyM.js";
3
+ import { S as PEERJS_DEFAULT_HOST } from "./config-BrHR97zt.js";
4
+ import { s as groupFileExists } from "./tools-B8OJ4sMF.js";
5
+ import { t as readGroupFileBytes } from "./read-group-file-bytes-UQIk1eJG.js";
6
6
  import { ulid } from "./utils/ulid.js";
7
7
  import { inferAttachmentMimeType } from "./utils/mime.js";
8
- import { t as uploadGroupFile } from "./upload-group-file-BbBzjTcN.js";
8
+ import { t as uploadGroupFile } from "./upload-group-file-CJpoNjEb.js";
9
9
  import { sanitizeFilename } from "./utils/filename.js";
10
- import { t as writeGroupFileBytes } from "./write-group-file-bytes-Ccn-VFUU.js";
10
+ import { t as writeGroupFileBytes } from "./write-group-file-bytes-CNT7DqOZ.js";
11
11
 
12
12
  //#region src/content/message-attachments.ts
13
13
  function sanitizeAttachmentFileName(fileName) {
@@ -1480,7 +1480,7 @@ var PeerJsChannel = class PeerJsChannel {
1480
1480
  const action = payload.action || "";
1481
1481
  const args = payload.args || {};
1482
1482
  const commandId = payload.commandId || "";
1483
- import("./init-control-plane-C1FRRmjC.js").then(({ executeClientControlCommand }) => executeClientControlCommand(action, args)).then((result) => {
1483
+ import("./init-control-plane-CEGdzgWX.js").then(({ executeClientControlCommand }) => executeClientControlCommand(action, args)).then((result) => {
1484
1484
  const conn = this.connections.get(remotePeerId);
1485
1485
  if (conn) {
1486
1486
  const hasError = Boolean(result?.error);
@@ -1745,7 +1745,7 @@ var PeerJsChannel = class PeerJsChannel {
1745
1745
  if (finalName !== canonicalName) this._inboundRemap.set(canonicalName, finalName);
1746
1746
  await writeGroupFileBytes(db, groupId, finalName, bytes);
1747
1747
  try {
1748
- const { orchestratorStore } = await import("./orchestrator-i_QJ-o22.js").then((n) => n.n);
1748
+ const { orchestratorStore } = await import("./orchestrator-cRBe3lhq.js").then((n) => n.n);
1749
1749
  if (orchestratorStore.activeGroupId === groupId) await orchestratorStore.loadFiles(db);
1750
1750
  } catch {}
1751
1751
  } catch (err) {
@@ -1857,4 +1857,4 @@ function normalizeAttachmentPath(path) {
1857
1857
 
1858
1858
  //#endregion
1859
1859
  export { shouldInlineAttachmentInChat as a, persistMessageAttachments as i, transferProgressSignal as n, ROOM_METHOD as r, PeerJsChannel as t };
1860
- //# sourceMappingURL=peerjs-z5zeioPV.js.map
1860
+ //# sourceMappingURL=peerjs-BLg8aGUj.js.map