shadow-claw 1.29.0 → 1.30.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 (277) hide show
  1. package/.agents/skills/main/skill-creator/SKILL.md +3 -2
  2. package/.agents/skills/main/skill-creator/references/frontmatter-spec.md +5 -3
  3. package/.well-known/agent-skills/index.json +1 -1
  4. package/.well-known/mcp/server-card.json +1 -1
  5. package/.well-known/mcp.json +1 -1
  6. package/dist/lib/{app-routes-CqBOeA5q.js → app-routes-BAEMLu9g.js} +3 -2
  7. package/dist/lib/app-routes-BAEMLu9g.js.map +1 -0
  8. package/dist/lib/{bundler-8JNIKwOs.js → bundler-CsL7hHMq.js} +4 -9
  9. package/dist/lib/{bundler-8JNIKwOs.js.map → bundler-CsL7hHMq.js.map} +1 -1
  10. package/dist/lib/components/index.js +26 -26
  11. package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
  12. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  13. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  14. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  15. package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
  16. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  17. package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
  18. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  19. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  20. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  21. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  22. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  23. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  24. package/dist/lib/components/shadow-claw-a2ui.js +1 -1
  25. package/dist/lib/components/shadow-claw-accounts.js +1 -1
  26. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  27. package/dist/lib/components/shadow-claw-channels.js +1 -1
  28. package/dist/lib/components/shadow-claw-chat.js +1 -1
  29. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  30. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  31. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  32. package/dist/lib/components/shadow-claw-files.js +1 -1
  33. package/dist/lib/components/shadow-claw-git.js +1 -1
  34. package/dist/lib/components/shadow-claw-integrations.js +1 -1
  35. package/dist/lib/components/shadow-claw-llm.js +1 -1
  36. package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
  37. package/dist/lib/components/shadow-claw-networking.js +1 -1
  38. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  39. package/dist/lib/components/shadow-claw-page-header.js +1 -1
  40. package/dist/lib/components/shadow-claw-pages.js +1 -1
  41. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  42. package/dist/lib/components/shadow-claw-settings.js +1 -1
  43. package/dist/lib/components/shadow-claw-storage.js +1 -1
  44. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  45. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  46. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  47. package/dist/lib/components/shadow-claw-tools.js +1 -1
  48. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  49. package/dist/lib/components/shadow-claw.js +1 -1
  50. package/dist/lib/{config--CFrw3J3.js → config-DjZ9QWc4.js} +2 -2
  51. package/dist/lib/{config--CFrw3J3.js.map → config-DjZ9QWc4.js.map} +1 -1
  52. package/dist/lib/{configurePeerJs-DG4hliKp.js → configurePeerJs-H0WaoT0w.js} +3 -3
  53. package/dist/lib/{configurePeerJs-DG4hliKp.js.map → configurePeerJs-H0WaoT0w.js.map} +1 -1
  54. package/dist/lib/{connections-DwjzwVz0.js → connections-BURqMIUv.js} +2 -2
  55. package/dist/lib/{connections-DwjzwVz0.js.map → connections-BURqMIUv.js.map} +1 -1
  56. package/dist/lib/content/markdown-links.d.ts +19 -0
  57. package/dist/lib/core/app-routes.d.ts +1 -0
  58. package/dist/lib/{downloadGroupFile-DmcBQU1n.js → downloadGroupFile-B8J4up2a.js} +2 -2
  59. package/dist/lib/{downloadGroupFile-DmcBQU1n.js.map → downloadGroupFile-B8J4up2a.js.map} +1 -1
  60. package/dist/lib/{file-viewer-C3YKnq_-.js → file-viewer-CwvhxAAG.js} +5 -5
  61. package/dist/lib/{file-viewer-C3YKnq_-.js.map → file-viewer-CwvhxAAG.js.map} +1 -1
  62. package/dist/lib/{getGroupDir-m0f-ekgX.js → getGroupDir-QrN2aTo8.js} +4 -4
  63. package/dist/lib/{getGroupDir-m0f-ekgX.js.map → getGroupDir-QrN2aTo8.js.map} +1 -1
  64. package/dist/lib/{git-C-Q6-IVe.js → git-DhZoe1SE.js} +3 -3
  65. package/dist/lib/{git-C-Q6-IVe.js.map → git-DhZoe1SE.js.map} +1 -1
  66. package/dist/lib/{iframe-sanitizer-CUqHuWQ-.js → iframe-sanitizer-Bujgq14T.js} +2 -2
  67. package/dist/lib/{iframe-sanitizer-CUqHuWQ-.js.map → iframe-sanitizer-Bujgq14T.js.map} +1 -1
  68. package/dist/lib/index.js +27 -27
  69. package/dist/lib/{initChatSplitResize-yyBTU6h9.js → initChatSplitResize-BjiWoqC_.js} +2 -2
  70. package/dist/lib/{initChatSplitResize-yyBTU6h9.js.map → initChatSplitResize-BjiWoqC_.js.map} +1 -1
  71. package/dist/lib/{initControlPlane-DnpAzphg.js → initControlPlane-C9JxQCDh.js} +16 -16
  72. package/dist/lib/{initControlPlane-DnpAzphg.js.map → initControlPlane-C9JxQCDh.js.map} +1 -1
  73. package/dist/lib/{markdown-DgdSt2GD.js → markdown-DYHmNjC4.js} +126 -5
  74. package/dist/lib/markdown-DYHmNjC4.js.map +1 -0
  75. package/dist/lib/{mcp-reconnect-C86MR3z8.js → mcp-reconnect-BxJ77WSb.js} +2 -2
  76. package/dist/lib/{mcp-reconnect-C86MR3z8.js.map → mcp-reconnect-BxJ77WSb.js.map} +1 -1
  77. package/dist/lib/{memoryStorage-UR8E8K-H.js → memoryStorage-D3FBwO9T.js} +2 -2
  78. package/dist/lib/{memoryStorage-UR8E8K-H.js.map → memoryStorage-D3FBwO9T.js.map} +1 -1
  79. package/dist/lib/{orchestrator-ClXbJ4Mb.js → orchestrator-C6dc-2OQ.js} +130 -27
  80. package/dist/lib/{orchestrator-ClXbJ4Mb.js.map → orchestrator-C6dc-2OQ.js.map} +1 -1
  81. package/dist/lib/{orchestrator-CjEau_RG.js → orchestrator-DVkyd8K9.js} +27 -17
  82. package/dist/lib/orchestrator-DVkyd8K9.js.map +1 -0
  83. package/dist/lib/{peerjs-BdfpltIe.js → peerjs-BUS9O04I.js} +274 -60
  84. package/dist/lib/peerjs-BUS9O04I.js.map +1 -0
  85. package/dist/lib/{push-client-DjwKknNg.js → push-client-4JsQGmQa.js} +3 -3
  86. package/dist/lib/{push-client-DjwKknNg.js.map → push-client-4JsQGmQa.js.map} +1 -1
  87. package/dist/lib/{readGroupFileBytes-C8oOe8Iu.js → readGroupFileBytes-CSA7u-nJ.js} +2 -2
  88. package/dist/lib/{readGroupFileBytes-C8oOe8Iu.js.map → readGroupFileBytes-CSA7u-nJ.js.map} +1 -1
  89. package/dist/lib/{shadow-claw-DcPGKenn.js → shadow-claw-BMoF8Auf.js} +11 -11
  90. package/dist/lib/{shadow-claw-DcPGKenn.js.map → shadow-claw-BMoF8Auf.js.map} +1 -1
  91. package/dist/lib/{shadow-claw-a2ui-CpZUTzlh.js → shadow-claw-a2ui-2I5nffIn.js} +2 -2
  92. package/dist/lib/{shadow-claw-a2ui-CpZUTzlh.js.map → shadow-claw-a2ui-2I5nffIn.js.map} +1 -1
  93. package/dist/lib/{shadow-claw-accounts-03oJ__XC.js → shadow-claw-accounts-BCjlgvzy.js} +3 -3
  94. package/dist/lib/{shadow-claw-accounts-03oJ__XC.js.map → shadow-claw-accounts-BCjlgvzy.js.map} +1 -1
  95. package/dist/lib/{shadow-claw-channel-config-DEL-aZ7N.js → shadow-claw-channel-config-CxQAmlDE.js} +3 -3
  96. package/dist/lib/{shadow-claw-channel-config-DEL-aZ7N.js.map → shadow-claw-channel-config-CxQAmlDE.js.map} +1 -1
  97. package/dist/lib/{shadow-claw-channels-BgaJiPdE.js → shadow-claw-channels-CuYMUVAG.js} +3 -3
  98. package/dist/lib/{shadow-claw-channels-BgaJiPdE.js.map → shadow-claw-channels-CuYMUVAG.js.map} +1 -1
  99. package/dist/lib/{shadow-claw-chat-mXPQZbwT.js → shadow-claw-chat-RFtPmmyl.js} +13 -12
  100. package/dist/lib/shadow-claw-chat-RFtPmmyl.js.map +1 -0
  101. package/dist/lib/{shadow-claw-control-plane-DO6foOLV.js → shadow-claw-control-plane-siqmRzR1.js} +7 -7
  102. package/dist/lib/{shadow-claw-control-plane-DO6foOLV.js.map → shadow-claw-control-plane-siqmRzR1.js.map} +1 -1
  103. package/dist/lib/{shadow-claw-conversations-BLwHTwdW.js → shadow-claw-conversations-DygK5y1e.js} +7 -7
  104. package/dist/lib/{shadow-claw-conversations-BLwHTwdW.js.map → shadow-claw-conversations-DygK5y1e.js.map} +1 -1
  105. package/dist/lib/{shadow-claw-file-viewer-BSbZvSl-.js → shadow-claw-file-viewer-DGMA7d7H.js} +11 -11
  106. package/dist/lib/shadow-claw-file-viewer-DGMA7d7H.js.map +1 -0
  107. package/dist/lib/{shadow-claw-files-BLVr9Pua.js → shadow-claw-files-CgD1B9J7.js} +8 -8
  108. package/dist/lib/{shadow-claw-files-BLVr9Pua.js.map → shadow-claw-files-CgD1B9J7.js.map} +1 -1
  109. package/dist/lib/{shadow-claw-git-CHC1H86J.js → shadow-claw-git-Bw1jGRrf.js} +6 -6
  110. package/dist/lib/{shadow-claw-git-CHC1H86J.js.map → shadow-claw-git-Bw1jGRrf.js.map} +1 -1
  111. package/dist/lib/{shadow-claw-integrations-Ds-CLPhj.js → shadow-claw-integrations-ChaXtvsg.js} +4 -4
  112. package/dist/lib/{shadow-claw-integrations-Ds-CLPhj.js.map → shadow-claw-integrations-ChaXtvsg.js.map} +1 -1
  113. package/dist/lib/{shadow-claw-llm-CKXfxd3D.js → shadow-claw-llm-CDM4Akjc.js} +6 -6
  114. package/dist/lib/{shadow-claw-llm-CKXfxd3D.js.map → shadow-claw-llm-CDM4Akjc.js.map} +1 -1
  115. package/dist/lib/{shadow-claw-mcp-remote-CT5Q-54E.js → shadow-claw-mcp-remote-BLxs_Z4I.js} +4 -4
  116. package/dist/lib/{shadow-claw-mcp-remote-CT5Q-54E.js.map → shadow-claw-mcp-remote-BLxs_Z4I.js.map} +1 -1
  117. package/dist/lib/{shadow-claw-networking-dpYvfchh.js → shadow-claw-networking-BYt-kMSI.js} +2 -2
  118. package/dist/lib/{shadow-claw-networking-dpYvfchh.js.map → shadow-claw-networking-BYt-kMSI.js.map} +1 -1
  119. package/dist/lib/{shadow-claw-notifications-_YeAVPga.js → shadow-claw-notifications-Dpe4EtZI.js} +3 -3
  120. package/dist/lib/{shadow-claw-notifications-_YeAVPga.js.map → shadow-claw-notifications-Dpe4EtZI.js.map} +1 -1
  121. package/dist/lib/{shadow-claw-page-header-Cti2fzf-.js → shadow-claw-page-header-P4EvWyUr.js} +2 -2
  122. package/dist/lib/{shadow-claw-page-header-Cti2fzf-.js.map → shadow-claw-page-header-P4EvWyUr.js.map} +1 -1
  123. package/dist/lib/{shadow-claw-pages-DVzZriZ7.js → shadow-claw-pages-DWd_c4d6.js} +10 -10
  124. package/dist/lib/{shadow-claw-pages-DVzZriZ7.js.map → shadow-claw-pages-DWd_c4d6.js.map} +1 -1
  125. package/dist/lib/{shadow-claw-peerjs-BvixjeBz.js → shadow-claw-peerjs-D928817m.js} +3 -3
  126. package/dist/lib/{shadow-claw-peerjs-BvixjeBz.js.map → shadow-claw-peerjs-D928817m.js.map} +1 -1
  127. package/dist/lib/{shadow-claw-settings-DV9-gD4Q.js → shadow-claw-settings-C8OPrSqs.js} +8 -8
  128. package/dist/lib/{shadow-claw-settings-DV9-gD4Q.js.map → shadow-claw-settings-C8OPrSqs.js.map} +1 -1
  129. package/dist/lib/{shadow-claw-storage-Bv__kXG6.js → shadow-claw-storage-CZ2uZJNw.js} +5 -5
  130. package/dist/lib/{shadow-claw-storage-Bv__kXG6.js.map → shadow-claw-storage-CZ2uZJNw.js.map} +1 -1
  131. package/dist/lib/{shadow-claw-task-server-DNOe8PWK.js → shadow-claw-task-server-CLT018BX.js} +2 -2
  132. package/dist/lib/{shadow-claw-task-server-DNOe8PWK.js.map → shadow-claw-task-server-CLT018BX.js.map} +1 -1
  133. package/dist/lib/{shadow-claw-tasks-qmcDT4PU.js → shadow-claw-tasks-D5h-lGmq.js} +9 -8
  134. package/dist/lib/shadow-claw-tasks-D5h-lGmq.js.map +1 -0
  135. package/dist/lib/{shadow-claw-terminal-0QUWP8of.js → shadow-claw-terminal-Cy1O6KVM.js} +2 -2
  136. package/dist/lib/{shadow-claw-terminal-0QUWP8of.js.map → shadow-claw-terminal-Cy1O6KVM.js.map} +1 -1
  137. package/dist/lib/{shadow-claw-tools-Bs_bmI6-.js → shadow-claw-tools-CVD06bCR.js} +9 -9
  138. package/dist/lib/{shadow-claw-tools-Bs_bmI6-.js.map → shadow-claw-tools-CVD06bCR.js.map} +1 -1
  139. package/dist/lib/{shadow-claw-webvm-DYaoL7QY.js → shadow-claw-webvm-DoGl5ZSJ.js} +3 -3
  140. package/dist/lib/{shadow-claw-webvm-DYaoL7QY.js.map → shadow-claw-webvm-DoGl5ZSJ.js.map} +1 -1
  141. package/dist/lib/subsystems/channels/peerjs.d.ts +37 -4
  142. package/dist/lib/subsystems/channels/room.d.ts +4 -0
  143. package/dist/lib/{syncWebMcpRegistration-BhbqI6R2.js → syncWebMcpRegistration-BeYkQEvj.js} +5 -5
  144. package/dist/lib/{syncWebMcpRegistration-BhbqI6R2.js.map → syncWebMcpRegistration-BeYkQEvj.js.map} +1 -1
  145. package/dist/lib/tools-C3Kft940.js +1 -0
  146. package/dist/lib/{tools-DBaMRiEu.js → tools-DKzPWc0q.js} +2 -2
  147. package/dist/lib/{tools-DBaMRiEu.js.map → tools-DKzPWc0q.js.map} +1 -1
  148. package/dist/lib/{tools-DwwB9RBa.js → tools-DqcJe8LS.js} +5 -5
  149. package/dist/lib/{tools-DwwB9RBa.js.map → tools-DqcJe8LS.js.map} +1 -1
  150. package/dist/lib/{trusted-types-Dx0RZlrd.js → trusted-types-Oz7xXJAY.js} +4 -4
  151. package/dist/lib/{trusted-types-Dx0RZlrd.js.map → trusted-types-Oz7xXJAY.js.map} +1 -1
  152. package/dist/lib/utils/index.js +1 -1
  153. package/dist/lib/utils/namespacedStorage.js +1 -1
  154. package/dist/lib/utils/utils.js +1 -1
  155. package/dist/lib/{webmcp-j_1_T3wf.js → webmcp-BC8_WafM.js} +4 -4
  156. package/dist/lib/{webmcp-j_1_T3wf.js.map → webmcp-BC8_WafM.js.map} +1 -1
  157. package/dist/lib/worker/utils/system-prompt.d.ts +4 -1
  158. package/dist/public/.agents/skills/main/skill-creator/SKILL.md +3 -2
  159. package/dist/public/.agents/skills/main/skill-creator/references/frontmatter-spec.md +5 -3
  160. package/dist/public/.well-known/agent-skills/index.json +1 -1
  161. package/dist/public/.well-known/mcp/server-card.json +1 -1
  162. package/dist/public/.well-known/mcp.json +1 -1
  163. package/dist/public/agent.worker.js +18 -17
  164. package/dist/public/app-routes-BMQ4HFaM.js +1 -0
  165. package/dist/public/{bundler-Ca-Xwln8.js → bundler-0if-QelV.js} +4 -4
  166. package/dist/public/{config-CrHchneq.js → config-Bnwx4EfS.js} +1 -1
  167. package/dist/public/{configurePeerJs-B470pdeU.js → configurePeerJs-DkyGvwk_.js} +1 -1
  168. package/dist/public/{connections-DvbgdkaB.js → connections-6575KDGE.js} +1 -1
  169. package/dist/public/{custom-element-security-FU04Cq05.js → custom-element-security-BQJQ_oKz.js} +1 -1
  170. package/dist/public/docs/example/article/index.html +2 -2
  171. package/dist/public/docs/publishing/index.html +2 -2
  172. package/dist/public/docs/skill-creator/index.html +2 -2
  173. package/dist/public/docs/subsystems/skills.md +3 -1
  174. package/dist/public/{downloadGroupFile-D8KRJGGL.js → downloadGroupFile-Wo1Sxdhr.js} +1 -1
  175. package/dist/public/{e2e-bridge-CSW0S5Yz.js → e2e-bridge-CvLCUU2O.js} +1 -1
  176. package/dist/public/{file-viewer-Cs-riNvy.js → file-viewer-CIjqAvNF.js} +1 -1
  177. package/dist/public/{getGroupDir-P1h9wl6S.js → getGroupDir-BwprrdrQ.js} +1 -1
  178. package/dist/public/{git-7Vq_SJSp.js → git-BSnY2D-A.js} +2 -2
  179. package/dist/public/{iframe-sanitizer-y2Z1pPwY.js → iframe-sanitizer-viROQkRn.js} +1 -1
  180. package/dist/public/index.html +2 -2
  181. package/dist/public/index.js +1 -1
  182. package/dist/public/{initChatSplitResize-CzV2E7Ul.js → initChatSplitResize-BA18wLQQ.js} +1 -1
  183. package/dist/public/{initControlPlane-BqCY0NQy.js → initControlPlane-L96uJkRA.js} +1 -1
  184. package/dist/public/main/index.html +2 -2
  185. package/dist/public/main/memory/index.html +2 -2
  186. package/dist/public/{markdown-Cw7vCtTg.js → markdown-DGjZAm_w.js} +17 -14
  187. package/dist/public/{mcp-reconnect-9emsqGRe.js → mcp-reconnect-CBHuaYdF.js} +1 -1
  188. package/dist/public/{memoryStorage-C0KvLNUp.js → memoryStorage-C1llaYus.js} +1 -1
  189. package/dist/public/orchestrator-C0VOoTiK.js +15 -0
  190. package/dist/public/{orchestrator-DpkkeD6T.js → orchestrator-DMWi--Dc.js} +20 -19
  191. package/dist/public/peerjs-Bf6ZxfbA.js +1 -0
  192. package/dist/public/{push-client-CHjSbrWs.js → push-client-BD4YalBa.js} +1 -1
  193. package/dist/public/service-worker.js +1 -1
  194. package/dist/public/{shadow-claw-BBPV_9X8.js → shadow-claw-DRy-D4Qi.js} +2 -2
  195. package/dist/public/{shadow-claw-accounts-xUOLBsQZ.js → shadow-claw-accounts-DnfmA8cb.js} +1 -1
  196. package/dist/public/{shadow-claw-channels-BJvrKQjg.js → shadow-claw-channels-8UkycZAa.js} +1 -1
  197. package/dist/public/{shadow-claw-chat-BG2EaRaw.js → shadow-claw-chat-Cf5LUiul.js} +9 -9
  198. package/dist/public/{shadow-claw-control-plane-BBa7WbTg.js → shadow-claw-control-plane-UsBF-Nvd.js} +2 -2
  199. package/dist/public/{shadow-claw-conversations-CFaWFmkm.js → shadow-claw-conversations-Aoe61Y21.js} +1 -1
  200. package/dist/public/{shadow-claw-file-viewer-Z-GIKaE9.js → shadow-claw-file-viewer-D28dSSEn.js} +6 -6
  201. package/dist/public/{shadow-claw-files-BBx4iMsk.js → shadow-claw-files-CaDUlPEU.js} +1 -1
  202. package/dist/public/{shadow-claw-git-vTOKatwd.js → shadow-claw-git-DYNcZMWA.js} +2 -2
  203. package/dist/public/{shadow-claw-integrations-BBVnO0Fc.js → shadow-claw-integrations-BJf_hQVv.js} +1 -1
  204. package/dist/public/{shadow-claw-llm-Ce1Ax6-x.js → shadow-claw-llm-BqK2SIRf.js} +2 -2
  205. package/dist/public/{shadow-claw-mcp-remote-Bkx0gsmF.js → shadow-claw-mcp-remote-B_dDG990.js} +1 -1
  206. package/dist/public/{shadow-claw-networking-q4XIzdB5.js → shadow-claw-networking-D8LxOofv.js} +1 -1
  207. package/dist/public/{shadow-claw-notifications-D2cz0gmm.js → shadow-claw-notifications-DpVyiNG_.js} +1 -1
  208. package/dist/public/{shadow-claw-page-header-BccSHItx.js → shadow-claw-page-header-DdC7bJuW.js} +1 -1
  209. package/dist/public/{shadow-claw-pages-3335lmSC.js → shadow-claw-pages-CYMl4J-6.js} +3 -3
  210. package/dist/public/{shadow-claw-settings-4ptYuJwO.js → shadow-claw-settings-Da_8Oy3O.js} +3 -3
  211. package/dist/public/{shadow-claw-storage-bIrPKFhF.js → shadow-claw-storage-DXIm86_-.js} +1 -1
  212. package/dist/public/{shadow-claw-task-server-5yqVBxy1.js → shadow-claw-task-server-BCceBD0G.js} +1 -1
  213. package/dist/public/{shadow-claw-tasks-DcqYHPLZ.js → shadow-claw-tasks-BW1QZ5L3.js} +19 -19
  214. package/dist/public/{shadow-claw-terminal-fARaDONr.js → shadow-claw-terminal-vqfsxhcK.js} +1 -1
  215. package/dist/public/{shadow-claw-tools-paEAhcJr.js → shadow-claw-tools-l0Jsa7UJ.js} +1 -1
  216. package/dist/public/{shadow-claw-webvm-CbzH_vyX.js → shadow-claw-webvm-CDPOWZm7.js} +1 -1
  217. package/dist/public/skills/main/skill-creator/SKILL.md +3 -2
  218. package/dist/public/skills/main/skill-creator/references/frontmatter-spec.md +5 -3
  219. package/dist/public/static-main-manifest.json +2 -2
  220. package/dist/public/{syncWebMcpRegistration-CWSYaHex.js → syncWebMcpRegistration-5b5FkP9_.js} +1 -1
  221. package/dist/public/tools-B-PzsLc2.js +1 -0
  222. package/dist/public/{tools-C8x3nmo4.js → tools-CcgG5XuA.js} +1 -1
  223. package/dist/public/{tools-DvckJZG2.js → tools-VSOY66vs.js} +1 -1
  224. package/dist/public/{webmcp-DAjmliCx.js → webmcp-DBONjQWd.js} +1 -1
  225. package/dist/server.js +2 -2
  226. package/package.json +2 -2
  227. package/src/__mocks__/marked.cjs +14 -0
  228. package/src/components/shadow-claw-chat/shadow-claw-chat.test.ts +17 -0
  229. package/src/components/shadow-claw-chat/shadow-claw-chat.ts +5 -1
  230. package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.test.ts +78 -0
  231. package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.ts +6 -2
  232. package/src/components/shadow-claw-pages/utils/resolveWorkspaceLinkPath.test.ts +56 -0
  233. package/src/components/shadow-claw-tasks/shadow-claw-tasks.test.ts +22 -0
  234. package/src/components/shadow-claw-tasks/shadow-claw-tasks.ts +5 -1
  235. package/src/content/markdown-links.test.ts +109 -0
  236. package/src/content/markdown-links.ts +187 -0
  237. package/src/content/markdown.test.ts +33 -0
  238. package/src/content/markdown.ts +6 -1
  239. package/src/core/app-routes.test.ts +65 -0
  240. package/src/core/app-routes.ts +1 -1
  241. package/src/core/orchestrator/orchestrator.ts +3 -0
  242. package/src/core/orchestrator/utils/compactContext.ts +2 -0
  243. package/src/core/orchestrator/utils/invokeAgent.ts +1 -0
  244. package/src/subsystems/accounts/service-accounts.test.ts +0 -1
  245. package/src/subsystems/channels/peerjs.test.ts +479 -1
  246. package/src/subsystems/channels/peerjs.ts +420 -75
  247. package/src/subsystems/channels/room.test.ts +35 -0
  248. package/src/subsystems/channels/room.ts +15 -0
  249. package/src/subsystems/skills/activateSkill.test.ts +38 -5
  250. package/src/subsystems/skills/activateSkill.ts +25 -3
  251. package/src/subsystems/skills/parseSkill.test.ts +71 -0
  252. package/src/subsystems/skills/parseSkill.ts +185 -25
  253. package/src/subsystems/tools/files.ts +4 -4
  254. package/src/worker/tools/spawn-subagent/spawn-subagent.test.ts +22 -23
  255. package/src/worker/tools/workspace/send-file.test.ts +24 -1
  256. package/src/worker/tools/workspace/send-file.ts +6 -3
  257. package/src/worker/utils/handleCompact.test.ts +3 -4
  258. package/src/worker/utils/handleInvoke.test.ts +13 -11
  259. package/src/worker/utils/handleInvoke.ts +3 -0
  260. package/src/worker/utils/handleMessage.test.ts +0 -1
  261. package/src/worker/utils/post.test.ts +3 -4
  262. package/src/worker/utils/sandboxedEval.test.ts +1 -2
  263. package/src/worker/utils/system-prompt.test.ts +59 -0
  264. package/src/worker/utils/system-prompt.ts +21 -1
  265. package/src/worker/utils/withRetry.test.ts +3 -16
  266. package/dist/lib/app-routes-CqBOeA5q.js.map +0 -1
  267. package/dist/lib/markdown-DgdSt2GD.js.map +0 -1
  268. package/dist/lib/orchestrator-CjEau_RG.js.map +0 -1
  269. package/dist/lib/peerjs-BdfpltIe.js.map +0 -1
  270. package/dist/lib/shadow-claw-chat-mXPQZbwT.js.map +0 -1
  271. package/dist/lib/shadow-claw-file-viewer-BSbZvSl-.js.map +0 -1
  272. package/dist/lib/shadow-claw-tasks-qmcDT4PU.js.map +0 -1
  273. package/dist/lib/tools-D4Pp-nUw.js +0 -1
  274. package/dist/public/app-routes-Bs-riIvr.js +0 -1
  275. package/dist/public/orchestrator-BWkHHO9Y.js +0 -15
  276. package/dist/public/peerjs-tf2EmWjB.js +0 -1
  277. package/dist/public/tools-COduyYJ0.js +0 -1
@@ -28,7 +28,9 @@ describe("executeSendFile", () => {
28
28
 
29
29
  it("returns error if groupId is not a peer conversation", async () => {
30
30
  const res = await executeSendFile({} as any, { path: "doc.txt" }, "main");
31
- expect(res).toContain("Error: send_file only works in peer conversations");
31
+ expect(res).toContain(
32
+ "Error: send_file only works in peer or room conversations",
33
+ );
32
34
  });
33
35
 
34
36
  it("returns error on empty path after normalization", async () => {
@@ -79,4 +81,25 @@ describe("executeSendFile", () => {
79
81
  "Sending file to peer: shared/report.pdf. The transfer will proceed in the background — you can continue chatting.",
80
82
  );
81
83
  });
84
+
85
+ it("posts send-file message and returns success response on valid room transfer", async () => {
86
+ mockGroupFileExists.mockResolvedValue(true);
87
+
88
+ const res = await executeSendFile(
89
+ {} as any,
90
+ { path: "docs/specs.pdf" },
91
+ "room:room-42",
92
+ );
93
+
94
+ expect(mockPost).toHaveBeenCalledWith({
95
+ type: "send-file",
96
+ payload: {
97
+ groupId: "room:room-42",
98
+ path: "docs/specs.pdf",
99
+ },
100
+ });
101
+ expect(res).toBe(
102
+ "Sending file to room: docs/specs.pdf. The transfer will proceed in the background — you can continue chatting.",
103
+ );
104
+ });
82
105
  });
@@ -14,8 +14,10 @@ export async function executeSendFile(
14
14
  return "Error: send_file requires a valid path string.";
15
15
  }
16
16
 
17
- if (!groupId.startsWith("peer:")) {
18
- return "Error: send_file only works in peer conversations (groupId must start with 'peer:'). The current conversation is not a peer session.";
17
+ const isPeer = groupId.startsWith("peer:");
18
+ const isRoom = groupId.startsWith("room:");
19
+ if (!isPeer && !isRoom) {
20
+ return "Error: send_file only works in peer or room conversations (groupId must start with 'peer:' or 'room:'). The current conversation is not a peer session.";
19
21
  }
20
22
 
21
23
  const sfPath = normalizeWorkspacePath(input.path);
@@ -37,5 +39,6 @@ export async function executeSendFile(
37
39
  type: "send-file",
38
40
  });
39
41
 
40
- return `Sending file to peer: ${sfPath}. The transfer will proceed in the background — you can continue chatting.`;
42
+ const targetLabel = isRoom ? "room" : "peer";
43
+ return `Sending file to ${targetLabel}: ${sfPath}. The transfer will proceed in the background — you can continue chatting.`;
41
44
  }
@@ -1,4 +1,3 @@
1
- // @ts-nocheck
2
1
  import { jest } from "@jest/globals";
3
2
 
4
3
  describe("handleCompact.js", () => {
@@ -158,9 +157,9 @@ describe("handleCompact.js", () => {
158
157
  baseUrl: "http://p1",
159
158
  });
160
159
 
161
- (global as any).fetch = jest
162
- .fn()
163
- .mockRejectedValue(new Error("network fail"));
160
+ (global as any).fetch = (jest.fn() as any).mockRejectedValue(
161
+ new Error("network fail"),
162
+ );
164
163
 
165
164
  await handleCompact({} as any, {
166
165
  groupId: "g1",
@@ -1,4 +1,3 @@
1
- // @ts-nocheck
2
1
  import { jest } from "@jest/globals";
3
2
 
4
3
  describe("handleInvoke.js", () => {
@@ -48,7 +47,7 @@ describe("handleInvoke.js", () => {
48
47
 
49
48
  // Mock withRetry to pass through the function call without actual delays.
50
49
  // This keeps handleInvoke tests focused; retry logic is tested in withRetry.test.mjs.
51
- mockWithRetry = jest.fn(async (fn) => fn());
50
+ mockWithRetry = jest.fn(async (fn: any) => fn());
52
51
 
53
52
  mockGetToolState = jest.fn();
54
53
  mockClearToolState = jest.fn();
@@ -512,7 +511,7 @@ describe("handleInvoke.js", () => {
512
511
 
513
512
  (mockExecuteTool as any).mockResolvedValue("output");
514
513
 
515
- (global as any).fetch = jest.fn().mockResolvedValue({
514
+ (global as any).fetch = (jest.fn() as any).mockResolvedValue({
516
515
  ok: true,
517
516
  json: (jest.fn() as any).mockResolvedValue({} as any),
518
517
  });
@@ -589,7 +588,7 @@ describe("handleInvoke.js", () => {
589
588
 
590
589
  (mockExecuteTool as any).mockResolvedValue("output");
591
590
 
592
- (global as any).fetch = jest.fn().mockResolvedValue({
591
+ (global as any).fetch = (jest.fn() as any).mockResolvedValue({
593
592
  ok: true,
594
593
  json: (jest.fn() as any).mockResolvedValue({} as any),
595
594
  });
@@ -637,7 +636,7 @@ describe("handleInvoke.js", () => {
637
636
 
638
637
  (mockExecuteTool as any).mockResolvedValue("output");
639
638
 
640
- (global as any).fetch = jest.fn().mockResolvedValue({
639
+ (global as any).fetch = (jest.fn() as any).mockResolvedValue({
641
640
  ok: true,
642
641
  json: (jest.fn() as any).mockResolvedValue({} as any),
643
642
  });
@@ -992,9 +991,9 @@ describe("handleInvoke.js", () => {
992
991
 
993
992
  mockBuildSystemPrompt.mockReturnValue("new built prompt");
994
993
 
995
- (global as any).fetch = jest.fn().mockResolvedValue({
994
+ (global as any).fetch = (jest.fn() as any).mockResolvedValue({
996
995
  ok: true,
997
- json: jest.fn().mockResolvedValue({}),
996
+ json: (jest.fn() as any).mockResolvedValue({}),
998
997
  });
999
998
 
1000
999
  await handleInvoke({} as any, payload);
@@ -1005,6 +1004,9 @@ describe("handleInvoke.js", () => {
1005
1004
  "memory content",
1006
1005
  [{ name: "new_tool", description: "A new tool" }],
1007
1006
  "overridden prompt",
1007
+ undefined,
1008
+ undefined,
1009
+ { groupId: "g1" },
1008
1010
  );
1009
1011
 
1010
1012
  // Verify 2nd iteration used the NEW prompt and tools
@@ -1038,9 +1040,9 @@ describe("handleInvoke.js", () => {
1038
1040
  content: [{ type: "text", text: "hello" }],
1039
1041
  });
1040
1042
 
1041
- (global as any).fetch = jest.fn().mockResolvedValue({
1043
+ (global as any).fetch = (jest.fn() as any).mockResolvedValue({
1042
1044
  ok: true,
1043
- json: jest.fn().mockResolvedValue({}),
1045
+ json: (jest.fn() as any).mockResolvedValue({}),
1044
1046
  });
1045
1047
 
1046
1048
  await handleInvoke({} as any, payload);
@@ -1086,9 +1088,9 @@ describe("handleInvoke.js", () => {
1086
1088
  content: [{ type: "text", text: "Cannot run tools right now." }],
1087
1089
  });
1088
1090
 
1089
- (global as any).fetch = jest.fn().mockResolvedValue({
1091
+ (global as any).fetch = (jest.fn() as any).mockResolvedValue({
1090
1092
  ok: true,
1091
- json: jest.fn().mockResolvedValue({}),
1093
+ json: (jest.fn() as any).mockResolvedValue({}),
1092
1094
  });
1093
1095
 
1094
1096
  await handleInvoke({} as any, payload);
@@ -361,6 +361,9 @@ export async function handleInvoke(
361
361
  memory,
362
362
  currentTools,
363
363
  updatedState.systemPromptOverride,
364
+ undefined,
365
+ undefined,
366
+ { groupId },
364
367
  );
365
368
  }
366
369
 
@@ -1,4 +1,3 @@
1
- // @ts-nocheck
2
1
  import { jest } from "@jest/globals";
3
2
 
4
3
  describe("handleMessage.js", () => {
@@ -1,4 +1,3 @@
1
- // @ts-nocheck
2
1
  import { jest } from "@jest/globals";
3
2
 
4
3
  import {
@@ -12,7 +11,7 @@ describe("post", () => {
12
11
  it("posts to self when available", () => {
13
12
  const originalSelf = globalThis.self;
14
13
  const spy = jest.fn();
15
- globalThis.self = { postMessage: spy };
14
+ globalThis.self = { postMessage: spy } as any;
16
15
 
17
16
  post({ ok: true });
18
17
 
@@ -90,7 +89,7 @@ describe("subagent collector", () => {
90
89
 
91
90
  const spy = jest.fn();
92
91
  const originalSelf = globalThis.self;
93
- globalThis.self = { postMessage: spy };
92
+ globalThis.self = { postMessage: spy } as any;
94
93
 
95
94
  post({
96
95
  type: "response",
@@ -109,7 +108,7 @@ describe("subagent collector", () => {
109
108
 
110
109
  const spy = jest.fn();
111
110
  const originalSelf = globalThis.self;
112
- globalThis.self = { postMessage: spy };
111
+ globalThis.self = { postMessage: spy } as any;
113
112
 
114
113
  // Message with no payload — should not crash
115
114
  expect(() => post({ type: "ping" })).not.toThrow();
@@ -1,4 +1,3 @@
1
- // @ts-nocheck
2
1
  import { jest } from "@jest/globals";
3
2
 
4
3
  describe("sandboxedEval", () => {
@@ -19,7 +18,7 @@ describe("sandboxedEval", () => {
19
18
  global.URL.revokeObjectURL = jest.fn();
20
19
 
21
20
  // Mock Blob
22
- global.Blob = jest.fn().mockImplementation((parts, options) => ({
21
+ (global as any).Blob = jest.fn().mockImplementation((parts, options) => ({
23
22
  parts,
24
23
  options,
25
24
  }));
@@ -188,4 +188,63 @@ describe("buildSystemPrompt", () => {
188
188
  /ignore previous instructions|you are now|new task/i,
189
189
  );
190
190
  });
191
+
192
+ it("includes send_file strategy referencing both peer and room conversations", () => {
193
+ const prompt = buildSystemPrompt(
194
+ "TestBot",
195
+ "",
196
+ [
197
+ {
198
+ name: "send_file",
199
+ description: "Send a file",
200
+ input_schema: { type: "object", properties: {} },
201
+ },
202
+ ],
203
+ undefined,
204
+ );
205
+ expect(prompt).toContain("send_file");
206
+ expect(prompt).toContain("peer:");
207
+ expect(prompt).toContain("room:");
208
+ });
209
+
210
+ it("injects conversation context for peer, room, and local groups", () => {
211
+ const peerPrompt = buildSystemPrompt(
212
+ "TestBot",
213
+ "",
214
+ [],
215
+ undefined,
216
+ undefined,
217
+ undefined,
218
+ { groupId: "peer:node-42" },
219
+ );
220
+ expect(peerPrompt).toContain(
221
+ "Current Conversation Context: Direct PeerJS P2P session (groupId: peer:node-42).",
222
+ );
223
+
224
+ const roomPrompt = buildSystemPrompt(
225
+ "TestBot",
226
+ "",
227
+ [],
228
+ undefined,
229
+ undefined,
230
+ undefined,
231
+ { groupId: "room:dev-team" },
232
+ );
233
+ expect(roomPrompt).toContain(
234
+ "Current Conversation Context: PeerJS Multi-party Room session (groupId: room:dev-team).",
235
+ );
236
+
237
+ const localPrompt = buildSystemPrompt(
238
+ "TestBot",
239
+ "",
240
+ [],
241
+ undefined,
242
+ undefined,
243
+ undefined,
244
+ { groupId: "main" },
245
+ );
246
+ expect(localPrompt).toContain(
247
+ "Current Conversation Context: Local browser conversation (groupId: main).",
248
+ );
249
+ });
191
250
  });
@@ -3,6 +3,10 @@ import { TOOL_DEFINITIONS } from "../../subsystems/tools/tools.js";
3
3
  import type { ToolDefinition } from "../../subsystems/tools/types.js";
4
4
  import type { SkillRecord } from "../../subsystems/skills/types.js";
5
5
 
6
+ export interface ConversationContext {
7
+ groupId?: string;
8
+ }
9
+
6
10
  /**
7
11
  * Build system prompt
8
12
  */
@@ -13,6 +17,7 @@ export function buildSystemPrompt(
13
17
  promptOverride?: string,
14
18
  sharedState?: Record<string, unknown>,
15
19
  skills?: SkillRecord[],
20
+ conversationContext?: ConversationContext,
16
21
  ): string {
17
22
  const defs = tools || TOOL_DEFINITIONS;
18
23
  const hasTools = defs.length > 0;
@@ -49,6 +54,21 @@ export function buildSystemPrompt(
49
54
  "- Strip <internal> tags from your responses.",
50
55
  ];
51
56
 
57
+ if (conversationContext?.groupId) {
58
+ const gid = conversationContext.groupId;
59
+ let channelDescription = `Local browser conversation (groupId: ${gid})`;
60
+ if (gid.startsWith("peer:")) {
61
+ channelDescription = `Direct PeerJS P2P session (groupId: ${gid})`;
62
+ } else if (gid.startsWith("room:")) {
63
+ channelDescription = `PeerJS Multi-party Room session (groupId: ${gid})`;
64
+ } else if (gid.startsWith("tg:")) {
65
+ channelDescription = `Telegram session (groupId: ${gid})`;
66
+ } else if (gid.startsWith("im:")) {
67
+ channelDescription = `iMessage session (groupId: ${gid})`;
68
+ }
69
+ parts.push("", `Current Conversation Context: ${channelDescription}.`);
70
+ }
71
+
52
72
  // ── Prompt Injection Defense (Option A) ─────────────────────────────────
53
73
  // Only inject when tools that return externally-controlled text are active.
54
74
  const UNTRUSTED_CONTENT_TOOLS = new Set([
@@ -127,7 +147,7 @@ export function buildSystemPrompt(
127
147
 
128
148
  if (has("send_file")) {
129
149
  strategyLines.push(
130
- "- Use send_file to transfer a workspace file directly to the connected peer over the P2P data channel. Only use it when the conversation groupId starts with 'peer:'. It is non-blocking — you can continue responding while the file transfers in the background. Do NOT use send_file in browser-local or other non-peer conversations.",
150
+ "- Use send_file to transfer a workspace file directly to connected peer(s) over the P2P data channel. It works in both direct peer conversations (groupId starting with 'peer:') and multi-party rooms (groupId starting with 'room:'). It is non-blocking — you can continue responding while the file transfers in the background. Do NOT use send_file in browser-local or other non-peer conversations.",
131
151
  );
132
152
  }
133
153
 
@@ -1,4 +1,3 @@
1
- // @ts-nocheck
2
1
  import { jest } from "@jest/globals";
3
2
  import {
4
3
  computeDelay,
@@ -9,15 +8,6 @@ import {
9
8
  RETRYABLE_STATUS_CODES,
10
9
  } from "./withRetry.js";
11
10
 
12
- // Helper: flush the microtask queue so async code reaches the next setTimeout
13
- const flushMicrotasks = () =>
14
- new Promise((r) =>
15
- jest
16
- .requireActual("timers")
17
- .then(() => r())
18
- .catch(() => r()),
19
- );
20
-
21
11
  // Simpler helper – just drain the microtask queue
22
12
  const tick = () => new Promise((resolve) => resolve(undefined));
23
13
 
@@ -117,8 +107,7 @@ describe("withRetry", () => {
117
107
  });
118
108
 
119
109
  it("retries on failure and succeeds", async () => {
120
- const fn = jest
121
- .fn()
110
+ const fn = (jest.fn() as any)
122
111
  .mockRejectedValueOnce(new Error("fail"))
123
112
  .mockResolvedValue("ok");
124
113
 
@@ -172,8 +161,7 @@ describe("withRetry", () => {
172
161
 
173
162
  it("calls onRetry callback before each retry", async () => {
174
163
  const onRetry = jest.fn();
175
- const fn = jest
176
- .fn()
164
+ const fn = (jest.fn() as any)
177
165
  .mockRejectedValueOnce(new Error("fail1"))
178
166
  .mockRejectedValueOnce(new Error("fail2"))
179
167
  .mockResolvedValue("ok");
@@ -251,8 +239,7 @@ describe("withRetry", () => {
251
239
  });
252
240
 
253
241
  it("handles non-Error throws", async () => {
254
- const fn = jest
255
- .fn()
242
+ const fn = (jest.fn() as any)
256
243
  .mockRejectedValueOnce("string error")
257
244
  .mockResolvedValue("ok");
258
245
 
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-routes-CqBOeA5q.js","names":["trimSlashes"],"sources":["../../src/storage/staticRouting.ts","../../src/core/app-routes.ts"],"sourcesContent":["/// <reference lib=\"dom\" />\nimport { applyBasePath, type ShadowClawAppRoute } from \"../core/app-routes.js\";\n\nexport interface StaticRouteDefinition {\n prettyPath: string;\n}\n\nexport interface StaticRoutesManifest {\n routes: Record<string, StaticRouteDefinition>;\n subRoutes?: string[] | Record<string, string>;\n}\n\nexport const STATIC_ROUTING_SCRIPT_ID = \"shadow-claw-static-routing\";\nexport const STATIC_ROUTING_MANIFEST_PATH = \"static-routing.json\";\n\nlet cachedManifest: StaticRoutesManifest | null = null;\n\nexport function resolveStaticRoutingManifestUrl(): string {\n const targetPath = applyBasePath(`/${STATIC_ROUTING_MANIFEST_PATH}`);\n\n if (typeof window !== \"undefined\" && window.location?.origin) {\n try {\n return new URL(targetPath, window.location.origin).toString();\n } catch {\n return targetPath;\n }\n }\n\n return targetPath;\n}\n\nfunction trimSlashes(value: string): string {\n return value.replace(/^\\/+|\\/+$/g, \"\");\n}\n\nfunction normalizePrettyPathKey(path: string): string {\n let clean = trimSlashes(path);\n if (clean.endsWith(\"/index.html\")) {\n clean = clean.slice(0, -\"/index.html\".length);\n } else if (clean.endsWith(\"index.html\")) {\n clean = clean.slice(0, -\"index.html\".length);\n }\n return trimSlashes(clean);\n}\n\nfunction parseCanonicalRouteKey(\n canonicalKey: string,\n): ShadowClawAppRoute | null {\n const normalizedKey = trimSlashes(canonicalKey);\n const parts = normalizedKey.split(\"/\").filter(Boolean);\n\n if (parts.length === 0) {\n return null;\n }\n\n const first = parts[0].toLowerCase();\n if (first === \"pages\") {\n if (parts.length >= 3) {\n const rawGroup = parts[1];\n const groupId =\n rawGroup === \"main\"\n ? \"br:main\"\n : rawGroup.startsWith(\"br-\")\n ? `br:${rawGroup.slice(3)}`\n : rawGroup;\n const filePath = parts.slice(2).join(\"/\");\n return {\n page: \"pages\",\n groupId,\n path: filePath,\n };\n }\n return {\n page: \"pages\",\n groupId: \"br:main\",\n path: parts.slice(1).join(\"/\"),\n };\n }\n\n if (first === \"files\") {\n const rawGroup = parts[1] || \"main\";\n const groupId =\n rawGroup === \"main\"\n ? \"br:main\"\n : rawGroup.startsWith(\"br-\")\n ? `br:${rawGroup.slice(3)}`\n : rawGroup;\n const filePath = parts.slice(2).join(\"/\");\n return {\n page: \"files\",\n groupId,\n path: filePath || undefined,\n };\n }\n\n if (first === \"chat\") {\n const rawGroup = parts[1] || \"main\";\n const groupId =\n rawGroup === \"main\"\n ? \"br:main\"\n : rawGroup.startsWith(\"br-\")\n ? `br:${rawGroup.slice(3)}`\n : rawGroup;\n return {\n page: \"chat\",\n groupId,\n };\n }\n\n if (first === \"tasks\") {\n const rawGroup = parts[1] || \"main\";\n const groupId =\n rawGroup === \"main\"\n ? \"br:main\"\n : rawGroup.startsWith(\"br-\")\n ? `br:${rawGroup.slice(3)}`\n : rawGroup;\n return {\n page: \"tasks\",\n groupId,\n };\n }\n\n // If format is \"posts/xyz.md\" or \"main/posts/xyz.md\"\n if (first === \"main\") {\n return {\n page: \"pages\",\n groupId: \"br:main\",\n path: parts.slice(1).join(\"/\"),\n };\n }\n\n return {\n page: \"pages\",\n groupId: \"br:main\",\n path: normalizedKey,\n };\n}\n\nexport function getEmbeddedStaticRoutesManifest(): StaticRoutesManifest | null {\n if (typeof document !== \"undefined\") {\n const scriptEl = document.getElementById(STATIC_ROUTING_SCRIPT_ID);\n if (scriptEl && scriptEl.textContent) {\n try {\n const parsed = JSON.parse(scriptEl.textContent);\n if (parsed && typeof parsed === \"object\" && parsed.routes) {\n return parsed as StaticRoutesManifest;\n }\n } catch (err) {\n console.warn(\"Failed to parse embedded static routing manifest:\", err);\n }\n }\n }\n return null;\n}\n\nexport async function getStaticRoutingManifest(): Promise<StaticRoutesManifest> {\n if (cachedManifest) {\n return cachedManifest;\n }\n\n let baseManifest = getEmbeddedStaticRoutesManifest();\n const baseUrl = resolveStaticRoutingManifestUrl();\n\n if (!baseManifest) {\n if (typeof fetch === \"function\") {\n try {\n const res = await fetch(baseUrl);\n if (res.ok) {\n const parsed = await res.json();\n if (parsed && typeof parsed === \"object\") {\n baseManifest = parsed as StaticRoutesManifest;\n }\n }\n } catch {\n // Fetch unavailable or failed\n }\n }\n }\n\n if (!baseManifest) {\n return { routes: {} };\n }\n\n if (!baseManifest.routes) {\n baseManifest.routes = {};\n }\n\n // Removed eager recursive fetch of subRoutes for CSR to support lazy loading\n // Subroutes will be fetched on demand via resolvePrettyPathToRouteAsync.\n\n cachedManifest = baseManifest;\n return cachedManifest;\n}\n\nexport function setStaticRoutesManifest(\n manifest: StaticRoutesManifest | null,\n): void {\n cachedManifest = manifest;\n}\n\nexport function clearStaticRoutesManifestCache(): void {\n cachedManifest = null;\n}\n\nexport function resolvePrettyPathToRoute(\n pathname: string,\n manifest?: StaticRoutesManifest | null,\n): ShadowClawAppRoute | null {\n const routesManifest =\n manifest || cachedManifest || getEmbeddedStaticRoutesManifest();\n if (!routesManifest || !routesManifest.routes) {\n return null;\n }\n\n const normalizedPath = normalizePrettyPathKey(pathname);\n if (!normalizedPath) {\n return null;\n }\n\n for (const [canonicalKey, routeDef] of Object.entries(\n routesManifest.routes,\n )) {\n if (!routeDef || !routeDef.prettyPath) {\n continue;\n }\n\n const normalizedPretty = normalizePrettyPathKey(routeDef.prettyPath);\n if (normalizedPretty === normalizedPath) {\n return parseCanonicalRouteKey(canonicalKey);\n }\n }\n\n return null;\n}\n\nexport async function resolvePrettyPathToRouteAsync(\n pathname: string,\n): Promise<ShadowClawAppRoute | null> {\n const syncMatch = resolvePrettyPathToRoute(pathname);\n if (syncMatch) return syncMatch;\n\n const manifest = await getStaticRoutingManifest();\n if (!manifest || !manifest.subRoutes) return null;\n\n let currentManifest = manifest;\n let currentManifestUrl = resolveStaticRoutingManifestUrl();\n let maxDepth = 5;\n\n while (currentManifest && currentManifest.subRoutes && maxDepth > 0) {\n let matchedSubRouteUrl: string | null = null;\n const normalizedPath = normalizePrettyPathKey(pathname);\n\n if (Array.isArray(currentManifest.subRoutes)) {\n for (const sub of currentManifest.subRoutes) {\n let subDir = sub.replace(/\\/routes\\.json$/, \"\");\n if (normalizedPath.startsWith(subDir)) {\n matchedSubRouteUrl = sub;\n break;\n }\n }\n } else if (typeof currentManifest.subRoutes === \"object\") {\n let longestMatch = \"\";\n for (const [prefix, sub] of Object.entries(currentManifest.subRoutes)) {\n const normPrefix = normalizePrettyPathKey(prefix);\n if (\n normalizedPath.startsWith(normPrefix) &&\n normPrefix.length > longestMatch.length\n ) {\n longestMatch = normPrefix;\n matchedSubRouteUrl = sub;\n }\n }\n }\n\n if (!matchedSubRouteUrl || typeof fetch !== \"function\") {\n break;\n }\n\n try {\n let subUrl = matchedSubRouteUrl;\n try {\n if (\n matchedSubRouteUrl.startsWith(\"http://\") ||\n matchedSubRouteUrl.startsWith(\"https://\")\n ) {\n subUrl = matchedSubRouteUrl;\n } else if (matchedSubRouteUrl.startsWith(\"/\")) {\n const withBase = applyBasePath(matchedSubRouteUrl);\n subUrl =\n typeof window !== \"undefined\" && window.location?.origin\n ? new URL(withBase, window.location.origin).toString()\n : withBase;\n } else {\n subUrl = new URL(matchedSubRouteUrl, currentManifestUrl).toString();\n }\n } catch {\n // Ignore\n }\n\n const res = await fetch(subUrl);\n if (!res.ok) break;\n\n const parsed = await res.json();\n if (!parsed || typeof parsed !== \"object\") break;\n\n if (parsed.routes) {\n Object.assign(manifest.routes, parsed.routes);\n }\n\n const found = resolvePrettyPathToRoute(pathname, manifest);\n if (found) return found;\n\n // Continue to next level if there are subRoutes\n currentManifest = parsed;\n currentManifestUrl = subUrl;\n maxDepth--;\n } catch (e) {\n console.warn(\"Failed to lazy load subRoute:\", matchedSubRouteUrl, e);\n break;\n }\n }\n\n return null;\n}\n\nexport function resolveRouteToPrettyPath(\n route: ShadowClawAppRoute,\n manifest?: StaticRoutesManifest | null,\n): string | null {\n const routesManifest =\n manifest || cachedManifest || getEmbeddedStaticRoutesManifest();\n if (!routesManifest || !routesManifest.routes) {\n return null;\n }\n\n const { page, groupId, path } = route;\n if (!page) {\n return null;\n }\n\n const normalizedGroupId =\n groupId === \"br:main\" || groupId === \"main\"\n ? \"main\"\n : groupId?.startsWith(\"br:\")\n ? `br-${groupId.slice(3)}`\n : groupId;\n\n const candidateKeys: string[] = [];\n if (page === \"pages\" && path) {\n const cleanPath = trimSlashes(path);\n if (normalizedGroupId === \"main\") {\n candidateKeys.push(`/pages/main/${cleanPath}`);\n candidateKeys.push(`pages/main/${cleanPath}`);\n candidateKeys.push(`/pages/br:main/${cleanPath}`);\n candidateKeys.push(`/pages/br-main/${cleanPath}`);\n candidateKeys.push(`/main/${cleanPath}`);\n candidateKeys.push(`main/${cleanPath}`);\n candidateKeys.push(`/${cleanPath}`);\n candidateKeys.push(cleanPath);\n } else if (normalizedGroupId) {\n candidateKeys.push(`/pages/${normalizedGroupId}/${cleanPath}`);\n candidateKeys.push(`pages/${normalizedGroupId}/${cleanPath}`);\n candidateKeys.push(`/pages/${groupId}/${cleanPath}`);\n }\n } else if (page === \"files\" && path) {\n const cleanPath = trimSlashes(path);\n if (normalizedGroupId) {\n candidateKeys.push(`/files/${normalizedGroupId}/${cleanPath}`);\n candidateKeys.push(`files/${normalizedGroupId}/${cleanPath}`);\n candidateKeys.push(`/files/${groupId}/${cleanPath}`);\n }\n }\n\n for (const candidate of candidateKeys) {\n const candidateNormalized = trimSlashes(candidate);\n for (const [canonicalKey, routeDef] of Object.entries(\n routesManifest.routes,\n )) {\n if (\n trimSlashes(canonicalKey) === candidateNormalized &&\n routeDef?.prettyPath\n ) {\n return routeDef.prettyPath;\n }\n }\n }\n\n return null;\n}\n","import {\n resolvePrettyPathToRoute,\n resolveRouteToPrettyPath,\n resolvePrettyPathToRouteAsync,\n} from \"../storage/staticRouting.js\";\n\nexport type ShadowClawPageRoute =\n | \"chat\"\n | \"files\"\n | \"tasks\"\n | \"pages\"\n | \"settings\"\n | \"tools\"\n | \"channels\";\n\nexport interface ShadowClawAppRoute {\n page: ShadowClawPageRoute;\n groupId?: string;\n path?: string;\n anchor?: string;\n}\n\nfunction encodePathSegment(value: string): string {\n if (value === \"br:main\") {\n return \"main\";\n }\n if (value.startsWith(\"br:\")) {\n return `br-${value.slice(3)}`;\n }\n\n return encodeURIComponent(value);\n}\n\nfunction decodePathSegment(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nlet cachedBasePath: string | null = null;\n\nconst VALID_PAGES = new Set([\n \"chat\",\n \"files\",\n \"tasks\",\n \"pages\",\n \"settings\",\n \"tools\",\n \"channels\",\n]);\n\nexport function resetAppBasePathCache(): void {\n cachedBasePath = null;\n}\n\nif (typeof globalThis !== \"undefined\") {\n (globalThis as any).__applyBasePathCacheReset = resetAppBasePathCache;\n}\n\nexport function getDeploymentNamespace(): string {\n const globalObj =\n typeof window !== \"undefined\"\n ? window\n : typeof self !== \"undefined\"\n ? self\n : globalThis;\n\n if (globalObj && (globalObj as any).__SHADOWCLAW_DEPLOY_ID__) {\n const customId = String((globalObj as any).__SHADOWCLAW_DEPLOY_ID__).trim();\n if (customId) {\n return customId.replace(/[^a-zA-Z0-9_-]/g, \"-\");\n }\n }\n\n const proc = (globalThis as any).process;\n if (proc && proc.env && proc.env.SHADOWCLAW_DEPLOY_ID) {\n const envId = String(proc.env.SHADOWCLAW_DEPLOY_ID).trim();\n if (envId) {\n return envId.replace(/[^a-zA-Z0-9_-]/g, \"-\");\n }\n }\n\n const basePath = getAppBasePath();\n if (!basePath || basePath === \"/\") {\n return \"\";\n }\n\n const clean = basePath.replace(/^\\/+|\\/+$/g, \"\");\n return clean.replace(/[^a-zA-Z0-9_-]/g, \"-\");\n}\n\nexport function getAppBasePath(): string {\n if (cachedBasePath !== null) {\n return cachedBasePath;\n }\n\n // In Web Worker environment:\n const isWorker =\n typeof window === \"undefined\" ||\n (typeof (globalThis as any).WorkerGlobalScope !== \"undefined\" &&\n typeof self !== \"undefined\" &&\n self instanceof (globalThis as any).WorkerGlobalScope);\n\n if (isWorker && typeof self !== \"undefined\" && (self as any).location) {\n const workerPath = (self as any).location.pathname || \"/\";\n const parts = workerPath.split(\"/\").filter(Boolean);\n\n // In a Web Worker, the pathname is always the URL of a script file (e.g. /agent.worker.js or /shadow-claw/agent.worker.js).\n // If there is only 1 segment (e.g. [\"agent.worker.js\"]), the worker is hosted at the root domain.\n if (parts.length <= 1) {\n cachedBasePath = \"/\";\n\n return cachedBasePath;\n }\n\n const first = parts[0].toLowerCase();\n const isRootFileOrDir =\n first === \"service-worker.js\" ||\n first === \"sw.js\" ||\n first === \"manifest.json\" ||\n first === \"sitemap.xml\" ||\n first === \"favicon.ico\" ||\n first === \"index.html\" ||\n first === \"service-worker\" ||\n first === \"assets\" ||\n first === \"dist\" ||\n first === \"public\";\n\n // If there are 2 segments and the first is an internal asset/service-worker folder (e.g. /service-worker/init.js),\n // it's hosted at the root domain.\n if (isRootFileOrDir && parts.length === 2) {\n cachedBasePath = \"/\";\n\n return cachedBasePath;\n }\n\n if (!isRootFileOrDir) {\n cachedBasePath = \"/\" + parts[0] + \"/\";\n\n return cachedBasePath;\n }\n }\n\n const loc =\n typeof window !== \"undefined\" && window.location\n ? window.location\n : typeof self !== \"undefined\" && self.location\n ? self.location\n : null;\n\n if (!loc) {\n return \"/\";\n }\n\n // 1. Check for explicit <base href=\"...\"> element in the DOM\n if (\n typeof document !== \"undefined\" &&\n typeof document.querySelector === \"function\"\n ) {\n const baseEl = document.querySelector(\"base[href]\");\n if (baseEl) {\n const href = baseEl.getAttribute(\"href\");\n if (href) {\n try {\n const baseUriPath = new URL(href, loc.origin).pathname;\n let base = baseUriPath;\n if (!base.endsWith(\"/\")) {\n base += \"/\";\n }\n cachedBasePath = base;\n\n return cachedBasePath;\n } catch {\n // ignore parsing error, fall through\n }\n }\n }\n }\n\n const pathname = loc.pathname || \"/\";\n if (pathname === \"/\") {\n cachedBasePath = \"/\";\n\n return cachedBasePath;\n }\n\n const parts = pathname.split(\"/\").filter(Boolean);\n const pageIndex = parts.findIndex((part) =>\n VALID_PAGES.has(part.toLowerCase()),\n );\n\n if (pageIndex >= 0) {\n if (pageIndex === 0) {\n cachedBasePath = \"/\";\n\n return cachedBasePath;\n }\n\n cachedBasePath = \"/\" + parts.slice(0, pageIndex).join(\"/\") + \"/\";\n\n return cachedBasePath;\n }\n\n // 2. Check if the current pathname is a known pretty route\n const prettyRoute = resolvePrettyPathToRoute(pathname);\n if (prettyRoute) {\n cachedBasePath = \"/\";\n\n return cachedBasePath;\n }\n\n // 3. Check for single-segment subpath deployments (e.g. /shadow-claw/ or /my-app/)\n if (parts.length === 1 && !pathname.includes(\".\")) {\n cachedBasePath = \"/\" + parts[0] + \"/\";\n\n return cachedBasePath;\n }\n\n // 4. Default to root base path for unhandled multi-segment paths\n cachedBasePath = \"/\";\n\n return cachedBasePath;\n}\n\nexport function applyBasePath(path: string): string {\n const base = getAppBasePath();\n if (base === \"/\") {\n return path;\n }\n\n const [pathPart, ...rest] = path.split(/(?=[?#])/);\n\n // If the path already starts with the base, don't double-prefix.\n if (pathPart === base || pathPart.startsWith(base)) {\n return path;\n }\n\n const relative = pathPart.startsWith(\"/\") ? pathPart.slice(1) : pathPart;\n\n let combined = base + relative;\n combined = combined.replace(/\\/{2,}/g, \"/\");\n\n return combined + rest.join(\"\");\n}\n\nfunction trimSlashes(value: string): string {\n return value.replace(/^\\/+|\\/+$/g, \"\");\n}\n\nfunction normalizeRouteGroupId(\n groupId: string | undefined,\n): string | undefined {\n if (!groupId) {\n return groupId;\n }\n\n if (groupId === \"main\") {\n return \"br:main\";\n }\n\n // Accept browser-safe \"br-...\" route IDs and normalize to canonical \"br:...\".\n if (groupId.startsWith(\"br-\")) {\n return `br:${groupId.slice(3)}`;\n }\n\n return groupId;\n}\n\nfunction sanitizeWorkspacePath(path: string | undefined): string | undefined {\n if (!path) {\n return undefined;\n }\n\n const normalized = trimSlashes(path.replace(/\\\\/g, \"/\"));\n if (!normalized) {\n return undefined;\n }\n\n const parts = normalized\n .split(\"/\")\n .filter(Boolean)\n .filter((part) => part !== \".\" && part !== \"..\");\n\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.join(\"/\");\n}\n\nexport function buildRoutePath(route: ShadowClawAppRoute): string {\n const anchor = route.anchor ? `#${route.anchor.replace(/^#/, \"\")}` : \"\";\n\n const prettyPath = resolveRouteToPrettyPath(route);\n if (prettyPath) {\n let clean = prettyPath;\n if (!clean.startsWith(\"/\")) {\n clean = `/${clean}`;\n }\n\n return `${clean}${anchor}`;\n }\n\n switch (route.page) {\n case \"chat\": {\n const path = route.groupId\n ? `/chat/${encodePathSegment(route.groupId)}/`\n : \"/chat\";\n\n return `${path}${anchor}`;\n }\n\n case \"tasks\": {\n const path = route.groupId\n ? `/tasks/${encodePathSegment(route.groupId)}/`\n : \"/tasks\";\n\n return `${path}${anchor}`;\n }\n\n case \"files\": {\n const workspacePath = sanitizeWorkspacePath(route.path);\n if (!route.groupId) {\n return `/files${anchor}`;\n }\n\n if (!workspacePath) {\n return `/files/${encodePathSegment(route.groupId)}/${anchor}`;\n }\n\n return `/files/${encodePathSegment(route.groupId)}/${workspacePath}${anchor}`;\n }\n\n case \"pages\": {\n const workspacePath = sanitizeWorkspacePath(route.path);\n if (!workspacePath) {\n return `/pages${anchor}`;\n }\n\n if (route.groupId) {\n return `/pages/${encodePathSegment(route.groupId)}/${workspacePath}${anchor}`;\n }\n\n return `/pages/${workspacePath}${anchor}`;\n }\n\n case \"tools\":\n return `/settings/tool-configuration${anchor}`;\n\n case \"channels\":\n return `/settings/channel-configuration${anchor}`;\n\n case \"settings\":\n default:\n return `/settings${anchor}`;\n }\n}\n\nexport function parseRouteFromUrl(\n url: URL,\n fallbackGroupId?: string,\n): ShadowClawAppRoute | null {\n let pathname = url.pathname;\n const basePath = getAppBasePath();\n\n if (basePath !== \"/\" && pathname.startsWith(basePath)) {\n pathname = \"/\" + pathname.slice(basePath.length);\n }\n\n const prettyRoute = resolvePrettyPathToRoute(pathname);\n if (prettyRoute) {\n const anchor = url.hash ? url.hash.replace(/^#/, \"\") : undefined;\n\n return {\n ...prettyRoute,\n anchor: anchor || prettyRoute.anchor,\n };\n }\n\n const parts = pathname\n .split(\"/\")\n .filter(Boolean)\n .map((part) => decodePathSegment(part));\n const anchor = url.hash ? url.hash.replace(/^#/, \"\") : undefined;\n\n if (parts.length === 0) {\n return null;\n }\n\n const page = parts[0].toLowerCase();\n\n if (page === \"chat\") {\n return {\n page: \"chat\",\n groupId: normalizeRouteGroupId(parts[1] || fallbackGroupId),\n anchor,\n };\n }\n\n if (page === \"tasks\") {\n return {\n page: \"tasks\",\n groupId: normalizeRouteGroupId(parts[1] || fallbackGroupId),\n anchor,\n };\n }\n\n if (page === \"files\") {\n const groupId = normalizeRouteGroupId(parts[1] || fallbackGroupId);\n const path = sanitizeWorkspacePath(parts.slice(2).join(\"/\"));\n\n return {\n page: \"files\",\n groupId,\n path,\n anchor,\n };\n }\n\n if (page === \"pages\") {\n if (parts.length >= 3) {\n return {\n page: \"pages\",\n groupId: normalizeRouteGroupId(parts[1]),\n path: sanitizeWorkspacePath(parts.slice(2).join(\"/\")),\n anchor,\n };\n }\n\n return {\n page: \"pages\",\n groupId: normalizeRouteGroupId(fallbackGroupId),\n path: sanitizeWorkspacePath(parts.slice(1).join(\"/\")),\n anchor,\n };\n }\n\n if (page === \"settings\") {\n const section = (parts[1] || \"\").toLowerCase();\n if (section === \"tool-configuration\") {\n return { page: \"tools\", anchor };\n }\n\n if (section === \"channel-configuration\") {\n return { page: \"channels\", anchor };\n }\n\n return { page: \"settings\", anchor };\n }\n\n if (page === \"tools\") {\n return { page: \"tools\", anchor };\n }\n\n if (page === \"channels\") {\n return { page: \"channels\", anchor };\n }\n\n return null;\n}\n\nexport function isPossibleAppRoute(pathname: string): boolean {\n let relativePath = pathname;\n const basePath = getAppBasePath();\n\n if (basePath !== \"/\" && relativePath.startsWith(basePath)) {\n relativePath = \"/\" + relativePath.slice(basePath.length);\n } else if (basePath !== \"/\" && !relativePath.startsWith(basePath)) {\n return false;\n }\n\n const parts = relativePath.split(\"/\").filter(Boolean);\n if (parts.length === 0) return true; // root\n\n const page = parts[0].toLowerCase();\n if (VALID_PAGES.has(page)) return true;\n\n if (resolvePrettyPathToRoute(relativePath)) return true;\n\n return false;\n}\n\nexport async function parseRouteFromUrlAsync(\n url: URL,\n fallbackGroupId?: string,\n): Promise<ShadowClawAppRoute | null> {\n const syncRoute = parseRouteFromUrl(url, fallbackGroupId);\n if (syncRoute) return syncRoute;\n\n let pathname = url.pathname;\n const basePath = getAppBasePath();\n if (basePath !== \"/\" && pathname.startsWith(basePath)) {\n pathname = \"/\" + pathname.slice(basePath.length);\n }\n\n const prettyRoute = await resolvePrettyPathToRouteAsync(pathname);\n if (prettyRoute) {\n const anchor = url.hash ? url.hash.replace(/^#/, \"\") : undefined;\n return {\n ...prettyRoute,\n anchor: anchor || prettyRoute.anchor,\n };\n }\n\n return null;\n}\n\nexport function resolveHrefAgainstRoute(\n href: string,\n routePath: string,\n origin: string,\n): URL | null {\n const trimmed = href.trim();\n if (!trimmed || trimmed.startsWith(\"javascript:\")) {\n return null;\n }\n\n if (trimmed.startsWith(\"/\")) {\n try {\n const resolvedPath = applyBasePath(trimmed);\n\n return new URL(resolvedPath, origin);\n } catch {\n return null;\n }\n }\n\n const base = new URL(routePath, origin);\n try {\n return new URL(trimmed, base);\n } catch {\n return null;\n }\n}\n\nexport function getFileRouteDirPath(groupId: string, filePath: string): string {\n const normalized = sanitizeWorkspacePath(filePath);\n if (!normalized) {\n return buildRoutePath({ page: \"files\", groupId });\n }\n\n const parts = normalized.split(\"/\");\n parts.pop();\n const prefix = parts.length > 0 ? `${parts.join(\"/\")}/` : \"\";\n\n return `/files/${encodePathSegment(groupId)}/${prefix}`;\n}\n\nexport function getWorkspaceRouteRequestPath(\n pathname: string,\n): { groupId: string; path: string } | null {\n let relativePath = pathname;\n const basePath = getAppBasePath();\n\n if (basePath !== \"/\" && relativePath.startsWith(basePath)) {\n relativePath = \"/\" + relativePath.slice(basePath.length);\n }\n\n const parts = relativePath\n .split(\"/\")\n .filter(Boolean)\n .map((part) => decodePathSegment(part));\n\n if (parts.length < 3) {\n return null;\n }\n\n if (parts[0] !== \"files\") {\n return null;\n }\n\n const groupId = normalizeRouteGroupId(parts[1]) || parts[1];\n const path = sanitizeWorkspacePath(parts.slice(2).join(\"/\"));\n if (!groupId || !path) {\n return null;\n }\n\n return { groupId, path };\n}\n"],"mappings":"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"}