shadow-claw 1.23.3 → 1.24.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 (286) hide show
  1. package/README.md +42 -5
  2. package/bin/assert-version-bump.mjs +60 -38
  3. package/bin/assert-version-bump.test.mjs +74 -11
  4. package/bin/cli.mjs +166 -0
  5. package/bin/cli.test.mjs +60 -0
  6. package/bin/commands/backup.mjs +70 -0
  7. package/bin/commands/clients.mjs +41 -0
  8. package/bin/commands/peer-id.mjs +76 -0
  9. package/bin/commands/peer-id.test.mjs +104 -0
  10. package/bin/commands/send.mjs +51 -0
  11. package/bin/commands/tasks.mjs +59 -0
  12. package/bin/commands/webrtc-listen.mjs +254 -0
  13. package/bin/prerender-dsd-shell/prerender-dsd-shell.test.mjs +46 -0
  14. package/bin/rolldown.config.test.mjs +401 -8
  15. package/bin/utils/control-client.mjs +243 -0
  16. package/bin/utils/control-client.test.mjs +83 -0
  17. package/bin/utils/ulid.mjs +45 -0
  18. package/bin/utils/webrtc-control-client.mjs +699 -0
  19. package/bin/utils/webrtc-control-client.test.mjs +318 -0
  20. package/dist/electron/main.cjs +1 -1
  21. package/dist/public/AGENTS.md +5 -3
  22. package/dist/public/README.md +42 -5
  23. package/dist/public/agent.worker.js +6 -6
  24. package/dist/public/{app-routes-B0ePT49v.js → app-routes-Bs-riIvr.js} +1 -1
  25. package/dist/public/backup-controller-C_s9in2t.js +1 -0
  26. package/dist/public/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.css +1 -0
  27. package/dist/public/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.html +1 -0
  28. package/dist/public/components/settings/shadow-claw-storage/shadow-claw-storage.html +1 -1
  29. package/dist/public/components/settings/shadow-claw-task-server/shadow-claw-task-server.css +1 -1
  30. package/dist/public/components/settings/shadow-claw-task-server/shadow-claw-task-server.html +1 -1
  31. package/dist/public/components/shadow-claw-files/shadow-claw-files.css +1 -1
  32. package/dist/public/components/shadow-claw-files/shadow-claw-files.html +1 -1
  33. package/dist/public/components/shadow-claw-settings/shadow-claw-settings.html +1 -1
  34. package/dist/public/config-CrHchneq.js +1 -0
  35. package/dist/public/{configurePeerJs-B7kNU8AQ.js → configurePeerJs-CxpZeDJJ.js} +1 -1
  36. package/dist/public/{connections-xd_66YVU.js → connections-DvbgdkaB.js} +1 -1
  37. package/dist/public/{custom-element-security-CZ92anB8.js → custom-element-security-NCqQ5lmC.js} +1 -1
  38. package/dist/public/docs/README.md +3 -1
  39. package/dist/public/docs/architecture/overview.md +12 -12
  40. package/dist/public/docs/architecture/storage.md +5 -2
  41. package/dist/public/docs/decisions/bundled-typescript-architecture.md +1 -1
  42. package/dist/public/docs/decisions/indexeddb-and-opfs-storage.md +6 -3
  43. package/dist/public/docs/decisions/native-web-components-and-signals.md +1 -1
  44. package/dist/public/docs/example/article/index.html +2 -2
  45. package/dist/public/docs/guides/configuring-messaging-channels.md +41 -6
  46. package/dist/public/docs/guides/server-development-configuration.md +24 -0
  47. package/dist/public/docs/publishing/index.html +19 -76
  48. package/dist/public/docs/skill-creator/index.html +2 -2
  49. package/dist/public/docs/subsystems/backup.md +56 -0
  50. package/dist/public/docs/subsystems/cli.md +124 -0
  51. package/dist/public/docs/subsystems/control-plane.md +158 -0
  52. package/dist/public/docs/subsystems/notifications.md +54 -2
  53. package/dist/public/docs/subsystems/reactive-ui.md +1 -0
  54. package/dist/public/downloadGroupFile-By0GR6eV.js +1 -0
  55. package/dist/public/e2e/README.md +5 -1
  56. package/dist/public/{e2e-bridge-DkS5xFGX.js → e2e-bridge-IGWsRl4i.js} +1 -1
  57. package/dist/public/file-viewer-D0eflgt6.js +1 -0
  58. package/dist/public/files/main/~/docs/publishing-to-github-pages.md +17 -82
  59. package/dist/public/getAllTasks-vpBlgGsc.js +1 -0
  60. package/dist/public/getGroupDir-P1h9wl6S.js +1 -0
  61. package/dist/public/{git-BkjrsRXX.js → git-7Vq_SJSp.js} +2 -2
  62. package/dist/public/{iframe-sanitizer-L6Jyu__Z.js → iframe-sanitizer-y2Z1pPwY.js} +1 -1
  63. package/dist/public/index.html +2 -2
  64. package/dist/public/index.js +1 -1
  65. package/dist/public/{initChatSplitResize-BslPXAXS.js → initChatSplitResize-CzV2E7Ul.js} +1 -1
  66. package/dist/public/initControlPlane-C9jpnWev.js +1 -0
  67. package/dist/public/llms.txt +1 -1
  68. package/dist/public/main/index.html +2 -2
  69. package/dist/public/main/memory/index.html +2 -2
  70. package/dist/public/{markdown-6MBrIo-S.js → markdown-BnpKxSxl.js} +1 -1
  71. package/dist/public/mcp-reconnect-9emsqGRe.js +1 -0
  72. package/dist/public/{memoryStorage-CjGseKI1.js → memoryStorage-C0KvLNUp.js} +1 -1
  73. package/dist/public/{orchestrator-B9KmIj8Q.js → orchestrator-3h9xxHUm.js} +676 -676
  74. package/dist/public/orchestrator-nJj59RqD.js +15 -0
  75. package/dist/public/pages/main/~/docs/publishing-to-github-pages.md +17 -82
  76. package/dist/public/{peerjs-Dv8JNm7v.js → peerjs-BP4laMXj.js} +1 -1
  77. package/dist/public/{push-client-Dqq06wbB.js → push-client-CrjEXK3U.js} +1 -1
  78. package/dist/public/service-worker/fetch-proxy.js +1 -1
  79. package/dist/public/service-worker/push-handler.js +1 -1
  80. package/dist/public/service-worker.js +1 -1
  81. package/dist/public/{shadow-claw-Bd1rfuVC.js → shadow-claw-CbwETBWf.js} +2 -2
  82. package/dist/public/{shadow-claw-accounts-DL2l3oM0.js → shadow-claw-accounts-B4sBTQEj.js} +3 -3
  83. package/dist/public/{shadow-claw-channels-BGXDsQ38.js → shadow-claw-channels-BDWG5Qa3.js} +1 -1
  84. package/dist/public/{shadow-claw-chat-NXg6zz_l.js → shadow-claw-chat-Crv0DTCY.js} +6 -6
  85. package/dist/public/shadow-claw-control-plane-CX1IGbh9.js +199 -0
  86. package/dist/public/{shadow-claw-conversations-C8eqGpP9.js → shadow-claw-conversations-_9qAaRXk.js} +1 -1
  87. package/dist/public/shadow-claw-dialog-BrOwAOdk.js +1 -0
  88. package/dist/public/shadow-claw-file-viewer-Blf6yGVD.js +577 -0
  89. package/dist/public/shadow-claw-files-CYySBDCl.js +840 -0
  90. package/dist/public/{shadow-claw-git-C0ntz7aX.js → shadow-claw-git-v8S0JjuR.js} +3 -3
  91. package/dist/public/{shadow-claw-integrations-DCXV2r69.js → shadow-claw-integrations-D7ufpwhX.js} +1 -1
  92. package/dist/public/{shadow-claw-llm-CudgFQsS.js → shadow-claw-llm-GWgoVfhI.js} +2 -2
  93. package/dist/public/{shadow-claw-mcp-remote-B8RkpX28.js → shadow-claw-mcp-remote-kY4LMFNN.js} +1 -1
  94. package/dist/public/{shadow-claw-networking-BLiRsrsK.js → shadow-claw-networking-qHbP95z9.js} +1 -1
  95. package/dist/public/{shadow-claw-notifications-CQhQcjtL.js → shadow-claw-notifications-YyHOK2Fr.js} +1 -1
  96. package/dist/public/{shadow-claw-page-header-NeRD0tKU.js → shadow-claw-page-header-DMKbkv3s.js} +1 -1
  97. package/dist/public/{shadow-claw-pages-DCHnFh6r.js → shadow-claw-pages-DFZHhzFZ.js} +3 -3
  98. package/dist/public/{shadow-claw-settings-VAfjKFQg.js → shadow-claw-settings-DhxrKIfA.js} +10 -3
  99. package/dist/public/shadow-claw-storage-BFynbP0j.js +219 -0
  100. package/dist/public/{shadow-claw-task-server-Dk33N_1G.js → shadow-claw-task-server-3BIeb5oZ.js} +25 -4
  101. package/dist/public/{shadow-claw-tasks-xA1VfmWN.js → shadow-claw-tasks-Caxc9atL.js} +4 -4
  102. package/dist/public/{shadow-claw-terminal-Du2r0ciq.js → shadow-claw-terminal-Beb5qF-U.js} +1 -1
  103. package/dist/public/{shadow-claw-tools-CZj4rq7l.js → shadow-claw-tools-BfJx3A9W.js} +2 -2
  104. package/dist/public/{shadow-claw-webvm-JYUkWICG.js → shadow-claw-webvm-BCS8ykeP.js} +1 -1
  105. package/dist/public/static-main/~/docs/publishing-to-github-pages.md +17 -82
  106. package/dist/public/static-main-manifest.json +1 -1
  107. package/dist/public/{syncWebMcpRegistration-DfpvASnh.js → syncWebMcpRegistration-B_M2fCjH.js} +1 -1
  108. package/dist/server.js +286 -189
  109. package/package.json +2 -1
  110. package/src/__mocks__/jszip.cjs +15 -5
  111. package/src/components/settings/shadow-claw-accounts/shadow-claw-accounts.test.ts +35 -0
  112. package/src/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.css +117 -0
  113. package/src/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.html +81 -0
  114. package/src/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.test.ts +127 -0
  115. package/src/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.ts +292 -0
  116. package/src/components/settings/shadow-claw-git/shadow-claw-git.test.ts +72 -0
  117. package/src/components/settings/shadow-claw-integrations/connection-test-auth.test.ts +20 -30
  118. package/src/components/settings/shadow-claw-integrations/shadow-claw-integrations.test.ts +116 -0
  119. package/src/components/settings/shadow-claw-llm/model-ranking.test.ts +143 -51
  120. package/src/components/settings/shadow-claw-llm/shadow-claw-llm.test.ts +307 -4
  121. package/src/components/settings/shadow-claw-llm/shadow-claw-llm.ts +8 -8
  122. package/src/components/settings/shadow-claw-mcp-remote/shadow-claw-mcp-remote.test.ts +31 -0
  123. package/src/components/settings/shadow-claw-peerjs/shadow-claw-peerjs.test.ts +186 -0
  124. package/src/components/settings/shadow-claw-storage/shadow-claw-storage.html +17 -0
  125. package/src/components/settings/shadow-claw-storage/shadow-claw-storage.test.ts +120 -0
  126. package/src/components/settings/shadow-claw-storage/shadow-claw-storage.ts +56 -0
  127. package/src/components/settings/shadow-claw-task-server/shadow-claw-task-server.css +23 -2
  128. package/src/components/settings/shadow-claw-task-server/shadow-claw-task-server.html +1 -1
  129. package/src/components/settings/shadow-claw-task-server/shadow-claw-task-server.test.ts +19 -0
  130. package/src/components/settings/shadow-claw-task-server/shadow-claw-task-server.ts +2 -1
  131. package/src/components/shadow-claw/utils/initChatSplitResize.test.ts +180 -13
  132. package/src/components/shadow-claw/utils/setupEffects.test.ts +39 -0
  133. package/src/components/shadow-claw-a2ui/catalog/basic/shared.test.ts +117 -0
  134. package/src/components/shadow-claw-a2ui/shadow-claw-a2ui.test.ts +1159 -1
  135. package/src/components/shadow-claw-chat/shadow-claw-chat.test.ts +1523 -19
  136. package/src/components/shadow-claw-chat/utils/escapeHtml.test.ts +13 -0
  137. package/src/components/shadow-claw-chat/utils/getPeerChatDisplayStatus.test.ts +20 -0
  138. package/src/components/shadow-claw-conversations/shadow-claw-conversations.test.ts +494 -0
  139. package/src/components/shadow-claw-dialog/shadow-claw-dialog.ts +13 -2
  140. package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.test.ts +378 -0
  141. package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.ts +11 -9
  142. package/src/components/shadow-claw-files/shadow-claw-files.css +41 -17
  143. package/src/components/shadow-claw-files/shadow-claw-files.html +35 -0
  144. package/src/components/shadow-claw-files/shadow-claw-files.test.ts +627 -1
  145. package/src/components/shadow-claw-files/shadow-claw-files.ts +170 -6
  146. package/src/components/shadow-claw-pages/utils/resolveWorkspaceLinkPath.test.ts +31 -0
  147. package/src/components/shadow-claw-pages/utils/resolveWorkspaceLinkPath.ts +2 -1
  148. package/src/components/shadow-claw-pages/utils/rewriteWorkspacePreviewHtml.test.ts +15 -0
  149. package/src/components/shadow-claw-pdf-viewer/utils/installGetOrInsertComputedPolyfill.test.ts +65 -0
  150. package/src/components/shadow-claw-settings/shadow-claw-settings.html +7 -0
  151. package/src/components/shadow-claw-settings/shadow-claw-settings.test.ts +221 -0
  152. package/src/components/shadow-claw-settings/shadow-claw-settings.ts +2 -0
  153. package/src/components/shadow-claw-tasks/shadow-claw-tasks.test.ts +407 -0
  154. package/src/components/shadow-claw-terminal/utils/consumeEscapeSequence.test.ts +58 -0
  155. package/src/components/shadow-claw-tools/shadow-claw-tools.test.ts +80 -0
  156. package/src/config/config.test.ts +9 -0
  157. package/src/config/config.ts +15 -0
  158. package/src/core/app-routes.test.ts +56 -0
  159. package/src/core/app-routes.ts +8 -1
  160. package/src/core/backup-controller.test.ts +101 -0
  161. package/src/core/backup-controller.ts +137 -0
  162. package/src/core/control-plane-client.test.ts +408 -0
  163. package/src/core/control-plane-client.ts +425 -0
  164. package/src/core/orchestrator/orchestrator.ts +4 -0
  165. package/src/core/orchestrator/utils/compactContext.test.ts +78 -0
  166. package/src/core/orchestrator/utils/operations/channel.test.ts +254 -9
  167. package/src/core/orchestrator/utils/operations/provider.test.ts +326 -34
  168. package/src/core/orchestrator/utils/operations/vm.test.ts +114 -2
  169. package/src/core/orchestrator/utils/syncProxyConfigToServiceWorker.test.ts +60 -0
  170. package/src/core/utils/initControlPlane.test.ts +276 -0
  171. package/src/core/utils/initControlPlane.ts +437 -0
  172. package/src/core/utils/initializeApp.ts +18 -0
  173. package/src/db/getSession.test.ts +13 -1
  174. package/src/db/openDatabase.test.ts +10 -1
  175. package/src/db/openDatabase.ts +3 -1
  176. package/src/server/app.test.ts +12 -0
  177. package/src/server/app.ts +18 -8
  178. package/src/server/client-registry.test.ts +250 -0
  179. package/src/server/client-registry.ts +477 -0
  180. package/src/server/config.ts +15 -0
  181. package/src/server/control-plane-types.ts +120 -0
  182. package/src/server/control-plane.test.ts +472 -0
  183. package/src/server/control-plane.ts +581 -0
  184. package/src/server/routes/backup.test.ts +263 -0
  185. package/src/server/routes/backup.ts +262 -0
  186. package/src/server/routes/integrations-email.test.ts +532 -0
  187. package/src/server/routes/llamafile.test.ts +172 -48
  188. package/src/server/routes/mesh-llm.test.ts +192 -0
  189. package/src/server/routes/ollama.test.ts +49 -0
  190. package/src/server/server-peer.test.ts +86 -0
  191. package/src/server/server-peer.ts +330 -0
  192. package/src/server/server.ts +35 -0
  193. package/src/server/services/llamafile-manager.test.ts +230 -6
  194. package/src/server/services/transformers-runtime.test.ts +186 -18
  195. package/src/server/webrtc.test.ts +21 -0
  196. package/src/server/webrtc.ts +72 -0
  197. package/src/service-worker/fetch-proxy.test.ts +64 -1
  198. package/src/service-worker/push-handler.ts +39 -0
  199. package/src/shell/vm.test.ts +744 -12
  200. package/src/storage/ensureMainGroupIndex.test.ts +153 -0
  201. package/src/storage/getGroupFile.test.ts +66 -0
  202. package/src/storage/memoryStorage.test.ts +82 -2
  203. package/src/storage/migrateLegacyOpfs.test.ts +327 -0
  204. package/src/storage/migrateLegacyOpfs.ts +117 -0
  205. package/src/storage/writeGroupFileBytes.test.ts +143 -0
  206. package/src/stores/chat-ui.test.ts +20 -0
  207. package/src/stores/orchestrator.test.ts +134 -0
  208. package/src/stores/toast.test.ts +50 -0
  209. package/src/stores/tools.test.ts +147 -10
  210. package/src/subsystems/channels/imessage.test.ts +59 -0
  211. package/src/subsystems/channels/peerjs.test.ts +500 -62
  212. package/src/subsystems/channels/peerjs.ts +71 -4
  213. package/src/subsystems/channels/telegram.test.ts +177 -0
  214. package/src/subsystems/email/catalog.test.ts +1 -0
  215. package/src/subsystems/email/connections.test.ts +39 -1
  216. package/src/subsystems/git/credentials.test.ts +160 -825
  217. package/src/subsystems/git/git.test.ts +463 -0
  218. package/src/subsystems/notifications/__mocks__/node-sqlite.cjs +12 -1
  219. package/src/subsystems/notifications/push-routes.test.ts +33 -0
  220. package/src/subsystems/notifications/push-routes.ts +23 -0
  221. package/src/subsystems/notifications/push-store.ts +1 -1
  222. package/src/subsystems/providers/builtin-ai-tasks.test.ts +74 -0
  223. package/src/subsystems/providers/litert-lm-provider.test.ts +212 -51
  224. package/src/subsystems/providers/model-registry.test.ts +115 -0
  225. package/src/subsystems/providers/providers.test.ts +94 -1
  226. package/src/subsystems/providers/transformers-js-provider.test.ts +279 -0
  227. package/src/subsystems/providers/utils/createModelCacheFetch.test.ts +2 -2
  228. package/src/subsystems/providers/utils/downloadModelToCache.test.ts +2 -2
  229. package/src/subsystems/providers/utils/loadModelStream.test.ts +2 -2
  230. package/src/subsystems/skills/activateSkill.test.ts +101 -0
  231. package/src/subsystems/skills/discoverSkills.test.ts +251 -0
  232. package/src/subsystems/tools/cron.test.ts +64 -0
  233. package/src/subsystems/tools/declarative.test.ts +255 -89
  234. package/src/testing/assets/v86.9pfs/libv86.mjs +63 -0
  235. package/src/testing/assets/v86.ext2/libv86.mjs +3 -0
  236. package/src/testing/assets_missing_v86/assets/v86.9pfs/libv86.mjs +1 -0
  237. package/src/testing/jest-setup.ts +328 -40
  238. package/src/testing/mock-v86.mjs +49 -0
  239. package/src/ui/a2ui/types.ts +4 -3
  240. package/src/ui/a2ui/utils/normaliseComponentsToMap.test.ts +102 -0
  241. package/src/ui/a2ui/utils/resolveChildIds.test.ts +63 -0
  242. package/src/ui/a2ui/utils/resolveDynamicNumber.test.ts +13 -1
  243. package/src/worker/tools/bash/utils/waitForVMReady.test.ts +40 -0
  244. package/src/worker/tools/email/email.test.ts +193 -8
  245. package/src/worker/tools/email/utils/asEmailAttachmentInputs.test.ts +47 -0
  246. package/src/worker/tools/git/git.test.ts +214 -3
  247. package/src/worker/tools/rooms/invite-to-room.test.ts +54 -0
  248. package/src/worker/tools/rooms/leave-room.test.ts +40 -0
  249. package/src/worker/tools/rooms/list-room-members.test.ts +75 -0
  250. package/src/worker/tools/tasks/tasks-utils.test.ts +22 -0
  251. package/src/worker/tools/ui/ask-user.test.ts +50 -0
  252. package/src/worker/tools/ui/clear-chat.test.ts +19 -0
  253. package/src/worker/tools/ui/get-current-time.test.ts +19 -0
  254. package/src/worker/tools/ui/javascript.test.ts +116 -0
  255. package/src/worker/tools/ui/list-components.test.ts +10 -0
  256. package/src/worker/tools/ui/list-tool-profiles.test.ts +42 -0
  257. package/src/worker/tools/ui/manage-tools.test.ts +34 -0
  258. package/src/worker/tools/ui/render-component.test.ts +346 -0
  259. package/src/worker/tools/ui/send-notification.test.ts +40 -0
  260. package/src/worker/tools/ui/utils/getAllowFullInternetAccess.test.ts +31 -0
  261. package/src/worker/tools/ui/utils/parseBooleanConfig.test.ts +25 -0
  262. package/src/worker/tools/workspace/attach-file.test.ts +84 -0
  263. package/src/worker/tools/workspace/copy-file.test.ts +69 -0
  264. package/src/worker/tools/workspace/create-directory.test.ts +40 -0
  265. package/src/worker/tools/workspace/delete-file.test.ts +73 -0
  266. package/src/worker/tools/workspace/diff-files.test.ts +94 -0
  267. package/src/worker/tools/workspace/list-files.test.ts +36 -0
  268. package/src/worker/tools/workspace/move-file.test.ts +66 -0
  269. package/src/worker/tools/workspace/open-file.test.ts +57 -0
  270. package/src/worker/tools/workspace/patch-file.test.ts +81 -0
  271. package/src/worker/tools/workspace/read-file.test.ts +116 -0
  272. package/src/worker/tools/workspace/send-file.test.ts +82 -0
  273. package/src/worker/tools/workspace/update-memory.test.ts +29 -0
  274. package/src/worker/tools/workspace/write-file.test.ts +28 -0
  275. package/src/worker/utils/rate-limit.test.ts +199 -0
  276. package/src/worker/utils/tool-state.test.ts +29 -0
  277. package/src/worker/utils/transformers-js-utils.test.ts +59 -0
  278. package/dist/public/config-AL77QAx4.js +0 -1
  279. package/dist/public/downloadGroupFile-BABv_1mJ.js +0 -1
  280. package/dist/public/file-viewer-CCSABMsE.js +0 -1
  281. package/dist/public/mcp-reconnect-DoicazQd.js +0 -1
  282. package/dist/public/orchestrator-4su7iyWj.js +0 -15
  283. package/dist/public/shadow-claw-dialog-ByyHgxM9.js +0 -1
  284. package/dist/public/shadow-claw-file-viewer-9Qkwc30T.js +0 -577
  285. package/dist/public/shadow-claw-files-aDyq6Hv7.js +0 -781
  286. package/dist/public/shadow-claw-storage-Cf31np81.js +0 -202
@@ -1,4 +1,4 @@
1
- import{i as e,n as t,r as n,t as r}from"./rolldown-runtime-aKtaBQYM.js";const i=new class{loading=!1;models=new Map;getModelInfo(e){return this.models.get(e.toLowerCase())??null}registerModelInfo(e,t){this.models.set(e.toLowerCase(),t)}clear(){this.models.clear()}async fetchModelInfo(e,t,n){if(e.modelsUrl){this.loading=!0;try{let r=new Headers;if(r.set(`Content-Type`,`application/json`),e.headers)for(let[t,n]of Object.entries(e.headers))r.set(t,n);if(n)for(let[e,t]of Object.entries(n))r.set(e,t);if(t&&e.apiKeyHeader){let n=e.apiKeyHeaderFormat;r.set(e.apiKeyHeader,n?n.replace(`{key}`,t):t)}let i=await fetch(e.modelsUrl,{headers:r});if(!i.ok)throw Error(`HTTP ${i.status} ${i.statusText}`);let a=await i.json(),o=Array.isArray(a.data)?a.data:Array.isArray(a.models)?a.models:[];for(let e of o){if(!e.id)continue;let t=e.context_length??e.context_window??0,n=e.max_completion_tokens||e.per_request_limits?.completion_tokens||e.top_provider?.max_completion_tokens||null,r=typeof e.supports_tools==`boolean`?e.supports_tools:typeof e.supportsTools==`boolean`?e.supportsTools:void 0,i=this.extractModalities(e,`input`),a=this.extractModalities(e,`output`),o=this.modalitiesInclude(i,`image`,`vision`),s=this.modalitiesInclude(i,`audio`,`voice`,`hearing`),c=this.modalitiesInclude(i,`video`),l=e.id===`openrouter/free`||this.supportedParametersInclude(e,`image`,`vision`,`audio`,`tool`,`structured`),u=this.extractReasoning(e);!t&&Array.isArray(e.providers)&&e.providers.length>0&&(t=e.providers[0]?.context_length||0),this.registerModelInfo(e.id,{contextWindow:t,maxOutput:n,...r!==void 0&&{supportsTools:r},...i.length>0&&{inputModalities:i},...a.length>0&&{outputModalities:a},...o!==void 0&&{supportsImageInput:o},...s!==void 0&&{supportsAudioInput:s},...c!==void 0&&{supportsVideoInput:c},...u&&{reasoning:u},...l&&{routesByRequestFeatures:l}})}o.length>0&&console.log(`[ModelRegistry] Registered ${o.length} models for provider "${e.id}"`)}catch(t){console.error(`[ModelRegistry] Error fetching models for ${e.id}:`,t)}finally{this.loading=!1}}}extractModalities(e,t){let n=t===`input`?e.input_modalities||e.inputModalities:e.output_modalities||e.outputModalities,r=e.architecture||{},i=t===`input`?r.input_modalities||r.inputModalities:r.output_modalities||r.outputModalities,a=typeof r.modality==`string`?r.modality:``,o=this.parseArchitectureModality(a,t),s=[...this.normalizeStringArray(n),...this.normalizeStringArray(i),...o];return Array.from(new Set(s))}extractReasoning(e){let t=e?.reasoning;if(!t||typeof t!=`object`)return;let n=this.normalizeStringArray(t.supported_efforts),r=typeof t.default_effort==`string`?t.default_effort.toLowerCase():void 0,i=typeof t.default_enabled==`boolean`?t.default_enabled:void 0,a=typeof t.supports_max_tokens==`boolean`?t.supports_max_tokens:void 0,o=typeof t.mandatory==`boolean`?t.mandatory:void 0;if(!(n.length===0&&r===void 0&&i===void 0&&a===void 0&&o===void 0))return{...n.length>0&&{supportedEfforts:n},...r!==void 0&&{defaultEffort:r},...i!==void 0&&{defaultEnabled:i},...a!==void 0&&{supportsMaxTokens:a},...o!==void 0&&{mandatory:o}}}modalitiesInclude(e,...t){if(e.length!==0)return t.some(t=>e.some(e=>e.includes(t)))}normalizeStringArray(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`).map(e=>e.toLowerCase()):[]}parseArchitectureModality(e,t){if(!e)return[];let[n=``,r=``]=e.toLowerCase().split(`->`).map(e=>e.trim());return(t===`input`?n:r).split(/[+,/\s]+/).map(e=>e.trim()).filter(Boolean)}supportedParametersInclude(e,...t){let n=this.normalizeStringArray(e.supported_parameters||e.supportedParameters);return t.some(e=>n.some(t=>t.includes(e)))}};function a(e){return e.replace(/^\/+|\/+$/g,``)}function o(e){let t=a(e);return t.endsWith(`/index.html`)?t=t.slice(0,-11):t.endsWith(`index.html`)&&(t=t.slice(0,-10)),a(t)}function s(e){let t=a(e),n=t.split(`/`).filter(Boolean);if(n.length===0)return null;let r=n[0].toLowerCase();if(r===`pages`){if(n.length>=3){let e=n[1];return{page:`pages`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:n.slice(2).join(`/`)}}return{page:`pages`,groupId:`br:main`,path:n.slice(1).join(`/`)}}if(r===`files`){let e=n[1]||`main`;return{page:`files`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:n.slice(2).join(`/`)||void 0}}if(r===`chat`){let e=n[1]||`main`;return{page:`chat`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}if(r===`tasks`){let e=n[1]||`main`;return{page:`tasks`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}return r===`main`?{page:`pages`,groupId:`br:main`,path:n.slice(1).join(`/`)}:{page:`pages`,groupId:`br:main`,path:t}}function c(){if(typeof document<`u`){let e=document.getElementById(`shadow-claw-static-routing`);if(e&&e.textContent)try{let t=JSON.parse(e.textContent);if(t&&typeof t==`object`&&t.routes)return t}catch(e){console.warn(`Failed to parse embedded static routing manifest:`,e)}}return null}function l(e,t){let n=t||c();if(!n||!n.routes)return null;let r=o(e);if(!r)return null;for(let[e,t]of Object.entries(n.routes))if(!(!t||!t.prettyPath)&&o(t.prettyPath)===r)return s(e);return null}let u=null;const d=new Set([`chat`,`files`,`tasks`,`pages`,`settings`,`tools`,`channels`]);function f(){u=null}typeof globalThis<`u`&&(globalThis.__applyBasePathCacheReset=f);function p(){let e=typeof window<`u`?window:typeof self<`u`?self:globalThis;if(e&&e.__SHADOWCLAW_DEPLOY_ID__){let t=String(e.__SHADOWCLAW_DEPLOY_ID__).trim();if(t)return t.replace(/[^a-zA-Z0-9_-]/g,`-`)}let t=globalThis.process;if(t&&t.env&&t.env.SHADOWCLAW_DEPLOY_ID){let e=String(t.env.SHADOWCLAW_DEPLOY_ID).trim();if(e)return e.replace(/[^a-zA-Z0-9_-]/g,`-`)}let n=m();return!n||n===`/`?``:n.replace(/^\/+|\/+$/g,``).replace(/[^a-zA-Z0-9_-]/g,`-`)}function m(){if(u!==null)return u;if((typeof window>`u`||globalThis.WorkerGlobalScope!==void 0&&typeof self<`u`&&self instanceof globalThis.WorkerGlobalScope)&&typeof self<`u`&&self.location){let e=(self.location.pathname||`/`).split(`/`).filter(Boolean);if(e.length<=1)return u=`/`,u;let t=e[0].toLowerCase(),n=t===`service-worker.js`||t===`sw.js`||t===`manifest.json`||t===`sitemap.xml`||t===`favicon.ico`||t===`index.html`||t===`service-worker`||t===`assets`||t===`dist`||t===`public`;if(n&&e.length===2)return u=`/`,u;if(!n)return u=`/`+e[0]+`/`,u}let e=typeof window<`u`&&window.location?window.location:typeof self<`u`&&self.location?self.location:null;if(!e)return`/`;if(typeof document<`u`&&typeof document.querySelector==`function`){let t=document.querySelector(`base[href]`);if(t){let n=t.getAttribute(`href`);if(n)try{let t=new URL(n,e.origin).pathname;return t.endsWith(`/`)||(t+=`/`),u=t,u}catch{}}}let t=e.pathname||`/`;if(t===`/`)return u=`/`,u;let n=t.split(`/`).filter(Boolean),r=n.findIndex(e=>d.has(e.toLowerCase()));return r>=0?r===0?(u=`/`,u):(u=`/`+n.slice(0,r).join(`/`)+`/`,u):l(t)?(u=`/`,u):n.length===1&&!t.includes(`.`)?(u=`/`+n[0]+`/`,u):(u=`/`,u)}function h(e){let t=m();if(t===`/`)return e;let[n,...r]=e.split(/(?=[?#])/);if(n===t||n.startsWith(t))return e;let i=t+(n.startsWith(`/`)?n.slice(1):n);return i=i.replace(/\/{2,}/g,`/`),i+r.join(``)}function g(e){let t=e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);return RegExp(`(^|\\s)@${t}\\b`,`i`)}g(`ShadowClaw`);const _=8192,v=[{pattern:`claude-fable-5`,maxTokens:128e3},{pattern:`claude-sonnet-5`,maxTokens:128e3},{pattern:`claude-opus-5`,maxTokens:128e3},{pattern:`claude-opus-4-8`,maxTokens:128e3},{pattern:`claude-opus-4`,maxTokens:128e3},{pattern:`claude-sonnet-4`,maxTokens:64e3},{pattern:`claude-haiku-4`,maxTokens:64e3},{pattern:`claude-3-5`,maxTokens:8192},{pattern:`claude-3`,maxTokens:4096},{pattern:`gpt-5`,maxTokens:128e3},{pattern:`gpt-4o`,maxTokens:16384},{pattern:`gpt-4.1`,maxTokens:32768},{pattern:`gpt-4-turbo`,maxTokens:4096},{pattern:`gpt-4`,maxTokens:8192},{pattern:`gpt-3.5`,maxTokens:4096},{pattern:`qwen-2.5`,maxTokens:32768},{pattern:`Qwen3.5`,maxTokens:32768},{pattern:`qwen3.5`,maxTokens:32768},{pattern:`Qwen3`,maxTokens:32768},{pattern:`qwen3`,maxTokens:32768},{pattern:`gemma-4`,maxTokens:16384},{pattern:`gemini-nano`,maxTokens:4096},{pattern:`phi-mini`,maxTokens:9216},{pattern:`aion`,maxTokens:9216},{pattern:`gemma-3-1b-it-ONNX-GQA`,maxTokens:32768},{pattern:`gemma-3-1b-it-ONNX`,maxTokens:32768},{pattern:`gemma-3`,maxTokens:32768},{pattern:`Qwen3-0.6B-ONNX`,maxTokens:32768},{pattern:`Qwen3.5`,maxTokens:32768},{pattern:`Llama-3.2`,maxTokens:32768},{pattern:`SmolLM`,maxTokens:8192},{pattern:`DeepSeek-R1`,maxTokens:32768},{pattern:`Phi-4`,maxTokens:16384},{pattern:`Phi-3.5`,maxTokens:16384},{pattern:`LFM2`,maxTokens:16384},{pattern:`gpt-oss`,maxTokens:32768},{pattern:`browser-built-in`,maxTokens:4096},{pattern:`mesh`,maxTokens:32768},{pattern:`openrouter/free`,maxTokens:32768},{pattern:`qwen3:8b`,maxTokens:4096},{pattern:`llama3:8b`,maxTokens:8192}];function y(e){if(!e)return _;let t=i.getModelInfo(e);if(t){if(typeof t.maxOutput==`number`){let e=t.contextWindow?Math.max(8192,Math.floor(t.contextWindow/2)):32768;return Math.min(t.maxOutput,e)}if(t.contextWindow){let e;return e=t.contextWindow>=2e5?131072:t.contextWindow>=1e5?65536:32768,Math.min(e,Math.floor(t.contextWindow/2))}}for(let{pattern:t,maxTokens:n}of v)if(e.includes(t))return n;return _}const b=1800,x=`shadowclaw`;function S(){let e=p();return e?`shadowclaw-${e}`:x}S();const C=`shadowclaw`,w=`br:main`,T={github:{providerId:`github`,name:`GitHub`,aliases:[`github`,`api.github.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`,`git_remote`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`token `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://github.com/login/oauth/authorize`,tokenUrl:`https://github.com/login/oauth/access_token`,defaultScopes:[`repo`,`read:user`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},gitlab:{providerId:`gitlab`,name:`GitLab`,aliases:[`gitlab`,`gitlab.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`,`git_remote`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`PRIVATE-TOKEN`,headerPrefix:``},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},tokenAuthByServiceType:{git_remote:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}}},oauth:{authorizeUrl:`https://gitlab.com/oauth/authorize`,tokenUrl:`https://gitlab.com/oauth/token`,defaultScopes:[`read_api`,`read_user`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},figma:{providerId:`figma`,name:`Figma`,aliases:[`figma`,`api.figma.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`X-Figma-Token`,headerPrefix:``},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://www.figma.com/oauth`,tokenUrl:`https://api.figma.com/v1/oauth/token`,refreshUrl:`https://api.figma.com/v1/oauth/refresh`,defaultScopes:[],usePkce:!0,clientAuthMethod:`basic_header`,scopeSeparator:`space`}},notion:{providerId:`notion`,name:`Notion`,aliases:[`notion`,`api.notion.com`,`notion.so`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://api.notion.com/v1/oauth/authorize`,tokenUrl:`https://api.notion.com/v1/oauth/token`,defaultScopes:[],usePkce:!0,clientAuthMethod:`basic_header`,scopeSeparator:`space`}},microsoft_graph:{providerId:`microsoft_graph`,name:`Microsoft Graph`,aliases:[`microsoft`,`graph.microsoft.com`,`microsoft_graph`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/authorize`,tokenUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/token`,defaultScopes:[`openid`,`profile`,`offline_access`,`User.Read`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},yahoo_mail:{providerId:`yahoo_mail`,name:`Yahoo Mail`,aliases:[`yahoo`,`yahoo_mail`,`mail.yahoo.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://api.login.yahoo.com/oauth2/request_auth`,tokenUrl:`https://api.login.yahoo.com/oauth2/get_token`,defaultScopes:[`mail-r`,`mail-w`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},google:{providerId:`google`,name:`Google`,aliases:[`google`,`googleapis.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://accounts.google.com/o/oauth2/v2/auth`,tokenUrl:`https://oauth2.googleapis.com/token`,defaultScopes:[`openid`,`profile`,`email`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},atlassian:{providerId:`atlassian`,name:`Atlassian`,aliases:[`atlassian`,`api.atlassian.com`],modes:[`oauth`,`token`,`basic`],defaultMode:`basic`,serviceTypes:[`http_api`,`git_remote`],authTypes:[`token`,`oauth`,`basic_userpass`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `},basic:{headerName:`Authorization`,headerPrefix:`Basic `}},oauth:{authorizeUrl:`https://auth.atlassian.com/authorize`,tokenUrl:`https://auth.atlassian.com/oauth/token`,defaultScopes:[],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},slack:{providerId:`slack`,name:`Slack`,aliases:[`slack`,`slack.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://slack.com/oauth/v2/authorize`,tokenUrl:`https://slack.com/api/oauth.v2.access`,defaultScopes:[],usePkce:!1,clientAuthMethod:`request_body`,scopeSeparator:`comma`}},linear:{providerId:`linear`,name:`Linear`,aliases:[`linear`,`api.linear.app`,`linear.app`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://linear.app/oauth/authorize`,tokenUrl:`https://api.linear.app/oauth/token`,defaultScopes:[],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},azure_devops:{providerId:`azure_devops`,name:`Azure DevOps`,aliases:[`azure_devops`,`dev.azure.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`,`git_remote`],authTypes:[`token`,`oauth`,`basic_userpass`,`ssh_key`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},tokenAuthByServiceType:{git_remote:{token:{headerName:`Authorization`,headerPrefix:`Basic `},oauth:{headerName:`Authorization`,headerPrefix:`Basic `}}},oauth:{authorizeUrl:`https://app.vssps.visualstudio.com/oauth2/authorize`,tokenUrl:`https://app.vssps.visualstudio.com/oauth2/token`,defaultScopes:[`vso.code`,`vso.profile`,`offline_access`],usePkce:!1,clientAuthMethod:`request_body`,scopeSeparator:`space`}},custom_mcp:{providerId:`custom_mcp`,name:`Custom MCP`,aliases:[`custom_mcp`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`mcp_remote`,`webmcp_local`],authTypes:[`none`,`token`,`oauth`,`custom_header`,`ssh_key`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://example.com/oauth/authorize`,tokenUrl:`https://example.com/oauth/token`,defaultScopes:[],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}}},E=Object.fromEntries(Object.values(T).filter(e=>!!e.oauth).map(e=>{let t=e.oauth;return[e.providerId,{id:e.providerId,name:e.name,authorizeUrl:t.authorizeUrl,tokenUrl:t.tokenUrl,redirectUri:t.redirectUri,defaultScopes:t.defaultScopes,usePkce:t.usePkce,clientAuthMethod:t.clientAuthMethod,scopeSeparator:t.scopeSeparator}]}));Object.fromEntries(Object.values(T).map(e=>[e.providerId,{providerId:e.providerId,modes:e.modes,defaultMode:e.defaultMode}]));const D={openrouter:{id:`openrouter`,name:`OpenRouter`,baseUrl:`https://openrouter.ai/api/v1/chat/completions`,format:`openai`,apiKeyHeader:`Authorization`,apiKeyHeaderFormat:`Bearer {key}`,headers:{"HTTP-Referer":`https://xt-ml.github.io/shadow-claw/`,"X-OpenRouter-Title":`ShadowClaw`},defaultModel:`openrouter/free`,modelsUrl:`https://openrouter.ai/api/v1/models`,requiresApiKey:!0,supportsStreaming:!0,reasoningParam:`reasoning`},huggingface:{id:`huggingface`,name:`HuggingFace`,baseUrl:`https://router.huggingface.co/v1/chat/completions`,format:`openai`,apiKeyHeader:`Authorization`,apiKeyHeaderFormat:`Bearer {key}`,headers:{},defaultModel:`meta-llama/Llama-3.1-8B-Instruct`,modelsUrl:`https://router.huggingface.co/v1/models`,requiresApiKey:!0,supportsStreaming:!0},bedrock_proxy:{id:`bedrock_proxy`,name:`AWS Bedrock (Local Proxy)`,baseUrl:`http://localhost:8888/bedrock-proxy/invoke`,format:`anthropic`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`anthropic.claude-sonnet-4-6-v1:0`,modelsUrl:`http://localhost:8888/bedrock-proxy/models`,requiresApiKey:!1,supportsStreaming:!0,reasoningParam:`thinking`},gemini_proxy:{id:`gemini_proxy`,name:`Gemini (Local Proxy)`,baseUrl:`http://localhost:8888/gemini-proxy/chat/completions`,format:`openai`,apiKeyHeader:`x-goog-api-key`,headers:{},defaultModel:`gemini-2.0-flash`,modelsUrl:`http://localhost:8888/gemini-proxy/models`,requiresApiKey:!0,supportsStreaming:!0,reasoningParam:`thinkingConfig`},vertex_ai:{id:`vertex_ai`,name:`Vertex AI (Local Proxy)`,baseUrl:`http://localhost:8888/vertex-ai-proxy/chat/completions`,format:`openai`,apiKeyHeader:`x-vertex-project`,headers:{},defaultModel:`gemini-2.5-flash`,modelsUrl:`http://localhost:8888/vertex-ai-proxy/models`,requiresApiKey:!0,supportsStreaming:!0,reasoningParam:`thinkingConfig`},"mesh-llm":{id:`mesh-llm`,name:`Mesh LLM (Local Proxy)`,baseUrl:`http://localhost:8888/mesh-llm-proxy/chat/completions`,format:`mesh-llm`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`mesh`,modelsUrl:`http://localhost:8888/mesh-llm-proxy/models`,requiresApiKey:!1,supportsStreaming:!0},ollama:{id:`ollama`,name:`Ollama (Local Proxy)`,baseUrl:`http://localhost:8888/ollama-proxy/chat/completions`,format:`openai`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`qwen3:8b`,modelsUrl:`http://localhost:8888/ollama-proxy/models`,requiresApiKey:!1,supportsStreaming:!0},llamafile:{id:`llamafile`,name:`Llamafile (Local Proxy)`,baseUrl:`http://localhost:8888/llamafile-proxy/chat/completions`,format:`openai`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`Qwen3.5-9B-Q5_K_S`,modelsUrl:`http://localhost:8888/llamafile-proxy/models`,requiresApiKey:!1,supportsStreaming:!0},transformers_js_local:{id:`transformers_js_local`,name:`Transformers.js (Local Proxy)`,baseUrl:`http://localhost:8888/transformers-js-proxy/chat/completions`,format:`openai`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`onnx-community/Qwen3-0.6B-ONNX`,modelsUrl:`http://localhost:8888/transformers-js-proxy/models`,models:[`onnx-community/DeepSeek-R1-Distill-Qwen-1.5B-ONNX`,`onnx-community/gemma-3-1b-it-ONNX-GQA`,`onnx-community/gemma-3-1b-it-ONNX`,`onnx-community/gemma-4-E2B-it-ONNX`,`onnx-community/gemma-4-E2B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-E4B-it-ONNX`,`onnx-community/gemma-4-E4B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-E9B-it-ONNX`,`onnx-community/gemma-4-12B-it-ONNX`,`onnx-community/gemma-4-12B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-E27B-it-ONNX`,`onnx-community/gpt-oss-20b-ONNX`,`onnx-community/LFM2-1.2B-ONNX`,`onnx-community/Llama-3.2-1B-Instruct-ONNX`,`onnx-community/Llama-3.2-3B-Instruct-ONNX`,`onnx-community/Phi-3.5-mini-instruct-onnx-web`,`onnx-community/Phi-4-mini-instruct-ONNX`,`onnx-community/Qwen3-0.6B-ONNX`,`onnx-community/Qwen3.5-0.8B-ONNX-OPT`,`onnx-community/Qwen3.5-4B-ONNX-OPT`,`HuggingFaceTB/SmolLM3-3B-ONNX`,`LiquidAI/LFM2.5-1.2B-Thinking-ONNX`,`webgpu/Qwen3-4B-ONNX`],requiresApiKey:!1,supportsStreaming:!0},transformers_js_browser:{id:`transformers_js_browser`,name:`Transformers.js (Browser)`,baseUrl:`local://transformers-js`,format:`transformers_js`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`onnx-community/Qwen3-0.6B-ONNX`,modelsUrl:`https://huggingface.co/api/models?author=onnx-community`,models:[`onnx-community/Qwen3-0.6B-ONNX`,`onnx-community/gemma-3-1b-it-ONNX`,`onnx-community/gemma-3-1b-it-ONNX-GQA`,`onnx-community/gemma-4-E2B-it-ONNX`,`onnx-community/gemma-4-E4B-it-ONNX`,`onnx-community/gemma-4-E9B-it-ONNX`,`onnx-community/gemma-4-E27B-it-ONNX`,`onnx-community/gemma-4-12B-it-ONNX`,`onnx-community/gemma-4-E2B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-E4B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-12B-it-qat-mobile-ONNX`,`onnx-community/Phi-3.5-mini-instruct-onnx-web`,`onnx-community/Phi-4-mini-instruct-ONNX`,`onnx-community/Llama-3.2-1B-Instruct-ONNX`,`onnx-community/Llama-3.2-3B-Instruct-ONNX`,`webgpu/Qwen3-4B-ONNX`,`onnx-community/DeepSeek-R1-Distill-Qwen-1.5B-ONNX`,`onnx-community/gpt-oss-20b-ONNX`,`onnx-community/LFM2-1.2B-ONNX`,`LiquidAI/LFM2.5-1.2B-Thinking-ONNX`,`HuggingFaceTB/SmolLM3-3B-ONNX`,`onnx-community/Qwen3.5-0.8B-ONNX-OPT`,`onnx-community/Qwen3.5-4B-ONNX-OPT`],requiresApiKey:!1,supportsStreaming:!1},litert_lm_browser:{id:`litert_lm_browser`,name:`LiteRT-LM (Browser)`,baseUrl:`local://litert-lm`,format:`transformers_js`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`litert-community/gemma-4-E2B-it-litert-lm`,models:[`litert-community/gemma-4-E2B-it-litert-lm`,`litert-community/gemma-4-E4B-it-litert-lm`],requiresApiKey:!1,supportsStreaming:!1},prompt_api:{id:`prompt_api`,name:`Prompt API (Browser)`,baseUrl:`builtin://language-model`,format:`prompt_api`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`browser-built-in`,models:[`browser-built-in`],requiresApiKey:!1,supportsStreaming:!1}};function O(e){return D[e]||null}function ee(e){return`api_key:${e}`}function k(e){return T[e]||null}function A(e,t,n=`http_api`){let r=k(e);return r&&(r.tokenAuthByServiceType?.[n]?.[t]||r.tokenAuth[t])||null}const j={ACTIVE_TOOL_PROFILE:`active_tool_profile`,ACTIVITY_LOG_DISK_LOGGING_ENABLED:`activity_log_disk_logging_enabled`,ALLOWED_CUSTOM_ELEMENTS:`allowed_custom_elements`,ALLOWED_CUSTOM_ELEMENT_HOST_PATTERNS:`allowed_custom_element_host_patterns`,ALLOWED_IFRAME_HOST_PATTERNS:`allowed_iframe_host_patterns`,API_KEY:`api_key`,ASSISTANT_NAME:`assistant_name`,BEDROCK_AUTH_MODE:`bedrock_auth_mode`,BEDROCK_PROFILE_FALLBACK:`bedrock_profile_fallback`,BEDROCK_REGION_FALLBACK:`bedrock_region_fallback`,BUILTIN_AI_SUBAGENT_ROUTING:`builtin_ai_subagent_routing`,BUILTIN_AI_TOOLS_BACKEND:`builtin_ai_tools_backend`,CHANNEL_ENABLED_PREFIX:`channel_enabled:`,CHAT_INPUT_AREA_HEIGHT:`chat_input_area_height`,CHAT_SPLIT_VIEW_ENABLED:`chat_split_view_enabled`,CHAT_SPLIT_VIEW_HEIGHT:`chat_split_view_height`,COMPACTION_ENGINE_PREFERENCE:`compaction_engine_preference`,CONTEXT_COMPRESSION_ENABLED:`context_compression_enabled`,CONVERSATIONS_HEIGHT:`conversations_height`,CUSTOM_TOOLS:`custom_tools`,DB_MIGRATED_FROM_LEGACY:`db_migrated_from_legacy`,DECLARATIVE_TOOLS_ENABLED:`declarative_tools_enabled`,DEFAULT_PINNED_PAGE:`default_pinned_page`,DIRECT_TOOL_COMMAND_POLICY:`direct_tool_command_policy`,ENABLED_TOOLS:`enabled_tools`,GIT_ACCOUNTS:`git_accounts`,GIT_AUTHOR_EMAIL:`git_author_email`,GIT_AUTHOR_NAME:`git_author_name`,GIT_CORS_PROXY:`git_cors_proxy`,GIT_DEFAULT_ACCOUNT:`git_default_account`,GIT_PASSWORD:`git_password`,GIT_PROXY_URL:`git_proxy_url`,GIT_TOKEN:`git_token`,GIT_USERNAME:`git_username`,IMESSAGE_API_KEY:`imessage_api_key`,IMESSAGE_CHAT_IDS:`imessage_chat_ids`,IMESSAGE_SERVER_URL:`imessage_server_url`,INTEGRATION_CONNECTIONS:`integration_connections`,MARKDOWN_FRONTMATTER_CHAT:`markdown_frontmatter_chat`,MARKDOWN_FRONTMATTER_FILE_VIEWER:`markdown_frontmatter_file_viewer`,MARKDOWN_FRONTMATTER_PAGES:`markdown_frontmatter_pages`,MARKDOWN_FRONTMATTER_TASKS:`markdown_frontmatter_tasks`,LAST_ACTIVE_GROUP:`last_active_group`,LAST_ACTIVE_PAGE:`last_active_page`,LAST_SELECTED_PINNED_PAGE:`last_selected_pinned_page`,LLAMAFILE_HOST:`llamafile_host`,LLAMAFILE_MODE:`llamafile_mode`,LLAMAFILE_OFFLINE:`llamafile_offline`,LLAMAFILE_PORT:`llamafile_port`,MAIN_GROUP_INDEX_SUPPRESSED:`main_group_index_suppressed`,MAIN_GROUP_README_SUPPRESSED:`main_group_readme_suppressed`,MAX_ITERATIONS:`max_iterations`,MAX_TOKENS:`max_tokens`,MESH_LLM_HOST:`mesh_llm_host`,MODEL:`model`,OAUTH_PROVIDER_DEFINITIONS:`oauth_provider_definitions`,OVERRIDE_PRERENDER_SKELETON:`override_prerender_skeleton`,PAGES_AUTO_REFRESH_INTERVAL:`pages_auto_refresh_interval`,PAGES_LIST:`pages_list`,PASSPHRASE_SALT:`passphrase_salt`,PASSPHRASE_VERIFY:`passphrase_verify`,PROMPT_API_BACKEND:`prompt_api_backend`,PROMPT_API_DTYPE_STRATEGY:`prompt_api_dtype_strategy`,PROMPT_API_FALLBACK_MODEL:`prompt_api_fallback_model`,PROMPT_API_ONBOARDING_SEEN:`prompt_api_onboarding_seen`,PEERJS_MY_ALIAS:`peerjs_my_alias`,PEERJS_MY_PEER_ID:`peerjs_my_peer_id`,PEERJS_PEER_ALIASES:`peerjs_peer_aliases`,PEERJS_SERVER_HOST:`peerjs_server_host`,PEERJS_SERVER_PATH:`peerjs_server_path`,PEERJS_SERVER_PORT:`peerjs_server_port`,PEERJS_SERVER_SECURE:`peerjs_server_secure`,PEERJS_TRUSTED_PEER_IDS:`peerjs_trusted_peer_ids`,PROVIDER:`provider`,PROXY_URL:`proxy_url`,PUSH_PROXY_URL:`push_proxy_url`,RATE_LIMIT_AUTO_ADAPT:`rate_limit_auto_adapt`,RATE_LIMIT_CALLS_PER_MINUTE:`rate_limit_calls_per_minute`,REASONING_EFFORT:`reasoning_effort`,REMOTE_MCP_CONNECTIONS:`remote_mcp_connections`,SERVICE_ACCOUNTS:`service_accounts`,SERVICE_DEFAULT_ACCOUNT:`service_default_account`,SIDEBAR_CHAT_HIDDEN:`sidebar_chat_hidden`,SIDEBAR_DEFAULT_PAGE:`sidebar_default_page`,SIDEBAR_FILES_HIDDEN:`sidebar_files_hidden`,SIDEBAR_PAGES_HIDDEN:`sidebar_pages_hidden`,SIDEBAR_TASKS_HIDDEN:`sidebar_tasks_hidden`,SIDEBAR_WIDTH:`sidebar_width`,SITE_CONFIG_SEEDED:`site_config_seeded`,STATIC_MAIN_SITE_SEEDED:`static_main_site_seeded`,STORAGE_HANDLE:`storage_handle`,SUBSCRIBER_ID:`subscriber_id`,STREAMING_ENABLED:`streaming_enabled`,SUBAGENT_MAX_PARALLEL:`subagent_max_parallel`,SUBAGENT_WORKSPACE_MODE:`subagent_workspace_mode`,SUPPRESSED_PAGES_LIST:`suppressed_pages_list`,SYSTEM_PROMPT_OVERRIDE:`system_prompt_override`,TASK_SERVER_ENABLED:`task_server_enabled`,TASK_SERVER_URL:`task_server_url`,TASK_SYNC_OUTBOX:`task_sync_outbox`,TELEGRAM_BOT_TOKEN:`telegram_bot_token`,TELEGRAM_CHAT_IDS:`telegram_chat_ids`,TELEGRAM_USE_PROXY:`telegram_use_proxy`,TOOL_PROFILES:`tool_profiles`,TRANSFORMERS_JS_BACKEND:`transformers_js_backend`,TRANSFORMERS_JS_DTYPE_STRATEGY:`transformers_js_dtype_strategy`,TRIGGER_PATTERN:`trigger_pattern`,USE_PROXY:`use_proxy`,VAPID_SUBJECT:`vapid_subject`,VM_BASH_FULL_INTERNET_ACCESS:`vm_bash_full_internet_access`,VM_BASH_TIMEOUT_SEC:`vm_bash_timeout_sec`,VM_BOOT_HOST:`vm_boot_host`,VM_BOOT_MODE:`vm_boot_mode`,VM_NETWORK_RELAY_URL:`vm_network_relay_url`,WEBMCP_MODE:`webmcp_mode`,WEBMCP_TOOLS_ENABLED:`webmcp_tools_enabled`,WEB_SEARCH_PROXY_URL:`web_search_proxy_url`,WEB_SEARCH_URL:`web_search_url`,WEB_SEARCH_USE_PROXY:`web_search_use_proxy`,SEARCH_FILES_MAX_FILE_BYTES:`search_files_max_file_bytes`,SEARCH_FILES_MAX_FILES_VISITED:`search_files_max_files_visited`,SEARCH_FILES_SKIP_DIRS:`search_files_skip_dirs`},te=`localhost`,ne=8888;let re=null,M=null;const N=new Promise(e=>{M=e});function ie(){return re?Promise.resolve(re):N}function P(e){if(!e)throw Error(`Database not initialized`);re=e,M&&=(M(e),null)}function ae(e,t,n,r){return e?new Promise((i,a)=>{try{let o=e.transaction(t,n);if(!o)return a(Error(`failed to get transaction`));let s=r(o.objectStore(t));s.onsuccess=()=>i(s.result),s.onerror=()=>a(s.error)}catch(e){a(e)}}):Promise.reject(Error(`failed to get database, cannot update task.`))}function F(e,t){return ae(e,`config`,`readonly`,e=>e.get(t)).then(e=>e?.value)}async function oe(e,...t){let n=e;for(let e of t){let t=await n.getDirectoryHandle(e,{create:!0});if(typeof n.isSameEntry==`function`&&await n.isSameEntry(t))throw Error(`Directory navigation failed: "${e}" resolved to the same directory as its parent. The stored directory handle may be stale — try re-selecting the storage folder.`);n=t}return n}var se=t({MemoryDirectoryHandle:()=>pe,MemoryFileHandle:()=>fe,MemorySyncAccessHandle:()=>ue,MemoryWritableStream:()=>de,getMemoryOpfsRoot:()=>he});function ce(e,t){if(typeof DOMException<`u`)try{return new DOMException(e,t)}catch{}let n=Error(e);return n.name=t,n}function le(e){let t=e();return t[Symbol.asyncDispose??Symbol.for(`Symbol.asyncDispose`)]=async()=>{},t}var ue=class{_file;_closed=!1;constructor(e){this._file=e}close(){this._closed=!0}flush(){}getSize(){if(this._closed)throw ce(`SyncAccessHandle is closed`,`InvalidStateError`);return this._file.getRawData().byteLength}read(e,t){if(this._closed)throw ce(`SyncAccessHandle is closed`,`InvalidStateError`);let n=this._file.getRawData(),r=t?.at??0;if(r>=n.byteLength)return 0;let i=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),a=n.subarray(r,r+i.byteLength);return i.set(a),a.byteLength}write(e,t){if(this._closed)throw ce(`SyncAccessHandle is closed`,`InvalidStateError`);let n=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),r=t?.at??0,i=this._file.getRawData(),a=r+n.byteLength,o;return a>i.byteLength?(o=new Uint8Array(a),o.set(i)):o=new Uint8Array(i),o.set(n,r),this._file.setRawData(o),n.byteLength}truncate(e){if(this._closed)throw ce(`SyncAccessHandle is closed`,`InvalidStateError`);let t=this._file.getRawData(),n=new Uint8Array(e);n.set(t.subarray(0,Math.min(t.byteLength,e))),this._file.setRawData(n)}},de=class{_file;_buffer;_position=0;_length=0;_closed=!1;constructor(e,t=!1){this._file=e;let n=e.getRawData();t?(this._buffer=new Uint8Array(n),this._length=n.byteLength):(this._buffer=new Uint8Array(1024),this._length=0)}async write(e){if(this._closed)throw ce(`WritableStream is closed`,`InvalidStateError`);let t;if(typeof e==`string`)t=new TextEncoder().encode(e);else if(e instanceof Uint8Array)t=e;else if(e instanceof ArrayBuffer)t=new Uint8Array(e);else if(typeof Blob<`u`&&e instanceof Blob)t=typeof e.arrayBuffer==`function`?new Uint8Array(await e.arrayBuffer()):typeof e.text==`function`?new TextEncoder().encode(await e.text()):typeof FileReader<`u`?await new Promise(t=>{let n=new FileReader;n.onload=()=>{t(new Uint8Array(n.result))},n.onerror=()=>t(new Uint8Array),n.readAsArrayBuffer(e)}):new Uint8Array;else if(e&&typeof e==`object`&&`type`in e)if(e.type===`write`){typeof e.position==`number`&&(this._position=e.position);let n=e.data;t=typeof n==`string`?new TextEncoder().encode(n):n instanceof Uint8Array?n:n instanceof ArrayBuffer?new Uint8Array(n):typeof Blob<`u`&&n instanceof Blob&&typeof n.arrayBuffer==`function`?new Uint8Array(await n.arrayBuffer()):new Uint8Array}else if(e.type===`seek`){this._position=e.position??0;return}else if(e.type===`truncate`){this._truncate(e.size??0);return}else t=new Uint8Array;else t=new Uint8Array;let n=this._position+t.length;if(n>this._buffer.length){let e=Math.max(this._buffer.length*2,n,1024),t=new Uint8Array(e);t.set(this._buffer),this._buffer=t}this._buffer.set(t,this._position),this._position+=t.length,this._position>this._length&&(this._length=this._position)}_truncate(e){if(e<this._length)this._length=e;else if(e>this._length){if(e>this._buffer.length){let t=new Uint8Array(e);t.set(this._buffer),this._buffer=t}this._length=e}this._position>e&&(this._position=e)}async seek(e){if(this._closed)throw ce(`WritableStream is closed`,`InvalidStateError`);this._position=e}async truncate(e){if(this._closed)throw ce(`WritableStream is closed`,`InvalidStateError`);this._truncate(e)}async close(){if(this._closed)return;this._closed=!0;let e=this._buffer.slice(0,this._length);this._file.setRawData(e)}async abort(){this._closed=!0}},fe=class{kind=`file`;name;_data;_lastModified;constructor(e,t=new Uint8Array){this.name=e,this._data=t,this._lastModified=Date.now()}getRawData(){return this._data}setRawData(e){this._data=e,this._lastModified=Date.now()}_getArrayBuffer(){let e=new ArrayBuffer(this._data.byteLength);return new Uint8Array(e).set(this._data),e}async getFile(){let e=this._getArrayBuffer(),t=this._data,n=this.name,r=this._lastModified,i={name:n,size:t.byteLength,type:``,lastModified:r,async text(){return new TextDecoder().decode(t)},async arrayBuffer(){return e},slice(n=0,r=t.byteLength){return new Blob([e.slice(n,r)])}};if(typeof File<`u`)try{let t=new File([e],this.name,{lastModified:this._lastModified});return typeof t.text!=`function`&&(t.text=i.text),typeof t.arrayBuffer!=`function`&&(t.arrayBuffer=i.arrayBuffer),t}catch{}return i}async createWritable(e){return new de(this,e?.keepExistingData??!1)}async createSyncAccessHandle(){return new ue(this)}async isSameEntry(e){return this===e}async queryPermission(){return`granted`}async requestPermission(){return`granted`}},pe=class e{kind=`directory`;name;_entries=new Map;constructor(e){this.name=e}_setEntry(e,t){this._entries.set(e,t)}async getDirectoryHandle(t,n){if(t===`.`||t===``)return this;if(t===`..`)throw ce(`Cannot navigate to parent directory with '..'`,`SecurityError`);let r=this._entries.get(t);if(r){if(r.kind===`directory`)return r;throw ce(`"${t}" is a file, not a directory`,`TypeMismatchError`)}if(n?.create){let n=new e(t);return this._entries.set(t,n),n}throw ce(`A requested file or directory could not be found at "${t}"`,`NotFoundError`)}async getFileHandle(e,t){if(e===`.`||e===`..`||e===``)throw ce(`Invalid file name "${e}"`,`TypeMismatchError`);let n=this._entries.get(e);if(n){if(n.kind===`file`)return n;throw ce(`"${e}" is a directory, not a file`,`TypeMismatchError`)}if(t?.create){let t=new fe(e);return this._entries.set(e,t),t}throw ce(`A requested file could not be found at "${e}"`,`NotFoundError`)}async removeEntry(e,t){let n=this._entries.get(e);if(!n)throw ce(`Entry "${e}" not found`,`NotFoundError`);if(n.kind===`directory`&&n._entries.size>0&&!t?.recursive)throw ce(`Directory "${e}" is not empty`,`InvalidModificationError`);this._entries.delete(e)}async resolve(e){if(this===e)return[];for(let[t,n]of this._entries.entries()){if(n===e)return[t];if(n.kind===`directory`){let r=await n.resolve(e);if(r)return[t,...r]}}return null}entries(){let e=this;return le(async function*(){for(let[t,n]of e._entries.entries())yield[t,n]})}values(){let e=this;return le(async function*(){for(let t of e._entries.values())yield t})}keys(){let e=this;return le(async function*(){for(let t of e._entries.keys())yield t})}[Symbol.asyncIterator](){return this.entries()}async isSameEntry(e){return this===e}async queryPermission(){return`granted`}async requestPermission(){return`granted`}};let me=null;function he(){if(!me){let e=new pe(`memory-root`),t=new pe(C);e._setEntry(C,t),me=t}return me}let ge=null;async function I(e,t){try{return await e.entries().next(),`granted`}catch{return t}}function _e(){let e=p();return e?`${C}-${e}`:C}async function ve(){try{if(typeof navigator<`u`&&navigator.storage&&typeof navigator.storage.getDirectory==`function`){let e=await navigator.storage.getDirectory(),t=_e();return await e.getDirectoryHandle(t,{create:!0})}}catch(e){console.warn(`OPFS is unavailable (e.g. Firefox Private Browsing). Using in-memory storage fallback:`,e)}return he()}function ye(e){if(!e||typeof e!=`object`)return!1;let t=globalThis.FileSystemDirectoryHandle;return t!==void 0&&e instanceof t||typeof e.getDirectoryHandle==`function`&&typeof e.getFileHandle==`function`}async function be(e){if(ge)return ge;try{let t=await F(e,j.STORAGE_HANDLE);if(ye(t)){let e=t;if(typeof e.queryPermission==`function`&&await e.queryPermission({mode:`readwrite`})!==`granted`&&typeof e.requestPermission==`function`)try{await e.requestPermission({mode:`readwrite`})}catch{}return e}}catch(e){console.warn(`Failed to retrieve local storage handle from DB:`,e)}return ve()}function xe(e){ge=e}function L(){ge=null}function Se(e){return e instanceof DOMException&&e.name===`InvalidStateError`}async function R(e){if(ge)try{let e=await ge.queryPermission({mode:`readwrite`});return{type:`local`,permission:e===`granted`?`granted`:await I(ge,e),name:ge.name}}catch{console.warn(`Getting storage status failed for explicit storage root.`)}try{let t=await F(e,j.STORAGE_HANDLE);if(ye(t)){let e=t,n=await e.queryPermission({mode:`readwrite`});return{type:`local`,permission:n===`granted`?`granted`:await I(e,n),name:e.name}}}catch(e){console.warn(`Failed to check storage status:`,e)}return{type:`opfs`,permission:`granted`,name:`OPFS`}}async function z(e,t){return oe(await be(e),`groups`,t.replace(/:/g,`-`))}function Ce(e){let t=e.replace(/\\/g,`/`).replace(/^\/home\/user\//,`/`).replace(/^\/+/,``).split(`/`).filter(Boolean);if(t.length===0)throw Error(`Empty file path`);return{dirs:t,filename:t.pop()||``}}async function we(e,t,n){let r=await z(e,t),{dirs:i,filename:a}=Ce(n),o=r;for(let e of i)o=await o.getDirectoryHandle(e);let s=await o.getFileHandle(a);try{let e=await s.createSyncAccessHandle(),t=e.getSize(),n=new Uint8Array(t);return e.read(n,{at:0}),e.close(),new TextDecoder(`utf-8`).decode(n)}catch{return(await s.getFile()).text()}}
1
+ import{i as e,n as t,r as n,t as r}from"./rolldown-runtime-aKtaBQYM.js";const i=new class{loading=!1;models=new Map;getModelInfo(e){return this.models.get(e.toLowerCase())??null}registerModelInfo(e,t){this.models.set(e.toLowerCase(),t)}clear(){this.models.clear()}async fetchModelInfo(e,t,n){if(e.modelsUrl){this.loading=!0;try{let r=new Headers;if(r.set(`Content-Type`,`application/json`),e.headers)for(let[t,n]of Object.entries(e.headers))r.set(t,n);if(n)for(let[e,t]of Object.entries(n))r.set(e,t);if(t&&e.apiKeyHeader){let n=e.apiKeyHeaderFormat;r.set(e.apiKeyHeader,n?n.replace(`{key}`,t):t)}let i=await fetch(e.modelsUrl,{headers:r});if(!i.ok)throw Error(`HTTP ${i.status} ${i.statusText}`);let a=await i.json(),o=Array.isArray(a.data)?a.data:Array.isArray(a.models)?a.models:[];for(let e of o){if(!e.id)continue;let t=e.context_length??e.context_window??0,n=e.max_completion_tokens||e.per_request_limits?.completion_tokens||e.top_provider?.max_completion_tokens||null,r=typeof e.supports_tools==`boolean`?e.supports_tools:typeof e.supportsTools==`boolean`?e.supportsTools:void 0,i=this.extractModalities(e,`input`),a=this.extractModalities(e,`output`),o=this.modalitiesInclude(i,`image`,`vision`),s=this.modalitiesInclude(i,`audio`,`voice`,`hearing`),c=this.modalitiesInclude(i,`video`),l=e.id===`openrouter/free`||this.supportedParametersInclude(e,`image`,`vision`,`audio`,`tool`,`structured`),u=this.extractReasoning(e);!t&&Array.isArray(e.providers)&&e.providers.length>0&&(t=e.providers[0]?.context_length||0),this.registerModelInfo(e.id,{contextWindow:t,maxOutput:n,...r!==void 0&&{supportsTools:r},...i.length>0&&{inputModalities:i},...a.length>0&&{outputModalities:a},...o!==void 0&&{supportsImageInput:o},...s!==void 0&&{supportsAudioInput:s},...c!==void 0&&{supportsVideoInput:c},...u&&{reasoning:u},...l&&{routesByRequestFeatures:l}})}o.length>0&&console.log(`[ModelRegistry] Registered ${o.length} models for provider "${e.id}"`)}catch(t){console.error(`[ModelRegistry] Error fetching models for ${e.id}:`,t)}finally{this.loading=!1}}}extractModalities(e,t){let n=t===`input`?e.input_modalities||e.inputModalities:e.output_modalities||e.outputModalities,r=e.architecture||{},i=t===`input`?r.input_modalities||r.inputModalities:r.output_modalities||r.outputModalities,a=typeof r.modality==`string`?r.modality:``,o=this.parseArchitectureModality(a,t),s=[...this.normalizeStringArray(n),...this.normalizeStringArray(i),...o];return Array.from(new Set(s))}extractReasoning(e){let t=e?.reasoning;if(!t||typeof t!=`object`)return;let n=this.normalizeStringArray(t.supported_efforts),r=typeof t.default_effort==`string`?t.default_effort.toLowerCase():void 0,i=typeof t.default_enabled==`boolean`?t.default_enabled:void 0,a=typeof t.supports_max_tokens==`boolean`?t.supports_max_tokens:void 0,o=typeof t.mandatory==`boolean`?t.mandatory:void 0;if(!(n.length===0&&r===void 0&&i===void 0&&a===void 0&&o===void 0))return{...n.length>0&&{supportedEfforts:n},...r!==void 0&&{defaultEffort:r},...i!==void 0&&{defaultEnabled:i},...a!==void 0&&{supportsMaxTokens:a},...o!==void 0&&{mandatory:o}}}modalitiesInclude(e,...t){if(e.length!==0)return t.some(t=>e.some(e=>e.includes(t)))}normalizeStringArray(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`).map(e=>e.toLowerCase()):[]}parseArchitectureModality(e,t){if(!e)return[];let[n=``,r=``]=e.toLowerCase().split(`->`).map(e=>e.trim());return(t===`input`?n:r).split(/[+,/\s]+/).map(e=>e.trim()).filter(Boolean)}supportedParametersInclude(e,...t){let n=this.normalizeStringArray(e.supported_parameters||e.supportedParameters);return t.some(e=>n.some(t=>t.includes(e)))}};function a(e){return e.replace(/^\/+|\/+$/g,``)}function o(e){let t=a(e);return t.endsWith(`/index.html`)?t=t.slice(0,-11):t.endsWith(`index.html`)&&(t=t.slice(0,-10)),a(t)}function s(e){let t=a(e),n=t.split(`/`).filter(Boolean);if(n.length===0)return null;let r=n[0].toLowerCase();if(r===`pages`){if(n.length>=3){let e=n[1];return{page:`pages`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:n.slice(2).join(`/`)}}return{page:`pages`,groupId:`br:main`,path:n.slice(1).join(`/`)}}if(r===`files`){let e=n[1]||`main`;return{page:`files`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:n.slice(2).join(`/`)||void 0}}if(r===`chat`){let e=n[1]||`main`;return{page:`chat`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}if(r===`tasks`){let e=n[1]||`main`;return{page:`tasks`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}return r===`main`?{page:`pages`,groupId:`br:main`,path:n.slice(1).join(`/`)}:{page:`pages`,groupId:`br:main`,path:t}}function c(){if(typeof document<`u`){let e=document.getElementById(`shadow-claw-static-routing`);if(e&&e.textContent)try{let t=JSON.parse(e.textContent);if(t&&typeof t==`object`&&t.routes)return t}catch(e){console.warn(`Failed to parse embedded static routing manifest:`,e)}}return null}function l(e,t){let n=t||c();if(!n||!n.routes)return null;let r=o(e);if(!r)return null;for(let[e,t]of Object.entries(n.routes))if(!(!t||!t.prettyPath)&&o(t.prettyPath)===r)return s(e);return null}let u=null;const d=new Set([`chat`,`files`,`tasks`,`pages`,`settings`,`tools`,`channels`]);function f(){u=null}typeof globalThis<`u`&&(globalThis.__applyBasePathCacheReset=f);function p(){let e=typeof window<`u`?window:typeof self<`u`?self:globalThis;if(e&&e.__SHADOWCLAW_DEPLOY_ID__){let t=String(e.__SHADOWCLAW_DEPLOY_ID__).trim();if(t)return t.replace(/[^a-zA-Z0-9_-]/g,`-`)}let t=globalThis.process;if(t&&t.env&&t.env.SHADOWCLAW_DEPLOY_ID){let e=String(t.env.SHADOWCLAW_DEPLOY_ID).trim();if(e)return e.replace(/[^a-zA-Z0-9_-]/g,`-`)}let n=m();return!n||n===`/`?``:n.replace(/^\/+|\/+$/g,``).replace(/[^a-zA-Z0-9_-]/g,`-`)}function m(){if(u!==null)return u;if((typeof window>`u`||globalThis.WorkerGlobalScope!==void 0&&typeof self<`u`&&self instanceof globalThis.WorkerGlobalScope)&&typeof self<`u`&&self.location){let e=(self.location.pathname||`/`).split(`/`).filter(Boolean);if(e.length<=1)return u=`/`,u;let t=e[0].toLowerCase(),n=t===`service-worker.js`||t===`sw.js`||t===`manifest.json`||t===`sitemap.xml`||t===`favicon.ico`||t===`index.html`||t===`service-worker`||t===`assets`||t===`dist`||t===`public`;if(n&&e.length===2)return u=`/`,u;if(!n)return u=`/`+e[0]+`/`,u}let e=typeof window<`u`&&window.location?window.location:typeof self<`u`&&self.location?self.location:null;if(!e)return`/`;if(typeof document<`u`&&typeof document.querySelector==`function`){let t=document.querySelector(`base[href]`);if(t){let n=t.getAttribute(`href`);if(n)try{let t=new URL(n,e.origin).pathname;return t.endsWith(`/`)||(t+=`/`),u=t,u}catch{}}}let t=e.pathname||`/`;if(t===`/`)return u=`/`,u;let n=t.split(`/`).filter(Boolean),r=n.findIndex(e=>d.has(e.toLowerCase()));return r>=0?r===0?(u=`/`,u):(u=`/`+n.slice(0,r).join(`/`)+`/`,u):l(t)?(u=`/`,u):n.length===1&&!t.includes(`.`)?(u=`/`+n[0]+`/`,u):(u=`/`,u)}function h(e){let t=m();if(t===`/`)return e;let[n,...r]=e.split(/(?=[?#])/);if(n===t||n.startsWith(t))return e;let i=t+(n.startsWith(`/`)?n.slice(1):n);return i=i.replace(/\/{2,}/g,`/`),i+r.join(``)}function g(e){let t=e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);return RegExp(`(^|\\s)@${t}\\b`,`i`)}g(`ShadowClaw`);const _=8192,v=[{pattern:`claude-fable-5`,maxTokens:128e3},{pattern:`claude-sonnet-5`,maxTokens:128e3},{pattern:`claude-opus-5`,maxTokens:128e3},{pattern:`claude-opus-4-8`,maxTokens:128e3},{pattern:`claude-opus-4`,maxTokens:128e3},{pattern:`claude-sonnet-4`,maxTokens:64e3},{pattern:`claude-haiku-4`,maxTokens:64e3},{pattern:`claude-3-5`,maxTokens:8192},{pattern:`claude-3`,maxTokens:4096},{pattern:`gpt-5`,maxTokens:128e3},{pattern:`gpt-4o`,maxTokens:16384},{pattern:`gpt-4.1`,maxTokens:32768},{pattern:`gpt-4-turbo`,maxTokens:4096},{pattern:`gpt-4`,maxTokens:8192},{pattern:`gpt-3.5`,maxTokens:4096},{pattern:`qwen-2.5`,maxTokens:32768},{pattern:`Qwen3.5`,maxTokens:32768},{pattern:`qwen3.5`,maxTokens:32768},{pattern:`Qwen3`,maxTokens:32768},{pattern:`qwen3`,maxTokens:32768},{pattern:`gemma-4`,maxTokens:16384},{pattern:`gemini-nano`,maxTokens:4096},{pattern:`phi-mini`,maxTokens:9216},{pattern:`aion`,maxTokens:9216},{pattern:`gemma-3-1b-it-ONNX-GQA`,maxTokens:32768},{pattern:`gemma-3-1b-it-ONNX`,maxTokens:32768},{pattern:`gemma-3`,maxTokens:32768},{pattern:`Qwen3-0.6B-ONNX`,maxTokens:32768},{pattern:`Qwen3.5`,maxTokens:32768},{pattern:`Llama-3.2`,maxTokens:32768},{pattern:`SmolLM`,maxTokens:8192},{pattern:`DeepSeek-R1`,maxTokens:32768},{pattern:`Phi-4`,maxTokens:16384},{pattern:`Phi-3.5`,maxTokens:16384},{pattern:`LFM2`,maxTokens:16384},{pattern:`gpt-oss`,maxTokens:32768},{pattern:`browser-built-in`,maxTokens:4096},{pattern:`mesh`,maxTokens:32768},{pattern:`openrouter/free`,maxTokens:32768},{pattern:`qwen3:8b`,maxTokens:4096},{pattern:`llama3:8b`,maxTokens:8192}];function y(e){if(!e)return _;let t=i.getModelInfo(e);if(t){if(typeof t.maxOutput==`number`){let e=t.contextWindow?Math.max(8192,Math.floor(t.contextWindow/2)):32768;return Math.min(t.maxOutput,e)}if(t.contextWindow){let e;return e=t.contextWindow>=2e5?131072:t.contextWindow>=1e5?65536:32768,Math.min(e,Math.floor(t.contextWindow/2))}}for(let{pattern:t,maxTokens:n}of v)if(e.includes(t))return n;return _}const b=1800,x=`shadowclaw`;function S(){let e=p();return e?`shadowclaw-${e}`:x}S();const C=`shadowclaw`,w=`br:main`,T={github:{providerId:`github`,name:`GitHub`,aliases:[`github`,`api.github.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`,`git_remote`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`token `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://github.com/login/oauth/authorize`,tokenUrl:`https://github.com/login/oauth/access_token`,defaultScopes:[`repo`,`read:user`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},gitlab:{providerId:`gitlab`,name:`GitLab`,aliases:[`gitlab`,`gitlab.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`,`git_remote`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`PRIVATE-TOKEN`,headerPrefix:``},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},tokenAuthByServiceType:{git_remote:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}}},oauth:{authorizeUrl:`https://gitlab.com/oauth/authorize`,tokenUrl:`https://gitlab.com/oauth/token`,defaultScopes:[`read_api`,`read_user`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},figma:{providerId:`figma`,name:`Figma`,aliases:[`figma`,`api.figma.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`X-Figma-Token`,headerPrefix:``},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://www.figma.com/oauth`,tokenUrl:`https://api.figma.com/v1/oauth/token`,refreshUrl:`https://api.figma.com/v1/oauth/refresh`,defaultScopes:[],usePkce:!0,clientAuthMethod:`basic_header`,scopeSeparator:`space`}},notion:{providerId:`notion`,name:`Notion`,aliases:[`notion`,`api.notion.com`,`notion.so`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://api.notion.com/v1/oauth/authorize`,tokenUrl:`https://api.notion.com/v1/oauth/token`,defaultScopes:[],usePkce:!0,clientAuthMethod:`basic_header`,scopeSeparator:`space`}},microsoft_graph:{providerId:`microsoft_graph`,name:`Microsoft Graph`,aliases:[`microsoft`,`graph.microsoft.com`,`microsoft_graph`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/authorize`,tokenUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/token`,defaultScopes:[`openid`,`profile`,`offline_access`,`User.Read`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},yahoo_mail:{providerId:`yahoo_mail`,name:`Yahoo Mail`,aliases:[`yahoo`,`yahoo_mail`,`mail.yahoo.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://api.login.yahoo.com/oauth2/request_auth`,tokenUrl:`https://api.login.yahoo.com/oauth2/get_token`,defaultScopes:[`mail-r`,`mail-w`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},google:{providerId:`google`,name:`Google`,aliases:[`google`,`googleapis.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://accounts.google.com/o/oauth2/v2/auth`,tokenUrl:`https://oauth2.googleapis.com/token`,defaultScopes:[`openid`,`profile`,`email`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},atlassian:{providerId:`atlassian`,name:`Atlassian`,aliases:[`atlassian`,`api.atlassian.com`],modes:[`oauth`,`token`,`basic`],defaultMode:`basic`,serviceTypes:[`http_api`,`git_remote`],authTypes:[`token`,`oauth`,`basic_userpass`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `},basic:{headerName:`Authorization`,headerPrefix:`Basic `}},oauth:{authorizeUrl:`https://auth.atlassian.com/authorize`,tokenUrl:`https://auth.atlassian.com/oauth/token`,defaultScopes:[],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},slack:{providerId:`slack`,name:`Slack`,aliases:[`slack`,`slack.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://slack.com/oauth/v2/authorize`,tokenUrl:`https://slack.com/api/oauth.v2.access`,defaultScopes:[],usePkce:!1,clientAuthMethod:`request_body`,scopeSeparator:`comma`}},linear:{providerId:`linear`,name:`Linear`,aliases:[`linear`,`api.linear.app`,`linear.app`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://linear.app/oauth/authorize`,tokenUrl:`https://api.linear.app/oauth/token`,defaultScopes:[],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},azure_devops:{providerId:`azure_devops`,name:`Azure DevOps`,aliases:[`azure_devops`,`dev.azure.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`,`git_remote`],authTypes:[`token`,`oauth`,`basic_userpass`,`ssh_key`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},tokenAuthByServiceType:{git_remote:{token:{headerName:`Authorization`,headerPrefix:`Basic `},oauth:{headerName:`Authorization`,headerPrefix:`Basic `}}},oauth:{authorizeUrl:`https://app.vssps.visualstudio.com/oauth2/authorize`,tokenUrl:`https://app.vssps.visualstudio.com/oauth2/token`,defaultScopes:[`vso.code`,`vso.profile`,`offline_access`],usePkce:!1,clientAuthMethod:`request_body`,scopeSeparator:`space`}},custom_mcp:{providerId:`custom_mcp`,name:`Custom MCP`,aliases:[`custom_mcp`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`mcp_remote`,`webmcp_local`],authTypes:[`none`,`token`,`oauth`,`custom_header`,`ssh_key`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://example.com/oauth/authorize`,tokenUrl:`https://example.com/oauth/token`,defaultScopes:[],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}}},E=Object.fromEntries(Object.values(T).filter(e=>!!e.oauth).map(e=>{let t=e.oauth;return[e.providerId,{id:e.providerId,name:e.name,authorizeUrl:t.authorizeUrl,tokenUrl:t.tokenUrl,redirectUri:t.redirectUri,defaultScopes:t.defaultScopes,usePkce:t.usePkce,clientAuthMethod:t.clientAuthMethod,scopeSeparator:t.scopeSeparator}]}));Object.fromEntries(Object.values(T).map(e=>[e.providerId,{providerId:e.providerId,modes:e.modes,defaultMode:e.defaultMode}]));const D={openrouter:{id:`openrouter`,name:`OpenRouter`,baseUrl:`https://openrouter.ai/api/v1/chat/completions`,format:`openai`,apiKeyHeader:`Authorization`,apiKeyHeaderFormat:`Bearer {key}`,headers:{"HTTP-Referer":`https://xt-ml.github.io/shadow-claw/`,"X-OpenRouter-Title":`ShadowClaw`},defaultModel:`openrouter/free`,modelsUrl:`https://openrouter.ai/api/v1/models`,requiresApiKey:!0,supportsStreaming:!0,reasoningParam:`reasoning`},huggingface:{id:`huggingface`,name:`HuggingFace`,baseUrl:`https://router.huggingface.co/v1/chat/completions`,format:`openai`,apiKeyHeader:`Authorization`,apiKeyHeaderFormat:`Bearer {key}`,headers:{},defaultModel:`meta-llama/Llama-3.1-8B-Instruct`,modelsUrl:`https://router.huggingface.co/v1/models`,requiresApiKey:!0,supportsStreaming:!0},bedrock_proxy:{id:`bedrock_proxy`,name:`AWS Bedrock (Local Proxy)`,baseUrl:`http://localhost:8888/bedrock-proxy/invoke`,format:`anthropic`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`anthropic.claude-sonnet-4-6-v1:0`,modelsUrl:`http://localhost:8888/bedrock-proxy/models`,requiresApiKey:!1,supportsStreaming:!0,reasoningParam:`thinking`},gemini_proxy:{id:`gemini_proxy`,name:`Gemini (Local Proxy)`,baseUrl:`http://localhost:8888/gemini-proxy/chat/completions`,format:`openai`,apiKeyHeader:`x-goog-api-key`,headers:{},defaultModel:`gemini-2.0-flash`,modelsUrl:`http://localhost:8888/gemini-proxy/models`,requiresApiKey:!0,supportsStreaming:!0,reasoningParam:`thinkingConfig`},vertex_ai:{id:`vertex_ai`,name:`Vertex AI (Local Proxy)`,baseUrl:`http://localhost:8888/vertex-ai-proxy/chat/completions`,format:`openai`,apiKeyHeader:`x-vertex-project`,headers:{},defaultModel:`gemini-2.5-flash`,modelsUrl:`http://localhost:8888/vertex-ai-proxy/models`,requiresApiKey:!0,supportsStreaming:!0,reasoningParam:`thinkingConfig`},"mesh-llm":{id:`mesh-llm`,name:`Mesh LLM (Local Proxy)`,baseUrl:`http://localhost:8888/mesh-llm-proxy/chat/completions`,format:`mesh-llm`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`mesh`,modelsUrl:`http://localhost:8888/mesh-llm-proxy/models`,requiresApiKey:!1,supportsStreaming:!0},ollama:{id:`ollama`,name:`Ollama (Local Proxy)`,baseUrl:`http://localhost:8888/ollama-proxy/chat/completions`,format:`openai`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`qwen3:8b`,modelsUrl:`http://localhost:8888/ollama-proxy/models`,requiresApiKey:!1,supportsStreaming:!0},llamafile:{id:`llamafile`,name:`Llamafile (Local Proxy)`,baseUrl:`http://localhost:8888/llamafile-proxy/chat/completions`,format:`openai`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`Qwen3.5-9B-Q5_K_S`,modelsUrl:`http://localhost:8888/llamafile-proxy/models`,requiresApiKey:!1,supportsStreaming:!0},transformers_js_local:{id:`transformers_js_local`,name:`Transformers.js (Local Proxy)`,baseUrl:`http://localhost:8888/transformers-js-proxy/chat/completions`,format:`openai`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`onnx-community/Qwen3-0.6B-ONNX`,modelsUrl:`http://localhost:8888/transformers-js-proxy/models`,models:[`onnx-community/DeepSeek-R1-Distill-Qwen-1.5B-ONNX`,`onnx-community/gemma-3-1b-it-ONNX-GQA`,`onnx-community/gemma-3-1b-it-ONNX`,`onnx-community/gemma-4-E2B-it-ONNX`,`onnx-community/gemma-4-E2B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-E4B-it-ONNX`,`onnx-community/gemma-4-E4B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-E9B-it-ONNX`,`onnx-community/gemma-4-12B-it-ONNX`,`onnx-community/gemma-4-12B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-E27B-it-ONNX`,`onnx-community/gpt-oss-20b-ONNX`,`onnx-community/LFM2-1.2B-ONNX`,`onnx-community/Llama-3.2-1B-Instruct-ONNX`,`onnx-community/Llama-3.2-3B-Instruct-ONNX`,`onnx-community/Phi-3.5-mini-instruct-onnx-web`,`onnx-community/Phi-4-mini-instruct-ONNX`,`onnx-community/Qwen3-0.6B-ONNX`,`onnx-community/Qwen3.5-0.8B-ONNX-OPT`,`onnx-community/Qwen3.5-4B-ONNX-OPT`,`HuggingFaceTB/SmolLM3-3B-ONNX`,`LiquidAI/LFM2.5-1.2B-Thinking-ONNX`,`webgpu/Qwen3-4B-ONNX`],requiresApiKey:!1,supportsStreaming:!0},transformers_js_browser:{id:`transformers_js_browser`,name:`Transformers.js (Browser)`,baseUrl:`local://transformers-js`,format:`transformers_js`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`onnx-community/Qwen3-0.6B-ONNX`,modelsUrl:`https://huggingface.co/api/models?author=onnx-community`,models:[`onnx-community/Qwen3-0.6B-ONNX`,`onnx-community/gemma-3-1b-it-ONNX`,`onnx-community/gemma-3-1b-it-ONNX-GQA`,`onnx-community/gemma-4-E2B-it-ONNX`,`onnx-community/gemma-4-E4B-it-ONNX`,`onnx-community/gemma-4-E9B-it-ONNX`,`onnx-community/gemma-4-E27B-it-ONNX`,`onnx-community/gemma-4-12B-it-ONNX`,`onnx-community/gemma-4-E2B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-E4B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-12B-it-qat-mobile-ONNX`,`onnx-community/Phi-3.5-mini-instruct-onnx-web`,`onnx-community/Phi-4-mini-instruct-ONNX`,`onnx-community/Llama-3.2-1B-Instruct-ONNX`,`onnx-community/Llama-3.2-3B-Instruct-ONNX`,`webgpu/Qwen3-4B-ONNX`,`onnx-community/DeepSeek-R1-Distill-Qwen-1.5B-ONNX`,`onnx-community/gpt-oss-20b-ONNX`,`onnx-community/LFM2-1.2B-ONNX`,`LiquidAI/LFM2.5-1.2B-Thinking-ONNX`,`HuggingFaceTB/SmolLM3-3B-ONNX`,`onnx-community/Qwen3.5-0.8B-ONNX-OPT`,`onnx-community/Qwen3.5-4B-ONNX-OPT`],requiresApiKey:!1,supportsStreaming:!1},litert_lm_browser:{id:`litert_lm_browser`,name:`LiteRT-LM (Browser)`,baseUrl:`local://litert-lm`,format:`transformers_js`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`litert-community/gemma-4-E2B-it-litert-lm`,models:[`litert-community/gemma-4-E2B-it-litert-lm`,`litert-community/gemma-4-E4B-it-litert-lm`],requiresApiKey:!1,supportsStreaming:!1},prompt_api:{id:`prompt_api`,name:`Prompt API (Browser)`,baseUrl:`builtin://language-model`,format:`prompt_api`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`browser-built-in`,models:[`browser-built-in`],requiresApiKey:!1,supportsStreaming:!1}};function O(e){return D[e]||null}function ee(e){return`api_key:${e}`}function k(e){return T[e]||null}function A(e,t,n=`http_api`){let r=k(e);return r&&(r.tokenAuthByServiceType?.[n]?.[t]||r.tokenAuth[t])||null}const j={ACTIVE_TOOL_PROFILE:`active_tool_profile`,ACTIVITY_LOG_DISK_LOGGING_ENABLED:`activity_log_disk_logging_enabled`,ALLOWED_CUSTOM_ELEMENTS:`allowed_custom_elements`,ALLOWED_CUSTOM_ELEMENT_HOST_PATTERNS:`allowed_custom_element_host_patterns`,ALLOWED_IFRAME_HOST_PATTERNS:`allowed_iframe_host_patterns`,API_KEY:`api_key`,ASSISTANT_NAME:`assistant_name`,BEDROCK_AUTH_MODE:`bedrock_auth_mode`,BEDROCK_PROFILE_FALLBACK:`bedrock_profile_fallback`,BEDROCK_REGION_FALLBACK:`bedrock_region_fallback`,BUILTIN_AI_SUBAGENT_ROUTING:`builtin_ai_subagent_routing`,BUILTIN_AI_TOOLS_BACKEND:`builtin_ai_tools_backend`,CHANNEL_ENABLED_PREFIX:`channel_enabled:`,CHAT_INPUT_AREA_HEIGHT:`chat_input_area_height`,CHAT_SPLIT_VIEW_ENABLED:`chat_split_view_enabled`,CHAT_SPLIT_VIEW_HEIGHT:`chat_split_view_height`,COMPACTION_ENGINE_PREFERENCE:`compaction_engine_preference`,CONTEXT_COMPRESSION_ENABLED:`context_compression_enabled`,CONTROL_PLANE_CLIENT_ID:`control_plane_client_id`,CONTROL_PLANE_ENABLED:`control_plane_enabled`,CONTROL_PLANE_TRANSPORT:`control_plane_transport`,CONTROL_PLANE_URL:`control_plane_url`,CONVERSATIONS_HEIGHT:`conversations_height`,CUSTOM_TOOLS:`custom_tools`,DB_MIGRATED_FROM_LEGACY:`db_migrated_from_legacy`,DECLARATIVE_TOOLS_ENABLED:`declarative_tools_enabled`,DEFAULT_PINNED_PAGE:`default_pinned_page`,DIRECT_TOOL_COMMAND_POLICY:`direct_tool_command_policy`,ENABLED_TOOLS:`enabled_tools`,FILES_UPLOAD_APPEND_ULID:`files_upload_append_ulid`,GIT_ACCOUNTS:`git_accounts`,GIT_AUTHOR_EMAIL:`git_author_email`,GIT_AUTHOR_NAME:`git_author_name`,GIT_CORS_PROXY:`git_cors_proxy`,GIT_DEFAULT_ACCOUNT:`git_default_account`,GIT_PASSWORD:`git_password`,GIT_PROXY_URL:`git_proxy_url`,GIT_TOKEN:`git_token`,GIT_USERNAME:`git_username`,IMESSAGE_API_KEY:`imessage_api_key`,IMESSAGE_CHAT_IDS:`imessage_chat_ids`,IMESSAGE_SERVER_URL:`imessage_server_url`,INTEGRATION_CONNECTIONS:`integration_connections`,MARKDOWN_FRONTMATTER_CHAT:`markdown_frontmatter_chat`,MARKDOWN_FRONTMATTER_FILE_VIEWER:`markdown_frontmatter_file_viewer`,MARKDOWN_FRONTMATTER_PAGES:`markdown_frontmatter_pages`,MARKDOWN_FRONTMATTER_TASKS:`markdown_frontmatter_tasks`,LAST_ACTIVE_GROUP:`last_active_group`,LAST_ACTIVE_PAGE:`last_active_page`,LAST_SELECTED_PINNED_PAGE:`last_selected_pinned_page`,LLAMAFILE_HOST:`llamafile_host`,LLAMAFILE_MODE:`llamafile_mode`,LLAMAFILE_OFFLINE:`llamafile_offline`,LLAMAFILE_PORT:`llamafile_port`,MAIN_GROUP_INDEX_SUPPRESSED:`main_group_index_suppressed`,MAIN_GROUP_README_SUPPRESSED:`main_group_readme_suppressed`,MAX_ITERATIONS:`max_iterations`,MAX_TOKENS:`max_tokens`,MESH_LLM_HOST:`mesh_llm_host`,MODEL:`model`,OAUTH_PROVIDER_DEFINITIONS:`oauth_provider_definitions`,OPFS_MIGRATED_FROM_LEGACY:`opfs_migrated_from_legacy`,OVERRIDE_PRERENDER_SKELETON:`override_prerender_skeleton`,PAGES_AUTO_REFRESH_INTERVAL:`pages_auto_refresh_interval`,PAGES_LIST:`pages_list`,PASSPHRASE_SALT:`passphrase_salt`,PASSPHRASE_VERIFY:`passphrase_verify`,PROMPT_API_BACKEND:`prompt_api_backend`,PROMPT_API_DTYPE_STRATEGY:`prompt_api_dtype_strategy`,PROMPT_API_FALLBACK_MODEL:`prompt_api_fallback_model`,PROMPT_API_ONBOARDING_SEEN:`prompt_api_onboarding_seen`,PEERJS_MY_ALIAS:`peerjs_my_alias`,PEERJS_MY_PEER_ID:`peerjs_my_peer_id`,PEERJS_PEER_ALIASES:`peerjs_peer_aliases`,PEERJS_SERVER_HOST:`peerjs_server_host`,PEERJS_SERVER_PATH:`peerjs_server_path`,PEERJS_SERVER_PORT:`peerjs_server_port`,PEERJS_SERVER_SECURE:`peerjs_server_secure`,PEERJS_TRUSTED_PEER_IDS:`peerjs_trusted_peer_ids`,PROVIDER:`provider`,PROXY_URL:`proxy_url`,PUSH_PROXY_URL:`push_proxy_url`,RATE_LIMIT_AUTO_ADAPT:`rate_limit_auto_adapt`,RATE_LIMIT_CALLS_PER_MINUTE:`rate_limit_calls_per_minute`,REASONING_EFFORT:`reasoning_effort`,REMOTE_MCP_CONNECTIONS:`remote_mcp_connections`,SERVICE_ACCOUNTS:`service_accounts`,SERVICE_DEFAULT_ACCOUNT:`service_default_account`,SIDEBAR_CHAT_HIDDEN:`sidebar_chat_hidden`,SIDEBAR_DEFAULT_PAGE:`sidebar_default_page`,SIDEBAR_FILES_HIDDEN:`sidebar_files_hidden`,SIDEBAR_PAGES_HIDDEN:`sidebar_pages_hidden`,SIDEBAR_TASKS_HIDDEN:`sidebar_tasks_hidden`,SIDEBAR_WIDTH:`sidebar_width`,SITE_CONFIG_SEEDED:`site_config_seeded`,STATIC_MAIN_SITE_SEEDED:`static_main_site_seeded`,STORAGE_HANDLE:`storage_handle`,SUBSCRIBER_ID:`subscriber_id`,STREAMING_ENABLED:`streaming_enabled`,SUBAGENT_MAX_PARALLEL:`subagent_max_parallel`,SUBAGENT_WORKSPACE_MODE:`subagent_workspace_mode`,SUPPRESSED_PAGES_LIST:`suppressed_pages_list`,SYSTEM_PROMPT_OVERRIDE:`system_prompt_override`,TASK_SERVER_ENABLED:`task_server_enabled`,TASK_SERVER_URL:`task_server_url`,TASK_SYNC_OUTBOX:`task_sync_outbox`,TELEGRAM_BOT_TOKEN:`telegram_bot_token`,TELEGRAM_CHAT_IDS:`telegram_chat_ids`,TELEGRAM_USE_PROXY:`telegram_use_proxy`,TOOL_PROFILES:`tool_profiles`,TRANSFORMERS_JS_BACKEND:`transformers_js_backend`,TRANSFORMERS_JS_DTYPE_STRATEGY:`transformers_js_dtype_strategy`,TRIGGER_PATTERN:`trigger_pattern`,USE_PROXY:`use_proxy`,VAPID_SUBJECT:`vapid_subject`,VM_BASH_FULL_INTERNET_ACCESS:`vm_bash_full_internet_access`,VM_BASH_TIMEOUT_SEC:`vm_bash_timeout_sec`,VM_BOOT_HOST:`vm_boot_host`,VM_BOOT_MODE:`vm_boot_mode`,VM_NETWORK_RELAY_URL:`vm_network_relay_url`,WEBMCP_MODE:`webmcp_mode`,WEBMCP_TOOLS_ENABLED:`webmcp_tools_enabled`,WEB_SEARCH_PROXY_URL:`web_search_proxy_url`,WEB_SEARCH_URL:`web_search_url`,WEB_SEARCH_USE_PROXY:`web_search_use_proxy`,SEARCH_FILES_MAX_FILE_BYTES:`search_files_max_file_bytes`,SEARCH_FILES_MAX_FILES_VISITED:`search_files_max_files_visited`,SEARCH_FILES_SKIP_DIRS:`search_files_skip_dirs`},te=`localhost`,ne=8888;let re=null,M=null;const N=new Promise(e=>{M=e});function ie(){return re?Promise.resolve(re):N}function P(e){if(!e)throw Error(`Database not initialized`);re=e,M&&=(M(e),null)}function ae(e,t,n,r){return e?new Promise((i,a)=>{try{let o=e.transaction(t,n);if(!o)return a(Error(`failed to get transaction`));let s=r(o.objectStore(t));s.onsuccess=()=>i(s.result),s.onerror=()=>a(s.error)}catch(e){a(e)}}):Promise.reject(Error(`failed to get database, cannot update task.`))}function F(e,t){return ae(e,`config`,`readonly`,e=>e.get(t)).then(e=>e?.value)}async function oe(e,...t){let n=e;for(let e of t){let t=await n.getDirectoryHandle(e,{create:!0});if(typeof n.isSameEntry==`function`&&await n.isSameEntry(t))throw Error(`Directory navigation failed: "${e}" resolved to the same directory as its parent. The stored directory handle may be stale — try re-selecting the storage folder.`);n=t}return n}var se=t({MemoryDirectoryHandle:()=>pe,MemoryFileHandle:()=>fe,MemorySyncAccessHandle:()=>ue,MemoryWritableStream:()=>de,getMemoryOpfsRoot:()=>he});function ce(e,t){if(typeof DOMException<`u`)try{return new DOMException(e,t)}catch{}let n=Error(e);return n.name=t,n}function le(e){let t=e();return t[Symbol.asyncDispose??Symbol.for(`Symbol.asyncDispose`)]=async()=>{},t}var ue=class{_file;_closed=!1;constructor(e){this._file=e}close(){this._closed=!0}flush(){}getSize(){if(this._closed)throw ce(`SyncAccessHandle is closed`,`InvalidStateError`);return this._file.getRawData().byteLength}read(e,t){if(this._closed)throw ce(`SyncAccessHandle is closed`,`InvalidStateError`);let n=this._file.getRawData(),r=t?.at??0;if(r>=n.byteLength)return 0;let i=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),a=n.subarray(r,r+i.byteLength);return i.set(a),a.byteLength}write(e,t){if(this._closed)throw ce(`SyncAccessHandle is closed`,`InvalidStateError`);let n=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),r=t?.at??0,i=this._file.getRawData(),a=r+n.byteLength,o;return a>i.byteLength?(o=new Uint8Array(a),o.set(i)):o=new Uint8Array(i),o.set(n,r),this._file.setRawData(o),n.byteLength}truncate(e){if(this._closed)throw ce(`SyncAccessHandle is closed`,`InvalidStateError`);let t=this._file.getRawData(),n=new Uint8Array(e);n.set(t.subarray(0,Math.min(t.byteLength,e))),this._file.setRawData(n)}},de=class{_file;_buffer;_position=0;_length=0;_closed=!1;constructor(e,t=!1){this._file=e;let n=e.getRawData();t?(this._buffer=new Uint8Array(n),this._length=n.byteLength):(this._buffer=new Uint8Array(1024),this._length=0)}async write(e){if(this._closed)throw ce(`WritableStream is closed`,`InvalidStateError`);let t;if(typeof e==`string`)t=new TextEncoder().encode(e);else if(e instanceof Uint8Array)t=e;else if(e instanceof ArrayBuffer)t=new Uint8Array(e);else if(typeof Blob<`u`&&e instanceof Blob)t=typeof e.arrayBuffer==`function`?new Uint8Array(await e.arrayBuffer()):typeof e.text==`function`?new TextEncoder().encode(await e.text()):typeof FileReader<`u`?await new Promise(t=>{let n=new FileReader;n.onload=()=>{t(new Uint8Array(n.result))},n.onerror=()=>t(new Uint8Array),n.readAsArrayBuffer(e)}):new Uint8Array;else if(e&&typeof e==`object`&&`type`in e)if(e.type===`write`){typeof e.position==`number`&&(this._position=e.position);let n=e.data;t=typeof n==`string`?new TextEncoder().encode(n):n instanceof Uint8Array?n:n instanceof ArrayBuffer?new Uint8Array(n):typeof Blob<`u`&&n instanceof Blob&&typeof n.arrayBuffer==`function`?new Uint8Array(await n.arrayBuffer()):new Uint8Array}else if(e.type===`seek`){this._position=e.position??0;return}else if(e.type===`truncate`){this._truncate(e.size??0);return}else t=new Uint8Array;else t=new Uint8Array;let n=this._position+t.length;if(n>this._buffer.length){let e=Math.max(this._buffer.length*2,n,1024),t=new Uint8Array(e);t.set(this._buffer),this._buffer=t}this._buffer.set(t,this._position),this._position+=t.length,this._position>this._length&&(this._length=this._position)}_truncate(e){if(e<this._length)this._length=e;else if(e>this._length){if(e>this._buffer.length){let t=new Uint8Array(e);t.set(this._buffer),this._buffer=t}this._length=e}this._position>e&&(this._position=e)}async seek(e){if(this._closed)throw ce(`WritableStream is closed`,`InvalidStateError`);this._position=e}async truncate(e){if(this._closed)throw ce(`WritableStream is closed`,`InvalidStateError`);this._truncate(e)}async close(){if(this._closed)return;this._closed=!0;let e=this._buffer.slice(0,this._length);this._file.setRawData(e)}async abort(){this._closed=!0}},fe=class{kind=`file`;name;_data;_lastModified;constructor(e,t=new Uint8Array){this.name=e,this._data=t,this._lastModified=Date.now()}getRawData(){return this._data}setRawData(e){this._data=e,this._lastModified=Date.now()}_getArrayBuffer(){let e=new ArrayBuffer(this._data.byteLength);return new Uint8Array(e).set(this._data),e}async getFile(){let e=this._getArrayBuffer(),t=this._data,n=this.name,r=this._lastModified,i={name:n,size:t.byteLength,type:``,lastModified:r,async text(){return new TextDecoder().decode(t)},async arrayBuffer(){return e},slice(n=0,r=t.byteLength){return new Blob([e.slice(n,r)])}};if(typeof File<`u`)try{let t=new File([e],this.name,{lastModified:this._lastModified});return typeof t.text!=`function`&&(t.text=i.text),typeof t.arrayBuffer!=`function`&&(t.arrayBuffer=i.arrayBuffer),t}catch{}return i}async createWritable(e){return new de(this,e?.keepExistingData??!1)}async createSyncAccessHandle(){return new ue(this)}async isSameEntry(e){return this===e}async queryPermission(){return`granted`}async requestPermission(){return`granted`}},pe=class e{kind=`directory`;name;_entries=new Map;constructor(e){this.name=e}_setEntry(e,t){this._entries.set(e,t)}async getDirectoryHandle(t,n){if(t===`.`||t===``)return this;if(t===`..`)throw ce(`Cannot navigate to parent directory with '..'`,`SecurityError`);let r=this._entries.get(t);if(r){if(r.kind===`directory`)return r;throw ce(`"${t}" is a file, not a directory`,`TypeMismatchError`)}if(n?.create){let n=new e(t);return this._entries.set(t,n),n}throw ce(`A requested file or directory could not be found at "${t}"`,`NotFoundError`)}async getFileHandle(e,t){if(e===`.`||e===`..`||e===``)throw ce(`Invalid file name "${e}"`,`TypeMismatchError`);let n=this._entries.get(e);if(n){if(n.kind===`file`)return n;throw ce(`"${e}" is a directory, not a file`,`TypeMismatchError`)}if(t?.create){let t=new fe(e);return this._entries.set(e,t),t}throw ce(`A requested file could not be found at "${e}"`,`NotFoundError`)}async removeEntry(e,t){let n=this._entries.get(e);if(!n)throw ce(`Entry "${e}" not found`,`NotFoundError`);if(n.kind===`directory`&&n._entries.size>0&&!t?.recursive)throw ce(`Directory "${e}" is not empty`,`InvalidModificationError`);this._entries.delete(e)}async resolve(e){if(this===e)return[];for(let[t,n]of this._entries.entries()){if(n===e)return[t];if(n.kind===`directory`){let r=await n.resolve(e);if(r)return[t,...r]}}return null}entries(){let e=this;return le(async function*(){for(let[t,n]of e._entries.entries())yield[t,n]})}values(){let e=this;return le(async function*(){for(let t of e._entries.values())yield t})}keys(){let e=this;return le(async function*(){for(let t of e._entries.keys())yield t})}[Symbol.asyncIterator](){return this.entries()}async isSameEntry(e){return this===e}async queryPermission(){return`granted`}async requestPermission(){return`granted`}};let me=null;function he(){if(!me){let e=new pe(`memory-root`),t=new pe(C);e._setEntry(C,t),me=t}return me}let ge=null;async function I(e,t){try{return await e.entries().next(),`granted`}catch{return t}}function _e(){let e=p();return e?`${C}-${e}`:C}async function ve(){try{if(typeof navigator<`u`&&navigator.storage&&typeof navigator.storage.getDirectory==`function`){let e=await navigator.storage.getDirectory(),t=_e();return await e.getDirectoryHandle(t,{create:!0})}}catch(e){console.warn(`OPFS is unavailable (e.g. Firefox Private Browsing). Using in-memory storage fallback:`,e)}return he()}function ye(e){if(!e||typeof e!=`object`)return!1;let t=globalThis.FileSystemDirectoryHandle;return t!==void 0&&e instanceof t||typeof e.getDirectoryHandle==`function`&&typeof e.getFileHandle==`function`}async function be(e){if(ge)return ge;try{let t=await F(e,j.STORAGE_HANDLE);if(ye(t)){let e=t;if(typeof e.queryPermission==`function`&&await e.queryPermission({mode:`readwrite`})!==`granted`&&typeof e.requestPermission==`function`)try{await e.requestPermission({mode:`readwrite`})}catch{}return e}}catch(e){console.warn(`Failed to retrieve local storage handle from DB:`,e)}return ve()}function xe(e){ge=e}function L(){ge=null}function Se(e){return e instanceof DOMException&&e.name===`InvalidStateError`}async function R(e){if(ge)try{let e=await ge.queryPermission({mode:`readwrite`});return{type:`local`,permission:e===`granted`?`granted`:await I(ge,e),name:ge.name}}catch{console.warn(`Getting storage status failed for explicit storage root.`)}try{let t=await F(e,j.STORAGE_HANDLE);if(ye(t)){let e=t,n=await e.queryPermission({mode:`readwrite`});return{type:`local`,permission:n===`granted`?`granted`:await I(e,n),name:e.name}}}catch(e){console.warn(`Failed to check storage status:`,e)}return{type:`opfs`,permission:`granted`,name:`OPFS`}}async function z(e,t){return oe(await be(e),`groups`,t.replace(/:/g,`-`))}function Ce(e){let t=e.replace(/\\/g,`/`).replace(/^\/home\/user\//,`/`).replace(/^\/+/,``).split(`/`).filter(Boolean);if(t.length===0)throw Error(`Empty file path`);return{dirs:t,filename:t.pop()||``}}async function we(e,t,n){let r=await z(e,t),{dirs:i,filename:a}=Ce(n),o=r;for(let e of i)o=await o.getDirectoryHandle(e);let s=await o.getFileHandle(a);try{let e=await s.createSyncAccessHandle(),t=e.getSize(),n=new Uint8Array(t);return e.read(n,{at:0}),e.close(),new TextDecoder(`utf-8`).decode(n)}catch{return(await s.getFile()).text()}}
2
2
  /*! @license DOMPurify 3.4.13 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.13/LICENSE */
3
3
  function Te(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function Ee(e){if(Array.isArray(e))return e}function De(e,t){var n=e==null?null:typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(n!=null){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,t!==0)for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&n.return!=null&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}function Oe(){throw TypeError(`Invalid attempt to destructure non-iterable instance.
4
4
  In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function ke(e,t){return Ee(e)||De(e,t)||Ae(e,t)||Oe()}function Ae(e,t){if(e){if(typeof e==`string`)return Te(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Te(e,t):void 0}}const je=Object.entries,Me=Object.setPrototypeOf,Ne=Object.isFrozen,Pe=Object.getPrototypeOf,Fe=Object.getOwnPropertyDescriptor;let Ie=Object.freeze,Le=Object.seal,Re=Object.create,ze=typeof Reflect<`u`&&Reflect,Be=ze.apply,Ve=ze.construct;Ie||=function(e){return e},Le||=function(e){return e},Be||=function(e,t){var n=[...arguments].slice(2);return e.apply(t,n)},Ve||=function(e){return new e(...[...arguments].slice(1))};const He=at(Array.prototype.forEach),Ue=at(Array.prototype.lastIndexOf),B=at(Array.prototype.pop),We=at(Array.prototype.push),Ge=at(Array.prototype.splice),V=Array.isArray,Ke=at(String.prototype.toLowerCase),qe=at(String.prototype.toString),Je=at(String.prototype.match),Ye=at(String.prototype.replace),Xe=at(String.prototype.indexOf),Ze=at(String.prototype.trim),Qe=at(Number.prototype.toString),$e=at(Boolean.prototype.toString),et=typeof BigInt>`u`?null:at(BigInt.prototype.toString),H=typeof Symbol>`u`?null:at(Symbol.prototype.toString),tt=at(Object.prototype.hasOwnProperty),nt=at(Object.prototype.toString),rt=at(RegExp.prototype.test),it=ot(TypeError);function at(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);var n=[...arguments].slice(1);return Be(e,t,n)}}function ot(e){return function(){return Ve(e,[...arguments])}}function st(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:Ke;if(Me&&Me(e,null),!V(t))return e;let r=t.length;for(;r--;){let i=t[r];if(typeof i==`string`){let e=n(i);e!==i&&(Ne(t)||(t[r]=e),i=e)}e[i]=!0}return e}function ct(e){for(let t=0;t<e.length;t++)tt(e,t)||(e[t]=null);return e}function lt(e){let t=Re(null);for(let r of je(e)){var n=ke(r,2);let i=n[0],a=n[1];tt(e,i)&&(V(a)?t[i]=ct(a):a&&typeof a==`object`&&a.constructor===Object?t[i]=lt(a):t[i]=a)}return t}function ut(e){switch(typeof e){case`string`:return e;case`number`:return Qe(e);case`boolean`:return $e(e);case`bigint`:return et?et(e):`0`;case`symbol`:return H?H(e):`Symbol()`;case`undefined`:return nt(e);case`function`:case`object`:{if(e===null)return nt(e);let t=e,n=dt(t,`toString`);if(typeof n==`function`){let e=n(t);return typeof e==`string`?e:nt(e)}return nt(e)}default:return nt(e)}}function dt(e,t){for(;e!==null;){let n=Fe(e,t);if(n){if(n.get)return at(n.get);if(typeof n.value==`function`)return at(n.value)}e=Pe(e)}function n(){return null}return n}function ft(e){try{return rt(e,``),!0}catch{return!1}}const pt=Ie(`a.abbr.acronym.address.area.article.aside.audio.b.bdi.bdo.big.blink.blockquote.body.br.button.canvas.caption.center.cite.code.col.colgroup.content.data.datalist.dd.decorator.del.details.dfn.dialog.dir.div.dl.dt.element.em.fieldset.figcaption.figure.font.footer.form.h1.h2.h3.h4.h5.h6.head.header.hgroup.hr.html.i.img.input.ins.kbd.label.legend.li.main.map.mark.marquee.menu.menuitem.meter.nav.nobr.ol.optgroup.option.output.p.picture.pre.progress.q.rp.rt.ruby.s.samp.search.section.select.shadow.slot.small.source.spacer.span.strike.strong.style.sub.summary.sup.table.tbody.td.template.textarea.tfoot.th.thead.time.tr.track.tt.u.ul.var.video.wbr`.split(`.`)),mt=Ie(`svg.a.altglyph.altglyphdef.altglyphitem.animatecolor.animatemotion.animatetransform.circle.clippath.defs.desc.ellipse.enterkeyhint.exportparts.filter.font.g.glyph.glyphref.hkern.image.inputmode.line.lineargradient.marker.mask.metadata.mpath.part.path.pattern.polygon.polyline.radialgradient.rect.stop.style.switch.symbol.text.textpath.title.tref.tspan.view.vkern`.split(`.`)),ht=Ie([`feBlend`,`feColorMatrix`,`feComponentTransfer`,`feComposite`,`feConvolveMatrix`,`feDiffuseLighting`,`feDisplacementMap`,`feDistantLight`,`feDropShadow`,`feFlood`,`feFuncA`,`feFuncB`,`feFuncG`,`feFuncR`,`feGaussianBlur`,`feImage`,`feMerge`,`feMergeNode`,`feMorphology`,`feOffset`,`fePointLight`,`feSpecularLighting`,`feSpotLight`,`feTile`,`feTurbulence`]),gt=Ie([`animate`,`color-profile`,`cursor`,`discard`,`font-face`,`font-face-format`,`font-face-name`,`font-face-src`,`font-face-uri`,`foreignobject`,`hatch`,`hatchpath`,`mesh`,`meshgradient`,`meshpatch`,`meshrow`,`missing-glyph`,`script`,`set`,`solidcolor`,`unknown`,`use`]),_t=Ie(`math.menclose.merror.mfenced.mfrac.mglyph.mi.mlabeledtr.mmultiscripts.mn.mo.mover.mpadded.mphantom.mroot.mrow.ms.mspace.msqrt.mstyle.msub.msup.msubsup.mtable.mtd.mtext.mtr.munder.munderover.mprescripts`.split(`.`)),vt=Ie([`maction`,`maligngroup`,`malignmark`,`mlongdiv`,`mscarries`,`mscarry`,`msgroup`,`mstack`,`msline`,`msrow`,`semantics`,`annotation`,`annotation-xml`,`mprescripts`,`none`]),yt=Ie([`#text`]),bt=Ie(`accept.action.align.alt.autocapitalize.autocomplete.autopictureinpicture.autoplay.background.bgcolor.border.capture.cellpadding.cellspacing.checked.cite.class.clear.color.cols.colspan.command.commandfor.controls.controlslist.coords.crossorigin.datetime.decoding.default.dir.disabled.disablepictureinpicture.disableremoteplayback.download.draggable.enctype.enterkeyhint.exportparts.face.for.headers.height.hidden.high.href.hreflang.id.inert.inputmode.integrity.ismap.kind.label.lang.list.loading.loop.low.max.maxlength.media.method.min.minlength.multiple.muted.name.nonce.noshade.novalidate.nowrap.open.optimum.part.pattern.placeholder.playsinline.popover.popovertarget.popovertargetaction.poster.preload.pubdate.radiogroup.readonly.rel.required.rev.reversed.role.rows.rowspan.spellcheck.scope.selected.shape.size.sizes.slot.span.srclang.start.src.srcset.step.style.summary.tabindex.title.translate.type.usemap.valign.value.width.wrap.xmlns`.split(`.`)),xt=Ie(`accent-height.accumulate.additive.alignment-baseline.amplitude.ascent.attributename.attributetype.azimuth.basefrequency.baseline-shift.begin.bias.by.class.clip.clippathunits.clip-path.clip-rule.color.color-interpolation.color-interpolation-filters.color-profile.color-rendering.cx.cy.d.dx.dy.diffuseconstant.direction.display.divisor.dominant-baseline.dur.edgemode.elevation.end.exponent.fill.fill-opacity.fill-rule.filter.filterunits.flood-color.flood-opacity.font-family.font-size.font-size-adjust.font-stretch.font-style.font-variant.font-weight.fx.fy.g1.g2.glyph-name.glyphref.gradientunits.gradienttransform.height.href.id.image-rendering.in.in2.intercept.k.k1.k2.k3.k4.kerning.keypoints.keysplines.keytimes.lang.lengthadjust.letter-spacing.kernelmatrix.kernelunitlength.lighting-color.local.marker-end.marker-mid.marker-start.markerheight.markerunits.markerwidth.maskcontentunits.maskunits.max.mask.mask-type.media.method.mode.min.name.numoctaves.offset.operator.opacity.order.orient.orientation.origin.overflow.paint-order.path.pathlength.patterncontentunits.patterntransform.patternunits.points.preservealpha.preserveaspectratio.primitiveunits.r.rx.ry.radius.refx.refy.repeatcount.repeatdur.restart.result.rotate.scale.seed.shape-rendering.slope.specularconstant.specularexponent.spreadmethod.startoffset.stddeviation.stitchtiles.stop-color.stop-opacity.stroke-dasharray.stroke-dashoffset.stroke-linecap.stroke-linejoin.stroke-miterlimit.stroke-opacity.stroke.stroke-width.style.surfacescale.systemlanguage.tabindex.tablevalues.targetx.targety.transform.transform-origin.text-anchor.text-decoration.text-orientation.text-rendering.textlength.type.u1.u2.unicode.values.viewbox.visibility.version.vert-adv-y.vert-origin-x.vert-origin-y.width.word-spacing.wrap.writing-mode.xchannelselector.ychannelselector.x.x1.x2.xmlns.y.y1.y2.z.zoomandpan`.split(`.`)),St=Ie(`accent.accentunder.align.bevelled.close.columnalign.columnlines.columnspacing.columnspan.denomalign.depth.dir.display.displaystyle.encoding.fence.frame.height.href.id.largeop.length.linethickness.lquote.lspace.mathbackground.mathcolor.mathsize.mathvariant.maxsize.minsize.movablelimits.notation.numalign.open.rowalign.rowlines.rowspacing.rowspan.rspace.rquote.scriptlevel.scriptminsize.scriptsizemultiplier.selection.separator.separators.stretchy.subscriptshift.supscriptshift.symmetric.voffset.width.xmlns`.split(`.`)),Ct=Ie([`xlink:href`,`xml:id`,`xlink:title`,`xml:space`,`xmlns:xlink`]),wt=Le(/{{[\w\W]*|^[\w\W]*}}/g),Tt=Le(/<%[\w\W]*|^[\w\W]*%>/g),Et=Le(/\${[\w\W]*/g),Dt=Le(/^data-[\-\w.\u00B7-\uFFFF]+$/),Ot=Le(/^aria-[\-\w]+$/),kt=Le(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),At=Le(/^(?:\w+script|data):/i),jt=Le(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Mt=Le(/^html$/i),Nt=Le(/^[a-z][.\w]*(-[.\w]+)+$/i),Pt=Le(/<[/\w!]/g),Ft=Le(/<[/\w]/g),It=Le(/<\/no(script|embed|frames)/i),Lt=Le(/\/>/i),Rt={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,processingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},zt=function(){return typeof window>`u`?null:window},Bt=function(e,t){if(typeof e!=`object`||typeof e.createPolicy!=`function`)return null;let n=null,r=`data-tt-policy-suffix`;t&&t.hasAttribute(r)&&(n=t.getAttribute(r));let i=`dompurify`+(n?`#`+n:``);try{return e.createPolicy(i,{createHTML(e){return e},createScriptURL(e){return e}})}catch{return console.warn(`TrustedTypes policy `+i+` could not be created.`),null}},Vt=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},Ht=function(e,t,n,r){return tt(e,t)&&V(e[t])?st(r.base?lt(r.base):{},e[t],r.transform):n};function Ut(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:zt(),t=e=>Ut(e);if(t.version=`3.4.13`,t.removed=[],!e||!e.document||e.document.nodeType!==Rt.document||!e.Element)return t.isSupported=!1,t;let n=e.document,r=n,i=r.currentScript;e.DocumentFragment;let a=e.HTMLTemplateElement,o=e.Node,s=e.Element,c=e.NodeFilter;e.NamedNodeMap===void 0&&(e.NamedNodeMap||e.MozNamedAttrMap),e.HTMLFormElement;let l=e.DOMParser,u=e.trustedTypes,d=s.prototype,f=dt(d,`cloneNode`),p=dt(d,`remove`),m=dt(d,`nextSibling`),h=dt(d,`childNodes`),g=dt(d,`parentNode`),_=dt(d,`shadowRoot`),v=dt(d,`attributes`),y=o&&o.prototype?dt(o.prototype,`nodeType`):null,b=o&&o.prototype?dt(o.prototype,`nodeName`):null,x=o&&o.prototype?dt(o.prototype,`ownerDocument`):null;if(typeof a==`function`){let e=n.createElement(`template`);e.content&&e.content.ownerDocument&&(n=e.content.ownerDocument)}let S,C=``,w,T=!1,E=0,D=function(){if(E>0)throw it(`A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.`)},O=function(e){D(),E++;try{return S.createHTML(e)}finally{E--}},ee=function(e){D(),E++;try{return S.createScriptURL(e)}finally{E--}},k=function(){return T||=(w=Bt(u,i),!0),w},A=n,j=A.implementation,te=A.createNodeIterator,ne=A.createDocumentFragment,re=A.getElementsByTagName,M=r.importNode,N=Vt();t.isSupported=typeof je==`function`&&typeof g==`function`&&j&&j.createHTMLDocument!==void 0;let ie=wt,P=Tt,ae=Et,F=Dt,oe=Ot,se=At,ce=jt,le=Nt,ue=kt,de=null,fe=st({},[...pt,...mt,...ht,..._t,...yt]),pe=null,me=st({},[...bt,...xt,...St,...Ct]),he=Object.seal(Re(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ge=null,I=null,_e=Object.seal(Re(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),ve=!0,ye=!0,be=!1,xe=!0,L=!1,Se=!0,R=!1,z=!1,Ce=null,we=null,Te=!1,Ee=!1,De=!1,Oe=!1,ke=!0,Ae=!1,Me=`user-content-`,Ne=!0,Pe=!1,Fe={},ze=null,Be=st({},`annotation-xml.audio.colgroup.desc.foreignobject.head.iframe.math.mi.mn.mo.ms.mtext.noembed.noframes.noscript.plaintext.script.selectedcontent.style.svg.template.thead.title.video.xmp`.split(`.`)),Ve=null,Qe=st({},[`audio`,`video`,`img`,`source`,`image`,`track`]),$e=null,et=st({},[`alt`,`class`,`for`,`id`,`label`,`name`,`pattern`,`placeholder`,`role`,`summary`,`title`,`value`,`style`,`xmlns`]),H=`http://www.w3.org/1998/Math/MathML`,nt=`http://www.w3.org/2000/svg`,at=`http://www.w3.org/1999/xhtml`,ot=at,ct=!1,Wt=null,Gt=st({},[H,nt,at],qe),Kt=Ie([`mi`,`mo`,`mn`,`ms`,`mtext`]),qt=st({},Kt),Jt=Ie([`annotation-xml`]),Yt=st({},Jt),Xt=st({},[`title`,`style`,`font`,`a`,`script`]),Zt=null,Qt=[`application/xhtml+xml`,`text/html`],$t=null,en=null,tn=n.createElement(`form`),nn=function(e){return e instanceof RegExp||e instanceof Function},rn=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(en&&en===e)return;(!e||typeof e!=`object`)&&(e={}),e=lt(e),Zt=Qt.indexOf(e.PARSER_MEDIA_TYPE)===-1?`text/html`:e.PARSER_MEDIA_TYPE,$t=Zt===`application/xhtml+xml`?qe:Ke,de=Ht(e,`ALLOWED_TAGS`,fe,{transform:$t}),pe=Ht(e,`ALLOWED_ATTR`,me,{transform:$t}),Wt=Ht(e,`ALLOWED_NAMESPACES`,Gt,{transform:qe}),$e=Ht(e,`ADD_URI_SAFE_ATTR`,et,{transform:$t,base:et}),Ve=Ht(e,`ADD_DATA_URI_TAGS`,Qe,{transform:$t,base:Qe}),ze=Ht(e,`FORBID_CONTENTS`,Be,{transform:$t}),ge=Ht(e,`FORBID_TAGS`,lt({}),{transform:$t}),I=Ht(e,`FORBID_ATTR`,lt({}),{transform:$t}),Fe=tt(e,`USE_PROFILES`)?e.USE_PROFILES&&typeof e.USE_PROFILES==`object`?lt(e.USE_PROFILES):e.USE_PROFILES:!1,ve=e.ALLOW_ARIA_ATTR!==!1,ye=e.ALLOW_DATA_ATTR!==!1,be=e.ALLOW_UNKNOWN_PROTOCOLS||!1,xe=e.ALLOW_SELF_CLOSE_IN_ATTR!==!1,L=e.SAFE_FOR_TEMPLATES||!1,Se=e.SAFE_FOR_XML!==!1,R=e.WHOLE_DOCUMENT||!1,Ee=e.RETURN_DOM||!1,De=e.RETURN_DOM_FRAGMENT||!1,Oe=e.RETURN_TRUSTED_TYPE||!1,Te=e.FORCE_BODY||!1,ke=e.SANITIZE_DOM!==!1,Ae=e.SANITIZE_NAMED_PROPS||!1,Ne=e.KEEP_CONTENT!==!1,Pe=e.IN_PLACE||!1,ue=ft(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:kt,ot=typeof e.NAMESPACE==`string`?e.NAMESPACE:at,qt=tt(e,`MATHML_TEXT_INTEGRATION_POINTS`)&&e.MATHML_TEXT_INTEGRATION_POINTS&&typeof e.MATHML_TEXT_INTEGRATION_POINTS==`object`?lt(e.MATHML_TEXT_INTEGRATION_POINTS):st({},Kt),Yt=tt(e,`HTML_INTEGRATION_POINTS`)&&e.HTML_INTEGRATION_POINTS&&typeof e.HTML_INTEGRATION_POINTS==`object`?lt(e.HTML_INTEGRATION_POINTS):st({},Jt);let t=tt(e,`CUSTOM_ELEMENT_HANDLING`)&&e.CUSTOM_ELEMENT_HANDLING&&typeof e.CUSTOM_ELEMENT_HANDLING==`object`?lt(e.CUSTOM_ELEMENT_HANDLING):Re(null);if(he=Re(null),tt(t,`tagNameCheck`)&&nn(t.tagNameCheck)&&(he.tagNameCheck=t.tagNameCheck),tt(t,`attributeNameCheck`)&&nn(t.attributeNameCheck)&&(he.attributeNameCheck=t.attributeNameCheck),tt(t,`allowCustomizedBuiltInElements`)&&typeof t.allowCustomizedBuiltInElements==`boolean`&&(he.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),Le(he),L&&(ye=!1),De&&(Ee=!0),Fe&&(de=st({},yt),pe=Re(null),Fe.html===!0&&(st(de,pt),st(pe,bt)),Fe.svg===!0&&(st(de,mt),st(pe,xt),st(pe,Ct)),Fe.svgFilters===!0&&(st(de,ht),st(pe,xt),st(pe,Ct)),Fe.mathMl===!0&&(st(de,_t),st(pe,St),st(pe,Ct))),_e.tagCheck=null,_e.attributeCheck=null,tt(e,`ADD_TAGS`)&&(typeof e.ADD_TAGS==`function`?_e.tagCheck=e.ADD_TAGS:V(e.ADD_TAGS)&&(de===fe&&(de=lt(de)),st(de,e.ADD_TAGS,$t))),tt(e,`ADD_ATTR`)&&(typeof e.ADD_ATTR==`function`?_e.attributeCheck=e.ADD_ATTR:V(e.ADD_ATTR)&&(pe===me&&(pe=lt(pe)),st(pe,e.ADD_ATTR,$t))),tt(e,`ADD_URI_SAFE_ATTR`)&&V(e.ADD_URI_SAFE_ATTR)&&st($e,e.ADD_URI_SAFE_ATTR,$t),tt(e,`FORBID_CONTENTS`)&&V(e.FORBID_CONTENTS)&&(ze===Be&&(ze=lt(ze)),st(ze,e.FORBID_CONTENTS,$t)),tt(e,`ADD_FORBID_CONTENTS`)&&V(e.ADD_FORBID_CONTENTS)&&(ze===Be&&(ze=lt(ze)),st(ze,e.ADD_FORBID_CONTENTS,$t)),Ne&&(de[`#text`]=!0),R&&st(de,[`html`,`head`,`body`]),de.table&&(st(de,[`tbody`]),delete ge.tbody),e.TRUSTED_TYPES_POLICY){if(typeof e.TRUSTED_TYPES_POLICY.createHTML!=`function`)throw it(`TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.`);if(typeof e.TRUSTED_TYPES_POLICY.createScriptURL!=`function`)throw it(`TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.`);let t=S;S=e.TRUSTED_TYPES_POLICY;try{C=O(``)}catch(e){throw S=t,e}}else e.TRUSTED_TYPES_POLICY===null?(S=void 0,C=``):(S===void 0&&(S=k()),S&&typeof C==`string`&&(C=O(``)));Ie&&Ie(e),en=e},an=st({},[...mt,...ht,...gt]),on=st({},[..._t,...vt]),sn=function(e,t,n){return t.namespaceURI===at?e===`svg`:t.namespaceURI===H?e===`svg`&&(n===`annotation-xml`||qt[n]):!!an[e]},cn=function(e,t,n){return t.namespaceURI===at?e===`math`:t.namespaceURI===nt?e===`math`&&Yt[n]:!!on[e]},ln=function(e,t,n){return t.namespaceURI===nt&&!Yt[n]||t.namespaceURI===H&&!qt[n]?!1:!on[e]&&(Xt[e]||!an[e])},un=function(e){let t=g(e);(!t||!t.tagName)&&(t={namespaceURI:ot,tagName:`template`});let n=Ke(e.tagName),r=Ke(t.tagName);return Wt[e.namespaceURI]?e.namespaceURI===nt?sn(n,t,r):e.namespaceURI===H?cn(n,t,r):e.namespaceURI===at?ln(n,t,r):!!(Zt===`application/xhtml+xml`&&Wt[e.namespaceURI]):!1},dn=function(e){We(t.removed,{element:e});try{g(e).removeChild(e)}catch{if(p(e),!g(e))throw it(`a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place`)}},fn=function(e){hn(e);let t=h(e);if(t){let e=[];He(t,t=>{We(e,t)}),He(e,e=>{try{p(e)}catch{}})}let n=v(e);if(n)for(let t=n.length-1;t>=0;--t){let r=n[t],i=r&&r.name;if(typeof i==`string`)try{e.removeAttribute(i)}catch{}}},pn=function(e,n){try{We(t.removed,{attribute:n.getAttributeNode(e),from:n})}catch{We(t.removed,{attribute:null,from:n})}if(n.removeAttribute(e),e===`is`)if(Ee||De)try{dn(n)}catch{}else try{n.setAttribute(e,``)}catch{}},mn=function(e){let t=v(e);if(t)for(let n=t.length-1;n>=0;--n){let r=t[n],i=r&&r.name;if(!(typeof i!=`string`||pe[$t(i)]))try{e.removeAttribute(i)}catch{}}},hn=function(e){let t=[e];for(;t.length>0;){let e=t.pop();(y?y(e):e.nodeType)===Rt.element&&mn(e);let n=h(e);if(n)for(let e=n.length-1;e>=0;--e)t.push(n[e])}},gn=function(e){if(!Se)return;let t=[e];for(;t.length>0;){let e=t.pop(),n=y?y(e):e.nodeType;if(n===Rt.processingInstruction||n===Rt.comment&&rt(Ft,e.data)){try{p(e)}catch{}continue}if(n===Rt.element){let t=e,n=$t(b?b(e):e.nodeName);try{t.hasAttribute&&t.hasAttribute(`patchsrc`)&&t.removeAttribute(`patchsrc`),t.hasAttribute&&t.hasAttribute(`for`)&&n!==`label`&&n!==`output`&&t.removeAttribute(`for`)}catch{}}let r=h(e);if(r)for(let e=r.length-1;e>=0;--e)t.push(r[e])}},_n=function(e){let t=null,r=null;if(Te)e=`<remove></remove>`+e;else{let t=Je(e,/^[\r\n\t ]+/);r=t&&t[0]}Zt===`application/xhtml+xml`&&ot===at&&(e=`<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>`+e+`</body></html>`);let i=S?O(e):e;if(ot===at)try{t=new l().parseFromString(i,Zt)}catch{}if(!t||!t.documentElement){t=j.createDocument(ot,`template`,null);try{t.documentElement.innerHTML=ct?C:i}catch{}}let a=t.body||t.documentElement;return e&&r&&a.insertBefore(n.createTextNode(r),a.childNodes[0]||null),ot===at?re.call(t,R?`html`:`body`)[0]:R?t.documentElement:a},vn=function(e){let t=x?x(e):e.ownerDocument;return te.call(t||e,e,c.SHOW_ELEMENT|c.SHOW_COMMENT|c.SHOW_TEXT|c.SHOW_PROCESSING_INSTRUCTION|c.SHOW_CDATA_SECTION,null)},yn=function(e){return e=Ye(e,ie,` `),e=Ye(e,P,` `),e=Ye(e,ae,` `),e},bn=function(e){e.normalize();let t=x?x(e):e.ownerDocument,n=te.call(t||e,e,c.SHOW_TEXT|c.SHOW_COMMENT|c.SHOW_CDATA_SECTION|c.SHOW_PROCESSING_INSTRUCTION,null),r=n.nextNode();for(;r;)r.data=yn(r.data),r=n.nextNode();let i=e.querySelectorAll?.call(e,`template`);i&&He(i,e=>{Sn(e.content)&&bn(e.content)})},xn=function(e){let t=b?b(e):null;return typeof t!=`string`||$t(t)!==`form`?!1:typeof e.nodeName!=`string`||typeof e.textContent!=`string`||typeof e.removeChild!=`function`||e.attributes!==v(e)||typeof e.removeAttribute!=`function`||typeof e.setAttribute!=`function`||typeof e.namespaceURI!=`string`||typeof e.insertBefore!=`function`||typeof e.hasChildNodes!=`function`||e.nodeType!==y(e)||e.childNodes!==h(e)},Sn=function(e){if(!y||typeof e!=`object`||!e)return!1;try{return y(e)===Rt.documentFragment}catch{return!1}},Cn=function(e){if(!y||typeof e!=`object`||!e)return!1;try{return typeof y(e)==`number`}catch{return!1}};function wn(e,n,r){e.length!==0&&He(e,e=>{e.call(t,n,r,en)})}let Tn=function(e,t){return!!(Se&&e.hasChildNodes()&&!Cn(e.firstElementChild)&&rt(Pt,e.textContent)&&rt(Pt,e.innerHTML)||Se&&e.namespaceURI===at&&t===`style`&&Cn(e.firstElementChild)||e.nodeType===Rt.processingInstruction||Se&&e.nodeType===Rt.comment&&rt(Ft,e.data))},En=function(e,t,n){if(!ge[t]&&An(t)&&(he.tagNameCheck instanceof RegExp&&rt(he.tagNameCheck,t)||he.tagNameCheck instanceof Function&&he.tagNameCheck(t)))return!1;if(Ne&&!ze[t]){let t=g(e),r=h(e);if(r&&t){let i=r.length;for(let a=i-1;a>=0;--a){let i=e===n?f(r[a],!0):r[a];t.insertBefore(i,m(e))}}}return dn(e),!0},Dn=function(e,t,n,r){return e.length===0?t:t===n||t===r?lt(t):t},On=function(e,n){if(wn(N.beforeSanitizeElements,e,null),e!==n&&g(e)===null)return Pe&&hn(e),!0;if(xn(e))return dn(e),!0;let r=$t(b?b(e):e.nodeName);if(de=Dn(N.uponSanitizeElement,de,fe,Ce),wn(N.uponSanitizeElement,e,{tagName:r,allowedTags:de}),e!==n&&g(e)===null)return Pe&&hn(e),!0;if(Tn(e,r))return dn(e),!0;if(ge[r]||!(_e.tagCheck instanceof Function&&_e.tagCheck(r))&&!de[r]){let t=En(e,r,n);return t===!1&&wn(N.afterSanitizeElements,e,null),t}if((y?y(e):e.nodeType)===Rt.element&&!un(e)||(r===`noscript`||r===`noembed`||r===`noframes`)&&rt(It,e.innerHTML))return dn(e),!0;if(L&&e.nodeType===Rt.text){let n=yn(e.textContent);e.textContent!==n&&(We(t.removed,{element:e.cloneNode()}),e.textContent=n)}return wn(N.afterSanitizeElements,e,null),!1},U=function(e,t,r){if(I[t]||Se&&t===`patchsrc`||Se&&t===`for`&&e!==`label`&&e!==`output`||ke&&(t===`id`||t===`name`)&&(r in n||r in tn))return!1;let i=pe[t]||_e.attributeCheck instanceof Function&&_e.attributeCheck(t,e);if(!(ye&&rt(F,t))&&!(ve&&rt(oe,t))){if(!i){if(!(An(e)&&(he.tagNameCheck instanceof RegExp&&rt(he.tagNameCheck,e)||he.tagNameCheck instanceof Function&&he.tagNameCheck(e))&&(he.attributeNameCheck instanceof RegExp&&rt(he.attributeNameCheck,t)||he.attributeNameCheck instanceof Function&&he.attributeNameCheck(t,e))||t===`is`&&he.allowCustomizedBuiltInElements&&(he.tagNameCheck instanceof RegExp&&rt(he.tagNameCheck,r)||he.tagNameCheck instanceof Function&&he.tagNameCheck(r))))return!1}else if(!$e[t]&&!rt(ue,Ye(r,ce,``))&&!((t===`src`||t===`xlink:href`||t===`href`)&&e!==`script`&&Xe(r,`data:`)===0&&Ve[e])&&!(be&&!rt(se,Ye(r,ce,``)))&&r)return!1}return!0},kn=st({},[`annotation-xml`,`color-profile`,`font-face`,`font-face-format`,`font-face-name`,`font-face-src`,`font-face-uri`,`missing-glyph`]),An=function(e){return!kn[Ke(e)]&&rt(le,e)},jn=function(e,t,n,r){if(S&&typeof u==`object`&&typeof u.getAttributeType==`function`&&!n)switch(u.getAttributeType(e,t)){case`TrustedHTML`:return O(r);case`TrustedScriptURL`:return ee(r)}return r},Mn=function(e,n,r,i){try{r?e.setAttributeNS(r,n,i):e.setAttribute(n,i),xn(e)?dn(e):B(t.removed)}catch{pn(n,e)}},Nn=function(e){wn(N.beforeSanitizeAttributes,e,null);let t=e.attributes;if(!t||xn(e))return;pe=Dn(N.uponSanitizeAttribute,pe,me,we);let n={attrName:``,attrValue:``,keepAttr:!0,allowedAttributes:pe,forceKeepAttr:void 0},r=t.length,i=$t(e.nodeName);for(;r--;){let a=t[r],o=a.name,s=a.namespaceURI,c=a.value,l=$t(o),u=c,d=o===`value`?u:Ze(u);if(n.attrName=l,n.attrValue=d,n.keepAttr=!0,n.forceKeepAttr=void 0,wn(N.uponSanitizeAttribute,e,n),d=n.attrValue,Ae&&(l===`id`||l===`name`)&&Xe(d,Me)!==0&&(pn(o,e),d=Me+d),Se&&rt(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,d)){pn(o,e);continue}if(l===`attributename`&&Je(d,`href`)){pn(o,e);continue}if(!n.forceKeepAttr){if(!n.keepAttr){pn(o,e);continue}if(!xe&&rt(Lt,d)){pn(o,e);continue}if(L&&(d=yn(d)),!U(i,l,d)){pn(o,e);continue}d=jn(i,l,s,d),d!==u&&Mn(e,o,s,d)}}wn(N.afterSanitizeAttributes,e,null)},Pn=function(e){let t=null,n=vn(e);for(wn(N.beforeSanitizeShadowDOM,e,null);t=n.nextNode();)if(wn(N.uponSanitizeShadowNode,t,null),On(t,e),Nn(t),Sn(t.content)&&Pn(t.content),(y?y(t):t.nodeType)===Rt.element){let e=_(t);Sn(e)&&(Fn(e),Pn(e))}wn(N.afterSanitizeShadowDOM,e,null)},Fn=function(e){let t=[{node:e,shadow:null}];for(;t.length>0;){let e=t.pop();if(e.shadow){Pn(e.shadow);continue}let n=e.node,r=(y?y(n):n.nodeType)===Rt.element,i=h(n);if(i)for(let e=i.length-1;e>=0;--e)t.push({node:i[e],shadow:null});if(r){let e=b?b(n):null;if(typeof e==`string`&&$t(e)===`template`){let e=n.content;Sn(e)&&t.push({node:e,shadow:null})}}if(r){let e=_(n);Sn(e)&&t.push({node:null,shadow:e},{node:e,shadow:null})}}};return t.sanitize=function(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=null,a=null,o=null,s=null;if(ct=!e,ct&&(e=`<!-->`),typeof e!=`string`&&!Cn(e)&&(e=ut(e),typeof e!=`string`))throw it(`dirty is not a string, aborting`);if(!t.isSupported)return e;z?(de=Ce,pe=we):rn(n),(N.uponSanitizeElement.length>0||N.uponSanitizeAttribute.length>0)&&(de=lt(de)),N.uponSanitizeAttribute.length>0&&(pe=lt(pe)),t.removed=[];let c=Pe&&typeof e!=`string`&&Cn(e);if(c){gn(e);let t=b?b(e):e.nodeName;if(typeof t==`string`){let n=$t(t);if(!de[n]||ge[n])throw fn(e),it(`root node is forbidden and cannot be sanitized in-place`)}if(xn(e))throw fn(e),it(`root node is clobbered and cannot be sanitized in-place`);try{Fn(e)}catch(t){throw fn(e),t}}else if(Cn(e))i=_n(`<!---->`),a=i.ownerDocument.importNode(e,!0),a.nodeType===Rt.element&&a.nodeName===`BODY`||a.nodeName===`HTML`?i=a:i.appendChild(a),Fn(a);else{if(!Ee&&!L&&!R&&e.indexOf(`<`)===-1)return S&&Oe?O(e):e;if(i=_n(e),!i)return Ee?null:Oe?C:``}i&&Te&&dn(i.firstChild);let l=c?e:i;try{let e=vn(l);for(;o=e.nextNode();)On(o,l),Nn(o),Sn(o.content)&&Pn(o.content)}catch(n){throw c&&(fn(e),He(t.removed,e=>{e.element&&hn(e.element)})),n}if(c)return He(t.removed,e=>{e.element&&hn(e.element)}),L&&bn(e),e;if(Ee){if(L&&bn(i),De)for(s=ne.call(i.ownerDocument);i.firstChild;)s.appendChild(i.firstChild);else s=i;return(pe.shadowroot||pe.shadowrootmode)&&(s=M.call(r,s,!0)),s}let u=R?i.outerHTML:i.innerHTML;return R&&de[`!doctype`]&&i.ownerDocument&&i.ownerDocument.doctype&&i.ownerDocument.doctype.name&&rt(Mt,i.ownerDocument.doctype.name)&&(u=`<!DOCTYPE `+i.ownerDocument.doctype.name+`>
@@ -2234,10 +2234,10 @@ t.exports=function(e){return typeof e==`string`&&e.charAt(0)===``?e.slice(1):
2234
2234
  `):``}function B1(e){let t=PK(String(e||``),`transformers_js`).trim();if(!t)return null;let n=t.match(/<tool_call>([\s\S]*?)<\/tool_call>/);if(n)try{let e=JSON.parse(n[1]);if(e.name)return{type:`tool_use`,tool_calls:[{name:e.name,input:e.arguments||e.parameters||{}}]}}catch{}try{return JSON.parse(t)}catch{let e=t.indexOf(`{`),n=t.lastIndexOf(`}`);if(e>=0&&n>e)try{return JSON.parse(t.slice(e,n+1))}catch{return null}return null}}async function V1(e,t,n,r,i,a,o,s,c,l){let u=s||[],d=await F(e,j.TRANSFORMERS_JS_BACKEND)||`auto`,f=await F(e,j.TRANSFORMERS_JS_DTYPE_STRATEGY)||`auto`;await a(FK(t,`info`,`Starting`,`Provider: Transformers.js (Local Worker) · Model: ${c} · Backend: ${d} · Dtype: ${f}`)),await R1.load(c,d,f,t,e=>{a({type:`model-download-progress`,payload:e})});let p=[...r];for(let r=0;r<10;r++){let r=[{role:`system`,content:n},...p.map(e=>({role:e.role===`assistant`?`assistant`:`user`,content:z1(e)}))];await a({type:`streaming-start`,payload:{groupId:t}});let o=``,s=``,c=await R1.generate(r,i,t,e=>{s+=e,a({type:`streaming-chunk`,payload:{groupId:t,text:e}})},e=>{o+=e,a(FK(t,`text`,`Thinking`,o))},u);await a({type:`typing`,payload:{groupId:t}});let d=B1(c);if(d?.type===`tool_use`?await a({type:`streaming-end`,payload:{groupId:t}}):await a({type:`streaming-done`,payload:{groupId:t,text:d?.response?PK(d.response,`transformers_js`):PK(c,`transformers_js`)}}),!d||d.type===`response`){await a({type:`response`,payload:{groupId:t,text:d?.response?PK(d.response,`transformers_js`):PK(c,`transformers_js`)}});return}let f=Array.isArray(d.tool_calls)?d.tool_calls:[];if(f.length===0){await a({type:`response`,payload:{groupId:t,text:PK(d.response||c,`transformers_js`)}});return}let m=[];for(let n of f){await a(IK(t,n.name,`running`)),Fr(e=>{a(e)});let r;try{r=await s1(e,n.name,n.input||{},t,{allowedTools:u,invokeContext:l})}finally{Fr(null)}await a(IK(t,n.name,`done`)),m.push({type:`tool_result`,tool_use_id:n.id||`call_${Date.now()}`,content:typeof r==`string`?r:JSON.stringify(r)})}p.push({role:`assistant`,content:[...d.response?[{type:`text`,text:d.response}]:[],...f.map(e=>({type:`tool_use`,id:e.id||`call_${Date.now()}_${Math.random()}`,name:e.name,input:e.input||{}}))]}),p.push({role:`user`,content:m})}}async function H1(e,t,n){let r=t.provider,i=async e=>{W(e)};if(r===`transformers_js_browser`){await V1(e,t.groupId,t.systemPrompt,t.messages,t.maxTokens,i,n,t.enabledTools,t.model);return}if(r===`prompt_api`){if(!Xq())throw Error(`Prompt API provider is not supported in this environment.`);await yJ(e,t.groupId,t.systemPrompt,t.messages,t.maxTokens,i,n,t.enabledTools);return}if(r===`litert_lm_browser`){if(!D1())throw Error(`Litert LM Browser provider is not supported in this environment.`);await L1(e,t.groupId,t.systemPrompt,t.messages,t.maxTokens,i,n,t.model,t.enabledTools);return}await Q1(e,t,n)}var U1=class{callbacks;contentBlocks=[];format;stopReason=`end_turn`;usage={input_tokens:0,output_tokens:0};#e=new Map;#t=``;#n=``;#r=new Map;constructor(e,t={}){this.format=e,this.callbacks=t}finalize(){return this.format===`openai`||this.format===`mesh-llm`?this.#a():this.#i()}push(e){this.format===`openai`||this.format===`mesh-llm`?this.#s(e):this.#o(e)}#i(){let e=[];for(let[,t]of[...this.#e.entries()].sort((e,t)=>e[0]-t[0]))if(t.type===`text`){let n=this.#c(t.text||``);n&&e.push({type:`text`,text:n})}else if(t.type===`tool_use`){let n;try{n=t.partialJson?JSON.parse(t.partialJson):{}}catch{n={}}e.push({type:`tool_use`,id:t.id||`call_${Date.now()}_${Math.random()}`,name:t.name,input:n})}else t.type===`thinking`?typeof t.text==`string`&&t.text.length>0&&e.push({type:`thinking`,thinking:t.text,...typeof t.id==`string`?{signature:t.id}:{}}):t.type===`redacted_thinking`&&typeof t.text==`string`&&t.text.length>0&&e.push({type:`redacted_thinking`,data:t.text});return{content:e,stop_reason:this.stopReason,usage:{...this.usage}}}#a(){let e=[];if(this.#n){let t=this.#c(this.#n);t&&e.push({type:`text`,text:t})}if(this.#t&&e.unshift({type:`thinking`,thinking:this.#t}),this.#r.size>0){this.stopReason=`tool_use`;for(let[,t]of[...this.#r.entries()].sort((e,t)=>e[0]-t[0])){let n;try{n=t.args?JSON.parse(t.args):{}}catch{n={}}e.push({type:`tool_use`,id:t.id||`call_${Date.now()}_${Math.random()}`,name:t.name,input:n})}}return{content:e,stop_reason:this.stopReason,usage:{...this.usage}}}#o(e){switch(e.type){case`message_start`:e.message?.usage&&(this.usage.input_tokens=e.message.usage.input_tokens||0,this.usage.cache_read_input_tokens=e.message.usage.cache_read_input_tokens||0,this.usage.cache_creation_input_tokens=e.message.usage.cache_creation_input_tokens||0);break;case`content_block_start`:{let t=e.index??this.#e.size,n=e.content_block||{};this.#e.set(t,{type:n.type||`text`,id:n.type===`thinking`?n.signature:n.id,name:n.name,text:n.text||n.thinking||n.data||``,partialJson:n.type===`tool_use`?``:void 0}),n.type===`tool_use`&&n.name&&this.callbacks.onToolStart?.(n.name);break}case`content_block_delta`:{let t=e.index??0,n=this.#e.get(t);if(!n){let r=e.delta?.type===`input_json_delta`?`tool_use`:`text`;n={type:r,text:r===`text`?``:void 0,partialJson:r===`tool_use`?``:void 0},this.#e.set(t,n)}let r=e.delta;if(!r)break;if(r.type===`text_delta`&&typeof r.text==`string`){let e=this.#c(r.text);if(!e)break;n.text=(n.text||``)+e,this.callbacks.onText?.(e)}r.type===`thinking_delta`&&typeof r.thinking==`string`&&(n.type=`thinking`,n.text=(n.text||``)+r.thinking,this.callbacks.onThinking?.(r.thinking)),r.type===`signature_delta`&&typeof r.signature==`string`&&(n.type=`thinking`,n.id=r.signature),r.type===`redacted_thinking_delta`&&typeof r.data==`string`&&(n.type=`redacted_thinking`,n.text=(n.text||``)+r.data),r.type===`input_json_delta`&&typeof r.partial_json==`string`&&(n.partialJson=(n.partialJson||``)+r.partial_json);break}case`content_block_stop`:break;case`message_delta`:e.delta?.stop_reason&&(this.stopReason=e.delta.stop_reason),e.usage&&(this.usage.output_tokens=e.usage.output_tokens||0,this.callbacks.onUsage?.(this.usage));break;case`message_stop`:break;default:break}}#s(e){e.usage&&(this.usage.input_tokens=e.usage.prompt_tokens||0,this.usage.output_tokens=e.usage.completion_tokens||0,this.usage.cache_read_input_tokens=e.usage.prompt_tokens_details?.cached_tokens||0,this.callbacks.onUsage?.(this.usage));let t=e.choices?.[0];if(!t)return;let n=t.delta;if(n){if(typeof n.content==`string`){let e=this.#c(n.content);e&&(this.#n+=e,this.callbacks.onText?.(e))}if(typeof n.reasoning==`string`)this.#t+=n.reasoning,this.callbacks.onThinking?.(n.reasoning);else if(n.reasoning&&typeof n.reasoning==`object`){let e=n.reasoning;typeof e.content==`string`?(this.#t+=e.content,this.callbacks.onThinking?.(e.content)):typeof e.text==`string`&&(this.#t+=e.text,this.callbacks.onThinking?.(e.text))}if(Array.isArray(n.tool_calls))for(let e of n.tool_calls){let t=e.index??0;this.#r.has(t)||(this.#r.set(t,{id:e.id||``,name:e.function?.name||``,args:``}),e.function?.name&&this.callbacks.onToolStart?.(e.function.name));let n=this.#r.get(t);n&&(e.id&&(n.id=e.id),e.function?.name&&(n.name=e.function.name),e.function?.arguments&&(n.args+=e.function.arguments))}t.finish_reason&&(t.finish_reason===`tool_calls`?this.stopReason=`tool_use`:t.finish_reason===`stop`?this.stopReason=`end_turn`:this.stopReason=t.finish_reason)}}#c(e){return PK(e,this.callbacks.source??this.format)}};const W1=new Map;function G1(e,t,n){W1.set(e,{enabledTools:t,systemPromptOverride:n})}function K1(e){return W1.get(e)}function q1(e){W1.delete(e)}function J1(e,t){let n=e.trim().match(/^\[tool_code\]([\s\S]*?)\[\/tool_code\]$/i);if(!n?.[1])return{toolBlocks:[],residualText:e};let r=n[1].trim(),i=r.match(/^print\s*\(\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\(\s*(.*?)\s*\)\s*\)$/s),a=r.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\s*\(\s*(.*?)\s*\)$/s),o=i||a;if(!o?.[1])return{toolBlocks:[],residualText:e};let s=o[1];if(!t.has(s))return{toolBlocks:[],residualText:e};let c=(o[2]||``).trim(),l={};if(c){if(!c.startsWith(`{`)||!c.endsWith(`}`))return{toolBlocks:[],residualText:e};try{let t=JSON.parse(c);if(!t||typeof t!=`object`||Array.isArray(t))return{toolBlocks:[],residualText:e};l=t}catch{return{toolBlocks:[],residualText:e}}}return{toolBlocks:[{type:`tool_use`,id:`tool_code_${Date.now()}_${Math.random()}`,name:s,input:l}],residualText:``}}function Y1(e,t){if(!e||e.stop_reason===`tool_use`||!Array.isArray(e.content))return e;let n=new Set((t||[]).map(e=>typeof e?.name==`string`?e.name:``).filter(Boolean));if(n.size===0)return e;let r=[],i=!1;for(let t of e.content){if(t?.type!==`text`||typeof t.text!=`string`){r.push(t);continue}let e=J1(t.text,n);if(e.toolBlocks.length>0){i=!0,e.residualText.trim()&&r.push({type:`text`,text:e.residualText}),r.push(...e.toolBlocks);continue}r.push(t)}return i?{...e,content:r,stop_reason:`tool_use`}:e}function X1(e){let t=e.filter(e=>e?.type===`tool_result`).map(e=>typeof e.content==`string`?e.content.trim():Array.isArray(e.content)?e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
2235
2235
  `).trim():JSON.stringify(e.content).trim()).filter(Boolean);return t.length===0?``:t.join(`
2236
2236
 
2237
- `).slice(0,1e4)}function Z1(e){let t=e.trim();return t?`Tool result:\n${t}`:``}async function Q1(e,t,n){let{apiKey:r,assistantName:i,contextCompression:a=!1,contextLimit:o,enabledTools:s,groupId:c,isScheduledTask:l=!1,maxIterations:u,maxTokens:d,memory:f,messages:p,model:m,provider:h,providerHeaders:g={},providerRuntimeOverrides:_,reasoning:v,rateLimitAutoAdapt:y=!0,rateLimitCallsPerMinute:b=0,storageHandle:x,streaming:S=!1,subagentModelSelectionMode:C,subagentMaxTokens:w,subagentPinnedModel:T,subagentPinnedProvider:E,systemPrompt:D,workspaceGroupId:ee}=t,k=!!t.subagentTask,A=k?c.startsWith(`subagent:`)?c:`subagent:${or()}`:c,j=ee||c;k&&Lr(A,[]);let te={autoAdapt:y!==!1,callsPerMinute:Number.isFinite(b)?Math.max(0,Math.floor(b)):0};x&&xe(x);let ne=O(h);if(!ne){W({payload:{groupId:A,error:`Unknown provider: ${h}`},type:`error`});return}let re=ne,M=S&&re.supportsStreaming===!0&&re.format!==`prompt_api`;W({type:`typing`,payload:{groupId:A}}),l1(A,`info`,`Starting`,`Provider: ${re.name} · Model: ${m} · Max tokens: ${d} · Streaming: ${M?`on`:`off`}${S&&!M?` (provider does not support streaming)`:``}`);try{let t=[...p],c=0,y=typeof u==`number`&&u>0?u:50,b=Array.isArray(s)?s:wK,S=D,O=``,ee={apiKey:r,assistantName:i??``,db:e,enabledTools:b,invokeSubagent:t=>H1(e,t,n),maxTokens:d,memory:f??``,model:m,provider:h,subagentModelSelectionMode:C,subagentMaxTokens:w,subagentPinnedProvider:E,subagentPinnedModel:T,providerHeaders:g,providerRuntimeOverrides:_,storageHandle:x,streaming:!1,systemPrompt:S??``},k=[];for(;c<y;){c++;let s=K1(A);s&&(b=s.enabledTools,S=JJ(i,f,b,s.systemPromptOverride));let u=o??KJ(m),p=NG(S),{messages:_,estimatedTokens:y}=IG(t,{contextLimit:u,maxOutputTokens:d,skimTop:a,systemPromptTokens:p}),x=y+p,C=Math.max(100,Math.min(d,u-x-500)),w=UJ(re,_,b,{contextCompression:a,maxTokens:C,model:m,reasoning:v,system:S});l1(A,`api-call`,`API call #${c}`,`${_.length} messages in context`);let T={...MJ(re,r),...g},E=re.baseUrl,D;D=M?await e0(h,re,E,T,w,A,m,te,n):await $1(h,re,E,T,w,A,te,n),D=Y1(D,b),D.usage&&W(C1(A,D.usage,KJ(m)));for(let e of D.content)e.type===`text`&&e.text&&l1(A,`text`,`Response text`,e.text.length>200?e.text.slice(0,200)+`…`:e.text);if(D.stop_reason===`tool_use`){let n=new Set(b.map(e=>typeof e?.name==`string`?e.name:``).filter(Boolean)),r=D.content.filter(e=>e.type===`text`).map(e=>e.text).join(``).replace(/<internal>[\s\S]*?<\/internal>/g,``).trim();r&&W({payload:{groupId:A,text:r},type:`intermediate-response`}),M&&W({payload:{groupId:A},type:`streaming-end`});let i=[];for(let t of D.content)if(t.type===`tool_use`){let r=n.has(t.name),a=`${t.name}:${JSON.stringify(t.input)}`,o=k.filter(e=>e===a).length;if(k.push(a),!r){let e=`SYSTEM ERROR: Tool '${t.name}' is disabled or unavailable for this request. Do not call it again. Try a different approach or ask the user for help.`;l1(A,`warning`,`Tool blocked`,e),i.push({content:e,tool_use_id:t.id,type:`tool_result`});continue}let s=JSON.stringify(t.input),c=s.length>300?s.slice(0,300)+`…`:s;l1(A,`tool-call`,`Tool: ${t.name}`,c),W(IK(A,t.name,`running`));let u;o>=3?(u=`SYSTEM ERROR: You have repeatedly called this tool with the exact same input (${o+1} times). This is a rigid loop. STOP calling this tool with these arguments. Try a different approach, fix the underlying issue, or ask the user for help.`,console.warn(`[Worker] Blocked repetitive tool call:`,a)):u=await s1(e,t.name,t.input,j,{allowedTools:b,isScheduledTask:l,invokeContext:ee});let d=typeof u==`string`?u:JSON.stringify(u),f=d.length>500?d.slice(0,500)+`…`:d;l1(A,`tool-result`,`Result: ${t.name}`,f),W(IK(A,t.name,`done`)),Array.isArray(u)?i.push({content:u,tool_use_id:t.id,type:`tool_result`}):i.push({content:typeof u==`string`?u.slice(0,1e5):JSON.stringify(u).slice(0,1e5),tool_use_id:t.id,type:`tool_result`})}O=X1(i),t.push({role:`assistant`,content:D.content}),t.push({role:`user`,content:i}),W({type:`typing`,payload:{groupId:A}})}else{let e=D.content.filter(e=>e.type===`text`).map(e=>e.text).join(``).replace(/<internal>[\s\S]*?<\/internal>/g,``).trim(),t=(e.toLowerCase()===`(no response)`?``:e)||(O?Z1(O):`(no response)`);M&&W({payload:{groupId:A,text:t},type:`streaming-done`}),W({payload:{groupId:A,text:t},type:`response`});return}}W({payload:{text:`⚠️ Reached maximum tool-use iterations (${y}). Stopping to avoid excessive API usage.`,groupId:A},type:`response`})}catch(e){if(e instanceof Error&&e.name===`AbortError`)return;let t=e instanceof Error?e.message:String(e);M&&W({payload:{groupId:A,error:t},type:`streaming-error`}),W({type:`error`,payload:{groupId:A,error:t}})}finally{q1(A),k&&Rr(A)}}async function $1(e,t,n,r,i,a,o,s){return e1(async()=>{await b1(e,a,o,s);let c=await fetch(n,{body:JSON.stringify(i),headers:r,method:`POST`,signal:s});if(x1(e,c.headers,o),!c.ok){let e=await c.text(),n=Error(`${t.name} API error ${c.status}: ${e}`);throw n.status=c.status,n}return GJ(t,await c.json())},{baseDelayMs:2e3,jitterFactor:.5,maxDelayMs:3e4,maxRetries:3,onRetry:(e,t,n,r)=>{let i=r instanceof Error?r.message:String(r);l1(a,`warning`,`Retrying API call (${e}/${t})`,i),W({type:`show-toast`,payload:{message:`LLM API: Retrying (${e}/${t})… ${i.slice(0,120)}`,type:`warning`,duration:5e3}})},shouldRetry:e=>n1(e),signal:s})}async function e0(e,t,n,r,i,a,o,s,c){let l={...i,stream:!0,...(t.format===`openai`||t.format===`mesh-llm`)&&{stream_options:{include_usage:!0}}};await b1(e,a,s,c);let u=await fetch(n,{body:JSON.stringify(l),headers:r,method:`POST`,signal:c});if(x1(e,u.headers,s),!u.ok){let e=await u.text(),n=Error(`${t.name} API error ${u.status}: ${e}`);throw n.status=u.status,n}if(!u.body)throw Error(`Streaming response has no body`);W({payload:{groupId:a},type:`streaming-start`});let d=0,f=``,p=0,m=``,h=(e=!1)=>{let t=Date.now();m&&(!e&&t-p<50||(l1(a,`info`,`Reasoning`,m.length>400?`${m.slice(0,400)}…`:m),m=``,p=t))},g=new U1(t.format,{source:t.id,onText:e=>{let t=Date.now();f+=e,t-d>=50&&(W({payload:{groupId:a,text:f},type:`streaming-chunk`}),f=``,d=t)},onToolStart:e=>{W(IK(a,e,`running`))},onUsage:e=>{W(C1(a,e,KJ(o)))},onThinking:e=>{m+=e,h(!1)}});for await(let e of w1(u.body,c))g.push(e);f&&W({payload:{groupId:a,text:f},type:`streaming-chunk`}),h(!0);let _=g.finalize();return t.format===`mesh-llm`&&(_=BJ(_)),_}async function t0(e){if(!(!e||e.name===`shadowclaw`)){try{if(await F(e,j.DB_MIGRATED_FROM_LEGACY)===`true`)return}catch{}try{let t=await new Promise(e=>{let t=indexedDB.open(x);t.onsuccess=()=>{let n=t.result;if(!n.objectStoreNames||n.objectStoreNames.length===0){n.close(),e(null);return}e(n)},t.onerror=()=>e(null)});if(t){let n=Array.from(t.objectStoreNames).filter(t=>e.objectStoreNames.contains(t));for(let r of n)await new Promise(n=>{try{let i=t.transaction(r,`readonly`).objectStore(r).getAll();i.onsuccess=()=>{let t=i.result||[];if(t.length>0)try{let i=e.transaction(r,`readwrite`),a=i.objectStore(r);for(let e of t)a.put(e);i.oncomplete=()=>n(),i.onerror=()=>n(),i.onabort=()=>n()}catch{n()}else n()},i.onerror=()=>n()}catch{n()}});t.close()}}catch(e){console.warn(`Legacy IndexedDB migration warning:`,e)}finally{try{await U(e,j.DB_MIGRATED_FROM_LEGACY,`true`)}catch{}}}}function n0(){return new Promise(async(e,t)=>{let n,r=S(),i=indexedDB.open(r,2);i.onupgradeneeded=()=>{let e=i.result;if(!e.objectStoreNames.contains(`messages`)){let t=e.createObjectStore(`messages`,{keyPath:`id`});t.createIndex(`by-group-time`,[`groupId`,`timestamp`]),t.createIndex(`by-group`,`groupId`)}if(e.objectStoreNames.contains(`sessions`)||e.createObjectStore(`sessions`,{keyPath:`groupId`}),!e.objectStoreNames.contains(`tasks`)){let t=e.createObjectStore(`tasks`,{keyPath:`id`});t.createIndex(`by-group`,`groupId`),t.createIndex(`by-enabled`,`enabled`)}e.objectStoreNames.contains(`config`)||e.createObjectStore(`config`,{keyPath:`key`}),e.objectStoreNames.contains(`pendingShares`)||e.createObjectStore(`pendingShares`,{keyPath:`id`}).createIndex(`by-createdAt`,`createdAt`)},i.onsuccess=async()=>{n=i.result,P(n);try{await t0(n)}catch(e){console.warn(`Error running IndexedDB legacy migration:`,e)}e(n)},i.onerror=()=>{t(Error(`Failed to open IndexedDB: ${i.error?.message}`))}})}async function r0(e,t,n,r={}){let i=[],a=[];for(let o of n)try{r.onStep?.(o);let s=i0(o.input||{},a,n),c=await s1(e,o.name,s,t,{isScheduledTask:!r.isManual,isTaskExecution:r.isTaskExecution});a.push(c),o.suppressOutput||i.push(`**Tool \`${o.name}\`**: ${c}`)}catch(e){let t=e.message||String(e);a.push(t),o.suppressOutput||i.push(`**Tool \`${o.name}\` failed**: ${t}`)}return{rawOutputs:a,results:i}}function i0(e,t,n){if(e&&typeof e==`object`){if(Array.isArray(e))return e.map(e=>i0(e,t,n));if(`$pipe`in e){let r=e.$pipe,i=``;if(r===`prev`)i=t[t.length-1]??``;else if(typeof r==`number`)i=t[r]??``;else if(typeof r==`string`){for(let e=t.length-1;e>=0;e--)if(n[e]?.name===r){i=t[e];break}}return a0(i)}let r={};for(let[i,a]of Object.entries(e))r[i]=i0(a,t,n);return r}return e}function a0(e){return typeof e==`string`?e:Array.isArray(e)?e.map(e=>e&&typeof e==`object`?`text`in e?String(e.text):`data`in e?String(e.data):JSON.stringify(e):String(e??``)).join(`
2238
- `):e&&typeof e==`object`?e:e??``}const o0=new Map;function s0(e,t){let n=jZ.get(e);n&&(clearTimeout(n),jZ.delete(e));let r=kZ.get(e);r&&(r(t),kZ.delete(e))}const c0=new Map;let l0=null,u0=w,d0=null,f0=!1,p0=null,m0=null,h0=!1;function g0(e,t,n={}){if(!l0||t!==u0)return;let{emitSyncedOnSuccess:r=!1,showWarningOnFailure:i=!1}=n;if(p0){m0={db:e,groupId:t};return}p0=Ri({db:e,groupId:t}).then(()=>{r&&W({type:`vm-workspace-synced`,payload:{groupId:t}})}).catch(e=>{console.warn(`[WebVM] Failed to sync host workspace into VM:`,e),i&&!f0&&(f0=!0,W({type:`show-toast`,payload:{message:`WebVM terminal connected, but workspace sync failed. File changes may not appear until the next sync.`,type:`warning`,duration:5e3}}))}).finally(()=>{p0=null;let e=m0;m0=null,!(!e||!l0||e.groupId!==u0)&&g0(e.db,e.groupId)})}function _0(){return l0?(d0?.(),d0=null,l0.close(),l0=null,f0=!1,p0=null,m0=null,!0):!1}async function v0(e){let{type:t,payload:n}=e.data,r;try{r=await n0()}catch(e){console.error(`[Worker] Failed to open database:`,e);return}switch(t){case`invoke`:{let e=n?.groupId,t=new AbortController;if(e){let n=c0.get(e);n&&n.abort(),c0.set(e,t)}try{await Q1(r,n,t.signal)}finally{e&&c0.get(e)===t&&c0.delete(e)}break}case`compact`:{let e=n?.groupId,t=new AbortController;if(e){let n=c0.get(e);n&&n.abort(),c0.set(e,t)}try{await S1(r,n,t.signal)}finally{e&&c0.get(e)===t&&c0.delete(e)}break}case`execute-direct-tool`:{let e=n?.groupId,t=n?.name,i=n?.input&&typeof n.input==`object`?n.input:{};if(!e||!t){W({type:`error`,payload:{groupId:e||`br:main`,error:`Invalid execute-direct-tool payload.`}});break}W({type:`response`,payload:{groupId:e,text:await s1(r,t,i,e)}});break}case`execute-task-tools`:{let e=n?.groupId,t=Array.isArray(n?.tools)?n.tools:[];if(!e||t.length===0){W({type:`error`,payload:{groupId:e||`br:main`,error:`Invalid execute-task-tools payload.`}});break}let{results:i}=await r0(r,e,t,{isManual:n.isManual,isTaskExecution:!0,onStep:e=>{e.suppressToast||W({type:`show-toast`,payload:{message:`Running task tool: ${e.name}...`,duration:3e3}})}});i.length>0&&W({type:`response`,payload:{groupId:e,text:i.join(`
2237
+ `).slice(0,1e4)}function Z1(e){let t=e.trim();return t?`Tool result:\n${t}`:``}async function Q1(e,t,n){let{apiKey:r,assistantName:i,contextCompression:a=!1,contextLimit:o,enabledTools:s,groupId:c,isScheduledTask:l=!1,maxIterations:u,maxTokens:d,memory:f,messages:p,model:m,provider:h,providerHeaders:g={},providerRuntimeOverrides:_,reasoning:v,rateLimitAutoAdapt:y=!0,rateLimitCallsPerMinute:b=0,storageHandle:x,streaming:S=!1,subagentModelSelectionMode:C,subagentMaxTokens:w,subagentPinnedModel:T,subagentPinnedProvider:E,systemPrompt:D,workspaceGroupId:ee}=t,k=!!t.subagentTask,A=k?c.startsWith(`subagent:`)?c:`subagent:${or()}`:c,j=ee||c;k&&Lr(A,[]);let te={autoAdapt:y!==!1,callsPerMinute:Number.isFinite(b)?Math.max(0,Math.floor(b)):0};x&&xe(x);let ne=O(h);if(!ne){W({payload:{groupId:A,error:`Unknown provider: ${h}`},type:`error`});return}let re=ne,M=S&&re.supportsStreaming===!0&&re.format!==`prompt_api`;W({type:`typing`,payload:{groupId:A}}),l1(A,`info`,`Starting`,`Provider: ${re.name} · Model: ${m} · Max tokens: ${d} · Streaming: ${M?`on`:`off`}${S&&!M?` (provider does not support streaming)`:``}`);try{let t=[...p],c=0,y=typeof u==`number`&&u>0?u:50,b=Array.isArray(s)?s:wK,S=D,O=``,ee={apiKey:r,assistantName:i??``,db:e,enabledTools:b,invokeSubagent:t=>H1(e,t,n),maxTokens:d,memory:f??``,model:m,provider:h,subagentModelSelectionMode:C,subagentMaxTokens:w,subagentPinnedProvider:E,subagentPinnedModel:T,providerHeaders:g,providerRuntimeOverrides:_,storageHandle:x,streaming:!1,systemPrompt:S??``},k=[];for(;c<y;){c++;let s=K1(A);s&&(b=s.enabledTools,S=JJ(i,f,b,s.systemPromptOverride));let u=o??KJ(m),p=NG(S),{messages:_,estimatedTokens:y}=IG(t,{contextLimit:u,maxOutputTokens:d,skimTop:a,systemPromptTokens:p}),x=y+p,C=Math.max(100,Math.min(d,u-x-500)),w=UJ(re,_,b,{contextCompression:a,maxTokens:C,model:m,reasoning:v,system:S});l1(A,`api-call`,`API call #${c}`,`${_.length} messages in context`);let T={...MJ(re,r),...g},E=re.baseUrl,D;D=M?await e0(h,re,E,T,w,A,m,te,n):await $1(h,re,E,T,w,A,te,n),D=Y1(D,b),D.usage&&W(C1(A,D.usage,KJ(m)));for(let e of D.content)e.type===`text`&&e.text&&l1(A,`text`,`Response text`,e.text.length>200?e.text.slice(0,200)+`…`:e.text);if(D.stop_reason===`tool_use`){let n=new Set(b.map(e=>typeof e?.name==`string`?e.name:``).filter(Boolean)),r=D.content.filter(e=>e.type===`text`).map(e=>e.text).join(``).replace(/<internal>[\s\S]*?<\/internal>/g,``).trim();r&&W({payload:{groupId:A,text:r},type:`intermediate-response`}),M&&W({payload:{groupId:A},type:`streaming-end`});let i=[];for(let t of D.content)if(t.type===`tool_use`){let r=n.has(t.name),a=`${t.name}:${JSON.stringify(t.input)}`,o=k.filter(e=>e===a).length;if(k.push(a),!r){let e=`SYSTEM ERROR: Tool '${t.name}' is disabled or unavailable for this request. Do not call it again. Try a different approach or ask the user for help.`;l1(A,`warning`,`Tool blocked`,e),i.push({content:e,tool_use_id:t.id,type:`tool_result`});continue}let s=JSON.stringify(t.input),c=s.length>300?s.slice(0,300)+`…`:s;l1(A,`tool-call`,`Tool: ${t.name}`,c),W(IK(A,t.name,`running`));let u;o>=3?(u=`SYSTEM ERROR: You have repeatedly called this tool with the exact same input (${o+1} times). This is a rigid loop. STOP calling this tool with these arguments. Try a different approach, fix the underlying issue, or ask the user for help.`,console.warn(`[Worker] Blocked repetitive tool call:`,a)):u=await s1(e,t.name,t.input,j,{allowedTools:b,isScheduledTask:l,invokeContext:ee});let d=typeof u==`string`?u:JSON.stringify(u),f=d.length>500?d.slice(0,500)+`…`:d;l1(A,`tool-result`,`Result: ${t.name}`,f),W(IK(A,t.name,`done`)),Array.isArray(u)?i.push({content:u,tool_use_id:t.id,type:`tool_result`}):i.push({content:typeof u==`string`?u.slice(0,1e5):JSON.stringify(u).slice(0,1e5),tool_use_id:t.id,type:`tool_result`})}O=X1(i),t.push({role:`assistant`,content:D.content}),t.push({role:`user`,content:i}),W({type:`typing`,payload:{groupId:A}})}else{let e=D.content.filter(e=>e.type===`text`).map(e=>e.text).join(``).replace(/<internal>[\s\S]*?<\/internal>/g,``).trim(),t=(e.toLowerCase()===`(no response)`?``:e)||(O?Z1(O):`(no response)`);M&&W({payload:{groupId:A,text:t},type:`streaming-done`}),W({payload:{groupId:A,text:t},type:`response`});return}}W({payload:{text:`⚠️ Reached maximum tool-use iterations (${y}). Stopping to avoid excessive API usage.`,groupId:A},type:`response`})}catch(e){if(e instanceof Error&&e.name===`AbortError`)return;let t=e instanceof Error?e.message:String(e);M&&W({payload:{groupId:A,error:t},type:`streaming-error`}),W({type:`error`,payload:{groupId:A,error:t}})}finally{q1(A),k&&Rr(A)}}async function $1(e,t,n,r,i,a,o,s){return e1(async()=>{await b1(e,a,o,s);let c=await fetch(n,{body:JSON.stringify(i),headers:r,method:`POST`,signal:s});if(x1(e,c.headers,o),!c.ok){let e=await c.text(),n=Error(`${t.name} API error ${c.status}: ${e}`);throw n.status=c.status,n}return GJ(t,await c.json())},{baseDelayMs:2e3,jitterFactor:.5,maxDelayMs:3e4,maxRetries:3,onRetry:(e,t,n,r)=>{let i=r instanceof Error?r.message:String(r);l1(a,`warning`,`Retrying API call (${e}/${t})`,i),W({type:`show-toast`,payload:{message:`LLM API: Retrying (${e}/${t})… ${i.slice(0,120)}`,type:`warning`,duration:5e3}})},shouldRetry:e=>n1(e),signal:s})}async function e0(e,t,n,r,i,a,o,s,c){let l={...i,stream:!0,...(t.format===`openai`||t.format===`mesh-llm`)&&{stream_options:{include_usage:!0}}};await b1(e,a,s,c);let u=await fetch(n,{body:JSON.stringify(l),headers:r,method:`POST`,signal:c});if(x1(e,u.headers,s),!u.ok){let e=await u.text(),n=Error(`${t.name} API error ${u.status}: ${e}`);throw n.status=u.status,n}if(!u.body)throw Error(`Streaming response has no body`);W({payload:{groupId:a},type:`streaming-start`});let d=0,f=``,p=0,m=``,h=(e=!1)=>{let t=Date.now();m&&(!e&&t-p<50||(l1(a,`info`,`Reasoning`,m.length>400?`${m.slice(0,400)}…`:m),m=``,p=t))},g=new U1(t.format,{source:t.id,onText:e=>{let t=Date.now();f+=e,t-d>=50&&(W({payload:{groupId:a,text:f},type:`streaming-chunk`}),f=``,d=t)},onToolStart:e=>{W(IK(a,e,`running`))},onUsage:e=>{W(C1(a,e,KJ(o)))},onThinking:e=>{m+=e,h(!1)}});for await(let e of w1(u.body,c))g.push(e);f&&W({payload:{groupId:a,text:f},type:`streaming-chunk`}),h(!0);let _=g.finalize();return t.format===`mesh-llm`&&(_=BJ(_)),_}async function t0(e){if(!(!e||e.name===`shadowclaw`)){try{if(await F(e,j.DB_MIGRATED_FROM_LEGACY)===`true`)return}catch{}try{let t=await new Promise(e=>{let t=indexedDB.open(x);t.onsuccess=()=>{let n=t.result;if(!n.objectStoreNames||n.objectStoreNames.length===0){n.close(),e(null);return}e(n)},t.onerror=()=>e(null)});if(t){let n=Array.from(t.objectStoreNames).filter(t=>e.objectStoreNames.contains(t));for(let r of n)await new Promise(n=>{try{let i=t.transaction(r,`readonly`).objectStore(r).getAll();i.onsuccess=()=>{let t=i.result||[];if(t.length>0)try{let i=e.transaction(r,`readwrite`),a=i.objectStore(r);for(let e of t)a.put(e);i.oncomplete=()=>n(),i.onerror=()=>n(),i.onabort=()=>n()}catch{n()}else n()},i.onerror=()=>n()}catch{n()}});t.close()}}catch(e){console.warn(`Legacy IndexedDB migration warning:`,e)}finally{try{await U(e,j.DB_MIGRATED_FROM_LEGACY,`true`)}catch{}}}}async function n0(e,t,n){for await(let[r,i]of e.entries())if(i.kind===`directory`)await n0(i,await t.getDirectoryHandle(r,{create:!0}),[...n,r]);else if(i.kind===`file`){let e=await i.getFile(),a=await t.getFileHandle(r,{create:!0});try{await Cn(a,e)}catch(t){if(!(t instanceof Error?t.message:String(t)).includes(`Writable file streams are not supported`))throw t;await wn([...n,r],e)}}}async function r0(e){if(!e)return;try{if(await F(e,j.OPFS_MIGRATED_FROM_LEGACY)===`true`)return}catch{}let t=_e();if(t!==`shadowclaw`&&!(typeof navigator>`u`||!navigator.storage||typeof navigator.storage.getDirectory!=`function`))try{let n=await navigator.storage.getDirectory(),r;try{r=await n.getDirectoryHandle(`shadowclaw`)}catch{try{await U(e,j.OPFS_MIGRATED_FROM_LEGACY,`true`)}catch{}return}let i=await n.getDirectoryHandle(t,{create:!0});await n0(r,i,[t])}catch(e){console.warn(`Legacy OPFS migration warning:`,e)}finally{try{await U(e,j.OPFS_MIGRATED_FROM_LEGACY,`true`)}catch{}}}function i0(){return new Promise(async(e,t)=>{let n,r=S(),i=indexedDB.open(r,2);i.onupgradeneeded=()=>{let e=i.result;if(!e.objectStoreNames.contains(`messages`)){let t=e.createObjectStore(`messages`,{keyPath:`id`});t.createIndex(`by-group-time`,[`groupId`,`timestamp`]),t.createIndex(`by-group`,`groupId`)}if(e.objectStoreNames.contains(`sessions`)||e.createObjectStore(`sessions`,{keyPath:`groupId`}),!e.objectStoreNames.contains(`tasks`)){let t=e.createObjectStore(`tasks`,{keyPath:`id`});t.createIndex(`by-group`,`groupId`),t.createIndex(`by-enabled`,`enabled`)}e.objectStoreNames.contains(`config`)||e.createObjectStore(`config`,{keyPath:`key`}),e.objectStoreNames.contains(`pendingShares`)||e.createObjectStore(`pendingShares`,{keyPath:`id`}).createIndex(`by-createdAt`,`createdAt`)},i.onsuccess=async()=>{n=i.result,P(n);try{await t0(n),await r0(n)}catch(e){console.warn(`Error running legacy migration:`,e)}e(n)},i.onerror=()=>{t(Error(`Failed to open IndexedDB: ${i.error?.message}`))}})}async function a0(e,t,n,r={}){let i=[],a=[];for(let o of n)try{r.onStep?.(o);let s=o0(o.input||{},a,n),c=await s1(e,o.name,s,t,{isScheduledTask:!r.isManual,isTaskExecution:r.isTaskExecution});a.push(c),o.suppressOutput||i.push(`**Tool \`${o.name}\`**: ${c}`)}catch(e){let t=e.message||String(e);a.push(t),o.suppressOutput||i.push(`**Tool \`${o.name}\` failed**: ${t}`)}return{rawOutputs:a,results:i}}function o0(e,t,n){if(e&&typeof e==`object`){if(Array.isArray(e))return e.map(e=>o0(e,t,n));if(`$pipe`in e){let r=e.$pipe,i=``;if(r===`prev`)i=t[t.length-1]??``;else if(typeof r==`number`)i=t[r]??``;else if(typeof r==`string`){for(let e=t.length-1;e>=0;e--)if(n[e]?.name===r){i=t[e];break}}return s0(i)}let r={};for(let[i,a]of Object.entries(e))r[i]=o0(a,t,n);return r}return e}function s0(e){return typeof e==`string`?e:Array.isArray(e)?e.map(e=>e&&typeof e==`object`?`text`in e?String(e.text):`data`in e?String(e.data):JSON.stringify(e):String(e??``)).join(`
2238
+ `):e&&typeof e==`object`?e:e??``}const c0=new Map;function l0(e,t){let n=jZ.get(e);n&&(clearTimeout(n),jZ.delete(e));let r=kZ.get(e);r&&(r(t),kZ.delete(e))}const u0=new Map;let d0=null,f0=w,p0=null,m0=!1,h0=null,g0=null,_0=!1;function v0(e,t,n={}){if(!d0||t!==f0)return;let{emitSyncedOnSuccess:r=!1,showWarningOnFailure:i=!1}=n;if(h0){g0={db:e,groupId:t};return}h0=Ri({db:e,groupId:t}).then(()=>{r&&W({type:`vm-workspace-synced`,payload:{groupId:t}})}).catch(e=>{console.warn(`[WebVM] Failed to sync host workspace into VM:`,e),i&&!m0&&(m0=!0,W({type:`show-toast`,payload:{message:`WebVM terminal connected, but workspace sync failed. File changes may not appear until the next sync.`,type:`warning`,duration:5e3}}))}).finally(()=>{h0=null;let e=g0;g0=null,!(!e||!d0||e.groupId!==f0)&&v0(e.db,e.groupId)})}function y0(){return d0?(p0?.(),p0=null,d0.close(),d0=null,m0=!1,h0=null,g0=null,!0):!1}async function b0(e){let{type:t,payload:n}=e.data,r;try{r=await i0()}catch(e){console.error(`[Worker] Failed to open database:`,e);return}switch(t){case`invoke`:{let e=n?.groupId,t=new AbortController;if(e){let n=u0.get(e);n&&n.abort(),u0.set(e,t)}try{await Q1(r,n,t.signal)}finally{e&&u0.get(e)===t&&u0.delete(e)}break}case`compact`:{let e=n?.groupId,t=new AbortController;if(e){let n=u0.get(e);n&&n.abort(),u0.set(e,t)}try{await S1(r,n,t.signal)}finally{e&&u0.get(e)===t&&u0.delete(e)}break}case`execute-direct-tool`:{let e=n?.groupId,t=n?.name,i=n?.input&&typeof n.input==`object`?n.input:{};if(!e||!t){W({type:`error`,payload:{groupId:e||`br:main`,error:`Invalid execute-direct-tool payload.`}});break}W({type:`response`,payload:{groupId:e,text:await s1(r,t,i,e)}});break}case`execute-task-tools`:{let e=n?.groupId,t=Array.isArray(n?.tools)?n.tools:[];if(!e||t.length===0){W({type:`error`,payload:{groupId:e||`br:main`,error:`Invalid execute-task-tools payload.`}});break}let{results:i}=await a0(r,e,t,{isManual:n.isManual,isTaskExecution:!0,onStep:e=>{e.suppressToast||W({type:`show-toast`,payload:{message:`Running task tool: ${e.name}...`,duration:3e3}})}});i.length>0&&W({type:`response`,payload:{groupId:e,text:i.join(`
2239
2239
 
2240
- `)}});break}case`execute-skill-tools`:{let e=n?.groupId,t=Array.isArray(n?.tools)?n.tools:[];if(!e||t.length===0){W({type:`error`,payload:{groupId:e||`br:main`,error:`Invalid execute-skill-tools payload.`}});break}let{results:i}=await r0(r,e,t,{isManual:!0,isTaskExecution:!1,onStep:e=>{e.suppressToast||W({type:`show-toast`,payload:{message:`Running skill tool: ${e.name}...`,duration:3e3}})}});i.length>0&&W({type:`response`,payload:{groupId:e,text:i.join(`
2240
+ `)}});break}case`execute-skill-tools`:{let e=n?.groupId,t=Array.isArray(n?.tools)?n.tools:[];if(!e||t.length===0){W({type:`error`,payload:{groupId:e||`br:main`,error:`Invalid execute-skill-tools payload.`}});break}let{results:i}=await a0(r,e,t,{isManual:!0,isTaskExecution:!1,onStep:e=>{e.suppressToast||W({type:`show-toast`,payload:{message:`Running skill tool: ${e.name}...`,duration:3e3}})}});i.length>0&&W({type:`response`,payload:{groupId:e,text:i.join(`
2241
2241
 
2242
- `)}});break}case`set-storage`:n.storageHandle&&xe(n.storageHandle);break;case`set-vm-mode`:{let e=n?.mode,t=e===`disabled`||e===`auto`||e===`9p`||e===`ext2`,r=Object.prototype.hasOwnProperty.call(n||{},`bootHost`),i=Object.prototype.hasOwnProperty.call(n||{},`networkRelayUrl`);if(t||r||i){_0()&&W({type:`vm-terminal-closed`,payload:{ok:!0}}),t&&Oi(e),r&&Ai(n?.bootHost),i&&ji(n?.networkRelayUrl);let a=t?e:ki();await Ti(),a!==`disabled`&&Promise.resolve(Ci()).catch(e=>{console.warn(`[WebVM] Reboot after mode change failed:`,e)})}break}case`vm-terminal-open`:{let e=typeof n?.groupId==`string`&&n.groupId?n.groupId:w;if(l0){u0=e,W({type:`vm-terminal-opened`,payload:{ok:!0}});break}if(h0)break;h0=!0,(async()=>{let t=null;try{Di().ready||(t=Li(e=>{W({type:`vm-terminal-output`,payload:{chunk:e}})}),await Ci().catch(e=>{console.warn(`[WebVM] Terminal boot failed:`,e)}),t?.(),t=null);let n=Di();if(!n.ready){W({type:`vm-terminal-error`,payload:{error:n.error||`WebVM is still booting.`}});return}let i={db:r,groupId:e};u0=e,l0=Ii(e=>{W({type:`vm-terminal-output`,payload:{chunk:e}})}),W({type:`vm-terminal-opened`,payload:{ok:!0}}),l0.send(`
2243
- `),g0(i.db,e,{emitSyncedOnSuccess:!0,showWarningOnFailure:!0}),d0=zi(i,()=>{W({type:`vm-workspace-synced`,payload:{groupId:e}})})}catch(e){W({type:`vm-terminal-error`,payload:{error:e instanceof Error?e.message:String(e)}})}finally{h0=!1,t?.()}})();break}case`vm-terminal-input`:{let e=n?.data;if(!l0){W({type:`vm-terminal-error`,payload:{error:`WebVM terminal is not connected.`}});break}typeof e==`string`&&e.length>0&&l0.send(e);break}case`vm-terminal-close`:{let e=typeof n?.groupId==`string`&&n.groupId?n.groupId:u0;_0(),Bi({db:r,groupId:e}).then(()=>{W({type:`vm-workspace-synced`,payload:{groupId:e}})}).catch(()=>{}),W({type:`vm-terminal-closed`,payload:{ok:!0}});break}case`vm-workspace-sync`:{let e=typeof n?.groupId==`string`&&n.groupId?n.groupId:u0;g0(r,e);break}case`vm-workspace-flush`:{let e=typeof n?.groupId==`string`&&n.groupId?n.groupId:u0;Bi({db:r,groupId:e}).then(()=>{W({type:`vm-workspace-synced`,payload:{groupId:e}})}).catch(()=>{});break}case`task-list-response`:{let{groupId:e,tasks:t}=n,r=o0.get(e);r&&(r(t),o0.delete(e));break}case`cancel`:if(n?.groupId){let e=c0.get(n.groupId);e&&(e.abort(),c0.delete(n.groupId))}else{for(let e of c0.values())e.abort();c0.clear()}break;case`update-tools`:{let{groupId:e,enabledTools:t,systemPromptOverride:r}=n;G1(e,t,r);break}case`execute-tool`:try{let t=await s1(r,n.name,n.input,n.groupId);self.postMessage({type:`execute-tool-result`,callId:e.data.callId,result:t})}catch(t){self.postMessage({type:`execute-tool-result`,callId:e.data.callId,error:t instanceof Error?t.message:String(t)})}break;case`mcp-reauth-result`:{let{connectionId:e,success:t}=n;s0(e,!!t);break}case`ask-user-response`:{let{id:e,response:t}=n,r=globalThis.pendingAskUserResolvers;r&&r[e]&&(r[e](t??``),delete r[e]);break}case`native-ai-task-response`:{let{id:e,response:t,error:r}=n,i=globalThis.pendingNativeAiResolvers;i&&i[e]&&(r?i[e].reject(Error(r)):i[e].resolve(t),delete i[e]);break}}}Fi(e=>{self.postMessage({type:`vm-status`,payload:e})}),(async()=>{try{let e=await n0(),t=await F(e,j.VM_BOOT_MODE),n=t===`disabled`||t===`9p`||t===`ext2`||t===`auto`?t:`disabled`,r=await F(e,j.VM_BOOT_HOST),i=typeof r==`string`?r:`http://localhost:8888`,a=await F(e,j.VM_NETWORK_RELAY_URL);Oi(n),Ai(i),ji(a),(n===`ext2`||n===`9p`)&&await Ci()}catch(e){console.warn(`[WebVM] Eager boot failed:`,e)}})();function y0(e,t=`info`,n){self.postMessage({type:`show-toast`,payload:{message:e,type:t,duration:n}})}function b0(e,t){y0(e,`success`,t)}function x0(e,t){y0(e,`error`,t)}function S0(e,t){y0(e,`warning`,t)}function C0(e,t){y0(e,`info`,t)}globalThis.showToast=y0,globalThis.showSuccess=b0,globalThis.showError=x0,globalThis.showWarning=S0,globalThis.showInfo=C0,self.onmessage=v0;export{Ea as _,Zc as a,ne as b,dc as c,xs as d,bs as f,ka as g,cs as h,tl as i,Rs as l,ls as m,al as n,Xc as o,_s as p,nl as r,Dc as s,ol as t,ks as u,se as v,te as y};
2242
+ `)}});break}case`set-storage`:n.storageHandle&&xe(n.storageHandle);break;case`set-vm-mode`:{let e=n?.mode,t=e===`disabled`||e===`auto`||e===`9p`||e===`ext2`,r=Object.prototype.hasOwnProperty.call(n||{},`bootHost`),i=Object.prototype.hasOwnProperty.call(n||{},`networkRelayUrl`);if(t||r||i){y0()&&W({type:`vm-terminal-closed`,payload:{ok:!0}}),t&&Oi(e),r&&Ai(n?.bootHost),i&&ji(n?.networkRelayUrl);let a=t?e:ki();await Ti(),a!==`disabled`&&Promise.resolve(Ci()).catch(e=>{console.warn(`[WebVM] Reboot after mode change failed:`,e)})}break}case`vm-terminal-open`:{let e=typeof n?.groupId==`string`&&n.groupId?n.groupId:w;if(d0){f0=e,W({type:`vm-terminal-opened`,payload:{ok:!0}});break}if(_0)break;_0=!0,(async()=>{let t=null;try{Di().ready||(t=Li(e=>{W({type:`vm-terminal-output`,payload:{chunk:e}})}),await Ci().catch(e=>{console.warn(`[WebVM] Terminal boot failed:`,e)}),t?.(),t=null);let n=Di();if(!n.ready){W({type:`vm-terminal-error`,payload:{error:n.error||`WebVM is still booting.`}});return}let i={db:r,groupId:e};f0=e,d0=Ii(e=>{W({type:`vm-terminal-output`,payload:{chunk:e}})}),W({type:`vm-terminal-opened`,payload:{ok:!0}}),d0.send(`
2243
+ `),v0(i.db,e,{emitSyncedOnSuccess:!0,showWarningOnFailure:!0}),p0=zi(i,()=>{W({type:`vm-workspace-synced`,payload:{groupId:e}})})}catch(e){W({type:`vm-terminal-error`,payload:{error:e instanceof Error?e.message:String(e)}})}finally{_0=!1,t?.()}})();break}case`vm-terminal-input`:{let e=n?.data;if(!d0){W({type:`vm-terminal-error`,payload:{error:`WebVM terminal is not connected.`}});break}typeof e==`string`&&e.length>0&&d0.send(e);break}case`vm-terminal-close`:{let e=typeof n?.groupId==`string`&&n.groupId?n.groupId:f0;y0(),Bi({db:r,groupId:e}).then(()=>{W({type:`vm-workspace-synced`,payload:{groupId:e}})}).catch(()=>{}),W({type:`vm-terminal-closed`,payload:{ok:!0}});break}case`vm-workspace-sync`:{let e=typeof n?.groupId==`string`&&n.groupId?n.groupId:f0;v0(r,e);break}case`vm-workspace-flush`:{let e=typeof n?.groupId==`string`&&n.groupId?n.groupId:f0;Bi({db:r,groupId:e}).then(()=>{W({type:`vm-workspace-synced`,payload:{groupId:e}})}).catch(()=>{});break}case`task-list-response`:{let{groupId:e,tasks:t}=n,r=c0.get(e);r&&(r(t),c0.delete(e));break}case`cancel`:if(n?.groupId){let e=u0.get(n.groupId);e&&(e.abort(),u0.delete(n.groupId))}else{for(let e of u0.values())e.abort();u0.clear()}break;case`update-tools`:{let{groupId:e,enabledTools:t,systemPromptOverride:r}=n;G1(e,t,r);break}case`execute-tool`:try{let t=await s1(r,n.name,n.input,n.groupId);self.postMessage({type:`execute-tool-result`,callId:e.data.callId,result:t})}catch(t){self.postMessage({type:`execute-tool-result`,callId:e.data.callId,error:t instanceof Error?t.message:String(t)})}break;case`mcp-reauth-result`:{let{connectionId:e,success:t}=n;l0(e,!!t);break}case`ask-user-response`:{let{id:e,response:t}=n,r=globalThis.pendingAskUserResolvers;r&&r[e]&&(r[e](t??``),delete r[e]);break}case`native-ai-task-response`:{let{id:e,response:t,error:r}=n,i=globalThis.pendingNativeAiResolvers;i&&i[e]&&(r?i[e].reject(Error(r)):i[e].resolve(t),delete i[e]);break}}}Fi(e=>{self.postMessage({type:`vm-status`,payload:e})}),(async()=>{try{let e=await i0(),t=await F(e,j.VM_BOOT_MODE),n=t===`disabled`||t===`9p`||t===`ext2`||t===`auto`?t:`disabled`,r=await F(e,j.VM_BOOT_HOST),i=typeof r==`string`?r:`http://localhost:8888`,a=await F(e,j.VM_NETWORK_RELAY_URL);Oi(n),Ai(i),ji(a),(n===`ext2`||n===`9p`)&&await Ci()}catch(e){console.warn(`[WebVM] Eager boot failed:`,e)}})();function x0(e,t=`info`,n){self.postMessage({type:`show-toast`,payload:{message:e,type:t,duration:n}})}function S0(e,t){x0(e,`success`,t)}function C0(e,t){x0(e,`error`,t)}function w0(e,t){x0(e,`warning`,t)}function T0(e,t){x0(e,`info`,t)}globalThis.showToast=x0,globalThis.showSuccess=S0,globalThis.showError=C0,globalThis.showWarning=w0,globalThis.showInfo=T0,self.onmessage=b0;export{Ea as _,Zc as a,ne as b,dc as c,xs as d,bs as f,ka as g,cs as h,tl as i,Rs as l,ls as m,al as n,Xc as o,_s as p,nl as r,Dc as s,ol as t,ks as u,se as v,te as y};
@@ -1 +1 @@
1
- import{n as e}from"./rolldown-runtime-aKtaBQYM.js";let t=null;function n(){let e=y(`/static-routing.json`);if(typeof window<`u`&&window.location?.origin)try{return new URL(e,window.location.origin).toString()}catch{return e}return e}function r(e){return e.replace(/^\/+|\/+$/g,``)}function i(e){let t=r(e);return t.endsWith(`/index.html`)?t=t.slice(0,-11):t.endsWith(`index.html`)&&(t=t.slice(0,-10)),r(t)}function a(e){let t=r(e),n=t.split(`/`).filter(Boolean);if(n.length===0)return null;let i=n[0].toLowerCase();if(i===`pages`){if(n.length>=3){let e=n[1];return{page:`pages`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:n.slice(2).join(`/`)}}return{page:`pages`,groupId:`br:main`,path:n.slice(1).join(`/`)}}if(i===`files`){let e=n[1]||`main`;return{page:`files`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:n.slice(2).join(`/`)||void 0}}if(i===`chat`){let e=n[1]||`main`;return{page:`chat`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}if(i===`tasks`){let e=n[1]||`main`;return{page:`tasks`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}return i===`main`?{page:`pages`,groupId:`br:main`,path:n.slice(1).join(`/`)}:{page:`pages`,groupId:`br:main`,path:t}}function o(){if(typeof document<`u`){let e=document.getElementById(`shadow-claw-static-routing`);if(e&&e.textContent)try{let t=JSON.parse(e.textContent);if(t&&typeof t==`object`&&t.routes)return t}catch(e){console.warn(`Failed to parse embedded static routing manifest:`,e)}}return null}async function s(){if(t)return t;let e=o(),r=n();if(!e&&typeof fetch==`function`)try{let t=await fetch(r);if(t.ok){let n=await t.json();n&&typeof n==`object`&&(e=n)}}catch{}return e?(e.routes||={},t=e,t):{routes:{}}}function c(e,n){let r=n||t||o();if(!r||!r.routes)return null;let s=i(e);if(!s)return null;for(let[e,t]of Object.entries(r.routes))if(!(!t||!t.prettyPath)&&i(t.prettyPath)===s)return a(e);return null}async function l(e){let t=c(e);if(t)return t;let r=await s();if(!r||!r.subRoutes)return null;let a=r,o=n(),l=5;for(;a&&a.subRoutes&&l>0;){let t=null,n=i(e);if(Array.isArray(a.subRoutes))for(let e of a.subRoutes){let r=e.replace(/\/routes\.json$/,``);if(n.startsWith(r)){t=e;break}}else if(typeof a.subRoutes==`object`){let e=``;for(let[r,o]of Object.entries(a.subRoutes)){let a=i(r);n.startsWith(a)&&a.length>e.length&&(e=a,t=o)}}if(!t||typeof fetch!=`function`)break;try{let n=t;try{if(t.startsWith(`http://`)||t.startsWith(`https://`))n=t;else if(t.startsWith(`/`)){let e=y(t);n=typeof window<`u`&&window.location?.origin?new URL(e,window.location.origin).toString():e}else n=new URL(t,o).toString()}catch{}let i=await fetch(n);if(!i.ok)break;let s=await i.json();if(!s||typeof s!=`object`)break;s.routes&&Object.assign(r.routes,s.routes);let u=c(e,r);if(u)return u;a=s,o=n,l--}catch(e){console.warn(`Failed to lazy load subRoute:`,t,e);break}}return null}function u(e,n){let i=n||t||o();if(!i||!i.routes)return null;let{page:a,groupId:s,path:c}=e;if(!a)return null;let l=s===`br:main`||s===`main`?`main`:s?.startsWith(`br:`)?`br-${s.slice(3)}`:s,u=[];if(a===`pages`&&c){let e=r(c);l===`main`?(u.push(`/pages/main/${e}`),u.push(`pages/main/${e}`),u.push(`/pages/br:main/${e}`),u.push(`/pages/br-main/${e}`),u.push(`/main/${e}`),u.push(`main/${e}`),u.push(`/${e}`),u.push(e)):l&&(u.push(`/pages/${l}/${e}`),u.push(`pages/${l}/${e}`),u.push(`/pages/${s}/${e}`))}else if(a===`files`&&c){let e=r(c);l&&(u.push(`/files/${l}/${e}`),u.push(`files/${l}/${e}`),u.push(`/files/${s}/${e}`))}for(let e of u){let t=r(e);for(let[e,n]of Object.entries(i.routes))if(r(e)===t&&n?.prettyPath)return n.prettyPath}return null}var d=e({applyBasePath:()=>y,buildRoutePath:()=>C,getAppBasePath:()=>v,getDeploymentNamespace:()=>_,getFileRouteDirPath:()=>O,getWorkspaceRouteRequestPath:()=>k,isPossibleAppRoute:()=>T,parseRouteFromUrl:()=>w,parseRouteFromUrlAsync:()=>E,resetAppBasePathCache:()=>g,resolveHrefAgainstRoute:()=>D});function f(e){return e===`br:main`?`main`:e.startsWith(`br:`)?`br-${e.slice(3)}`:encodeURIComponent(e)}function p(e){try{return decodeURIComponent(e)}catch{return e}}let m=null;const h=new Set([`chat`,`files`,`tasks`,`pages`,`settings`,`tools`,`channels`]);function g(){m=null}typeof globalThis<`u`&&(globalThis.__applyBasePathCacheReset=g);function _(){let e=typeof window<`u`?window:typeof self<`u`?self:globalThis;if(e&&e.__SHADOWCLAW_DEPLOY_ID__){let t=String(e.__SHADOWCLAW_DEPLOY_ID__).trim();if(t)return t.replace(/[^a-zA-Z0-9_-]/g,`-`)}let t=globalThis.process;if(t&&t.env&&t.env.SHADOWCLAW_DEPLOY_ID){let e=String(t.env.SHADOWCLAW_DEPLOY_ID).trim();if(e)return e.replace(/[^a-zA-Z0-9_-]/g,`-`)}let n=v();return!n||n===`/`?``:n.replace(/^\/+|\/+$/g,``).replace(/[^a-zA-Z0-9_-]/g,`-`)}function v(){if(m!==null)return m;if((typeof window>`u`||globalThis.WorkerGlobalScope!==void 0&&typeof self<`u`&&self instanceof globalThis.WorkerGlobalScope)&&typeof self<`u`&&self.location){let e=(self.location.pathname||`/`).split(`/`).filter(Boolean);if(e.length<=1)return m=`/`,m;let t=e[0].toLowerCase(),n=t===`service-worker.js`||t===`sw.js`||t===`manifest.json`||t===`sitemap.xml`||t===`favicon.ico`||t===`index.html`||t===`service-worker`||t===`assets`||t===`dist`||t===`public`;if(n&&e.length===2)return m=`/`,m;if(!n)return m=`/`+e[0]+`/`,m}let e=typeof window<`u`&&window.location?window.location:typeof self<`u`&&self.location?self.location:null;if(!e)return`/`;if(typeof document<`u`&&typeof document.querySelector==`function`){let t=document.querySelector(`base[href]`);if(t){let n=t.getAttribute(`href`);if(n)try{let t=new URL(n,e.origin).pathname;return t.endsWith(`/`)||(t+=`/`),m=t,m}catch{}}}let t=e.pathname||`/`;if(t===`/`)return m=`/`,m;let n=t.split(`/`).filter(Boolean),r=n.findIndex(e=>h.has(e.toLowerCase()));return r>=0?r===0?(m=`/`,m):(m=`/`+n.slice(0,r).join(`/`)+`/`,m):c(t)?(m=`/`,m):n.length===1&&!t.includes(`.`)?(m=`/`+n[0]+`/`,m):(m=`/`,m)}function y(e){let t=v();if(t===`/`)return e;let[n,...r]=e.split(/(?=[?#])/);if(n===t||n.startsWith(t))return e;let i=t+(n.startsWith(`/`)?n.slice(1):n);return i=i.replace(/\/{2,}/g,`/`),i+r.join(``)}function b(e){return e.replace(/^\/+|\/+$/g,``)}function x(e){return e&&(e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e)}function S(e){if(!e)return;let t=b(e.replace(/\\/g,`/`));if(!t)return;let n=t.split(`/`).filter(Boolean).filter(e=>e!==`.`&&e!==`..`);if(n.length!==0)return n.join(`/`)}function C(e){let t=e.anchor?`#${e.anchor.replace(/^#/,``)}`:``,n=u(e);if(n){let e=n;return e.startsWith(`/`)||(e=`/${e}`),`${e}${t}`}switch(e.page){case`chat`:return`${e.groupId?`/chat/${f(e.groupId)}/`:`/chat`}${t}`;case`tasks`:return`${e.groupId?`/tasks/${f(e.groupId)}/`:`/tasks`}${t}`;case`files`:{let n=S(e.path);return e.groupId?n?`/files/${f(e.groupId)}/${n}${t}`:`/files/${f(e.groupId)}/${t}`:`/files${t}`}case`pages`:{let n=S(e.path);return n?e.groupId?`/pages/${f(e.groupId)}/${n}${t}`:`/pages/${n}${t}`:`/pages${t}`}case`tools`:return`/settings/tool-configuration${t}`;case`channels`:return`/settings/channel-configuration${t}`;default:return`/settings${t}`}}function w(e,t){let n=e.pathname,r=v();r!==`/`&&n.startsWith(r)&&(n=`/`+n.slice(r.length));let i=c(n);if(i){let t=e.hash?e.hash.replace(/^#/,``):void 0;return{...i,anchor:t||i.anchor}}let a=n.split(`/`).filter(Boolean).map(e=>p(e)),o=e.hash?e.hash.replace(/^#/,``):void 0;if(a.length===0)return null;let s=a[0].toLowerCase();if(s===`chat`)return{page:`chat`,groupId:x(a[1]||t),anchor:o};if(s===`tasks`)return{page:`tasks`,groupId:x(a[1]||t),anchor:o};if(s===`files`)return{page:`files`,groupId:x(a[1]||t),path:S(a.slice(2).join(`/`)),anchor:o};if(s===`pages`)return a.length>=3?{page:`pages`,groupId:x(a[1]),path:S(a.slice(2).join(`/`)),anchor:o}:{page:`pages`,groupId:x(t),path:S(a.slice(1).join(`/`)),anchor:o};if(s===`settings`){let e=(a[1]||``).toLowerCase();return e===`tool-configuration`?{page:`tools`,anchor:o}:e===`channel-configuration`?{page:`channels`,anchor:o}:{page:`settings`,anchor:o}}return s===`tools`?{page:`tools`,anchor:o}:s===`channels`?{page:`channels`,anchor:o}:null}function T(e){let t=e,n=v();if(n!==`/`&&t.startsWith(n))t=`/`+t.slice(n.length);else if(n!==`/`&&!t.startsWith(n))return!1;let r=t.split(`/`).filter(Boolean);if(r.length===0)return!0;let i=r[0].toLowerCase();return!!(h.has(i)||c(t))}async function E(e,t){let n=w(e,t);if(n)return n;let r=e.pathname,i=v();i!==`/`&&r.startsWith(i)&&(r=`/`+r.slice(i.length));let a=await l(r);if(a){let t=e.hash?e.hash.replace(/^#/,``):void 0;return{...a,anchor:t||a.anchor}}return null}function D(e,t,n){let r=e.trim();if(!r||r.startsWith(`javascript:`))return null;if(r.startsWith(`/`))try{let e=y(r);return new URL(e,n)}catch{return null}let i=new URL(t,n);try{return new URL(r,i)}catch{return null}}function O(e,t){let n=S(t);if(!n)return C({page:`files`,groupId:e});let r=n.split(`/`);r.pop();let i=r.length>0?`${r.join(`/`)}/`:``;return`/files/${f(e)}/${i}`}function k(e){let t=e.split(`/`).filter(Boolean).map(e=>p(e));if(t.length<3||t[0]!==`files`)return null;let n=x(t[1])||t[1],r=S(t.slice(2).join(`/`));return!n||!r?null:{groupId:n,path:r}}export{O as a,w as c,_ as i,E as l,y as n,k as o,C as r,T as s,d as t,D as u};
1
+ import{n as e}from"./rolldown-runtime-aKtaBQYM.js";let t=null;function n(){let e=y(`/static-routing.json`);if(typeof window<`u`&&window.location?.origin)try{return new URL(e,window.location.origin).toString()}catch{return e}return e}function r(e){return e.replace(/^\/+|\/+$/g,``)}function i(e){let t=r(e);return t.endsWith(`/index.html`)?t=t.slice(0,-11):t.endsWith(`index.html`)&&(t=t.slice(0,-10)),r(t)}function a(e){let t=r(e),n=t.split(`/`).filter(Boolean);if(n.length===0)return null;let i=n[0].toLowerCase();if(i===`pages`){if(n.length>=3){let e=n[1];return{page:`pages`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:n.slice(2).join(`/`)}}return{page:`pages`,groupId:`br:main`,path:n.slice(1).join(`/`)}}if(i===`files`){let e=n[1]||`main`;return{page:`files`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:n.slice(2).join(`/`)||void 0}}if(i===`chat`){let e=n[1]||`main`;return{page:`chat`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}if(i===`tasks`){let e=n[1]||`main`;return{page:`tasks`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}return i===`main`?{page:`pages`,groupId:`br:main`,path:n.slice(1).join(`/`)}:{page:`pages`,groupId:`br:main`,path:t}}function o(){if(typeof document<`u`){let e=document.getElementById(`shadow-claw-static-routing`);if(e&&e.textContent)try{let t=JSON.parse(e.textContent);if(t&&typeof t==`object`&&t.routes)return t}catch(e){console.warn(`Failed to parse embedded static routing manifest:`,e)}}return null}async function s(){if(t)return t;let e=o(),r=n();if(!e&&typeof fetch==`function`)try{let t=await fetch(r);if(t.ok){let n=await t.json();n&&typeof n==`object`&&(e=n)}}catch{}return e?(e.routes||={},t=e,t):{routes:{}}}function c(e,n){let r=n||t||o();if(!r||!r.routes)return null;let s=i(e);if(!s)return null;for(let[e,t]of Object.entries(r.routes))if(!(!t||!t.prettyPath)&&i(t.prettyPath)===s)return a(e);return null}async function l(e){let t=c(e);if(t)return t;let r=await s();if(!r||!r.subRoutes)return null;let a=r,o=n(),l=5;for(;a&&a.subRoutes&&l>0;){let t=null,n=i(e);if(Array.isArray(a.subRoutes))for(let e of a.subRoutes){let r=e.replace(/\/routes\.json$/,``);if(n.startsWith(r)){t=e;break}}else if(typeof a.subRoutes==`object`){let e=``;for(let[r,o]of Object.entries(a.subRoutes)){let a=i(r);n.startsWith(a)&&a.length>e.length&&(e=a,t=o)}}if(!t||typeof fetch!=`function`)break;try{let n=t;try{if(t.startsWith(`http://`)||t.startsWith(`https://`))n=t;else if(t.startsWith(`/`)){let e=y(t);n=typeof window<`u`&&window.location?.origin?new URL(e,window.location.origin).toString():e}else n=new URL(t,o).toString()}catch{}let i=await fetch(n);if(!i.ok)break;let s=await i.json();if(!s||typeof s!=`object`)break;s.routes&&Object.assign(r.routes,s.routes);let u=c(e,r);if(u)return u;a=s,o=n,l--}catch(e){console.warn(`Failed to lazy load subRoute:`,t,e);break}}return null}function u(e,n){let i=n||t||o();if(!i||!i.routes)return null;let{page:a,groupId:s,path:c}=e;if(!a)return null;let l=s===`br:main`||s===`main`?`main`:s?.startsWith(`br:`)?`br-${s.slice(3)}`:s,u=[];if(a===`pages`&&c){let e=r(c);l===`main`?(u.push(`/pages/main/${e}`),u.push(`pages/main/${e}`),u.push(`/pages/br:main/${e}`),u.push(`/pages/br-main/${e}`),u.push(`/main/${e}`),u.push(`main/${e}`),u.push(`/${e}`),u.push(e)):l&&(u.push(`/pages/${l}/${e}`),u.push(`pages/${l}/${e}`),u.push(`/pages/${s}/${e}`))}else if(a===`files`&&c){let e=r(c);l&&(u.push(`/files/${l}/${e}`),u.push(`files/${l}/${e}`),u.push(`/files/${s}/${e}`))}for(let e of u){let t=r(e);for(let[e,n]of Object.entries(i.routes))if(r(e)===t&&n?.prettyPath)return n.prettyPath}return null}var d=e({applyBasePath:()=>y,buildRoutePath:()=>C,getAppBasePath:()=>v,getDeploymentNamespace:()=>_,getFileRouteDirPath:()=>O,getWorkspaceRouteRequestPath:()=>k,isPossibleAppRoute:()=>T,parseRouteFromUrl:()=>w,parseRouteFromUrlAsync:()=>E,resetAppBasePathCache:()=>g,resolveHrefAgainstRoute:()=>D});function f(e){return e===`br:main`?`main`:e.startsWith(`br:`)?`br-${e.slice(3)}`:encodeURIComponent(e)}function p(e){try{return decodeURIComponent(e)}catch{return e}}let m=null;const h=new Set([`chat`,`files`,`tasks`,`pages`,`settings`,`tools`,`channels`]);function g(){m=null}typeof globalThis<`u`&&(globalThis.__applyBasePathCacheReset=g);function _(){let e=typeof window<`u`?window:typeof self<`u`?self:globalThis;if(e&&e.__SHADOWCLAW_DEPLOY_ID__){let t=String(e.__SHADOWCLAW_DEPLOY_ID__).trim();if(t)return t.replace(/[^a-zA-Z0-9_-]/g,`-`)}let t=globalThis.process;if(t&&t.env&&t.env.SHADOWCLAW_DEPLOY_ID){let e=String(t.env.SHADOWCLAW_DEPLOY_ID).trim();if(e)return e.replace(/[^a-zA-Z0-9_-]/g,`-`)}let n=v();return!n||n===`/`?``:n.replace(/^\/+|\/+$/g,``).replace(/[^a-zA-Z0-9_-]/g,`-`)}function v(){if(m!==null)return m;if((typeof window>`u`||globalThis.WorkerGlobalScope!==void 0&&typeof self<`u`&&self instanceof globalThis.WorkerGlobalScope)&&typeof self<`u`&&self.location){let e=(self.location.pathname||`/`).split(`/`).filter(Boolean);if(e.length<=1)return m=`/`,m;let t=e[0].toLowerCase(),n=t===`service-worker.js`||t===`sw.js`||t===`manifest.json`||t===`sitemap.xml`||t===`favicon.ico`||t===`index.html`||t===`service-worker`||t===`assets`||t===`dist`||t===`public`;if(n&&e.length===2)return m=`/`,m;if(!n)return m=`/`+e[0]+`/`,m}let e=typeof window<`u`&&window.location?window.location:typeof self<`u`&&self.location?self.location:null;if(!e)return`/`;if(typeof document<`u`&&typeof document.querySelector==`function`){let t=document.querySelector(`base[href]`);if(t){let n=t.getAttribute(`href`);if(n)try{let t=new URL(n,e.origin).pathname;return t.endsWith(`/`)||(t+=`/`),m=t,m}catch{}}}let t=e.pathname||`/`;if(t===`/`)return m=`/`,m;let n=t.split(`/`).filter(Boolean),r=n.findIndex(e=>h.has(e.toLowerCase()));return r>=0?r===0?(m=`/`,m):(m=`/`+n.slice(0,r).join(`/`)+`/`,m):c(t)?(m=`/`,m):n.length===1&&!t.includes(`.`)?(m=`/`+n[0]+`/`,m):(m=`/`,m)}function y(e){let t=v();if(t===`/`)return e;let[n,...r]=e.split(/(?=[?#])/);if(n===t||n.startsWith(t))return e;let i=t+(n.startsWith(`/`)?n.slice(1):n);return i=i.replace(/\/{2,}/g,`/`),i+r.join(``)}function b(e){return e.replace(/^\/+|\/+$/g,``)}function x(e){return e&&(e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e)}function S(e){if(!e)return;let t=b(e.replace(/\\/g,`/`));if(!t)return;let n=t.split(`/`).filter(Boolean).filter(e=>e!==`.`&&e!==`..`);if(n.length!==0)return n.join(`/`)}function C(e){let t=e.anchor?`#${e.anchor.replace(/^#/,``)}`:``,n=u(e);if(n){let e=n;return e.startsWith(`/`)||(e=`/${e}`),`${e}${t}`}switch(e.page){case`chat`:return`${e.groupId?`/chat/${f(e.groupId)}/`:`/chat`}${t}`;case`tasks`:return`${e.groupId?`/tasks/${f(e.groupId)}/`:`/tasks`}${t}`;case`files`:{let n=S(e.path);return e.groupId?n?`/files/${f(e.groupId)}/${n}${t}`:`/files/${f(e.groupId)}/${t}`:`/files${t}`}case`pages`:{let n=S(e.path);return n?e.groupId?`/pages/${f(e.groupId)}/${n}${t}`:`/pages/${n}${t}`:`/pages${t}`}case`tools`:return`/settings/tool-configuration${t}`;case`channels`:return`/settings/channel-configuration${t}`;default:return`/settings${t}`}}function w(e,t){let n=e.pathname,r=v();r!==`/`&&n.startsWith(r)&&(n=`/`+n.slice(r.length));let i=c(n);if(i){let t=e.hash?e.hash.replace(/^#/,``):void 0;return{...i,anchor:t||i.anchor}}let a=n.split(`/`).filter(Boolean).map(e=>p(e)),o=e.hash?e.hash.replace(/^#/,``):void 0;if(a.length===0)return null;let s=a[0].toLowerCase();if(s===`chat`)return{page:`chat`,groupId:x(a[1]||t),anchor:o};if(s===`tasks`)return{page:`tasks`,groupId:x(a[1]||t),anchor:o};if(s===`files`)return{page:`files`,groupId:x(a[1]||t),path:S(a.slice(2).join(`/`)),anchor:o};if(s===`pages`)return a.length>=3?{page:`pages`,groupId:x(a[1]),path:S(a.slice(2).join(`/`)),anchor:o}:{page:`pages`,groupId:x(t),path:S(a.slice(1).join(`/`)),anchor:o};if(s===`settings`){let e=(a[1]||``).toLowerCase();return e===`tool-configuration`?{page:`tools`,anchor:o}:e===`channel-configuration`?{page:`channels`,anchor:o}:{page:`settings`,anchor:o}}return s===`tools`?{page:`tools`,anchor:o}:s===`channels`?{page:`channels`,anchor:o}:null}function T(e){let t=e,n=v();if(n!==`/`&&t.startsWith(n))t=`/`+t.slice(n.length);else if(n!==`/`&&!t.startsWith(n))return!1;let r=t.split(`/`).filter(Boolean);if(r.length===0)return!0;let i=r[0].toLowerCase();return!!(h.has(i)||c(t))}async function E(e,t){let n=w(e,t);if(n)return n;let r=e.pathname,i=v();i!==`/`&&r.startsWith(i)&&(r=`/`+r.slice(i.length));let a=await l(r);if(a){let t=e.hash?e.hash.replace(/^#/,``):void 0;return{...a,anchor:t||a.anchor}}return null}function D(e,t,n){let r=e.trim();if(!r||r.startsWith(`javascript:`))return null;if(r.startsWith(`/`))try{let e=y(r);return new URL(e,n)}catch{return null}let i=new URL(t,n);try{return new URL(r,i)}catch{return null}}function O(e,t){let n=S(t);if(!n)return C({page:`files`,groupId:e});let r=n.split(`/`);r.pop();let i=r.length>0?`${r.join(`/`)}/`:``;return`/files/${f(e)}/${i}`}function k(e){let t=e,n=v();n!==`/`&&t.startsWith(n)&&(t=`/`+t.slice(n.length));let r=t.split(`/`).filter(Boolean).map(e=>p(e));if(r.length<3||r[0]!==`files`)return null;let i=x(r[1])||r[1],a=S(r.slice(2).join(`/`));return!i||!a?null:{groupId:i,path:a}}export{O as a,w as c,_ as i,E as l,y as n,k as o,C as r,T as s,d as t,D as u};
@@ -0,0 +1 @@
1
+ import{t as e}from"./ulid-BY7rQVLN.js";import{t}from"./buffer-9oRIc-5Z.js";var n=t(),r=class{_clientId;_token;_serverBaseUrl;_fileEnumerator;_fileReader;_onProgress;constructor(e){this._clientId=e.clientId,this._token=e.token,this._serverBaseUrl=e.serverBaseUrl||``,this._fileEnumerator=e.fileEnumerator||(async()=>[]),this._fileReader=e.fileReader||(async()=>null),this._onProgress=e.onProgress}async initiate(){let t=e(),r=await this._fileEnumerator(),i=0,a=0,o={"Content-Type":`application/json`};this._token&&(o[`x-control-token`]=this._token);for(let e=0;e<r.length;e++){let s=r[e],c=await this._fileReader(s);if(c==null)continue;let l,u=`utf-8`;typeof c==`string`?(l=c,i+=n.Buffer.from(c,`utf-8`).length):(l=n.Buffer.from(c).toString(`base64`),u=`base64`,i+=c.byteLength||c.length||0);let d=`${this._serverBaseUrl}/api/backup/upload`,f=await fetch(d,{method:`POST`,headers:o,body:JSON.stringify({clientId:this._clientId,backupId:t,path:s,content:l,encoding:u})});if(!f.ok){let e=await f.text().catch(()=>f.statusText);throw Error(`Upload failed for ${s} (${f.status}): ${e}`)}a++,this._onProgress?.({current:a,total:r.length,file:s})}let s=`${this._serverBaseUrl}/api/backup/complete`,c=await fetch(s,{method:`POST`,headers:o,body:JSON.stringify({clientId:this._clientId,backupId:t,fileCount:a,totalBytes:i})});if(!c.ok){let e=await c.text().catch(()=>c.statusText);throw Error(`Failed to complete backup: ${e}`)}return{success:!0,backupId:t,fileCount:a,totalBytes:i}}};export{r as BackupController};
@@ -0,0 +1 @@
1
+ *,:after,:before{font-family:var(--shadow-claw-font-sans)}:host{display:block}.settings-section{margin-bottom:1.75rem}.settings-section h3{align-items:center;display:flex;font-size:1rem;font-weight:600;gap:.5rem;margin:0 0 .75rem}.form-group{margin-bottom:1rem}.form-label{display:block;font-size:.8125rem;font-weight:500;margin-bottom:.375rem}.form-input,.form-label,.form-select{color:var(--shadow-claw-text-primary)}.form-input,.form-select{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-s,.625rem);box-sizing:border-box;font-family:var(--shadow-claw-font-sans);font-size:var(--shadow-claw-font-size-sm);padding:.625rem .75rem;transition:border-color .15s,box-shadow .15s;width:100%}.form-input:focus,.form-select:focus{border-color:var(--shadow-claw-accent-primary);box-shadow:0 0 0 .125rem rgba(0,0,0,.06);outline:none}.form-toggle{align-items:center;display:flex;gap:.75rem}.form-toggle input[type=checkbox]{accent-color:var(--shadow-claw-accent-primary);cursor:pointer;height:1.125rem;width:1.125rem}.form-toggle .form-label{cursor:pointer;display:inline;margin-bottom:0}.form-helper{color:var(--shadow-claw-text-tertiary);font-size:.75rem;line-height:1.45;margin-top:.375rem;max-width:48rem}.form-helper code{background-color:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:.375rem;color:var(--shadow-claw-text-primary);font-family:var(--shadow-claw-font-mono,monospace);font-size:.72rem;padding:.08rem .3rem}.save-btn{background-color:var(--shadow-claw-text-primary);border:none;border-radius:62.5rem;color:var(--shadow-claw-bg-primary);cursor:pointer;font-size:var(--shadow-claw-font-size-sm);font-weight:600;margin-top:.75rem;padding:.625rem 1.5rem;transition:background-color .15s cubic-bezier(.33,1,.68,1)}.save-btn:hover{background-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary)}.save-btn:focus-visible{outline:.125rem solid var(--shadow-claw-accent-primary);outline-offset:.125rem}
@@ -0,0 +1 @@
1
+ <template><div class="settings-section"> <h3>🎛️ Control Plane</h3> <div class="form-group"> <div class="form-helper"> Configure the remote bridge allowing external tools, CLI commands (<code>shadow-claw</code>), and MCP clients to discover, query, and communicate with this client instance. </div> </div> <div class="form-group"> <div class="form-toggle"> <input data-setting="control-plane-enabled-toggle" id="control-plane-enabled-toggle" type="checkbox"> <label class="form-label" for="control-plane-enabled-toggle"> Enable Remote Control Plane Client </label> </div> <div class="form-helper"> Allow the <code>shadow-claw</code> CLI and remote server commands to discover and communicate with this client. When disabled, this client operates in standalone/serverless mode without opening a control plane connection. </div> </div> <div class="form-group"> <label class="form-label" for="control-plane-url"> Control Plane Server URL </label> <input class="form-input" data-setting="control-plane-url-input" id="control-plane-url" placeholder="http://127.0.0.1:8888" spellcheck="false" type="url"> <div class="form-helper"> The base URL of the ShadowClaw server or local dev instance for the CLI and remote control plane (e.g. <code>http://127.0.0.1:8888</code> or <code>https://my-server.example.com</code>). Defaults to <code>127.0.0.1:8888</code> when hosted on static sites (like GitHub Pages), or same-origin on server deployments. </div> <button class="save-btn" data-action="save-control-plane-url"> 💾 Save Control Plane URL </button> </div> <div class="form-group"> <label class="form-label" for="control-plane-transport"> Control Plane Transport </label> <select class="form-select" id="control-plane-transport" data-setting="control-plane-transport-select"> <option value="sse"> Server-Sent Events (SSE + HTTP POST) — Recommended / Proxy Friendly (Default) </option> <option value="websocket">WebSocket (Full Duplex)</option> </select> <div class="form-helper"> Select the protocol used for the CLI and remote client control plane. SSE + HTTP POST works through standard reverse proxies and firewalls without requiring connection upgrades. </div> <button class="save-btn" data-action="save-control-plane-transport"> 💾 Save Transport </button> </div> </div></template>
@@ -1 +1 @@
1
- <template><div class="settings-section"> <h3>💾 Storage</h3> <div class="form-group"> <div class="storage-header"> <span data-info="storage-usage">0 B used</span> <span class="opacity-60" data-info="storage-quota">of 0 B</span> </div> <div class="storage-progress-container"> <div class="storage-progress-bar" data-info="storage-progress"></div> </div> </div> <div class="form-group"> <label class="form-label">Storage Type</label> <div class="storage-info-row"> <span data-info="storage-type">Browser Internal (OPFS)</span> <span class="storage-badge" data-info="storage-status-badge"></span> <span class="persistent-badge" data-info="storage-persistent-badge"> PERSISTENT </span> </div> <div class="storage-buttons"> <button class="grant-storage-btn hidden settings-btn" data-action="grant-storage-permission"> 🔓 Grant Permission </button> <button class="settings-btn" data-action="request-persistent"> 🔒 Request Persistent </button> <button class="settings-btn" data-action="change-storage-dir"> 📁 Change Location </button> <button class="reset-storage-btn settings-btn" data-action="reset-storage-dir"> ♻️ Reset to Default </button> <button class="settings-btn" data-action="reset-site-config"> ♻️ Reset Site Config </button> </div> <div class="form-helper" data-info="storage-help-general"> Persistent storage prevents the browser from deleting your chat history and configuration when disk space is low. <b>Note:</b> Browsers often only grant this if you bookmark the site or use it frequently. </div> <div class="form-helper" data-info="storage-help-local"> You can use a local folder on your computer for storage. This makes files directly accessible on your disk. </div> </div> </div></template>
1
+ <template><div class="settings-section"> <h3>💾 Storage</h3> <div class="form-group"> <div class="storage-header"> <span data-info="storage-usage">0 B used</span> <span class="opacity-60" data-info="storage-quota">of 0 B</span> </div> <div class="storage-progress-container"> <div class="storage-progress-bar" data-info="storage-progress"></div> </div> </div> <div class="form-group"> <label class="form-label">Storage Type</label> <div class="storage-info-row"> <span data-info="storage-type">Browser Internal (OPFS)</span> <span class="storage-badge" data-info="storage-status-badge"></span> <span class="persistent-badge" data-info="storage-persistent-badge"> PERSISTENT </span> </div> <div class="storage-buttons"> <button class="grant-storage-btn hidden settings-btn" data-action="grant-storage-permission"> 🔓 Grant Permission </button> <button class="settings-btn" data-action="request-persistent"> 🔒 Request Persistent </button> <button class="settings-btn" data-action="change-storage-dir"> 📁 Change Location </button> <button class="reset-storage-btn settings-btn" data-action="reset-storage-dir"> ♻️ Reset to Default </button> <button class="settings-btn" data-action="reset-site-config"> ♻️ Reset Site Config </button> </div> <div class="form-helper" data-info="storage-help-general"> Persistent storage prevents the browser from deleting your chat history and configuration when disk space is low. <b>Note:</b> Browsers often only grant this if you bookmark the site or use it frequently. </div> <div class="form-helper" data-info="storage-help-local"> You can use a local folder on your computer for storage. This makes files directly accessible on your disk. </div> </div> <div class="form-group"> <div class="form-toggle"> <input data-setting="files-upload-append-ulid-toggle" id="files-upload-append-ulid-toggle" type="checkbox"> <label class="form-label" for="files-upload-append-ulid-toggle"> Append unique ID (ULID) to uploaded file names </label> </div> <div class="form-helper"> When enabled, uploads automatically prefix file names with a ULID (e.g. 01J...-filename.ext). Default: disabled. </div> </div> </div></template>
@@ -1 +1 @@
1
- *,:after,:before{font-family:var(--shadow-claw-font-sans)}:host{display:block}.settings-section{margin-bottom:1.75rem}.settings-section h3{align-items:center;display:flex;font-size:1rem;font-weight:600;gap:.5rem;margin:0 0 .75rem}.form-group{margin-bottom:1rem}.form-label{display:block;font-size:.8125rem;font-weight:500;margin-bottom:.375rem}.form-input,.form-label{color:var(--shadow-claw-text-primary)}.form-input{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-s,.625rem);box-sizing:border-box;font-family:var(--shadow-claw-font-sans);font-size:var(--shadow-claw-font-size-sm);padding:.625rem .75rem;transition:border-color .15s,box-shadow .15s;width:100%}.form-input:focus{border-color:var(--shadow-claw-accent-primary);box-shadow:0 0 0 .125rem rgba(0,0,0,.06);outline:none}.form-helper{color:var(--shadow-claw-text-tertiary);font-size:.75rem;line-height:1.45;margin-top:.375rem;max-width:48rem}.form-helper code{background-color:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:.375rem;color:var(--shadow-claw-text-primary);font-family:var(--shadow-claw-font-mono,monospace);font-size:.72rem;padding:.08rem .3rem}.save-btn{background-color:var(--shadow-claw-text-primary);border:none;border-radius:62.5rem;color:var(--shadow-claw-bg-primary);cursor:pointer;font-size:var(--shadow-claw-font-size-sm);font-weight:600;margin-top:.75rem;padding:.625rem 1.5rem;transition:background-color .15s cubic-bezier(.33,1,.68,1)}.save-btn:hover{background-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary)}.save-btn:focus-visible{outline:.125rem solid var(--shadow-claw-accent-primary);outline-offset:.125rem}
1
+ *,:after,:before{font-family:var(--shadow-claw-font-sans)}:host{display:block}.settings-section{margin-bottom:1.75rem}.settings-section h3{align-items:center;display:flex;font-size:1rem;font-weight:600;gap:.5rem;margin:0 0 .75rem}.form-group{margin-bottom:1rem}.form-label{display:block;font-size:.8125rem;font-weight:500;margin-bottom:.375rem}.form-input,.form-label,.form-select{color:var(--shadow-claw-text-primary)}.form-input,.form-select{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-s,.625rem);box-sizing:border-box;font-family:var(--shadow-claw-font-sans);font-size:var(--shadow-claw-font-size-sm);padding:.625rem .75rem;transition:border-color .15s,box-shadow .15s;width:100%}.form-input:focus,.form-select:focus{border-color:var(--shadow-claw-accent-primary);box-shadow:0 0 0 .125rem rgba(0,0,0,.06);outline:none}.form-toggle{align-items:center;display:flex;gap:.75rem}.form-toggle input[type=checkbox]{accent-color:var(--shadow-claw-accent-primary);cursor:pointer;height:1.125rem;width:1.125rem}.form-toggle .form-label{cursor:pointer;display:inline;margin-bottom:0}.form-helper{color:var(--shadow-claw-text-tertiary);font-size:.75rem;line-height:1.45;margin-top:.375rem;max-width:48rem}.form-helper code{background-color:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:.375rem;color:var(--shadow-claw-text-primary);font-family:var(--shadow-claw-font-mono,monospace);font-size:.72rem;padding:.08rem .3rem}.save-btn{background-color:var(--shadow-claw-text-primary);border:none;border-radius:62.5rem;color:var(--shadow-claw-bg-primary);cursor:pointer;font-size:var(--shadow-claw-font-size-sm);font-weight:600;margin-top:.75rem;padding:.625rem 1.5rem;transition:background-color .15s cubic-bezier(.33,1,.68,1)}.save-btn:hover{background-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary)}.save-btn:focus-visible{outline:.125rem solid var(--shadow-claw-accent-primary);outline-offset:.125rem}
@@ -1 +1 @@
1
- <template><div class="settings-section"> <h3>📅 Task Server</h3> <div class="form-group"> <div class="form-helper"> Configure where scheduled task requests are sent. Use a local path when the scheduler backend is hosted alongside the app, or a full URL when the app runs on a static host and scheduling is handled elsewhere. </div> </div> <div class="form-group"> <div class="form-toggle"> <input data-setting="task-server-enabled-toggle" id="task-server-enabled-toggle" type="checkbox"> <label class="form-label" for="task-server-enabled-toggle"> Enable Server-Side Tasks </label> </div> <div class="form-helper"> Opt in to server-side task scheduling. When disabled, the application will not attempt to probe or communicate with a task server. </div> </div> <div class="form-group"> <label class="form-label" for="task-server-url">Task Server URL</label> <input class="form-input" data-setting="task-server-url-input" id="task-server-url" placeholder="/schedule" spellcheck="false" type="url"> <div class="form-helper"> The schedule API base on this host, like <code>/schedule</code>, or a full URL like <code>http://localhost:8888/schedule</code>. Leave it blank to use the default. Set this when ShadowClaw is hosted on a static site, and task scheduling runs on a separate backend. </div> <button class="save-btn" data-action="save-task-server-url"> 💾 Save Task Server URL </button> </div> </div></template>
1
+ <template><div class="settings-section"> <h3>📅 Task Server</h3> <div class="form-group"> <div class="form-helper"> Configure where scheduled task requests are sent. Use a local path when the scheduler backend is hosted alongside the app, or a full URL when the app runs on a static host and scheduling is handled elsewhere. </div> </div> <div class="form-group"> <div class="form-toggle"> <input data-setting="task-server-enabled-toggle" id="task-server-enabled-toggle" type="checkbox"> <label class="form-label" for="task-server-enabled-toggle"> Enable Server-Side Tasks </label> </div> <div class="form-helper"> Opt in to server-side task scheduling. When disabled, the application will not attempt to probe or communicate with a task server. </div> </div> <div class="form-group"> <label class="form-label" for="task-server-url">Task Server URL</label> <input class="form-input" data-setting="task-server-url-input" id="task-server-url" placeholder="/schedule" spellcheck="false" type="url"> <div class="form-helper"> The schedule API base on this host, like <code>/schedule</code>, or a full URL like <code>http://localhost:8888/schedule</code>. Leave it blank to use the default. Set this when ShadowClaw is hosted on a static site, and task scheduling runs on a separate backend. </div> <button class="save-btn" data-action="save-task-server-url"> 💾 Save URL </button> </div> </div></template>
@@ -1 +1 @@
1
- *,:after,:before{font-family:var(--shadow-claw-font-sans);scrollbar-color:var(--shadow-claw-border-color) transparent;scrollbar-width:thin}::-webkit-scrollbar{height:.5rem;width:.5rem}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--shadow-claw-border-color);border-radius:.25rem}::-webkit-scrollbar-thumb:hover{background:var(--shadow-claw-text-tertiary)}.hidden,[hidden]{display:none!important}:host{display:flex;flex-direction:column;font-family:var(--shadow-claw-font-sans,system-ui,sans-serif);height:100%;min-height:0;overflow:hidden}.files{display:flex;flex:1;flex-direction:column;min-height:0;overflow:hidden;width:100%}.files__breadcrumbs{align-items:center;display:flex;flex-wrap:wrap;font-size:.8125rem;gap:.5rem}.files__breadcrumbs-spacer{flex:1}.files__sync-btn{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:.375rem;color:var(--shadow-claw-text-secondary);cursor:pointer;font-size:.75rem;padding:.25rem .5rem;white-space:nowrap}.files__sync-btn:focus-visible,.files__sync-btn:hover{border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-accent-primary);outline:none}.files__sync-btn:disabled{cursor:not-allowed;opacity:.6}.files__breadcrumb-btn{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:.1875rem;color:var(--shadow-claw-accent-primary);cursor:pointer;padding:.25rem .5rem;transition:all .1s}.files__breadcrumb-btn:focus-visible,.files__breadcrumb-btn:hover{background-color:var(--shadow-claw-bg-tertiary);border-color:var(--shadow-claw-accent-primary);outline:none}.files__breadcrumb-separator{color:var(--shadow-claw-text-tertiary)}.files__content{border-radius:var(--shadow-claw-radius-m);flex:1;min-height:0;overflow-y:auto;padding:1rem;position:relative}.files__content--dragover{background-color:color-mix(in oklab,var(--shadow-claw-accent-primary) 8%,transparent);outline:.125rem dashed var(--shadow-claw-accent-primary);outline-offset:-.25rem}.files__drop-hint{color:var(--shadow-claw-text-tertiary);font-size:.75rem;margin-bottom:.625rem}.files__upload-progress{background-color:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m);display:none;margin-bottom:.75rem;padding:.625rem}.files__upload-progress.active{display:block}.files__upload-progress-label{color:var(--shadow-claw-text-secondary);display:block;font-size:.75rem;font-weight:600;margin-bottom:.375rem}.files__upload-progress-track{background-color:var(--shadow-claw-bg-tertiary);border-radius:62.5rem;height:.5rem;overflow:hidden;width:100%}.files__upload-progress-bar{background-color:var(--shadow-claw-accent-primary);height:100%;transition:width .2s ease;width:0}.files__terminal-slot{margin-bottom:1rem}.files__terminal-slot:empty{display:none;margin-bottom:0}.files__list{display:grid;gap:.75rem;grid-template-columns:repeat(auto-fill,minmax(9.375rem,1fr))}.files__item{background-color:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m,1rem);display:flex;flex-direction:column;position:relative;transition:all .15s}.files__item:focus-within,.files__item:hover{background-color:var(--shadow-claw-bg-tertiary);border-color:var(--shadow-claw-accent-primary);transform:translateY(-.125rem)}.files__item-main{align-items:center;background:transparent;border:none;color:inherit;cursor:pointer;display:flex;flex-direction:column;gap:.5rem;height:100%;padding:.75rem;text-align:center;width:100%}.files__item-main:focus-visible{outline:.125rem solid var(--shadow-claw-accent-primary);outline-offset:-.125rem}.files__actions{display:none;flex-wrap:wrap;gap:.25rem;position:absolute;right:2.75rem;top:.25rem;width:6rem;z-index:10}.files__item.show-actions .files__actions{display:flex}.files__actions-toggle{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-s);color:var(--shadow-claw-text-primary);cursor:pointer;font-size:.6875rem;padding:.25rem .75rem;position:absolute;right:.25rem;top:.25rem;transition:all .1s;z-index:11}.files__actions-toggle:focus-visible,.files__actions-toggle:hover{background-color:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary);outline:none}.files__action-btn{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-s);color:var(--shadow-claw-text-primary);cursor:pointer;font-size:.6875rem;padding:.25rem .375rem;transition:all .1s}.files__action-btn:focus-visible,.files__action-btn:hover{background-color:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary);outline:none}.files__action-btn--delete{border-color:var(--shadow-claw-error-color);color:var(--shadow-claw-error-color)}.files__action-btn--delete:focus-visible,.files__action-btn--delete:hover{background-color:var(--shadow-claw-error-color);color:var(--shadow-claw-on-error,#fff);outline:none}.files__icon{font-size:2rem}.files__name{-webkit-box-orient:vertical;color:var(--shadow-claw-text-primary);display:-webkit-box;font-size:.8125rem;font-weight:500;-webkit-line-clamp:2;overflow:hidden;word-break:break-all}.files__empty{align-items:center;color:var(--shadow-claw-text-tertiary);display:flex;flex-direction:column;grid-column:1/-1;height:100%;justify-content:center;text-align:center}.files__empty p{font-size:var(--shadow-claw-font-size-sm)}.files__hidden-input{display:none}.files__empty-hint{font-size:.75rem}.files__sr-only{border:0;clip:rect(0 0 0 0);height:.0625rem;margin:-.0625rem;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:.0625rem}.files__new-dialog,.files__rename-dialog{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-l,1.5rem);color:var(--shadow-claw-text-primary);max-width:22rem;padding:0;width:calc(100vw - 2rem)}.files__new-dialog::backdrop,.files__rename-dialog::backdrop{background-color:rgba(0,0,0,.35)}.files__new-form,.files__rename-form{display:flex;flex-direction:column;gap:.75rem;padding:1rem}.files__new-label,.files__paste-rename-label,.files__rename-label{color:var(--shadow-claw-text-secondary);font-size:var(--shadow-claw-font-size-sm);font-weight:600}.files__new-input,.files__paste-rename-input,.files__rename-input{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-s);color:var(--shadow-claw-text-primary);font-size:var(--shadow-claw-font-size-sm);min-height:2rem;padding:.375rem .5rem}.files__paste-rename-container{display:flex;flex-direction:column;gap:.5rem}.files__new-kind{align-items:center;color:var(--shadow-claw-text-secondary);cursor:pointer;display:inline-flex;font-size:var(--shadow-claw-font-size-sm);gap:.5rem;width:fit-content}.files__new-is-folder{accent-color:var(--shadow-claw-accent-primary)}.files__new-input:focus,.files__paste-rename-input:focus,.files__rename-input:focus{border-color:var(--shadow-claw-accent-primary);box-shadow:0 0 0 .125rem var(--shadow-claw-bg-tertiary);outline:none}.files__new-actions,.files__rename-actions{display:flex;gap:.5rem;justify-content:flex-end}.files__new-cancel,.files__new-ok,.files__rename-cancel,.files__rename-ok{background-color:transparent;border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-pill);color:var(--shadow-claw-text-primary);cursor:pointer;font-size:.8125rem;font-weight:600;min-height:2rem;min-width:4.5rem;padding:.375rem .625rem}.files__new-ok,.files__rename-ok{background-color:var(--shadow-claw-text-primary);border-color:var(--shadow-claw-text-primary);color:var(--shadow-claw-bg-primary)}.files__new-ok:focus-visible,.files__new-ok:hover,.files__rename-ok:focus-visible,.files__rename-ok:hover{background-color:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary);outline:none}.files__new-cancel:focus-visible,.files__new-cancel:hover,.files__rename-cancel:focus-visible,.files__rename-cancel:hover{border-color:var(--shadow-claw-text-primary);box-shadow:var(--shadow-claw-shadow-md);outline:none}.files__new-cancel:disabled,.files__new-ok:disabled,.files__rename-cancel:disabled,.files__rename-ok:disabled{cursor:not-allowed;opacity:.6}.files__item--cut{border-style:dashed;opacity:.5}.files__paste-dialog{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-l,1.5rem);color:var(--shadow-claw-text-primary);max-width:26rem;padding:0;width:calc(100vw - 2rem)}.files__paste-dialog::backdrop{background-color:rgba(0,0,0,.35)}.files__paste-form{display:flex;flex-direction:column;gap:1rem;padding:1.5rem}.files__paste-title{font-size:1.1rem;font-weight:700;margin:0}.files__paste-message{color:var(--shadow-claw-text-secondary);font-size:var(--shadow-claw-font-size-sm);line-height:1.4;margin:0}.files__paste-actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.files__paste-apply,.files__paste-cancel,.files__paste-continue,.files__paste-ok,.files__paste-overwrite{background-color:transparent;border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-pill);color:var(--shadow-claw-text-primary);cursor:pointer;font-size:.8125rem;font-weight:600;min-height:2rem;min-width:4.5rem;padding:.375rem .625rem;transition:all .15s ease}.files__paste-overwrite{border-color:var(--shadow-claw-error-color);color:var(--shadow-claw-error-color)}.files__paste-overwrite:focus-visible,.files__paste-overwrite:hover{background-color:var(--shadow-claw-error-color);color:var(--shadow-claw-on-error,#fff);outline:none}.files__paste-apply,.files__paste-continue,.files__paste-ok{background-color:var(--shadow-claw-text-primary);border-color:var(--shadow-claw-text-primary);color:var(--shadow-claw-bg-primary)}.files__paste-apply:focus-visible,.files__paste-apply:hover,.files__paste-continue:focus-visible,.files__paste-continue:hover,.files__paste-ok:focus-visible,.files__paste-ok:hover{background-color:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary);outline:none}.files__paste-cancel:focus-visible,.files__paste-cancel:hover{border-color:var(--shadow-claw-text-primary);box-shadow:var(--shadow-claw-shadow-md);outline:none}.files__paste-apply:disabled,.files__paste-cancel:disabled,.files__paste-continue:disabled,.files__paste-ok:disabled{cursor:not-allowed;opacity:.6}
1
+ *,:after,:before{font-family:var(--shadow-claw-font-sans);scrollbar-color:var(--shadow-claw-border-color) transparent;scrollbar-width:thin}::-webkit-scrollbar{height:.5rem;width:.5rem}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--shadow-claw-border-color);border-radius:.25rem}::-webkit-scrollbar-thumb:hover{background:var(--shadow-claw-text-tertiary)}.hidden,[hidden]{display:none!important}:host{display:flex;flex-direction:column;font-family:var(--shadow-claw-font-sans,system-ui,sans-serif);height:100%;min-height:0;overflow:hidden}.files{display:flex;flex:1;flex-direction:column;min-height:0;overflow:hidden;width:100%}.files__breadcrumbs{align-items:center;display:flex;flex-wrap:wrap;font-size:.8125rem;gap:.5rem}.files__breadcrumbs-spacer{flex:1}.files__sync-btn{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:.375rem;color:var(--shadow-claw-text-secondary);cursor:pointer;font-size:.75rem;padding:.25rem .5rem;white-space:nowrap}.files__sync-btn:focus-visible,.files__sync-btn:hover{border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-accent-primary);outline:none}.files__sync-btn:disabled{cursor:not-allowed;opacity:.6}.files__breadcrumb-btn{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:.1875rem;color:var(--shadow-claw-accent-primary);cursor:pointer;padding:.25rem .5rem;transition:all .1s}.files__breadcrumb-btn:focus-visible,.files__breadcrumb-btn:hover{background-color:var(--shadow-claw-bg-tertiary);border-color:var(--shadow-claw-accent-primary);outline:none}.files__breadcrumb-separator{color:var(--shadow-claw-text-tertiary)}.files__content{border-radius:var(--shadow-claw-radius-m);flex:1;min-height:0;overflow-y:auto;padding:1rem;position:relative}.files__content--dragover{background-color:color-mix(in oklab,var(--shadow-claw-accent-primary) 8%,transparent);outline:.125rem dashed var(--shadow-claw-accent-primary);outline-offset:-.25rem}.files__drop-hint{color:var(--shadow-claw-text-tertiary);font-size:.75rem;margin-bottom:.625rem}.files__upload-progress{background-color:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m);display:none;margin-bottom:.75rem;padding:.625rem}.files__upload-progress.active{display:block}.files__upload-progress-label{color:var(--shadow-claw-text-secondary);display:block;font-size:.75rem;font-weight:600;margin-bottom:.375rem}.files__upload-progress-track{background-color:var(--shadow-claw-bg-tertiary);border-radius:62.5rem;height:.5rem;overflow:hidden;width:100%}.files__upload-progress-bar{background-color:var(--shadow-claw-accent-primary);height:100%;transition:width .2s ease;width:0}.files__terminal-slot{margin-bottom:1rem}.files__terminal-slot:empty{display:none;margin-bottom:0}.files__list{display:grid;gap:.75rem;grid-template-columns:repeat(auto-fill,minmax(9.375rem,1fr))}.files__item{background-color:var(--shadow-claw-bg-secondary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-m,1rem);display:flex;flex-direction:column;position:relative;transition:all .15s}.files__item:focus-within,.files__item:hover{background-color:var(--shadow-claw-bg-tertiary);border-color:var(--shadow-claw-accent-primary);transform:translateY(-.125rem)}.files__item-main{align-items:center;background:transparent;border:none;color:inherit;cursor:pointer;display:flex;flex-direction:column;gap:.5rem;height:100%;padding:.75rem;text-align:center;width:100%}.files__item-main:focus-visible{outline:.125rem solid var(--shadow-claw-accent-primary);outline-offset:-.125rem}.files__actions{display:none;flex-wrap:wrap;gap:.25rem;position:absolute;right:2.75rem;top:.25rem;width:6rem;z-index:10}.files__item.show-actions .files__actions{display:flex}.files__actions-toggle{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-s);color:var(--shadow-claw-text-primary);cursor:pointer;font-size:.6875rem;padding:.25rem .75rem;position:absolute;right:.25rem;top:.25rem;transition:all .1s;z-index:11}.files__actions-toggle:focus-visible,.files__actions-toggle:hover{background-color:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary);outline:none}.files__action-btn{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-s);color:var(--shadow-claw-text-primary);cursor:pointer;font-size:.6875rem;padding:.25rem .375rem;transition:all .1s}.files__action-btn:focus-visible,.files__action-btn:hover{background-color:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary);outline:none}.files__action-btn--delete{border-color:var(--shadow-claw-error-color);color:var(--shadow-claw-error-color)}.files__action-btn--delete:focus-visible,.files__action-btn--delete:hover{background-color:var(--shadow-claw-error-color);color:var(--shadow-claw-on-error,#fff);outline:none}.files__icon{font-size:2rem}.files__name{-webkit-box-orient:vertical;color:var(--shadow-claw-text-primary);display:-webkit-box;font-size:.8125rem;font-weight:500;-webkit-line-clamp:2;overflow:hidden;word-break:break-all}.files__empty{align-items:center;color:var(--shadow-claw-text-tertiary);display:flex;flex-direction:column;grid-column:1/-1;height:100%;justify-content:center;text-align:center}.files__empty p{font-size:var(--shadow-claw-font-size-sm)}.files__hidden-input{display:none}.files__empty-hint{font-size:.75rem}.files__sr-only{border:0;clip:rect(0 0 0 0);height:.0625rem;margin:-.0625rem;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:.0625rem}.files__new-dialog,.files__rename-dialog{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-l,1.5rem);color:var(--shadow-claw-text-primary);max-width:22rem;padding:0;width:calc(100vw - 2rem)}.files__new-dialog::backdrop,.files__rename-dialog::backdrop{background-color:rgba(0,0,0,.35)}.files__new-form,.files__rename-form{display:flex;flex-direction:column;gap:.75rem;padding:1rem}.files__new-label,.files__paste-rename-label,.files__rename-label,.files__upload-conflict-rename-label{color:var(--shadow-claw-text-secondary);font-size:var(--shadow-claw-font-size-sm);font-weight:600}.files__new-input,.files__paste-rename-input,.files__rename-input,.files__upload-conflict-rename-input{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-s);color:var(--shadow-claw-text-primary);font-size:var(--shadow-claw-font-size-sm);min-height:2rem;padding:.375rem .5rem}.files__paste-rename-container,.files__upload-conflict-rename-container{display:flex;flex-direction:column;gap:.5rem}.files__new-kind{align-items:center;color:var(--shadow-claw-text-secondary);cursor:pointer;display:inline-flex;font-size:var(--shadow-claw-font-size-sm);gap:.5rem;width:fit-content}.files__new-is-folder{accent-color:var(--shadow-claw-accent-primary)}.files__new-input:focus,.files__paste-rename-input:focus,.files__rename-input:focus,.files__upload-conflict-rename-input:focus{border-color:var(--shadow-claw-accent-primary);box-shadow:0 0 0 .125rem var(--shadow-claw-bg-tertiary);outline:none}.files__new-actions,.files__rename-actions{display:flex;gap:.5rem;justify-content:flex-end}.files__new-cancel,.files__new-ok,.files__rename-cancel,.files__rename-ok{background-color:transparent;border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-pill);color:var(--shadow-claw-text-primary);cursor:pointer;font-size:.8125rem;font-weight:600;min-height:2rem;min-width:4.5rem;padding:.375rem .625rem}.files__new-ok,.files__rename-ok{background-color:var(--shadow-claw-text-primary);border-color:var(--shadow-claw-text-primary);color:var(--shadow-claw-bg-primary)}.files__new-ok:focus-visible,.files__new-ok:hover,.files__rename-ok:focus-visible,.files__rename-ok:hover{background-color:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary);outline:none}.files__new-cancel:focus-visible,.files__new-cancel:hover,.files__rename-cancel:focus-visible,.files__rename-cancel:hover{border-color:var(--shadow-claw-text-primary);box-shadow:var(--shadow-claw-shadow-md);outline:none}.files__new-cancel:disabled,.files__new-ok:disabled,.files__rename-cancel:disabled,.files__rename-ok:disabled{cursor:not-allowed;opacity:.6}.files__item--cut{border-style:dashed;opacity:.5}.files__paste-dialog,.files__upload-conflict-dialog{background-color:var(--shadow-claw-bg-primary);border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-l,1.5rem);color:var(--shadow-claw-text-primary);max-width:26rem;padding:0;width:calc(100vw - 2rem)}.files__paste-dialog::backdrop,.files__upload-conflict-dialog::backdrop{background-color:rgba(0,0,0,.35)}.files__paste-form,.files__upload-conflict-form{display:flex;flex-direction:column;gap:1rem;padding:1.5rem}.files__paste-title,.files__upload-conflict-title{font-size:1.1rem;font-weight:700;margin:0}.files__paste-message,.files__upload-conflict-message{color:var(--shadow-claw-text-secondary);font-size:var(--shadow-claw-font-size-sm);line-height:1.4;margin:0}.files__paste-actions,.files__upload-conflict-actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.files__paste-apply,.files__paste-cancel,.files__paste-continue,.files__paste-ok,.files__paste-overwrite,.files__upload-conflict-cancel,.files__upload-conflict-ok,.files__upload-conflict-overwrite{background-color:transparent;border:.0625rem solid var(--shadow-claw-border-color);border-radius:var(--shadow-claw-radius-pill);color:var(--shadow-claw-text-primary);cursor:pointer;font-size:.8125rem;font-weight:600;min-height:2rem;min-width:4.5rem;padding:.375rem .625rem;transition:all .15s ease}.files__paste-overwrite,.files__upload-conflict-overwrite{border-color:var(--shadow-claw-error-color);color:var(--shadow-claw-error-color)}.files__paste-overwrite:focus-visible,.files__paste-overwrite:hover,.files__upload-conflict-overwrite:focus-visible,.files__upload-conflict-overwrite:hover{background-color:var(--shadow-claw-error-color);color:var(--shadow-claw-on-error,#fff);outline:none}.files__paste-apply,.files__paste-continue,.files__paste-ok,.files__upload-conflict-ok{background-color:var(--shadow-claw-text-primary);border-color:var(--shadow-claw-text-primary);color:var(--shadow-claw-bg-primary)}.files__paste-apply:focus-visible,.files__paste-apply:hover,.files__paste-continue:focus-visible,.files__paste-continue:hover,.files__paste-ok:focus-visible,.files__paste-ok:hover,.files__upload-conflict-ok:focus-visible,.files__upload-conflict-ok:hover{background-color:var(--shadow-claw-accent-primary);border-color:var(--shadow-claw-accent-primary);color:var(--shadow-claw-on-primary);outline:none}.files__paste-cancel:focus-visible,.files__paste-cancel:hover,.files__upload-conflict-cancel:focus-visible,.files__upload-conflict-cancel:hover{border-color:var(--shadow-claw-text-primary);box-shadow:var(--shadow-claw-shadow-md);outline:none}.files__paste-apply:disabled,.files__paste-cancel:disabled,.files__paste-continue:disabled,.files__paste-ok:disabled,.files__upload-conflict-cancel:disabled,.files__upload-conflict-ok:disabled,.files__upload-conflict-overwrite:disabled{cursor:not-allowed;opacity:.6}
@@ -1 +1 @@
1
- <template><section class="files" aria-label="Files"> <shadow-claw-page-header icon="&#128193;" title="Files"> <shadow-claw-page-header-action-button slot="actions" title="Refresh file list" class="files__refresh-btn"> &#128260; Refresh </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Upload files to workspace" class="files__upload-btn"> &#128228; Upload </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Create a new file or folder" class="files__new-btn"> &#10133; New </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Paste clipboard file or folder" class="files__paste-btn" hidden disabled> &#128203; Paste </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Backup workspace files" class="files__backup-btn"> &#128190; Backup </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Restore workspace from backup" class="files__restore-btn"> &#9851;&#65039; Restore </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Delete all workspace files" class="files__clear-btn" variant="danger"> &#128465;&#65039; Clear All </shadow-claw-page-header-action-button> <nav slot="breadcrumbs" class="files__breadcrumbs" aria-label="Current folder"> <span class="files__breadcrumbs-path" data-breadcrumb-path></span> <span class="files__breadcrumbs-spacer" aria-hidden="true" hidden></span> <button type="button" class="files__sync-btn files__sync-host-btn" title="Push host Files panel changes into /home/user inside WebVM" hidden> Host &rarr; VM </button> <button type="button" class="files__sync-btn files__sync-vm-btn" title="Pull /home/user changes from WebVM terminal back into Files panel" hidden> VM &rarr; Host </button> </nav> </shadow-claw-page-header> <input type="file" class="files__hidden-input files__hidden-upload" multiple accept="*/*" aria-label="Upload files"> <input type="file" class="files__hidden-input files__hidden-restore" accept=".zip,application/zip" aria-label="Restore files from zip backup"> <shadow-claw-dialog dialog-class="files__new-dialog" dialog-aria-label="Create new item"> <form class="files__new-form" method="dialog"> <label class="files__new-label" for="files-new-name">Name</label> <input class="files__new-input" id="files-new-name" name="files-new-name" type="text" autocomplete="off" required> <label class="files__new-kind"> <input class="files__new-is-folder" id="files-new-is-folder" name="files-new-is-folder" type="checkbox"> Create as folder </label> <div class="files__new-actions"> <button class="files__new-cancel" type="button">Cancel</button> <button class="files__new-ok" type="submit">OK</button> </div> </form> </shadow-claw-dialog> <shadow-claw-dialog dialog-class="files__rename-dialog" dialog-aria-label="Rename file or folder"> <form class="files__rename-form" method="dialog"> <label class="files__rename-label" for="files-rename-name">Name</label> <input class="files__rename-input" id="files-rename-name" name="files-rename-name" type="text" autocomplete="off" required> <div class="files__rename-actions"> <button class="files__rename-cancel" type="button">Cancel</button> <button class="files__rename-ok" type="submit">Rename</button> </div> </form> </shadow-claw-dialog> <shadow-claw-dialog dialog-class="files__paste-dialog" dialog-aria-label="Paste file or folder"> <form class="files__paste-form" method="dialog"> <h3 class="files__paste-title">Confirm Paste</h3> <p class="files__paste-message"></p> <div class="files__paste-rename-container" hidden> <label class="files__paste-rename-label" for="files-paste-name">New Name</label> <input class="files__paste-rename-input" id="files-paste-name" name="files-paste-name" type="text" autocomplete="off"> </div> <div class="files__paste-actions"> <button class="files__paste-cancel" type="button">Cancel</button> <button class="files__paste-overwrite" type="button" hidden> Overwrite </button> <button class="files__paste-ok" type="submit">OK</button> </div> </form> </shadow-claw-dialog> <div class="files__content"> <div class="files__terminal-slot" data-terminal-slot hidden></div> <p class="files__drop-hint">Drop files here to upload</p> <div class="files__upload-progress" aria-live="polite" aria-label="Upload progress"> <span class="files__upload-progress-label">Uploading files...</span> <div class="files__upload-progress-track"> <div class="files__upload-progress-bar"></div> </div> </div> <div class="files__list" role="list" aria-live="polite"></div> </div> </section></template>
1
+ <template><section class="files" aria-label="Files"> <shadow-claw-page-header icon="&#128193;" title="Files"> <shadow-claw-page-header-action-button slot="actions" title="Refresh file list" class="files__refresh-btn"> &#128260; Refresh </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Upload files to workspace" class="files__upload-btn"> &#128228; Upload </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Create a new file or folder" class="files__new-btn"> &#10133; New </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Paste clipboard file or folder" class="files__paste-btn" hidden disabled> &#128203; Paste </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Backup workspace files" class="files__backup-btn"> &#128190; Backup </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Restore workspace from backup" class="files__restore-btn"> &#9851;&#65039; Restore </shadow-claw-page-header-action-button> <shadow-claw-page-header-action-button slot="actions" title="Delete all workspace files" class="files__clear-btn" variant="danger"> &#128465;&#65039; Clear All </shadow-claw-page-header-action-button> <nav slot="breadcrumbs" class="files__breadcrumbs" aria-label="Current folder"> <span class="files__breadcrumbs-path" data-breadcrumb-path></span> <span class="files__breadcrumbs-spacer" aria-hidden="true" hidden></span> <button type="button" class="files__sync-btn files__sync-host-btn" title="Push host Files panel changes into /home/user inside WebVM" hidden> Host &rarr; VM </button> <button type="button" class="files__sync-btn files__sync-vm-btn" title="Pull /home/user changes from WebVM terminal back into Files panel" hidden> VM &rarr; Host </button> </nav> </shadow-claw-page-header> <input type="file" class="files__hidden-input files__hidden-upload" multiple accept="*/*" aria-label="Upload files"> <input type="file" class="files__hidden-input files__hidden-restore" accept=".zip,application/zip" aria-label="Restore files from zip backup"> <shadow-claw-dialog dialog-class="files__new-dialog" dialog-aria-label="Create new item"> <form class="files__new-form" method="dialog"> <label class="files__new-label" for="files-new-name">Name</label> <input class="files__new-input" id="files-new-name" name="files-new-name" type="text" autocomplete="off" required> <label class="files__new-kind"> <input class="files__new-is-folder" id="files-new-is-folder" name="files-new-is-folder" type="checkbox"> Create as folder </label> <div class="files__new-actions"> <button class="files__new-cancel" type="button">Cancel</button> <button class="files__new-ok" type="submit">OK</button> </div> </form> </shadow-claw-dialog> <shadow-claw-dialog dialog-class="files__rename-dialog" dialog-aria-label="Rename file or folder"> <form class="files__rename-form" method="dialog"> <label class="files__rename-label" for="files-rename-name">Name</label> <input class="files__rename-input" id="files-rename-name" name="files-rename-name" type="text" autocomplete="off" required> <div class="files__rename-actions"> <button class="files__rename-cancel" type="button">Cancel</button> <button class="files__rename-ok" type="submit">Rename</button> </div> </form> </shadow-claw-dialog> <shadow-claw-dialog dialog-class="files__paste-dialog" dialog-aria-label="Paste file or folder"> <form class="files__paste-form" method="dialog"> <h3 class="files__paste-title">Confirm Paste</h3> <p class="files__paste-message"></p> <div class="files__paste-rename-container" hidden> <label class="files__paste-rename-label" for="files-paste-name">New Name</label> <input class="files__paste-rename-input" id="files-paste-name" name="files-paste-name" type="text" autocomplete="off"> </div> <div class="files__paste-actions"> <button class="files__paste-cancel" type="button">Cancel</button> <button class="files__paste-overwrite" type="button" hidden> Overwrite </button> <button class="files__paste-ok" type="submit">OK</button> </div> </form> </shadow-claw-dialog> <shadow-claw-dialog dialog-class="files__upload-conflict-dialog" dialog-aria-label="File upload conflict"> <form class="files__upload-conflict-form" method="dialog"> <h3 class="files__upload-conflict-title">File Already Exists</h3> <p class="files__upload-conflict-message"></p> <div class="files__upload-conflict-rename-container"> <label class="files__upload-conflict-rename-label" for="files-upload-conflict-name">New Name</label> <input class="files__upload-conflict-rename-input" id="files-upload-conflict-name" name="files-upload-conflict-name" type="text" autocomplete="off" required> </div> <div class="files__upload-conflict-actions"> <button class="files__upload-conflict-cancel" type="button"> Cancel </button> <button class="files__upload-conflict-overwrite" type="button"> Overwrite </button> <button class="files__upload-conflict-ok" type="submit"> Rename </button> </div> </form> </shadow-claw-dialog> <div class="files__content"> <div class="files__terminal-slot" data-terminal-slot hidden></div> <p class="files__drop-hint">Drop files here to upload</p> <div class="files__upload-progress" aria-live="polite" aria-label="Upload progress"> <span class="files__upload-progress-label">Uploading files...</span> <div class="files__upload-progress-track"> <div class="files__upload-progress-bar"></div> </div> </div> <div class="files__list" role="list" aria-live="polite"></div> </div> </section></template>