@kbve/droid 0.0.6 → 0.1.2

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 (190) hide show
  1. package/droid.mjs +2312 -74
  2. package/index.d.ts +32 -0
  3. package/lib/agents/api-types.d.ts +121 -0
  4. package/lib/agents/api-types.d.ts.map +1 -0
  5. package/lib/agents/auth/init.d.ts +8 -0
  6. package/lib/agents/auth/init.d.ts.map +1 -0
  7. package/lib/agents/cache.d.ts +9 -0
  8. package/lib/agents/cache.d.ts.map +1 -0
  9. package/lib/agents/client/callGuildVault.d.ts +3 -0
  10. package/lib/agents/client/callGuildVault.d.ts.map +1 -0
  11. package/lib/agents/client/callJson.d.ts +3 -0
  12. package/lib/agents/client/callJson.d.ts.map +1 -0
  13. package/lib/agents/config.d.ts +36 -0
  14. package/lib/agents/config.d.ts.map +1 -0
  15. package/lib/agents/constants.d.ts +11 -0
  16. package/lib/agents/constants.d.ts.map +1 -0
  17. package/lib/agents/createAgents.d.ts +4 -0
  18. package/lib/agents/createAgents.d.ts.map +1 -0
  19. package/lib/agents/ctx.d.ts +46 -0
  20. package/lib/agents/ctx.d.ts.map +1 -0
  21. package/lib/agents/discord/bot.d.ts +21 -0
  22. package/lib/agents/discord/bot.d.ts.map +1 -0
  23. package/lib/agents/discord/guilds.d.ts +8 -0
  24. package/lib/agents/discord/guilds.d.ts.map +1 -0
  25. package/lib/agents/formDrafts.d.ts +5 -0
  26. package/lib/agents/formDrafts.d.ts.map +1 -0
  27. package/lib/agents/generated/agents-schema.d.ts +73 -0
  28. package/lib/agents/generated/agents-schema.d.ts.map +1 -0
  29. package/lib/agents/generated/discordsh-agents-schema.d.ts +71 -0
  30. package/lib/agents/generated/discordsh-agents-schema.d.ts.map +1 -0
  31. package/lib/agents/github/backfill.d.ts +23 -0
  32. package/lib/agents/github/backfill.d.ts.map +1 -0
  33. package/lib/agents/github/events.d.ts +10 -0
  34. package/lib/agents/github/events.d.ts.map +1 -0
  35. package/lib/agents/github/pat.d.ts +13 -0
  36. package/lib/agents/github/pat.d.ts.map +1 -0
  37. package/lib/agents/github/repoConfig.d.ts +25 -0
  38. package/lib/agents/github/repoConfig.d.ts.map +1 -0
  39. package/lib/agents/github/tokens.d.ts +22 -0
  40. package/lib/agents/github/tokens.d.ts.map +1 -0
  41. package/lib/agents/github/webhook.d.ts +37 -0
  42. package/lib/agents/github/webhook.d.ts.map +1 -0
  43. package/lib/agents/index.d.ts +8 -0
  44. package/lib/agents/index.d.ts.map +1 -0
  45. package/lib/agents/state/atoms.d.ts +122 -0
  46. package/lib/agents/state/atoms.d.ts.map +1 -0
  47. package/lib/agents/types.d.ts +65 -0
  48. package/lib/agents/types.d.ts.map +1 -0
  49. package/lib/gateway/SupabaseGateway.d.ts +38 -0
  50. package/lib/gateway/SupabaseGateway.d.ts.map +1 -0
  51. package/lib/gateway/WorkerCommunication.d.ts +39 -0
  52. package/lib/gateway/WorkerCommunication.d.ts.map +1 -0
  53. package/lib/gateway/WorkerPool.d.ts +55 -0
  54. package/lib/gateway/WorkerPool.d.ts.map +1 -0
  55. package/lib/gateway/capabilities.d.ts +23 -0
  56. package/lib/gateway/capabilities.d.ts.map +1 -0
  57. package/lib/gateway/index.d.ts +9 -0
  58. package/lib/gateway/index.d.ts.map +1 -0
  59. package/lib/gateway/strategies/DirectStrategy.d.ts +52 -0
  60. package/lib/gateway/strategies/DirectStrategy.d.ts.map +1 -0
  61. package/lib/gateway/strategies/SharedWorkerStrategy.d.ts +46 -0
  62. package/lib/gateway/strategies/SharedWorkerStrategy.d.ts.map +1 -0
  63. package/lib/gateway/strategies/WebWorkerStrategy.d.ts +45 -0
  64. package/lib/gateway/strategies/WebWorkerStrategy.d.ts.map +1 -0
  65. package/lib/gateway/types.d.ts +81 -0
  66. package/lib/gateway/types.d.ts.map +1 -0
  67. package/lib/workers/canvas-ui-renderer.d.ts +25 -0
  68. package/lib/workers/canvas-ui-renderer.d.ts.map +1 -0
  69. package/lib/workers/canvas-worker.d.ts +14 -0
  70. package/lib/workers/canvas-worker.d.ts.map +1 -0
  71. package/lib/workers/canvas-worker.js +5 -302
  72. package/lib/workers/data.d.ts +40 -0
  73. package/lib/workers/data.d.ts.map +1 -0
  74. package/lib/workers/db-worker.d.ts +69 -0
  75. package/lib/workers/db-worker.d.ts.map +1 -0
  76. package/lib/workers/db-worker.js +13 -3636
  77. package/lib/workers/events.d.ts +11 -0
  78. package/lib/workers/events.d.ts.map +1 -0
  79. package/lib/workers/flexbuilder.d.ts +4 -0
  80. package/lib/workers/flexbuilder.d.ts.map +1 -0
  81. package/lib/workers/init.d.ts +11 -0
  82. package/lib/workers/init.d.ts.map +1 -0
  83. package/lib/workers/main.d.ts +105 -0
  84. package/lib/workers/main.d.ts.map +1 -0
  85. package/lib/workers/supabase-db-worker.d.ts +2 -0
  86. package/lib/workers/supabase-db-worker.d.ts.map +1 -0
  87. package/lib/workers/supabase-db-worker.js +23 -0
  88. package/lib/workers/supabase-shared-worker.d.ts +2 -0
  89. package/lib/workers/supabase-shared-worker.d.ts.map +1 -0
  90. package/lib/workers/supabase-shared-worker.js +25 -0
  91. package/lib/workers/tools.d.ts +4 -0
  92. package/lib/workers/tools.d.ts.map +1 -0
  93. package/lib/workers/validate.d.ts +15 -0
  94. package/lib/workers/validate.d.ts.map +1 -0
  95. package/lib/workers/ws-worker.d.ts +10 -0
  96. package/lib/workers/ws-worker.d.ts.map +1 -0
  97. package/lib/workers/ws-worker.js +5 -273
  98. package/main.js +5711 -0
  99. package/package.json +18 -6
  100. package/src/index.ts +41 -13
  101. package/src/lib/agents/api-types.ts +170 -0
  102. package/src/lib/agents/auth/init.ts +200 -0
  103. package/src/lib/agents/cache.ts +127 -0
  104. package/src/lib/agents/client/callGuildVault.ts +71 -0
  105. package/src/lib/agents/client/callJson.ts +64 -0
  106. package/src/lib/agents/config.ts +83 -0
  107. package/src/lib/agents/constants.ts +11 -0
  108. package/src/lib/agents/createAgents.ts +62 -0
  109. package/src/lib/agents/ctx.ts +63 -0
  110. package/src/lib/agents/discord/bot.ts +169 -0
  111. package/src/lib/agents/discord/guilds.ts +106 -0
  112. package/src/lib/agents/formDrafts.ts +55 -0
  113. package/src/lib/agents/generated/agents-schema.ts +155 -0
  114. package/src/lib/agents/generated/discordsh-agents-schema.ts +96 -0
  115. package/src/lib/agents/github/backfill.ts +126 -0
  116. package/src/lib/agents/github/events.ts +131 -0
  117. package/src/lib/agents/github/pat.ts +150 -0
  118. package/src/lib/agents/github/repoConfig.ts +240 -0
  119. package/src/lib/agents/github/tokens.ts +222 -0
  120. package/src/lib/agents/github/webhook.ts +349 -0
  121. package/src/lib/agents/index.ts +35 -0
  122. package/src/lib/agents/state/atoms.ts +122 -0
  123. package/src/lib/agents/types.ts +83 -0
  124. package/src/lib/api.ts +71 -0
  125. package/src/lib/droid.spec.ts +14 -19
  126. package/src/lib/droid.ts +48 -4
  127. package/src/lib/gateway/SupabaseGateway.ts +236 -0
  128. package/src/lib/gateway/WorkerCommunication.ts +132 -0
  129. package/src/lib/gateway/WorkerPool.ts +304 -0
  130. package/src/lib/gateway/capabilities.spec.ts +144 -0
  131. package/src/lib/gateway/capabilities.ts +80 -0
  132. package/src/lib/gateway/index.ts +15 -0
  133. package/src/lib/gateway/strategies/DirectStrategy.ts +443 -0
  134. package/src/lib/gateway/strategies/SharedWorkerStrategy.ts +278 -0
  135. package/src/lib/gateway/strategies/WebWorkerStrategy.ts +278 -0
  136. package/src/lib/gateway/types.ts +139 -0
  137. package/src/lib/mod/mod-manager.ts +13 -8
  138. package/src/lib/mod/module/bento/mod-bento.worker.ts +1 -1
  139. package/src/lib/mod/module/supabase/mod-supabase.spec.ts +21 -25
  140. package/src/lib/mod/module/supabase/mod-supabase.ts +73 -0
  141. package/src/lib/mod/module/supabase/mod-supabase.worker.ts +1 -56
  142. package/src/lib/state/auth.spec.ts +58 -0
  143. package/src/lib/state/auth.ts +148 -0
  144. package/src/lib/state/bento.spec.ts +76 -0
  145. package/src/lib/state/bento.ts +51 -0
  146. package/src/lib/state/index.ts +98 -0
  147. package/src/lib/state/overlay-manager.ts +125 -0
  148. package/src/lib/state/profile-sync.ts +214 -0
  149. package/src/lib/state/profile.ts +155 -0
  150. package/src/lib/state/router.ts +24 -0
  151. package/src/lib/state/staff.ts +128 -0
  152. package/src/lib/state/sync-bus.ts +109 -0
  153. package/src/lib/state/theme-sync.ts +75 -0
  154. package/src/lib/state/toasts.spec.ts +106 -0
  155. package/src/lib/state/toasts.ts +34 -0
  156. package/src/lib/state/ui.spec.ts +148 -0
  157. package/src/lib/state/ui.ts +45 -0
  158. package/src/lib/state/welcome-toast.spec.ts +101 -0
  159. package/src/lib/state/welcome-toast.ts +76 -0
  160. package/src/lib/sw-recovery.spec.ts +165 -0
  161. package/src/lib/sw-recovery.ts +141 -0
  162. package/src/lib/types/bento.spec.ts +116 -0
  163. package/src/lib/types/bento.ts +94 -55
  164. package/src/lib/types/event-schemas.spec.ts +120 -0
  165. package/src/lib/types/event-types.spec.ts +96 -0
  166. package/src/lib/types/event-types.ts +113 -3
  167. package/src/lib/types/modules.ts +12 -5
  168. package/src/lib/types/ui-event-types.ts +66 -0
  169. package/src/lib/workers/canvas-ui-renderer.ts +266 -0
  170. package/src/lib/workers/canvas-worker.ts +94 -9
  171. package/src/lib/workers/data.ts +64 -37
  172. package/src/lib/workers/db-worker.ts +105 -32
  173. package/src/lib/workers/events.spec.ts +208 -0
  174. package/src/lib/workers/events.ts +27 -14
  175. package/src/lib/workers/flexbuilder.ts +2 -2
  176. package/src/lib/workers/init.ts +25 -17
  177. package/src/lib/workers/main.ts +506 -327
  178. package/src/lib/workers/supabase-db-worker.ts +243 -0
  179. package/src/lib/workers/supabase-shared-worker.ts +607 -0
  180. package/src/lib/workers/validate.ts +64 -0
  181. package/src/lib/workers/ws-worker.spec.ts +41 -0
  182. package/src/lib/workers/ws-worker.ts +255 -31
  183. package/src/setup-vitest.ts +4 -2
  184. package/src/types.ts +30 -0
  185. package/src/vite-env.d.ts +1 -0
  186. package/workers/main.js +2 -1125
  187. package/comlink.js +0 -253
  188. package/index.js +0 -2972
  189. package/reference.js +0 -259
  190. package/src/types.d.ts +0 -31
package/droid.mjs CHANGED
@@ -1,76 +1,2314 @@
1
- import { z as C } from "./index.js";
2
- async function k(l) {
3
- console.log("[DROID]: droid<T>");
4
- const { main: g } = await import("./workers/main.js");
5
- return await g({ workerURLs: l?.workerURLs }), console.log("[DROID]: droid<T> => await WorkerURLs"), { initialized: !0 };
6
- }
7
- const b = ["default", "minimal", "image-heavy"], J = ["fade-in", "slide-up", "none"], c = ["_self", "_blank", "_parent", "_top"], d = ["button", "link", "region", "article"], m = ["default", "success", "warning", "error"], Z = /^[a-z]+-(100|200|300|400|500|600|700|800|900)$/, W = /^(?:(?:[a-z]+:)?(col|row)-span-\d+\s*)+$/, I = /^01[0-9A-HJKMNP-TV-Z]{24}$/, Y = C.object({
8
- id: C.string().regex(I, "Invalid ULID format").optional(),
9
- title: C.string().min(1, "Title is required"),
10
- subtitle: C.string().optional(),
11
- description: C.string().optional(),
12
- span: C.string().regex(W, "Invalid span format (e.g., col-span-2, row-span-1)").optional(),
13
- primaryColor: C.string().regex(Z, "Invalid Tailwind color format (e.g., blue-500)"),
14
- secondaryColor: C.string().regex(Z, "Invalid Tailwind color format (e.g., blue-500)"),
15
- icon: C.string().optional(),
16
- backgroundImage: C.string().url().optional(),
17
- onclick: C.string().optional(),
18
- href: C.string().url().optional(),
19
- target: C.enum(c).optional(),
20
- ariaLabel: C.string().optional(),
21
- role: C.enum(d).optional(),
22
- variant: C.enum(b).optional(),
23
- animation: C.enum(J).optional(),
24
- badge: C.string().optional(),
25
- badgeType: C.enum(m).optional(),
26
- priority: C.number().int().min(0).optional(),
27
- tooltip: C.string().optional(),
28
- disabled: C.boolean().optional(),
29
- meta: C.record(C.any()).optional(),
30
- dataset: C.record(C.string()).optional(),
31
- className: C.string().optional()
32
- }).refine(
33
- (l) => !l.href || l.href && l.target,
34
- { message: "target is required when href is provided", path: ["target"] }
35
- ).refine(
36
- (l) => !l.badgeType || l.badge && l.badge.length > 0,
37
- { message: "badge must be provided if badgeType is set", path: ["badge"] }
38
- ), X = {
39
- default: { base: "p-4 flex flex-col justify-between" },
40
- minimal: { base: "p-2 bg-opacity-30 backdrop-blur-sm", hover: "bg-opacity-50" },
41
- "image-heavy": { base: "p-0 overflow-hidden", hover: "scale-105" }
42
- }, o = {
43
- "fade-in": "animate-fade-in",
44
- "slide-up": "animate-slide-up",
45
- none: ""
46
- }, y = {
47
- default: "bg-white/30 text-white",
48
- success: "bg-green-500/80 text-white",
49
- warning: "bg-yellow-500/80 text-black",
50
- error: "bg-red-500/80 text-white"
51
- }, n = {
52
- bento: new URL("data:video/mp2t;base64,aW1wb3J0IHsgZXhwb3NlIH0gZnJvbSAnY29tbGluayc7CmltcG9ydCB0eXBlIHsgQmFzZU1vZEFQSSwgVmlydHVhbE5vZGUgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9tb2R1bGVzJzsKaW1wb3J0IHsKCUJlbnRvVGlsZVNjaGVtYSwKCXR5cGUgQmVudG9UaWxlLAoJQkVOVE9fQkFER0VfQ0xBU1NfTUFQLAoJQkVOVE9fQU5JTUFUSU9OX0NMQVNTX01BUCwKCUJFTlRPX1ZBUklBTlRfQ0xBU1NfTUFQLAp9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2JlbnRvJzsKCmxldCBlbWl0VG9NYWluOiAoKG1zZzogYW55KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDsKCmZ1bmN0aW9uIGNyZWF0ZVZOb2RlRnJvbVRpbGUodGlsZTogQmVudG9UaWxlKTogVmlydHVhbE5vZGUgewoJY29uc3QgdmFyaWFudCA9IHRpbGUudmFyaWFudCA/PyAnZGVmYXVsdCc7Cgljb25zdCBhbmltYXRpb25DbGFzcyA9IHRpbGUuYW5pbWF0aW9uCgkJPyBCRU5UT19BTklNQVRJT05fQ0xBU1NfTUFQW3RpbGUuYW5pbWF0aW9uXQoJCTogJyc7Cgljb25zdCB2YXJpYW50QmFzZSA9IEJFTlRPX1ZBUklBTlRfQ0xBU1NfTUFQW3ZhcmlhbnRdPy5iYXNlID8/ICcnOwoJY29uc3QgdmFyaWFudEhvdmVyID0gQkVOVE9fVkFSSUFOVF9DTEFTU19NQVBbdmFyaWFudF0/LmhvdmVyID8/ICcnOwoKCWNvbnN0IHJvb3RDbGFzc2VzID0gWwoJCSdiZW50by1pdGVtJywKCQknY29sLXNwYW4tMScsCgkJJ3Jvdy1zcGFuLTEnLAoJCXRpbGUuc3BhbiA/PyAnbWQ6Y29sLXNwYW4tMiBtZDpyb3ctc3Bhbi0xJywKCQknYmctZ3JhZGllbnQtdG8tYnInLAoJCXRpbGUucHJpbWFyeUNvbG9yID8gYGZyb20tJHt0aWxlLnByaW1hcnlDb2xvcn1gIDogJycsCgkJdGlsZS5zZWNvbmRhcnlDb2xvciA/IGB0by0ke3RpbGUuc2Vjb25kYXJ5Q29sb3J9YCA6ICcnLAoJCSdyb3VuZGVkLTJ4bCBvdmVyZmxvdy1oaWRkZW4gc2hhZG93LTJ4bCcsCgkJdmFyaWFudEJhc2UsCgkJdmFyaWFudEhvdmVyID8gYGhvdmVyOiR7dmFyaWFudEhvdmVyfWAgOiAnJywKCQlhbmltYXRpb25DbGFzcywKCQl0aWxlLmNsYXNzTmFtZSA/PyAnJywKCV0KCQkuZmlsdGVyKEJvb2xlYW4pCgkJLmpvaW4oJyAnKTsKCgljb25zdCBkYXRhc2V0QXR0cnMgPSB0aWxlLmRhdGFzZXQKCQk/IE9iamVjdC5mcm9tRW50cmllcygKCQkJCU9iamVjdC5lbnRyaWVzKHRpbGUuZGF0YXNldCkubWFwKChbaywgdl0pID0+IFtgZGF0YS0ke2t9YCwgdl0pLAoJCQkpCgkJOiB7fTsKCgljb25zdCB3cmFwcGVyOiBWaXJ0dWFsTm9kZSA9IHsKCQl0YWc6IHRpbGUuaHJlZiA/ICdhJyA6ICdkaXYnLAoJCWNsYXNzOiByb290Q2xhc3NlcywKCQlhdHRyczogewoJCQkuLi4odGlsZS5ocmVmCgkJCQk/IHsgaHJlZjogdGlsZS5ocmVmLCB0YXJnZXQ6IHRpbGUudGFyZ2V0ID8/ICdfc2VsZicgfQoJCQkJOiB7fSksCgkJCS4uLih0aWxlLm9uY2xpY2sgPyB7IG9uY2xpY2s6IHRpbGUub25jbGljayB9IDoge30pLAoJCQkuLi4odGlsZS5hcmlhTGFiZWwgPyB7ICdhcmlhLWxhYmVsJzogdGlsZS5hcmlhTGFiZWwgfSA6IHt9KSwKCQkJLi4uKHRpbGUucm9sZSA/IHsgcm9sZTogdGlsZS5yb2xlIH0gOiB7fSksCgkJCS4uLmRhdGFzZXRBdHRycywKCQl9LAoJCWNoaWxkcmVuOiBbCgkJCXRpbGUuYmFkZ2UgJiYgewoJCQkJdGFnOiAnc3BhbicsCgkJCQljbGFzczogYGFic29sdXRlIHRvcC0yIHJpZ2h0LTIgcHgtMiBweS0xIHRleHQteHMgcm91bmRlZCB6LTEwICR7QkVOVE9fQkFER0VfQ0xBU1NfTUFQW3RpbGUuYmFkZ2VUeXBlID8/ICdkZWZhdWx0J119YCwKCQkJCWNoaWxkcmVuOiBbdGlsZS5iYWRnZV0sCgkJCX0sCgkJCXsKCQkJCXRhZzogJ2RpdicsCgkJCQljbGFzczogJ3AtNCBmbGV4IGZsZXgtY29sIGp1c3RpZnktYmV0d2VlbiBoLWZ1bGwnLAoJCQkJY2hpbGRyZW46IFsKCQkJCQl7CgkJCQkJCXRhZzogJ2RpdicsCgkJCQkJCWNsYXNzOiAnZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMnLAoJCQkJCQljaGlsZHJlbjogWwoJCQkJCQkJdGlsZS5pY29uICYmIHsKCQkJCQkJCQl0YWc6ICdkaXYnLAoJCQkJCQkJCWNsYXNzOiAndGV4dC0yeGwgYmctd2hpdGUvMjAgcm91bmRlZC1mdWxsIHAtMiB0ZXh0LXdoaXRlJywKCQkJCQkJCQljaGlsZHJlbjogW3RpbGUuaWNvbl0sCgkJCQkJCQl9LAoJCQkJCQkJewoJCQkJCQkJCXRhZzogJ2gzJywKCQkJCQkJCQljbGFzczogJ3RleHQtd2hpdGUgdGV4dC1sZyBmb250LWJvbGQnLAoJCQkJCQkJCWNoaWxkcmVuOiBbdGlsZS50aXRsZV0sCgkJCQkJCQl9LAoJCQkJCQldLmZpbHRlcihCb29sZWFuKSBhcyBWaXJ0dWFsTm9kZVtdLAoJCQkJCX0sCgkJCQkJdGlsZS5zdWJ0aXRsZSAmJiB7CgkJCQkJCXRhZzogJ3AnLAoJCQkJCQljbGFzczogJ3RleHQtc20gdGV4dC13aGl0ZS84MCBtdC0yJywKCQkJCQkJY2hpbGRyZW46IFt0aWxlLnN1YnRpdGxlXSwKCQkJCQl9LAoJCQkJCXRpbGUuZGVzY3JpcHRpb24gJiYgewoJCQkJCQl0YWc6ICdwJywKCQkJCQkJY2xhc3M6ICd0ZXh0LXhzIHRleHQtd2hpdGUvNjAgbXQtMScsCgkJCQkJCWNoaWxkcmVuOiBbdGlsZS5kZXNjcmlwdGlvbl0sCgkJCQkJfSwKCQkJCV0uZmlsdGVyKEJvb2xlYW4pIGFzIFZpcnR1YWxOb2RlW10sCgkJCX0sCgkJXS5maWx0ZXIoQm9vbGVhbikgYXMgVmlydHVhbE5vZGVbXSwKCX07CgoJcmV0dXJuIHdyYXBwZXI7Cn0KCmNvbnN0IGFwaTogQmFzZU1vZEFQSSA9IHsKCWFzeW5jIGdldE1ldGEoKSB7CgkJcmV0dXJuIHsKCQkJbmFtZTogJ2JlbnRvJywKCQkJdmVyc2lvbjogJzAuMS4wJywKCQl9OwoJfSwKCglhc3luYyBpbml0KGNvbnRleHQpIHsKCQllbWl0VG9NYWluID0gY29udGV4dD8uZW1pdEZyb21Xb3JrZXI7Cgl9LAoKCWFzeW5jIHJ1bihkYXRhOiB1bmtub3duKSB7CgkJaWYgKCFlbWl0VG9NYWluKSB7CgkJCWNvbnNvbGUud2FybignW21vZC1iZW50b10gZW1pdEZyb21Xb3JrZXIgbm90IGRlZmluZWQnKTsKCQkJcmV0dXJuOwoJCX0KCgkJdHJ5IHsKCQkJY29uc3QgdGlsZSA9IEJlbnRvVGlsZVNjaGVtYS5wYXJzZShkYXRhKTsKCQkJY29uc3Qgdm5vZGUgPSBjcmVhdGVWTm9kZUZyb21UaWxlKHRpbGUpOwoJCQllbWl0VG9NYWluKHsgdHlwZTogJ2luamVjdFZOb2RlJywgdm5vZGUgfSk7CgkJfSBjYXRjaCAoZXJyKSB7CgkJCWNvbnNvbGUuZXJyb3IoJ1ttb2QtYmVudG9dIEludmFsaWQgQmVudG9UaWxlIGRhdGE6JywgZXJyKTsKCQl9Cgl9LAp9OwoKZXhwb3NlKGFwaSk7Cg==", import.meta.url).href
53
- }, s = {
54
- canvasWorker: new URL("data:video/mp2t;base64,aW1wb3J0IHsgZXhwb3NlIH0gZnJvbSAnY29tbGluayc7CgpleHBvcnQgaW50ZXJmYWNlIENhbnZhc1dvcmtlckFQSSB7CgliaW5kQ2FudmFzKHBhbmVsSWQ6IHN0cmluZywgY2FudmFzOiBPZmZzY3JlZW5DYW52YXMsIG1vZGU/OiBDYW52YXNEcmF3TW9kZSk6IFByb21pc2U8dm9pZD47Cgl1bmJpbmRDYW52YXMocGFuZWxJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjsKfQoKaW50ZXJmYWNlIENhbnZhc0JpbmRpbmcgewoJY3R4OiBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7CgljYW52YXM6IE9mZnNjcmVlbkNhbnZhczsKCXBhbmVsSWQ6IHN0cmluZzsKCW1vZGU/OiBDYW52YXNEcmF3TW9kZTsKCWFuaW1hdGlvbkZyYW1lPzogbnVtYmVyOwp9CgpleHBvcnQgdHlwZSBDYW52YXNEcmF3TW9kZSA9ICdzdGF0aWMnIHwgJ2FuaW1hdGVkJyB8ICdkeW5hbWljJzsKCmNvbnN0IENhbnZhc01hbmFnZXIgPSB7CgliaW5kaW5nczogbmV3IE1hcDxzdHJpbmcsIENhbnZhc0JpbmRpbmc+KCksCgoJYXN5bmMgYmluZENhbnZhcyhwYW5lbElkOiBzdHJpbmcsIGNhbnZhczogT2Zmc2NyZWVuQ2FudmFzLCBtb2RlOiBDYW52YXNEcmF3TW9kZSA9ICdhbmltYXRlZCcpIHsKCQljb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKCgkJaWYgKCFjdHgpIHsKCQkJY29uc29sZS5lcnJvcihgW0NhbnZhc1dvcmtlcl0gRmFpbGVkIHRvIGdldCAyRCBjb250ZXh0IGZvciBwYW5lbCAke3BhbmVsSWR9YCk7CgkJCXJldHVybjsKCQl9CgoJCWNvbnNvbGUubG9nKGBbQ2FudmFzV29ya2VyXSBTdWNjZXNzZnVsbHkgYm91bmQgY2FudmFzIGZvciBwYW5lbCAke3BhbmVsSWR9IHdpdGggbW9kZSAke21vZGV9YCk7CgoJCXRoaXMuYmluZGluZ3Muc2V0KHBhbmVsSWQsIHsgY3R4LCBjYW52YXMsIHBhbmVsSWQsIG1vZGUgfSk7CgoJCXRoaXMuc3RhcnRBbmltYXRpb24ocGFuZWxJZCk7Cgl9LAoKCXN0YXJ0QW5pbWF0aW9uKHBhbmVsSWQ6IHN0cmluZykgewoJCWNvbnN0IGJpbmRpbmcgPSB0aGlzLmJpbmRpbmdzLmdldChwYW5lbElkKTsKCQlpZiAoIWJpbmRpbmcpIHJldHVybjsKCgkJc3dpdGNoIChiaW5kaW5nLm1vZGUpIHsKCQkJY2FzZSAnc3RhdGljJzoKCQkJCXRoaXMuZHJhd1N0YXRpYyhiaW5kaW5nKTsKCQkJCWJyZWFrOwoJCQljYXNlICdhbmltYXRlZCc6CgkJCQl0aGlzLmRyYXdBbmltYXRlZChiaW5kaW5nKTsKCQkJCWJyZWFrOwoJCQljYXNlICdkeW5hbWljJzoKCQkJCXRoaXMuZHJhd0R5bmFtaWMoYmluZGluZyk7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWNvbnNvbGUud2FybihgW0NhbnZhc1dvcmtlcl0gVW5rbm93biBkcmF3IG1vZGUgZm9yIHBhbmVsICR7cGFuZWxJZH1gKTsKCQl9Cgl9LAoKCWRyYXdTdGF0aWMoYmluZGluZzogQ2FudmFzQmluZGluZykgewoJCWJpbmRpbmcuY3R4LmZpbGxTdHlsZSA9ICdncmF5JzsKCQliaW5kaW5nLmN0eC5maWxsUmVjdCgwLCAwLCBiaW5kaW5nLmNhbnZhcy53aWR0aCwgYmluZGluZy5jYW52YXMuaGVpZ2h0KTsKCX0sCgoJZHJhd0FuaW1hdGVkKGJpbmRpbmc6IENhbnZhc0JpbmRpbmcpIHsKCQlsZXQgaHVlID0gMDsKCgkJY29uc3QgZHJhd0ZyYW1lID0gKCkgPT4gewoJCQlodWUgPSAoaHVlICsgMSkgJSAzNjA7CgkJCWJpbmRpbmcuY3R4LmZpbGxTdHlsZSA9IGBoc2woJHtodWV9LCAxMDAlLCA1MCUpYDsKCQkJYmluZGluZy5jdHguZmlsbFJlY3QoMCwgMCwgYmluZGluZy5jYW52YXMud2lkdGgsIGJpbmRpbmcuY2FudmFzLmhlaWdodCk7CgoJCQliaW5kaW5nLmFuaW1hdGlvbkZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRyYXdGcmFtZSk7CgkJfTsKCgkJZHJhd0ZyYW1lKCk7Cgl9LAoKCWRyYXdEeW5hbWljKGJpbmRpbmc6IENhbnZhc0JpbmRpbmcpIHsKCQlsZXQgdGltZSA9IDA7CgoJCWNvbnN0IGRyYXdGcmFtZSA9ICgpID0+IHsKCQkJdGltZSArPSAwLjA1OwoJCQliaW5kaW5nLmN0eC5jbGVhclJlY3QoMCwgMCwgYmluZGluZy5jYW52YXMud2lkdGgsIGJpbmRpbmcuY2FudmFzLmhlaWdodCk7CgkJCWJpbmRpbmcuY3R4LmJlZ2luUGF0aCgpOwoJCQliaW5kaW5nLmN0eC5hcmMoCgkJCQliaW5kaW5nLmNhbnZhcy53aWR0aCAvIDIgKyBNYXRoLnNpbih0aW1lKSAqIDUwLAoJCQkJYmluZGluZy5jYW52YXMuaGVpZ2h0IC8gMiArIE1hdGguY29zKHRpbWUpICogNTAsCgkJCQkzMCwKCQkJCTAsCgkJCQlNYXRoLlBJICogMgoJCQkpOwoJCQliaW5kaW5nLmN0eC5maWxsU3R5bGUgPSAnb3JhbmdlJzsKCQkJYmluZGluZy5jdHguZmlsbCgpOwoJCgkJCWJpbmRpbmcuYW5pbWF0aW9uRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZHJhd0ZyYW1lKTsKCQl9OwoKCQlkcmF3RnJhbWUoKTsKCX0sCgoJYXN5bmMgdW5iaW5kQ2FudmFzKHBhbmVsSWQ6IHN0cmluZykgewoJCWNvbnN0IGJpbmRpbmcgPSB0aGlzLmJpbmRpbmdzLmdldChwYW5lbElkKTsKCQlpZiAoYmluZGluZz8uYW5pbWF0aW9uRnJhbWUpIHsKCQkJY2FuY2VsQW5pbWF0aW9uRnJhbWUoYmluZGluZy5hbmltYXRpb25GcmFtZSk7CgkJfQoJCXRoaXMuYmluZGluZ3MuZGVsZXRlKHBhbmVsSWQpOwoJCWNvbnNvbGUubG9nKGBbQ2FudmFzV29ya2VyXSBVbmJvdW5kIGNhbnZhcyBmb3IgcGFuZWwgJHtwYW5lbElkfWApOwoJfSwKfTsKCmV4cG9zZShDYW52YXNNYW5hZ2VyKTsK", import.meta.url),
55
- dbWorker: new URL("data:video/mp2t;base64,aW1wb3J0IHsgZXhwb3NlIH0gZnJvbSAnY29tbGluayc7CmltcG9ydCBEZXhpZSwgeyB0eXBlIFRhYmxlIH0gZnJvbSAnZGV4aWUnOwppbXBvcnQgdHlwZSB7IERpc2NvcmRTZXJ2ZXIsIERpc2NvcmRUYWcsIFByb2ZpbGUgfSBmcm9tICcuLi90eXBlcy9kaXNjb3JkJzsKaW1wb3J0IHsgdG9SZWZlcmVuY2UgfSBmcm9tICcuL2ZsZXhidWlsZGVyJzsKCmludGVyZmFjZSBTaGFyZWRXb3JrZXJHbG9iYWxTY29wZSBleHRlbmRzIFdvcmtlciB7CglvbmNvbm5lY3Q6IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB2b2lkOwp9CmRlY2xhcmUgY29uc3Qgc2VsZjogU2hhcmVkV29ya2VyR2xvYmFsU2NvcGU7CgpjbGFzcyBBcHBEZXhpZSBleHRlbmRzIERleGllIHsKCXNldHRpbmdzITogVGFibGU8eyBpZDogc3RyaW5nOyB2YWx1ZTogYW55IH0sIHN0cmluZz47CgltZXRhITogVGFibGU8eyBrZXk6IHN0cmluZzsgdmFsdWU6IGFueSB9LCBzdHJpbmc+OwoJaTE4biE6IFRhYmxlPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSwgc3RyaW5nPjsKCWh0bWxzZXJ2ZXJzITogVGFibGU8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9LCBzdHJpbmc+OwoJc2VydmVycyE6IFRhYmxlPERpc2NvcmRTZXJ2ZXIsIHN0cmluZz47Cgl0YWdzITogVGFibGU8RGlzY29yZFRhZywgc3RyaW5nPjsKCXByb2ZpbGVzITogVGFibGU8UHJvZmlsZSwgc3RyaW5nPjsKCXdzX21lc3NhZ2VzITogVGFibGU8eyBrZXk6IHN0cmluZzsgbWVzc2FnZTogYW55IH0sIHN0cmluZz47CgoJY29uc3RydWN0b3IoKSB7CgkJc3VwZXIoJ0FwcFN0b3JhZ2UnKTsKCQl0aGlzLnZlcnNpb24oMykuc3RvcmVzKHsKCQkJc2V0dGluZ3M6ICcmaWQnLAoJCQltZXRhOiAnJmtleScsCgkJCWkxOG46ICcma2V5JywKCQkJaHRtbHNlcnZlcnM6ICcma2V5JywKCQkJc2VydmVyczogJyZzZXJ2ZXJfaWQnLAoJCQl0YWdzOiAnJnRhZ19pZCcsCgkJCXByb2ZpbGVzOiAnJnByb2ZpbGVfaWQnLAoJCQl3c19tZXNzYWdlczogJyZrZXknLAoJCX0pOwoJfQp9CmNvbnN0IGRiID0gbmV3IEFwcERleGllKCk7CgpmdW5jdGlvbiBkZWxheShtczogbnVtYmVyKSB7CglyZXR1cm4gbmV3IFByb21pc2UoKHJlcykgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7Cn0KCmZ1bmN0aW9uIHJlbmRlckh0bWxGb3JTZXJ2ZXIoc2VydmVyOiBEaXNjb3JkU2VydmVyKTogc3RyaW5nIHsKCXJldHVybiBgCgkJPGRpdiBjbGFzcz0iZmxleCBmbGV4LWNvbCBnYXAtMiBwLTIiPgoJCQk8aW1nIHNyYz0iJHtzZXJ2ZXIubG9nb30iIGFsdD0iJHtzZXJ2ZXIubmFtZX0iIGNsYXNzPSJ3LTEyIGgtMTIgcm91bmRlZC1mdWxsIiAvPgoJCQk8aDMgY2xhc3M9InRleHQtbGcgZm9udC1ib2xkIj4ke3NlcnZlci5uYW1lfTwvaDM+CgkJCTxwIGNsYXNzPSJ0ZXh0LXNtIG9wYWNpdHktNzAiPiR7c2VydmVyLnN1bW1hcnl9PC9wPgoJCQk8YSBocmVmPSIke3NlcnZlci5pbnZpdGV9IiBjbGFzcz0idGV4dC1wdXJwbGUtNDAwIHVuZGVybGluZSB0ZXh0LXhzIj5Kb2luIEpvaW4gSm9pbjwvYT4KCQk8L2Rpdj4KCWAudHJpbSgpOwp9CgovLyAtLS0gQ29tbGluay1TYWZlIEFQSSAtLS0KY29uc3Qgc3RvcmFnZUFQSSA9IHsKCgkvLyBXZWJTb2NrZXQKCglhc3luYyBzdG9yZVdzTWVzc2FnZShrZXk6IHN0cmluZywgYnVmZmVyOiBBcnJheUJ1ZmZlcikgewoJCWNvbnN0IGRlY29kZWQgPSB0b1JlZmVyZW5jZShidWZmZXIpLnRvT2JqZWN0KCk7CgkJYXdhaXQgZGIud3NfbWVzc2FnZXMucHV0KHsga2V5LCBtZXNzYWdlOiBkZWNvZGVkIH0pOwoJfSwKCglhc3luYyBnZXRXc01lc3NhZ2Uoa2V5OiBzdHJpbmcpIHsKCQlyZXR1cm4gKGF3YWl0IGRiLndzX21lc3NhZ2VzLmdldChrZXkpKT8ubWVzc2FnZSA/PyBudWxsOwoJfSwKCQoJYXN5bmMgZ2V0QWxsV3NNZXNzYWdlcygpOiBQcm9taXNlPHsga2V5OiBzdHJpbmc7IG1lc3NhZ2U6IGFueSB9W10+IHsKCQljb25zdCByYXcgPSBhd2FpdCBkYi53c19tZXNzYWdlcy50b0FycmF5KCk7CgkJcmV0dXJuIHJhdy5zb3J0KChhLCBiKSA9PiB7CgkJCWNvbnN0IGF0ID0gTnVtYmVyKGEua2V5LnNwbGl0KCc6JylbMV0pOwoJCQljb25zdCBidCA9IE51bWJlcihiLmtleS5zcGxpdCgnOicpWzFdKTsKCQkJcmV0dXJuIGJ0IC0gYXQ7CgkJfSk7Cgl9LAoJCglhc3luYyBjbGVhcldzTWVzc2FnZXMoKSB7CgkJYXdhaXQgZGIud3NfbWVzc2FnZXMuY2xlYXIoKTsKCX0sCgoJLy8gSTE4bgoJYXN5bmMgZ2V0VHJhbnNsYXRpb24oa2V5OiBzdHJpbmcpIHsKCQlyZXR1cm4gKGF3YWl0IGRiLmkxOG4uZ2V0KGtleSkpPy52YWx1ZSA/PyBudWxsOwoJfSwKCWFzeW5jIGdldFRyYW5zbGF0aW9ucyhrZXlzOiBzdHJpbmdbXSkgewoJCWNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9OwoJCWZvciAoY29uc3Qga2V5IG9mIGtleXMpIHsKCQkJY29uc3QgdmFsID0gYXdhaXQgZGIuaTE4bi5nZXQoa2V5KTsKCQkJaWYgKHZhbCkgcmVzdWx0W2tleV0gPSB2YWwudmFsdWU7CgkJfQoJCXJldHVybiByZXN1bHQ7Cgl9LAoJYXN5bmMgcHV0STE4bkJhdGNoKGRhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHsKCQljb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZGF0YSkubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7CgkJCWtleSwKCQkJdmFsdWUsCgkJfSkpOwoJCWF3YWl0IGRiLmkxOG4uYnVsa1B1dChlbnRyaWVzKTsKCX0sCglhc3luYyBsb2FkSTE4bkZyb21KU09OKHBhdGggPSAnaHR0cHM6Ly9kaXNjb3JkLnNoL2kxOG4vZGIuanNvbicpIHsKCWNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHBhdGgpOwoJY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7Cglhd2FpdCBzdG9yYWdlQVBJLnB1dEkxOG5CYXRjaChkYXRhKTsKCX0sCglhc3luYyBnZXRBbGxJMThuS2V5cygpOiBQcm9taXNlPHN0cmluZ1tdPiB7CgkJY29uc3QgYWxsID0gYXdhaXQgZGIuaTE4bi50b0NvbGxlY3Rpb24oKS5wcmltYXJ5S2V5cygpOwoJCXJldHVybiBhbGwgYXMgc3RyaW5nW107Cgl9LAoKCWFzeW5jIGxvYWRTZXJ2ZXJzRnJvbUpTT04ocGF0aCA9ICdodHRwczovL2Rpc2NvcmQuc2gvZGF0YS9zZXJ2ZXJzLmpzb24nKSB7CgkJY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gocGF0aCk7CgkJY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CgkKCQkvLyBUaGUgSlNPTiBzaG91bGQgYmUgYSBSZWNvcmQ8c3RyaW5nLCBEaXNjb3JkU2VydmVyPgoJCWNvbnN0IHNlcnZlcnM6IERpc2NvcmRTZXJ2ZXJbXSA9IE9iamVjdC52YWx1ZXMoZGF0YSk7CgkJYXdhaXQgc3RvcmFnZUFQSS5wdXRTZXJ2ZXJzKHNlcnZlcnMpOwoJCWF3YWl0IHN0b3JhZ2VBUEkuc3luY0h0bWxGcm9tU2VydmVycygpOwoJfSwKCgkvLyBIVE1MIFByZVJlbmRlcgoJYXN5bmMgc3luY0h0bWxGcm9tU2VydmVycygpIHsKCQljb25zdCBhbGxTZXJ2ZXJzID0gYXdhaXQgZGIuc2VydmVycy50b0FycmF5KCk7CgkJY29uc3QgZXhpc3RpbmdIdG1sS2V5cyA9IGF3YWl0IGRiLmh0bWxzZXJ2ZXJzLnRvQ29sbGVjdGlvbigpLnByaW1hcnlLZXlzKCk7CgkJY29uc3QgbWlzc2luZzogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTsKCQoJCWZvciAoY29uc3Qgc2VydmVyIG9mIGFsbFNlcnZlcnMpIHsKCQkJaWYgKCFleGlzdGluZ0h0bWxLZXlzLmluY2x1ZGVzKHNlcnZlci5zZXJ2ZXJfaWQpKSB7CgkJCQljb25zdCBodG1sID0gcmVuZGVySHRtbEZvclNlcnZlcihzZXJ2ZXIpOwoJCQkJbWlzc2luZy5wdXNoKHsga2V5OiBzZXJ2ZXIuc2VydmVyX2lkLCB2YWx1ZTogaHRtbCB9KTsKCQkJfQoJCX0KCQoJCWlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHsKCQkJYXdhaXQgZGIuaHRtbHNlcnZlcnMuYnVsa1B1dChtaXNzaW5nKTsKCQkJY29uc29sZS5pbmZvKGBbc3luY0h0bWxGcm9tU2VydmVyc10gR2VuZXJhdGVkICR7bWlzc2luZy5sZW5ndGh9IEhUTUwgY2FyZHMuYCk7CgkJfSBlbHNlIHsKCQkJY29uc29sZS5pbmZvKCdbc3luY0h0bWxGcm9tU2VydmVyc10gQWxsIHNlcnZlcnMgYWxyZWFkeSBoYXZlIEhUTUwgY2FyZHMuJyk7CgkJfQoJfSwKCgkvLyBTZXR0aW5ncwoJYXN5bmMgZGJTZXQoaWQ6IHN0cmluZywgdmFsdWU6IGFueSkgewoJCWF3YWl0IGRiLnNldHRpbmdzLnB1dCh7IGlkLCB2YWx1ZSB9KTsKCX0sCglhc3luYyBkYkdldChpZDogc3RyaW5nKSB7CgkJcmV0dXJuIChhd2FpdCBkYi5zZXR0aW5ncy5nZXQoaWQpKT8udmFsdWUgPz8gbnVsbDsKCX0sCglhc3luYyBkYkNsZWFyKCkgewoJCWF3YWl0IGRiLnNldHRpbmdzLmNsZWFyKCk7Cgl9LAoKCS8vIE1ldGEKCWFzeW5jIHNldFZlcnNpb24odmVyc2lvbjogc3RyaW5nKSB7CgkJYXdhaXQgZGIubWV0YS5wdXQoeyBrZXk6ICd2ZXJzaW9uJywgdmFsdWU6IHZlcnNpb24gfSk7Cgl9LAoJYXN5bmMgZ2V0VmVyc2lvbigpIHsKCQlyZXR1cm4gKGF3YWl0IGRiLm1ldGEuZ2V0KCd2ZXJzaW9uJykpPy52YWx1ZSA/PyBudWxsOwoJfSwKCWFzeW5jIG1hcmtTZWVkZWQoKSB7CgkJYXdhaXQgZGIubWV0YS5wdXQoeyBrZXk6ICdkYl9zZWVkZWQnLCB2YWx1ZTogdHJ1ZSB9KTsKCX0sCglhc3luYyBjaGVja1NlZWRlZCgpIHsKCQlyZXR1cm4gKGF3YWl0IGRiLm1ldGEuZ2V0KCdkYl9zZWVkZWQnKSk/LnZhbHVlID09PSB0cnVlOwoJfSwKCgkvLyBTZXJ2ZXJzCglhc3luYyBwdXRTZXJ2ZXJzKHNlcnZlcnM6IERpc2NvcmRTZXJ2ZXJbXSkgewoJCWF3YWl0IGRiLnNlcnZlcnMuYnVsa1B1dChzZXJ2ZXJzKTsKCX0sCglhc3luYyBnZXRBbGxTZXJ2ZXJzKCkgewoJCXJldHVybiBhd2FpdCBkYi5zZXJ2ZXJzLnRvQXJyYXkoKTsKCX0sCgoJLy8gSFRNTCBzZXJ2ZXJzCglhc3luYyBwdXRIdG1sQ2FyZHMoZGF0YTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pIHsKCQlhd2FpdCBkYi5odG1sc2VydmVycy5idWxrUHV0KGRhdGEpOwoJfSwKCWFzeW5jIGdldEh0bWxDYXJkKGtleTogc3RyaW5nKSB7CgkJcmV0dXJuIChhd2FpdCBkYi5odG1sc2VydmVycy5nZXQoa2V5KSk/LnZhbHVlID8/IG51bGw7Cgl9LAoKCS8vIFRhZ3MKCWFzeW5jIHB1dFRhZ3ModGFnczogRGlzY29yZFRhZ1tdKSB7CgkJYXdhaXQgZGIudGFncy5idWxrUHV0KHRhZ3MpOwoJfSwKCWFzeW5jIGdldEFsbFRhZ3MoKSB7CgkJcmV0dXJuIGF3YWl0IGRiLnRhZ3MudG9BcnJheSgpOwoJfSwKCgkvLyBQcm9maWxlcwoJYXN5bmMgcHV0UHJvZmlsZXMocHJvZmlsZXM6IFByb2ZpbGVbXSkgewoJCWF3YWl0IGRiLnByb2ZpbGVzLmJ1bGtQdXQocHJvZmlsZXMpOwoJfSwKCWFzeW5jIGdldEFsbFByb2ZpbGVzKCkgewoJCXJldHVybiBhd2FpdCBkYi5wcm9maWxlcy50b0FycmF5KCk7Cgl9LAp9OwoKZXhwb3J0IHR5cGUgTG9jYWxTdG9yYWdlQVBJID0gdHlwZW9mIHN0b3JhZ2VBUEk7CgpzZWxmLm9uY29ubmVjdCA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7Cgljb25zdCBwb3J0ID0gZXZlbnQucG9ydHNbMF07Cglwb3J0LnN0YXJ0KCk7CglleHBvc2Uoc3RvcmFnZUFQSSwgcG9ydCk7Cn07Cg==", import.meta.url),
56
- wsWorker: new URL("data:video/mp2t;base64,aW1wb3J0IHsgd3JhcCwgZXhwb3NlLCB0eXBlIFJlbW90ZSB9IGZyb20gJ2NvbWxpbmsnOwppbXBvcnQgdHlwZSB7IExvY2FsU3RvcmFnZUFQSSB9IGZyb20gJy4vZGItd29ya2VyJzsKaW1wb3J0IHsgdG9SZWZlcmVuY2UsIGJ1aWxkZXIgfSBmcm9tICcuL2ZsZXhidWlsZGVyJzsKCgppbnRlcmZhY2UgU2hhcmVkV29ya2VyR2xvYmFsU2NvcGUgZXh0ZW5kcyBXb3JrZXIgewoJb25jb25uZWN0OiAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4gdm9pZDsKfQpkZWNsYXJlIGNvbnN0IHNlbGY6IFNoYXJlZFdvcmtlckdsb2JhbFNjb3BlOwoKCmxldCB3czogV2ViU29ja2V0IHwgbnVsbCA9IG51bGw7CmxldCBvbk1lc3NhZ2VDYWxsYmFjazogKChkYXRhOiBhbnkpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7CgoKLy8gLS0tIFdlYlNvY2tldCBBUEkgLS0tCmNvbnN0IHdzSW5zdGFuY2VBUEkgPSB7Cglhc3luYyBjb25uZWN0KHVybDogc3RyaW5nKSB7CgkJaWYgKHdzKSByZXR1cm47CgoJCXdzID0gbmV3IFdlYlNvY2tldCh1cmwpOwoJCXdzLmJpbmFyeVR5cGUgPSAnYXJyYXlidWZmZXInOwoKCQl3cy5vbm9wZW4gPSAoKSA9PiBjb25zb2xlLmxvZygnW1dTXSBDb25uZWN0ZWQ6JywgdXJsKTsKCiAgICAgICAgd3Mub25tZXNzYWdlID0gKGUpID0+IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbV1NdIFJlY2VpdmVkIGJpbmFyeSBtZXNzYWdlJyk7CgkJCQkKCQkJCWlmIChlLmRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgewoJCQkJCW9uTWVzc2FnZUNhbGxiYWNrPy4oZS5kYXRhKTsgICAKCQkJCX0KICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbV1NdIEZhaWxlZCB0byBmb3J3YXJkIG1lc3NhZ2UnLCBlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKIAoKCQl3cy5vbmVycm9yID0gKGUpID0+IGNvbnNvbGUuZXJyb3IoJ1tXU10gRXJyb3I6JywgZSk7CgkJd3Mub25jbG9zZSA9ICgpID0+IHsKCQkJY29uc29sZS5sb2coJ1tXU10gRGlzY29ubmVjdGVkJyk7CgkJCXdzID0gbnVsbDsKCQl9OwoJfSwKCglhc3luYyBzZW5kKHBheWxvYWQ6IFVpbnQ4QXJyYXkpIHsKCQlpZiAod3M/LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7CgkJCXdzLnNlbmQocGF5bG9hZCk7CgkJfSBlbHNlIHsKCQkJY29uc29sZS53YXJuKCdbV1NdIFRyaWVkIHRvIHNlbmQgd2hpbGUgZGlzY29ubmVjdGVkJyk7CgkJfQoJfSwKCglhc3luYyBjbG9zZSgpIHsKCQl3cz8uY2xvc2UoKTsKCQl3cyA9IG51bGw7Cgl9LAoKCW9uTWVzc2FnZShjYWxsYmFjazogKGRhdGE6IGFueSkgPT4gdm9pZCkgewoJCW9uTWVzc2FnZUNhbGxiYWNrID0gY2FsbGJhY2s7Cgl9LAoKCn07CgpleHBvcnQgdHlwZSBXU0luc3RhbmNlID0gdHlwZW9mIHdzSW5zdGFuY2VBUEk7CgpzZWxmLm9uY29ubmVjdCA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7Cgljb25zdCBwb3J0ID0gZXZlbnQucG9ydHNbMF07Cglwb3J0LnN0YXJ0KCk7CglleHBvc2Uod3NJbnN0YW5jZUFQSSwgcG9ydCk7Cn07Cgo=", import.meta.url)
57
- }, V = {
58
- canvasWorker: new URL("data:video/mp2t;base64,aW1wb3J0IHsgZXhwb3NlIH0gZnJvbSAnY29tbGluayc7CgpleHBvcnQgaW50ZXJmYWNlIENhbnZhc1dvcmtlckFQSSB7CgliaW5kQ2FudmFzKHBhbmVsSWQ6IHN0cmluZywgY2FudmFzOiBPZmZzY3JlZW5DYW52YXMsIG1vZGU/OiBDYW52YXNEcmF3TW9kZSk6IFByb21pc2U8dm9pZD47Cgl1bmJpbmRDYW52YXMocGFuZWxJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjsKfQoKaW50ZXJmYWNlIENhbnZhc0JpbmRpbmcgewoJY3R4OiBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7CgljYW52YXM6IE9mZnNjcmVlbkNhbnZhczsKCXBhbmVsSWQ6IHN0cmluZzsKCW1vZGU/OiBDYW52YXNEcmF3TW9kZTsKCWFuaW1hdGlvbkZyYW1lPzogbnVtYmVyOwp9CgpleHBvcnQgdHlwZSBDYW52YXNEcmF3TW9kZSA9ICdzdGF0aWMnIHwgJ2FuaW1hdGVkJyB8ICdkeW5hbWljJzsKCmNvbnN0IENhbnZhc01hbmFnZXIgPSB7CgliaW5kaW5nczogbmV3IE1hcDxzdHJpbmcsIENhbnZhc0JpbmRpbmc+KCksCgoJYXN5bmMgYmluZENhbnZhcyhwYW5lbElkOiBzdHJpbmcsIGNhbnZhczogT2Zmc2NyZWVuQ2FudmFzLCBtb2RlOiBDYW52YXNEcmF3TW9kZSA9ICdhbmltYXRlZCcpIHsKCQljb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKCgkJaWYgKCFjdHgpIHsKCQkJY29uc29sZS5lcnJvcihgW0NhbnZhc1dvcmtlcl0gRmFpbGVkIHRvIGdldCAyRCBjb250ZXh0IGZvciBwYW5lbCAke3BhbmVsSWR9YCk7CgkJCXJldHVybjsKCQl9CgoJCWNvbnNvbGUubG9nKGBbQ2FudmFzV29ya2VyXSBTdWNjZXNzZnVsbHkgYm91bmQgY2FudmFzIGZvciBwYW5lbCAke3BhbmVsSWR9IHdpdGggbW9kZSAke21vZGV9YCk7CgoJCXRoaXMuYmluZGluZ3Muc2V0KHBhbmVsSWQsIHsgY3R4LCBjYW52YXMsIHBhbmVsSWQsIG1vZGUgfSk7CgoJCXRoaXMuc3RhcnRBbmltYXRpb24ocGFuZWxJZCk7Cgl9LAoKCXN0YXJ0QW5pbWF0aW9uKHBhbmVsSWQ6IHN0cmluZykgewoJCWNvbnN0IGJpbmRpbmcgPSB0aGlzLmJpbmRpbmdzLmdldChwYW5lbElkKTsKCQlpZiAoIWJpbmRpbmcpIHJldHVybjsKCgkJc3dpdGNoIChiaW5kaW5nLm1vZGUpIHsKCQkJY2FzZSAnc3RhdGljJzoKCQkJCXRoaXMuZHJhd1N0YXRpYyhiaW5kaW5nKTsKCQkJCWJyZWFrOwoJCQljYXNlICdhbmltYXRlZCc6CgkJCQl0aGlzLmRyYXdBbmltYXRlZChiaW5kaW5nKTsKCQkJCWJyZWFrOwoJCQljYXNlICdkeW5hbWljJzoKCQkJCXRoaXMuZHJhd0R5bmFtaWMoYmluZGluZyk7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWNvbnNvbGUud2FybihgW0NhbnZhc1dvcmtlcl0gVW5rbm93biBkcmF3IG1vZGUgZm9yIHBhbmVsICR7cGFuZWxJZH1gKTsKCQl9Cgl9LAoKCWRyYXdTdGF0aWMoYmluZGluZzogQ2FudmFzQmluZGluZykgewoJCWJpbmRpbmcuY3R4LmZpbGxTdHlsZSA9ICdncmF5JzsKCQliaW5kaW5nLmN0eC5maWxsUmVjdCgwLCAwLCBiaW5kaW5nLmNhbnZhcy53aWR0aCwgYmluZGluZy5jYW52YXMuaGVpZ2h0KTsKCX0sCgoJZHJhd0FuaW1hdGVkKGJpbmRpbmc6IENhbnZhc0JpbmRpbmcpIHsKCQlsZXQgaHVlID0gMDsKCgkJY29uc3QgZHJhd0ZyYW1lID0gKCkgPT4gewoJCQlodWUgPSAoaHVlICsgMSkgJSAzNjA7CgkJCWJpbmRpbmcuY3R4LmZpbGxTdHlsZSA9IGBoc2woJHtodWV9LCAxMDAlLCA1MCUpYDsKCQkJYmluZGluZy5jdHguZmlsbFJlY3QoMCwgMCwgYmluZGluZy5jYW52YXMud2lkdGgsIGJpbmRpbmcuY2FudmFzLmhlaWdodCk7CgoJCQliaW5kaW5nLmFuaW1hdGlvbkZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRyYXdGcmFtZSk7CgkJfTsKCgkJZHJhd0ZyYW1lKCk7Cgl9LAoKCWRyYXdEeW5hbWljKGJpbmRpbmc6IENhbnZhc0JpbmRpbmcpIHsKCQlsZXQgdGltZSA9IDA7CgoJCWNvbnN0IGRyYXdGcmFtZSA9ICgpID0+IHsKCQkJdGltZSArPSAwLjA1OwoJCQliaW5kaW5nLmN0eC5jbGVhclJlY3QoMCwgMCwgYmluZGluZy5jYW52YXMud2lkdGgsIGJpbmRpbmcuY2FudmFzLmhlaWdodCk7CgkJCWJpbmRpbmcuY3R4LmJlZ2luUGF0aCgpOwoJCQliaW5kaW5nLmN0eC5hcmMoCgkJCQliaW5kaW5nLmNhbnZhcy53aWR0aCAvIDIgKyBNYXRoLnNpbih0aW1lKSAqIDUwLAoJCQkJYmluZGluZy5jYW52YXMuaGVpZ2h0IC8gMiArIE1hdGguY29zKHRpbWUpICogNTAsCgkJCQkzMCwKCQkJCTAsCgkJCQlNYXRoLlBJICogMgoJCQkpOwoJCQliaW5kaW5nLmN0eC5maWxsU3R5bGUgPSAnb3JhbmdlJzsKCQkJYmluZGluZy5jdHguZmlsbCgpOwoJCgkJCWJpbmRpbmcuYW5pbWF0aW9uRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZHJhd0ZyYW1lKTsKCQl9OwoKCQlkcmF3RnJhbWUoKTsKCX0sCgoJYXN5bmMgdW5iaW5kQ2FudmFzKHBhbmVsSWQ6IHN0cmluZykgewoJCWNvbnN0IGJpbmRpbmcgPSB0aGlzLmJpbmRpbmdzLmdldChwYW5lbElkKTsKCQlpZiAoYmluZGluZz8uYW5pbWF0aW9uRnJhbWUpIHsKCQkJY2FuY2VsQW5pbWF0aW9uRnJhbWUoYmluZGluZy5hbmltYXRpb25GcmFtZSk7CgkJfQoJCXRoaXMuYmluZGluZ3MuZGVsZXRlKHBhbmVsSWQpOwoJCWNvbnNvbGUubG9nKGBbQ2FudmFzV29ya2VyXSBVbmJvdW5kIGNhbnZhcyBmb3IgcGFuZWwgJHtwYW5lbElkfWApOwoJfSwKfTsKCmV4cG9zZShDYW52YXNNYW5hZ2VyKTsK", import.meta.url).toString(),
59
- dbWorker: new URL("data:video/mp2t;base64,aW1wb3J0IHsgZXhwb3NlIH0gZnJvbSAnY29tbGluayc7CmltcG9ydCBEZXhpZSwgeyB0eXBlIFRhYmxlIH0gZnJvbSAnZGV4aWUnOwppbXBvcnQgdHlwZSB7IERpc2NvcmRTZXJ2ZXIsIERpc2NvcmRUYWcsIFByb2ZpbGUgfSBmcm9tICcuLi90eXBlcy9kaXNjb3JkJzsKaW1wb3J0IHsgdG9SZWZlcmVuY2UgfSBmcm9tICcuL2ZsZXhidWlsZGVyJzsKCmludGVyZmFjZSBTaGFyZWRXb3JrZXJHbG9iYWxTY29wZSBleHRlbmRzIFdvcmtlciB7CglvbmNvbm5lY3Q6IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB2b2lkOwp9CmRlY2xhcmUgY29uc3Qgc2VsZjogU2hhcmVkV29ya2VyR2xvYmFsU2NvcGU7CgpjbGFzcyBBcHBEZXhpZSBleHRlbmRzIERleGllIHsKCXNldHRpbmdzITogVGFibGU8eyBpZDogc3RyaW5nOyB2YWx1ZTogYW55IH0sIHN0cmluZz47CgltZXRhITogVGFibGU8eyBrZXk6IHN0cmluZzsgdmFsdWU6IGFueSB9LCBzdHJpbmc+OwoJaTE4biE6IFRhYmxlPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSwgc3RyaW5nPjsKCWh0bWxzZXJ2ZXJzITogVGFibGU8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9LCBzdHJpbmc+OwoJc2VydmVycyE6IFRhYmxlPERpc2NvcmRTZXJ2ZXIsIHN0cmluZz47Cgl0YWdzITogVGFibGU8RGlzY29yZFRhZywgc3RyaW5nPjsKCXByb2ZpbGVzITogVGFibGU8UHJvZmlsZSwgc3RyaW5nPjsKCXdzX21lc3NhZ2VzITogVGFibGU8eyBrZXk6IHN0cmluZzsgbWVzc2FnZTogYW55IH0sIHN0cmluZz47CgoJY29uc3RydWN0b3IoKSB7CgkJc3VwZXIoJ0FwcFN0b3JhZ2UnKTsKCQl0aGlzLnZlcnNpb24oMykuc3RvcmVzKHsKCQkJc2V0dGluZ3M6ICcmaWQnLAoJCQltZXRhOiAnJmtleScsCgkJCWkxOG46ICcma2V5JywKCQkJaHRtbHNlcnZlcnM6ICcma2V5JywKCQkJc2VydmVyczogJyZzZXJ2ZXJfaWQnLAoJCQl0YWdzOiAnJnRhZ19pZCcsCgkJCXByb2ZpbGVzOiAnJnByb2ZpbGVfaWQnLAoJCQl3c19tZXNzYWdlczogJyZrZXknLAoJCX0pOwoJfQp9CmNvbnN0IGRiID0gbmV3IEFwcERleGllKCk7CgpmdW5jdGlvbiBkZWxheShtczogbnVtYmVyKSB7CglyZXR1cm4gbmV3IFByb21pc2UoKHJlcykgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7Cn0KCmZ1bmN0aW9uIHJlbmRlckh0bWxGb3JTZXJ2ZXIoc2VydmVyOiBEaXNjb3JkU2VydmVyKTogc3RyaW5nIHsKCXJldHVybiBgCgkJPGRpdiBjbGFzcz0iZmxleCBmbGV4LWNvbCBnYXAtMiBwLTIiPgoJCQk8aW1nIHNyYz0iJHtzZXJ2ZXIubG9nb30iIGFsdD0iJHtzZXJ2ZXIubmFtZX0iIGNsYXNzPSJ3LTEyIGgtMTIgcm91bmRlZC1mdWxsIiAvPgoJCQk8aDMgY2xhc3M9InRleHQtbGcgZm9udC1ib2xkIj4ke3NlcnZlci5uYW1lfTwvaDM+CgkJCTxwIGNsYXNzPSJ0ZXh0LXNtIG9wYWNpdHktNzAiPiR7c2VydmVyLnN1bW1hcnl9PC9wPgoJCQk8YSBocmVmPSIke3NlcnZlci5pbnZpdGV9IiBjbGFzcz0idGV4dC1wdXJwbGUtNDAwIHVuZGVybGluZSB0ZXh0LXhzIj5Kb2luIEpvaW4gSm9pbjwvYT4KCQk8L2Rpdj4KCWAudHJpbSgpOwp9CgovLyAtLS0gQ29tbGluay1TYWZlIEFQSSAtLS0KY29uc3Qgc3RvcmFnZUFQSSA9IHsKCgkvLyBXZWJTb2NrZXQKCglhc3luYyBzdG9yZVdzTWVzc2FnZShrZXk6IHN0cmluZywgYnVmZmVyOiBBcnJheUJ1ZmZlcikgewoJCWNvbnN0IGRlY29kZWQgPSB0b1JlZmVyZW5jZShidWZmZXIpLnRvT2JqZWN0KCk7CgkJYXdhaXQgZGIud3NfbWVzc2FnZXMucHV0KHsga2V5LCBtZXNzYWdlOiBkZWNvZGVkIH0pOwoJfSwKCglhc3luYyBnZXRXc01lc3NhZ2Uoa2V5OiBzdHJpbmcpIHsKCQlyZXR1cm4gKGF3YWl0IGRiLndzX21lc3NhZ2VzLmdldChrZXkpKT8ubWVzc2FnZSA/PyBudWxsOwoJfSwKCQoJYXN5bmMgZ2V0QWxsV3NNZXNzYWdlcygpOiBQcm9taXNlPHsga2V5OiBzdHJpbmc7IG1lc3NhZ2U6IGFueSB9W10+IHsKCQljb25zdCByYXcgPSBhd2FpdCBkYi53c19tZXNzYWdlcy50b0FycmF5KCk7CgkJcmV0dXJuIHJhdy5zb3J0KChhLCBiKSA9PiB7CgkJCWNvbnN0IGF0ID0gTnVtYmVyKGEua2V5LnNwbGl0KCc6JylbMV0pOwoJCQljb25zdCBidCA9IE51bWJlcihiLmtleS5zcGxpdCgnOicpWzFdKTsKCQkJcmV0dXJuIGJ0IC0gYXQ7CgkJfSk7Cgl9LAoJCglhc3luYyBjbGVhcldzTWVzc2FnZXMoKSB7CgkJYXdhaXQgZGIud3NfbWVzc2FnZXMuY2xlYXIoKTsKCX0sCgoJLy8gSTE4bgoJYXN5bmMgZ2V0VHJhbnNsYXRpb24oa2V5OiBzdHJpbmcpIHsKCQlyZXR1cm4gKGF3YWl0IGRiLmkxOG4uZ2V0KGtleSkpPy52YWx1ZSA/PyBudWxsOwoJfSwKCWFzeW5jIGdldFRyYW5zbGF0aW9ucyhrZXlzOiBzdHJpbmdbXSkgewoJCWNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9OwoJCWZvciAoY29uc3Qga2V5IG9mIGtleXMpIHsKCQkJY29uc3QgdmFsID0gYXdhaXQgZGIuaTE4bi5nZXQoa2V5KTsKCQkJaWYgKHZhbCkgcmVzdWx0W2tleV0gPSB2YWwudmFsdWU7CgkJfQoJCXJldHVybiByZXN1bHQ7Cgl9LAoJYXN5bmMgcHV0STE4bkJhdGNoKGRhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHsKCQljb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZGF0YSkubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7CgkJCWtleSwKCQkJdmFsdWUsCgkJfSkpOwoJCWF3YWl0IGRiLmkxOG4uYnVsa1B1dChlbnRyaWVzKTsKCX0sCglhc3luYyBsb2FkSTE4bkZyb21KU09OKHBhdGggPSAnaHR0cHM6Ly9kaXNjb3JkLnNoL2kxOG4vZGIuanNvbicpIHsKCWNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHBhdGgpOwoJY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7Cglhd2FpdCBzdG9yYWdlQVBJLnB1dEkxOG5CYXRjaChkYXRhKTsKCX0sCglhc3luYyBnZXRBbGxJMThuS2V5cygpOiBQcm9taXNlPHN0cmluZ1tdPiB7CgkJY29uc3QgYWxsID0gYXdhaXQgZGIuaTE4bi50b0NvbGxlY3Rpb24oKS5wcmltYXJ5S2V5cygpOwoJCXJldHVybiBhbGwgYXMgc3RyaW5nW107Cgl9LAoKCWFzeW5jIGxvYWRTZXJ2ZXJzRnJvbUpTT04ocGF0aCA9ICdodHRwczovL2Rpc2NvcmQuc2gvZGF0YS9zZXJ2ZXJzLmpzb24nKSB7CgkJY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gocGF0aCk7CgkJY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CgkKCQkvLyBUaGUgSlNPTiBzaG91bGQgYmUgYSBSZWNvcmQ8c3RyaW5nLCBEaXNjb3JkU2VydmVyPgoJCWNvbnN0IHNlcnZlcnM6IERpc2NvcmRTZXJ2ZXJbXSA9IE9iamVjdC52YWx1ZXMoZGF0YSk7CgkJYXdhaXQgc3RvcmFnZUFQSS5wdXRTZXJ2ZXJzKHNlcnZlcnMpOwoJCWF3YWl0IHN0b3JhZ2VBUEkuc3luY0h0bWxGcm9tU2VydmVycygpOwoJfSwKCgkvLyBIVE1MIFByZVJlbmRlcgoJYXN5bmMgc3luY0h0bWxGcm9tU2VydmVycygpIHsKCQljb25zdCBhbGxTZXJ2ZXJzID0gYXdhaXQgZGIuc2VydmVycy50b0FycmF5KCk7CgkJY29uc3QgZXhpc3RpbmdIdG1sS2V5cyA9IGF3YWl0IGRiLmh0bWxzZXJ2ZXJzLnRvQ29sbGVjdGlvbigpLnByaW1hcnlLZXlzKCk7CgkJY29uc3QgbWlzc2luZzogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTsKCQoJCWZvciAoY29uc3Qgc2VydmVyIG9mIGFsbFNlcnZlcnMpIHsKCQkJaWYgKCFleGlzdGluZ0h0bWxLZXlzLmluY2x1ZGVzKHNlcnZlci5zZXJ2ZXJfaWQpKSB7CgkJCQljb25zdCBodG1sID0gcmVuZGVySHRtbEZvclNlcnZlcihzZXJ2ZXIpOwoJCQkJbWlzc2luZy5wdXNoKHsga2V5OiBzZXJ2ZXIuc2VydmVyX2lkLCB2YWx1ZTogaHRtbCB9KTsKCQkJfQoJCX0KCQoJCWlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHsKCQkJYXdhaXQgZGIuaHRtbHNlcnZlcnMuYnVsa1B1dChtaXNzaW5nKTsKCQkJY29uc29sZS5pbmZvKGBbc3luY0h0bWxGcm9tU2VydmVyc10gR2VuZXJhdGVkICR7bWlzc2luZy5sZW5ndGh9IEhUTUwgY2FyZHMuYCk7CgkJfSBlbHNlIHsKCQkJY29uc29sZS5pbmZvKCdbc3luY0h0bWxGcm9tU2VydmVyc10gQWxsIHNlcnZlcnMgYWxyZWFkeSBoYXZlIEhUTUwgY2FyZHMuJyk7CgkJfQoJfSwKCgkvLyBTZXR0aW5ncwoJYXN5bmMgZGJTZXQoaWQ6IHN0cmluZywgdmFsdWU6IGFueSkgewoJCWF3YWl0IGRiLnNldHRpbmdzLnB1dCh7IGlkLCB2YWx1ZSB9KTsKCX0sCglhc3luYyBkYkdldChpZDogc3RyaW5nKSB7CgkJcmV0dXJuIChhd2FpdCBkYi5zZXR0aW5ncy5nZXQoaWQpKT8udmFsdWUgPz8gbnVsbDsKCX0sCglhc3luYyBkYkNsZWFyKCkgewoJCWF3YWl0IGRiLnNldHRpbmdzLmNsZWFyKCk7Cgl9LAoKCS8vIE1ldGEKCWFzeW5jIHNldFZlcnNpb24odmVyc2lvbjogc3RyaW5nKSB7CgkJYXdhaXQgZGIubWV0YS5wdXQoeyBrZXk6ICd2ZXJzaW9uJywgdmFsdWU6IHZlcnNpb24gfSk7Cgl9LAoJYXN5bmMgZ2V0VmVyc2lvbigpIHsKCQlyZXR1cm4gKGF3YWl0IGRiLm1ldGEuZ2V0KCd2ZXJzaW9uJykpPy52YWx1ZSA/PyBudWxsOwoJfSwKCWFzeW5jIG1hcmtTZWVkZWQoKSB7CgkJYXdhaXQgZGIubWV0YS5wdXQoeyBrZXk6ICdkYl9zZWVkZWQnLCB2YWx1ZTogdHJ1ZSB9KTsKCX0sCglhc3luYyBjaGVja1NlZWRlZCgpIHsKCQlyZXR1cm4gKGF3YWl0IGRiLm1ldGEuZ2V0KCdkYl9zZWVkZWQnKSk/LnZhbHVlID09PSB0cnVlOwoJfSwKCgkvLyBTZXJ2ZXJzCglhc3luYyBwdXRTZXJ2ZXJzKHNlcnZlcnM6IERpc2NvcmRTZXJ2ZXJbXSkgewoJCWF3YWl0IGRiLnNlcnZlcnMuYnVsa1B1dChzZXJ2ZXJzKTsKCX0sCglhc3luYyBnZXRBbGxTZXJ2ZXJzKCkgewoJCXJldHVybiBhd2FpdCBkYi5zZXJ2ZXJzLnRvQXJyYXkoKTsKCX0sCgoJLy8gSFRNTCBzZXJ2ZXJzCglhc3luYyBwdXRIdG1sQ2FyZHMoZGF0YTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pIHsKCQlhd2FpdCBkYi5odG1sc2VydmVycy5idWxrUHV0KGRhdGEpOwoJfSwKCWFzeW5jIGdldEh0bWxDYXJkKGtleTogc3RyaW5nKSB7CgkJcmV0dXJuIChhd2FpdCBkYi5odG1sc2VydmVycy5nZXQoa2V5KSk/LnZhbHVlID8/IG51bGw7Cgl9LAoKCS8vIFRhZ3MKCWFzeW5jIHB1dFRhZ3ModGFnczogRGlzY29yZFRhZ1tdKSB7CgkJYXdhaXQgZGIudGFncy5idWxrUHV0KHRhZ3MpOwoJfSwKCWFzeW5jIGdldEFsbFRhZ3MoKSB7CgkJcmV0dXJuIGF3YWl0IGRiLnRhZ3MudG9BcnJheSgpOwoJfSwKCgkvLyBQcm9maWxlcwoJYXN5bmMgcHV0UHJvZmlsZXMocHJvZmlsZXM6IFByb2ZpbGVbXSkgewoJCWF3YWl0IGRiLnByb2ZpbGVzLmJ1bGtQdXQocHJvZmlsZXMpOwoJfSwKCWFzeW5jIGdldEFsbFByb2ZpbGVzKCkgewoJCXJldHVybiBhd2FpdCBkYi5wcm9maWxlcy50b0FycmF5KCk7Cgl9LAp9OwoKZXhwb3J0IHR5cGUgTG9jYWxTdG9yYWdlQVBJID0gdHlwZW9mIHN0b3JhZ2VBUEk7CgpzZWxmLm9uY29ubmVjdCA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7Cgljb25zdCBwb3J0ID0gZXZlbnQucG9ydHNbMF07Cglwb3J0LnN0YXJ0KCk7CglleHBvc2Uoc3RvcmFnZUFQSSwgcG9ydCk7Cn07Cg==", import.meta.url).toString(),
60
- wsWorker: new URL("data:video/mp2t;base64,aW1wb3J0IHsgd3JhcCwgZXhwb3NlLCB0eXBlIFJlbW90ZSB9IGZyb20gJ2NvbWxpbmsnOwppbXBvcnQgdHlwZSB7IExvY2FsU3RvcmFnZUFQSSB9IGZyb20gJy4vZGItd29ya2VyJzsKaW1wb3J0IHsgdG9SZWZlcmVuY2UsIGJ1aWxkZXIgfSBmcm9tICcuL2ZsZXhidWlsZGVyJzsKCgppbnRlcmZhY2UgU2hhcmVkV29ya2VyR2xvYmFsU2NvcGUgZXh0ZW5kcyBXb3JrZXIgewoJb25jb25uZWN0OiAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4gdm9pZDsKfQpkZWNsYXJlIGNvbnN0IHNlbGY6IFNoYXJlZFdvcmtlckdsb2JhbFNjb3BlOwoKCmxldCB3czogV2ViU29ja2V0IHwgbnVsbCA9IG51bGw7CmxldCBvbk1lc3NhZ2VDYWxsYmFjazogKChkYXRhOiBhbnkpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7CgoKLy8gLS0tIFdlYlNvY2tldCBBUEkgLS0tCmNvbnN0IHdzSW5zdGFuY2VBUEkgPSB7Cglhc3luYyBjb25uZWN0KHVybDogc3RyaW5nKSB7CgkJaWYgKHdzKSByZXR1cm47CgoJCXdzID0gbmV3IFdlYlNvY2tldCh1cmwpOwoJCXdzLmJpbmFyeVR5cGUgPSAnYXJyYXlidWZmZXInOwoKCQl3cy5vbm9wZW4gPSAoKSA9PiBjb25zb2xlLmxvZygnW1dTXSBDb25uZWN0ZWQ6JywgdXJsKTsKCiAgICAgICAgd3Mub25tZXNzYWdlID0gKGUpID0+IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbV1NdIFJlY2VpdmVkIGJpbmFyeSBtZXNzYWdlJyk7CgkJCQkKCQkJCWlmIChlLmRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgewoJCQkJCW9uTWVzc2FnZUNhbGxiYWNrPy4oZS5kYXRhKTsgICAKCQkJCX0KICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbV1NdIEZhaWxlZCB0byBmb3J3YXJkIG1lc3NhZ2UnLCBlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKIAoKCQl3cy5vbmVycm9yID0gKGUpID0+IGNvbnNvbGUuZXJyb3IoJ1tXU10gRXJyb3I6JywgZSk7CgkJd3Mub25jbG9zZSA9ICgpID0+IHsKCQkJY29uc29sZS5sb2coJ1tXU10gRGlzY29ubmVjdGVkJyk7CgkJCXdzID0gbnVsbDsKCQl9OwoJfSwKCglhc3luYyBzZW5kKHBheWxvYWQ6IFVpbnQ4QXJyYXkpIHsKCQlpZiAod3M/LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7CgkJCXdzLnNlbmQocGF5bG9hZCk7CgkJfSBlbHNlIHsKCQkJY29uc29sZS53YXJuKCdbV1NdIFRyaWVkIHRvIHNlbmQgd2hpbGUgZGlzY29ubmVjdGVkJyk7CgkJfQoJfSwKCglhc3luYyBjbG9zZSgpIHsKCQl3cz8uY2xvc2UoKTsKCQl3cyA9IG51bGw7Cgl9LAoKCW9uTWVzc2FnZShjYWxsYmFjazogKGRhdGE6IGFueSkgPT4gdm9pZCkgewoJCW9uTWVzc2FnZUNhbGxiYWNrID0gY2FsbGJhY2s7Cgl9LAoKCn07CgpleHBvcnQgdHlwZSBXU0luc3RhbmNlID0gdHlwZW9mIHdzSW5zdGFuY2VBUEk7CgpzZWxmLm9uY29ubmVjdCA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7Cgljb25zdCBwb3J0ID0gZXZlbnQucG9ydHNbMF07Cglwb3J0LnN0YXJ0KCk7CglleHBvc2Uod3NJbnN0YW5jZUFQSSwgcG9ydCk7Cn07Cgo=", import.meta.url).toString()
1
+ import { $ as e, A as t, B as n, C as r, Ct as i, D as a, E as o, F as s, G as c, H as l, I as u, J as d, K as f, L as p, M as m, N as h, O as g, P as ee, Q as te, R as ne, S as re, St as _, T as ie, U as v, V as ae, W as oe, X as se, Y as ce, Z as le, _ as ue, _t as de, at as fe, b as pe, bt as y, c as me, ct as he, d as ge, dt as _e, et as ve, f as b, ft as ye, g as be, gt as xe, h as x, ht as S, it as Se, j as Ce, k as we, l as C, lt as w, m as Te, mt as Ee, n as De, nt as Oe, ot as T, p as ke, pt as Ae, q as je, rt as Me, s as Ne, st as E, t as Pe, tt as Fe, u as Ie, ut as Le, v as Re, vt as D, w as ze, wt as O, x as k, xt as A, y as Be, yt as j, z as Ve } from "./main.js";
2
+ //#region packages/npm/droid/src/lib/droid.ts
3
+ async function He(e) {
4
+ console.log("[DROID]: droid<T>");
5
+ let { main: t } = await import("./workers/main.js"), n = t({
6
+ workerURLs: e?.workerURLs,
7
+ workerRefs: e?.workerRefs,
8
+ i18nPath: e?.i18nPath,
9
+ dataPath: e?.dataPath
10
+ });
11
+ if (e?.initTimeout && e.initTimeout > 0) {
12
+ let t = new Promise((t, n) => setTimeout(() => n(/* @__PURE__ */ Error(`[DROID] Worker init timed out after ${e.initTimeout}ms`)), e.initTimeout));
13
+ await Promise.race([n, t]);
14
+ } else await n;
15
+ return console.log("[DROID]: droid<T> => await WorkerRefs + URLs"), { initialized: !0 };
16
+ }
17
+ //#endregion
18
+ //#region packages/npm/droid/src/lib/types/bento.ts
19
+ var M = [
20
+ "default",
21
+ "minimal",
22
+ "image-heavy"
23
+ ], Ue = [
24
+ "fade-in",
25
+ "slide-up",
26
+ "none"
27
+ ], We = [
28
+ "_self",
29
+ "_blank",
30
+ "_parent",
31
+ "_top"
32
+ ], Ge = [
33
+ "button",
34
+ "link",
35
+ "region",
36
+ "article"
37
+ ], Ke = [
38
+ "default",
39
+ "success",
40
+ "warning",
41
+ "error"
42
+ ], qe = /^[a-z]+-(100|200|300|400|500|600|700|800|900)$/, Je = y({
43
+ id: _().regex(/^01[0-9A-HJKMNP-TV-Z]{24}$/, "Invalid ULID format").optional(),
44
+ title: _().min(1, "Title is required"),
45
+ subtitle: _().optional(),
46
+ description: _().optional(),
47
+ span: _().regex(/^(?:(?:[a-z]+:)?(col|row)-span-\d+\s*)+$/, "Invalid span format (e.g., col-span-2, row-span-1)").optional(),
48
+ primaryColor: _().regex(qe, "Invalid Tailwind color format (e.g., blue-500)"),
49
+ secondaryColor: _().regex(qe, "Invalid Tailwind color format (e.g., blue-500)"),
50
+ icon: _().optional(),
51
+ backgroundImage: _().url().optional(),
52
+ onclick: _().optional(),
53
+ href: _().url().optional(),
54
+ target: S(We).optional(),
55
+ ariaLabel: _().optional(),
56
+ role: S(Ge).optional(),
57
+ variant: S(M).optional(),
58
+ animation: S(Ue).optional(),
59
+ badge: _().optional(),
60
+ badgeType: S(Ke).optional(),
61
+ priority: j().int().min(0).optional(),
62
+ tooltip: _().optional(),
63
+ disabled: D().optional(),
64
+ meta: A(_(), xe()).optional(),
65
+ dataset: A(_(), _()).optional(),
66
+ className: _().optional()
67
+ }).refine((e) => !e.href || e.href && e.target, {
68
+ message: "target is required when href is provided",
69
+ path: ["target"]
70
+ }).refine((e) => !e.badgeType || e.badge && e.badge.length > 0, {
71
+ message: "badge must be provided if badgeType is set",
72
+ path: ["badge"]
73
+ }), Ye = {
74
+ default: { base: "p-4 flex flex-col justify-between" },
75
+ minimal: {
76
+ base: "p-2 bg-opacity-30 backdrop-blur-sm",
77
+ hover: "bg-opacity-50"
78
+ },
79
+ "image-heavy": {
80
+ base: "p-0 overflow-hidden",
81
+ hover: "scale-105"
82
+ }
83
+ }, Xe = {
84
+ "fade-in": "animate-fade-in",
85
+ "slide-up": "animate-slide-up",
86
+ none: ""
87
+ }, Ze = {
88
+ default: "bg-white/30 text-white",
89
+ success: "bg-green-500/80 text-white",
90
+ warning: "bg-yellow-500/80 text-black",
91
+ error: "bg-red-500/80 text-white"
92
+ }, Qe = {
93
+ allowedScripts: [],
94
+ clearCaches: !0,
95
+ reloadOnCleanup: !1,
96
+ logPrefix: "[sw-recovery]"
97
+ };
98
+ function $e(e) {
99
+ return e.active?.scriptURL ?? e.installing?.scriptURL ?? e.waiting?.scriptURL ?? null;
100
+ }
101
+ function et(e, t) {
102
+ return !e || t.length === 0 ? !1 : t.some((t) => {
103
+ if (t === e) return !0;
104
+ try {
105
+ return new URL(e).pathname === t;
106
+ } catch {
107
+ return !1;
108
+ }
109
+ });
110
+ }
111
+ async function tt(e = {}) {
112
+ let t = {
113
+ ...Qe,
114
+ ...e
115
+ }, n = {
116
+ supported: !1,
117
+ unregistered: [],
118
+ keptScripts: [],
119
+ cachesCleared: [],
120
+ reloaded: !1
121
+ };
122
+ if (typeof navigator > "u" || !("serviceWorker" in navigator) || typeof navigator.serviceWorker?.getRegistrations != "function") return n;
123
+ n.supported = !0;
124
+ let r = [];
125
+ try {
126
+ r = await navigator.serviceWorker.getRegistrations();
127
+ } catch (e) {
128
+ return console.warn(`${t.logPrefix} getRegistrations failed:`, e), n;
129
+ }
130
+ for (let e of r) {
131
+ let r = $e(e);
132
+ if (et(r, t.allowedScripts)) {
133
+ n.keptScripts.push(r);
134
+ continue;
135
+ }
136
+ try {
137
+ await e.unregister() && n.unregistered.push(r ?? "<unknown>");
138
+ } catch (e) {
139
+ console.warn(`${t.logPrefix} unregister failed for ${r}:`, e);
140
+ }
141
+ }
142
+ if (t.clearCaches && typeof caches < "u") try {
143
+ let e = await caches.keys();
144
+ for (let r of e) try {
145
+ await caches.delete(r) && n.cachesCleared.push(r);
146
+ } catch (e) {
147
+ console.warn(`${t.logPrefix} cache delete failed for ${r}:`, e);
148
+ }
149
+ } catch (e) {
150
+ console.warn(`${t.logPrefix} caches.keys failed:`, e);
151
+ }
152
+ let i = n.unregistered.length > 0 || n.cachesCleared.length > 0;
153
+ return i && console.info(`${t.logPrefix} cleaned`, {
154
+ unregistered: n.unregistered,
155
+ kept: n.keptScripts,
156
+ caches: n.cachesCleared
157
+ }), t.reloadOnCleanup && i && typeof window < "u" && typeof window.location?.reload == "function" && (n.reloaded = !0, window.location.reload()), n;
158
+ }
159
+ //#endregion
160
+ //#region packages/npm/droid/src/lib/mod/mod-urls.ts
161
+ var nt = { bento: new URL("data:video/mp2t;base64,aW1wb3J0IHsgZXhwb3NlIH0gZnJvbSAnY29tbGluayc7CmltcG9ydCB0eXBlIHsgQmFzZU1vZEFQSSwgVmlydHVhbE5vZGUgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9tb2R1bGVzJzsKaW1wb3J0IHsKCUJlbnRvVGlsZVNjaGVtYSwKCXR5cGUgQmVudG9UaWxlLAoJQkVOVE9fQkFER0VfQ0xBU1NfTUFQLAoJQkVOVE9fQU5JTUFUSU9OX0NMQVNTX01BUCwKCUJFTlRPX1ZBUklBTlRfQ0xBU1NfTUFQLAp9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2JlbnRvJzsKCmxldCBlbWl0VG9NYWluOiAoKG1zZzogdW5rbm93bikgPT4gdm9pZCkgfCB1bmRlZmluZWQ7CgpmdW5jdGlvbiBjcmVhdGVWTm9kZUZyb21UaWxlKHRpbGU6IEJlbnRvVGlsZSk6IFZpcnR1YWxOb2RlIHsKCWNvbnN0IHZhcmlhbnQgPSB0aWxlLnZhcmlhbnQgPz8gJ2RlZmF1bHQnOwoJY29uc3QgYW5pbWF0aW9uQ2xhc3MgPSB0aWxlLmFuaW1hdGlvbgoJCT8gQkVOVE9fQU5JTUFUSU9OX0NMQVNTX01BUFt0aWxlLmFuaW1hdGlvbl0KCQk6ICcnOwoJY29uc3QgdmFyaWFudEJhc2UgPSBCRU5UT19WQVJJQU5UX0NMQVNTX01BUFt2YXJpYW50XT8uYmFzZSA/PyAnJzsKCWNvbnN0IHZhcmlhbnRIb3ZlciA9IEJFTlRPX1ZBUklBTlRfQ0xBU1NfTUFQW3ZhcmlhbnRdPy5ob3ZlciA/PyAnJzsKCgljb25zdCByb290Q2xhc3NlcyA9IFsKCQknYmVudG8taXRlbScsCgkJJ2NvbC1zcGFuLTEnLAoJCSdyb3ctc3Bhbi0xJywKCQl0aWxlLnNwYW4gPz8gJ21kOmNvbC1zcGFuLTIgbWQ6cm93LXNwYW4tMScsCgkJJ2JnLWdyYWRpZW50LXRvLWJyJywKCQl0aWxlLnByaW1hcnlDb2xvciA/IGBmcm9tLSR7dGlsZS5wcmltYXJ5Q29sb3J9YCA6ICcnLAoJCXRpbGUuc2Vjb25kYXJ5Q29sb3IgPyBgdG8tJHt0aWxlLnNlY29uZGFyeUNvbG9yfWAgOiAnJywKCQkncm91bmRlZC0yeGwgb3ZlcmZsb3ctaGlkZGVuIHNoYWRvdy0yeGwnLAoJCXZhcmlhbnRCYXNlLAoJCXZhcmlhbnRIb3ZlciA/IGBob3Zlcjoke3ZhcmlhbnRIb3Zlcn1gIDogJycsCgkJYW5pbWF0aW9uQ2xhc3MsCgkJdGlsZS5jbGFzc05hbWUgPz8gJycsCgldCgkJLmZpbHRlcihCb29sZWFuKQoJCS5qb2luKCcgJyk7CgoJY29uc3QgZGF0YXNldEF0dHJzID0gdGlsZS5kYXRhc2V0CgkJPyBPYmplY3QuZnJvbUVudHJpZXMoCgkJCQlPYmplY3QuZW50cmllcyh0aWxlLmRhdGFzZXQpLm1hcCgoW2ssIHZdKSA9PiBbYGRhdGEtJHtrfWAsIHZdKSwKCQkJKQoJCToge307CgoJY29uc3Qgd3JhcHBlcjogVmlydHVhbE5vZGUgPSB7CgkJdGFnOiB0aWxlLmhyZWYgPyAnYScgOiAnZGl2JywKCQljbGFzczogcm9vdENsYXNzZXMsCgkJYXR0cnM6IHsKCQkJLi4uKHRpbGUuaHJlZgoJCQkJPyB7IGhyZWY6IHRpbGUuaHJlZiwgdGFyZ2V0OiB0aWxlLnRhcmdldCA/PyAnX3NlbGYnIH0KCQkJCToge30pLAoJCQkuLi4odGlsZS5vbmNsaWNrID8geyBvbmNsaWNrOiB0aWxlLm9uY2xpY2sgfSA6IHt9KSwKCQkJLi4uKHRpbGUuYXJpYUxhYmVsID8geyAnYXJpYS1sYWJlbCc6IHRpbGUuYXJpYUxhYmVsIH0gOiB7fSksCgkJCS4uLih0aWxlLnJvbGUgPyB7IHJvbGU6IHRpbGUucm9sZSB9IDoge30pLAoJCQkuLi5kYXRhc2V0QXR0cnMsCgkJfSwKCQljaGlsZHJlbjogWwoJCQl0aWxlLmJhZGdlICYmIHsKCQkJCXRhZzogJ3NwYW4nLAoJCQkJY2xhc3M6IGBhYnNvbHV0ZSB0b3AtMiByaWdodC0yIHB4LTIgcHktMSB0ZXh0LXhzIHJvdW5kZWQgei0xMCAke0JFTlRPX0JBREdFX0NMQVNTX01BUFt0aWxlLmJhZGdlVHlwZSA/PyAnZGVmYXVsdCddfWAsCgkJCQljaGlsZHJlbjogW3RpbGUuYmFkZ2VdLAoJCQl9LAoJCQl7CgkJCQl0YWc6ICdkaXYnLAoJCQkJY2xhc3M6ICdwLTQgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWJldHdlZW4gaC1mdWxsJywKCQkJCWNoaWxkcmVuOiBbCgkJCQkJewoJCQkJCQl0YWc6ICdkaXYnLAoJCQkJCQljbGFzczogJ2ZsZXggaXRlbXMtY2VudGVyIGdhcC0zJywKCQkJCQkJY2hpbGRyZW46IFsKCQkJCQkJCXRpbGUuaWNvbiAmJiB7CgkJCQkJCQkJdGFnOiAnZGl2JywKCQkJCQkJCQljbGFzczogJ3RleHQtMnhsIGJnLXdoaXRlLzIwIHJvdW5kZWQtZnVsbCBwLTIgdGV4dC13aGl0ZScsCgkJCQkJCQkJY2hpbGRyZW46IFt0aWxlLmljb25dLAoJCQkJCQkJfSwKCQkJCQkJCXsKCQkJCQkJCQl0YWc6ICdoMycsCgkJCQkJCQkJY2xhc3M6ICd0ZXh0LXdoaXRlIHRleHQtbGcgZm9udC1ib2xkJywKCQkJCQkJCQljaGlsZHJlbjogW3RpbGUudGl0bGVdLAoJCQkJCQkJfSwKCQkJCQkJXS5maWx0ZXIoQm9vbGVhbikgYXMgVmlydHVhbE5vZGVbXSwKCQkJCQl9LAoJCQkJCXRpbGUuc3VidGl0bGUgJiYgewoJCQkJCQl0YWc6ICdwJywKCQkJCQkJY2xhc3M6ICd0ZXh0LXNtIHRleHQtd2hpdGUvODAgbXQtMicsCgkJCQkJCWNoaWxkcmVuOiBbdGlsZS5zdWJ0aXRsZV0sCgkJCQkJfSwKCQkJCQl0aWxlLmRlc2NyaXB0aW9uICYmIHsKCQkJCQkJdGFnOiAncCcsCgkJCQkJCWNsYXNzOiAndGV4dC14cyB0ZXh0LXdoaXRlLzYwIG10LTEnLAoJCQkJCQljaGlsZHJlbjogW3RpbGUuZGVzY3JpcHRpb25dLAoJCQkJCX0sCgkJCQldLmZpbHRlcihCb29sZWFuKSBhcyBWaXJ0dWFsTm9kZVtdLAoJCQl9LAoJCV0uZmlsdGVyKEJvb2xlYW4pIGFzIFZpcnR1YWxOb2RlW10sCgl9OwoKCXJldHVybiB3cmFwcGVyOwp9Cgpjb25zdCBhcGk6IEJhc2VNb2RBUEkgPSB7Cglhc3luYyBnZXRNZXRhKCkgewoJCXJldHVybiB7CgkJCW5hbWU6ICdiZW50bycsCgkJCXZlcnNpb246ICcwLjEuMCcsCgkJfTsKCX0sCgoJYXN5bmMgaW5pdChjb250ZXh0KSB7CgkJZW1pdFRvTWFpbiA9IGNvbnRleHQ/LmVtaXRGcm9tV29ya2VyOwoJfSwKCglhc3luYyBydW4oZGF0YTogdW5rbm93bikgewoJCWlmICghZW1pdFRvTWFpbikgewoJCQljb25zb2xlLndhcm4oJ1ttb2QtYmVudG9dIGVtaXRGcm9tV29ya2VyIG5vdCBkZWZpbmVkJyk7CgkJCXJldHVybjsKCQl9CgoJCXRyeSB7CgkJCWNvbnN0IHRpbGUgPSBCZW50b1RpbGVTY2hlbWEucGFyc2UoZGF0YSk7CgkJCWNvbnN0IHZub2RlID0gY3JlYXRlVk5vZGVGcm9tVGlsZSh0aWxlKTsKCQkJZW1pdFRvTWFpbih7IHR5cGU6ICdpbmplY3RWTm9kZScsIHZub2RlIH0pOwoJCX0gY2F0Y2ggKGVycikgewoJCQljb25zb2xlLmVycm9yKCdbbW9kLWJlbnRvXSBJbnZhbGlkIEJlbnRvVGlsZSBkYXRhOicsIGVycik7CgkJfQoJfSwKfTsKCmV4cG9zZShhcGkpOwo=", "" + import.meta.url).href }, N = /* @__PURE__ */ O("/"), rt = !1;
162
+ function it(e) {
163
+ rt || (rt = !0, e && N.set(e), !(typeof window > "u") && (N.set(window.location.pathname), document.addEventListener("astro:page-load", () => {
164
+ N.set(window.location.pathname);
165
+ }), window.addEventListener("popstate", () => {
166
+ N.set(window.location.pathname);
167
+ })));
168
+ }
169
+ //#endregion
170
+ //#region packages/npm/droid/src/lib/state/bento.ts
171
+ var at = 24, ot = 1, P = /* @__PURE__ */ O(null), F = /* @__PURE__ */ O([]);
172
+ function st(e) {
173
+ let t = F.get().filter((t) => t.id !== e.id);
174
+ F.set([...t, e].slice(-at)), P.set(e);
175
+ }
176
+ function ct(e) {
177
+ let t = {
178
+ id: ot++,
179
+ word: e,
180
+ stage: "shipped",
181
+ at: Date.now()
182
+ };
183
+ return st(t), t;
184
+ }
185
+ function lt(e, t) {
186
+ let n = F.get().find((t) => t.id === e);
187
+ if (!n || n.stage === t) return null;
188
+ let r = {
189
+ ...n,
190
+ stage: t,
191
+ at: Date.now()
192
+ };
193
+ return st(r), r;
194
+ }
195
+ function ut() {
196
+ ot = 1, P.set(null), F.set([]);
197
+ }
198
+ //#endregion
199
+ //#region packages/npm/droid/src/lib/state/profile.ts
200
+ var dt = "cache:profile:me", ft = "sb-auth-token", I = 300 * 1e3, pt = "https://kbve.com", L = i(dt, null, {
201
+ encode: (e) => JSON.stringify(e),
202
+ decode: (e) => {
203
+ if (!e || e === "null") return null;
204
+ try {
205
+ return JSON.parse(e);
206
+ } catch {
207
+ return null;
208
+ }
209
+ }
210
+ });
211
+ function mt(e) {
212
+ let t = L.get();
213
+ return !t || t.user_id !== e || Date.now() - t.cached_at > 3e5 ? null : t.profile;
214
+ }
215
+ function R(e) {
216
+ e.user_id && L.set({
217
+ profile: e,
218
+ cached_at: Date.now(),
219
+ user_id: e.user_id
220
+ });
221
+ }
222
+ function ht() {
223
+ L.set(null);
224
+ }
225
+ function gt() {
226
+ if (typeof localStorage > "u") return null;
227
+ let e = localStorage.getItem(ft);
228
+ if (!e) return null;
229
+ try {
230
+ let t = JSON.parse(e);
231
+ return !t || typeof t != "object" ? null : t.currentSession && typeof t.currentSession == "object" && "access_token" in t.currentSession ? t.currentSession : "access_token" in t ? t : null;
232
+ } catch {
233
+ return null;
234
+ }
235
+ }
236
+ async function z(e) {
237
+ let t = e.apiBase ?? "https://kbve.com", n = await fetch(`${t}/api/v1/profile/me`, {
238
+ method: "GET",
239
+ headers: {
240
+ Authorization: `Bearer ${e.token}`,
241
+ Accept: "application/json"
242
+ },
243
+ signal: e.signal
244
+ });
245
+ if (!n.ok) return null;
246
+ try {
247
+ let e = await n.json();
248
+ return !e || !e.user_id ? null : e;
249
+ } catch {
250
+ return null;
251
+ }
252
+ }
253
+ async function _t(e) {
254
+ let t = await z(e);
255
+ return t && R(t), t;
256
+ }
257
+ function vt() {
258
+ let e = gt();
259
+ if (!e?.user?.id || !e.access_token) return null;
260
+ let t = L.get();
261
+ return !t || t.user_id !== e.user.id ? null : {
262
+ session: e,
263
+ profile: t.profile,
264
+ stale: Date.now() - t.cached_at > I
265
+ };
266
+ }
267
+ //#endregion
268
+ //#region packages/npm/droid/src/lib/state/staff.ts
269
+ var yt = "cache:staff:perms", bt = "https://supabase.kbve.com", xt = 600 * 1e3, B = i(yt, null, {
270
+ encode: (e) => JSON.stringify(e),
271
+ decode: (e) => {
272
+ if (!e || e === "null") return null;
273
+ try {
274
+ return JSON.parse(e);
275
+ } catch {
276
+ return null;
277
+ }
278
+ }
279
+ });
280
+ function St(e) {
281
+ let t = B.get();
282
+ return !t || t.user_id !== e || Date.now() - t.cached_at > 6e5 ? null : t.bitmask;
283
+ }
284
+ function V(e, t) {
285
+ e && B.set({
286
+ bitmask: t,
287
+ cached_at: Date.now(),
288
+ user_id: e
289
+ });
290
+ }
291
+ function Ct() {
292
+ B.set(null);
293
+ }
294
+ async function H(e) {
295
+ let t = e.supabaseUrl ?? bt, n = await fetch(`${t}/rest/v1/rpc/staff_permissions`, {
296
+ method: "POST",
297
+ headers: {
298
+ Authorization: `Bearer ${e.token}`,
299
+ "Content-Type": "application/json",
300
+ apikey: e.apikey
301
+ },
302
+ body: "{}",
303
+ signal: e.signal
304
+ });
305
+ if (!n.ok) return null;
306
+ try {
307
+ let e = await n.json();
308
+ return typeof e == "number" ? e : null;
309
+ } catch {
310
+ return null;
311
+ }
312
+ }
313
+ async function wt(e) {
314
+ let t = await H(e);
315
+ return t === null ? null : (V(e.userId, t), t);
316
+ }
317
+ function Tt(e) {
318
+ let t = St(e);
319
+ if (t === null) return null;
320
+ if (t > 0) {
321
+ let t = C.get();
322
+ t.tone === "auth" && t.id === e && x({ flags: b.STAFF });
323
+ }
324
+ return t;
325
+ }
326
+ function Et(e) {
327
+ return {
328
+ cachedBitmask: Tt(e.userId),
329
+ refresh: wt(e).then((t) => {
330
+ if (t !== null && t > 0) {
331
+ let t = C.get();
332
+ t.tone === "auth" && t.id === e.userId && x({ flags: b.STAFF });
333
+ }
334
+ return t;
335
+ }).catch(() => null)
336
+ };
337
+ }
338
+ //#endregion
339
+ //#region packages/npm/droid/src/lib/state/sync-bus.ts
340
+ var Dt = "kbve-droid-sync", U = null, W = !1;
341
+ function G() {
342
+ if (typeof BroadcastChannel > "u") return null;
343
+ if (!U) try {
344
+ U = new BroadcastChannel(Dt);
345
+ } catch {
346
+ U = null;
347
+ }
348
+ return U;
349
+ }
350
+ var Ot = () => {};
351
+ function kt() {
352
+ if (W) return Ot;
353
+ let e = G();
354
+ if (!e) return Ot;
355
+ W = !0;
356
+ let t = (e) => {
357
+ let t = e.data;
358
+ if (!(!t || typeof t != "object")) switch (t.type) {
359
+ case "profile-refresh":
360
+ t.profile?.user_id && R(t.profile);
361
+ break;
362
+ case "profile-clear":
363
+ ht();
364
+ break;
365
+ case "staff-refresh":
366
+ t.user_id && typeof t.bitmask == "number" && V(t.user_id, t.bitmask);
367
+ break;
368
+ case "staff-clear":
369
+ Ct();
370
+ break;
371
+ }
372
+ };
373
+ return e.addEventListener("message", t), () => {
374
+ e.removeEventListener("message", t), W = !1;
375
+ };
376
+ }
377
+ function At(e) {
378
+ e?.user_id && G()?.postMessage({
379
+ type: "profile-refresh",
380
+ profile: e
381
+ });
382
+ }
383
+ function jt() {
384
+ G()?.postMessage({ type: "profile-clear" });
385
+ }
386
+ function Mt(e, t) {
387
+ e && G()?.postMessage({
388
+ type: "staff-refresh",
389
+ user_id: e,
390
+ bitmask: t
391
+ });
392
+ }
393
+ function Nt() {
394
+ G()?.postMessage({ type: "staff-clear" });
395
+ }
396
+ //#endregion
397
+ //#region packages/npm/droid/src/lib/state/profile-sync.ts
398
+ var Pt = 900 * 1e3, Ft = 250, K = null;
399
+ async function q(e) {
400
+ return e.inflight ||= (async () => {
401
+ try {
402
+ let t = It(), n = t?.user?.id, r = t?.access_token;
403
+ if (!n || !r) return;
404
+ let i = z({
405
+ token: r,
406
+ apiBase: e.apiBase
407
+ }), a = H({
408
+ token: r,
409
+ apikey: e.supabaseAnonKey,
410
+ supabaseUrl: e.supabaseUrl
411
+ }), [o, s] = await Promise.all([i.catch(() => null), a.catch(() => null)]);
412
+ o && o.user_id && (R(o), At(o)), typeof s == "number" && (V(n, s), Mt(n, s));
413
+ } finally {
414
+ K === e && (e.inflight = null);
415
+ }
416
+ })(), e.inflight;
417
+ }
418
+ function It() {
419
+ if (typeof localStorage > "u") return null;
420
+ let e = localStorage.getItem("sb-auth-token");
421
+ if (!e) return null;
422
+ try {
423
+ let t = JSON.parse(e);
424
+ return t?.currentSession?.access_token ? t.currentSession : t?.access_token ? t : null;
425
+ } catch {
426
+ return null;
427
+ }
428
+ }
429
+ function J(e) {
430
+ e.debounce && clearTimeout(e.debounce), e.debounce = setTimeout(() => {
431
+ e.debounce = null, q(e);
432
+ }, Ft);
433
+ }
434
+ function Lt() {
435
+ let e = L.get();
436
+ return e ? Date.now() - e.cached_at > I : !0;
437
+ }
438
+ function Rt() {
439
+ let e = B.get();
440
+ return e ? Date.now() - e.cached_at > xt : !0;
441
+ }
442
+ function zt(e) {
443
+ Y();
444
+ let t = {
445
+ apiBase: e.apiBase,
446
+ supabaseUrl: e.supabaseUrl,
447
+ supabaseAnonKey: e.supabaseAnonKey,
448
+ timer: null,
449
+ debounce: null,
450
+ inflight: null,
451
+ disposers: []
452
+ };
453
+ K = t;
454
+ let n = e.subscribeAuth((e) => {
455
+ e?.session?.user?.id && J(t);
456
+ });
457
+ if (t.disposers.push(n), typeof document < "u") {
458
+ let e = () => {
459
+ document.visibilityState === "visible" && (!Lt() && !Rt() || J(t));
460
+ };
461
+ document.addEventListener("visibilitychange", e), t.disposers.push(() => document.removeEventListener("visibilitychange", e));
462
+ }
463
+ if (typeof window < "u") {
464
+ let e = () => {
465
+ !Lt() && !Rt() || J(t);
466
+ };
467
+ window.addEventListener("focus", e), t.disposers.push(() => window.removeEventListener("focus", e));
468
+ }
469
+ let r = e.fallbackIntervalMs ?? Pt;
470
+ return r > 0 && (t.timer = setInterval(() => {
471
+ q(t);
472
+ }, r)), Y;
473
+ }
474
+ function Y() {
475
+ if (!K) return;
476
+ let e = K;
477
+ K = null, e.timer && clearInterval(e.timer), e.debounce && clearTimeout(e.debounce);
478
+ for (let t of e.disposers) try {
479
+ t();
480
+ } catch {}
481
+ e.disposers.length = 0;
482
+ }
483
+ async function Bt() {
484
+ K && await q(K);
485
+ }
486
+ //#endregion
487
+ //#region packages/npm/droid/src/lib/agents/config.ts
488
+ function Vt(e) {
489
+ v({
490
+ id: `agents-${e.severity}-${Date.now()}`,
491
+ message: e.message,
492
+ severity: e.severity,
493
+ duration: e.duration ?? 3500
494
+ });
495
+ }
496
+ function Ht(e) {
497
+ return {
498
+ supabaseUrl: e.supabaseUrl.replace(/\/$/, ""),
499
+ discordBotClientId: e.discordBotClientId ?? "",
500
+ discordClientId: e.discordClientId ?? "",
501
+ loadSession: e.loadSession,
502
+ refreshSession: e.refreshSession,
503
+ getDiscordProviderToken: e.getDiscordProviderToken,
504
+ clearDiscordProviderToken: e.clearDiscordProviderToken,
505
+ signInWithDiscord: e.signInWithDiscord,
506
+ notify: e.notify ?? Vt
507
+ };
508
+ }
509
+ function Ut(e) {
510
+ let t = e.replace(/\/$/, "");
511
+ return {
512
+ discordApiBase: "https://discord.com/api/v10",
513
+ guildVault: `${t}/functions/v1/guild-vault`,
514
+ discordBootstrap: `${t}/functions/v1/discord-bootstrap`,
515
+ discordBot: `${t}/functions/v1/discord-bot`,
516
+ ghAdmin: `${t}/functions/v1/gh-admin`,
517
+ ghBackfill: `${t}/functions/v1/gh-backfill`,
518
+ ghWebhookBase: `${t}/functions/v1/gh-webhook`
519
+ };
520
+ }
521
+ //#endregion
522
+ //#region packages/npm/droid/src/lib/agents/state/atoms.ts
523
+ function Wt(e, t) {
524
+ return i(e, t, {
525
+ encode: (e) => JSON.stringify(e),
526
+ decode: (e) => {
527
+ try {
528
+ return e ? JSON.parse(e) : t;
529
+ } catch {
530
+ return t;
531
+ }
532
+ }
533
+ });
534
+ }
535
+ function Gt() {
536
+ return {
537
+ $authState: /* @__PURE__ */ O("loading"),
538
+ $accessToken: /* @__PURE__ */ O(null),
539
+ $providerToken: /* @__PURE__ */ O(null),
540
+ $userId: /* @__PURE__ */ O(null),
541
+ $guilds: /* @__PURE__ */ O([]),
542
+ $guildsLoading: /* @__PURE__ */ O(!1),
543
+ $guildsError: /* @__PURE__ */ O(null),
544
+ $guildsStale: /* @__PURE__ */ O(!1),
545
+ $selectedGuildId: /* @__PURE__ */ O(null),
546
+ $tokens: /* @__PURE__ */ O([]),
547
+ $tokensLoading: /* @__PURE__ */ O(!1),
548
+ $tokensError: /* @__PURE__ */ O(null),
549
+ $botConfigDrafts: /* @__PURE__ */ O({}),
550
+ $botConfigSavingFor: /* @__PURE__ */ O({}),
551
+ $botConfigErrors: /* @__PURE__ */ O({}),
552
+ $botConfigLoadedFor: /* @__PURE__ */ O({}),
553
+ $repoAllowlistDrafts: /* @__PURE__ */ O({}),
554
+ $repoAllowlistSavingFor: /* @__PURE__ */ O({}),
555
+ $repoAllowlistErrors: /* @__PURE__ */ O({}),
556
+ $repoAllowlistLoadedFor: /* @__PURE__ */ O({}),
557
+ $webhookDrafts: /* @__PURE__ */ O({}),
558
+ $webhookSavingFor: /* @__PURE__ */ O({}),
559
+ $webhookErrors: /* @__PURE__ */ O({}),
560
+ $patDrafts: /* @__PURE__ */ O({}),
561
+ $patValidatedFor: /* @__PURE__ */ O({}),
562
+ $patValidatingFor: /* @__PURE__ */ O({}),
563
+ $patSavingFor: /* @__PURE__ */ O({}),
564
+ $patErrors: /* @__PURE__ */ O({}),
565
+ $backfillDrafts: /* @__PURE__ */ O({}),
566
+ $backfillBusyFor: /* @__PURE__ */ O({}),
567
+ $backfillResults: /* @__PURE__ */ O({}),
568
+ $webhookInstallSelected: /* @__PURE__ */ O({}),
569
+ $webhookInstallBusyFor: /* @__PURE__ */ O({}),
570
+ $webhookInstallResults: /* @__PURE__ */ O({}),
571
+ $webhookPingBusyFor: /* @__PURE__ */ O({}),
572
+ $webhookPingResults: /* @__PURE__ */ O({}),
573
+ $guildChannels: Wt("kbve:agents:guild_channels:v1", {}),
574
+ $guildChannelsLoading: /* @__PURE__ */ O({}),
575
+ $guildChannelsError: /* @__PURE__ */ O({}),
576
+ $botMembership: Wt("kbve:agents:bot_membership:v1", {}),
577
+ $botMembershipLoading: /* @__PURE__ */ O({}),
578
+ $botMembershipError: /* @__PURE__ */ O({}),
579
+ $webhookDeliveries: /* @__PURE__ */ O({}),
580
+ $webhookDeliveriesLoading: /* @__PURE__ */ O({}),
581
+ $webhookDeliveriesError: /* @__PURE__ */ O({}),
582
+ $webhookRotateBusyFor: /* @__PURE__ */ O({}),
583
+ $webhookRotateResults: /* @__PURE__ */ O({}),
584
+ $webhookDeleteBusyFor: /* @__PURE__ */ O({}),
585
+ $eventStats: /* @__PURE__ */ O({}),
586
+ $eventStatsLoading: /* @__PURE__ */ O({}),
587
+ $failedEvents: /* @__PURE__ */ O({}),
588
+ $failedEventsLoading: /* @__PURE__ */ O({}),
589
+ $pendingEvents: /* @__PURE__ */ O({}),
590
+ $pendingEventsLoading: /* @__PURE__ */ O({}),
591
+ $eventRequeueBusyFor: /* @__PURE__ */ O({})
592
+ };
593
+ }
594
+ //#endregion
595
+ //#region packages/npm/droid/src/lib/agents/ctx.ts
596
+ function Kt() {
597
+ return {
598
+ initPromise: null,
599
+ lastInitAt: 0,
600
+ lastGuildFetchAt: 0,
601
+ guildsAbort: null,
602
+ tokensInflight: /* @__PURE__ */ new Map(),
603
+ tokensAbort: /* @__PURE__ */ new Map(),
604
+ bootstrapInflight: null,
605
+ lastBootstrapAt: 0,
606
+ lastBootstrapOk: !1,
607
+ refreshInflight: null,
608
+ lastForcedRefreshAt: 0
609
+ };
610
+ }
611
+ //#endregion
612
+ //#region packages/npm/droid/src/lib/agents/client/callJson.ts
613
+ function qt(e) {
614
+ return async function(t, n, r = {}) {
615
+ let i = e.store.$accessToken.get();
616
+ if (!i) return {
617
+ ok: !1,
618
+ error: "Not authenticated"
619
+ };
620
+ try {
621
+ let a = await fetch(t, {
622
+ method: "POST",
623
+ headers: {
624
+ "Content-Type": "application/json",
625
+ Authorization: `Bearer ${i}`
626
+ },
627
+ body: JSON.stringify(n)
628
+ }), o = await a.text(), s;
629
+ try {
630
+ s = o.length > 0 ? JSON.parse(o) : {};
631
+ } catch {
632
+ return {
633
+ ok: !1,
634
+ error: `HTTP ${a.status}: ${o.slice(0, 200)}`
635
+ };
636
+ }
637
+ if (!a.ok) {
638
+ let i = s, o = i?.error ?? "";
639
+ if (a.status === 403 && /owned_guilds/i.test(o) && !r.retriedAfterResync && await e.resyncOwnedGuilds()) return e.callJson(t, n, { retriedAfterResync: !0 });
640
+ let c = [o || `HTTP ${a.status}`];
641
+ return i?.sqlstate && c.push(`sqlstate=${i.sqlstate}`), i?.hint && c.push(`hint=${i.hint}`), i?.context && c.push(`context=${i.context}`), {
642
+ ok: !1,
643
+ error: c.join(" · ")
644
+ };
645
+ }
646
+ return {
647
+ ok: !0,
648
+ data: s
649
+ };
650
+ } catch (e) {
651
+ return {
652
+ ok: !1,
653
+ error: e instanceof Error ? e.message : "Network error"
654
+ };
655
+ }
656
+ };
657
+ }
658
+ //#endregion
659
+ //#region packages/npm/droid/src/lib/agents/client/callGuildVault.ts
660
+ function Jt(e) {
661
+ return async function(t, n, r, i = {}) {
662
+ try {
663
+ let a = await fetch(e.endpoints.guildVault, {
664
+ method: "POST",
665
+ headers: {
666
+ "Content-Type": "application/json",
667
+ Authorization: `Bearer ${n}`
668
+ },
669
+ body: JSON.stringify({
670
+ command: t,
671
+ ...r
672
+ })
673
+ }), o = await a.text(), s;
674
+ try {
675
+ s = JSON.parse(o);
676
+ } catch {
677
+ return {
678
+ ok: !1,
679
+ error: `HTTP ${a.status}: ${o.slice(0, 200)}`
680
+ };
681
+ }
682
+ if (!a.ok) {
683
+ let n = s, o = n?.error ?? "";
684
+ if (a.status === 403 && /owned_guilds/i.test(o) && !i.retriedAfterResync && await e.resyncOwnedGuilds()) {
685
+ let n = e.store.$accessToken.get();
686
+ if (n) return e.callGuildVault(t, n, r, { retriedAfterResync: !0 });
687
+ }
688
+ let c = [o || `HTTP ${a.status}`];
689
+ return n?.sqlstate && c.push(`sqlstate=${n.sqlstate}`), n?.hint && c.push(`hint=${n.hint}`), n?.context && c.push(`context=${n.context}`), {
690
+ ok: !1,
691
+ error: c.join(" · ")
692
+ };
693
+ }
694
+ return {
695
+ ok: !0,
696
+ body: s
697
+ };
698
+ } catch (e) {
699
+ return {
700
+ ok: !1,
701
+ error: e instanceof Error ? e.message : "Network error"
702
+ };
703
+ }
704
+ };
705
+ }
706
+ //#endregion
707
+ //#region packages/npm/droid/src/lib/agents/constants.ts
708
+ var Yt = "kbve:agents:owned_guilds_cache:v1", X = "kbve:agents:tokens_cache:v1";
709
+ //#endregion
710
+ //#region packages/npm/droid/src/lib/agents/cache.ts
711
+ function Z(e) {
712
+ try {
713
+ let t = e.split(".");
714
+ if (t.length < 2) return null;
715
+ let n = t[1].replace(/-/g, "+").replace(/_/g, "/"), r = n + "===".slice((n.length + 3) % 4), i = atob(r);
716
+ return JSON.parse(i);
717
+ } catch {
718
+ return null;
719
+ }
720
+ }
721
+ function Xt(e) {
722
+ let t = Z(e);
723
+ return !t || !Array.isArray(t.owned_guilds) ? [] : t.owned_guilds.filter((e) => typeof e == "string" && /^[0-9]{17,20}$/.test(e));
724
+ }
725
+ function Zt(e) {
726
+ try {
727
+ let t = localStorage.getItem(Yt);
728
+ if (!t) return null;
729
+ let n = JSON.parse(t);
730
+ return n.user_id !== e || Date.now() - n.cached_at > 6048e5 || !Array.isArray(n.guilds) ? null : n.guilds;
731
+ } catch {
732
+ return null;
733
+ }
734
+ }
735
+ function Qt(e, t) {
736
+ try {
737
+ let n = {
738
+ user_id: e,
739
+ guilds: t,
740
+ cached_at: Date.now()
741
+ };
742
+ localStorage.setItem(Yt, JSON.stringify(n));
743
+ } catch {}
744
+ }
745
+ function $t(e, t) {
746
+ try {
747
+ let n = localStorage.getItem(X);
748
+ if (!n) return null;
749
+ let r = JSON.parse(n);
750
+ if (r.user_id !== e) return null;
751
+ let i = r.tokens_by_guild?.[t];
752
+ return !i || Date.now() - i.cached_at > 6e4 ? null : i.tokens;
753
+ } catch {
754
+ return null;
755
+ }
756
+ }
757
+ function en(e, t, n) {
758
+ try {
759
+ let r = localStorage.getItem(X), i;
760
+ try {
761
+ i = r ? JSON.parse(r) : {
762
+ user_id: e,
763
+ tokens_by_guild: {}
764
+ };
765
+ } catch {
766
+ i = {
767
+ user_id: e,
768
+ tokens_by_guild: {}
769
+ };
770
+ }
771
+ i.user_id !== e && (i = {
772
+ user_id: e,
773
+ tokens_by_guild: {}
774
+ }), i.tokens_by_guild[t] = {
775
+ tokens: n,
776
+ cached_at: Date.now()
777
+ }, localStorage.setItem(X, JSON.stringify(i));
778
+ } catch {}
779
+ }
780
+ function tn(e, t) {
781
+ try {
782
+ let n = localStorage.getItem(X);
783
+ if (!n) return;
784
+ let r = JSON.parse(n);
785
+ if (r.user_id !== e) return;
786
+ r.tokens_by_guild?.[t] && (delete r.tokens_by_guild[t], localStorage.setItem(X, JSON.stringify(r)));
787
+ } catch {}
788
+ }
789
+ //#endregion
790
+ //#region packages/npm/droid/src/lib/agents/auth/init.ts
791
+ function nn(e, t) {
792
+ let { store: n, config: r, endpoints: i, runtime: a } = e;
793
+ async function o(e) {
794
+ let t = n.$accessToken.get();
795
+ if (!t) return !1;
796
+ let r = Date.now();
797
+ return a.lastBootstrapOk && r - a.lastBootstrapAt < 3e5 ? !0 : (a.bootstrapInflight ||= (async () => {
798
+ try {
799
+ let n = await fetch(i.discordBootstrap, {
800
+ method: "POST",
801
+ headers: {
802
+ "Content-Type": "application/json",
803
+ Authorization: `Bearer ${t}`
804
+ },
805
+ body: JSON.stringify({ provider_token: e })
806
+ });
807
+ return n.ok ? (a.lastBootstrapAt = Date.now(), a.lastBootstrapOk = !0, !0) : (n.status === 429 && (a.lastBootstrapAt = Date.now(), a.lastBootstrapOk = !0), !1);
808
+ } catch {
809
+ return !1;
810
+ } finally {
811
+ a.bootstrapInflight = null;
812
+ }
813
+ })(), a.bootstrapInflight);
814
+ }
815
+ async function s() {
816
+ return Date.now() - a.lastForcedRefreshAt < 5e3 ? !1 : (a.refreshInflight ||= (async () => {
817
+ try {
818
+ let e = await r.refreshSession();
819
+ return e ? (n.$accessToken.set(e), a.lastForcedRefreshAt = Date.now(), !0) : (console.warn("[agents] refreshSession returned no session"), !1);
820
+ } catch (e) {
821
+ return console.warn("[agents] refreshSession threw:", e), !1;
822
+ } finally {
823
+ a.refreshInflight = null;
824
+ }
825
+ })(), a.refreshInflight);
826
+ }
827
+ async function c() {
828
+ let e = n.$providerToken.get();
829
+ return !e || !await o(e) ? !1 : await s();
830
+ }
831
+ async function l() {
832
+ try {
833
+ let e = await r.loadSession(), i = e.accessToken;
834
+ if (!i) {
835
+ n.$authState.set("unauthenticated");
836
+ return;
837
+ }
838
+ n.$accessToken.set(i);
839
+ let a = Z(i)?.sub ?? null;
840
+ a && n.$userId.set(a);
841
+ let o = e.providerToken;
842
+ if (o ||= r.getDiscordProviderToken(), o) {
843
+ n.$providerToken.set(o), n.$authState.set("authenticated");
844
+ let e = a ? Zt(a) : null;
845
+ e && e.length > 0 && (n.$guilds.set(e), e.length === 1 && t.selectGuild(e[0].id));
846
+ return;
847
+ }
848
+ let s = a ? Zt(a) : null, c = Xt(i), l = new Set(c);
849
+ if (s && s.length > 0) {
850
+ let e = c.length > 0 ? s.filter((e) => l.has(e.id)) : s;
851
+ n.$guilds.set(e), n.$guildsStale.set(!0), n.$authState.set("authenticated"), e.length === 1 && t.selectGuild(e[0].id);
852
+ return;
853
+ }
854
+ if (c.length > 0) {
855
+ n.$guilds.set(c.map((e) => ({
856
+ id: e,
857
+ name: `Guild #${e.slice(-6)}`,
858
+ icon: null,
859
+ owner: !0,
860
+ permissions: "0"
861
+ }))), n.$guildsStale.set(!0), n.$authState.set("authenticated"), c.length === 1 && t.selectGuild(c[0]);
862
+ return;
863
+ }
864
+ n.$authState.set("discord_reauth_required");
865
+ } catch {
866
+ n.$authState.set("unauthenticated");
867
+ } finally {
868
+ a.lastInitAt = Date.now();
869
+ }
870
+ }
871
+ async function u(e = !1) {
872
+ if (!e) {
873
+ if (a.initPromise) return a.initPromise;
874
+ if (a.lastInitAt > 0 && Date.now() - a.lastInitAt < 3e4 && n.$authState.get() !== "loading") return;
875
+ }
876
+ a.initPromise = l();
877
+ try {
878
+ await a.initPromise;
879
+ } finally {
880
+ a.initPromise = null;
881
+ }
882
+ }
883
+ async function d() {
884
+ try {
885
+ await r.signInWithDiscord();
886
+ } catch (e) {
887
+ r.notify({
888
+ message: e instanceof Error ? e.message : "Discord sign-in failed",
889
+ severity: "error",
890
+ duration: 5e3
891
+ });
892
+ }
893
+ }
894
+ return {
895
+ initAuth: u,
896
+ resyncOwnedGuilds: c,
897
+ signInWithDiscord: d
898
+ };
899
+ }
900
+ //#endregion
901
+ //#region packages/npm/droid/src/lib/agents/discord/guilds.ts
902
+ function rn(e, t) {
903
+ let { store: n, config: r, endpoints: i, runtime: a } = e;
904
+ function o(e) {
905
+ n.$selectedGuildId.get() !== e && (n.$selectedGuildId.set(e), t.loadTokens(e));
906
+ }
907
+ async function s(e = !1) {
908
+ let t = n.$providerToken.get();
909
+ if (!t || !e && a.lastGuildFetchAt > 0 && Date.now() - a.lastGuildFetchAt < 6e4 && n.$guilds.get().length > 0) return;
910
+ a.guildsAbort && a.guildsAbort.abort();
911
+ let s = new AbortController();
912
+ a.guildsAbort = s, n.$guildsLoading.set(!0), n.$guildsError.set(null);
913
+ try {
914
+ let e = await fetch(`${i.discordApiBase}/users/@me/guilds`, {
915
+ headers: { Authorization: `Bearer ${t}` },
916
+ signal: s.signal
917
+ });
918
+ if (e.status === 401) {
919
+ n.$providerToken.set(null), n.$guildsStale.set(!0);
920
+ try {
921
+ r.clearDiscordProviderToken();
922
+ } catch {}
923
+ n.$guildsError.set("Discord session expired — guild list may be stale. Sign in with Discord to refresh.");
924
+ return;
925
+ }
926
+ if (!e.ok) {
927
+ let t = await e.text();
928
+ n.$guildsError.set(`Discord API ${e.status}: ${t.slice(0, 200)}`), n.$guildsStale.set(!0);
929
+ return;
930
+ }
931
+ let c = (await e.json()).filter((e) => e.owner === !0);
932
+ n.$guilds.set(c), n.$guildsStale.set(!1), a.lastGuildFetchAt = Date.now();
933
+ let l = n.$userId.get();
934
+ l && Qt(l, c), c.length === 1 && o(c[0].id);
935
+ } catch (e) {
936
+ if (e instanceof DOMException && e.name === "AbortError") return;
937
+ n.$guildsError.set(e instanceof Error ? e.message : "Failed to load Discord guilds"), n.$guildsStale.set(!0);
938
+ } finally {
939
+ n.$guildsLoading.set(!1), a.guildsAbort === s && (a.guildsAbort = null);
940
+ }
941
+ }
942
+ async function c() {
943
+ let e = n.$selectedGuildId.get();
944
+ if (!e) return;
945
+ let r = n.$userId.get();
946
+ r && tn(r, e), await t.loadTokens(e, !0);
947
+ }
948
+ return {
949
+ selectGuild: o,
950
+ loadOwnedGuilds: s,
951
+ refreshSelectedGuild: c
952
+ };
953
+ }
954
+ //#endregion
955
+ //#region packages/npm/droid/src/lib/agents/discord/bot.ts
956
+ function an(e) {
957
+ let { store: t, config: n, endpoints: r } = e;
958
+ async function i(n, i = !1) {
959
+ let a = t.$guildChannels.get()[n];
960
+ if (a && Date.now() - a.cached_at < 6048e5 && !i || t.$guildChannelsLoading.get()[n]) return;
961
+ t.$guildChannelsLoading.set({
962
+ ...t.$guildChannelsLoading.get(),
963
+ [n]: !0
964
+ }), t.$guildChannelsError.set({
965
+ ...t.$guildChannelsError.get(),
966
+ [n]: null
967
+ });
968
+ let o = await e.callJson(r.discordBot, {
969
+ command: "bot.list_channels",
970
+ server_id: n
971
+ }), s = { ...t.$guildChannelsLoading.get() };
972
+ if (delete s[n], t.$guildChannelsLoading.set(s), !o.ok) {
973
+ t.$guildChannelsError.set({
974
+ ...t.$guildChannelsError.get(),
975
+ [n]: o.error
976
+ });
977
+ return;
978
+ }
979
+ t.$guildChannels.set({
980
+ ...t.$guildChannels.get(),
981
+ [n]: {
982
+ forums: o.data.forums ?? [],
983
+ texts: o.data.texts ?? [],
984
+ cached_at: Date.now()
985
+ }
986
+ });
987
+ }
988
+ async function a(n, i = !1) {
989
+ let a = t.$botMembership.get()[n];
990
+ if (a && Date.now() - a.cached_at < 6048e5 && !i || t.$botMembershipLoading.get()[n]) return;
991
+ t.$botMembershipLoading.set({
992
+ ...t.$botMembershipLoading.get(),
993
+ [n]: !0
994
+ }), t.$botMembershipError.set({
995
+ ...t.$botMembershipError.get(),
996
+ [n]: null
997
+ });
998
+ let o = await e.callJson(r.discordBot, {
999
+ command: "bot.is_member",
1000
+ server_id: n
1001
+ }), s = { ...t.$botMembershipLoading.get() };
1002
+ if (delete s[n], t.$botMembershipLoading.set(s), !o.ok) {
1003
+ t.$botMembershipError.set({
1004
+ ...t.$botMembershipError.get(),
1005
+ [n]: o.error
1006
+ });
1007
+ return;
1008
+ }
1009
+ t.$botMembership.set({
1010
+ ...t.$botMembership.get(),
1011
+ [n]: {
1012
+ isMember: !!o.data.is_member,
1013
+ cached_at: Date.now()
1014
+ }
1015
+ });
1016
+ }
1017
+ function o(e) {
1018
+ let n = { ...t.$botMembership.get() };
1019
+ delete n[e], t.$botMembership.set(n);
1020
+ }
1021
+ async function s(t) {
1022
+ let n = await e.callJson(r.discordBot, {
1023
+ command: "bot.is_member",
1024
+ server_id: t
1025
+ });
1026
+ return n.ok ? {
1027
+ ok: !0,
1028
+ isMember: !!n.data.is_member,
1029
+ joinedAt: n.data.joined_at ?? null
1030
+ } : n;
1031
+ }
1032
+ async function c(t) {
1033
+ let n = await e.callJson(r.discordBot, {
1034
+ command: "bot.list_forum_channels",
1035
+ server_id: t
1036
+ });
1037
+ return n.ok ? {
1038
+ ok: !0,
1039
+ channels: n.data.channels ?? []
1040
+ } : n;
1041
+ }
1042
+ function l(e, t) {
1043
+ return /^[0-9]{17,20}$/.test(e) ? `https://discord.com/oauth2/authorize?client_id=${e}&permissions=326417847872&scope=bot%20applications.commands${t ? `&guild_id=${t}&disable_guild_select=true` : ""}` : null;
1044
+ }
1045
+ function u(e) {
1046
+ let t = n.discordBotClientId || n.discordClientId;
1047
+ return t ? l(t, e) : null;
1048
+ }
1049
+ async function d(t) {
1050
+ let n = u(t);
1051
+ if (n) return n;
1052
+ let i = await e.callJson(r.discordBot, {
1053
+ command: "bot.install_info",
1054
+ server_id: t
1055
+ });
1056
+ return !i.ok || !i.data.client_id ? null : l(i.data.client_id, t);
1057
+ }
1058
+ return {
1059
+ ensureGuildChannelsLoaded: i,
1060
+ ensureBotMembershipLoaded: a,
1061
+ invalidateBotMembership: o,
1062
+ isBotMember: s,
1063
+ listForumChannels: c,
1064
+ botInstallUrl: u,
1065
+ fetchBotInstallUrl: d
1066
+ };
1067
+ }
1068
+ S([
1069
+ "github_webhook",
1070
+ "github",
1071
+ "github_repos",
1072
+ "discordsh_config"
1073
+ ]), y({ value: _().optional() }), y({
1074
+ server_id: _().regex(/^\d{17,20}$/, "Must be a valid Discord snowflake (17-20 digits)"),
1075
+ service: _().regex(/^[a-z0-9_]{2,32}$/, "Service must be 2-32 chars: lowercase a-z, 0-9, underscore")
1076
+ }), y({
1077
+ server_id: _().regex(/^\d{17,20}$/, "Must be a valid Discord snowflake (17-20 digits)"),
1078
+ token_id: _().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, "token_id must be a UUID"),
1079
+ is_active: D()
1080
+ }), y({
1081
+ server_id: _().regex(/^\d{17,20}$/, "Must be a valid Discord snowflake (17-20 digits)"),
1082
+ token_id: _().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, "token_id must be a UUID")
1083
+ });
1084
+ var on = y({
1085
+ token_id: _(),
1086
+ token_name: _(),
1087
+ service: _(),
1088
+ description: _().nullish(),
1089
+ is_active: D(),
1090
+ created_at: _(),
1091
+ updated_at: _().nullish()
1092
+ });
1093
+ y({ tokens: de(on).optional() }), y({ server_id: _().regex(/^\d{17,20}$/, "Must be a valid Discord snowflake (17-20 digits)") }), y({
1094
+ server_id: _().regex(/^\d{17,20}$/, "Must be a valid Discord snowflake (17-20 digits)"),
1095
+ service: _().regex(/^[a-z0-9_]{2,32}$/, "Service must be 2-32 chars: lowercase a-z, 0-9, underscore"),
1096
+ token_name: _().regex(/^[a-z0-9_-]{3,64}$/, "Token name must be 3-64 lowercase chars: a-z, 0-9, underscore, dash"),
1097
+ token_value: _().min(10, "Token value must be 10-8000 characters").max(8e3, "Token value must be 10-8000 characters"),
1098
+ description: _().optional()
1099
+ }), y({
1100
+ success: D(),
1101
+ message: _(),
1102
+ code: j(),
1103
+ sqlstate: _().optional(),
1104
+ hint: _().optional(),
1105
+ context: _().optional()
1106
+ });
1107
+ //#endregion
1108
+ //#region packages/npm/droid/src/lib/agents/github/tokens.ts
1109
+ function sn(e, t) {
1110
+ let { store: n, config: r, endpoints: i, runtime: a } = e;
1111
+ async function o(e, t = !1) {
1112
+ let r = n.$accessToken.get();
1113
+ if (!r) return;
1114
+ let o = n.$userId.get();
1115
+ if (!t && o) {
1116
+ let t = $t(o, e);
1117
+ if (t) {
1118
+ n.$tokens.set(t), n.$tokensError.set(null);
1119
+ return;
1120
+ }
1121
+ }
1122
+ let s = a.tokensInflight.get(e);
1123
+ if (!t && s) return s;
1124
+ let c = a.tokensAbort.get(e);
1125
+ c && c.abort();
1126
+ let l = new AbortController();
1127
+ a.tokensAbort.set(e, l), n.$tokensLoading.set(!0), n.$tokensError.set(null);
1128
+ let u = (async () => {
1129
+ try {
1130
+ let t = await fetch(i.guildVault, {
1131
+ method: "POST",
1132
+ headers: {
1133
+ "Content-Type": "application/json",
1134
+ Authorization: `Bearer ${r}`
1135
+ },
1136
+ body: JSON.stringify({
1137
+ command: "tokens.list_tokens",
1138
+ server_id: e
1139
+ }),
1140
+ signal: l.signal
1141
+ }), a = await t.text(), s;
1142
+ try {
1143
+ s = JSON.parse(a);
1144
+ } catch {
1145
+ n.$tokensError.set(`HTTP ${t.status}: ${a.slice(0, 200)}`);
1146
+ return;
1147
+ }
1148
+ if (!t.ok) {
1149
+ let e = s?.error ?? `HTTP ${t.status}`;
1150
+ n.$tokensError.set(e);
1151
+ return;
1152
+ }
1153
+ let c = s?.tokens ?? [], u = on.array().safeParse(c);
1154
+ if (!u.success) {
1155
+ n.$tokensError.set("Token list failed schema validation");
1156
+ return;
1157
+ }
1158
+ let d = u.data;
1159
+ n.$tokens.set(d), o && en(o, e, d);
1160
+ } catch (e) {
1161
+ if (e instanceof DOMException && e.name === "AbortError") return;
1162
+ n.$tokensError.set(e instanceof Error ? e.message : "Failed to load tokens");
1163
+ } finally {
1164
+ n.$tokensLoading.set(!1), a.tokensInflight.delete(e), a.tokensAbort.get(e) === l && a.tokensAbort.delete(e);
1165
+ }
1166
+ })();
1167
+ return a.tokensInflight.set(e, u), u;
1168
+ }
1169
+ async function s(i) {
1170
+ let a = n.$selectedGuildId.get(), o = n.$accessToken.get();
1171
+ if (!a || !o) return {
1172
+ ok: !1,
1173
+ error: "No guild selected or session missing"
1174
+ };
1175
+ let s = await e.callGuildVault("tokens.set_token", o, {
1176
+ server_id: a,
1177
+ token_name: i.tokenName,
1178
+ service: i.service,
1179
+ token_value: i.tokenValue,
1180
+ description: i.description ?? null
1181
+ });
1182
+ if (!s.ok) return {
1183
+ ok: !1,
1184
+ error: s.error
1185
+ };
1186
+ let c = s.body?.token_id ?? "";
1187
+ return await t.refreshSelectedGuild(), r.notify({
1188
+ message: `Token "${i.tokenName}" registered.`,
1189
+ severity: "success",
1190
+ duration: 3500
1191
+ }), {
1192
+ ok: !0,
1193
+ tokenId: c
1194
+ };
1195
+ }
1196
+ async function c(i) {
1197
+ let a = n.$selectedGuildId.get(), o = n.$accessToken.get();
1198
+ if (!a || !o) return {
1199
+ ok: !1,
1200
+ error: "No guild selected or session missing"
1201
+ };
1202
+ let s = await e.callGuildVault("tokens.delete_token", o, {
1203
+ server_id: a,
1204
+ token_id: i
1205
+ });
1206
+ return s.ok ? (await t.refreshSelectedGuild(), r.notify({
1207
+ message: "Token deleted.",
1208
+ severity: "success",
1209
+ duration: 3500
1210
+ }), { ok: !0 }) : {
1211
+ ok: !1,
1212
+ error: s.error
1213
+ };
1214
+ }
1215
+ async function l(t) {
1216
+ let r = n.$selectedGuildId.get(), i = n.$accessToken.get();
1217
+ if (!r || !i) return {
1218
+ ok: !1,
1219
+ error: "No guild selected or session missing"
1220
+ };
1221
+ let a = await e.callGuildVault("tokens.peek_token", i, {
1222
+ server_id: r,
1223
+ service: t
1224
+ });
1225
+ return a.ok ? {
1226
+ ok: !0,
1227
+ value: a.body?.value ?? null
1228
+ } : {
1229
+ ok: !1,
1230
+ error: a.error
1231
+ };
1232
+ }
1233
+ async function u(r, i) {
1234
+ let a = n.$selectedGuildId.get(), o = n.$accessToken.get();
1235
+ if (!a || !o) return {
1236
+ ok: !1,
1237
+ error: "No guild selected or session missing"
1238
+ };
1239
+ let s = await e.callGuildVault("tokens.toggle_token", o, {
1240
+ server_id: a,
1241
+ token_id: r,
1242
+ is_active: i
1243
+ });
1244
+ return s.ok ? (await t.refreshSelectedGuild(), { ok: !0 }) : {
1245
+ ok: !1,
1246
+ error: s.error
1247
+ };
1248
+ }
1249
+ function d(e) {
1250
+ let t = n.$tokens.get();
1251
+ return t.find((t) => t.service === e && t.is_active) ?? t.find((t) => t.service === e) ?? null;
1252
+ }
1253
+ return {
1254
+ loadTokens: o,
1255
+ addToken: s,
1256
+ deleteToken: c,
1257
+ peekToken: l,
1258
+ toggleToken: u,
1259
+ hasService: d
1260
+ };
1261
+ }
1262
+ //#endregion
1263
+ //#region packages/npm/droid/src/lib/agents/formDrafts.ts
1264
+ function Q() {
1265
+ return {
1266
+ default_repo: "",
1267
+ claim_channel_id: "",
1268
+ forum_channel_id: "",
1269
+ noticeboard_channel_id: "",
1270
+ taskboard_channel_id: "",
1271
+ max_assignees: "2",
1272
+ mirror_pr_events: !0,
1273
+ active: !0
1274
+ };
1275
+ }
1276
+ function $(e) {
1277
+ let t = Q();
1278
+ return {
1279
+ default_repo: e.default_repo ?? t.default_repo,
1280
+ claim_channel_id: e.claim_channel_id ?? t.claim_channel_id,
1281
+ forum_channel_id: e.forum_channel_id ?? t.forum_channel_id,
1282
+ noticeboard_channel_id: e.noticeboard_channel_id ?? t.noticeboard_channel_id,
1283
+ taskboard_channel_id: e.taskboard_channel_id ?? t.taskboard_channel_id,
1284
+ max_assignees: typeof e.max_assignees == "number" ? String(e.max_assignees) : t.max_assignees,
1285
+ mirror_pr_events: typeof e.mirror_pr_events == "boolean" ? e.mirror_pr_events : t.mirror_pr_events,
1286
+ active: typeof e.active == "boolean" ? e.active : t.active
1287
+ };
1288
+ }
1289
+ function cn(e) {
1290
+ let t = {
1291
+ mirror_pr_events: e.mirror_pr_events,
1292
+ active: e.active
1293
+ };
1294
+ e.default_repo.trim() && (t.default_repo = e.default_repo.trim()), e.claim_channel_id.trim() && (t.claim_channel_id = e.claim_channel_id.trim()), e.forum_channel_id.trim() && (t.forum_channel_id = e.forum_channel_id.trim()), e.noticeboard_channel_id.trim() && (t.noticeboard_channel_id = e.noticeboard_channel_id.trim()), e.taskboard_channel_id.trim() && (t.taskboard_channel_id = e.taskboard_channel_id.trim());
1295
+ let n = parseInt(e.max_assignees, 10);
1296
+ return !Number.isNaN(n) && n > 0 && (t.max_assignees = n), t;
1297
+ }
1298
+ //#endregion
1299
+ //#region packages/npm/droid/src/lib/agents/github/repoConfig.ts
1300
+ function ln(e, t) {
1301
+ let { store: n } = e;
1302
+ async function r() {
1303
+ let e = await t.peekToken("github_repos");
1304
+ if (!e.ok) return {
1305
+ ok: !1,
1306
+ error: e.error
1307
+ };
1308
+ if (!e.value) return {
1309
+ ok: !0,
1310
+ repos: [],
1311
+ raw: null
1312
+ };
1313
+ try {
1314
+ let t = JSON.parse(e.value);
1315
+ return {
1316
+ ok: !0,
1317
+ repos: Array.isArray(t.repos) ? t.repos.filter((e) => typeof e == "string") : [],
1318
+ raw: e.value
1319
+ };
1320
+ } catch {
1321
+ return {
1322
+ ok: !0,
1323
+ repos: [],
1324
+ raw: e.value
1325
+ };
1326
+ }
1327
+ }
1328
+ async function i(e) {
1329
+ let n = await t.addToken({
1330
+ tokenName: "github-repos",
1331
+ service: "github_repos",
1332
+ tokenValue: JSON.stringify({ repos: e }),
1333
+ description: "Per-guild repo allowlist consumed by gh-webhook and gh-backfill"
1334
+ });
1335
+ return n.ok ? { ok: !0 } : {
1336
+ ok: !1,
1337
+ error: n.error
1338
+ };
1339
+ }
1340
+ function a(e, t) {
1341
+ n.$repoAllowlistDrafts.set({
1342
+ ...n.$repoAllowlistDrafts.get(),
1343
+ [e]: t
1344
+ }), n.$repoAllowlistLoadedFor.set({
1345
+ ...n.$repoAllowlistLoadedFor.get(),
1346
+ [e]: !0
1347
+ });
1348
+ }
1349
+ function o(e, t) {
1350
+ n.$repoAllowlistDrafts.set({
1351
+ ...n.$repoAllowlistDrafts.get(),
1352
+ [e]: t
1353
+ });
1354
+ }
1355
+ function s(e) {
1356
+ let t = { ...n.$repoAllowlistDrafts.get() };
1357
+ delete t[e], n.$repoAllowlistDrafts.set(t);
1358
+ let r = { ...n.$repoAllowlistLoadedFor.get() };
1359
+ delete r[e], n.$repoAllowlistLoadedFor.set(r);
1360
+ }
1361
+ async function c(e, t = !1) {
1362
+ if (!t && n.$repoAllowlistLoadedFor.get()[e]) return { ok: !0 };
1363
+ let i = await r();
1364
+ return i.ok ? (a(e, i.repos), n.$repoAllowlistErrors.set({
1365
+ ...n.$repoAllowlistErrors.get(),
1366
+ [e]: null
1367
+ }), { ok: !0 }) : (n.$repoAllowlistErrors.set({
1368
+ ...n.$repoAllowlistErrors.get(),
1369
+ [e]: i.error
1370
+ }), i);
1371
+ }
1372
+ async function l(e) {
1373
+ let t = n.$repoAllowlistDrafts.get()[e];
1374
+ if (!t) return {
1375
+ ok: !1,
1376
+ error: "No draft loaded yet"
1377
+ };
1378
+ n.$repoAllowlistSavingFor.set({
1379
+ ...n.$repoAllowlistSavingFor.get(),
1380
+ [e]: !0
1381
+ }), n.$repoAllowlistErrors.set({
1382
+ ...n.$repoAllowlistErrors.get(),
1383
+ [e]: null
1384
+ });
1385
+ let r = await i(t), a = { ...n.$repoAllowlistSavingFor.get() };
1386
+ return delete a[e], n.$repoAllowlistSavingFor.set(a), r.ok || n.$repoAllowlistErrors.set({
1387
+ ...n.$repoAllowlistErrors.get(),
1388
+ [e]: r.error
1389
+ }), r;
1390
+ }
1391
+ async function u() {
1392
+ let e = await t.peekToken("discordsh_config");
1393
+ if (!e.ok) return {
1394
+ ok: !1,
1395
+ error: e.error
1396
+ };
1397
+ if (!e.value) return {
1398
+ ok: !0,
1399
+ config: {}
1400
+ };
1401
+ try {
1402
+ return {
1403
+ ok: !0,
1404
+ config: JSON.parse(e.value)
1405
+ };
1406
+ } catch {
1407
+ return {
1408
+ ok: !0,
1409
+ config: {}
1410
+ };
1411
+ }
1412
+ }
1413
+ async function d(e) {
1414
+ let n = await t.addToken({
1415
+ tokenName: "discordsh-config",
1416
+ service: "discordsh_config",
1417
+ tokenValue: JSON.stringify(e),
1418
+ description: "Per-guild DiscordSH bot config (channels, defaults, toggles)"
1419
+ });
1420
+ return n.ok ? { ok: !0 } : {
1421
+ ok: !1,
1422
+ error: n.error
1423
+ };
1424
+ }
1425
+ function f(e, t) {
1426
+ n.$botConfigDrafts.set({
1427
+ ...n.$botConfigDrafts.get(),
1428
+ [e]: $(t)
1429
+ }), n.$botConfigLoadedFor.set({
1430
+ ...n.$botConfigLoadedFor.get(),
1431
+ [e]: !0
1432
+ });
1433
+ }
1434
+ function p(e, t) {
1435
+ let r = n.$botConfigDrafts.get(), i = r[e] ?? Q();
1436
+ n.$botConfigDrafts.set({
1437
+ ...r,
1438
+ [e]: {
1439
+ ...i,
1440
+ ...t
1441
+ }
1442
+ });
1443
+ }
1444
+ function m(e) {
1445
+ let t = { ...n.$botConfigDrafts.get() };
1446
+ delete t[e], n.$botConfigDrafts.set(t);
1447
+ let r = { ...n.$botConfigLoadedFor.get() };
1448
+ delete r[e], n.$botConfigLoadedFor.set(r);
1449
+ }
1450
+ async function h(e, t = !1) {
1451
+ if (!t && n.$botConfigLoadedFor.get()[e]) return { ok: !0 };
1452
+ let r = await u();
1453
+ return r.ok ? (f(e, r.config), n.$botConfigErrors.set({
1454
+ ...n.$botConfigErrors.get(),
1455
+ [e]: null
1456
+ }), { ok: !0 }) : (n.$botConfigErrors.set({
1457
+ ...n.$botConfigErrors.get(),
1458
+ [e]: r.error
1459
+ }), r);
1460
+ }
1461
+ async function g(e) {
1462
+ let t = n.$botConfigDrafts.get()[e];
1463
+ if (!t) return {
1464
+ ok: !1,
1465
+ error: "No draft loaded yet"
1466
+ };
1467
+ n.$botConfigSavingFor.set({
1468
+ ...n.$botConfigSavingFor.get(),
1469
+ [e]: !0
1470
+ }), n.$botConfigErrors.set({
1471
+ ...n.$botConfigErrors.get(),
1472
+ [e]: null
1473
+ });
1474
+ let r = await d(cn(t)), i = { ...n.$botConfigSavingFor.get() };
1475
+ return delete i[e], n.$botConfigSavingFor.set(i), r.ok || n.$botConfigErrors.set({
1476
+ ...n.$botConfigErrors.get(),
1477
+ [e]: r.error
1478
+ }), r;
1479
+ }
1480
+ return {
1481
+ getRepoAllowlist: r,
1482
+ setRepoAllowlist: i,
1483
+ hydrateRepoAllowlistDraft: a,
1484
+ patchRepoAllowlistDraft: o,
1485
+ clearRepoAllowlistDraft: s,
1486
+ ensureRepoAllowlistLoaded: c,
1487
+ saveRepoAllowlistDraft: l,
1488
+ getBotConfig: u,
1489
+ setBotConfig: d,
1490
+ hydrateBotConfigDraft: f,
1491
+ patchBotConfigDraft: p,
1492
+ clearBotConfigDraft: m,
1493
+ ensureBotConfigLoaded: h,
1494
+ saveBotConfigDraft: g
1495
+ };
1496
+ }
1497
+ //#endregion
1498
+ //#region packages/npm/droid/src/lib/agents/github/pat.ts
1499
+ function un(e, t) {
1500
+ let { store: n } = e;
1501
+ function r(e, t) {
1502
+ n.$patDrafts.set({
1503
+ ...n.$patDrafts.get(),
1504
+ [e]: t
1505
+ });
1506
+ let r = { ...n.$patValidatedFor.get() };
1507
+ r[e] && (delete r[e], n.$patValidatedFor.set(r));
1508
+ }
1509
+ function i(e) {
1510
+ let t = { ...n.$patDrafts.get() };
1511
+ delete t[e], n.$patDrafts.set(t);
1512
+ let r = { ...n.$patValidatedFor.get() };
1513
+ delete r[e], n.$patValidatedFor.set(r);
1514
+ let i = { ...n.$patErrors.get() };
1515
+ delete i[e], n.$patErrors.set(i);
1516
+ }
1517
+ async function a(e) {
1518
+ try {
1519
+ let t = await fetch("https://api.github.com/user", { headers: {
1520
+ Authorization: `Bearer ${e}`,
1521
+ Accept: "application/vnd.github+json",
1522
+ "X-GitHub-Api-Version": "2022-11-28"
1523
+ } });
1524
+ if (t.status === 401) return {
1525
+ ok: !1,
1526
+ error: "GitHub rejected the token (401)."
1527
+ };
1528
+ if (!t.ok) return {
1529
+ ok: !1,
1530
+ error: `GitHub /user returned ${t.status}.`
1531
+ };
1532
+ let n = await t.json();
1533
+ if (!n.login) return {
1534
+ ok: !1,
1535
+ error: "GitHub response missing login."
1536
+ };
1537
+ let r = t.headers.get("x-oauth-scopes") ?? "", i = t.headers.get("x-github-authentication-token-type") ?? t.headers.get("x-github-token-type") ?? "unknown", a = r.split(",").map((e) => e.trim()).filter(Boolean);
1538
+ return {
1539
+ ok: !0,
1540
+ login: n.login,
1541
+ scopes: a,
1542
+ tokenType: i
1543
+ };
1544
+ } catch (e) {
1545
+ return {
1546
+ ok: !1,
1547
+ error: e instanceof Error ? e.message : "Network error"
1548
+ };
1549
+ }
1550
+ }
1551
+ async function o(e) {
1552
+ let t = n.$patDrafts.get()[e] ?? "";
1553
+ if (!t) return {
1554
+ ok: !1,
1555
+ error: "No PAT entered"
1556
+ };
1557
+ n.$patValidatingFor.set({
1558
+ ...n.$patValidatingFor.get(),
1559
+ [e]: !0
1560
+ }), n.$patErrors.set({
1561
+ ...n.$patErrors.get(),
1562
+ [e]: null
1563
+ });
1564
+ let r = { ...n.$patValidatedFor.get() };
1565
+ delete r[e], n.$patValidatedFor.set(r);
1566
+ let i = await a(t), o = { ...n.$patValidatingFor.get() };
1567
+ return delete o[e], n.$patValidatingFor.set(o), i.ok ? (n.$patValidatedFor.set({
1568
+ ...n.$patValidatedFor.get(),
1569
+ [e]: {
1570
+ login: i.login,
1571
+ scopes: i.scopes,
1572
+ tokenType: i.tokenType
1573
+ }
1574
+ }), { ok: !0 }) : (n.$patErrors.set({
1575
+ ...n.$patErrors.get(),
1576
+ [e]: i.error
1577
+ }), i);
1578
+ }
1579
+ async function s(e, r) {
1580
+ let a = n.$patDrafts.get()[e] ?? "";
1581
+ if (!a) return {
1582
+ ok: !1,
1583
+ error: "No PAT entered"
1584
+ };
1585
+ let o = n.$patValidatedFor.get()[e] ?? null;
1586
+ n.$patSavingFor.set({
1587
+ ...n.$patSavingFor.get(),
1588
+ [e]: !0
1589
+ }), n.$patErrors.set({
1590
+ ...n.$patErrors.get(),
1591
+ [e]: null
1592
+ });
1593
+ let s = await t.addToken({
1594
+ tokenName: r,
1595
+ service: "github",
1596
+ tokenValue: a,
1597
+ description: o ? `GitHub PAT for ${o.login}` : "GitHub PAT"
1598
+ }), c = { ...n.$patSavingFor.get() };
1599
+ return delete c[e], n.$patSavingFor.set(c), s.ok ? i(e) : n.$patErrors.set({
1600
+ ...n.$patErrors.get(),
1601
+ [e]: s.error
1602
+ }), s;
1603
+ }
1604
+ return {
1605
+ setPatDraft: r,
1606
+ clearPatState: i,
1607
+ validateGithubPat: a,
1608
+ validatePatForGuild: o,
1609
+ savePatForGuild: s
1610
+ };
1611
+ }
1612
+ //#endregion
1613
+ //#region packages/npm/droid/src/lib/agents/generated/discordsh-agents-schema.ts
1614
+ var dn = y({
1615
+ id: j(),
1616
+ owner: _(),
1617
+ repo: _(),
1618
+ number: j(),
1619
+ event_type: _(),
1620
+ actor: _().nullish(),
1621
+ delivery_state: j(),
1622
+ delivery_attempts: j(),
1623
+ created_at: _(),
1624
+ claimed_at: _().nullish()
1625
+ }), fn = y({
1626
+ id: j(),
1627
+ owner: _(),
1628
+ repo: _(),
1629
+ number: j(),
1630
+ event_type: _(),
1631
+ actor: _().nullish(),
1632
+ delivery_attempts: j(),
1633
+ last_error: _().nullish(),
1634
+ created_at: _(),
1635
+ updated_at: _()
1636
+ }), pn = y({
1637
+ last_delivered_at: _().nullish(),
1638
+ last_recorded_at: _().nullish(),
1639
+ pending_count: j(),
1640
+ in_flight_count: j(),
1641
+ delivered_count: j(),
1642
+ failed_count: j(),
1643
+ oldest_pending_at: _().nullish()
1644
+ }), mn = y({
1645
+ id: j(),
1646
+ guid: _(),
1647
+ delivered_at: _(),
1648
+ redelivery: D(),
1649
+ duration: j(),
1650
+ status: _(),
1651
+ status_code: j(),
1652
+ event: _(),
1653
+ action: _().nullish()
1654
+ }), hn = y({
1655
+ id: j(),
1656
+ name: _(),
1657
+ active: D(),
1658
+ events: de(_()),
1659
+ url: _().nullish(),
1660
+ is_kbve: D(),
1661
+ updated_at: _()
1662
+ });
1663
+ y({
1664
+ default_repo: _().optional(),
1665
+ claim_channel_id: _().optional(),
1666
+ forum_channel_id: _().optional(),
1667
+ noticeboard_channel_id: _().optional(),
1668
+ taskboard_channel_id: _().optional(),
1669
+ max_assignees: j().optional(),
1670
+ mirror_pr_events: D().optional(),
1671
+ active: D().optional()
1672
+ });
1673
+ //#endregion
1674
+ //#region packages/npm/droid/src/lib/agents/github/webhook.ts
1675
+ function gn(e, t) {
1676
+ let { store: n, endpoints: r } = e;
1677
+ function i(e, t) {
1678
+ let r = { ...n.$webhookDrafts.get() };
1679
+ t === null ? delete r[e] : r[e] = t, n.$webhookDrafts.set(r);
1680
+ }
1681
+ function a(e) {
1682
+ let t = { ...n.$webhookErrors.get() };
1683
+ delete t[e], n.$webhookErrors.set(t);
1684
+ }
1685
+ async function o(e, r, a) {
1686
+ let o = n.$webhookDrafts.get()[e];
1687
+ if (!o) return {
1688
+ ok: !1,
1689
+ error: "No secret to save"
1690
+ };
1691
+ n.$webhookSavingFor.set({
1692
+ ...n.$webhookSavingFor.get(),
1693
+ [e]: !0
1694
+ }), n.$webhookErrors.set({
1695
+ ...n.$webhookErrors.get(),
1696
+ [e]: null
1697
+ });
1698
+ let s = await t.addToken({
1699
+ tokenName: r,
1700
+ service: "github_webhook",
1701
+ tokenValue: o,
1702
+ description: a
1703
+ }), c = { ...n.$webhookSavingFor.get() };
1704
+ return delete c[e], n.$webhookSavingFor.set(c), s.ok ? i(e, null) : n.$webhookErrors.set({
1705
+ ...n.$webhookErrors.get(),
1706
+ [e]: s.error
1707
+ }), s;
1708
+ }
1709
+ async function s(t, n, i) {
1710
+ let a = await e.callJson(r.ghAdmin, {
1711
+ command: "webhooks.install",
1712
+ server_id: t,
1713
+ owner: n,
1714
+ repo: i
1715
+ });
1716
+ return a.ok ? {
1717
+ ok: !0,
1718
+ installed: !!a.data.installed,
1719
+ alreadyPresent: !!a.data.already_present,
1720
+ hookId: a.data.hook_id ?? null
1721
+ } : a;
1722
+ }
1723
+ async function c(t, n, i) {
1724
+ let a = await e.callJson(r.ghAdmin, {
1725
+ command: "webhooks.ping",
1726
+ server_id: t,
1727
+ owner: n,
1728
+ repo: i
1729
+ });
1730
+ return a.ok ? {
1731
+ ok: !0,
1732
+ hookId: a.data.hook_id,
1733
+ url: a.data.url
1734
+ } : {
1735
+ ok: !1,
1736
+ error: a.error
1737
+ };
1738
+ }
1739
+ async function l(t, n, i) {
1740
+ let a = await e.callJson(r.ghAdmin, {
1741
+ command: "webhooks.list",
1742
+ server_id: t,
1743
+ owner: n,
1744
+ repo: i
1745
+ });
1746
+ if (!a.ok) return a;
1747
+ let o = hn.array().safeParse(a.data.hooks ?? []);
1748
+ return o.success ? {
1749
+ ok: !0,
1750
+ expectedUrl: a.data.expected_url,
1751
+ hooks: o.data
1752
+ } : {
1753
+ ok: !1,
1754
+ error: "Webhook list failed schema validation"
1755
+ };
1756
+ }
1757
+ function u(e, t) {
1758
+ n.$webhookInstallSelected.set({
1759
+ ...n.$webhookInstallSelected.get(),
1760
+ [e]: t
1761
+ });
1762
+ }
1763
+ function d(e) {
1764
+ let t = { ...n.$webhookInstallResults.get() };
1765
+ delete t[e], n.$webhookInstallResults.set(t);
1766
+ }
1767
+ async function f(e) {
1768
+ let [t, r] = (n.$webhookInstallSelected.get()[e] ?? "").split("/");
1769
+ if (!t || !r) return;
1770
+ n.$webhookInstallBusyFor.set({
1771
+ ...n.$webhookInstallBusyFor.get(),
1772
+ [e]: !0
1773
+ });
1774
+ let i = { ...n.$webhookInstallResults.get() };
1775
+ delete i[e], n.$webhookInstallResults.set(i);
1776
+ let a = await s(e, t, r), o = { ...n.$webhookInstallBusyFor.get() };
1777
+ delete o[e], n.$webhookInstallBusyFor.set(o), n.$webhookInstallResults.set({
1778
+ ...n.$webhookInstallResults.get(),
1779
+ [e]: a
1780
+ });
1781
+ }
1782
+ async function p(e) {
1783
+ let [t, r] = (n.$webhookInstallSelected.get()[e] ?? "").split("/");
1784
+ if (!t || !r) return;
1785
+ n.$webhookPingBusyFor.set({
1786
+ ...n.$webhookPingBusyFor.get(),
1787
+ [e]: !0
1788
+ });
1789
+ let i = await c(e, t, r), a = { ...n.$webhookPingBusyFor.get() };
1790
+ delete a[e], n.$webhookPingBusyFor.set(a);
1791
+ let o = i.ok ? {
1792
+ ok: !0,
1793
+ hookId: i.hookId,
1794
+ at: Date.now()
1795
+ } : {
1796
+ ok: !1,
1797
+ error: i.error
1798
+ };
1799
+ n.$webhookPingResults.set({
1800
+ ...n.$webhookPingResults.get(),
1801
+ [e]: o
1802
+ });
1803
+ }
1804
+ async function m(e, t) {
1805
+ let [r, i] = t.split("/");
1806
+ if (!r || !i) return;
1807
+ let a = n.$webhookInstallResults.get()[e];
1808
+ if (a && a.ok && (a.installed || a.alreadyPresent)) return;
1809
+ let o = await l(e, r, i);
1810
+ if (!o.ok) return;
1811
+ let s = o.hooks.find((e) => e.is_kbve);
1812
+ s && n.$webhookInstallResults.set({
1813
+ ...n.$webhookInstallResults.get(),
1814
+ [e]: {
1815
+ ok: !0,
1816
+ installed: !1,
1817
+ alreadyPresent: !0,
1818
+ hookId: s.id
1819
+ }
1820
+ });
1821
+ }
1822
+ async function h(i, a, o) {
1823
+ n.$webhookRotateBusyFor.set({
1824
+ ...n.$webhookRotateBusyFor.get(),
1825
+ [i]: !0
1826
+ });
1827
+ let s = await e.callJson(r.ghAdmin, {
1828
+ command: "webhooks.rotate",
1829
+ server_id: i,
1830
+ owner: a,
1831
+ repo: o
1832
+ }), c = { ...n.$webhookRotateBusyFor.get() };
1833
+ delete c[i], n.$webhookRotateBusyFor.set(c);
1834
+ let l = s.ok ? {
1835
+ ok: !0,
1836
+ hookId: s.data.hook_id,
1837
+ at: Date.now()
1838
+ } : {
1839
+ ok: !1,
1840
+ error: s.error
1841
+ };
1842
+ n.$webhookRotateResults.set({
1843
+ ...n.$webhookRotateResults.get(),
1844
+ [i]: l
1845
+ }), s.ok && await t.refreshSelectedGuild();
1846
+ }
1847
+ async function g(t, i, a) {
1848
+ n.$webhookDeleteBusyFor.set({
1849
+ ...n.$webhookDeleteBusyFor.get(),
1850
+ [t]: !0
1851
+ });
1852
+ let o = await e.callJson(r.ghAdmin, {
1853
+ command: "webhooks.delete",
1854
+ server_id: t,
1855
+ owner: i,
1856
+ repo: a
1857
+ }), s = { ...n.$webhookDeleteBusyFor.get() };
1858
+ if (delete s[t], n.$webhookDeleteBusyFor.set(s), !o.ok) return {
1859
+ ok: !1,
1860
+ error: o.error
1861
+ };
1862
+ let c = { ...n.$webhookInstallResults.get() };
1863
+ return delete c[t], n.$webhookInstallResults.set(c), { ok: !0 };
1864
+ }
1865
+ async function ee(t, i, a, o = 10) {
1866
+ let s = `${t}:${i}/${a}`;
1867
+ n.$webhookDeliveriesLoading.set({
1868
+ ...n.$webhookDeliveriesLoading.get(),
1869
+ [s]: !0
1870
+ }), n.$webhookDeliveriesError.set({
1871
+ ...n.$webhookDeliveriesError.get(),
1872
+ [s]: null
1873
+ });
1874
+ let c = await e.callJson(r.ghAdmin, {
1875
+ command: "webhooks.deliveries",
1876
+ server_id: t,
1877
+ owner: i,
1878
+ repo: a,
1879
+ limit: o
1880
+ }), l = { ...n.$webhookDeliveriesLoading.get() };
1881
+ if (delete l[s], n.$webhookDeliveriesLoading.set(l), !c.ok) {
1882
+ n.$webhookDeliveriesError.set({
1883
+ ...n.$webhookDeliveriesError.get(),
1884
+ [s]: c.error
1885
+ });
1886
+ return;
1887
+ }
1888
+ let u = mn.array().safeParse(c.data.deliveries ?? []);
1889
+ if (!u.success) {
1890
+ n.$webhookDeliveriesError.set({
1891
+ ...n.$webhookDeliveriesError.get(),
1892
+ [s]: "Delivery list failed schema validation"
1893
+ });
1894
+ return;
1895
+ }
1896
+ n.$webhookDeliveries.set({
1897
+ ...n.$webhookDeliveries.get(),
1898
+ [s]: u.data
1899
+ });
1900
+ }
1901
+ function te(e) {
1902
+ return `${r.ghWebhookBase}/${e}`;
1903
+ }
1904
+ return {
1905
+ setWebhookDraft: i,
1906
+ clearWebhookError: a,
1907
+ saveWebhookDraft: o,
1908
+ installRepoWebhook: s,
1909
+ pingRepoWebhook: c,
1910
+ listRepoWebhooks: l,
1911
+ setWebhookInstallSelected: u,
1912
+ clearWebhookInstallResult: d,
1913
+ installWebhookForGuild: f,
1914
+ pingWebhookForGuild: p,
1915
+ verifyWebhookInstall: m,
1916
+ rotateWebhookForGuild: h,
1917
+ deleteWebhookForGuild: g,
1918
+ loadWebhookDeliveries: ee,
1919
+ webhookUrlFor: te
1920
+ };
1921
+ }
1922
+ //#endregion
1923
+ //#region packages/npm/droid/src/lib/agents/github/backfill.ts
1924
+ function _n(e) {
1925
+ let { store: t, endpoints: n } = e;
1926
+ function r(e, n) {
1927
+ let r = t.$backfillDrafts.get(), i = r[e] ?? {
1928
+ owner: "",
1929
+ repo: ""
1930
+ };
1931
+ t.$backfillDrafts.set({
1932
+ ...r,
1933
+ [e]: {
1934
+ ...i,
1935
+ ...n
1936
+ }
1937
+ });
1938
+ }
1939
+ function i(e) {
1940
+ let n = { ...t.$backfillResults.get() };
1941
+ delete n[e], t.$backfillResults.set(n);
1942
+ }
1943
+ async function a(e) {
1944
+ let r = t.$accessToken.get(), i = t.$selectedGuildId.get();
1945
+ if (!r || !i) return {
1946
+ ok: !1,
1947
+ error: "No guild selected or session missing"
1948
+ };
1949
+ try {
1950
+ let t = await fetch(n.ghBackfill, {
1951
+ method: "POST",
1952
+ headers: {
1953
+ "Content-Type": "application/json",
1954
+ Authorization: `Bearer ${r}`
1955
+ },
1956
+ body: JSON.stringify({
1957
+ owner: e.owner,
1958
+ repo: e.repo,
1959
+ guild_id: i,
1960
+ state: e.state ?? "open",
1961
+ max_pages: e.maxPages ?? 1,
1962
+ per_page: e.perPage ?? 30
1963
+ })
1964
+ }), a = await t.text(), o;
1965
+ try {
1966
+ o = JSON.parse(a);
1967
+ } catch {
1968
+ return {
1969
+ ok: !1,
1970
+ error: `HTTP ${t.status}: ${a.slice(0, 200)}`
1971
+ };
1972
+ }
1973
+ if (!t.ok) return {
1974
+ ok: !1,
1975
+ error: o?.error ?? `HTTP ${t.status}`
1976
+ };
1977
+ let s = o;
1978
+ return {
1979
+ ok: !0,
1980
+ upserted: s.upserted ?? 0,
1981
+ pages: s.pages_walked ?? 0,
1982
+ rateLimitRemaining: s.rate_limit_remaining ?? null
1983
+ };
1984
+ } catch (e) {
1985
+ return {
1986
+ ok: !1,
1987
+ error: e instanceof Error ? e.message : "Network error"
1988
+ };
1989
+ }
1990
+ }
1991
+ async function o(e) {
1992
+ let n = t.$backfillDrafts.get()[e] ?? {
1993
+ owner: "",
1994
+ repo: ""
1995
+ };
1996
+ if (!n.owner || !n.repo) return;
1997
+ t.$backfillBusyFor.set({
1998
+ ...t.$backfillBusyFor.get(),
1999
+ [e]: !0
2000
+ });
2001
+ let r = { ...t.$backfillResults.get() };
2002
+ delete r[e], t.$backfillResults.set(r);
2003
+ let i = await a({
2004
+ owner: n.owner,
2005
+ repo: n.repo,
2006
+ state: "open",
2007
+ maxPages: 1,
2008
+ perPage: 30
2009
+ }), o = { ...t.$backfillBusyFor.get() };
2010
+ delete o[e], t.$backfillBusyFor.set(o), t.$backfillResults.set({
2011
+ ...t.$backfillResults.get(),
2012
+ [e]: i
2013
+ });
2014
+ }
2015
+ return {
2016
+ patchBackfillDraft: r,
2017
+ clearBackfillResult: i,
2018
+ runBackfill: a,
2019
+ runBackfillForGuild: o
2020
+ };
2021
+ }
2022
+ //#endregion
2023
+ //#region packages/npm/droid/src/lib/agents/github/events.ts
2024
+ function vn(e, t) {
2025
+ let { store: n, endpoints: r } = e;
2026
+ async function i(t) {
2027
+ n.$eventStatsLoading.set({
2028
+ ...n.$eventStatsLoading.get(),
2029
+ [t]: !0
2030
+ });
2031
+ let i = await e.callJson(r.ghAdmin, {
2032
+ command: "events.stats",
2033
+ server_id: t
2034
+ }), a = { ...n.$eventStatsLoading.get() };
2035
+ if (delete a[t], n.$eventStatsLoading.set(a), !i.ok) return;
2036
+ let o = pn.safeParse(i.data);
2037
+ o.success && n.$eventStats.set({
2038
+ ...n.$eventStats.get(),
2039
+ [t]: o.data
2040
+ });
2041
+ }
2042
+ async function a(t, i = 10) {
2043
+ n.$failedEventsLoading.set({
2044
+ ...n.$failedEventsLoading.get(),
2045
+ [t]: !0
2046
+ });
2047
+ let a = await e.callJson(r.ghAdmin, {
2048
+ command: "events.failed",
2049
+ server_id: t,
2050
+ limit: i
2051
+ }), o = { ...n.$failedEventsLoading.get() };
2052
+ if (delete o[t], n.$failedEventsLoading.set(o), !a.ok) return;
2053
+ let s = fn.array().safeParse(a.data.events ?? []);
2054
+ s.success && n.$failedEvents.set({
2055
+ ...n.$failedEvents.get(),
2056
+ [t]: s.data
2057
+ });
2058
+ }
2059
+ async function o(t, i = 10) {
2060
+ n.$pendingEventsLoading.set({
2061
+ ...n.$pendingEventsLoading.get(),
2062
+ [t]: !0
2063
+ });
2064
+ let a = await e.callJson(r.ghAdmin, {
2065
+ command: "events.pending",
2066
+ server_id: t,
2067
+ limit: i
2068
+ }), o = { ...n.$pendingEventsLoading.get() };
2069
+ if (delete o[t], n.$pendingEventsLoading.set(o), !a.ok) return;
2070
+ let s = dn.array().safeParse(a.data.events ?? []);
2071
+ s.success && n.$pendingEvents.set({
2072
+ ...n.$pendingEvents.get(),
2073
+ [t]: s.data
2074
+ });
2075
+ }
2076
+ async function s(i, a, o) {
2077
+ let s = `${i}:${a}`;
2078
+ n.$eventRequeueBusyFor.set({
2079
+ ...n.$eventRequeueBusyFor.get(),
2080
+ [s]: !0
2081
+ });
2082
+ let c = typeof o == "string" && o.trim().length > 0 ? o.trim().slice(0, 512) : void 0, l = await e.callJson(r.ghAdmin, {
2083
+ command: "events.requeue",
2084
+ server_id: i,
2085
+ event_id: a,
2086
+ ...c ? { reason: c } : {}
2087
+ }), u = { ...n.$eventRequeueBusyFor.get() };
2088
+ if (delete u[s], n.$eventRequeueBusyFor.set(u), !l.ok) return {
2089
+ ok: !1,
2090
+ error: l.error
2091
+ };
2092
+ let d = n.$failedEvents.get()[i] ?? [];
2093
+ return n.$failedEvents.set({
2094
+ ...n.$failedEvents.get(),
2095
+ [i]: d.filter((e) => e.id !== a)
2096
+ }), t.loadEventStats(i), { ok: !0 };
2097
+ }
2098
+ return {
2099
+ loadEventStats: i,
2100
+ loadFailedEvents: a,
2101
+ loadPendingEvents: o,
2102
+ requeueEvent: s
2103
+ };
2104
+ }
2105
+ //#endregion
2106
+ //#region packages/npm/droid/src/lib/agents/createAgents.ts
2107
+ function yn(e) {
2108
+ let t = Ht(e), n = Gt(), r = Kt(), i = {
2109
+ config: t,
2110
+ endpoints: Ut(t.supabaseUrl),
2111
+ store: n,
2112
+ runtime: r,
2113
+ callJson: (() => {
2114
+ throw Error("agents: callJson used before init");
2115
+ }),
2116
+ callGuildVault: (() => {
2117
+ throw Error("agents: callGuildVault used before init");
2118
+ }),
2119
+ resyncOwnedGuilds: async () => !1
2120
+ }, a = { ...n };
2121
+ i.callJson = qt(i), i.callGuildVault = Jt(i);
2122
+ let o = nn(i, a);
2123
+ return i.resyncOwnedGuilds = o.resyncOwnedGuilds, Object.assign(a, o, rn(i, a), sn(i, a), ln(i, a), un(i, a), an(i), gn(i, a), _n(i), vn(i, a)), a;
2124
+ }
2125
+ //#endregion
2126
+ //#region packages/npm/droid/src/lib/api.ts
2127
+ var bn = class extends Error {
2128
+ status;
2129
+ code;
2130
+ constructor(e, t, n) {
2131
+ super(e), this.name = "ApiError", this.status = t, this.code = n;
2132
+ }
61
2133
  };
62
- export {
63
- J as BENTO_ANIMATIONS,
64
- o as BENTO_ANIMATION_CLASS_MAP,
65
- y as BENTO_BADGE_CLASS_MAP,
66
- m as BENTO_BADGE_TYPES,
67
- d as BENTO_ROLES,
68
- c as BENTO_TARGETS,
69
- b as BENTO_VARIANTS,
70
- X as BENTO_VARIANT_CLASS_MAP,
71
- Y as BentoTileSchema,
72
- k as droid,
73
- n as modUrls,
74
- V as workerStrings,
75
- s as workerURLs
2134
+ async function xn(e) {
2135
+ let t = "", n;
2136
+ try {
2137
+ let r = await e.text();
2138
+ try {
2139
+ let e = JSON.parse(r);
2140
+ t = e.message || e.error || e.detail || r, n = e.error;
2141
+ } catch {
2142
+ t = r;
2143
+ }
2144
+ } catch {}
2145
+ return new bn(t || e.statusText, e.status, n);
2146
+ }
2147
+ async function Sn(e, t = {}) {
2148
+ let { token: n, apiBase: r = "", ...i } = t, a = new Headers(i.headers);
2149
+ n && a.set("Authorization", `Bearer ${n}`), a.has("Accept") || a.set("Accept", "application/json"), i.body && !a.has("Content-Type") && a.set("Content-Type", "application/json");
2150
+ let o = await fetch(`${r}${e}`, {
2151
+ ...i,
2152
+ headers: a
2153
+ });
2154
+ if (!o.ok) throw await xn(o);
2155
+ if (o.status !== 204) return await o.json();
2156
+ }
2157
+ //#endregion
2158
+ //#region packages/npm/droid/src/lib/workers/validate.ts
2159
+ var Cn = {
2160
+ toast: E,
2161
+ "tooltip-open": w,
2162
+ "modal-open": T
2163
+ };
2164
+ function wn(e, t) {
2165
+ let n = Cn[e];
2166
+ if (n) {
2167
+ let r = n.safeParse(t);
2168
+ if (!r.success) throw Error(`[KBVE Worker] Invalid ${e} payload: ${r.error.message}`);
2169
+ return {
2170
+ type: e,
2171
+ payload: r.data
2172
+ };
2173
+ }
2174
+ if ((e === "toast-remove" || e === "tooltip-close" || e === "modal-close") && (!t || typeof t.id != "string")) throw Error(`[KBVE Worker] ${e} requires { id: string }`);
2175
+ return {
2176
+ type: e,
2177
+ payload: t
2178
+ };
2179
+ }
2180
+ //#endregion
2181
+ //#region packages/npm/droid/src/lib/workers/canvas-ui-renderer.ts
2182
+ var Tn = {
2183
+ success: {
2184
+ bg: "#065f46",
2185
+ border: "#10b981",
2186
+ text: "#d1fae5"
2187
+ },
2188
+ warning: {
2189
+ bg: "#78350f",
2190
+ border: "#f59e0b",
2191
+ text: "#fef3c7"
2192
+ },
2193
+ error: {
2194
+ bg: "#7f1d1d",
2195
+ border: "#ef4444",
2196
+ text: "#fee2e2"
2197
+ },
2198
+ info: {
2199
+ bg: "#1e3a5f",
2200
+ border: "#3b82f6",
2201
+ text: "#dbeafe"
2202
+ }
2203
+ }, En = class {
2204
+ ctx = null;
2205
+ canvas = null;
2206
+ toasts = [];
2207
+ tooltip = null;
2208
+ modal = null;
2209
+ theme = {
2210
+ accent: "#8b5cf6",
2211
+ accentLow: "#1e1033",
2212
+ accentHigh: "#c4b5fd",
2213
+ bg: "#0a0a0a",
2214
+ bgAccent: "#3b1f6e",
2215
+ text: "#e0e0e0",
2216
+ textAccent: "#a78bfa",
2217
+ border: "#4c1d95",
2218
+ white: "#ffffff",
2219
+ black: "#000000",
2220
+ mode: "dark"
2221
+ };
2222
+ animFrame = null;
2223
+ dbGet = null;
2224
+ async bind(e, t) {
2225
+ this.canvas = e, this.ctx = e.getContext("2d"), this.dbGet = t, await this.refreshTheme(), this.startLoop();
2226
+ }
2227
+ async refreshTheme() {
2228
+ this.dbGet && (this.theme = {
2229
+ accent: await this.dbGet("theme:accent") ?? "#8b5cf6",
2230
+ accentLow: await this.dbGet("theme:accent-low") ?? "#1e1033",
2231
+ accentHigh: await this.dbGet("theme:accent-high") ?? "#c4b5fd",
2232
+ bg: await this.dbGet("theme:bg") ?? "#0a0a0a",
2233
+ bgAccent: await this.dbGet("theme:bg-accent") ?? "#3b1f6e",
2234
+ text: await this.dbGet("theme:text") ?? "#e0e0e0",
2235
+ textAccent: await this.dbGet("theme:text-accent") ?? "#a78bfa",
2236
+ border: await this.dbGet("theme:border") ?? "#4c1d95",
2237
+ white: await this.dbGet("theme:white") ?? "#ffffff",
2238
+ black: await this.dbGet("theme:black") ?? "#000000",
2239
+ mode: await this.dbGet("theme:mode") ?? "dark"
2240
+ });
2241
+ }
2242
+ addToast(e) {
2243
+ let t = 20 + this.toasts.length * 80;
2244
+ this.toasts.push({
2245
+ ...e,
2246
+ createdAt: Date.now(),
2247
+ opacity: 0,
2248
+ y: t - 20,
2249
+ targetY: t
2250
+ });
2251
+ }
2252
+ removeToast(e) {
2253
+ let t = this.toasts.findIndex((t) => t.id === e);
2254
+ t !== -1 && this.toasts.splice(t, 1), this.recalcPositions();
2255
+ }
2256
+ showTooltip(e) {
2257
+ this.tooltip = e;
2258
+ }
2259
+ showModal(e) {
2260
+ this.modal = e;
2261
+ }
2262
+ recalcPositions() {
2263
+ this.toasts.forEach((e, t) => {
2264
+ e.targetY = 20 + t * 80;
2265
+ });
2266
+ }
2267
+ startLoop() {
2268
+ let e = () => {
2269
+ this.render(), this.animFrame = requestAnimationFrame(e);
2270
+ };
2271
+ e();
2272
+ }
2273
+ render() {
2274
+ if (!this.ctx || !this.canvas) return;
2275
+ let { width: e, height: t } = this.canvas;
2276
+ this.ctx.clearRect(0, 0, e, t);
2277
+ let n = Date.now();
2278
+ this.toasts = this.toasts.filter((e) => !(e.duration && e.duration > 0 && n - e.createdAt > e.duration)), this.recalcPositions();
2279
+ for (let t of this.toasts) t.opacity < 1 && (t.opacity = Math.min(1, t.opacity + .05)), t.y += (t.targetY - t.y) * .15, this.drawToast(t, e);
2280
+ this.modal && this.drawModal(e, t);
2281
+ }
2282
+ drawToast(e, t) {
2283
+ if (!this.ctx) return;
2284
+ let n = this.ctx, r = t - 320 - 20, i = e.y, a = Tn[e.severity] ?? Tn.info;
2285
+ n.globalAlpha = e.opacity, n.fillStyle = a.bg, this.roundRect(n, r, i, 320, 64, 8), n.fill(), n.strokeStyle = a.border, n.lineWidth = 1.5, this.roundRect(n, r, i, 320, 64, 8), n.stroke(), n.fillStyle = a.text, n.font = "14px system-ui, -apple-system, sans-serif", n.fillText(e.message, r + 12, i + 24, 296), n.font = "bold 10px system-ui, sans-serif", n.fillStyle = a.border, n.fillText(e.severity.toUpperCase(), r + 12, i + 48), n.globalAlpha = 1;
2286
+ }
2287
+ drawModal(e, t) {
2288
+ if (!this.ctx || !this.modal) return;
2289
+ let n = this.ctx;
2290
+ n.fillStyle = "rgba(0, 0, 0, 0.5)", n.fillRect(0, 0, e, t);
2291
+ let r = Math.min(500, e - 40), i = (e - r) / 2, a = (t - 300) / 2;
2292
+ n.fillStyle = this.theme.bg, this.roundRect(n, i, a, r, 300, 12), n.fill(), n.strokeStyle = this.theme.border, n.lineWidth = 1, this.roundRect(n, i, a, r, 300, 12), n.stroke(), this.modal.title && (n.fillStyle = this.theme.text, n.font = "bold 18px system-ui, sans-serif", n.fillText(this.modal.title, i + 20, a + 36, r - 40)), n.fillStyle = this.theme.textAccent, n.font = "12px system-ui, sans-serif", n.fillText(this.modal.id, i + 20, a + 60, r - 40);
2293
+ }
2294
+ roundRect(e, t, n, r, i, a) {
2295
+ e.beginPath(), e.moveTo(t + a, n), e.lineTo(t + r - a, n), e.quadraticCurveTo(t + r, n, t + r, n + a), e.lineTo(t + r, n + i - a), e.quadraticCurveTo(t + r, n + i, t + r - a, n + i), e.lineTo(t + a, n + i), e.quadraticCurveTo(t, n + i, t, n + i - a), e.lineTo(t, n + a), e.quadraticCurveTo(t, n, t + a, n), e.closePath();
2296
+ }
2297
+ unbind() {
2298
+ this.animFrame !== null && (cancelAnimationFrame(this.animFrame), this.animFrame = null), this.ctx = null, this.canvas = null, this.toasts = [], this.tooltip = null, this.modal = null;
2299
+ }
2300
+ }, Dn = "/lib/workers/canvas-worker.js", On = "/lib/workers/db-worker.js", kn = "/lib/workers/ws-worker.js", An = {
2301
+ canvasWorker: Dn,
2302
+ dbWorker: On,
2303
+ wsWorker: kn,
2304
+ supabaseSharedWorker: re,
2305
+ supabaseDbWorker: k
2306
+ }, jn = {
2307
+ canvasWorker: Dn,
2308
+ dbWorker: On,
2309
+ wsWorker: kn,
2310
+ supabaseSharedWorker: re,
2311
+ supabaseDbWorker: k
76
2312
  };
2313
+ //#endregion
2314
+ export { h as $activeTooltip, C as $auth, F as $bentoLedger, P as $bentoShipment, N as $currentPath, ee as $drawerOpen, Ie as $isStaff, s as $modalId, L as $profileCache, B as $staffPermissions, l as $toasts, bn as ApiError, f as AuthErrorSchema, ge as AuthFlags, b as AuthPresets, je as AuthReadySchema, Ue as BENTO_ANIMATIONS, Xe as BENTO_ANIMATION_CLASS_MAP, Ze as BENTO_BADGE_CLASS_MAP, Ke as BENTO_BADGE_TYPES, Ge as BENTO_ROLES, We as BENTO_TARGETS, M as BENTO_VARIANTS, Ye as BENTO_VARIANT_CLASS_MAP, Je as BentoTileSchema, ye as CanvasOptionsSchema, En as CanvasUIRenderer, r as DirectStrategy, d as DroidDownscaleSchema, ce as DroidEventSchemas, c as DroidEvents, se as DroidFirstConnectSchema, le as DroidModReadySchema, te as DroidReadySchema, e as DroidUpscaleSchema, ve as GatewayStrategyFallbackSchema, Fe as ModMetaSchema, T as ModalPayloadSchema, be as OverlayManager, I as PROFILE_CACHE_TTL_MS, pt as PROFILE_DEFAULT_API_BASE, Oe as PageLifecycleSchema, Me as PalworldLiveSnapshotSchema, Se as PanelEventSchema, Ae as PanelIdSchema, Ee as PanelPayloadSchema, xt as STAFF_CACHE_TTL_MS, ie as SharedWorkerStrategy, pe as SupabaseGateway, E as ToastPayloadSchema, he as ToastSeveritySchema, w as TooltipPayloadSchema, Le as TooltipPositionSchema, _e as VirtualNodeSchema, ze as WebWorkerStrategy, o as WorkerCommunication, fe as WorkerErrorSchema, g as WorkerPool, v as addToast, lt as advanceBentoShipment, Sn as apiFetch, Tt as applyStaffFlagFromCache, it as bootRouter, Et as bootStaffPermissions, cn as botConfigFromFormDraft, $ as botConfigToFormDraft, jt as broadcastProfileClear, At as broadcastProfileRefresh, Nt as broadcastStaffClear, Mt as broadcastStaffRefresh, ue as broadcastThemeChange, ht as clearProfileCache, Ct as clearStaffPermsCache, u as closeDrawer, p as closeModal, ne as closeTooltip, yn as createAgents, we as detectCapabilities, Y as disposeProfileSync, Pe as downscale, He as droid, Q as emptyBotConfigFormDraft, Xt as extractJwtOwnedGuildIds, _t as fetchAndCacheProfile, wt as fetchAndCacheStaffPermissions, z as fetchProfileFromApi, H as fetchStaffPermissionsFromApi, mt as getProfileFromCache, De as getScaleLevel, St as getStaffPermsFromCache, t as getStrategyDescription, a as getWorkerCommunication, ke as hasAuthFlag, zt as installProfileSync, kt as installSyncBusListener, Ce as logCapabilities, nt as modUrls, Re as observeThemeChanges, Ve as openDrawer, n as openModal, ae as openTooltip, Z as parseJwtPayload, vt as readProfileForFastPaint, gt as readSupabaseSessionFromStorage, Bt as refreshProfileSyncNow, oe as removeToast, Te as resetAuth, ut as resetBentoFlow, m as selectStrategy, x as setAuth, R as setProfileCache, V as setStaffPermsCache, ct as shipBentoWord, me as showWelcomeToast, tt as swRecovery, Be as syncThemeToDexie, Ne as upscale, wn as validateUIMessage, jn as workerStrings, An as workerURLs };