shadow-claw 1.51.0 → 1.52.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 (296) hide show
  1. package/.well-known/mcp/server-card.json +1 -1
  2. package/.well-known/mcp.json +1 -1
  3. package/README.md +1 -1
  4. package/dist/cli/{chunk-Dtse8rAn.js → chunk-5ryVpyup.js} +1 -1
  5. package/dist/cli/chunk-Aq3057Xo.js +1 -0
  6. package/dist/cli/{chunk-4CZJpLqA.js → chunk-BV9JBYpl.js} +2 -2
  7. package/dist/cli/{chunk-mbFAP9Ev.js → chunk-BZI3bWDA.js} +1 -1
  8. package/dist/cli/chunk-BaUCHRPD.js +1 -0
  9. package/dist/cli/{chunk-vzUrhBN5.js → chunk-BdbEt6gM.js} +1 -1
  10. package/dist/cli/{chunk-BU8UG4L_.js → chunk-BiWLawPV.js} +1 -1
  11. package/dist/cli/chunk-BkLnHJeo.js +1 -0
  12. package/dist/cli/{chunk-BqfPWIBf.js → chunk-BzWY1sKE.js} +1 -1
  13. package/dist/cli/{chunk-DajM7Kro.js → chunk-C79eIU-4.js} +1 -1
  14. package/dist/cli/{chunk-CI9r1AM5.js → chunk-CDw214Zi.js} +1 -1
  15. package/dist/cli/chunk-CNqc7LLn.js +1 -0
  16. package/dist/cli/{chunk-CEhU-Ah-.js → chunk-CWW7dqIv.js} +1 -1
  17. package/dist/cli/{chunk-BT_C3OlA.js → chunk-CcSTYHtR.js} +1 -1
  18. package/dist/cli/chunk-ClOfk6Ga.js +1 -0
  19. package/dist/cli/chunk-ComXUwW0.js +1 -0
  20. package/dist/cli/{chunk-lL1BhHVe.js → chunk-CooeO4UQ.js} +1 -1
  21. package/dist/cli/{chunk-khr7--yI.js → chunk-CtfWY4G6.js} +1 -1
  22. package/dist/cli/{chunk-C4iW1XuQ.js → chunk-DFgSiYMW.js} +1 -1
  23. package/dist/cli/chunk-DGBnjngK.js +1 -0
  24. package/dist/cli/{chunk-D7bFIUK3.js → chunk-DGu1OhJs.js} +1 -1
  25. package/dist/cli/{chunk-CzfOerQR.js → chunk-DIjCY0Wf.js} +1 -1
  26. package/dist/cli/{chunk-D-iqEY5G.js → chunk-DJ_LeQtz.js} +1 -1
  27. package/dist/cli/{chunk-BmEsDkRK.js → chunk-DQRu-9wO.js} +1 -1
  28. package/dist/cli/{chunk-DojiYody.js → chunk-DToVgO9a.js} +1 -1
  29. package/dist/cli/{chunk-De5a_Rlp.js → chunk-DVbNkQRL.js} +1 -1
  30. package/dist/cli/{chunk-c8MIYB2y.js → chunk-Ddtzaj43.js} +1 -1
  31. package/dist/cli/{chunk-aJ6fufe-.js → chunk-DiqS56rD.js} +1 -1
  32. package/dist/cli/{chunk-CeUEmZNt.js → chunk-DnRcu9b4.js} +1 -1
  33. package/dist/cli/chunk-DtgZDsJA.js +1 -0
  34. package/dist/cli/{chunk-DVMcK7g6.js → chunk-Du4qvxo_.js} +2 -2
  35. package/dist/cli/{chunk-CegcvNc9.js → chunk-Dz5_hgvL.js} +8 -8
  36. package/dist/cli/{chunk-Cd4Dv5Eq.js → chunk-I3mxEelq.js} +1 -1
  37. package/dist/cli/{chunk-Do3VICh1.js → chunk-IU2SH_ti.js} +1 -1
  38. package/dist/cli/{chunk-BQveaAaD.js → chunk-NC8XsSSA.js} +1 -1
  39. package/dist/cli/{chunk-D702W_Ry.js → chunk-Q4BZ9QN9.js} +1 -1
  40. package/dist/cli/chunk-WTlDd4Ou.js +1 -0
  41. package/dist/cli/chunk-XGzq5joC.js +1 -0
  42. package/dist/cli/{chunk-ar7eAlxK.js → chunk-aJfaGe2s.js} +8 -8
  43. package/dist/cli/chunk-bPVrFlmk.js +1 -0
  44. package/dist/cli/chunk-jXJHKxdR.js +1 -0
  45. package/dist/cli/{chunk-C3dTAmV_.js → chunk-rstVU7U0.js} +1 -1
  46. package/dist/cli/{chunk-DGfTzQui.js → chunk-t72uObQ7.js} +1 -1
  47. package/dist/cli/{chunk-DDgfljzN.js → chunk-vq8xlroY.js} +1 -1
  48. package/dist/cli/cli.js +1 -1
  49. package/dist/headless-agent.js +1 -1
  50. package/dist/lib/components/common/shadow-claw-provider-model-picker.js +1 -1
  51. package/dist/lib/components/index.js +27 -27
  52. package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
  53. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  54. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  55. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  56. package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
  57. package/dist/lib/components/settings/shadow-claw-llm/model-ranking.d.ts +12 -0
  58. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  59. package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
  60. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  61. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  62. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  63. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  64. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  65. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  66. package/dist/lib/components/shadow-claw-a2ui.js +1 -1
  67. package/dist/lib/components/shadow-claw-accounts.js +1 -1
  68. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  69. package/dist/lib/components/shadow-claw-channels.js +1 -1
  70. package/dist/lib/components/shadow-claw-chat/shadow-claw-chat.d.ts +1 -0
  71. package/dist/lib/components/shadow-claw-chat.js +1 -1
  72. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  73. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  74. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  75. package/dist/lib/components/shadow-claw-files.js +1 -1
  76. package/dist/lib/components/shadow-claw-git.js +1 -1
  77. package/dist/lib/components/shadow-claw-integrations.js +1 -1
  78. package/dist/lib/components/shadow-claw-llm.js +1 -1
  79. package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
  80. package/dist/lib/components/shadow-claw-networking.js +1 -1
  81. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  82. package/dist/lib/components/shadow-claw-page-header.js +1 -1
  83. package/dist/lib/components/shadow-claw-pages.js +1 -1
  84. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  85. package/dist/lib/components/shadow-claw-provider-model-picker.js +1 -1
  86. package/dist/lib/components/shadow-claw-settings.js +1 -1
  87. package/dist/lib/components/shadow-claw-storage.js +1 -1
  88. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  89. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  90. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  91. package/dist/lib/components/shadow-claw-tools.js +1 -1
  92. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  93. package/dist/lib/components/shadow-claw.js +1 -1
  94. package/dist/lib/config/config.d.ts +2 -1
  95. package/dist/lib/{config-DxDaVDTn.js → config-DFLs7eoC.js} +3 -2
  96. package/dist/lib/config-DFLs7eoC.js.map +1 -0
  97. package/dist/lib/{configurePeerJs-ScwZiGbF.js → configurePeerJs-DJ0H6e6s.js} +3 -3
  98. package/dist/lib/{configurePeerJs-ScwZiGbF.js.map → configurePeerJs-DJ0H6e6s.js.map} +1 -1
  99. package/dist/lib/{connections-D82zele0.js → connections-DT3nPylw.js} +2 -2
  100. package/dist/lib/{connections-D82zele0.js.map → connections-DT3nPylw.js.map} +1 -1
  101. package/dist/lib/{downloadGroupFile-D7-5y6NI.js → downloadGroupFile-DMnAiPj4.js} +2 -2
  102. package/dist/lib/{downloadGroupFile-D7-5y6NI.js.map → downloadGroupFile-DMnAiPj4.js.map} +1 -1
  103. package/dist/lib/{file-viewer-BMvvndPQ.js → file-viewer-OHmGC_l7.js} +5 -5
  104. package/dist/lib/{file-viewer-BMvvndPQ.js.map → file-viewer-OHmGC_l7.js.map} +1 -1
  105. package/dist/lib/{getGroupDir-BidwYPfP.js → getGroupDir-mTV2Iz2b.js} +3 -3
  106. package/dist/lib/{getGroupDir-BidwYPfP.js.map → getGroupDir-mTV2Iz2b.js.map} +1 -1
  107. package/dist/lib/{git-CXmWufWS.js → git-CGdKghMC.js} +3 -3
  108. package/dist/lib/{git-CXmWufWS.js.map → git-CGdKghMC.js.map} +1 -1
  109. package/dist/lib/index.js +28 -28
  110. package/dist/lib/{initChatSplitResize-tvUZ-wsp.js → initChatSplitResize-B8zHHQdm.js} +2 -2
  111. package/dist/lib/{initChatSplitResize-tvUZ-wsp.js.map → initChatSplitResize-B8zHHQdm.js.map} +1 -1
  112. package/dist/lib/{initControlPlane-Dnjkb-6J.js → initControlPlane-BczrlTf3.js} +14 -14
  113. package/dist/lib/{initControlPlane-Dnjkb-6J.js.map → initControlPlane-BczrlTf3.js.map} +1 -1
  114. package/dist/lib/{markdown-WCXar9C8.js → markdown-D-7Cjyye.js} +3 -3
  115. package/dist/lib/{markdown-WCXar9C8.js.map → markdown-D-7Cjyye.js.map} +1 -1
  116. package/dist/lib/{mcp-reconnect-WTOQONHZ.js → mcp-reconnect-Czf7QCCv.js} +2 -2
  117. package/dist/lib/{mcp-reconnect-WTOQONHZ.js.map → mcp-reconnect-Czf7QCCv.js.map} +1 -1
  118. package/dist/lib/{memoryStorage-Bo2Wpfmg.js → memoryStorage-CXyKsKMo.js} +2 -2
  119. package/dist/lib/{memoryStorage-Bo2Wpfmg.js.map → memoryStorage-CXyKsKMo.js.map} +1 -1
  120. package/dist/lib/model-ranking-Bo8CpGH1.js +116 -0
  121. package/dist/lib/model-ranking-Bo8CpGH1.js.map +1 -0
  122. package/dist/lib/{orchestrator-Crw4btGn.js → orchestrator-BK138MkV.js} +10 -10
  123. package/dist/lib/{orchestrator-Crw4btGn.js.map → orchestrator-BK138MkV.js.map} +1 -1
  124. package/dist/lib/{orchestrator-Dro541iH.js → orchestrator-BtbxiPQB.js} +17 -16
  125. package/dist/lib/{orchestrator-Dro541iH.js.map → orchestrator-BtbxiPQB.js.map} +1 -1
  126. package/dist/lib/{peerjs-D741bHrf.js → peerjs-QJr03K9F.js} +7 -7
  127. package/dist/lib/{peerjs-D741bHrf.js.map → peerjs-QJr03K9F.js.map} +1 -1
  128. package/dist/lib/{prompt-api-D9XdrCep.js → prompt-api-vf351sf2.js} +2 -19
  129. package/dist/lib/{prompt-api-D9XdrCep.js.map → prompt-api-vf351sf2.js.map} +1 -1
  130. package/dist/lib/{push-client-DKFUY_Ti.js → push-client-BOHgqHbk.js} +4 -4
  131. package/dist/lib/{push-client-DKFUY_Ti.js.map → push-client-BOHgqHbk.js.map} +1 -1
  132. package/dist/lib/{readGroupFileBytes-C8Xqlb8l.js → readGroupFileBytes-CRA6dmgT.js} +2 -2
  133. package/dist/lib/{readGroupFileBytes-C8Xqlb8l.js.map → readGroupFileBytes-CRA6dmgT.js.map} +1 -1
  134. package/dist/lib/{shadow-claw-a2ui-CPydWVdW.js → shadow-claw-a2ui-DbZa4Gxp.js} +2 -2
  135. package/dist/lib/{shadow-claw-a2ui-CPydWVdW.js.map → shadow-claw-a2ui-DbZa4Gxp.js.map} +1 -1
  136. package/dist/lib/{shadow-claw-accounts-CUypXc3I.js → shadow-claw-accounts-B6OW2NVD.js} +3 -3
  137. package/dist/lib/{shadow-claw-accounts-CUypXc3I.js.map → shadow-claw-accounts-B6OW2NVD.js.map} +1 -1
  138. package/dist/lib/{shadow-claw-channel-config-D_Vb2ous.js → shadow-claw-channel-config-F_EJ-uK2.js} +3 -3
  139. package/dist/lib/{shadow-claw-channel-config-D_Vb2ous.js.map → shadow-claw-channel-config-F_EJ-uK2.js.map} +1 -1
  140. package/dist/lib/{shadow-claw-channels-hgjjzvRr.js → shadow-claw-channels-XYylMpjg.js} +3 -3
  141. package/dist/lib/{shadow-claw-channels-hgjjzvRr.js.map → shadow-claw-channels-XYylMpjg.js.map} +1 -1
  142. package/dist/lib/{shadow-claw-chat-D69IiLXd.js → shadow-claw-chat-dbK_DGO_.js} +124 -38
  143. package/dist/lib/shadow-claw-chat-dbK_DGO_.js.map +1 -0
  144. package/dist/lib/{shadow-claw-control-plane-zBYlFvzQ.js → shadow-claw-control-plane-BJKkmahQ.js} +7 -7
  145. package/dist/lib/{shadow-claw-control-plane-zBYlFvzQ.js.map → shadow-claw-control-plane-BJKkmahQ.js.map} +1 -1
  146. package/dist/lib/{shadow-claw-conversations-1GW8_e8o.js → shadow-claw-conversations-BKSsMYTc.js} +6 -6
  147. package/dist/lib/{shadow-claw-conversations-1GW8_e8o.js.map → shadow-claw-conversations-BKSsMYTc.js.map} +1 -1
  148. package/dist/lib/{shadow-claw-D3z3tFyE.js → shadow-claw-eBB2dbpd.js} +11 -11
  149. package/dist/lib/{shadow-claw-D3z3tFyE.js.map → shadow-claw-eBB2dbpd.js.map} +1 -1
  150. package/dist/lib/{shadow-claw-file-viewer-DI4r7Th9.js → shadow-claw-file-viewer-BqChtTvM.js} +8 -8
  151. package/dist/lib/{shadow-claw-file-viewer-DI4r7Th9.js.map → shadow-claw-file-viewer-BqChtTvM.js.map} +1 -1
  152. package/dist/lib/{shadow-claw-files-BM7qW3TW.js → shadow-claw-files-Bu7VCQw6.js} +9 -9
  153. package/dist/lib/{shadow-claw-files-BM7qW3TW.js.map → shadow-claw-files-Bu7VCQw6.js.map} +1 -1
  154. package/dist/lib/{shadow-claw-git-BBTiTYIn.js → shadow-claw-git-CdPPN6Qb.js} +6 -6
  155. package/dist/lib/{shadow-claw-git-BBTiTYIn.js.map → shadow-claw-git-CdPPN6Qb.js.map} +1 -1
  156. package/dist/lib/{shadow-claw-integrations-DTY3E545.js → shadow-claw-integrations-DehqBSRe.js} +4 -4
  157. package/dist/lib/{shadow-claw-integrations-DTY3E545.js.map → shadow-claw-integrations-DehqBSRe.js.map} +1 -1
  158. package/dist/lib/{shadow-claw-llm-AJwzkOGo.js → shadow-claw-llm-COZkufA8.js} +13 -11
  159. package/dist/lib/shadow-claw-llm-COZkufA8.js.map +1 -0
  160. package/dist/lib/{shadow-claw-mcp-remote-n7YXKxmv.js → shadow-claw-mcp-remote-axF50-le.js} +4 -4
  161. package/dist/lib/{shadow-claw-mcp-remote-n7YXKxmv.js.map → shadow-claw-mcp-remote-axF50-le.js.map} +1 -1
  162. package/dist/lib/{shadow-claw-networking-B3leDgZ4.js → shadow-claw-networking-BT_Rxj36.js} +2 -2
  163. package/dist/lib/{shadow-claw-networking-B3leDgZ4.js.map → shadow-claw-networking-BT_Rxj36.js.map} +1 -1
  164. package/dist/lib/{shadow-claw-notifications-Bm2aHQ0U.js → shadow-claw-notifications-ClqAXDDN.js} +3 -3
  165. package/dist/lib/{shadow-claw-notifications-Bm2aHQ0U.js.map → shadow-claw-notifications-ClqAXDDN.js.map} +1 -1
  166. package/dist/lib/{shadow-claw-page-header-BBqSWlhP.js → shadow-claw-page-header-bigC_h6U.js} +2 -2
  167. package/dist/lib/{shadow-claw-page-header-BBqSWlhP.js.map → shadow-claw-page-header-bigC_h6U.js.map} +1 -1
  168. package/dist/lib/{shadow-claw-pages-BFOcluFY.js → shadow-claw-pages-kA2qa-4B.js} +9 -9
  169. package/dist/lib/{shadow-claw-pages-BFOcluFY.js.map → shadow-claw-pages-kA2qa-4B.js.map} +1 -1
  170. package/dist/lib/{shadow-claw-peerjs-BvD_MH_l.js → shadow-claw-peerjs-CvcH2DkA.js} +3 -3
  171. package/dist/lib/{shadow-claw-peerjs-BvD_MH_l.js.map → shadow-claw-peerjs-CvcH2DkA.js.map} +1 -1
  172. package/dist/lib/{shadow-claw-provider-model-picker-CsA-507a.js → shadow-claw-provider-model-picker-fcVQdDtQ.js} +2 -2
  173. package/dist/lib/{shadow-claw-provider-model-picker-CsA-507a.js.map → shadow-claw-provider-model-picker-fcVQdDtQ.js.map} +1 -1
  174. package/dist/lib/{shadow-claw-settings-CZgGMz0a.js → shadow-claw-settings-CkO6JjA4.js} +6 -6
  175. package/dist/lib/{shadow-claw-settings-CZgGMz0a.js.map → shadow-claw-settings-CkO6JjA4.js.map} +1 -1
  176. package/dist/lib/{shadow-claw-storage-BTUpEKO0.js → shadow-claw-storage-10w-y8vL.js} +5 -5
  177. package/dist/lib/{shadow-claw-storage-BTUpEKO0.js.map → shadow-claw-storage-10w-y8vL.js.map} +1 -1
  178. package/dist/lib/{shadow-claw-task-server-B1X2AYyZ.js → shadow-claw-task-server-U98sZxPu.js} +2 -2
  179. package/dist/lib/{shadow-claw-task-server-B1X2AYyZ.js.map → shadow-claw-task-server-U98sZxPu.js.map} +1 -1
  180. package/dist/lib/{shadow-claw-tasks-BYtaRUAd.js → shadow-claw-tasks-DrSVUOsP.js} +8 -8
  181. package/dist/lib/{shadow-claw-tasks-BYtaRUAd.js.map → shadow-claw-tasks-DrSVUOsP.js.map} +1 -1
  182. package/dist/lib/{shadow-claw-terminal-LGuXKu77.js → shadow-claw-terminal-B7HYLuce.js} +2 -2
  183. package/dist/lib/{shadow-claw-terminal-LGuXKu77.js.map → shadow-claw-terminal-B7HYLuce.js.map} +1 -1
  184. package/dist/lib/{shadow-claw-tools-C_S-xXVG.js → shadow-claw-tools-BKrXzZfF.js} +7 -7
  185. package/dist/lib/{shadow-claw-tools-C_S-xXVG.js.map → shadow-claw-tools-BKrXzZfF.js.map} +1 -1
  186. package/dist/lib/{shadow-claw-webvm-Cab1n1bu.js → shadow-claw-webvm-Duwa5oiW.js} +3 -3
  187. package/dist/lib/{shadow-claw-webvm-Cab1n1bu.js.map → shadow-claw-webvm-Duwa5oiW.js.map} +1 -1
  188. package/dist/lib/{syncWebMcpRegistration-Dy5NS_4G.js → syncWebMcpRegistration-BOx-0F6_.js} +5 -5
  189. package/dist/lib/{syncWebMcpRegistration-Dy5NS_4G.js.map → syncWebMcpRegistration-BOx-0F6_.js.map} +1 -1
  190. package/dist/lib/{tools-B7gC1eb_.js → tools-BEuBatUs.js} +4 -4
  191. package/dist/lib/{tools-B7gC1eb_.js.map → tools-BEuBatUs.js.map} +1 -1
  192. package/dist/lib/utils/index.js +1 -1
  193. package/dist/lib/utils/utils.js +1 -1
  194. package/dist/lib/{utils-D_ylqOY-.js → utils-D8AxCH6m.js} +2 -2
  195. package/dist/lib/{utils-D_ylqOY-.js.map → utils-D8AxCH6m.js.map} +1 -1
  196. package/dist/lib/{webmcp-CkYINKJj.js → webmcp-BjfVWX1K.js} +2 -2
  197. package/dist/lib/{webmcp-CkYINKJj.js.map → webmcp-BjfVWX1K.js.map} +1 -1
  198. package/dist/public/.well-known/mcp/server-card.json +1 -1
  199. package/dist/public/.well-known/mcp.json +1 -1
  200. package/dist/public/README.md +1 -1
  201. package/dist/public/agent.worker.js +1 -1
  202. package/dist/public/components/shadow-claw-chat/shadow-claw-chat.html +1 -1
  203. package/dist/public/config-071HSho8.js +1 -0
  204. package/dist/public/{configurePeerJs-DQQ6YL-5.js → configurePeerJs-DL-LurJY.js} +1 -1
  205. package/dist/public/{connections-CRNk2FxF.js → connections-Bb0rBpV-.js} +1 -1
  206. package/dist/public/{custom-element-security-3_FKCXcg.js → custom-element-security-Td4vrRc_.js} +1 -1
  207. package/dist/public/docs/example/article/index.html +1 -1
  208. package/dist/public/docs/example/article.html +1 -1
  209. package/dist/public/docs/publishing/index.html +1 -1
  210. package/dist/public/docs/publishing.html +1 -1
  211. package/dist/public/docs/skill-creator/index.html +1 -1
  212. package/dist/public/docs/skill-creator.html +1 -1
  213. package/dist/public/docs/subsystems/providers.md +1 -1
  214. package/dist/public/{downloadGroupFile-wkdhVgrZ.js → downloadGroupFile-Unq8_7D9.js} +1 -1
  215. package/dist/public/{e2e-bridge-DnFHPuwg.js → e2e-bridge-Dbc9fCDq.js} +1 -1
  216. package/dist/public/{file-viewer-C92v4Ggd.js → file-viewer-QkCuknFn.js} +1 -1
  217. package/dist/public/{getGroupDir-BGGIJL4Y.js → getGroupDir-Bj5XCflQ.js} +1 -1
  218. package/dist/public/{git-BH6qyToB.js → git-Bhz4YHc8.js} +2 -2
  219. package/dist/public/index.html +1 -1
  220. package/dist/public/index.js +1 -1
  221. package/dist/public/{initChatSplitResize--RH5kzVF.js → initChatSplitResize-KNL9Oh7s.js} +1 -1
  222. package/dist/public/{initControlPlane-yPJ3ajkj.js → initControlPlane-D2fVhRFC.js} +1 -1
  223. package/dist/public/main/index.html +1 -1
  224. package/dist/public/main/memory/index.html +1 -1
  225. package/dist/public/main/memory.html +1 -1
  226. package/dist/public/main.html +1 -1
  227. package/dist/public/{markdown-CA0v11cd.js → markdown-By6gdUvF.js} +1 -1
  228. package/dist/public/{mcp-reconnect-uyNSigzu.js → mcp-reconnect-CDRJPuoN.js} +1 -1
  229. package/dist/public/{memoryStorage-DjPNAT5t.js → memoryStorage-C-ao9y-j.js} +1 -1
  230. package/dist/public/model-ranking-DUdrFOcC.js +1 -0
  231. package/dist/public/{orchestrator-DTzgyL23.js → orchestrator-B7MpomoG.js} +2 -2
  232. package/dist/public/{orchestrator-Cmr69pMC.js → orchestrator-C8aIHbDy.js} +2 -2
  233. package/dist/public/{peerjs-Br38mUFC.js → peerjs-DwGjY5VX.js} +1 -1
  234. package/dist/public/prompt-api-BWe_j3Wg.js +1 -0
  235. package/dist/public/{push-client-CB8haOGC.js → push-client-o8g5_EOe.js} +1 -1
  236. package/dist/public/service-worker.js +1 -1
  237. package/dist/public/{shadow-claw-RuFQ2Ej5.js → shadow-claw-Ba2ZFE9m.js} +2 -2
  238. package/dist/public/{shadow-claw-accounts-BMsEItB6.js → shadow-claw-accounts-BbNPiiaV.js} +1 -1
  239. package/dist/public/{shadow-claw-channels-Q_AXuEaI.js → shadow-claw-channels-CHGtPkfY.js} +1 -1
  240. package/dist/public/{shadow-claw-chat-DZQ3OaH7.js → shadow-claw-chat-3TmjJA6-.js} +90 -23
  241. package/dist/public/{shadow-claw-control-plane-CyXA8tB8.js → shadow-claw-control-plane-BAFT06LL.js} +2 -2
  242. package/dist/public/{shadow-claw-conversations-BLKtlvHe.js → shadow-claw-conversations-DsQ_kxWm.js} +1 -1
  243. package/dist/public/{shadow-claw-file-viewer-CVLDfpZe.js → shadow-claw-file-viewer-hBxTknL2.js} +1 -1
  244. package/dist/public/{shadow-claw-files-DB6VVjir.js → shadow-claw-files-Daw6IIrJ.js} +1 -1
  245. package/dist/public/{shadow-claw-git-D57bTSMF.js → shadow-claw-git-CxGwyxim.js} +2 -2
  246. package/dist/public/{shadow-claw-integrations-BOwhUY-4.js → shadow-claw-integrations-DnIr6xp-.js} +1 -1
  247. package/dist/public/{shadow-claw-llm-CYenm-mm.js → shadow-claw-llm-Bc6tZ8kk.js} +3 -3
  248. package/dist/public/{shadow-claw-mcp-remote-CJ-Ckl0j.js → shadow-claw-mcp-remote-nGPpFpI-.js} +1 -1
  249. package/dist/public/{shadow-claw-networking-Cut76YQL.js → shadow-claw-networking-B6YgtiA7.js} +1 -1
  250. package/dist/public/{shadow-claw-notifications-C3kYCrIa.js → shadow-claw-notifications-BSxifptS.js} +1 -1
  251. package/dist/public/{shadow-claw-page-header-Dd7QafUk.js → shadow-claw-page-header-LzVgEn46.js} +1 -1
  252. package/dist/public/{shadow-claw-pages-BWtVtwTG.js → shadow-claw-pages-Cy6T0G9y.js} +1 -1
  253. package/dist/public/{shadow-claw-settings-Bj7jnngO.js → shadow-claw-settings-DGkwt1ge.js} +2 -2
  254. package/dist/public/{shadow-claw-storage-CMSzQs1-.js → shadow-claw-storage-DX_4T7KR.js} +1 -1
  255. package/dist/public/{shadow-claw-task-server-CFclo7UX.js → shadow-claw-task-server-DTsbEs5z.js} +1 -1
  256. package/dist/public/{shadow-claw-tasks-ClDdeB6Z.js → shadow-claw-tasks-rr6fMxAM.js} +1 -1
  257. package/dist/public/{shadow-claw-terminal-3ysWZJix.js → shadow-claw-terminal-C7DhrrX6.js} +1 -1
  258. package/dist/public/{shadow-claw-tools-DQVwpTcZ.js → shadow-claw-tools-DcQroojH.js} +1 -1
  259. package/dist/public/{shadow-claw-webvm-Cnxz04Fk.js → shadow-claw-webvm-bZj44Did.js} +1 -1
  260. package/dist/public/{syncWebMcpRegistration-QwnLMAK3.js → syncWebMcpRegistration-XJjIlDNO.js} +1 -1
  261. package/dist/public/{tools-DvQ_ngXn.js → tools-BpZh7hgB.js} +1 -1
  262. package/dist/public/{webmcp-CJymew4t.js → webmcp-CkfDZfZ0.js} +1 -1
  263. package/dist/server.js +1 -1
  264. package/package.json +1 -1
  265. package/src/components/settings/shadow-claw-llm/model-ranking.test.ts +121 -7
  266. package/src/components/settings/shadow-claw-llm/model-ranking.ts +97 -0
  267. package/src/components/settings/shadow-claw-llm/shadow-claw-llm.test.ts +35 -0
  268. package/src/components/settings/shadow-claw-llm/shadow-claw-llm.ts +15 -5
  269. package/src/components/shadow-claw-chat/shadow-claw-chat.html +81 -14
  270. package/src/components/shadow-claw-chat/shadow-claw-chat.test.ts +73 -0
  271. package/src/components/shadow-claw-chat/shadow-claw-chat.trusted-types.test.ts +3 -0
  272. package/src/components/shadow-claw-chat/shadow-claw-chat.ts +79 -32
  273. package/src/config/config.test.ts +4 -4
  274. package/src/config/config.ts +2 -1
  275. package/src/core/orchestrator/orchestrator.test.ts +2 -1
  276. package/src/core/orchestrator/utils/initTasks.ts +5 -4
  277. package/dist/cli/chunk-B3S061IE.js +0 -1
  278. package/dist/cli/chunk-BUJdF9o3.js +0 -1
  279. package/dist/cli/chunk-BX0R2gIY.js +0 -1
  280. package/dist/cli/chunk-BoiPfhwJ.js +0 -1
  281. package/dist/cli/chunk-BtJYj7vB.js +0 -1
  282. package/dist/cli/chunk-BwXrZVeU.js +0 -1
  283. package/dist/cli/chunk-CaWh9Pru.js +0 -1
  284. package/dist/cli/chunk-Ck4ePI8z.js +0 -1
  285. package/dist/cli/chunk-Ctg-SXcP.js +0 -1
  286. package/dist/cli/chunk-DTKv1-tk.js +0 -1
  287. package/dist/cli/chunk-DdYpd9Nu.js +0 -1
  288. package/dist/cli/chunk-DflhmBY2.js +0 -1
  289. package/dist/lib/config-DxDaVDTn.js.map +0 -1
  290. package/dist/lib/model-ranking-CDXs7hkK.js +0 -57
  291. package/dist/lib/model-ranking-CDXs7hkK.js.map +0 -1
  292. package/dist/lib/shadow-claw-chat-D69IiLXd.js.map +0 -1
  293. package/dist/lib/shadow-claw-llm-AJwzkOGo.js.map +0 -1
  294. package/dist/public/config-Dqn5OMfC.js +0 -1
  295. package/dist/public/model-ranking-DLIC9IDU.js +0 -1
  296. package/dist/public/prompt-api-B-8N-MRY.js +0 -11
@@ -28,23 +28,6 @@ async function isNativePromptApiAvailable() {
28
28
  return true;
29
29
  }
30
30
  /**
31
- * Renders status and instruction markup for the Prompt API onboarding dialog.
32
- */
33
- function renderPromptApiStatusHtml(isNativeSupported) {
34
- if (isNativeSupported) return `<div class="chat__prompt-api-badge chat__prompt-api-badge--success">&#10003; Native Prompt API detected</div>
35
- <p class="chat__prompt-api-status-note">Your browser has built-in on-device AI support enabled.</p>`;
36
- return `<div class="chat__prompt-api-badge chat__prompt-api-badge--warning">&#9888;&#65039; Native Prompt API not detected &mdash; using local ONNX fallback</div>
37
- <div class="chat__prompt-api-instructions">
38
- <p class="chat__prompt-api-instructions-title"><strong>To enable native Prompt API in your browser:</strong></p>
39
- <ol class="chat__prompt-api-steps">
40
- <li>Navigate to <code>chrome://flags</code> (or <code>edge://flags</code>)</li>
41
- <li>Enable <code>#prompt-api-for-gemini-nano</code> (or <code>#prompt-api</code>) and <code>#enables-optimization-guide-on-device-model</code></li>
42
- <li>Visit <code>chrome://components</code> (or <code>edge://components</code>) and click <em>Check for update</em> next to the on-device model component</li>
43
- <li>Restart your browser</li>
44
- </ol>
45
- </div>`;
46
- }
47
- /**
48
31
  * Builds dialog options for Prompt API error and help prompts.
49
32
  */
50
33
  function buildPromptApiHelpDialogOptions(reason) {
@@ -69,5 +52,5 @@ function buildPromptApiHelpDialogOptions(reason) {
69
52
  }
70
53
 
71
54
  //#endregion
72
- export { renderPromptApiStatusHtml as i, isNativePromptApiAvailable as n, isNativePromptApiSupported as r, buildPromptApiHelpDialogOptions as t };
73
- //# sourceMappingURL=prompt-api-D9XdrCep.js.map
55
+ export { isNativePromptApiAvailable as n, isNativePromptApiSupported as r, buildPromptApiHelpDialogOptions as t };
56
+ //# sourceMappingURL=prompt-api-vf351sf2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-api-D9XdrCep.js","names":[],"sources":["../../src/components/common/help/prompt-api.ts"],"sourcesContent":["import type { AppDialogOptions } from \"../../../ui/types.js\";\n\nexport const PROMPT_API_DOCS_URL =\n \"https://developer.chrome.com/docs/ai/built-in\";\n\n/**\n * Checks whether native browser Prompt API is detected in the current runtime.\n */\nexport function isNativePromptApiSupported(): boolean {\n if (typeof window === \"undefined\" && typeof globalThis === \"undefined\") {\n return false;\n }\n\n const g = (typeof window !== \"undefined\" ? window : globalThis) as any;\n\n if (g.TRANSFORMERS_CONFIG) {\n return false;\n }\n\n if (g.LanguageModel && typeof g.LanguageModel.create === \"function\") {\n return true;\n }\n\n if (g.ai?.languageModel && typeof g.ai.languageModel.create === \"function\") {\n return true;\n }\n\n return false;\n}\n\n/**\n * Asynchronously checks whether native browser Prompt API is detected and available\n * in the current environment (verifying LanguageModel.availability() if exposed).\n */\nexport async function isNativePromptApiAvailable(): Promise<boolean> {\n if (!isNativePromptApiSupported()) {\n return false;\n }\n\n const g = (typeof window !== \"undefined\" ? window : globalThis) as any;\n const lm = g.LanguageModel || g.ai?.languageModel;\n\n if (typeof lm?.availability === \"function\") {\n try {\n const status = await lm.availability();\n return status !== \"unavailable\" && status !== \"no\";\n } catch {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks whether native browser Prompt API is potentially supported in the current environment.\n * If native browser Prompt API is not detected, it is treated as unavailable so that clients\n * fall back gracefully to the transformers.js alternative (just like Firefox).\n */\nexport function isPromptApiPotentiallySupported(): boolean {\n return false;\n}\n\n/**\n * Renders status and instruction markup for the Prompt API onboarding dialog.\n */\nexport function renderPromptApiStatusHtml(isNativeSupported: boolean): string {\n if (isNativeSupported) {\n return `<div class=\"chat__prompt-api-badge chat__prompt-api-badge--success\">&#10003; Native Prompt API detected</div>\n<p class=\"chat__prompt-api-status-note\">Your browser has built-in on-device AI support enabled.</p>`;\n }\n\n return `<div class=\"chat__prompt-api-badge chat__prompt-api-badge--warning\">&#9888;&#65039; Native Prompt API not detected &mdash; using local ONNX fallback</div>\n<div class=\"chat__prompt-api-instructions\">\n <p class=\"chat__prompt-api-instructions-title\"><strong>To enable native Prompt API in your browser:</strong></p>\n <ol class=\"chat__prompt-api-steps\">\n <li>Navigate to <code>chrome://flags</code> (or <code>edge://flags</code>)</li>\n <li>Enable <code>#prompt-api-for-gemini-nano</code> (or <code>#prompt-api</code>) and <code>#enables-optimization-guide-on-device-model</code></li>\n <li>Visit <code>chrome://components</code> (or <code>edge://components</code>) and click <em>Check for update</em> next to the on-device model component</li>\n <li>Restart your browser</li>\n </ol>\n</div>`;\n}\n\n/**\n * Builds dialog options for Prompt API error and help prompts.\n */\nexport function buildPromptApiHelpDialogOptions(\n reason?: string,\n): AppDialogOptions {\n const details = [\n \"ShadowClaw uses the browser-native Prompt API for local, private AI inference.\",\n \"If native browser Prompt API is unavailable, ShadowClaw falls back to running a local ONNX model in your browser (defaulting to Qwen 0.6B).\",\n \"To enable native Prompt API: enable the Prompt API flags and optimization guide under your browser's experimental flags (chrome://flags or edge://flags).\",\n ];\n\n if (reason && reason.trim()) {\n details.push(`Details: ${reason.trim()}`);\n }\n\n return {\n mode: \"info\",\n title: \"Prompt API Setup & Info\",\n message: \"ShadowClaw is configured to use the browser-native Prompt API.\",\n details,\n confirmLabel: \"OK\",\n autoCloseSeconds: 30,\n links: [\n {\n label: \"Prompt API Documentation\",\n href: PROMPT_API_DOCS_URL,\n },\n ],\n };\n}\n"],"mappings":";AAEA,MAAa,sBACX;;;;AAKF,SAAgB,6BAAsC;CACpD,IAAI,OAAO,WAAW,eAAe,OAAO,eAAe,aACzD,OAAO;CAGT,MAAM,IAAK,OAAO,WAAW,cAAc,SAAS;CAEpD,IAAI,EAAE,qBACJ,OAAO;CAGT,IAAI,EAAE,iBAAiB,OAAO,EAAE,cAAc,WAAW,YACvD,OAAO;CAGT,IAAI,EAAE,IAAI,iBAAiB,OAAO,EAAE,GAAG,cAAc,WAAW,YAC9D,OAAO;CAGT,OAAO;AACT;;;;;AAMA,eAAsB,6BAA+C;CACnE,IAAI,CAAC,2BAA2B,GAC9B,OAAO;CAGT,MAAM,IAAK,OAAO,WAAW,cAAc,SAAS;CACpD,MAAM,KAAK,EAAE,iBAAiB,EAAE,IAAI;CAEpC,IAAI,OAAO,IAAI,iBAAiB,YAC9B,IAAI;EACF,MAAM,SAAS,MAAM,GAAG,aAAa;EACrC,OAAO,WAAW,iBAAiB,WAAW;CAChD,QAAQ;EACN,OAAO;CACT;CAGF,OAAO;AACT;;;;AAcA,SAAgB,0BAA0B,mBAAoC;CAC5E,IAAI,mBACF,OAAO;;CAIT,OAAO;;;;;;;;;;AAUT;;;;AAKA,SAAgB,gCACd,QACkB;CAClB,MAAM,UAAU;EACd;EACA;EACA;CACF;CAEA,IAAI,UAAU,OAAO,KAAK,GACxB,QAAQ,KAAK,YAAY,OAAO,KAAK,GAAG;CAG1C,OAAO;EACL,MAAM;EACN,OAAO;EACP,SAAS;EACT;EACA,cAAc;EACd,kBAAkB;EAClB,OAAO,CACL;GACE,OAAO;GACP,MAAM;EACR,CACF;CACF;AACF"}
1
+ {"version":3,"file":"prompt-api-vf351sf2.js","names":[],"sources":["../../src/components/common/help/prompt-api.ts"],"sourcesContent":["import type { AppDialogOptions } from \"../../../ui/types.js\";\n\nexport const PROMPT_API_DOCS_URL =\n \"https://developer.chrome.com/docs/ai/built-in\";\n\n/**\n * Checks whether native browser Prompt API is detected in the current runtime.\n */\nexport function isNativePromptApiSupported(): boolean {\n if (typeof window === \"undefined\" && typeof globalThis === \"undefined\") {\n return false;\n }\n\n const g = (typeof window !== \"undefined\" ? window : globalThis) as any;\n\n if (g.TRANSFORMERS_CONFIG) {\n return false;\n }\n\n if (g.LanguageModel && typeof g.LanguageModel.create === \"function\") {\n return true;\n }\n\n if (g.ai?.languageModel && typeof g.ai.languageModel.create === \"function\") {\n return true;\n }\n\n return false;\n}\n\n/**\n * Asynchronously checks whether native browser Prompt API is detected and available\n * in the current environment (verifying LanguageModel.availability() if exposed).\n */\nexport async function isNativePromptApiAvailable(): Promise<boolean> {\n if (!isNativePromptApiSupported()) {\n return false;\n }\n\n const g = (typeof window !== \"undefined\" ? window : globalThis) as any;\n const lm = g.LanguageModel || g.ai?.languageModel;\n\n if (typeof lm?.availability === \"function\") {\n try {\n const status = await lm.availability();\n return status !== \"unavailable\" && status !== \"no\";\n } catch {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks whether native browser Prompt API is potentially supported in the current environment.\n * If native browser Prompt API is not detected, it is treated as unavailable so that clients\n * fall back gracefully to the transformers.js alternative (just like Firefox).\n */\nexport function isPromptApiPotentiallySupported(): boolean {\n return false;\n}\n\n/**\n * Renders status and instruction markup for the Prompt API onboarding dialog.\n */\nexport function renderPromptApiStatusHtml(isNativeSupported: boolean): string {\n if (isNativeSupported) {\n return `<div class=\"chat__prompt-api-badge chat__prompt-api-badge--success\">&#10003; Native Prompt API detected</div>\n<p class=\"chat__prompt-api-status-note\">Your browser has built-in on-device AI support enabled.</p>`;\n }\n\n return `<div class=\"chat__prompt-api-badge chat__prompt-api-badge--warning\">&#9888;&#65039; Native Prompt API not detected &mdash; using local ONNX fallback</div>\n<div class=\"chat__prompt-api-instructions\">\n <p class=\"chat__prompt-api-instructions-title\"><strong>To enable native Prompt API in your browser:</strong></p>\n <ol class=\"chat__prompt-api-steps\">\n <li>Navigate to <code>chrome://flags</code> (or <code>edge://flags</code>)</li>\n <li>Enable <code>#prompt-api-for-gemini-nano</code> (or <code>#prompt-api</code>) and <code>#enables-optimization-guide-on-device-model</code></li>\n <li>Visit <code>chrome://components</code> (or <code>edge://components</code>) and click <em>Check for update</em> next to the on-device model component</li>\n <li>Restart your browser</li>\n </ol>\n</div>`;\n}\n\n/**\n * Builds dialog options for Prompt API error and help prompts.\n */\nexport function buildPromptApiHelpDialogOptions(\n reason?: string,\n): AppDialogOptions {\n const details = [\n \"ShadowClaw uses the browser-native Prompt API for local, private AI inference.\",\n \"If native browser Prompt API is unavailable, ShadowClaw falls back to running a local ONNX model in your browser (defaulting to Qwen 0.6B).\",\n \"To enable native Prompt API: enable the Prompt API flags and optimization guide under your browser's experimental flags (chrome://flags or edge://flags).\",\n ];\n\n if (reason && reason.trim()) {\n details.push(`Details: ${reason.trim()}`);\n }\n\n return {\n mode: \"info\",\n title: \"Prompt API Setup & Info\",\n message: \"ShadowClaw is configured to use the browser-native Prompt API.\",\n details,\n confirmLabel: \"OK\",\n autoCloseSeconds: 30,\n links: [\n {\n label: \"Prompt API Documentation\",\n href: PROMPT_API_DOCS_URL,\n },\n ],\n };\n}\n"],"mappings":";AAEA,MAAa,sBACX;;;;AAKF,SAAgB,6BAAsC;CACpD,IAAI,OAAO,WAAW,eAAe,OAAO,eAAe,aACzD,OAAO;CAGT,MAAM,IAAK,OAAO,WAAW,cAAc,SAAS;CAEpD,IAAI,EAAE,qBACJ,OAAO;CAGT,IAAI,EAAE,iBAAiB,OAAO,EAAE,cAAc,WAAW,YACvD,OAAO;CAGT,IAAI,EAAE,IAAI,iBAAiB,OAAO,EAAE,GAAG,cAAc,WAAW,YAC9D,OAAO;CAGT,OAAO;AACT;;;;;AAMA,eAAsB,6BAA+C;CACnE,IAAI,CAAC,2BAA2B,GAC9B,OAAO;CAGT,MAAM,IAAK,OAAO,WAAW,cAAc,SAAS;CACpD,MAAM,KAAK,EAAE,iBAAiB,EAAE,IAAI;CAEpC,IAAI,OAAO,IAAI,iBAAiB,YAC9B,IAAI;EACF,MAAM,SAAS,MAAM,GAAG,aAAa;EACrC,OAAO,WAAW,iBAAiB,WAAW;CAChD,QAAQ;EACN,OAAO;CACT;CAGF,OAAO;AACT;;;;AAmCA,SAAgB,gCACd,QACkB;CAClB,MAAM,UAAU;EACd;EACA;EACA;CACF;CAEA,IAAI,UAAU,OAAO,KAAK,GACxB,QAAQ,KAAK,YAAY,OAAO,KAAK,GAAG;CAG1C,OAAO;EACL,MAAM;EACN,OAAO;EACP,SAAS;EACT;EACA,cAAc;EACd,kBAAkB;EAClB,OAAO,CACL;GACE,OAAO;GACP,MAAM;EACR,CACF;CACF;AACF"}
@@ -1,5 +1,5 @@
1
1
  import { r as getDb } from "./txPromise-DdeRXi7G.js";
2
- import { r as CONFIG_KEYS } from "./config-DxDaVDTn.js";
2
+ import { r as CONFIG_KEYS } from "./config-DFLs7eoC.js";
3
3
  import { t as getConfig } from "./getConfig-SElp6VJW.js";
4
4
  import { t as setConfig } from "./setConfig-8FMUTIJ1.js";
5
5
 
@@ -80,7 +80,7 @@ async function subscribeToPush(clientId, deviceLabel, subscriberId) {
80
80
  let resolvedDeviceLabel = deviceLabel;
81
81
  let resolvedSubscriberId = subscriberId;
82
82
  if (!resolvedClientId || !resolvedDeviceLabel) try {
83
- const initCp = await import("./initControlPlane-Dnjkb-6J.js");
83
+ const initCp = await import("./initControlPlane-BczrlTf3.js");
84
84
  if (!resolvedClientId && typeof initCp.getOrCreateControlPlaneClientId === "function") resolvedClientId = initCp.getOrCreateControlPlaneClientId();
85
85
  if (!resolvedDeviceLabel && typeof initCp.detectDeviceLabel === "function") resolvedDeviceLabel = initCp.detectDeviceLabel();
86
86
  } catch (_) {}
@@ -116,7 +116,7 @@ async function syncExistingPushSubscription(subscriberId) {
116
116
  let resolvedSubscriberId = subscriberId;
117
117
  if (typeof localStorage !== "undefined") resolvedClientId = localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_CLIENT_ID) || void 0;
118
118
  try {
119
- const initCp = await import("./initControlPlane-Dnjkb-6J.js");
119
+ const initCp = await import("./initControlPlane-BczrlTf3.js");
120
120
  if (!resolvedClientId && typeof initCp.getOrCreateControlPlaneClientId === "function") resolvedClientId = initCp.getOrCreateControlPlaneClientId();
121
121
  if (typeof initCp.detectDeviceLabel === "function") resolvedDeviceLabel = initCp.detectDeviceLabel();
122
122
  } catch (_) {}
@@ -163,4 +163,4 @@ async function getCurrentSubscription() {
163
163
 
164
164
  //#endregion
165
165
  export { syncExistingPushSubscription as a, subscribeToPush as i, getPushFetchOptions as n, unsubscribeFromPush as o, getPushUrl as r, getOrCreateSubscriberId as s, getCurrentSubscription as t };
166
- //# sourceMappingURL=push-client-DKFUY_Ti.js.map
166
+ //# sourceMappingURL=push-client-BOHgqHbk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"push-client-DKFUY_Ti.js","names":[],"sources":["../../src/db/getOrCreateSubscriberId.ts","../../src/subsystems/notifications/push-client.ts"],"sourcesContent":["import { CONFIG_KEYS } from \"../config/config.js\";\nimport { getConfig } from \"./getConfig.js\";\nimport { setConfig } from \"./setConfig.js\";\n\nimport type { ShadowClawDatabase } from \"./types.js\";\n\nfunction createSubscriberId(): string {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n\n return `sub-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\n/**\n * Get the persisted per-browser subscriber ID, creating one on first use.\n */\nexport async function getOrCreateSubscriberId(\n db: ShadowClawDatabase,\n): Promise<string> {\n if (!db) {\n return createSubscriberId();\n }\n\n const existing = await getConfig(db, CONFIG_KEYS.SUBSCRIBER_ID);\n if (typeof existing === \"string\" && existing.trim().length > 0) {\n return existing;\n }\n\n const created = createSubscriberId();\n await setConfig(db, CONFIG_KEYS.SUBSCRIBER_ID, created);\n\n return created;\n}\n","/**\n * Client-side Web Push subscription management.\n * Runs in the browser — communicates with the server's push routes.\n */\n\nimport { CONFIG_KEYS } from \"../../config/config.js\";\nimport { getDb } from \"../../db/db.js\";\nimport { getConfig } from \"../../db/getConfig.js\";\nimport { getOrCreateSubscriberId } from \"../../db/getOrCreateSubscriberId.js\";\n\n/**\n * Resolve a push route URL, optionally using a configured proxy.\n */\nexport async function getPushUrl(path: string): Promise<string> {\n const db = await getDb();\n let proxyUrl = await getConfig(db, CONFIG_KEYS.PUSH_PROXY_URL);\n\n if (!proxyUrl && typeof localStorage !== \"undefined\") {\n try {\n proxyUrl = localStorage.getItem(CONFIG_KEYS.PUSH_PROXY_URL) || undefined;\n } catch (_) {}\n }\n\n if (!proxyUrl) {\n return path;\n }\n\n // Ensure path starts with /\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n // Ensure proxyUrl doesn't end with /\n const normalizedProxy = proxyUrl.endsWith(\"/\")\n ? proxyUrl.slice(0, -1)\n : proxyUrl;\n\n return `${normalizedProxy}${normalizedPath}`;\n}\n\nexport function getPushFetchOptions(\n url: string,\n baseOptions: RequestInit = {},\n): RequestInit {\n const opts: any = { ...baseOptions };\n try {\n const locOrigin =\n typeof location !== \"undefined\"\n ? location.origin\n : \"http://127.0.0.1:8888\";\n const u = new URL(url, locOrigin);\n const host = u.hostname.toLowerCase();\n if (\n host === \"localhost\" ||\n host === \"127.0.0.1\" ||\n host === \"::1\" ||\n host === \"[::1]\"\n ) {\n opts.targetAddressSpace = \"loopback\";\n } else if (\n /^(10\\.|172\\.(1[6-9]|2\\d|3[01])\\.|192\\.168\\.)/.test(host) ||\n !host.includes(\".\") ||\n host.endsWith(\".local\") ||\n host.endsWith(\".lan\") ||\n host.endsWith(\".home\") ||\n host.endsWith(\".internal\")\n ) {\n opts.targetAddressSpace = \"private\";\n }\n } catch (_) {}\n return opts;\n}\n\n/**\n * Convert a URL-safe base64 string to a Uint8Array.\n * Required for PushManager.subscribe() applicationServerKey.\n */\nexport function urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = \"=\".repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, \"+\").replace(/_/g, \"/\");\n const rawData = atob(base64);\n\n return Uint8Array.from([...rawData].map((c) => c.charCodeAt(0)));\n}\n\n/**\n * Fetch the VAPID public key from the server.\n */\nexport async function getVapidPublicKey(): Promise<string> {\n const url = await getPushUrl(\"/push/vapid-public-key\");\n const res = await fetch(url, getPushFetchOptions(url));\n const data = await res.json();\n\n return data.publicKey;\n}\n\n/**\n * Subscribe to push notifications.\n * Requests permission, creates a push subscription, and sends it to the server.\n */\nexport async function subscribeToPush(\n clientId?: string,\n deviceLabel?: string,\n subscriberId?: string,\n): Promise<PushSubscription> {\n const registration = await navigator.serviceWorker.ready;\n const publicKey = await getVapidPublicKey();\n\n const subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(publicKey) as any,\n });\n\n let resolvedClientId =\n clientId ||\n (typeof localStorage !== \"undefined\"\n ? localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_CLIENT_ID) || undefined\n : undefined);\n\n let resolvedDeviceLabel = deviceLabel;\n let resolvedSubscriberId = subscriberId;\n\n if (!resolvedClientId || !resolvedDeviceLabel) {\n try {\n const initCp = await import(\"../../core/utils/initControlPlane.js\");\n if (\n !resolvedClientId &&\n typeof initCp.getOrCreateControlPlaneClientId === \"function\"\n ) {\n resolvedClientId = initCp.getOrCreateControlPlaneClientId();\n }\n if (\n !resolvedDeviceLabel &&\n typeof initCp.detectDeviceLabel === \"function\"\n ) {\n resolvedDeviceLabel = initCp.detectDeviceLabel();\n }\n } catch (_) {}\n }\n\n if (!resolvedSubscriberId) {\n try {\n const db = await Promise.race([\n getDb(),\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 500)),\n ]);\n if (db) {\n resolvedSubscriberId = await getOrCreateSubscriberId(db);\n }\n } catch (_) {}\n }\n\n const subJson =\n typeof subscription.toJSON === \"function\"\n ? subscription.toJSON()\n : JSON.parse(JSON.stringify(subscription));\n\n const url = await getPushUrl(\"/push/subscribe\");\n await fetch(\n url,\n getPushFetchOptions(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n ...subJson,\n ...(resolvedClientId ? { clientId: resolvedClientId } : {}),\n ...(resolvedDeviceLabel ? { deviceLabel: resolvedDeviceLabel } : {}),\n ...(resolvedSubscriberId ? { subscriberId: resolvedSubscriberId } : {}),\n }),\n }),\n );\n\n return subscription;\n}\n\n/**\n * Re-register an existing push subscription with the server if one exists,\n * ensuring clientId, deviceLabel, and subscriberId are up-to-date.\n */\nexport async function syncExistingPushSubscription(\n subscriberId?: string,\n): Promise<void> {\n if (typeof navigator === \"undefined\" || !navigator.serviceWorker) {\n return;\n }\n try {\n const reg = await navigator.serviceWorker.ready;\n const sub = await reg.pushManager.getSubscription();\n if (!sub) {\n return;\n }\n\n let resolvedClientId: string | undefined;\n let resolvedDeviceLabel: string | undefined;\n let resolvedSubscriberId = subscriberId;\n\n if (typeof localStorage !== \"undefined\") {\n resolvedClientId =\n localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_CLIENT_ID) || undefined;\n }\n\n try {\n const initCp = await import(\"../../core/utils/initControlPlane.js\");\n if (\n !resolvedClientId &&\n typeof initCp.getOrCreateControlPlaneClientId === \"function\"\n ) {\n resolvedClientId = initCp.getOrCreateControlPlaneClientId();\n }\n if (typeof initCp.detectDeviceLabel === \"function\") {\n resolvedDeviceLabel = initCp.detectDeviceLabel();\n }\n } catch (_) {}\n\n if (!resolvedSubscriberId) {\n try {\n const db = await Promise.race([\n getDb(),\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 500)),\n ]);\n if (db) {\n resolvedSubscriberId = await getOrCreateSubscriberId(db);\n }\n } catch (_) {}\n }\n\n const subJson =\n typeof sub.toJSON === \"function\"\n ? sub.toJSON()\n : JSON.parse(JSON.stringify(sub));\n\n const url = await getPushUrl(\"/push/subscribe\");\n await fetch(\n url,\n getPushFetchOptions(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n ...subJson,\n ...(resolvedClientId ? { clientId: resolvedClientId } : {}),\n ...(resolvedDeviceLabel ? { deviceLabel: resolvedDeviceLabel } : {}),\n ...(resolvedSubscriberId\n ? { subscriberId: resolvedSubscriberId }\n : {}),\n }),\n }),\n );\n } catch (_) {\n // Non-fatal if server is unreachable\n }\n}\n\n/**\n * Unsubscribe from push notifications.\n * Removes the push subscription locally and notifies the server.\n */\nexport async function unsubscribeFromPush(): Promise<void> {\n const registration = await navigator.serviceWorker.ready;\n const subscription = await registration.pushManager.getSubscription();\n\n if (!subscription) {\n return;\n }\n\n const { endpoint } = subscription;\n await subscription.unsubscribe();\n\n const url = await getPushUrl(\"/push/subscribe\");\n await fetch(\n url,\n getPushFetchOptions(url, {\n method: \"DELETE\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ endpoint }),\n }),\n );\n}\n\n/**\n * Get the current push subscription (or null if not subscribed).\n */\nexport async function getCurrentSubscription(): Promise<PushSubscription | null> {\n const registration = await navigator.serviceWorker.ready;\n\n return registration.pushManager.getSubscription();\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"push-client-BOHgqHbk.js","names":[],"sources":["../../src/db/getOrCreateSubscriberId.ts","../../src/subsystems/notifications/push-client.ts"],"sourcesContent":["import { CONFIG_KEYS } from \"../config/config.js\";\nimport { getConfig } from \"./getConfig.js\";\nimport { setConfig } from \"./setConfig.js\";\n\nimport type { ShadowClawDatabase } from \"./types.js\";\n\nfunction createSubscriberId(): string {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n\n return `sub-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\n/**\n * Get the persisted per-browser subscriber ID, creating one on first use.\n */\nexport async function getOrCreateSubscriberId(\n db: ShadowClawDatabase,\n): Promise<string> {\n if (!db) {\n return createSubscriberId();\n }\n\n const existing = await getConfig(db, CONFIG_KEYS.SUBSCRIBER_ID);\n if (typeof existing === \"string\" && existing.trim().length > 0) {\n return existing;\n }\n\n const created = createSubscriberId();\n await setConfig(db, CONFIG_KEYS.SUBSCRIBER_ID, created);\n\n return created;\n}\n","/**\n * Client-side Web Push subscription management.\n * Runs in the browser — communicates with the server's push routes.\n */\n\nimport { CONFIG_KEYS } from \"../../config/config.js\";\nimport { getDb } from \"../../db/db.js\";\nimport { getConfig } from \"../../db/getConfig.js\";\nimport { getOrCreateSubscriberId } from \"../../db/getOrCreateSubscriberId.js\";\n\n/**\n * Resolve a push route URL, optionally using a configured proxy.\n */\nexport async function getPushUrl(path: string): Promise<string> {\n const db = await getDb();\n let proxyUrl = await getConfig(db, CONFIG_KEYS.PUSH_PROXY_URL);\n\n if (!proxyUrl && typeof localStorage !== \"undefined\") {\n try {\n proxyUrl = localStorage.getItem(CONFIG_KEYS.PUSH_PROXY_URL) || undefined;\n } catch (_) {}\n }\n\n if (!proxyUrl) {\n return path;\n }\n\n // Ensure path starts with /\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n // Ensure proxyUrl doesn't end with /\n const normalizedProxy = proxyUrl.endsWith(\"/\")\n ? proxyUrl.slice(0, -1)\n : proxyUrl;\n\n return `${normalizedProxy}${normalizedPath}`;\n}\n\nexport function getPushFetchOptions(\n url: string,\n baseOptions: RequestInit = {},\n): RequestInit {\n const opts: any = { ...baseOptions };\n try {\n const locOrigin =\n typeof location !== \"undefined\"\n ? location.origin\n : \"http://127.0.0.1:8888\";\n const u = new URL(url, locOrigin);\n const host = u.hostname.toLowerCase();\n if (\n host === \"localhost\" ||\n host === \"127.0.0.1\" ||\n host === \"::1\" ||\n host === \"[::1]\"\n ) {\n opts.targetAddressSpace = \"loopback\";\n } else if (\n /^(10\\.|172\\.(1[6-9]|2\\d|3[01])\\.|192\\.168\\.)/.test(host) ||\n !host.includes(\".\") ||\n host.endsWith(\".local\") ||\n host.endsWith(\".lan\") ||\n host.endsWith(\".home\") ||\n host.endsWith(\".internal\")\n ) {\n opts.targetAddressSpace = \"private\";\n }\n } catch (_) {}\n return opts;\n}\n\n/**\n * Convert a URL-safe base64 string to a Uint8Array.\n * Required for PushManager.subscribe() applicationServerKey.\n */\nexport function urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = \"=\".repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, \"+\").replace(/_/g, \"/\");\n const rawData = atob(base64);\n\n return Uint8Array.from([...rawData].map((c) => c.charCodeAt(0)));\n}\n\n/**\n * Fetch the VAPID public key from the server.\n */\nexport async function getVapidPublicKey(): Promise<string> {\n const url = await getPushUrl(\"/push/vapid-public-key\");\n const res = await fetch(url, getPushFetchOptions(url));\n const data = await res.json();\n\n return data.publicKey;\n}\n\n/**\n * Subscribe to push notifications.\n * Requests permission, creates a push subscription, and sends it to the server.\n */\nexport async function subscribeToPush(\n clientId?: string,\n deviceLabel?: string,\n subscriberId?: string,\n): Promise<PushSubscription> {\n const registration = await navigator.serviceWorker.ready;\n const publicKey = await getVapidPublicKey();\n\n const subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(publicKey) as any,\n });\n\n let resolvedClientId =\n clientId ||\n (typeof localStorage !== \"undefined\"\n ? localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_CLIENT_ID) || undefined\n : undefined);\n\n let resolvedDeviceLabel = deviceLabel;\n let resolvedSubscriberId = subscriberId;\n\n if (!resolvedClientId || !resolvedDeviceLabel) {\n try {\n const initCp = await import(\"../../core/utils/initControlPlane.js\");\n if (\n !resolvedClientId &&\n typeof initCp.getOrCreateControlPlaneClientId === \"function\"\n ) {\n resolvedClientId = initCp.getOrCreateControlPlaneClientId();\n }\n if (\n !resolvedDeviceLabel &&\n typeof initCp.detectDeviceLabel === \"function\"\n ) {\n resolvedDeviceLabel = initCp.detectDeviceLabel();\n }\n } catch (_) {}\n }\n\n if (!resolvedSubscriberId) {\n try {\n const db = await Promise.race([\n getDb(),\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 500)),\n ]);\n if (db) {\n resolvedSubscriberId = await getOrCreateSubscriberId(db);\n }\n } catch (_) {}\n }\n\n const subJson =\n typeof subscription.toJSON === \"function\"\n ? subscription.toJSON()\n : JSON.parse(JSON.stringify(subscription));\n\n const url = await getPushUrl(\"/push/subscribe\");\n await fetch(\n url,\n getPushFetchOptions(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n ...subJson,\n ...(resolvedClientId ? { clientId: resolvedClientId } : {}),\n ...(resolvedDeviceLabel ? { deviceLabel: resolvedDeviceLabel } : {}),\n ...(resolvedSubscriberId ? { subscriberId: resolvedSubscriberId } : {}),\n }),\n }),\n );\n\n return subscription;\n}\n\n/**\n * Re-register an existing push subscription with the server if one exists,\n * ensuring clientId, deviceLabel, and subscriberId are up-to-date.\n */\nexport async function syncExistingPushSubscription(\n subscriberId?: string,\n): Promise<void> {\n if (typeof navigator === \"undefined\" || !navigator.serviceWorker) {\n return;\n }\n try {\n const reg = await navigator.serviceWorker.ready;\n const sub = await reg.pushManager.getSubscription();\n if (!sub) {\n return;\n }\n\n let resolvedClientId: string | undefined;\n let resolvedDeviceLabel: string | undefined;\n let resolvedSubscriberId = subscriberId;\n\n if (typeof localStorage !== \"undefined\") {\n resolvedClientId =\n localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_CLIENT_ID) || undefined;\n }\n\n try {\n const initCp = await import(\"../../core/utils/initControlPlane.js\");\n if (\n !resolvedClientId &&\n typeof initCp.getOrCreateControlPlaneClientId === \"function\"\n ) {\n resolvedClientId = initCp.getOrCreateControlPlaneClientId();\n }\n if (typeof initCp.detectDeviceLabel === \"function\") {\n resolvedDeviceLabel = initCp.detectDeviceLabel();\n }\n } catch (_) {}\n\n if (!resolvedSubscriberId) {\n try {\n const db = await Promise.race([\n getDb(),\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 500)),\n ]);\n if (db) {\n resolvedSubscriberId = await getOrCreateSubscriberId(db);\n }\n } catch (_) {}\n }\n\n const subJson =\n typeof sub.toJSON === \"function\"\n ? sub.toJSON()\n : JSON.parse(JSON.stringify(sub));\n\n const url = await getPushUrl(\"/push/subscribe\");\n await fetch(\n url,\n getPushFetchOptions(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n ...subJson,\n ...(resolvedClientId ? { clientId: resolvedClientId } : {}),\n ...(resolvedDeviceLabel ? { deviceLabel: resolvedDeviceLabel } : {}),\n ...(resolvedSubscriberId\n ? { subscriberId: resolvedSubscriberId }\n : {}),\n }),\n }),\n );\n } catch (_) {\n // Non-fatal if server is unreachable\n }\n}\n\n/**\n * Unsubscribe from push notifications.\n * Removes the push subscription locally and notifies the server.\n */\nexport async function unsubscribeFromPush(): Promise<void> {\n const registration = await navigator.serviceWorker.ready;\n const subscription = await registration.pushManager.getSubscription();\n\n if (!subscription) {\n return;\n }\n\n const { endpoint } = subscription;\n await subscription.unsubscribe();\n\n const url = await getPushUrl(\"/push/subscribe\");\n await fetch(\n url,\n getPushFetchOptions(url, {\n method: \"DELETE\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ endpoint }),\n }),\n );\n}\n\n/**\n * Get the current push subscription (or null if not subscribed).\n */\nexport async function getCurrentSubscription(): Promise<PushSubscription | null> {\n const registration = await navigator.serviceWorker.ready;\n\n return registration.pushManager.getSubscription();\n}\n"],"mappings":";;;;;;AAMA,SAAS,qBAA6B;CACpC,IACE,OAAO,WAAW,eAClB,OAAO,OAAO,eAAe,YAE7B,OAAO,OAAO,WAAW;CAG3B,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;AAC7E;;;;AAKA,eAAsB,wBACpB,IACiB;CACjB,IAAI,CAAC,IACH,OAAO,mBAAmB;CAG5B,MAAM,WAAW,MAAM,UAAU,IAAI,YAAY,aAAa;CAC9D,IAAI,OAAO,aAAa,YAAY,SAAS,KAAK,CAAC,CAAC,SAAS,GAC3D,OAAO;CAGT,MAAM,UAAU,mBAAmB;CACnC,MAAM,UAAU,IAAI,YAAY,eAAe,OAAO;CAEtD,OAAO;AACT;;;;;;;;;;;ACvBA,eAAsB,WAAW,MAA+B;CAC9D,MAAM,KAAK,MAAM,MAAM;CACvB,IAAI,WAAW,MAAM,UAAU,IAAI,YAAY,cAAc;CAE7D,IAAI,CAAC,YAAY,OAAO,iBAAiB,aACvC,IAAI;EACF,WAAW,aAAa,QAAQ,YAAY,cAAc,KAAK;CACjE,SAAS,GAAG,CAAC;CAGf,IAAI,CAAC,UACH,OAAO;CAIT,MAAM,iBAAiB,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI;CAMzD,OAAO,GAJiB,SAAS,SAAS,GAAG,IACzC,SAAS,MAAM,GAAG,EAAE,IACpB,WAEwB;AAC9B;AAEA,SAAgB,oBACd,KACA,cAA2B,CAAC,GACf;CACb,MAAM,OAAY,EAAE,GAAG,YAAY;CACnC,IAAI;EACF,MAAM,YACJ,OAAO,aAAa,cAChB,SAAS,SACT;EAEN,MAAM,OAAO,IADC,IAAI,KAAK,SACV,CAAC,CAAC,SAAS,YAAY;EACpC,IACE,SAAS,eACT,SAAS,eACT,SAAS,SACT,SAAS,SAET,KAAK,qBAAqB;OACrB,IACL,+CAA+C,KAAK,IAAI,KACxD,CAAC,KAAK,SAAS,GAAG,KAClB,KAAK,SAAS,QAAQ,KACtB,KAAK,SAAS,MAAM,KACpB,KAAK,SAAS,OAAO,KACrB,KAAK,SAAS,WAAW,GAEzB,KAAK,qBAAqB;CAE9B,SAAS,GAAG,CAAC;CACb,OAAO;AACT;;;;;AAMA,SAAgB,sBAAsB,cAAkC;CAEtE,MAAM,UAAU,eADA,IAAI,QAAQ,IAAK,aAAa,SAAS,KAAM,CACxB,EAAC,CAAE,QAAQ,MAAM,GAAG,CAAC,CAAC,QAAQ,MAAM,GAAG;CAC5E,MAAM,UAAU,KAAK,MAAM;CAE3B,OAAO,WAAW,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,KAAK,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;AACjE;;;;AAKA,eAAsB,oBAAqC;CACzD,MAAM,MAAM,MAAM,WAAW,wBAAwB;CAIrD,QAAO,OAFY,MADD,MAAM,KAAK,oBAAoB,GAAG,CAAC,EAC/B,CAAC,KAAK,EAEjB,CAAC;AACd;;;;;AAMA,eAAsB,gBACpB,UACA,aACA,cAC2B;CAC3B,MAAM,eAAe,MAAM,UAAU,cAAc;CACnD,MAAM,YAAY,MAAM,kBAAkB;CAE1C,MAAM,eAAe,MAAM,aAAa,YAAY,UAAU;EAC5D,iBAAiB;EACjB,sBAAsB,sBAAsB,SAAS;CACvD,CAAC;CAED,IAAI,mBACF,aACC,OAAO,iBAAiB,cACrB,aAAa,QAAQ,YAAY,uBAAuB,KAAK,SAC7D;CAEN,IAAI,sBAAsB;CAC1B,IAAI,uBAAuB;CAE3B,IAAI,CAAC,oBAAoB,CAAC,qBACxB,IAAI;EACF,MAAM,SAAS,MAAM,OAAO;EAC5B,IACE,CAAC,oBACD,OAAO,OAAO,oCAAoC,YAElD,mBAAmB,OAAO,gCAAgC;EAE5D,IACE,CAAC,uBACD,OAAO,OAAO,sBAAsB,YAEpC,sBAAsB,OAAO,kBAAkB;CAEnD,SAAS,GAAG,CAAC;CAGf,IAAI,CAAC,sBACH,IAAI;EACF,MAAM,KAAK,MAAM,QAAQ,KAAK,CAC5B,MAAM,GACN,IAAI,SAAe,YAAY,iBAAiB,QAAQ,IAAI,GAAG,GAAG,CAAC,CACrE,CAAC;EACD,IAAI,IACF,uBAAuB,MAAM,wBAAwB,EAAE;CAE3D,SAAS,GAAG,CAAC;CAGf,MAAM,UACJ,OAAO,aAAa,WAAW,aAC3B,aAAa,OAAO,IACpB,KAAK,MAAM,KAAK,UAAU,YAAY,CAAC;CAE7C,MAAM,MAAM,MAAM,WAAW,iBAAiB;CAC9C,MAAM,MACJ,KACA,oBAAoB,KAAK;EACvB,QAAQ;EACR,SAAS,EAAE,gBAAgB,mBAAmB;EAC9C,MAAM,KAAK,UAAU;GACnB,GAAG;GACH,GAAI,mBAAmB,EAAE,UAAU,iBAAiB,IAAI,CAAC;GACzD,GAAI,sBAAsB,EAAE,aAAa,oBAAoB,IAAI,CAAC;GAClE,GAAI,uBAAuB,EAAE,cAAc,qBAAqB,IAAI,CAAC;EACvE,CAAC;CACH,CAAC,CACH;CAEA,OAAO;AACT;;;;;AAMA,eAAsB,6BACpB,cACe;CACf,IAAI,OAAO,cAAc,eAAe,CAAC,UAAU,eACjD;CAEF,IAAI;EAEF,MAAM,MAAM,OAAM,MADA,UAAU,cAAc,MACrB,CAAC,YAAY,gBAAgB;EAClD,IAAI,CAAC,KACH;EAGF,IAAI;EACJ,IAAI;EACJ,IAAI,uBAAuB;EAE3B,IAAI,OAAO,iBAAiB,aAC1B,mBACE,aAAa,QAAQ,YAAY,uBAAuB,KAAK;EAGjE,IAAI;GACF,MAAM,SAAS,MAAM,OAAO;GAC5B,IACE,CAAC,oBACD,OAAO,OAAO,oCAAoC,YAElD,mBAAmB,OAAO,gCAAgC;GAE5D,IAAI,OAAO,OAAO,sBAAsB,YACtC,sBAAsB,OAAO,kBAAkB;EAEnD,SAAS,GAAG,CAAC;EAEb,IAAI,CAAC,sBACH,IAAI;GACF,MAAM,KAAK,MAAM,QAAQ,KAAK,CAC5B,MAAM,GACN,IAAI,SAAe,YAAY,iBAAiB,QAAQ,IAAI,GAAG,GAAG,CAAC,CACrE,CAAC;GACD,IAAI,IACF,uBAAuB,MAAM,wBAAwB,EAAE;EAE3D,SAAS,GAAG,CAAC;EAGf,MAAM,UACJ,OAAO,IAAI,WAAW,aAClB,IAAI,OAAO,IACX,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;EAEpC,MAAM,MAAM,MAAM,WAAW,iBAAiB;EAC9C,MAAM,MACJ,KACA,oBAAoB,KAAK;GACvB,QAAQ;GACR,SAAS,EAAE,gBAAgB,mBAAmB;GAC9C,MAAM,KAAK,UAAU;IACnB,GAAG;IACH,GAAI,mBAAmB,EAAE,UAAU,iBAAiB,IAAI,CAAC;IACzD,GAAI,sBAAsB,EAAE,aAAa,oBAAoB,IAAI,CAAC;IAClE,GAAI,uBACA,EAAE,cAAc,qBAAqB,IACrC,CAAC;GACP,CAAC;EACH,CAAC,CACH;CACF,SAAS,GAAG,CAEZ;AACF;;;;;AAMA,eAAsB,sBAAqC;CAEzD,MAAM,eAAe,OAAM,MADA,UAAU,cAAc,MACZ,CAAC,YAAY,gBAAgB;CAEpE,IAAI,CAAC,cACH;CAGF,MAAM,EAAE,aAAa;CACrB,MAAM,aAAa,YAAY;CAE/B,MAAM,MAAM,MAAM,WAAW,iBAAiB;CAC9C,MAAM,MACJ,KACA,oBAAoB,KAAK;EACvB,QAAQ;EACR,SAAS,EAAE,gBAAgB,mBAAmB;EAC9C,MAAM,KAAK,UAAU,EAAE,SAAS,CAAC;CACnC,CAAC,CACH;AACF;;;;AAKA,eAAsB,yBAA2D;CAG/E,QAAO,MAFoB,UAAU,cAAc,MAEhC,CAAC,YAAY,gBAAgB;AAClD"}
@@ -1,4 +1,4 @@
1
- import { t as getGroupDir } from "./getGroupDir-BidwYPfP.js";
1
+ import { t as getGroupDir } from "./getGroupDir-mTV2Iz2b.js";
2
2
  import { t as parsePath } from "./parsePath-rArsS7VY.js";
3
3
 
4
4
  //#region src/storage/readGroupFileBytes.ts
@@ -26,4 +26,4 @@ async function readGroupFileBytes(db, groupId, filePath) {
26
26
 
27
27
  //#endregion
28
28
  export { readGroupFileBytes as t };
29
- //# sourceMappingURL=readGroupFileBytes-C8Xqlb8l.js.map
29
+ //# sourceMappingURL=readGroupFileBytes-CRA6dmgT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"readGroupFileBytes-C8Xqlb8l.js","names":[],"sources":["../../src/storage/readGroupFileBytes.ts"],"sourcesContent":["import { getGroupDir } from \"./getGroupDir.js\";\nimport { parsePath } from \"./parsePath.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Read raw bytes from a file in a group's workspace.\n */\nexport async function readGroupFileBytes(\n db: ShadowClawDatabase,\n groupId: string,\n filePath: string,\n): Promise<Uint8Array> {\n const groupDir = await getGroupDir(db, groupId);\n const { dirs, filename } = parsePath(filePath);\n\n let dir = groupDir;\n for (const seg of dirs) {\n dir = await dir.getDirectoryHandle(seg);\n }\n\n const fileHandle = await dir.getFileHandle(filename);\n\n try {\n const syncHandle = await (fileHandle as any).createSyncAccessHandle();\n const size = syncHandle.getSize();\n const buf = new Uint8Array(size);\n\n syncHandle.read(buf, { at: 0 });\n syncHandle.close();\n\n return buf;\n } catch {\n const file = await fileHandle.getFile();\n const arrayBuffer = await file.arrayBuffer();\n\n return new Uint8Array(arrayBuffer);\n }\n}\n"],"mappings":";;;;;;;AAOA,eAAsB,mBACpB,IACA,SACA,UACqB;CACrB,MAAM,WAAW,MAAM,YAAY,IAAI,OAAO;CAC9C,MAAM,EAAE,MAAM,aAAa,UAAU,QAAQ;CAE7C,IAAI,MAAM;CACV,KAAK,MAAM,OAAO,MAChB,MAAM,MAAM,IAAI,mBAAmB,GAAG;CAGxC,MAAM,aAAa,MAAM,IAAI,cAAc,QAAQ;CAEnD,IAAI;EACF,MAAM,aAAa,MAAO,WAAmB,uBAAuB;EACpE,MAAM,OAAO,WAAW,QAAQ;EAChC,MAAM,MAAM,IAAI,WAAW,IAAI;EAE/B,WAAW,KAAK,KAAK,EAAE,IAAI,EAAE,CAAC;EAC9B,WAAW,MAAM;EAEjB,OAAO;CACT,QAAQ;EAEN,MAAM,cAAc,OAAM,MADP,WAAW,QAAQ,EACR,CAAC,YAAY;EAE3C,OAAO,IAAI,WAAW,WAAW;CACnC;AACF"}
1
+ {"version":3,"file":"readGroupFileBytes-CRA6dmgT.js","names":[],"sources":["../../src/storage/readGroupFileBytes.ts"],"sourcesContent":["import { getGroupDir } from \"./getGroupDir.js\";\nimport { parsePath } from \"./parsePath.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Read raw bytes from a file in a group's workspace.\n */\nexport async function readGroupFileBytes(\n db: ShadowClawDatabase,\n groupId: string,\n filePath: string,\n): Promise<Uint8Array> {\n const groupDir = await getGroupDir(db, groupId);\n const { dirs, filename } = parsePath(filePath);\n\n let dir = groupDir;\n for (const seg of dirs) {\n dir = await dir.getDirectoryHandle(seg);\n }\n\n const fileHandle = await dir.getFileHandle(filename);\n\n try {\n const syncHandle = await (fileHandle as any).createSyncAccessHandle();\n const size = syncHandle.getSize();\n const buf = new Uint8Array(size);\n\n syncHandle.read(buf, { at: 0 });\n syncHandle.close();\n\n return buf;\n } catch {\n const file = await fileHandle.getFile();\n const arrayBuffer = await file.arrayBuffer();\n\n return new Uint8Array(arrayBuffer);\n }\n}\n"],"mappings":";;;;;;;AAOA,eAAsB,mBACpB,IACA,SACA,UACqB;CACrB,MAAM,WAAW,MAAM,YAAY,IAAI,OAAO;CAC9C,MAAM,EAAE,MAAM,aAAa,UAAU,QAAQ;CAE7C,IAAI,MAAM;CACV,KAAK,MAAM,OAAO,MAChB,MAAM,MAAM,IAAI,mBAAmB,GAAG;CAGxC,MAAM,aAAa,MAAM,IAAI,cAAc,QAAQ;CAEnD,IAAI;EACF,MAAM,aAAa,MAAO,WAAmB,uBAAuB;EACpE,MAAM,OAAO,WAAW,QAAQ;EAChC,MAAM,MAAM,IAAI,WAAW,IAAI;EAE/B,WAAW,KAAK,KAAK,EAAE,IAAI,EAAE,CAAC;EAC9B,WAAW,MAAM;EAEjB,OAAO;CACT,QAAQ;EAEN,MAAM,cAAc,OAAM,MADP,WAAW,QAAQ,EACR,CAAC,YAAY;EAE3C,OAAO,IAAI,WAAW,WAAW;CACnC;AACF"}
@@ -1,7 +1,7 @@
1
1
  import ShadowClawElement from "./components/shadow-claw-element.js";
2
2
  import { r as getDb } from "./txPromise-DdeRXi7G.js";
3
3
  import { t as Signal } from "./dist-Bxg3C_zy.js";
4
- import { t as readGroupFileBytes } from "./readGroupFileBytes-C8Xqlb8l.js";
4
+ import { t as readGroupFileBytes } from "./readGroupFileBytes-CRA6dmgT.js";
5
5
 
6
6
  //#region src/stores/chat-ui.ts
7
7
  /**
@@ -1828,4 +1828,4 @@ registerBasicFunctions();
1828
1828
 
1829
1829
  //#endregion
1830
1830
  export { chatUiStore as n, ShadowClawA2UI as t };
1831
- //# sourceMappingURL=shadow-claw-a2ui-CPydWVdW.js.map
1831
+ //# sourceMappingURL=shadow-claw-a2ui-DbZa4Gxp.js.map