@rubytech/create-maxy-code 0.1.538 → 0.1.540

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 (279) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/agent-slug/dist/index.d.ts +31 -0
  3. package/payload/platform/lib/agent-slug/dist/index.d.ts.map +1 -0
  4. package/payload/platform/lib/agent-slug/dist/index.js +53 -0
  5. package/payload/platform/lib/agent-slug/dist/index.js.map +1 -0
  6. package/payload/platform/lib/agent-slug/src/index.ts +53 -0
  7. package/payload/platform/lib/agent-slug/tsconfig.json +8 -0
  8. package/payload/platform/package.json +2 -2
  9. package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
  10. package/payload/platform/plugins/admin/PLUGIN.md +33 -1
  11. package/payload/platform/plugins/admin/mcp/dist/index.js +136 -0
  12. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  13. package/payload/platform/plugins/admin/mcp/dist/tools/agent-config-schema.d.ts +9 -0
  14. package/payload/platform/plugins/admin/mcp/dist/tools/agent-config-schema.d.ts.map +1 -0
  15. package/payload/platform/plugins/admin/mcp/dist/tools/agent-config-schema.js +49 -0
  16. package/payload/platform/plugins/admin/mcp/dist/tools/agent-config-schema.js.map +1 -0
  17. package/payload/platform/plugins/admin/mcp/dist/tools/agent-write.d.ts +64 -0
  18. package/payload/platform/plugins/admin/mcp/dist/tools/agent-write.d.ts.map +1 -0
  19. package/payload/platform/plugins/admin/mcp/dist/tools/agent-write.js +151 -0
  20. package/payload/platform/plugins/admin/mcp/dist/tools/agent-write.js.map +1 -0
  21. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +108 -14
  22. package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +36 -20
  23. package/payload/platform/plugins/admin/skills/update-knowledge/SKILL.md +4 -3
  24. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +14 -0
  25. package/payload/platform/plugins/docs/references/admin-ui.md +73 -0
  26. package/payload/platform/plugins/docs/references/channel-wake-and-prompt.md +32 -11
  27. package/payload/platform/plugins/docs/references/internals.md +2 -2
  28. package/payload/platform/plugins/scheduling/PLUGIN.md +1 -1
  29. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-get-description.test.d.ts +2 -0
  30. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-get-description.test.d.ts.map +1 -0
  31. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-get-description.test.js +59 -0
  32. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-get-description.test.js.map +1 -0
  33. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.d.ts.map +1 -1
  34. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.js +6 -0
  35. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.js.map +1 -1
  36. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
  37. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +10 -6
  38. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
  39. package/payload/platform/plugins/whatsapp/PLUGIN.md +2 -2
  40. package/payload/platform/plugins/whatsapp/mcp/dist/index.js +6 -1
  41. package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
  42. package/payload/platform/plugins/whatsapp/skills/manage-whatsapp-config/SKILL.md +14 -8
  43. package/payload/platform/scripts/__tests__/check-plugin-tool-declarations.test.ts +51 -0
  44. package/payload/platform/scripts/check-plugin-tool-declarations.mjs +97 -0
  45. package/payload/platform/scripts/check-risk-class.mjs +5 -0
  46. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  47. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +8 -0
  48. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  49. package/payload/platform/services/claude-session-manager/dist/channel-targets.d.ts +3 -0
  50. package/payload/platform/services/claude-session-manager/dist/channel-targets.d.ts.map +1 -1
  51. package/payload/platform/services/claude-session-manager/dist/channel-targets.js.map +1 -1
  52. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  53. package/payload/platform/services/claude-session-manager/dist/http-server.js +20 -1
  54. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  55. package/payload/platform/services/claude-session-manager/dist/index.js +35 -18
  56. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  57. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  58. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +57 -8
  59. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  60. package/payload/platform/services/claude-session-manager/dist/public-knowledge-audit.d.ts +58 -0
  61. package/payload/platform/services/claude-session-manager/dist/public-knowledge-audit.d.ts.map +1 -0
  62. package/payload/platform/services/claude-session-manager/dist/public-knowledge-audit.js +152 -0
  63. package/payload/platform/services/claude-session-manager/dist/public-knowledge-audit.js.map +1 -0
  64. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.d.ts +4 -0
  65. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.d.ts.map +1 -1
  66. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.js +3 -0
  67. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.js.map +1 -1
  68. package/payload/platform/services/webchat-channel/dist/notification.d.ts +31 -0
  69. package/payload/platform/services/webchat-channel/dist/notification.d.ts.map +1 -1
  70. package/payload/platform/services/webchat-channel/dist/notification.js +31 -1
  71. package/payload/platform/services/webchat-channel/dist/notification.js.map +1 -1
  72. package/payload/platform/services/webchat-channel/dist/server.d.ts.map +1 -1
  73. package/payload/platform/services/webchat-channel/dist/server.js +15 -1
  74. package/payload/platform/services/webchat-channel/dist/server.js.map +1 -1
  75. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +40 -3
  76. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  77. package/payload/platform/services/whatsapp-channel/dist/notification.js +43 -4
  78. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  79. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  80. package/payload/platform/services/whatsapp-channel/dist/server.js +41 -25
  81. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  82. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts +1 -0
  83. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts.map +1 -1
  84. package/payload/platform/services/whatsapp-channel/dist/targets.js +9 -5
  85. package/payload/platform/services/whatsapp-channel/dist/targets.js.map +1 -1
  86. package/payload/server/{chunk-BP7LH7MC.js → chunk-CKTHAHL4.js} +26 -16
  87. package/payload/server/{chunk-IALJPXIO.js → chunk-ERIM3EFB.js} +1 -1
  88. package/payload/server/{chunk-FQO5RDWZ.js → chunk-TQTZXAK3.js} +124 -17
  89. package/payload/server/{manager-EBZQRV5V.js → manager-F6NXSOJW.js} +2 -2
  90. package/payload/server/maxy-edge.js +2 -2
  91. package/payload/server/public/activity.html +5 -5
  92. package/payload/server/public/agents.html +4 -4
  93. package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js +1 -0
  94. package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js.br +0 -0
  95. package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js.gz +0 -0
  96. package/payload/server/public/assets/AdminShell-DJL5DzRX.js +2 -0
  97. package/payload/server/public/assets/AdminShell-DJL5DzRX.js.br +0 -0
  98. package/payload/server/public/assets/AdminShell-DJL5DzRX.js.gz +0 -0
  99. package/payload/server/public/assets/activity-CpMnNr5c.js +1 -0
  100. package/payload/server/public/assets/activity-CpMnNr5c.js.br +0 -0
  101. package/payload/server/public/assets/activity-CpMnNr5c.js.gz +0 -0
  102. package/payload/server/public/assets/admin-CBwKIfaI.js +1 -0
  103. package/payload/server/public/assets/admin-CBwKIfaI.js.br +0 -0
  104. package/payload/server/public/assets/admin-CBwKIfaI.js.gz +0 -0
  105. package/payload/server/public/assets/agents-C4LmSKjb.js +1 -0
  106. package/payload/server/public/assets/agents-C4LmSKjb.js.br +0 -0
  107. package/payload/server/public/assets/agents-C4LmSKjb.js.gz +0 -0
  108. package/payload/server/public/assets/browser-Bm9xm_yc.js +1 -0
  109. package/payload/server/public/assets/browser-Bm9xm_yc.js.br +0 -0
  110. package/payload/server/public/assets/browser-Bm9xm_yc.js.gz +0 -0
  111. package/payload/server/public/assets/calendar-CNY9FTWe.js +1 -0
  112. package/payload/server/public/assets/calendar-CNY9FTWe.js.br +0 -0
  113. package/payload/server/public/assets/calendar-CNY9FTWe.js.gz +0 -0
  114. package/payload/server/public/assets/chat-3WoUGCTd.js +1 -0
  115. package/payload/server/public/assets/chat-3WoUGCTd.js.br +0 -0
  116. package/payload/server/public/assets/chat-3WoUGCTd.js.gz +0 -0
  117. package/payload/server/public/assets/chevron-left-BE16BJnw.js +1 -0
  118. package/payload/server/public/assets/chevron-left-BE16BJnw.js.br +0 -0
  119. package/payload/server/public/assets/chevron-right-Bu2VKpeU.js +1 -0
  120. package/payload/server/public/assets/chevron-right-Bu2VKpeU.js.br +0 -0
  121. package/payload/server/public/assets/clock-C4Nu2aRV.js +1 -0
  122. package/payload/server/public/assets/clock-C4Nu2aRV.js.br +0 -0
  123. package/payload/server/public/assets/copy-3kj9Oaoc.js +1 -0
  124. package/payload/server/public/assets/copy-3kj9Oaoc.js.br +0 -0
  125. package/payload/server/public/assets/copy-3kj9Oaoc.js.gz +0 -0
  126. package/payload/server/public/assets/data-C-x5EHyi.js +1 -0
  127. package/payload/server/public/assets/data-C-x5EHyi.js.br +1 -0
  128. package/payload/server/public/assets/data-C-x5EHyi.js.gz +0 -0
  129. package/payload/server/public/assets/file-text-CBaewT76.js +1 -0
  130. package/payload/server/public/assets/file-text-CBaewT76.js.br +0 -0
  131. package/payload/server/public/assets/file-text-CBaewT76.js.gz +0 -0
  132. package/payload/server/public/assets/{graph-Bo-WcsKS.js → graph-B8-e2_Z-.js} +3 -3
  133. package/payload/server/public/assets/graph-B8-e2_Z-.js.br +0 -0
  134. package/payload/server/public/assets/graph-B8-e2_Z-.js.gz +0 -0
  135. package/payload/server/public/assets/graph-labels-Bsc23eZU.js +1 -0
  136. package/payload/server/public/assets/graph-labels-Bsc23eZU.js.br +0 -0
  137. package/payload/server/public/assets/graph-labels-Bsc23eZU.js.gz +0 -0
  138. package/payload/server/public/assets/operator-Cve0-qfO.js +1 -0
  139. package/payload/server/public/assets/operator-Cve0-qfO.js.br +0 -0
  140. package/payload/server/public/assets/operator-Cve0-qfO.js.gz +0 -0
  141. package/payload/server/public/assets/page-BgVMs6Vf.js +1 -0
  142. package/payload/server/public/assets/page-BgVMs6Vf.js.br +0 -0
  143. package/payload/server/public/assets/page-BgVMs6Vf.js.gz +0 -0
  144. package/payload/server/public/assets/page-fABub-w8.js +32 -0
  145. package/payload/server/public/assets/page-fABub-w8.js.br +0 -0
  146. package/payload/server/public/assets/page-fABub-w8.js.gz +0 -0
  147. package/payload/server/public/assets/play-B6zXB9K7.js +1 -0
  148. package/payload/server/public/assets/play-B6zXB9K7.js.br +0 -0
  149. package/payload/server/public/assets/play-B6zXB9K7.js.gz +0 -0
  150. package/payload/server/public/assets/public--R2DbdWs.js +1 -0
  151. package/payload/server/public/assets/public--R2DbdWs.js.br +0 -0
  152. package/payload/server/public/assets/public--R2DbdWs.js.gz +0 -0
  153. package/payload/server/public/assets/rotate-ccw-FZW7c8p8.js +1 -0
  154. package/payload/server/public/assets/rotate-ccw-FZW7c8p8.js.br +0 -0
  155. package/payload/server/public/assets/rotate-ccw-FZW7c8p8.js.gz +0 -0
  156. package/payload/server/public/assets/routines-BpZs2SaT.js +2 -0
  157. package/payload/server/public/assets/routines-BpZs2SaT.js.br +0 -0
  158. package/payload/server/public/assets/routines-BpZs2SaT.js.gz +0 -0
  159. package/payload/server/public/assets/skills-DF7uyEEz.js +1 -0
  160. package/payload/server/public/assets/skills-DF7uyEEz.js.br +0 -0
  161. package/payload/server/public/assets/skills-DF7uyEEz.js.gz +0 -0
  162. package/payload/server/public/assets/tasks-BfJJmoWO.js +3 -0
  163. package/payload/server/public/assets/tasks-BfJJmoWO.js.br +0 -0
  164. package/payload/server/public/assets/tasks-BfJJmoWO.js.gz +0 -0
  165. package/payload/server/public/assets/triangle-alert-CR-jRJdI.js +1 -0
  166. package/payload/server/public/assets/triangle-alert-CR-jRJdI.js.br +0 -0
  167. package/payload/server/public/assets/triangle-alert-CR-jRJdI.js.gz +0 -0
  168. package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js +1 -0
  169. package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js.br +0 -0
  170. package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js.gz +0 -0
  171. package/payload/server/public/assets/{useSubAccountSwitcher-CVHqKsqK.js → useMediaQuery-CA6dR5iz.js} +1 -1
  172. package/payload/server/public/assets/useMediaQuery-CA6dR5iz.js.br +0 -0
  173. package/payload/server/public/assets/{useSubAccountSwitcher-CVHqKsqK.js.gz → useMediaQuery-CA6dR5iz.js.gz} +0 -0
  174. package/payload/server/public/assets/{useSubAccountSwitcher-yN4lhH2x.css → useMediaQuery-DpwgV1Da.css} +1 -1
  175. package/payload/server/public/assets/useMediaQuery-DpwgV1Da.css.br +0 -0
  176. package/payload/server/public/assets/{useSubAccountSwitcher-yN4lhH2x.css.gz → useMediaQuery-DpwgV1Da.css.gz} +0 -0
  177. package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js +2 -0
  178. package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js.br +0 -0
  179. package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js.gz +0 -0
  180. package/payload/server/public/assets/wrench-CpCOYUBc.js +1 -0
  181. package/payload/server/public/assets/wrench-CpCOYUBc.js.br +0 -0
  182. package/payload/server/public/assets/wrench-CpCOYUBc.js.gz +0 -0
  183. package/payload/server/public/browser.html +4 -4
  184. package/payload/server/public/calendar.html +8 -7
  185. package/payload/server/public/chat.html +13 -13
  186. package/payload/server/public/data.html +11 -11
  187. package/payload/server/public/graph.html +9 -9
  188. package/payload/server/public/index.html +14 -14
  189. package/payload/server/public/operator.html +14 -14
  190. package/payload/server/public/public.html +13 -13
  191. package/payload/server/public/routines.html +6 -6
  192. package/payload/server/public/skills.html +5 -5
  193. package/payload/server/public/tasks.html +6 -6
  194. package/payload/server/server.js +476 -148
  195. package/payload/server/public/assets/AdminLoginScreens-CfXQwKIY.js +0 -1
  196. package/payload/server/public/assets/AdminLoginScreens-CfXQwKIY.js.br +0 -0
  197. package/payload/server/public/assets/AdminLoginScreens-CfXQwKIY.js.gz +0 -0
  198. package/payload/server/public/assets/AdminShell-y0_mzlDF.js +0 -2
  199. package/payload/server/public/assets/AdminShell-y0_mzlDF.js.br +0 -0
  200. package/payload/server/public/assets/AdminShell-y0_mzlDF.js.gz +0 -0
  201. package/payload/server/public/assets/activity-h8-sjHz9.js +0 -1
  202. package/payload/server/public/assets/activity-h8-sjHz9.js.br +0 -0
  203. package/payload/server/public/assets/activity-h8-sjHz9.js.gz +0 -0
  204. package/payload/server/public/assets/admin-BzhhLC7C.js +0 -1
  205. package/payload/server/public/assets/admin-BzhhLC7C.js.br +0 -0
  206. package/payload/server/public/assets/admin-BzhhLC7C.js.gz +0 -0
  207. package/payload/server/public/assets/agents-DLuhIIgn.js +0 -1
  208. package/payload/server/public/assets/agents-DLuhIIgn.js.br +0 -0
  209. package/payload/server/public/assets/agents-DLuhIIgn.js.gz +0 -0
  210. package/payload/server/public/assets/browser-FAnTY27n.js +0 -1
  211. package/payload/server/public/assets/browser-FAnTY27n.js.br +0 -0
  212. package/payload/server/public/assets/browser-FAnTY27n.js.gz +0 -0
  213. package/payload/server/public/assets/calendar-C_PkqlkQ.js +0 -1
  214. package/payload/server/public/assets/calendar-C_PkqlkQ.js.br +0 -0
  215. package/payload/server/public/assets/calendar-C_PkqlkQ.js.gz +0 -0
  216. package/payload/server/public/assets/chat-DW81Ra89.js +0 -1
  217. package/payload/server/public/assets/chat-DW81Ra89.js.br +0 -0
  218. package/payload/server/public/assets/chat-DW81Ra89.js.gz +0 -0
  219. package/payload/server/public/assets/chevron-left-zV-WRzHb.js +0 -1
  220. package/payload/server/public/assets/chevron-left-zV-WRzHb.js.br +0 -0
  221. package/payload/server/public/assets/chevron-right-fnINU4bx.js +0 -1
  222. package/payload/server/public/assets/chevron-right-fnINU4bx.js.br +0 -0
  223. package/payload/server/public/assets/clock-2fSxBl6d.js +0 -1
  224. package/payload/server/public/assets/clock-2fSxBl6d.js.br +0 -0
  225. package/payload/server/public/assets/copy-Rde_TL9Q.js +0 -1
  226. package/payload/server/public/assets/copy-Rde_TL9Q.js.br +0 -0
  227. package/payload/server/public/assets/copy-Rde_TL9Q.js.gz +0 -0
  228. package/payload/server/public/assets/data-S5g4wIDe.js +0 -1
  229. package/payload/server/public/assets/data-S5g4wIDe.js.br +0 -0
  230. package/payload/server/public/assets/data-S5g4wIDe.js.gz +0 -0
  231. package/payload/server/public/assets/file-text-DMCUVg80.js +0 -1
  232. package/payload/server/public/assets/file-text-DMCUVg80.js.br +0 -0
  233. package/payload/server/public/assets/file-text-DMCUVg80.js.gz +0 -0
  234. package/payload/server/public/assets/graph-Bo-WcsKS.js.br +0 -0
  235. package/payload/server/public/assets/graph-Bo-WcsKS.js.gz +0 -0
  236. package/payload/server/public/assets/graph-labels-g-JodMWQ.js +0 -1
  237. package/payload/server/public/assets/graph-labels-g-JodMWQ.js.br +0 -0
  238. package/payload/server/public/assets/graph-labels-g-JodMWQ.js.gz +0 -0
  239. package/payload/server/public/assets/operator-X_LcOnAI.js +0 -1
  240. package/payload/server/public/assets/operator-X_LcOnAI.js.br +0 -0
  241. package/payload/server/public/assets/operator-X_LcOnAI.js.gz +0 -0
  242. package/payload/server/public/assets/page-Cz0p1mBf.js +0 -1
  243. package/payload/server/public/assets/page-Cz0p1mBf.js.br +0 -0
  244. package/payload/server/public/assets/page-Cz0p1mBf.js.gz +0 -0
  245. package/payload/server/public/assets/page-Dzs3MsFL.js +0 -32
  246. package/payload/server/public/assets/page-Dzs3MsFL.js.br +0 -0
  247. package/payload/server/public/assets/page-Dzs3MsFL.js.gz +0 -0
  248. package/payload/server/public/assets/play-CraN5kUU.js +0 -1
  249. package/payload/server/public/assets/play-CraN5kUU.js.br +0 -0
  250. package/payload/server/public/assets/play-CraN5kUU.js.gz +0 -0
  251. package/payload/server/public/assets/public--NUjaJ-q.js +0 -1
  252. package/payload/server/public/assets/public--NUjaJ-q.js.br +0 -0
  253. package/payload/server/public/assets/public--NUjaJ-q.js.gz +0 -0
  254. package/payload/server/public/assets/rotate-ccw-DshFgg2T.js +0 -1
  255. package/payload/server/public/assets/rotate-ccw-DshFgg2T.js.br +0 -0
  256. package/payload/server/public/assets/rotate-ccw-DshFgg2T.js.gz +0 -0
  257. package/payload/server/public/assets/routines-CfAS4gri.js +0 -2
  258. package/payload/server/public/assets/routines-CfAS4gri.js.br +0 -0
  259. package/payload/server/public/assets/routines-CfAS4gri.js.gz +0 -0
  260. package/payload/server/public/assets/skills-CM6ryWpx.js +0 -1
  261. package/payload/server/public/assets/skills-CM6ryWpx.js.br +0 -0
  262. package/payload/server/public/assets/skills-CM6ryWpx.js.gz +0 -0
  263. package/payload/server/public/assets/tasks-B07m9LIA.js +0 -3
  264. package/payload/server/public/assets/tasks-B07m9LIA.js.br +0 -0
  265. package/payload/server/public/assets/tasks-B07m9LIA.js.gz +0 -0
  266. package/payload/server/public/assets/triangle-alert-CKHyS_gC.js +0 -1
  267. package/payload/server/public/assets/triangle-alert-CKHyS_gC.js.br +0 -0
  268. package/payload/server/public/assets/triangle-alert-CKHyS_gC.js.gz +0 -0
  269. package/payload/server/public/assets/useCopyFeedback-CmawEsVi.js +0 -1
  270. package/payload/server/public/assets/useCopyFeedback-CmawEsVi.js.br +0 -0
  271. package/payload/server/public/assets/useCopyFeedback-CmawEsVi.js.gz +0 -0
  272. package/payload/server/public/assets/useSubAccountSwitcher-CVHqKsqK.js.br +0 -0
  273. package/payload/server/public/assets/useSubAccountSwitcher-yN4lhH2x.css.br +0 -0
  274. package/payload/server/public/assets/useVoiceRecorder-DpQTvvqD.js +0 -2
  275. package/payload/server/public/assets/useVoiceRecorder-DpQTvvqD.js.br +0 -0
  276. package/payload/server/public/assets/useVoiceRecorder-DpQTvvqD.js.gz +0 -0
  277. package/payload/server/public/assets/wrench-BPOEUNJB.js +0 -1
  278. package/payload/server/public/assets/wrench-BPOEUNJB.js.br +0 -0
  279. package/payload/server/public/assets/wrench-BPOEUNJB.js.gz +0 -0
@@ -8,7 +8,10 @@ import {
8
8
  getUserTimezone,
9
9
  isValidAccountId,
10
10
  registerLoop
11
- } from "./chunk-BP7LH7MC.js";
11
+ } from "./chunk-CKTHAHL4.js";
12
+
13
+ // app/lib/whatsapp/manager.ts
14
+ import { randomUUID as randomUUID5 } from "crypto";
12
15
 
13
16
  // app/lib/whatsapp/schema.ts
14
17
  import { z } from "zod";
@@ -69,7 +72,18 @@ var WhatsAppConfigSchema = z.object({
69
72
  // match a malformed row (so it can never reach a log line or the spawn
70
73
  // env), and the /rc-spawn body guard re-checks. `.strict()` stays — an
71
74
  // unknown key inside the entry IS recoverable by the tolerant parser.
72
- z.object({ account: z.string(), party: z.string() }).strict()
75
+ z.object({
76
+ account: z.string(),
77
+ party: z.string(),
78
+ // Task 2292 — `.catch(undefined)`, never a bare `z.boolean()`. Once
79
+ // `dispatch` is a KNOWN key, a hand-edited non-boolean is an
80
+ // `invalid_type` issue, and the tolerant parser recovers only from
81
+ // `unrecognized_keys` — so a strict type here would fail the whole
82
+ // parse and empty routing install-wide, the exact outage class the
83
+ // `party` comment above describes. `.catch` keeps the declared type
84
+ // and reads a bad value as absent, which dispatches.
85
+ dispatch: z.boolean().optional().catch(void 0)
86
+ }).strict()
73
87
  ).optional().describe("Registered non-operator counterparties: E.164 phone \u2192 { account, party }. The sender is admitted to the PUBLIC agent on that account's own number, carrying the label; they are never granted admin, which is what separates this from accountManagers. Reached on the house number they take the normal DM policy instead. 'party' is an operator-chosen label (e.g. 'driver'), lowercase letters, digits and hyphens, 1-64 characters; the platform carries it and never interprets it. Managed via add-registered-party / remove-registered-party. A phone here must not also be in adminPhones or accountManagers. Read only from the account whose account.json the manager loads its config from (the house); add-registered-party is refused on any other account, and a map left there is inert and purged at boot."),
74
88
  allowFrom: z.array(z.string()).optional().describe("Phone numbers allowed to message the public agent when DM policy is 'allowlist'. Add '*' for open access. Does not affect admin routing \u2014 use adminPhones for that."),
75
89
  sendReadReceipts: z.boolean().optional().default(true).describe("Whether to send read receipts (blue ticks) when messages are received. Disabling may feel less responsive but preserves privacy."),
@@ -362,6 +376,21 @@ function classifyCompanionReg(node) {
362
376
  return { stage, children, parseable: children.includes(PRIMARY_IDENTITY_PUB) };
363
377
  }
364
378
 
379
+ // app/lib/whatsapp/inbound/frame-census.ts
380
+ var WIRE_TAG = "[whatsapp:wire]";
381
+ function recordFrame(counts, frame) {
382
+ if (!frame || typeof frame !== "object" || frame instanceof Uint8Array) return;
383
+ const node = frame;
384
+ if (typeof node.tag !== "string") return;
385
+ const type = node.attrs?.type;
386
+ const key = `${node.tag}/${type === void 0 || type === null ? "none" : String(type)}`;
387
+ counts.set(key, (counts.get(key) ?? 0) + 1);
388
+ }
389
+ function formatFrameCensusLine(account, counts) {
390
+ const pairs = [...counts.entries()].sort((a, b) => a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0).map(([key, n]) => `${key}=${n}`).join(" ");
391
+ return `${WIRE_TAG} op=frame-census account=${account} ${pairs}`;
392
+ }
393
+
365
394
  // app/lib/whatsapp/ingest-ledger.ts
366
395
  import { existsSync, mkdirSync, appendFileSync, readFileSync, writeFileSync, readdirSync } from "fs";
367
396
  import { join } from "path";
@@ -621,7 +650,8 @@ function startVersionDriftCensus(intervalMs = CENSUS_INTERVAL_MS) {
621
650
 
622
651
  // app/lib/whatsapp/session.ts
623
652
  var TAG5 = "[whatsapp:session]";
624
- var WIRE_TAG = "[whatsapp:wire]";
653
+ var WIRE_TAG2 = "[whatsapp:wire]";
654
+ var FRAME_CENSUS_MS = 6e4;
625
655
  console.error(`${TAG5} baileys package loaded version=${BAILEYS_PKG_VERSION}`);
626
656
  var __BAILEYS_TAG = "[whatsapp:baileys]";
627
657
  var INSPECT_OPTS = {
@@ -777,6 +807,22 @@ async function createWaSocket(opts) {
777
807
  markOnlineOnConnect: false,
778
808
  fireInitQueries: false
779
809
  });
810
+ const frameCounts = /* @__PURE__ */ new Map();
811
+ let lastFrameCensus = "";
812
+ const emitFrameCensus = () => {
813
+ if (frameCounts.size === 0) return;
814
+ const line = formatFrameCensusLine(acct, frameCounts);
815
+ if (line === lastFrameCensus) return;
816
+ lastFrameCensus = line;
817
+ console.error(line);
818
+ };
819
+ const stopFrameCensus = () => {
820
+ emitFrameCensus();
821
+ clearInterval(frameCensusTimer);
822
+ };
823
+ sock.ws.on("frame", (frame) => recordFrame(frameCounts, frame));
824
+ sock.ws.on("close", stopFrameCensus);
825
+ const frameCensusTimer = setInterval(emitFrameCensus, FRAME_CENSUS_MS);
780
826
  sock.ev.on("creds.update", () => {
781
827
  console.error(`${TAG5} creds.update received \u2014 saving to ${authDir}`);
782
828
  enqueueSaveCreds(authDir, saveCreds);
@@ -821,6 +867,7 @@ async function createWaSocket(opts) {
821
867
  onQr(update.qr);
822
868
  }
823
869
  if (update.connection === "close") {
870
+ stopFrameCensus();
824
871
  const status = getStatusCode(update.lastDisconnect?.error);
825
872
  if (!silent) {
826
873
  console.error(
@@ -847,7 +894,7 @@ async function createWaSocket(opts) {
847
894
  sock.ws.on("CB:message", (node) => {
848
895
  const attrs = node?.attrs ?? {};
849
896
  console.error(
850
- `${WIRE_TAG} op=stanza msgId=${attrs.id ?? "none"} from=${attrs.from ?? "none"} type=${attrs.type ?? "none"} offline=${attrs.offline ?? "none"} account=${acct}`
897
+ `${WIRE_TAG2} op=stanza msgId=${attrs.id ?? "none"} from=${attrs.from ?? "none"} type=${attrs.type ?? "none"} offline=${attrs.offline ?? "none"} account=${acct}`
851
898
  );
852
899
  if (attrs.id) {
853
900
  appendStanza({
@@ -1390,7 +1437,7 @@ import {
1390
1437
  extractMessageContent as extractMessageContent2,
1391
1438
  normalizeMessageContent as normalizeMessageContent2
1392
1439
  } from "@whiskeysockets/baileys";
1393
- var WIRE_TAG2 = "[whatsapp:wire]";
1440
+ var WIRE_TAG3 = "[whatsapp:wire]";
1394
1441
  function formatLiveLocationPayloadLine(msg) {
1395
1442
  const content = msg.message ? normalizeMessageContent2(msg.message) : null;
1396
1443
  const inner = content ? extractMessageContent2(content) : null;
@@ -1399,7 +1446,7 @@ function formatLiveLocationPayloadLine(msg) {
1399
1446
  const num = (v) => v === null || v === void 0 ? "none" : String(v);
1400
1447
  const captionBytes = live.caption ? Buffer.byteLength(live.caption, "utf8") : 0;
1401
1448
  const thumbBytes = live.jpegThumbnail ? live.jpegThumbnail.length : 0;
1402
- return `${WIRE_TAG2} op=live-location-payload msgKeyId=${msg.key?.id ?? "none"} seq=${num(live.sequenceNumber)} timeOffsetS=${num(live.timeOffset)} accuracyM=${num(live.accuracyInMeters)} speedMps=${num(live.speedInMps)} headingDeg=${num(live.degreesClockwiseFromMagneticNorth)} captionBytes=${captionBytes} thumbBytes=${thumbBytes} envDurationS=${num(msg.duration)} envFinal=${msg.finalLiveLocation ? "yes" : "no"}`;
1449
+ return `${WIRE_TAG3} op=live-location-payload msgKeyId=${msg.key?.id ?? "none"} seq=${num(live.sequenceNumber)} timeOffsetS=${num(live.timeOffset)} accuracyM=${num(live.accuracyInMeters)} speedMps=${num(live.speedInMps)} headingDeg=${num(live.degreesClockwiseFromMagneticNorth)} captionBytes=${captionBytes} thumbBytes=${thumbBytes} envDurationS=${num(msg.duration)} envFinal=${msg.finalLiveLocation ? "yes" : "no"}`;
1403
1450
  }
1404
1451
  function liveLocationTargetJid(msg) {
1405
1452
  if (msg.key?.fromMe) return null;
@@ -1409,11 +1456,26 @@ function liveLocationTargetJid(msg) {
1409
1456
  }
1410
1457
  function formatMessageUpdateLine(u) {
1411
1458
  const names = u.update ? Object.keys(u.update) : [];
1412
- return `${WIRE_TAG2} op=message-update msgKeyId=${u.key?.id ?? "none"} fields=${names.length ? names.join(",") : "none"}`;
1459
+ return `${WIRE_TAG3} op=message-update msgKeyId=${u.key?.id ?? "none"} fields=${names.length ? names.join(",") : "none"}`;
1460
+ }
1461
+ function formatSubscribeReplyLine(account, jid, reply) {
1462
+ const head = `${WIRE_TAG3} op=live-location-subscribe-reply account=${account} jid=${jid}`;
1463
+ if (!reply || typeof reply !== "object") {
1464
+ return `${head} type=no-reply from=none children=`;
1465
+ }
1466
+ const node = reply;
1467
+ const attrs = node.attrs ?? {};
1468
+ const children = Array.isArray(node.content) ? node.content.map((c) => {
1469
+ const child = c ?? {};
1470
+ const ca = child.attrs ?? {};
1471
+ const pairs = Object.keys(ca).map((k) => `${k}=${String(ca[k])}`).join(",");
1472
+ return `${child.tag ?? "none"}${pairs ? `[${pairs}]` : ""}`;
1473
+ }).join(" ").slice(0, 200) : "";
1474
+ return `${head} type=${attrs.type ?? "none"} from=${attrs.from ?? "none"} children=${children}`;
1413
1475
  }
1414
1476
 
1415
1477
  // app/lib/whatsapp/live-location.ts
1416
- var WIRE_TAG3 = "[whatsapp:wire]";
1478
+ var WIRE_TAG4 = "[whatsapp:wire]";
1417
1479
  var REARM_MS = 3e4;
1418
1480
  var SILENCE_MS = 9e4;
1419
1481
  var subscriptions = /* @__PURE__ */ new Map();
@@ -1424,9 +1486,11 @@ function sendEnrolment(sock, account, jid) {
1424
1486
  attrs: { xmlns: "location", type: "get", to: "s.whatsapp.net", target: jid },
1425
1487
  content: [{ tag: "subscribe", attrs: { participants: "true" } }]
1426
1488
  };
1427
- Promise.resolve(sock.query(node)).catch((err) => {
1489
+ Promise.resolve(sock.query(node)).then((reply) => {
1490
+ console.error(formatSubscribeReplyLine(account, jid, reply));
1491
+ }).catch((err) => {
1428
1492
  console.error(
1429
- `${WIRE_TAG3} op=live-location-subscribe account=${account} jid=${jid} outcome=fail reason=${(err instanceof Error ? err.message : String(err)).slice(0, 120)}`
1493
+ `${WIRE_TAG4} op=live-location-subscribe account=${account} jid=${jid} outcome=fail reason=${(err instanceof Error ? err.message : String(err)).slice(0, 120)}`
1430
1494
  );
1431
1495
  });
1432
1496
  }
@@ -1442,7 +1506,7 @@ function subscribeLiveLocation(sock, account, jid) {
1442
1506
  if (!sub) return;
1443
1507
  if (Date.now() - sub.lastSeenAt >= SILENCE_MS) {
1444
1508
  console.error(
1445
- `${WIRE_TAG3} op=live-location-subscribe account=${account} jid=${jid} outcome=stopped reason=silence`
1509
+ `${WIRE_TAG4} op=live-location-subscribe account=${account} jid=${jid} outcome=stopped reason=silence`
1446
1510
  );
1447
1511
  stopLiveLocation(account, jid);
1448
1512
  return;
@@ -1451,7 +1515,7 @@ function subscribeLiveLocation(sock, account, jid) {
1451
1515
  }, REARM_MS);
1452
1516
  subscriptions.set(key, { timer, lastSeenAt: Date.now(), account });
1453
1517
  console.error(
1454
- `${WIRE_TAG3} op=live-location-subscribe account=${account} jid=${jid} outcome=armed rearmMs=${REARM_MS}`
1518
+ `${WIRE_TAG4} op=live-location-subscribe account=${account} jid=${jid} outcome=armed rearmMs=${REARM_MS}`
1455
1519
  );
1456
1520
  sendEnrolment(sock, account, jid);
1457
1521
  }
@@ -1753,11 +1817,40 @@ function registeredPartyFor(registeredParties, phone) {
1753
1817
  for (const [partyPhone, entry2] of Object.entries(registeredParties)) {
1754
1818
  if (!entry2 || !entry2.account || typeof entry2.party !== "string") continue;
1755
1819
  if (!PARTY_LABEL_PATTERN.test(entry2.party)) continue;
1756
- if (phonesMatch(partyPhone, phone)) return { account: entry2.account, party: entry2.party };
1820
+ if (phonesMatch(partyPhone, phone)) {
1821
+ const dispatch = typeof entry2.dispatch === "boolean" ? entry2.dispatch : void 0;
1822
+ return dispatch === void 0 ? { account: entry2.account, party: entry2.party } : { account: entry2.account, party: entry2.party, dispatch };
1823
+ }
1757
1824
  }
1758
1825
  return null;
1759
1826
  }
1760
1827
 
1828
+ // app/lib/whatsapp/inbound/party-dispatch.ts
1829
+ function partyDispatchAllowed(entry2) {
1830
+ return entry2?.dispatch !== false;
1831
+ }
1832
+ function formatPartyDispatchLine(p) {
1833
+ return `[whatsapp:party] op=dispatch-decision inboundId=${p.inboundId ?? ""} account=${p.accountId.slice(0, 8)} sender=${p.senderPhone} party=${p.party} dispatch=${p.dispatch} spawned=${p.spawned ? 1 : 0}`;
1834
+ }
1835
+ var labelledInbounds = 0;
1836
+ function noteLabelledInbound() {
1837
+ labelledInbounds += 1;
1838
+ }
1839
+ function readLabelledInbounds() {
1840
+ return labelledInbounds;
1841
+ }
1842
+ function buildPartyDispatchAudit(p) {
1843
+ const rows = Object.values(p.registeredParties);
1844
+ return {
1845
+ registrations: rows.length,
1846
+ suppressed: rows.filter((r) => !partyDispatchAllowed(r)).length,
1847
+ inbounds: readLabelledInbounds()
1848
+ };
1849
+ }
1850
+ function formatPartyDispatchAuditLine(a) {
1851
+ return `[whatsapp:party] op=party-dispatch-audit registrations=${a.registrations} suppressed=${a.suppressed} inbounds=${a.inbounds}`;
1852
+ }
1853
+
1761
1854
  // app/lib/whatsapp/inbound/access-control.ts
1762
1855
  function resolveAccountConfig(config, accountConfig) {
1763
1856
  return {
@@ -1829,7 +1922,8 @@ function checkDmAccess(params) {
1829
1922
  reason: "registered-party",
1830
1923
  agentType: "public",
1831
1924
  effectiveAccountId: accountId,
1832
- party: party.party
1925
+ party: party.party,
1926
+ partyDispatch: partyDispatchAllowed(party)
1833
1927
  };
1834
1928
  }
1835
1929
  switch (cfg.dmPolicy) {
@@ -3872,7 +3966,8 @@ function combineInboundBatch(entries) {
3872
3966
  const last = entries[entries.length - 1];
3873
3967
  const combinedText = entries.map((e) => e.text).filter(Boolean).join("\n");
3874
3968
  const media = entries.flatMap((e) => e.media);
3875
- return { ...last, text: combinedText, media };
3969
+ const msgIds = entries.flatMap((e) => e.msgIds ?? []);
3970
+ return { ...last, text: combinedText, media, msgIds };
3876
3971
  }
3877
3972
 
3878
3973
  // app/lib/whatsapp/opening-hours.ts
@@ -4122,7 +4217,8 @@ function buildNotifyPending(args) {
4122
4217
  var initialized = false;
4123
4218
  function dispatchInboundPayload(conn, payload) {
4124
4219
  if (!onInboundMessage) return;
4125
- decideDispatch(conn, payload, { config: whatsAppConfig, emit: onInboundMessage, log: (l) => console.error(l) });
4220
+ const dispatched = { ...payload, inboundId: randomUUID5().slice(0, 8) };
4221
+ decideDispatch(conn, dispatched, { config: whatsAppConfig, emit: onInboundMessage, log: (l) => console.error(l) });
4126
4222
  }
4127
4223
  function isObserveAccount(accountId) {
4128
4224
  return !shouldDispatchInbound(whatsAppConfig, accountId);
@@ -5402,6 +5498,9 @@ async function handleInboundMessage(conn, msg) {
5402
5498
  // Task 2234 — the gate's registered-party label, undefined for every other
5403
5499
  // sender. Rides to the gateway and on to the spawn env.
5404
5500
  party: accessResult.party,
5501
+ // Task 2292 — the gate's per-party dispatch verdict. The router reads this,
5502
+ // never the config, so the gate and the suppression cannot disagree.
5503
+ partyDispatch: accessResult.partyDispatch,
5405
5504
  personId: accessResult.personId ?? null,
5406
5505
  senderPhone,
5407
5506
  text: extracted.text,
@@ -5418,7 +5517,11 @@ async function handleInboundMessage(conn, msg) {
5418
5517
  // Task 1575 — the gate's owner-self verdict. Only reason:'self-phone' is the
5419
5518
  // owner's own number; adminPhones/account-manager admits are other admins
5420
5519
  // and must not inherit the owner userId.
5421
- ownerSelfPhone: accessResult.reason === "self-phone"
5520
+ ownerSelfPhone: accessResult.reason === "self-phone",
5521
+ // Task 2281 — this stanza's own id, single-valued here. combineInboundBatch
5522
+ // replaces it with the batch's concatenation when the debouncer merges, so
5523
+ // one field carries both cases and no log site needs a fallback.
5524
+ msgIds: msg.key.id ? [msg.key.id] : []
5422
5525
  };
5423
5526
  if (accessResult.agentType === "public") {
5424
5527
  const hoursResult = await isBusinessOpen(conn.accountId);
@@ -5506,6 +5609,10 @@ export {
5506
5609
  managerPhonesForAccount,
5507
5610
  PARTY_LABEL_PATTERN,
5508
5611
  registeredPartyFor,
5612
+ formatPartyDispatchLine,
5613
+ noteLabelledInbound,
5614
+ buildPartyDispatchAudit,
5615
+ formatPartyDispatchAuditLine,
5509
5616
  resolveAccountConfig,
5510
5617
  isAdminPhone,
5511
5618
  buildPolicyInheritance,
@@ -30,8 +30,8 @@ import {
30
30
  startConnection,
31
31
  stopConnection,
32
32
  storeMessage
33
- } from "./chunk-FQO5RDWZ.js";
34
- import "./chunk-BP7LH7MC.js";
33
+ } from "./chunk-TQTZXAK3.js";
34
+ import "./chunk-CKTHAHL4.js";
35
35
  import "./chunk-PFF6I7KP.js";
36
36
  export {
37
37
  buildNotifyPending,
@@ -19,12 +19,12 @@ import {
19
19
  screencastLog,
20
20
  vncLog,
21
21
  websockifyLog
22
- } from "./chunk-IALJPXIO.js";
22
+ } from "./chunk-ERIM3EFB.js";
23
23
  import {
24
24
  CDP_PORT,
25
25
  LOG_DIR,
26
26
  WEBSOCKIFY_PORT
27
- } from "./chunk-BP7LH7MC.js";
27
+ } from "./chunk-CKTHAHL4.js";
28
28
  import "./chunk-PFF6I7KP.js";
29
29
 
30
30
  // server/edge.ts
@@ -5,12 +5,12 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Activity — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/activity-h8-sjHz9.js"></script>
8
+ <script type="module" crossorigin src="/assets/activity-CpMnNr5c.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-CVHqKsqK.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-y0_mzlDF.js">
12
- <link rel="modulepreload" crossorigin href="/assets/triangle-alert-CKHyS_gC.js">
13
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-yN4lhH2x.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-CA6dR5iz.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-DJL5DzRX.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/triangle-alert-CR-jRJdI.js">
13
+ <link rel="stylesheet" crossorigin href="/assets/useMediaQuery-DpwgV1Da.css">
14
14
  <link rel="stylesheet" href="/brand-defaults.css">
15
15
  </head>
16
16
  <body>
@@ -5,11 +5,11 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Agents — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/agents-DLuhIIgn.js"></script>
8
+ <script type="module" crossorigin src="/assets/agents-C4LmSKjb.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-CVHqKsqK.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-y0_mzlDF.js">
12
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-yN4lhH2x.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-CA6dR5iz.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-DJL5DzRX.js">
12
+ <link rel="stylesheet" crossorigin href="/assets/useMediaQuery-DpwgV1Da.css">
13
13
  <link rel="stylesheet" href="/brand-defaults.css">
14
14
  </head>
15
15
  <body>
@@ -0,0 +1 @@
1
+ import{o as e}from"./chunk-CltuBf4Z.js";import{H as t,J as n,K as r,Q as i,W as a,v as o}from"./useMediaQuery-CA6dR5iz.js";import{A as s}from"./useVoiceRecorder-DGhsN7nV.js";import{D as c,O as l,k as u,p as d}from"./AdminShell-DJL5DzRX.js";var f=e(i(),1);function p(e=`admin`){let[t,r]=(0,f.useState)(`loading`),[i,a]=(0,f.useState)(``),[o,c]=(0,f.useState)(``),[l,d]=(0,f.useState)(``),[p,m]=(0,f.useState)(!1),[h,g]=(0,f.useState)(!1),[_,v]=(0,f.useState)(!1),[y,b]=(0,f.useState)(!1),[x,S]=(0,f.useState)(!1),[C,w]=(0,f.useState)(null),[T,E]=(0,f.useState)(null),[D,O]=(0,f.useState)(void 0),[k,A]=(0,f.useState)(null),[j,M]=(0,f.useState)(void 0),[N,P]=(0,f.useState)(null),[F,I]=(0,f.useState)(null),[L,R]=(0,f.useState)(void 0),z=(0,f.useRef)(void 0),[B,V]=(0,f.useState)(!1),[H,U]=(0,f.useState)(!0);(0,f.useEffect)(()=>{typeof window>`u`||fetch(`/api/remote-auth/status`).then(e=>e.ok?e.json():null).then(e=>{e?.configured&&V(!0)}).catch(()=>{})},[]);let W=(0,f.useRef)(null),G=(0,f.useRef)(null);(0,f.useEffect)(()=>{async function e(){let e=null;try{e=sessionStorage.getItem(`maxy-admin-session-key`)}catch{}if(!e)return!1;try{let t=await fetch(`/api/admin/session?session_key=${encodeURIComponent(e)}`);if(t.status===401){try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}return!1}if(!t.ok)return!1;let n=await t.json();w(n.session_key),I(n.sessionId??null),O(n.businessName),A(n.role??null),M(n.userName===void 0?null:n.userName),P(n.avatar??null);let i=s(n.thinkingView);return z.current=i,R(i),r(`chat`),!0}catch(e){return console.error(`[admin] session restore failed:`,e),!1}}async function t(n=2){try{let i=await fetch(`/api/health`);if(!i.ok){if(n>0)return await new Promise(e=>setTimeout(e,1500)),t(n-1);console.error(`[admin] health check returned ${i.status} after retries`),r(`set-pin`);return}let a=await i.json();if(!a.pin_configured){r(`set-pin`);return}U(!!a.claude_authenticated);let o=!1;try{o=new URLSearchParams(window.location.search).get(`connect`)===`claude`}catch{}if(o){try{let e=new URL(window.location.href);e.searchParams.delete(`connect`),window.history.replaceState(null,``,e.pathname+e.search+e.hash)}catch{}if(!a.claude_authenticated){r(`connect-claude`);return}}if(await e())return;r(`enter-pin`)}catch(e){if(n>0)return await new Promise(e=>setTimeout(e,1500)),t(n-1);console.error(`[admin] health check failed:`,e),r(`set-pin`)}}t()},[]),(0,f.useEffect)(()=>{t===`chat`&&C&&fetch(`/api/admin/claude-info?session_key=${encodeURIComponent(C)}`).then(e=>{if(e.ok)return e.json()}).then(e=>{e&&E(e)}).catch(()=>{})},[t,C]);let K=(0,f.useRef)(null);(0,f.useEffect)(()=>{if(t!==`chat`)return;let e=setInterval(async()=>{try{let e=await fetch(`/api/health`);if(e.ok){let t=await e.json();U(t.auth_status!==`dead`&&t.auth_status!==`missing`)}}catch{}if(C)try{let e=await fetch(`/api/admin/session?session_key=${encodeURIComponent(C)}`);if(e.status!==401)return;let t=(await e.clone().json().catch(()=>null))?.code??`unknown-401`;if(t===`remote-auth-required`){n(`heartbeat`,`/api/admin/session`);return}console.warn(`[admin-auth] outcome=heartbeat-detected-expiry code=${t}`),K.current?.()}catch{}},300*1e3);return()=>clearInterval(e)},[t,C]),(0,f.useEffect)(()=>{t===`connect-claude`&&fetch(`/api/health`).then(e=>e.ok?e.json():null).then(e=>{e?.claude_authenticated&&(U(!0),r(`enter-pin`))}).catch(()=>{})},[t]);async function q(e,t){g(!0);try{let i=await fetch(`/api/admin/session`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({pin:e,...t?{accountId:t}:{}})});if(!i.ok){let e=await i.json().catch(()=>({}));if(i.status===401&&e?.code===`remote-auth-required`){n(`enter-pin`,`/api/admin/session`);return}d(e.error||`Invalid PIN`);return}let o=await i.json();w(o.session_key),I(o.sessionId??null),O(o.businessName),A(o.role??null),M(o.userName===void 0?null:o.userName),P(o.avatar??null);let c=s(o.thinkingView);z.current=c,R(c);try{sessionStorage.setItem(`maxy-admin-session-key`,o.session_key)}catch{}a(``),r(`chat`)}catch(e){console.error(`[admin] connection error:`,e),d(`Could not connect.`)}finally{g(!1)}}let J=(0,f.useCallback)(async e=>{if(e.preventDefault(),h)return;d(``);let t=o.trim();if(!t){d(`Please enter your name.`);return}if(i.length<4){d(`PIN must be at least 4 characters.`);return}let s=i;g(!0);try{let e=await fetch(`/api/onboarding/set-pin`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({pin:s,name:t})});if(!e.ok){let t=await e.json().catch(()=>({}));if(e.status===401&&t?.code===`remote-auth-required`){n(`set-pin`,`/api/onboarding/set-pin`);return}if(e.status===409){try{let e=await fetch(`/api/health`);if(e.ok){let n=await e.json();n.pin_configured&&n.claude_authenticated?r(`enter-pin`):n.pin_configured?r(`connect-claude`):d(t.error||`Failed to set PIN.`)}else r(`enter-pin`)}catch{r(`enter-pin`)}return}d(t.error||`Failed to set PIN.`);return}let i=await fetch(`/api/health`);if((i.ok?await i.json():null)?.claude_authenticated){await q(s);return}a(``),r(`connect-claude`)}catch(e){console.error(`[admin] connection error:`,e),d(`Could not connect.`)}finally{g(!1)}},[i,h,o]),Y=(0,f.useCallback)(async e=>{e.preventDefault(),d(``),await q(i)},[i]),X=(0,f.useCallback)(async()=>{S(!0);try{if(!await u())return console.warn(`[admin-ui] claude-disconnect not verified — credentials may persist; staying put`),!1;U(!1),w(null),A(null),M(void 0),P(null);try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}return r(`connect-claude`),!0}finally{S(!1)}},[]),Z=(0,f.useCallback)(()=>{w(null),A(null),M(void 0),P(null);try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}a(``),d(``),r(`enter-pin`)},[]);return(0,f.useEffect)(()=>{K.current=Z},[Z]),{appState:t,setAppState:r,pin:i,setPin:a,operatorName:o,setOperatorName:c,pinError:l,setPinError:d,showPin:p,setShowPin:m,pinLoading:h,authPolling:_,setAuthPolling:v,authLoading:y,setAuthLoading:b,disconnecting:x,cacheKey:C,setCacheKey:w,claudeInfo:T,setClaudeInfo:E,businessName:D,role:k,userName:j,userAvatar:N,sessionId:F,setSessionId:I,expandAll:L,setExpandAll:R,expandAllDefaultRef:z,remoteAuthEnabled:B,claudeConnected:H,pinInputRef:W,setPinFormRef:G,handleSetPin:J,handleLogin:Y,handleDisconnect:X,handleLogout:Z}}var m=r();function h({inputRef:e,value:t,onChange:n,onComplete:r,showPin:i,autoFocus:a}){let o=(0,f.useRef)([]);function s(e,r){r.key===`Backspace`?(r.preventDefault(),t[e]?n(t.slice(0,e)+t.slice(e+1)):e>0&&(n(t.slice(0,e-1)+t.slice(e)),o.current[e-1]?.focus())):r.key===`ArrowLeft`&&e>0?o.current[e-1]?.focus():r.key===`ArrowRight`&&e<5?o.current[e+1]?.focus():r.key===`Enter`&&(r.preventDefault(),r.currentTarget.form?.requestSubmit())}function c(e,i){let a=i.nativeEvent.data;if(!a||!/^\d$/.test(a))return;let s=t.split(``);for(s[e]=a;s.length<e;)s.push(``);let c=s.join(``).replace(/\D/g,``).slice(0,6);n(c),c.length===6?r?.(c):e<5&&o.current[e+1]?.focus()}function l(e){e.preventDefault();let t=e.clipboardData.getData(`text`).replace(/\D/g,``).slice(0,6);t&&(n(t),t.length===6?r?.(t):o.current[t.length]?.focus())}return(0,m.jsx)(`div`,{className:`pin-field`,children:Array.from({length:6}).map((n,r)=>(0,m.jsx)(`input`,{ref:t=>{o.current[r]=t,r===0&&e&&(e.current=t)},type:`text`,inputMode:`numeric`,className:`pin-box${t[r]?` pin-box-filled`:``}`,value:t[r]?i?t[r]:`•`:``,onKeyDown:e=>s(r,e),onInput:e=>c(r,e),onPaste:l,onFocus:e=>e.target.select(),autoFocus:a&&r===0,autoComplete:`off`,maxLength:1,"aria-label":`PIN digit ${r+1}`},r))})}function g(e){let{pin:n,setPin:r,showPin:i,setShowPin:o,pinLoading:s,pinError:u,pinInputRef:d,setPinFormRef:f,onSubmit:p,operatorName:g,setOperatorName:_}=e;return(0,m.jsx)(`div`,{className:`connect-page`,children:(0,m.jsxs)(`div`,{className:`connect-content`,children:[(0,m.jsx)(`img`,{src:a,alt:t.productName,className:`connect-logo connect-logo--maxy`}),!t.logoContainsName&&(0,m.jsxs)(`h1`,{className:`connect-title`,children:[`Welcome to `,t.productName]}),(0,m.jsxs)(`p`,{className:`connect-subtitle`,children:[`Tell `,t.productName,` who you are, then choose a PIN.`]}),(0,m.jsxs)(`form`,{ref:f,onSubmit:p,className:`connect-pin-form`,children:[(0,m.jsxs)(`div`,{className:`pin-input-row`,children:[(0,m.jsx)(`input`,{type:`text`,className:`connect-name-input`,placeholder:`Your full name`,value:g,onChange:e=>_(e.target.value),autoComplete:`name`,autoFocus:!0,required:!0,"aria-label":`Your full name`}),(0,m.jsx)(`div`,{style:{width:38,flexShrink:0},"aria-hidden":`true`})]}),(0,m.jsxs)(`div`,{className:`pin-input-row`,children:[(0,m.jsx)(h,{inputRef:d,value:n,onChange:r,onComplete:()=>{},showPin:i}),(0,m.jsx)(c,{variant:`send`,type:`submit`,disabled:!n||!g.trim(),loading:s,"aria-label":`Set PIN`,children:(0,m.jsxs)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,m.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`}),(0,m.jsx)(`polyline`,{points:`12 5 19 12 12 19`})]})})]}),(0,m.jsx)(l,{checked:i,onChange:()=>o(e=>!e),label:`Show PIN`})]}),u&&(0,m.jsx)(`p`,{className:`admin-pin-error`,children:u})]})})}function _(e){let{pin:n,setPin:r,showPin:i,setShowPin:o,pinLoading:s,pinError:u,pinInputRef:d,onSubmit:f,remoteAuthEnabled:p,onSignOutRemote:g}=e;return(0,m.jsxs)(`div`,{className:`connect-page`,children:[p&&g&&(0,m.jsx)(`button`,{type:`button`,className:`connect-signout`,onClick:g,children:`Sign out`}),(0,m.jsxs)(`div`,{className:`connect-content`,children:[(0,m.jsx)(`img`,{src:a,alt:t.productName,className:`connect-logo connect-logo--maxy`}),!t.logoContainsName&&(0,m.jsx)(`h1`,{className:`connect-title`,children:t.productName}),(0,m.jsxs)(`form`,{onSubmit:f,className:`connect-pin-form`,children:[(0,m.jsxs)(`div`,{className:`pin-input-row`,children:[(0,m.jsx)(h,{inputRef:d,value:n,onChange:r,onComplete:()=>{},showPin:i,autoFocus:!0}),(0,m.jsx)(c,{variant:`send`,type:`submit`,disabled:!n,loading:s,children:(0,m.jsxs)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,m.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`}),(0,m.jsx)(`polyline`,{points:`12 5 19 12 12 19`})]})})]}),(0,m.jsx)(`div`,{className:`pin-options`,children:(0,m.jsx)(l,{checked:i,onChange:()=>o(e=>!e),label:`Show PIN`})})]}),u&&(0,m.jsx)(`p`,{className:`admin-pin-error`,children:u})]})]})}function v(e){let{authPolling:n,setAuthPolling:r,authLoading:i,setAuthLoading:o,pinError:s,setPinError:l,setAppState:u}=e,[p,h]=(0,f.useState)(!1),[g,_]=(0,f.useState)(!1),[v,y]=(0,f.useState)(``),[b,x]=(0,f.useState)(``),[S,C]=(0,f.useState)(``),[w,T]=(0,f.useState)(null),[E,D]=(0,f.useState)(null),[O,k]=(0,f.useState)(!1);(0,f.useEffect)(()=>{try{D(sessionStorage.getItem(`maxy-admin-session-key`))}catch{}k(!0)},[]);async function A(){C(``);try{let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`paste-code`,code:b})})).json();e.accepted?(C(`Code submitted. Finishing sign-in…`),x(``)):C(e.error||`Could not submit code.`)}catch(e){console.error(`[admin] paste-code error:`,e),C(`Could not submit code.`)}}async function j(){_(!0),l(``);try{let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`launch-browser`})})).json();e.launched?h(!0):e.error&&l(e.error)}catch(e){console.error(`[admin] browser launch error:`,e),l(`Could not launch browser.`)}_(!1)}async function M(){o(!0),l(``);try{let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`})).json();if(e.started){r(!0),h(!0),o(!1),y(e.transport||``);for(let e=0;e<120;e++){await new Promise(e=>setTimeout(e,2e3));let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`wait`})})).json();if(typeof e.authTargetId==`string`&&T(e.authTargetId),e.authenticated){await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`stop`})}),u(`enter-pin`);return}}l(`Timed out waiting for sign-in. Try again.`),r(!1)}else e.error&&l(e.error)}catch(e){console.error(`[admin] auth flow error:`,e),l(`Could not start auth flow.`)}o(!1)}async function N(){await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`stop`})}),r(!1),l(``)}return n||p?(0,m.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100dvh`,overflow:`auto`},children:[(0,m.jsxs)(`header`,{className:`chat-header`,style:{paddingBottom:`12px`,flexShrink:0,position:`relative`,maxWidth:`680px`,width:`100%`,margin:`0 auto`,padding:`24px 20px 12px`},children:[n?(0,m.jsx)(`button`,{onClick:N,style:{position:`absolute`,top:`12px`,right:`12px`,background:`none`,border:`none`,color:`#999`,fontSize:`13px`,cursor:`pointer`,padding:`4px 8px`},"aria-label":`Cancel`,children:`✕`}):(0,m.jsx)(`button`,{onClick:()=>h(!1),style:{position:`absolute`,top:`12px`,right:`12px`,background:`none`,border:`none`,color:`#999`,fontSize:`13px`,cursor:`pointer`,padding:`4px 8px`},"aria-label":`Close browser`,children:`✕`}),(0,m.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`chat-logo`}),(0,m.jsx)(`h1`,{className:`chat-tagline`,children:`Connect Claude`}),(0,m.jsx)(`p`,{className:`chat-intro`,children:n?`Sign in and authorize in the browser below.`:`Open your email or prepare your accounts, then sign in.`}),!n&&(0,m.jsx)(`div`,{style:{marginTop:`12px`},children:(0,m.jsx)(c,{variant:`primary`,onClick:M,disabled:i,children:i?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(`span`,{className:`spin`,style:{display:`inline-block`},children:`✱`}),` Connecting…`]}):`Sign in to Claude`})}),n&&v===`native`&&(0,m.jsxs)(`div`,{style:{marginTop:`14px`,maxWidth:`420px`,margin:`14px auto 0`,display:`flex`,flexDirection:`column`,gap:`8px`},children:[(0,m.jsx)(`label`,{style:{fontSize:`12px`,color:`#999`,lineHeight:1.4},children:`If the browser didn't finish sign-in, paste the code or full redirect URL from Claude's page:`}),(0,m.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,m.jsx)(`input`,{type:`text`,value:b,onChange:e=>x(e.target.value),placeholder:`Paste code or redirect URL`,style:{flex:1,padding:`8px 10px`,fontSize:`13px`,border:`1px solid #ccc`,borderRadius:`6px`}}),(0,m.jsx)(c,{variant:`primary`,onClick:A,disabled:!b.trim(),children:`Submit`})]}),S&&(0,m.jsx)(`p`,{style:{fontSize:`12px`,color:`#999`,margin:0},children:S})]})]}),(0,m.jsx)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,minHeight:0,gap:`10px`,padding:`0 0 16px`},children:O&&(0,m.jsx)(d,{preferTargetId:w,cacheKey:E,chrome:!1})}),s&&(0,m.jsx)(`p`,{className:`admin-pin-error`,style:{textAlign:`center`,padding:`0 20px 16px`},children:s})]}):(0,m.jsx)(`div`,{className:`connect-page`,children:(0,m.jsxs)(`div`,{className:`connect-content`,children:[(0,m.jsxs)(`div`,{className:`connect-logos`,children:[(0,m.jsx)(`div`,{className:`connect-logo-wrap`,children:(0,m.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`connect-logo`})}),(0,m.jsx)(`svg`,{className:`connect-arrow`,viewBox:`0 0 48 24`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,children:(0,m.jsx)(`path`,{d:`M0 12h44m0 0l-8-8m8 8l-8 8`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`})}),(0,m.jsxs)(`div`,{className:`connect-logo-wrap`,children:[(0,m.jsx)(`img`,{src:a,alt:t.productName,className:`connect-logo connect-logo--maxy`}),!t.logoContainsName&&(0,m.jsx)(`span`,{className:`connect-logo-label`,children:t.productName})]})]}),(0,m.jsxs)(`h1`,{className:`connect-title`,children:[`Connect Claude to power `,t.productName]}),(0,m.jsx)(`p`,{className:`connect-subtitle`,children:`Sign in with your Anthropic account to get started.`}),(0,m.jsx)(c,{variant:`primary`,onClick:M,disabled:i,children:i?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(`span`,{className:`spin`,style:{display:`inline-block`},children:`✱`}),` Connecting…`]}):`Sign in to Claude`}),(0,m.jsx)(`p`,{style:{marginTop:`6px`,fontSize:`11px`,color:`#999`,maxWidth:`300px`,textAlign:`center`,lineHeight:`1.4`},children:`First time? You may need to sign into your email and Anthropic account in the browser before connecting.`}),(0,m.jsx)(`button`,{onClick:j,disabled:g,style:{marginTop:`12px`,background:`none`,border:`none`,color:`var(--color-primary, #666)`,fontSize:`13px`,cursor:`pointer`,textDecoration:`underline`,textUnderlineOffset:`3px`},children:g?`Launching…`:`Open browser first`}),s&&(0,m.jsx)(`p`,{className:`admin-pin-error`,children:s})]})})}function y({auth:e}){return e.appState===`loading`?(0,m.jsx)(o,{surface:`gate`}):e.appState===`set-pin`?(0,m.jsx)(g,{pin:e.pin,setPin:e.setPin,showPin:e.showPin,setShowPin:e.setShowPin,pinLoading:e.pinLoading,pinError:e.pinError,pinInputRef:e.pinInputRef,setPinFormRef:e.setPinFormRef,onSubmit:e.handleSetPin,operatorName:e.operatorName,setOperatorName:e.setOperatorName}):e.appState===`connect-claude`?(0,m.jsx)(v,{authPolling:e.authPolling,setAuthPolling:e.setAuthPolling,authLoading:e.authLoading,setAuthLoading:e.setAuthLoading,pinError:e.pinError,setPinError:e.setPinError,setAppState:e.setAppState}):e.appState===`enter-pin`?(0,m.jsx)(_,{pin:e.pin,setPin:e.setPin,showPin:e.showPin,setShowPin:e.setShowPin,pinLoading:e.pinLoading,pinError:e.pinError,pinInputRef:e.pinInputRef,onSubmit:e.handleLogin,remoteAuthEnabled:e.remoteAuthEnabled,onSignOutRemote:()=>{window.location.href=`/__remote-auth/logout`}}):null}export{p as n,y as t};
@@ -0,0 +1,2 @@
1
+ import{o as e}from"./chunk-CltuBf4Z.js";import{A as t,B as n,C as r,D as i,E as a,F as o,G as s,H as c,I as l,K as u,M as d,N as f,O as p,P as m,Q as h,R as g,S as _,T as v,U as y,V as b,Z as x,_ as S,a as C,b as ee,c as te,g as w,h as T,i as ne,j as E,k as D,m as O,n as re,q as ie,s as ae,t as oe,v as se,x as k,z as A}from"./useMediaQuery-CA6dR5iz.js";async function j(){try{let e=await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`logout`})});return e.ok?(await e.json().catch(()=>({})))?.logged_out===!0:(console.error(`[admin-ui] claude-logout http-status=${e.status}`),!1)}catch(e){return console.error(`[admin-ui] claude-logout fetch failed: ${e instanceof Error?e.message:String(e)}`),!1}}var M=u();function ce({checked:e,onChange:t,label:n,disabled:r,ariaLabel:i=n}){return(0,M.jsxs)(`label`,{className:`maxy-checkbox${r?` maxy-checkbox--disabled`:``}`,children:[(0,M.jsx)(`input`,{type:`checkbox`,"aria-label":i,checked:e,onChange:e=>t(e.target.checked),disabled:r}),(0,M.jsx)(`span`,{className:`maxy-checkbox__box`,children:`✱`}),n&&(0,M.jsx)(`span`,{className:`maxy-checkbox__label`,children:n})]})}var N=e(h(),1),le={sm:14,md:16,lg:18},P={sm:30,md:38,lg:46};function F({variant:e=`primary`,size:t=`md`,icon:n,iconPosition:r=`leading`,loading:i=!1,fullWidth:a=!1,disabled:o=!1,type:s=`button`,onClick:c,"aria-label":l,"aria-pressed":u,style:d,className:f,children:p}){let m=[`btn`,`btn--${e}`,t===`md`?``:`btn--${t}`,a?`btn--full`:``,f].filter(Boolean).join(` `),h=le[t],g={...e===`send`?{width:P[t],height:P[t]}:{},...d},_=Object.keys(g).length>0;return(0,M.jsxs)(`button`,{type:s,className:m,disabled:i||o,onClick:c,"aria-label":l,"aria-pressed":u,style:_?g:void 0,children:[(0,M.jsxs)(`span`,{className:`btn__content`,style:{visibility:i?`hidden`:`visible`},children:[n&&r===`leading`&&(0,M.jsx)(n,{size:h}),p,n&&r===`trailing`&&(0,M.jsx)(n,{size:h})]}),i&&(0,M.jsx)(`span`,{className:`btn__spinner`,children:`✱`})]})}var I=b(`archive-restore`,[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h2`,key:`tvwodi`}],[`path`,{d:`M20 8v11a2 2 0 0 1-2 2h-2`,key:`1gkqxj`}],[`path`,{d:`m9 15 3-3 3 3`,key:`1pd0qc`}],[`path`,{d:`M12 12v9`,key:`192myk`}]]),ue=b(`archive`,[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8`,key:`1s80jp`}],[`path`,{d:`M10 12h4`,key:`a56b0p`}]]),de=b(`arrow-right`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`m12 5 7 7-7 7`,key:`xquz4c`}]]),fe=b(`bot`,[[`path`,{d:`M12 8V4H8`,key:`hb8ula`}],[`rect`,{width:`16`,height:`12`,x:`4`,y:`8`,rx:`2`,key:`enze0r`}],[`path`,{d:`M2 14h2`,key:`vft8re`}],[`path`,{d:`M20 14h2`,key:`4cs60a`}],[`path`,{d:`M15 13v2`,key:`1xurst`}],[`path`,{d:`M9 13v2`,key:`rq6x2g`}]]),pe=b(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),L=b(`ellipsis-vertical`,[[`circle`,{cx:`12`,cy:`12`,r:`1`,key:`41hilf`}],[`circle`,{cx:`12`,cy:`5`,r:`1`,key:`gxeob9`}],[`circle`,{cx:`12`,cy:`19`,r:`1`,key:`lyex9k`}]]),me=b(`external-link`,[[`path`,{d:`M15 3h6v6`,key:`1q9fwt`}],[`path`,{d:`M10 14 21 3`,key:`gplh6r`}],[`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`,key:`a6xqqp`}]]),he=b(`gauge`,[[`path`,{d:`m12 14 4-4`,key:`9kzdfg`}],[`path`,{d:`M3.34 19a10 10 0 1 1 17.32 0`,key:`19p75a`}]]),ge=b(`list-todo`,[[`path`,{d:`M13 5h8`,key:`a7qcls`}],[`path`,{d:`M13 12h8`,key:`h98zly`}],[`path`,{d:`M13 19h8`,key:`c3s6r1`}],[`path`,{d:`m3 17 2 2 4-4`,key:`1jhpwq`}],[`rect`,{x:`3`,y:`4`,width:`6`,height:`6`,rx:`1`,key:`cif1o7`}]]),_e=b(`message-square`,[[`path`,{d:`M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z`,key:`18887p`}]]),R=b(`minimize-2`,[[`path`,{d:`m14 10 7-7`,key:`oa77jy`}],[`path`,{d:`M20 10h-6V4`,key:`mjg0md`}],[`path`,{d:`m3 21 7-7`,key:`tjx5ai`}],[`path`,{d:`M4 14h6v6`,key:`rmj7iw`}]]),ve=b(`panel-left`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M9 3v18`,key:`fh3hqa`}]]),ye=b(`sliders-horizontal`,[[`path`,{d:`M10 5H3`,key:`1qgfaw`}],[`path`,{d:`M12 19H3`,key:`yhmn1j`}],[`path`,{d:`M14 3v4`,key:`1sua03`}],[`path`,{d:`M16 17v4`,key:`1q0r14`}],[`path`,{d:`M21 12h-9`,key:`1o4lsq`}],[`path`,{d:`M21 19h-5`,key:`1rlt1p`}],[`path`,{d:`M21 5h-7`,key:`1oszz2`}],[`path`,{d:`M8 10v4`,key:`tgpxqk`}],[`path`,{d:`M8 12H3`,key:`a7s4jb`}]]),be=b(`wand-sparkles`,[[`path`,{d:`m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72`,key:`ul74o6`}],[`path`,{d:`m14 7 3 3`,key:`1r5n42`}],[`path`,{d:`M5 6v4`,key:`ilb8ba`}],[`path`,{d:`M19 14v4`,key:`blhpug`}],[`path`,{d:`M10 2v2`,key:`7u0qdc`}],[`path`,{d:`M7 8H3`,key:`zfb6yr`}],[`path`,{d:`M21 16h-4`,key:`1cnmox`}],[`path`,{d:`M11 3H9`,key:`1obp7u`}]]),xe=b(`waypoints`,[[`path`,{d:`m10.586 5.414-5.172 5.172`,key:`4mc350`}],[`path`,{d:`m18.586 13.414-5.172 5.172`,key:`8c96vv`}],[`path`,{d:`M6 12h12`,key:`8npq4p`}],[`circle`,{cx:`12`,cy:`20`,r:`2`,key:`144qzu`}],[`circle`,{cx:`12`,cy:`4`,r:`2`,key:`muu5ef`}],[`circle`,{cx:`20`,cy:`12`,r:`2`,key:`1xzzfp`}],[`circle`,{cx:`4`,cy:`12`,r:`2`,key:`1hvhnz`}]]),Se=b(`zap`,[[`path`,{d:`M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z`,key:`1xq2db`}]]),Ce=`/cdp-screencast`;function z(e){return{format:`jpeg`,quality:60,maxWidth:e?Math.max(320,Math.round(e.width)):1280,maxHeight:e?Math.max(320,Math.round(e.height)):800,everyNthFrame:1}}function B(e,t,n,r){return n.width<=0||n.height<=0?{x:0,y:0}:{x:e/n.width*r.deviceWidth,y:t/n.height*r.deviceHeight}}function we(e){return e===0?`left`:e===1?`middle`:e===2?`right`:`none`}function Te(e,t){let n=we(t.button);return{type:e,x:t.x,y:t.y,button:n,buttons:t.buttons,clickCount:e===`mouseMoved`?0:1,modifiers:t.modifiers}}function Ee(e){return{type:`mouseWheel`,x:e.x,y:e.y,button:`none`,buttons:0,clickCount:0,modifiers:e.modifiers,deltaX:e.deltaX,deltaY:e.deltaY}}var De={Backspace:8,Tab:9,Enter:13,Escape:27,PageUp:33,PageDown:34,End:35,Home:36,ArrowLeft:37,ArrowUp:38,ArrowRight:39,ArrowDown:40,Delete:46},Oe={Enter:`\r`,Tab:` `};function ke(e,t){let n=t.key.length===1,r=n&&/[a-z0-9]/i.test(t.key)?t.key.toUpperCase().charCodeAt(0):De[t.key]??0,i={type:e,key:t.key,code:t.code,modifiers:t.modifiers,windowsVirtualKeyCode:r,nativeVirtualKeyCode:r};if(e===`keyDown`){let e=n?t.key:Oe[t.key];e!==void 0&&(i.text=e,i.unmodifiedText=e)}return i}function Ae(e){let t=e.trim();return t?/^[a-z][a-z0-9+.-]*:/i.test(t)?t:`https://${t}`:``}function je(e){try{return new URL(Ae(e)).host}catch{return``}}function Me(e,t,n){return`${e.protocol===`https:`?`wss`:`ws`}://${e.host}${Ce}?targetId=${encodeURIComponent(t)}&sid=${encodeURIComponent(n)}`}var Ne=class{nextId=1;startId=null;frames=0;stopped=!1;lastMetadata=null;lastInputLogAtMs=null;inputsSinceLog=0;pending=new Map;constructor(e,t){this.ws=e,this.opts=t}frameCount(){return this.frames}start(e){this.send(`Page.enable`,{}),e&&this.setPaneSize(e);let t=z(e);this.startId=this.send(`Page.startScreencast`,t)}setPaneSize(e){let t=Math.max(1,Math.round(e.width)),n=Math.max(1,Math.round(e.height));this.send(`Emulation.setDeviceMetricsOverride`,{width:t,height:n,deviceScaleFactor:0,mobile:!1})}stop(){if(this.stopped)return;this.stopped=!0;let e=this.send(`Page.stopScreencast`,{})!==null;this.send(`Emulation.clearDeviceMetricsOverride`,{}),this.opts.onLog(`teardown`,{stopSent:e})}handleMessage(e){let t;try{t=JSON.parse(e)}catch{return}if(typeof t.id==`number`){let e=this.pending.get(t.id);if(e){this.pending.delete(t.id),e(t.error?null:t.result);return}}if(typeof t.id==`number`&&t.id===this.startId){if(t.error)this.opts.onLog(`start-failed`,{err:t.error.message??`unknown`});else{let e=z();this.opts.onLog(`screencast-started`,{format:e.format,everyNthFrame:e.everyNthFrame})}return}if(t.method===`Page.frameNavigated`){let e=t.params?.frame;e&&e.parentId===void 0&&typeof e.url==`string`&&this.opts.onUrlChange?.(e.url);return}if(t.method!==`Page.screencastFrame`||this.stopped)return;let n=t.params;if(typeof n?.data!=`string`||typeof n?.metadata!=`object`||n.metadata===null)return;let r=n.metadata;typeof n.sessionId==`number`&&this.send(`Page.screencastFrameAck`,{sessionId:n.sessionId}),this.frames+=1,this.lastMetadata=r,this.frames%30==0&&this.opts.onLog(`frame`,{seq:this.frames}),this.opts.onFrame({data:n.data,metadata:r})}dispatchMouse(e,t){let n=this.lastMetadata;if(!n)return;let r=B(t.canvasX,t.canvasY,t.rendered,n);this.send(`Input.dispatchMouseEvent`,Te(e,{x:r.x,y:r.y,button:t.button,buttons:t.buttons,modifiers:t.modifiers})),this.logInput(`mouse`)}dispatchWheel(e){let t=this.lastMetadata;if(!t)return;let n=B(e.canvasX,e.canvasY,e.rendered,t);this.send(`Input.dispatchMouseEvent`,Ee({x:n.x,y:n.y,deltaX:e.deltaX,deltaY:e.deltaY,modifiers:e.modifiers})),this.logInput(`wheel`)}dispatchKey(e,t){this.send(`Input.dispatchKeyEvent`,ke(e,t)),this.logInput(`key`)}insertText(e){e&&(this.send(`Input.insertText`,{text:e}),this.logInput(`paste`))}navigate(e){let t=Ae(e);t&&(this.send(`Page.navigate`,{url:t}),this.opts.onLog(`navigate`,{host:je(t)}))}async goHistory(e){let t=e<0?`back`:`forward`,n=await this.command(`Page.getNavigationHistory`,{});if(!n){this.opts.onLog(`history`,{dir:t,outcome:`no-result`});return}let{currentIndex:r,entries:i}=n,a=typeof r==`number`?i?.[r+e]:void 0;if(!a||typeof a.id!=`number`){this.opts.onLog(`history`,{dir:t,outcome:`no-entry`});return}this.send(`Page.navigateToHistoryEntry`,{entryId:a.id}),this.opts.onLog(`history`,{dir:t})}command(e,t){let n=this.send(e,t);return n===null?Promise.resolve(null):new Promise(e=>this.pending.set(n,e))}logInput(e){this.inputsSinceLog+=1;let t=(this.opts.now??Date.now)();if(this.lastInputLogAtMs!==null&&t-this.lastInputLogAtMs<1e3)return;this.lastInputLogAtMs=t;let n=this.inputsSinceLog;this.inputsSinceLog=0,this.opts.onLog(`input`,{kind:e,count:n})}send(e,t){let n=this.nextId++;try{return this.ws.send(JSON.stringify({id:n,method:e,params:t})),n}catch(t){return this.opts.onLog(`send-failed`,{method:e,err:t instanceof Error?t.message:String(t)}),null}}};function Pe(e){let{targets:n,activeId:r,url:i,busy:o}=e,[s,c]=(0,N.useState)(i),l=(0,N.useRef)(null);return(0,N.useEffect)(()=>{l.current&&document.activeElement===l.current||c(i)},[i]),(0,N.useEffect)(()=>{c(e.url)},[r]),(0,M.jsxs)(`div`,{className:`browser-chrome`,children:[(0,M.jsxs)(`div`,{className:`browser-chrome__tabs`,role:`tablist`,children:[n.map(t=>(0,M.jsxs)(`div`,{className:t.id===r?`browser-chrome__tab is-active`:`browser-chrome__tab`,role:`tab`,"aria-selected":t.id===r,children:[(0,M.jsx)(`button`,{type:`button`,className:`browser-chrome__tab-label`,onClick:()=>e.onSelect(t.id),title:t.url,children:t.title}),(0,M.jsx)(`button`,{type:`button`,className:`browser-chrome__tab-close`,"aria-label":`Close ${t.title}`,onClick:()=>e.onClose(t.id),disabled:o,children:(0,M.jsx)(k,{size:12,strokeWidth:2})})]},t.id)),(0,M.jsx)(`button`,{type:`button`,className:`browser-chrome__new`,"aria-label":`New tab`,title:`New tab`,onClick:e.onNew,disabled:o,children:(0,M.jsx)(a,{size:14,strokeWidth:2})}),(e.onToggleFull||e.onClosePane)&&(0,M.jsxs)(`div`,{className:`browser-chrome__window`,children:[e.onToggleFull&&(0,M.jsx)(`button`,{type:`button`,className:`browser-chrome__nav`,"aria-label":e.isFull?`Exit full screen`:`Full screen`,title:e.isFull?`Exit full screen`:`Full screen`,onClick:e.onToggleFull,children:e.isFull?(0,M.jsx)(R,{size:15,strokeWidth:1.75}):(0,M.jsx)(t,{size:15,strokeWidth:1.75})}),e.onClosePane&&(0,M.jsx)(`button`,{type:`button`,className:`browser-chrome__nav`,"aria-label":`Close browser`,title:`Close browser`,onClick:e.onClosePane,children:(0,M.jsx)(k,{size:16,strokeWidth:1.75})})]})]}),(0,M.jsxs)(`form`,{className:`browser-chrome__bar`,onSubmit:t=>{t.preventDefault(),e.onNavigate(s)},children:[(0,M.jsx)(`button`,{type:`button`,className:`browser-chrome__nav`,"aria-label":`Back`,title:`Back`,onClick:e.onBack,children:(0,M.jsx)(A,{size:16,strokeWidth:1.75})}),(0,M.jsx)(`button`,{type:`button`,className:`browser-chrome__nav`,"aria-label":`Forward`,title:`Forward`,onClick:e.onForward,children:(0,M.jsx)(de,{size:16,strokeWidth:1.75})}),(0,M.jsx)(`input`,{ref:l,className:`browser-chrome__url`,"aria-label":`Address`,placeholder:`Type a URL`,value:s,onChange:e=>c(e.target.value)})]})]})}function V(e){return(e.altKey?1:0)|(e.ctrlKey?2:0)|(e.metaKey?4:0)|(e.shiftKey?8:0)}function Fe({preferTargetId:e=null,cacheKey:t=null,chrome:n=!0,surface:r=`browser`,onToggleFull:i,onClosePane:a,isFull:o=!1}={}){let[s,c]=(0,N.useState)(`probing`),[l,u]=(0,N.useState)([]),[d,p]=(0,N.useState)(null),[m,h]=(0,N.useState)(!1),[g,_]=(0,N.useState)(null),[v,y]=(0,N.useState)(!1),[b,x]=(0,N.useState)(``),S=ee(t),C=(0,N.useRef)(null),te=(0,N.useRef)(null),w=(0,N.useRef)(null),T=(0,N.useRef)(``),ne=(0,N.useRef)(e);ne.current=e,T.current||=`sc-${Math.random().toString(36).slice(2,10)}`;let D=(0,N.useCallback)((e,t={})=>{S(`/api/admin/browser/screencast-event`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({sid:T.current,op:e,...t})}).catch(()=>{})},[S]),O=(0,N.useCallback)(async()=>{try{let e=await S(`/api/admin/browser/screencast-targets`);if(!e.ok){c(`unavailable`);return}let t=await e.json().catch(()=>({})),n=Array.isArray(t.targets)?t.targets:[];if(u(n),n.length===0){p(null),c(`no-tabs`);return}let r=ne.current;p(e=>r&&n.some(e=>e.id===r)?r:e&&n.some(t=>t.id===e)?e:n[0].id),c(`live`)}catch{c(`unavailable`)}},[S]);(0,N.useEffect)(()=>{D(`request`),O()},[O,D]),(0,N.useEffect)(()=>{n&&D(`chrome-mounted`,{surface:r,chrome:`v1`})},[n,r,D]),(0,N.useEffect)(()=>{x(l.find(e=>e.id===d)?.url??``)},[l,d]);let re=(0,N.useRef)(null);(0,N.useEffect)(()=>{if(e){if(l.some(t=>t.id===e)){p(e);return}re.current!==e&&(re.current=e,O())}},[e,l,O]);let ie=(0,N.useCallback)(e=>{let t=C.current;if(!t)return;let n=new Image;n.onload=()=>{t.width=n.naturalWidth,t.height=n.naturalHeight,t.getContext(`2d`)?.drawImage(n,0,0)},n.src=`data:image/jpeg;base64,${e.data}`},[]),ae=(0,N.useCallback)(()=>{let e=te.current;if(!e)return;let t=e.getBoundingClientRect();if(!(t.width<1||t.height<1))return{width:t.width,height:t.height}},[]);(0,N.useEffect)(()=>{let e=te.current;if(!e||typeof ResizeObserver>`u`)return;let t=new ResizeObserver(()=>{let e=ae();e&&w.current?.setPaneSize(e)});return t.observe(e),()=>t.disconnect()},[s,ae]),(0,N.useEffect)(()=>{if(s!==`live`||!d)return;let e=Me({protocol:window.location.protocol,host:window.location.host},d,T.current),t=new WebSocket(e),n=new Ne(t,{onFrame:ie,onLog:D,onUrlChange:x});return w.current=n,t.addEventListener(`open`,()=>n.start(ae())),t.addEventListener(`message`,e=>{typeof e.data==`string`&&n.handleMessage(e.data)}),()=>{n.stop(),t.close(),w.current=null}},[s,d,ie,D]);let oe=(0,N.useCallback)(e=>t=>{let n=C.current;if(!n)return;let r=n.getBoundingClientRect();w.current?.dispatchMouse(e,{canvasX:t.clientX-r.left,canvasY:t.clientY-r.top,rendered:{width:r.width,height:r.height},button:e===`mouseMoved`?-1:t.button,buttons:t.buttons,modifiers:V(t)})},[]);(0,N.useEffect)(()=>{let e=C.current;if(!e)return;let t=t=>{t.preventDefault();let n=e.getBoundingClientRect();w.current?.dispatchWheel({canvasX:t.clientX-n.left,canvasY:t.clientY-n.top,rendered:{width:n.width,height:n.height},deltaX:t.deltaX,deltaY:t.deltaY,modifiers:V(t)})};return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[s]);let se=(0,N.useCallback)(e=>t=>{t.preventDefault(),w.current?.dispatchKey(e,{key:t.key,code:t.code,modifiers:V(t)})},[]),k=(0,N.useCallback)(e=>{e.preventDefault();let t=e.clipboardData.getData(`text`);t&&w.current?.insertText(t)},[]),A=(0,N.useCallback)(async()=>{h(!0),_(null);try{let e=await S(`/api/admin/browser/launch`,{method:`POST`});if(!e.ok){let t=await e.json().catch(()=>({}));throw Error(t.error||`Launch failed (${e.status})`)}await O()}catch(e){_(e instanceof Error?e.message:String(e))}finally{h(!1)}},[S,O]),j=(0,N.useCallback)(async()=>{y(!0),_(null);try{s===`no-tabs`&&await S(`/api/admin/browser/launch`,{method:`POST`});let e=await S(`/api/admin/browser/tabs`,{method:`POST`});if(!e.ok){let t=await e.json().catch(()=>({}));throw Error(t.error||`New tab failed (${e.status})`)}let t=await e.json().catch(()=>({}));await O(),t.id&&p(t.id)}catch(e){_(e instanceof Error?e.message:String(e))}finally{y(!1)}},[S,O,s]),ce=(0,N.useCallback)(async e=>{y(!0),_(null);try{let t=await S(`/api/admin/browser/tabs/${encodeURIComponent(e)}`,{method:`DELETE`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error||`Close failed (${t.status})`)}await O()}catch(e){_(e instanceof Error?e.message:String(e))}finally{y(!1)}},[S,O]),le=(0,N.useCallback)(e=>{w.current?.navigate(e)},[]),P=(0,N.useCallback)(e=>{w.current?.goHistory(e)},[]);return s===`probing`?(0,M.jsx)(`div`,{className:`cdp-screencast`,children:(0,M.jsxs)(`div`,{className:`data-loading`,children:[(0,M.jsx)(E,{size:18,className:`spin`}),` Connecting to the device browser…`]})}):s===`unavailable`?(0,M.jsx)(`div`,{className:`cdp-screencast`,children:(0,M.jsxs)(`div`,{className:`cdp-screencast__unavailable`,children:[(0,M.jsx)(f,{size:28,strokeWidth:1.75}),(0,M.jsx)(`p`,{children:`The device browser is not reachable.`})]})}):(0,M.jsxs)(`div`,{className:`cdp-screencast`,children:[n&&(0,M.jsx)(Pe,{targets:l,activeId:d,url:b,busy:v,onSelect:p,onClose:ce,onNew:j,onBack:()=>P(-1),onForward:()=>P(1),onNavigate:le,onToggleFull:i,onClosePane:a,isFull:o}),g&&(0,M.jsx)(`div`,{className:`cdp-screencast__toolbar`,children:(0,M.jsx)(`span`,{className:`cdp-screencast__error`,children:g})}),s===`no-tabs`?(0,M.jsxs)(`div`,{className:`cdp-screencast__unavailable`,children:[(0,M.jsx)(f,{size:28,strokeWidth:1.75}),(0,M.jsx)(`p`,{children:`No open tabs on the device browser.`}),(0,M.jsxs)(`button`,{type:`button`,className:`cdp-screencast__btn`,onClick:A,disabled:m,children:[m?(0,M.jsx)(E,{size:14,className:`spin`}):(0,M.jsx)(f,{size:14}),` Launch browser`]})]}):(0,M.jsxs)(M.Fragment,{children:[!n&&(0,M.jsx)(`div`,{className:`cdp-screencast__tabs`,children:l.map(e=>(0,M.jsx)(`button`,{type:`button`,className:e.id===d?`cdp-screencast__tab is-active`:`cdp-screencast__tab`,onClick:()=>p(e.id),title:e.url,children:e.title},e.id))}),(0,M.jsx)(`div`,{className:`cdp-screencast__viewport`,ref:te,children:(0,M.jsx)(`canvas`,{ref:C,className:`cdp-screencast__canvas`,tabIndex:0,onMouseDown:oe(`mousePressed`),onMouseUp:oe(`mouseReleased`),onMouseMove:oe(`mouseMoved`),onKeyDown:se(`keyDown`),onKeyUp:se(`keyUp`),onPaste:k})})]})]})}var Ie=5e3,Le=1200;function Re(e){return Math.max(Le,Math.round(Ie/(e<1?1:e)))}var H=500,U=new Set;function ze(e,t,n){let r=n??(typeof globalThis.fetch==`function`?globalThis.fetch:void 0);if(U.has(e)||!r)return!1;if(U.size>=H){for(let e of U)if(U.delete(e),U.size<H)break}U.add(e);try{Promise.resolve(r(`/api/admin/events`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({event:`wa-notify:rendered`,fields:{msgId:e,senderType:t}})})).catch(()=>{})}catch{}return!0}function Be({type:e}){return e===`admin`?(0,M.jsx)(`svg`,{className:`wa-notify-icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:(0,M.jsx)(`path`,{d:`M8 1.5 13 3.5v4c0 3-2.1 5.8-5 7-2.9-1.2-5-4-5-7v-4z`})}):e===`manager-active`?(0,M.jsx)(`svg`,{className:`wa-notify-icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:(0,M.jsx)(`path`,{d:`M2 5.5h9l-2.5-2.5 1-1L14 6l-4.5 4-1-1L11 6.5H2zM14 10.5H5l2.5 2.5-1 1L2 10l4.5-4 1 1L5 9.5h9z`})}):e===`manager-passive`?(0,M.jsx)(`svg`,{className:`wa-notify-icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:(0,M.jsx)(`path`,{d:`M8 3C4.5 3 1.7 5.4 1 8c.7 2.6 3.5 5 7 5s6.3-2.4 7-5c-.7-2.6-3.5-5-7-5m0 8a3 3 0 1 1 0-6 3 3 0 0 1 0 6`})}):(0,M.jsx)(`svg`,{className:`wa-notify-icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:(0,M.jsx)(`path`,{d:`M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6m0 1.5c-3 0-5.5 1.6-5.5 3.5v1h11v-1c0-1.9-2.5-3.5-5.5-3.5`})})}function Ve({frames:e,onExpire:t}){let n=(0,N.useRef)(new Map),r=(0,N.useRef)(new Map);return(0,N.useEffect)(()=>{let i=Date.now(),a=Re(e.length),o=new Set(e.map(e=>e.waMessageId));for(let e of[...n.current.keys()])o.has(e)||(n.current.delete(e),r.current.delete(e));let s=[];for(let o of e){let e=o.waMessageId;n.current.has(e)||(n.current.set(e,i),ze(e,o.senderType));let c=r.current.get(e),l=c===void 0?a:Math.min(c,a);r.current.set(e,l);let u=i-(n.current.get(e)??i);s.push(setTimeout(()=>t(e),Math.max(0,l-u)))}return()=>{for(let e of s)clearTimeout(e)}},[e,t]),e.length===0?null:(0,M.jsx)(`div`,{className:`wa-notify-host`,children:[...e].reverse().map(e=>(0,M.jsxs)(`div`,{className:`wa-notify-card`,role:`status`,children:[(0,M.jsxs)(`div`,{className:`wa-notify-head`,children:[(0,M.jsx)(`span`,{className:`wa-notify-pill wa-notify-pill-${e.senderType}`,children:(0,M.jsx)(Be,{type:e.senderType})}),(0,M.jsx)(`span`,{className:`wa-notify-account`,children:e.accountName})]}),(0,M.jsx)(`div`,{className:`wa-notify-sender`,children:e.senderDisplay}),(0,M.jsxs)(`div`,{className:`wa-notify-body`,children:[e.body,e.truncated?`…`:``]})]},e.waMessageId))})}var He=`wa-notify`;function Ue({connected:e,onConnectClaude:t}){return e?(0,M.jsxs)(`span`,{className:`claude-status-pill`,"data-connected":`true`,title:`Claude is connected`,children:[(0,M.jsx)(`img`,{src:`/brand/claude.png`,alt:``,className:`claude-status-pill__mark`}),(0,M.jsx)(`span`,{className:`claude-status-pill__label`,children:`Connected`}),(0,M.jsx)(`span`,{className:`claude-status-pill__dot claude-status-pill__dot--live`,"aria-hidden":`true`})]}):(0,M.jsxs)(`button`,{type:`button`,className:`claude-status-pill claude-status-pill--action`,"data-connected":`false`,onClick:t,title:`Connect Claude`,children:[(0,M.jsx)(`img`,{src:`/brand/claude.png`,alt:``,className:`claude-status-pill__mark`}),(0,M.jsx)(`span`,{className:`claude-status-pill__label`,children:`Connect`}),(0,M.jsx)(`span`,{className:`claude-status-pill__dot claude-status-pill__dot--down`,"aria-hidden":`true`})]})}function We(e){return e===`/`||e===``?`Dashboard`:e.startsWith(`/chat`)?`Chat`:e.startsWith(`/tasks`)?`Tasks`:e.startsWith(`/data`)?`Data`:e.startsWith(`/calendar`)?`Calendar`:e.startsWith(`/graph`)?`Graph`:e.startsWith(`/activity`)?`Activity`:e.startsWith(`/browser`)?`Browser`:e.startsWith(`/routines`)?`Routines`:e.startsWith(`/skills`)?`Skills`:e.startsWith(`/agents`)?`Agents`:`Dashboard`}function Ge({title:e,sidebarOpen:t,onToggleSidebar:n,claudeConnected:r,onConnectClaude:i,onOpenBrowser:a}){let o=e??We(typeof window<`u`?window.location.pathname:`/`),s=r!==void 0&&i!==void 0,c=a!==void 0;return(0,M.jsxs)(`header`,{className:`admin-page-header`,children:[(0,M.jsxs)(`button`,{type:`button`,className:`admin-page-header__toggle`,"aria-label":t?`Hide sidebar`:`Show sidebar`,title:t?`Hide sidebar`:`Show sidebar`,"aria-expanded":t,onClick:n,children:[(0,M.jsx)(ve,{className:`admin-page-header__toggle-desktop`,size:18,strokeWidth:1.75}),(0,M.jsx)(D,{className:`admin-page-header__toggle-mobile`,size:22,strokeWidth:1.75})]}),(0,M.jsx)(`h1`,{className:`admin-page-header__title`,children:o}),(s||c)&&(0,M.jsxs)(`div`,{className:`admin-page-header__right`,children:[s&&(0,M.jsx)(Ue,{connected:r,onConnectClaude:i}),c&&(0,M.jsx)(`button`,{type:`button`,className:`admin-page-header__icon`,"aria-label":`Show browser`,title:`Show browser`,onClick:a,children:(0,M.jsx)(f,{size:18,strokeWidth:1.75})})]})]})}var Ke=[{label:`Home`,href:`/`,Icon:d,match:e=>e===`/`||e===``},{label:`Chat`,href:`/chat`,Icon:p,match:e=>e.startsWith(`/chat`)},{label:`Tasks`,href:`/tasks`,Icon:ge,match:e=>e.startsWith(`/tasks`)},{label:`Data`,href:`/data`,Icon:l,match:e=>e.startsWith(`/data`)},{label:`Calendar`,href:`/calendar`,Icon:g,match:e=>e.startsWith(`/calendar`)}],qe=[{label:`Chat`,href:`/`,Icon:p,match:e=>e===`/`||e===``||e.startsWith(`/chat`)},{label:`Data`,href:`/data`,Icon:l,match:e=>e.startsWith(`/data`)}];function Je(e){let t=Ke.find(t=>t.match(e));return t?t.href:`/`}function Ye({variant:e=`admin`,onOpenConversations:t}={}){let n=typeof window<`u`?window.location.pathname:`/`,r=e===`operator`?qe:Ke,i=e===`operator`?qe.find(e=>e.match(n))?.href??`/`:Je(n),a=e=>{let t=e.href===i,{Icon:n}=e;return(0,M.jsxs)(`a`,{href:e.href,className:`bottom-tab${t?` is-active`:``}`,"aria-current":t?`page`:void 0,children:[(0,M.jsx)(n,{size:19,strokeWidth:1.75}),(0,M.jsx)(`span`,{className:`bottom-tab__label`,children:e.label})]},e.href)};return(0,M.jsxs)(`nav`,{className:`bottom-tab-bar`,"aria-label":`Primary`,children:[r.slice(0,1).map(a),e===`operator`&&t&&(0,M.jsxs)(`button`,{type:`button`,className:`bottom-tab`,onClick:t,children:[(0,M.jsx)(p,{size:19,strokeWidth:1.75}),(0,M.jsx)(`span`,{className:`bottom-tab__label`,children:`Conversations`})]}),r.slice(1).map(a)]})}var Xe=`maxy-shell-side-px`;function Ze(){if(typeof window>`u`)return 0;let e=document.querySelector(`.platform > .artefact`)?.getBoundingClientRect();return e&&e.width>0?Math.round(e.width):0}function W(e){if(typeof window>`u`)return e;let t=window.innerWidth,n=Math.max(248,t-480-Ze());return Math.min(Math.max(e,248),n)}function Qe(){if(typeof window>`u`)return 264;try{let e=window.localStorage.getItem(Xe);if(!e)return 264;let t=parseInt(e,10);if(!Number.isFinite(t))return console.warn(`[admin-ui] sidebar-width-parse-failed stored=${JSON.stringify(e)} fallback=264`),264;if(t>=248)return W(t)}catch{}return 264}function $e({targetSelector:e=`.platform`}){let t=(0,N.useRef)(null),[n,r]=(0,N.useState)(()=>Qe()),i=(0,N.useRef)(n);(0,N.useLayoutEffect)(()=>{let t=document.querySelector(e);!t||!(t instanceof HTMLElement)||(t.style.setProperty(`--side-px`,`${n}px`),i.current=n)},[n,e]);let a=(0,N.useCallback)(()=>{r(e=>{let t=W(e);return t===e?e:t})},[]);(0,N.useEffect)(()=>{a(),window.addEventListener(`resize`,a);let t=document.querySelector(e),n=null;return t instanceof HTMLElement&&(n=new MutationObserver(a),n.observe(t,{attributes:!0,attributeFilter:[`data-artefact`,`class`]})),()=>{window.removeEventListener(`resize`,a),n?.disconnect()}},[a,e]);let o=e=>{e.preventDefault();let n=t.current;if(!n)return;n.setPointerCapture(e.pointerId),n.classList.add(`dragging`);let a=!1,o=e=>{a=!0,r(W(Math.round(e.clientX)))},s=()=>{if(n.releasePointerCapture(e.pointerId),n.classList.remove(`dragging`),window.removeEventListener(`pointermove`,o),window.removeEventListener(`pointerup`,s),!a)return;let t=i.current;try{window.localStorage.setItem(Xe,String(t))}catch{}};window.addEventListener(`pointermove`,o),window.addEventListener(`pointerup`,s)},s=()=>{r(W(264));try{window.localStorage.removeItem(Xe)}catch{}};return(0,M.jsx)(`div`,{ref:t,className:`side-resize-handle`,role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize sidebar`,onPointerDown:o,onDoubleClick:s})}var G=x();function et(e){return Math.max(14,e/2-386)}function K(e){return e.left===0&&e.top===0&&e.width===0&&e.height===0}var tt={position:`fixed`,visibility:`hidden`};function nt({anchorRef:e,onClose:t,className:n,role:r,ariaLabel:i,anchorId:a,children:o}){let s=(0,N.useRef)(null),[c,l]=(0,N.useState)(tt),u=(0,N.useCallback)(()=>{let t=s.current;if(!t)return;let r=e.current,i=[n,a].filter(Boolean).join(`:`)||`unknown`,o=t.getBoundingClientRect(),c=window.innerWidth,u=window.innerHeight,d=o.width>0&&o.height>0,f=r?r.getBoundingClientRect():null,p=(e,t)=>console.error(`[anchored-popover] op=offscreen id=${i} left=${e} top=${t} w=${o.width} h=${o.height} viewport=${c},${u}`);if(!f){l({position:`fixed`,left:Math.max(4,c-o.width-et(c)),top:Math.max(4,u-o.height-14),visibility:`visible`});return}if(d&&K(f)){l(tt),p(f.left,f.top);return}let m=f.right-o.width,h=c-o.width-4;m>h&&(m=h),m<4&&(m=4);let g=u-f.bottom-4,_=f.top-4,v=o.height+8<=g?!1:o.height+8<=_?!0:_>g,y=Math.max(0,v?_:g),b=v?Math.max(4,f.top-Math.min(o.height,y)):f.bottom;l({position:`fixed`,left:m,top:b,maxHeight:y,visibility:`visible`});let x=Math.min(o.height,y);d&&(m+o.width<=0||m>=c||b+x<=0||b>=u)&&p(m,b)},[e,a,n]);return(0,N.useLayoutEffect)(()=>{if(u(),typeof ResizeObserver>`u`)return;let e=new ResizeObserver(()=>u());return s.current&&e.observe(s.current),()=>e.disconnect()},[u]),(0,N.useEffect)(()=>{let n=e=>{e.key===`Escape`&&t()},r=n=>{let r=n.target;e.current?.contains(r)||s.current?.contains(r)||t()},i=n=>{let r=e.current;r&&n.target instanceof Node&&n.target.contains(r)&&t()},a=()=>t();return document.addEventListener(`keydown`,n),document.addEventListener(`pointerdown`,r),window.addEventListener(`scroll`,i,!0),window.addEventListener(`resize`,a),()=>{document.removeEventListener(`keydown`,n),document.removeEventListener(`pointerdown`,r),window.removeEventListener(`scroll`,i,!0),window.removeEventListener(`resize`,a)}},[e,t]),(0,G.createPortal)((0,M.jsx)(`div`,{ref:s,className:n,role:r,"aria-label":i,style:c,children:o}),document.body)}function rt({actions:e,disabled:t,label:n=`Session actions`}){let[r,i]=(0,N.useState)(!1),[a,o]=(0,N.useState)(null),s=(0,N.useRef)(null),c=(0,N.useCallback)(()=>{i(!1),o(null)},[]);return(0,M.jsxs)(`div`,{className:`conv-actions`,children:[(0,M.jsx)(`button`,{ref:s,type:`button`,className:`conv-action conv-actions-overflow`,onClick:()=>i(e=>!e),disabled:t,"aria-haspopup":`menu`,"aria-expanded":r,"aria-label":n,title:n,children:(0,M.jsx)(D,{size:12})}),r&&(0,M.jsx)(nt,{anchorRef:s,onClose:c,className:`conv-actions-menu`,role:`menu`,children:e.map(e=>e.panel?(0,M.jsxs)(`div`,{className:`conv-actions-menu-disclosure`,children:[(0,M.jsxs)(`button`,{type:`button`,role:`menuitem`,"aria-haspopup":`dialog`,"aria-expanded":a===e.key,title:e.title,disabled:t||e.disabled,onClick:()=>o(t=>t===e.key?null:e.key),children:[e.icon,(0,M.jsx)(`span`,{children:e.menuLabel})]}),a===e.key&&(0,M.jsx)(`div`,{className:`conv-actions-menu-panel`,children:e.panel()})]},e.key):(0,M.jsxs)(`button`,{type:`button`,role:`menuitem`,className:e.danger?`conv-action-danger`:void 0,"aria-busy":e.busy,title:e.title,disabled:t||e.disabled,onClick:t=>{e.onClick?.(t),c()},children:[e.icon,(0,M.jsx)(`span`,{children:e.menuLabel})]},e.key))})]})}var q=`claude-opus-5[1m]`,J=`claude-sonnet-5`,it=`claude-haiku-4-5`,at={[q]:`Opus 5 (1M context)`,[J]:`Sonnet 5`,[it]:`Haiku 4.5`};function ot(e){return at[e]??e}var st=[q,J,it];function ct(e){return e.replace(/\[1m\]$/,``)}function lt(e){return st.find(t=>ct(t)===ct(e))??e}var ut=[`default`,`acceptEdits`,`plan`,`auto`,`bypassPermissions`],Y=[`low`,`medium`,`high`,`xhigh`];[...ut],[...Y],[...Y];var dt=[q,J,it],ft={default:`Ask permissions`,acceptEdits:`Accept edits`,plan:`Plan mode`,auto:`Auto mode`,bypassPermissions:`Bypass permissions`},pt=ut.map(e=>({value:e,label:ft[e]??e})),mt={low:`Low`,medium:`Medium`,high:`High`,xhigh:`Highest`},ht=Y.map(e=>({value:e,label:mt[e]??e}));function gt(e){if(e){let t=dt.find(t=>ct(t)===ct(e));if(t)return t}return q}function _t({row:e,adminFetch:t,onError:n}){let[r,i]=(0,N.useState)(()=>gt(e.model)),[a,o]=(0,N.useState)(``),[s,c]=(0,N.useState)(``),[l,u]=(0,N.useState)(!1),d=(0,N.useRef)(!1);(0,N.useEffect)(()=>{i(gt(e.model))},[e.model]);let f=async()=>{if(!d.current){d.current=!0,u(!0);try{let i=await t(`/api/admin/session-reseat`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({fromSessionId:e.sessionId,model:r,...a?{permissionMode:a}:{},...s?{effort:s}:{}})});if(!i.ok){n(`Could not reset ${e.title} (status ${i.status})`),console.error(`[admin-ui] dashboard-reseat-failed sessionId=${e.sessionId} status=${i.status}`),d.current=!1,u(!1);return}let o=await i.json().catch(()=>({}));o.target?window.location.assign(o.target):(n(`Reset of ${e.title} returned no target`),d.current=!1,u(!1))}catch(t){n(`Could not reset ${e.title} (network error)`),console.error(`[admin-ui] dashboard-reseat-failed sessionId=${e.sessionId} error=${t instanceof Error?t.message:String(t)}`),d.current=!1,u(!1)}}};return(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(`label`,{className:`reseat-field`,children:[(0,M.jsx)(`span`,{children:`Model`}),(0,M.jsx)(`select`,{"data-kind":`model`,value:r,disabled:l,onChange:e=>i(e.target.value),children:dt.map(e=>(0,M.jsx)(`option`,{value:e,children:ot(e)},e))})]}),(0,M.jsxs)(`label`,{className:`reseat-field`,children:[(0,M.jsx)(`span`,{children:`Mode`}),(0,M.jsxs)(`select`,{"data-kind":`mode`,value:a,disabled:l,onChange:e=>o(e.target.value),children:[(0,M.jsx)(`option`,{value:``,children:`Keep current`}),pt.map(e=>(0,M.jsx)(`option`,{value:e.value,children:e.label},e.value))]})]}),(0,M.jsxs)(`label`,{className:`reseat-field`,children:[(0,M.jsx)(`span`,{children:`Effort`}),(0,M.jsxs)(`select`,{"data-kind":`effort`,value:s,disabled:l,onChange:e=>c(e.target.value),children:[(0,M.jsx)(`option`,{value:``,children:`Keep current`}),ht.map(e=>(0,M.jsx)(`option`,{value:e.value,children:e.label},e.value))]})]}),(0,M.jsx)(`button`,{type:`button`,className:`reseat-apply`,disabled:l,"aria-busy":l,onClick:()=>void f(),children:l?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(E,{size:12,className:`spin`,"aria-hidden":`true`}),`Resetting…`]}):`Reset`})]})}function vt(e){if(e<60)return`${e}s`;let t=Math.floor(e/60),n=e%60;return n>0?`${t}m ${n}s`:`${t}m`}function yt(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function bt({target:e,anchorEl:t,onConfirm:n,onCancel:r}){let i=(0,N.useRef)(null);return i.current=t,e?(0,M.jsxs)(nt,{anchorRef:i,onClose:r,className:`conv-delete-confirm`,role:`alertdialog`,ariaLabel:`Confirm delete session`,children:[(0,M.jsxs)(`div`,{className:`claude-info-header`,children:[(0,M.jsx)(`span`,{children:`Delete this conversation?`}),(0,M.jsx)(`button`,{className:`claude-info-close`,onClick:r,"aria-label":`Close`,children:`✕`})]}),(0,M.jsxs)(`div`,{className:`claude-info-section`,style:{padding:`12px 14px`,fontSize:`11px`,color:`var(--text-secondary)`},children:[(0,M.jsxs)(`div`,{className:`conv-delete-target`,children:[(0,M.jsx)(`span`,{className:`conv-delete-label`,title:e.title,children:e.title||`Untitled session`}),(0,M.jsx)(`code`,{className:`conv-delete-id`,title:e.sessionId,children:e.sessionId.slice(0,8)})]}),(0,M.jsx)(`div`,{style:{marginTop:`8px`},children:`This permanently removes the transcript. It is not moved to Archive and cannot be recovered.`}),e.live&&(0,M.jsx)(`div`,{style:{marginTop:`8px`},children:`This session is running; deleting stops it first.`})]}),(0,M.jsxs)(`div`,{className:`claude-info-section`,style:{display:`flex`,gap:`8px`,padding:`10px 14px`},children:[(0,M.jsx)(F,{variant:`danger`,size:`sm`,style:{flex:1},onClick:n,children:`Delete`}),(0,M.jsx)(F,{variant:`secondary`,size:`sm`,style:{flex:1},onClick:r,children:`Cancel`})]})]}):null}function xt({target:e,anchorEl:t,onConfirm:n,onCancel:r}){let i=(0,N.useRef)(null);return i.current=t,e?(0,M.jsxs)(nt,{anchorRef:i,onClose:r,className:`conv-delete-confirm`,role:`alertdialog`,ariaLabel:`Confirm delete task`,children:[(0,M.jsxs)(`div`,{className:`claude-info-header`,children:[(0,M.jsx)(`span`,{children:`Delete this task?`}),(0,M.jsx)(`button`,{className:`claude-info-close`,onClick:r,"aria-label":`Close`,children:`✕`})]}),(0,M.jsxs)(`div`,{className:`claude-info-section`,style:{padding:`12px 14px`,fontSize:`11px`,color:`var(--text-secondary)`},children:[(0,M.jsxs)(`div`,{className:`conv-delete-target`,children:[(0,M.jsx)(`span`,{className:`conv-delete-label`,title:e.name,children:e.name}),(0,M.jsx)(`code`,{className:`conv-delete-id`,children:C(e.secondsLogged)})]}),(0,M.jsx)(`div`,{style:{marginTop:`8px`},children:`This permanently removes the task and every time record on it. It cannot be recovered.`})]}),(0,M.jsxs)(`div`,{className:`claude-info-section`,style:{display:`flex`,gap:`8px`,padding:`10px 14px`},children:[(0,M.jsx)(F,{variant:`danger`,size:`sm`,style:{flex:1},onClick:n,children:`Delete`}),(0,M.jsx)(F,{variant:`secondary`,size:`sm`,style:{flex:1},onClick:r,children:`Cancel`})]})]}):null}function St({open:e,count:t,liveCount:n,onConfirm:r,onCancel:i}){if(!e)return null;let a=t===1?``:`s`;return(0,M.jsx)(`div`,{className:`claude-info-overlay`,onClick:i,children:(0,M.jsxs)(`div`,{className:`claude-info-modal`,onClick:e=>e.stopPropagation(),role:`alertdialog`,"aria-label":`Confirm delete sessions`,children:[(0,M.jsxs)(`div`,{className:`claude-info-header`,children:[(0,M.jsxs)(`span`,{children:[`Delete `,t,` conversation`,a,`?`]}),(0,M.jsx)(`button`,{className:`claude-info-close`,onClick:i,"aria-label":`Close`,children:`✕`})]}),(0,M.jsxs)(`div`,{className:`claude-info-section`,style:{padding:`12px 14px`,fontSize:`11px`,color:`var(--text-secondary)`},children:[`This permanently removes `,t,` transcript`,a,`. `,t===1?`It is`:`They are`,` not moved to Archive and cannot be recovered.`,n>0&&(0,M.jsxs)(`div`,{style:{marginTop:`8px`},children:[n,` `,n===1?`is`:`are`,` running and will be stopped first.`]})]}),(0,M.jsxs)(`div`,{className:`claude-info-section`,style:{display:`flex`,gap:`8px`,padding:`10px 14px`},children:[(0,M.jsxs)(F,{variant:`danger`,size:`sm`,style:{flex:1},onClick:r,children:[`Delete `,t]}),(0,M.jsx)(F,{variant:`secondary`,size:`sm`,style:{flex:1},onClick:i,children:`Cancel`})]})]})})}function Ct(e){return`New session: ${e.toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})}`}function wt({open:e,pending:t,onConfirm:n,onCancel:r,now:i}){let[a,o]=(0,N.useState)(``),s=(0,N.useRef)(null),c=(0,N.useRef)(null),l=(0,N.useRef)(!1);if((0,N.useEffect)(()=>{if(!e){c.current=null,l.current=!1;return}if(c.current!==null)return;let t=Ct(i?i():new Date);c.current=t,o(t)},[e,i]),(0,N.useEffect)(()=>{if(!e||l.current||c.current===null||a!==c.current)return;let t=s.current;t&&(l.current=!0,t.focus(),t.setSelectionRange(0,t.value.length))},[e,a]),!e)return null;let u=a.trim(),d=u.length>0&&u.length<=200,f=()=>{d&&!t&&n(u)},p=e=>{t||r(e)};return(0,M.jsx)(`div`,{className:`claude-info-overlay`,onClick:()=>p(`backdrop`),children:(0,M.jsxs)(`div`,{className:`claude-info-modal`,onClick:e=>e.stopPropagation(),role:`dialog`,"aria-label":`Name this session`,children:[(0,M.jsxs)(`div`,{className:`claude-info-header`,children:[(0,M.jsx)(`span`,{children:`Name this session`}),(0,M.jsx)(`button`,{className:`claude-info-close`,onClick:()=>p(`cancel`),"aria-label":`Close`,disabled:t,children:`✕`})]}),(0,M.jsxs)(`div`,{className:`claude-info-section`,style:{padding:`12px 14px`},children:[(0,M.jsx)(`input`,{ref:s,className:`new-session-name-input`,"aria-label":`Session name`,value:a,disabled:t,onChange:e=>o(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),f()),e.key===`Escape`&&(e.preventDefault(),p(`escape`))}}),(0,M.jsx)(`div`,{className:`new-session-name-hint`,children:u.length>200?`Too long by ${u.length-200}`:`You can rename it later from the session menu.`})]}),(0,M.jsxs)(`div`,{className:`claude-info-section`,style:{display:`flex`,gap:`8px`,padding:`10px 14px`},children:[(0,M.jsx)(F,{variant:`primary`,size:`sm`,style:{flex:1},disabled:!d||t,onClick:f,children:t?`Starting…`:`Start session`}),(0,M.jsx)(F,{variant:`secondary`,size:`sm`,style:{flex:1},disabled:t,onClick:()=>p(`cancel`),children:`Cancel`})]})]})})}var Tt=`auth-refresh-failed`;function Et({error:e,onClose:t}){if(!e)return null;let n=e.reason===Tt,r=n?`Claude sign-in expired`:`Session didn’t open`,i=n?`Your claude.ai login has expired. Re-authenticate to resume sessions.`:`The session did not bind within 60 seconds, so there is no live conversation to open.`;return(0,M.jsx)(`div`,{className:`claude-info-overlay`,onClick:t,children:(0,M.jsxs)(`div`,{className:`claude-info-modal`,onClick:e=>e.stopPropagation(),role:`alertdialog`,"aria-label":`Session could not be opened`,children:[(0,M.jsxs)(`div`,{className:`claude-info-header`,children:[(0,M.jsx)(`span`,{children:r}),(0,M.jsx)(`button`,{className:`claude-info-close`,onClick:t,"aria-label":`Close`,children:`✕`})]}),(0,M.jsxs)(`div`,{className:`claude-info-section`,style:{padding:`12px 14px`,fontSize:`11px`,color:`var(--text-secondary)`},children:[i,(0,M.jsxs)(`div`,{className:`claude-info-row`,style:{marginTop:`8px`},children:[(0,M.jsx)(`span`,{className:`claude-info-label`,children:`Reason`}),(0,M.jsx)(`span`,{className:`claude-info-value`,children:e.reason})]}),e.sessionId&&(0,M.jsxs)(`div`,{className:`claude-info-row`,children:[(0,M.jsx)(`span`,{className:`claude-info-label`,children:`Session`}),(0,M.jsxs)(`span`,{className:`claude-info-value`,children:[e.sessionId.slice(0,8),`…`]})]})]})]})})}function Dt(e){let{show:t,onClose:n,claudeInfo:r,messages:i,sessionElapsed:a,sessionId:o,cacheKey:s}=e,[c,l]=(0,N.useState)(null);if(!t)return null;let u=i.flatMap(e=>e.events?.filter(e=>e.type===`usage`)??[]),d=u.at(-1),f=d?.peak_request_pct==null?d?.context_window?Math.round((d.input_tokens+d.cache_creation_tokens+d.cache_read_tokens)/d.context_window*100):0:Math.round(d.peak_request_pct*100),p=u.reduce((e,t)=>e+t.input_tokens+t.cache_creation_tokens+t.cache_read_tokens+t.output_tokens,0),m=i.flatMap(e=>e.events?.filter(e=>e.type===`rate_limit`)??[]).at(-1),h=u.reduce((e,t)=>e+(t.total_cost_usd??0),0),g=r?.account?.subscriptionType,_=e=>{let t=e*1e3-Date.now();if(t<=0)return`now`;let n=Math.floor(t/36e5),r=Math.floor(t%36e5/6e4);return n>0?`${n}h ${r}m`:`${r}m`};return(0,M.jsx)(`div`,{className:`claude-info-overlay`,onClick:n,children:(0,M.jsxs)(`div`,{className:`claude-info-modal`,onClick:e=>e.stopPropagation(),children:[(0,M.jsxs)(`div`,{className:`claude-info-header`,children:[(0,M.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`claude-info-icon`}),(0,M.jsx)(`span`,{children:`Claude Code`}),(0,M.jsx)(`button`,{className:`claude-info-close`,onClick:n,"aria-label":`Close`,children:`✕`})]}),(0,M.jsxs)(`div`,{className:`claude-info-section`,children:[(0,M.jsxs)(`div`,{className:`claude-info-row`,children:[(0,M.jsx)(`span`,{className:`claude-info-label`,children:`Version`}),(0,M.jsx)(`span`,{className:`claude-info-value`,children:r?r.version:`…`})]}),(0,M.jsxs)(`div`,{className:`claude-info-row`,children:[(0,M.jsx)(`span`,{className:`claude-info-label`,children:`Email`}),(0,M.jsx)(`span`,{className:`claude-info-value`,children:r?.account?.email??`…`})]})]}),(g||m||h>0)&&(0,M.jsxs)(`div`,{className:`claude-info-section`,children:[g&&(0,M.jsxs)(`div`,{className:`claude-info-row`,children:[(0,M.jsx)(`span`,{className:`claude-info-label`,children:`Plan`}),(0,M.jsx)(`span`,{className:`claude-info-value`,style:{textTransform:`capitalize`},children:g})]}),m&&(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(`div`,{className:`claude-info-row`,children:[(0,M.jsx)(`span`,{className:`claude-info-label`,children:`Usage`}),(0,M.jsxs)(`span`,{className:`claude-info-value`,children:[Math.round(m.utilization*100),`%`]})]}),(0,M.jsxs)(`div`,{className:`claude-info-row`,children:[(0,M.jsx)(`span`,{className:`claude-info-label`,children:`Resets in`}),(0,M.jsx)(`span`,{className:`claude-info-value`,children:_(m.resetsAt)})]}),m.isUsingOverage&&(0,M.jsxs)(`div`,{className:`claude-info-row`,children:[(0,M.jsx)(`span`,{className:`claude-info-label`,children:`Overage`}),(0,M.jsx)(`span`,{className:`claude-info-value`,children:`Active`})]})]}),h>0&&(0,M.jsxs)(`div`,{className:`claude-info-row`,children:[(0,M.jsx)(`span`,{className:`claude-info-label`,children:`Session cost`}),(0,M.jsxs)(`span`,{className:`claude-info-value`,children:[`$`,h<.01?h.toFixed(4):h.toFixed(2)]})]})]}),(0,M.jsxs)(`div`,{className:`claude-info-section`,children:[(0,M.jsxs)(`div`,{className:`claude-info-row`,children:[(0,M.jsx)(`span`,{className:`claude-info-label`,children:`Model`}),(0,M.jsx)(`span`,{className:`claude-info-value`,children:r?.model??`…`})]}),(0,M.jsxs)(`div`,{className:`claude-info-row`,children:[(0,M.jsx)(`span`,{className:`claude-info-label`,children:`Context used`}),(0,M.jsx)(`span`,{className:`claude-info-value`,children:f>0?`${f}%`:`—`})]}),(0,M.jsxs)(`div`,{className:`claude-info-row`,children:[(0,M.jsx)(`span`,{className:`claude-info-label`,children:`Tokens`}),(0,M.jsx)(`span`,{className:`claude-info-value`,children:p>0?yt(p):`—`})]}),(0,M.jsxs)(`div`,{className:`claude-info-row`,children:[(0,M.jsx)(`span`,{className:`claude-info-label`,children:`Session`}),(0,M.jsx)(`span`,{className:`claude-info-value`,children:vt(a)})]}),(o||s)&&(()=>{let e=o??s??``;return(0,M.jsxs)(`div`,{className:`claude-info-row`,children:[(0,M.jsx)(`span`,{className:`claude-info-label`,children:`Session`}),(0,M.jsx)(`button`,{type:`button`,className:`claude-info-value claude-info-id-copy`,title:`${e} (${o?`flushed`:`pre-flush`}) — click to copy`,onClick:async()=>{l(await ne(e)?`copied`:`failed`),setTimeout(()=>l(null),1200)},children:c===`copied`?`copied ✓`:c===`failed`?`copy failed ✕`:`${e.slice(0,8)}…`})]})})()]})]})})}function Ot({open:e,onConnect:t,onClose:n}){return e?(0,M.jsx)(`div`,{className:`claude-info-overlay`,onClick:n,children:(0,M.jsxs)(`div`,{className:`claude-info-modal`,onClick:e=>e.stopPropagation(),role:`alertdialog`,"aria-label":`Claude is not connected`,children:[(0,M.jsxs)(`div`,{className:`claude-info-header`,children:[(0,M.jsx)(`span`,{children:`Claude isn’t connected`}),(0,M.jsx)(`button`,{className:`claude-info-close`,onClick:n,"aria-label":`Close`,children:`✕`})]}),(0,M.jsxs)(`div`,{className:`claude-info-section`,style:{padding:`12px 14px`,fontSize:`11px`,color:`var(--text-secondary)`,display:`flex`,flexDirection:`column`,gap:`10px`},children:[(0,M.jsx)(`span`,{children:`This needs Claude, which is currently disconnected. Connect to continue — the rest of the dashboard stays available either way.`}),(0,M.jsxs)(`div`,{style:{display:`flex`,gap:`8px`,alignItems:`center`},children:[(0,M.jsx)(F,{variant:`primary`,size:`sm`,onClick:t,children:`Connect Claude`}),(0,M.jsx)(`button`,{type:`button`,className:`claude-info-close`,style:{fontSize:`11px`},onClick:n,children:`Not now`})]})]})]})}):null}function kt(e){let t=Math.round(e/6e4),n=Math.floor(t/60),r=t%60;return`${n}h ${String(r).padStart(2,`0`)}m`}function X(e){return e.activeMs.thinking+e.activeMs.messaging+e.activeMs.toolUse}function At(e){return e.toLocaleString(`en-GB`)}function jt(e){return`£${e.toFixed(2)}`}function Mt(e){let t=[`Day`,`Active`,`Output tokens`,`Input tokens`,`Cache write`,`Cache read`,`Opus 5 (GBP)`,`Sonnet 5 (GBP)`],n=(e,t)=>[e,kt(X(t)),String(t.tokens.output),String(t.tokens.input),String(t.tokens.cacheWrite),String(t.tokens.cacheRead),t.costGBP.opus.toFixed(2),t.costGBP.sonnet.toFixed(2)];return[t,...e.days.map(e=>n(e.date,e)),n(`TOTAL (${e.days.length} d)`,e.totals)].map(e=>e.join(`,`)).join(`
2
+ `)}function Nt({label:e,d:t,bold:n}){let r=n?`th`:`td`;return(0,M.jsxs)(`tr`,{className:n?`usage-total-row`:void 0,children:[(0,M.jsx)(r,{className:`usage-day`,children:e}),(0,M.jsx)(r,{children:kt(X(t))}),(0,M.jsx)(r,{children:At(t.tokens.output)}),(0,M.jsx)(r,{children:At(t.tokens.input)}),(0,M.jsx)(r,{children:At(t.tokens.cacheWrite)}),(0,M.jsx)(r,{children:At(t.tokens.cacheRead)}),(0,M.jsx)(r,{children:jt(t.costGBP.opus)}),(0,M.jsx)(r,{children:jt(t.costGBP.sonnet)})]})}function Pt({show:e,onClose:t,anchorEl:n,sessionId:r,summary:i,loading:a,error:s}){let c=(0,N.useRef)(null);if(c.current=n,!e)return null;let l=!!i&&i.days.length>0;return(0,M.jsxs)(nt,{anchorRef:c,onClose:t,className:`usage-popover`,role:`dialog`,ariaLabel:`Session usage and cost`,anchorId:r??void 0,children:[(0,M.jsxs)(`div`,{className:`claude-info-header`,children:[(0,M.jsxs)(`span`,{children:[`Usage & cost`,r?` · ${r.slice(0,8)}`:``]}),l&&(0,M.jsx)(`button`,{className:`usage-download`,onClick:()=>{if(!i)return;let e=new Blob([Mt(i)],{type:`text/csv;charset=utf-8`}),t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`usage-${r?r.slice(0,8):`session`}.csv`,document.body.appendChild(n),n.click(),n.remove(),URL.revokeObjectURL(t)},"aria-label":`Download as CSV`,title:`Download as CSV`,children:(0,M.jsx)(o,{size:14})}),(0,M.jsx)(`button`,{className:`claude-info-close`,onClick:t,"aria-label":`Close`,children:(0,M.jsx)(k,{size:14})})]}),(0,M.jsxs)(`div`,{className:`claude-info-section usage-body`,children:[a&&(0,M.jsx)(`div`,{className:`usage-note`,children:`Computing usage…`}),!a&&s&&(0,M.jsx)(`div`,{className:`usage-note usage-error`,children:s}),!a&&!s&&i&&i.days.length===0&&(0,M.jsx)(`div`,{className:`usage-note`,children:`No usage recorded for this session yet.`}),!a&&!s&&i&&i.days.length>0&&(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(`div`,{className:`usage-table-scroll`,children:(0,M.jsxs)(`table`,{className:`usage-table`,children:[(0,M.jsx)(`thead`,{children:(0,M.jsxs)(`tr`,{children:[(0,M.jsx)(`th`,{className:`usage-day`,children:`Day`}),(0,M.jsx)(`th`,{children:`Active`}),(0,M.jsx)(`th`,{children:`Output tok`}),(0,M.jsx)(`th`,{children:`Input tok`}),(0,M.jsx)(`th`,{children:`Cache write`}),(0,M.jsx)(`th`,{children:`Cache read`}),(0,M.jsx)(`th`,{children:`Opus 5 (£)`}),(0,M.jsx)(`th`,{children:`Sonnet 5 (£)`})]})}),(0,M.jsxs)(`tbody`,{children:[i.days.map(e=>(0,M.jsx)(Nt,{label:e.date,d:e},e.date)),(0,M.jsx)(Nt,{label:`TOTAL (${i.days.length} d)`,d:i.totals,bold:!0})]})]})}),(0,M.jsxs)(`div`,{className:`usage-note usage-caveats`,children:[`Prices dated `,i.pricing.opusPriceDate,` · £/$ `,i.pricing.usdPerGbp,` · Sonnet tokenizer factor `,i.pricing.tokenizerFactor,`. Idle human-wait dominates the calendar span; cache-read tokens dominate cost.`]})]})]})]})}var Z=`https://claude.ai/code`,Ft=200,It=[500,1e3,1500,2e3,2500,3e3,3e3];function Lt(e,t,n){if(e&&n.target)return{kind:`navigate`,url:n.target,sameOrigin:!0};let r=n.slug??n.bridgeSessionId??null;if(e&&r)return{kind:`navigate`,url:`${Z}/${r}`,sameOrigin:!1};let i=n.reason||n.error||`status ${t}`;return{kind:`error`,sessionId:n.sessionId??null,reason:i}}function Rt(e){if(!e)return``;let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}):``}function zt(e){let{businessName:t,cacheKey:o,onConnectClaude:u,role:f,userName:h,userAvatar:b,onSelectProjects:x,onSelectTasks:C,onCloseMobileDrawer:T,collapsed:ne,onSelectData:D,initialDataSurface:re=!1,onLogout:ie,onDisconnect:oe,disconnecting:se,claudeConnected:k=!0,subAccounts:A,activeAccountId:j,switchingAccount:le,onSwitchAccount:P,refreshAccounts:F,onOpenConversations:de}=e,R=ee(o),ve=(0,N.useCallback)(e=>({key:`reseat`,label:`Reset session ${e.title} (model, mode, effort)`,menuLabel:`Reset`,title:`Reset — move this session onto a chosen model, mode, and effort`,icon:(0,M.jsx)(ye,{size:12}),panel:()=>(0,M.jsx)(_t,{row:e,adminFetch:R,onError:e=>V({message:e,failed:!0})})}),[R]),Ce=c.productName,z=t||Ce,B=typeof h==`string`?h:h===null?`name unavailable`:z,we=(B.trim().charAt(0)||`?`).toUpperCase(),[Te,Ee]=(0,N.useState)(re?`data`:`sessions`),[De,Oe]=(0,N.useState)(!1),[ke,Ae]=(0,N.useState)(!1),je=!ne&&(A?.length??0)>1&&!!P,Me=A?.find(e=>e.isHouse)??null,Ne=(0,N.useCallback)(()=>{Me&&Me.accountId!==j&&(Ae(!1),P?.(Me.accountId,`/`))},[Me,j,P]),[Pe,V]=(0,N.useState)(null),[Fe,Ie]=(0,N.useState)(null),[Le,Re]=(0,N.useState)(!1),[H,U]=(0,N.useState)([]),[ze]=(0,N.useState)(()=>typeof window>`u`?null:new URLSearchParams(window.location.search).get(`session`)),[Be,Ve]=(0,N.useState)(!1),[He,Ue]=(0,N.useState)(null),[We,Ge]=(0,N.useState)(!1),[Ke,qe]=(0,N.useState)(!1),[Je,Ye]=(0,N.useState)(!1),[Xe,Ze]=(0,N.useState)(null),[W,Qe]=(0,N.useState)(new Set),$e=(0,N.useRef)(new Map),[G,et]=(0,N.useState)(!1),[K,tt]=(0,N.useState)(new Set),[nt,q]=(0,N.useState)(!1),[J,it]=(0,N.useState)(null),[at,ot]=(0,N.useState)(new Set),[st,ct]=(0,N.useState)(new Set),[lt,ut]=(0,N.useState)(new Set),[Y,dt]=(0,N.useState)(null),[ft,pt]=(0,N.useState)(``),[mt,ht]=(0,N.useState)(!1),[gt,vt]=(0,N.useState)(null),[yt,xt]=(0,N.useState)(null),[Ct,Tt]=(0,N.useState)(!1),[Dt,kt]=(0,N.useState)(null),[X,At]=(0,N.useState)(!1),[jt,Mt]=(0,N.useState)(!1),Nt=(0,N.useRef)(0);(0,N.useEffect)(()=>{if(!Pe)return;let e=setTimeout(()=>V(null),2500);return()=>clearTimeout(e)},[Pe]);let Z=(0,N.useCallback)(async()=>{if(!o)return null;let e=++Nt.current;Ge(!0),Ue(null);try{let t=await R(`/api/admin/sidebar-sessions`);if(!t.ok)throw Error(`status ${t.status}`);let n=await t.json(),r=n.sessions??[];return e===Nt.current?(U(r),Ze(n.accountId??null),Ve(!0),r):r}catch(t){let n=t instanceof Error?t.message:String(t);return e===Nt.current&&Ue(`Failed to load sessions: ${n}`),console.error(`[admin-ui] sidebar-sessions fetch failed: ${n}`),null}finally{e===Nt.current&&Ge(!1)}},[o,R]);(0,N.useEffect)(()=>{!o||Be||Z()},[o,Be,Z]),(0,N.useEffect)(()=>{if(!o)return;let e=null;function t(){Z()}function n(){e===null&&(e=setInterval(t,Vt))}function r(){e!==null&&(clearInterval(e),e=null)}function i(){document.hidden?r():(t(),n())}return document.hidden||n(),document.addEventListener(`visibilitychange`,i),()=>{r(),document.removeEventListener(`visibilitychange`,i)}},[o,Z]);let zt=()=>{Z()},Bt=()=>{Ee(`data`),D(),T()},Q=typeof window<`u`&&window.location?.pathname||`/`,Ut=Te===`data`,Wt=typeof window<`u`&&window.location?.search||``,Gt=new URLSearchParams(Wt),Kt=Gt.has(`label`)&&!Gt.has(`nodeId`),$=e=>{T(),window.location.href=e},qt=[{key:`dashboard`,label:`Dashboard`,icon:(0,M.jsx)(d,{size:17,strokeWidth:1.75}),active:Q===`/`&&!Ut,onClick:()=>$(`/`)},{key:`chat`,label:`Chat`,icon:(0,M.jsx)(p,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/chat`),onClick:()=>$(`/chat`)},{key:`tasks`,label:`Tasks`,icon:(0,M.jsx)(ge,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/tasks`),onClick:()=>{C(),T()}},{key:`calendar`,label:`Calendar`,icon:(0,M.jsx)(g,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/calendar`),onClick:()=>$(`/calendar`)},{key:`routines`,label:`Routines`,icon:(0,M.jsx)(Se,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/routines`),onClick:()=>$(`/routines`)},{key:`skills`,label:`Skills`,icon:(0,M.jsx)(be,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/skills`),onClick:()=>$(`/skills`)},{key:`agents`,label:`Agents`,icon:(0,M.jsx)(fe,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/agents`),onClick:()=>$(`/agents`)},{key:`data`,label:`Data`,icon:(0,M.jsx)(l,{size:17,strokeWidth:1.75}),active:Ut,onClick:Bt},{key:`container`,label:s().term,icon:(0,M.jsx)(m,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/graph`)&&Kt,onClick:()=>{x(),T()}},{key:`graph`,label:`Graph`,icon:(0,M.jsx)(xe,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/graph`)&&!Kt,onClick:()=>$(`/graph`)},{key:`activity`,label:`Activity`,icon:(0,M.jsx)(n,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/activity`),onClick:()=>$(`/activity`)}],Jt=(0,N.useCallback)(async e=>{if(at.has(e.sessionId))return;ot(t=>{let n=new Set(t);return n.add(e.sessionId),n});let t=window.open(``,`_blank`);try{let n=await R(`/api/admin/session-rc-spawn`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:e.sessionId,name:e.title||e.sessionId,...e.accountId?{targetAccountId:e.accountId}:{}})}),r=await n.json().catch(()=>({})),i=Lt(n.ok,n.status,{...r,sessionId:r.sessionId??e.sessionId});i.kind===`navigate`?(T(),t?t.location.href=i.url:window.open(i.url,`_blank`)):(t?.close(),console.error(`[admin-ui] sidebar-session-resume-failed sessionId=${e.sessionId} status=${n.status} reason=${i.reason}`),Ie(i))}catch(n){t?.close();let r=n instanceof Error?n.message:String(n);console.error(`[admin-ui] sidebar-session-resume-failed sessionId=${e.sessionId} error=${r}`),Ie({sessionId:e.sessionId,reason:r})}finally{ot(t=>{let n=new Set(t);return n.delete(e.sessionId),n})}},[R,T,at]),Yt=(0,N.useCallback)(async e=>{let t=e.slice(0,8);for(let t=1;t<=It.length;t++){await new Promise(e=>setTimeout(e,It[t-1]));let n=await Z();if(n&&n.some(t=>t.sessionId===e))return}console.error(`[admin-ui] sidebar-new-session-converge-timeout sessionId=${t}`)},[Z]),Xt=(0,N.useCallback)(async e=>{if(!X){At(!0);try{let t=await R(`/api/admin/session-rc-spawn`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:e})}),n=await t.json().catch(()=>({})),r=Lt(t.ok,t.status,n);r.kind===`navigate`?r.sameOrigin?window.location.assign(r.url):(window.open(r.url,`_blank`),n.sessionId?Yt(n.sessionId):console.error(`[admin-ui] sidebar-new-session-converge-skipped reason=no-session-id`)):t.status===503||r.reason===`claude-auth-dead`?(Mt(!1),Re(!0)):(console.error(`[admin-ui] sidebar-new-session-failed status=${t.status} reason=${r.reason}`),Mt(!1),Ie(r))}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`[admin-ui] sidebar-new-session-failed error=${t}`),Mt(!1),Ie({sessionId:null,reason:t})}finally{At(!1)}}},[R,X,Yt]),Zt=(0,N.useCallback)((e,t)=>{e.stopPropagation(),it(t)},[]),Qt=(0,N.useCallback)(async(e,t)=>{e.stopPropagation(),vt(t),xt(null),kt(null),Tt(!0);try{let e=await R(`/api/admin/session-usage?sessionId=${encodeURIComponent(t.sessionId)}`),n=await e.json().catch(()=>({}));e.ok?xt(n):kt(n.error??`status ${e.status}`)}catch(e){kt(e instanceof Error?e.message:String(e))}finally{Tt(!1)}},[R]),$t=(0,N.useCallback)(async(e,t={})=>{let n=t.refresh??!0;if(W.has(e.sessionId))return!1;Qe(t=>{let n=new Set(t);return n.add(e.sessionId),n});try{let t=await R(`/api/admin/session-delete`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:e.sessionId})});if(!t.ok){let n=await t.json().catch(()=>({}));return console.error(`[admin-ui] sidebar-session-delete-failed sessionId=${e.sessionId} status=${t.status} error=${n.error??`unknown`}`),V({message:`Delete failed: ${n.error??`status ${t.status}`}`,failed:!0}),!1}return await t.json(),U(t=>t.filter(t=>t.sessionId!==e.sessionId)),n&&Z(),!0}catch(t){let n=t instanceof Error?t.message:String(t);return console.error(`[admin-ui] sidebar-session-delete-failed sessionId=${e.sessionId} error=${n}`),V({message:`Delete failed: ${n}`,failed:!0}),!1}finally{Qe(t=>{let n=new Set(t);return n.delete(e.sessionId),n})}},[R,W,Z]),en=(0,N.useCallback)(e=>{tt(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),tn=(0,N.useCallback)(()=>{et(!1),tt(new Set)},[]),nn=(0,N.useCallback)(async()=>{let e=[...K].map(e=>H.find(t=>t.sessionId===e)).filter(e=>!!e),t=(await Promise.all(e.map(e=>$t(e,{refresh:!1})))).filter(Boolean).length,n=e.length-t;n>0&&console.warn(`[admin-ui] sidebar-bulk-delete op=done requested=${e.length} ok=${t} failed=${n}`),Z(),tn()},[K,H,$t,Z,tn]),rn=(0,N.useCallback)(async(e,t)=>{if(e.stopPropagation(),!st.has(t.sessionId)){ct(e=>{let n=new Set(e);return n.add(t.sessionId),n});try{let e=await R(`/api/admin/session-stop`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:t.sessionId})});if(!e.ok){let n=await e.json().catch(()=>({}));console.error(`[admin-ui] sidebar-session-stop-failed sessionId=${t.sessionId} status=${e.status} error=${n.error??`unknown`}`),V({message:`Stop failed: ${n.error??`status ${e.status}`}`,failed:!0});return}Z()}catch(e){let n=e instanceof Error?e.message:String(e);console.error(`[admin-ui] sidebar-session-stop-failed sessionId=${t.sessionId} error=${n}`),V({message:`Stop failed: ${n}`,failed:!0})}finally{ct(e=>{let n=new Set(e);return n.delete(t.sessionId),n})}}},[R,st,Z]),an=(0,N.useCallback)(async(e,t,n)=>{if(e.stopPropagation(),!lt.has(t.sessionId)){ut(e=>{let n=new Set(e);return n.add(t.sessionId),n});try{let e=await R(`/api/admin/session-archive`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:t.sessionId,mode:n})});if(!e.ok){let r=await e.json().catch(()=>({})),i=r.detail??r.error??`status ${e.status}`;console.error(`[admin-ui] sidebar-session-archive-failed sessionId=${t.sessionId} mode=${n} status=${e.status} error=${r.error??`unknown`}`),V({message:`${n===`archive`?`Archive`:`Unarchive`} failed: ${i}`,failed:!0});return}Z()}catch(e){let r=e instanceof Error?e.message:String(e);console.error(`[admin-ui] sidebar-session-archive-failed sessionId=${t.sessionId} mode=${n} error=${r}`),V({message:`${n===`archive`?`Archive`:`Unarchive`} failed: ${r}`,failed:!0})}finally{ut(e=>{let n=new Set(e);return n.delete(t.sessionId),n})}}},[R,lt,Z]),on=(0,N.useCallback)(async e=>{let t=ft.trim();if(!t){V({message:`Title can’t be empty`,failed:!0});return}if(t.length>Ft){V({message:`Title too long (max ${Ft})`,failed:!0});return}ht(!0);try{let n=await R(`/api/admin/session-rename`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:e.sessionId,title:t})});if(!n.ok){let t=await n.json().catch(()=>({})),r=t.reason??t.error??`status ${n.status}`;console.error(`[admin-ui] sidebar-session-rename sessionId=${e.sessionId.slice(0,8)} outcome=rejected reason=${r}`),V({message:`Rename failed: ${r}`,failed:!0});return}dt(null),pt(``),Z()}catch(t){let n=t instanceof Error?t.message:String(t);console.error(`[admin-ui] sidebar-session-rename sessionId=${e.sessionId.slice(0,8)} outcome=rejected reason=${n}`),V({message:`Rename failed: ${n}`,failed:!0})}finally{ht(!1)}},[R,ft,Z]);return(0,M.jsxs)(`aside`,{className:`side`,children:[(0,M.jsxs)(`div`,{className:`side-brand`,children:[je?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(`button`,{type:`button`,className:`side-brand-icon-btn`,"aria-label":`Switch to house account`,disabled:!Me,onClick:Ne,children:(0,M.jsx)(`img`,{className:`side-brand-icon`,src:y,alt:``,"aria-hidden":`true`})}),(0,M.jsxs)(`button`,{type:`button`,className:`side-brand-trigger`,"aria-haspopup":`menu`,"aria-expanded":ke,"aria-label":`Switch sub-account`,onClick:()=>{let e=!ke;Ae(e),e&&F?.()},children:[(0,M.jsxs)(`span`,{className:`side-brand-lockup`,children:[(0,M.jsx)(`span`,{className:`side-brand-business`,children:z}),(0,M.jsx)(`span`,{className:`side-brand-product`,children:c.productName})]}),(0,M.jsx)(pe,{size:14,className:`side-brand-caret`,"aria-hidden":`true`})]})]}):(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(`img`,{className:`side-brand-icon`,src:y,alt:``,"aria-hidden":`true`}),(0,M.jsxs)(`span`,{className:`side-brand-lockup`,children:[(0,M.jsx)(`span`,{className:`side-brand-business`,children:z}),(0,M.jsx)(`span`,{className:`side-brand-product`,children:c.productName})]})]}),ke&&(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(`div`,{className:`side-brand-scrim`,"aria-hidden":`true`,onClick:()=>Ae(!1)}),(0,M.jsx)(S,{open:ke,accounts:A??[],activeAccountId:j??null,switching:le??!1,onSelect:e=>P?.(e),onClose:()=>Ae(!1)})]})]}),(0,M.jsx)(`nav`,{className:`side-nav`,children:qt.map(e=>(0,M.jsxs)(`button`,{type:`button`,className:`admin-row nav-row${e.active?` active`:``}`,"aria-current":e.active?`page`:void 0,onClick:e.onClick,children:[e.icon,(0,M.jsx)(`span`,{className:`label`,children:e.label}),(0,M.jsx)(`span`,{className:`kbd`})]},e.key))}),(()=>{let e=H.filter(e=>Ke?!0:!e.isSubagent).filter(e=>Je?!0:!e.archived),t=H.some(e=>e.isSubagent),n=H.some(e=>e.archived);return(0,M.jsx)(`div`,{className:`side-sessions`,children:(0,M.jsxs)(`div`,{className:`side-list`,children:[(0,M.jsxs)(`div`,{className:`group-head`,children:[(0,M.jsx)(`span`,{children:`Sessions`}),(0,M.jsxs)(`span`,{className:`group-head-meta`,children:[(0,M.jsx)(`button`,{type:`button`,className:`group-head-select${G?` active`:``}`,"aria-pressed":G,title:G?`Exit select mode`:`Select multiple sessions to delete`,onClick:()=>{et(e=>!e),tt(new Set),dt(null),pt(``)},children:`Select`}),(0,M.jsx)(`button`,{type:`button`,className:`group-head-refresh`,title:`Refresh sessions`,"aria-label":`Refresh sessions`,onClick:zt,disabled:We,children:(0,M.jsx)(v,{size:12,className:We?`spinning`:void 0})}),(0,M.jsx)(`span`,{children:We?`…`:String(e.length)}),(0,M.jsxs)(`button`,{type:`button`,className:`admin-btn-cta side-sessions-new`,onClick:()=>{Mt(!0)},disabled:X,"aria-busy":X,"aria-label":X?`Spawning session`:`New session`,title:X?`Spawning session`:`New session`,children:[X?(0,M.jsx)(E,{size:13,className:`spinning`}):(0,M.jsx)(a,{size:13}),(0,M.jsx)(`span`,{children:X?`Spawning…`:`New session`})]})]})]}),G&&(0,M.jsxs)(`div`,{className:`session-select-bar`,children:[(0,M.jsxs)(`span`,{className:`session-select-count`,children:[K.size,` selected`]}),(0,M.jsxs)(`button`,{type:`button`,className:`session-select-delete`,disabled:K.size===0,onClick:()=>q(!0),children:[`Delete `,K.size]}),(0,M.jsx)(`button`,{type:`button`,className:`session-select-cancel`,onClick:tn,children:`Cancel`})]}),Xe&&(0,M.jsx)(`div`,{className:`side-account-id`,title:`This install's accountId. The first 8 characters match the truncated UUID label on the live Remote Control daemon entry in claude.ai/code.`,children:(0,M.jsx)(`code`,{children:Xe})}),(t||n)&&(0,M.jsxs)(`div`,{className:`artefact-filter-chips`,children:[t&&(0,M.jsx)(`button`,{type:`button`,className:`artefact-filter-chip${Ke?` active`:``}`,"aria-pressed":Ke,onClick:()=>qe(e=>!e),title:Ke?`Hide subagent sessions`:`Show subagent sessions`,children:`Subagents`}),n&&(0,M.jsx)(`button`,{type:`button`,className:`artefact-filter-chip${Je?` active`:``}`,"aria-pressed":Je,onClick:()=>Ye(e=>!e),title:Je?`Hide archived sessions`:`Show archived sessions`,children:`Archived`})]}),He&&(0,M.jsx)(`div`,{className:`conv`,style:{color:`var(--text-tertiary)`,cursor:`default`},children:He}),Be&&!He&&e.length===0&&(0,M.jsx)(`div`,{className:`conv`,style:{color:`var(--text-tertiary)`,cursor:`default`},children:`No sessions yet`}),e.map(e=>{let t=Rt(e.startedAt),n=at.has(e.sessionId),a=W.has(e.sessionId),o=st.has(e.sessionId),s=lt.has(e.sessionId),c=n||a||o||s,l=()=>{window.location.assign(`/chat?session=${e.sessionId}`)},u=[{key:`open`,label:`Resume session ${e.title} in claude.ai/code`,menuLabel:`Resume in claude.ai/code`,title:`Resume in a fresh local Remote Control PTY`,icon:(0,M.jsx)(me,{size:12}),busy:n,onClick:()=>{Jt(e)}},{key:`message`,label:`Open session ${e.title} in admin webchat`,menuLabel:`Open in webchat`,title:`Open in admin webchat (/chat) — sending resumes this session`,icon:(0,M.jsx)(_e,{size:12}),onClick:()=>{l()}},{key:`usage`,label:`Usage and cost for session ${e.title}`,menuLabel:`Usage & cost`,title:`Per-day active time, tokens, and estimated GBP cost`,icon:(0,M.jsx)(he,{size:12}),onClick:t=>{Qt(t,e)}},...e.live?[{key:`stop`,label:`Stop session ${e.title}`,menuLabel:`Stop`,title:`Stop session process (keeps the conversation, can resume later)`,icon:(0,M.jsx)(r,{size:12}),busy:o,onClick:t=>{rn(t,e)}}]:[],e.archived?{key:`unarchive`,label:`Unarchive session ${e.title}`,menuLabel:`Unarchive`,title:`Unarchive (move back to the active list)`,icon:(0,M.jsx)(I,{size:12}),busy:s,onClick:t=>{an(t,e,`unarchive`)}}:{key:`archive`,label:`Archive session ${e.title}`,menuLabel:`Archive`,title:`Archive (hide from the list, keeps the conversation resumable)`,icon:(0,M.jsx)(ue,{size:12}),busy:s,onClick:t=>{an(t,e,`archive`)}},{key:`rename`,label:`Rename session ${e.title}`,menuLabel:`Rename`,title:`Rename this session`,icon:(0,M.jsx)(i,{size:12}),busy:mt&&Y===e.sessionId,onClick:t=>{t.stopPropagation(),dt(e.sessionId),pt(e.personName??e.title)}},{key:`delete`,label:`Delete session ${e.title}`,menuLabel:`Delete`,title:`Delete session (stops the process, removes the conversation)`,icon:(0,M.jsx)(_,{size:12}),danger:!0,busy:a,onClick:t=>{Zt(t,e)}},ve({sessionId:e.sessionId,model:e.model??null,title:e.personName??e.title})],d=e.channel===`whatsapp`?` conv-channel-whatsapp`:e.channel===`telegram`?` conv-channel-telegram`:``,f=e.channel===`whatsapp`||e.channel===`telegram`||e.channel===`webchat`,p=te.includes(e.channel??``)&&e.senderId&&e.titleSource===`prefix`?ae({operatorName:e.personName??null,whatsappName:e.whatsappName??null,senderId:e.senderId,title:e.title,channel:e.channel}):e.personName??e.title;return(0,M.jsxs)(`div`,{ref:t=>{let n=$e.current;t?n.set(e.sessionId,t):n.delete(e.sessionId)},className:`conv conv-with-actions${d}${e.sessionId===ze?` active`:``}`,children:[(0,M.jsxs)(`div`,{className:`conv-main-static conv-main-clickable`,role:`button`,tabIndex:0,"aria-label":`Open ${p} in webchat`,onClick:()=>{if(Y!==e.sessionId){if(G){en(e.sessionId);return}l()}},onKeyDown:t=>{Y!==e.sessionId&&(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),G?en(e.sessionId):l())},children:[G&&(0,M.jsx)(`span`,{className:`conv-select-check`,onClick:e=>e.stopPropagation(),children:(0,M.jsx)(ce,{checked:K.has(e.sessionId),ariaLabel:`Select ${p}`,onChange:()=>en(e.sessionId)})}),(0,M.jsx)(`span`,{className:`conv-live-dot`,"data-live":e.live?`1`:`0`,"data-archived":e.archived?`1`:`0`,"aria-label":e.archived?`archived session`:e.live?`live session`:`ended session`}),(0,M.jsxs)(`span`,{className:`conv-stack`,children:[(0,M.jsxs)(`span`,{className:`conv-name-line`,children:[f&&(0,M.jsx)(O,{channel:e.channel,size:13}),Y===e.sessionId?(0,M.jsx)(`input`,{className:`conv-name conv-name-edit`,autoFocus:!0,onFocus:e=>e.currentTarget.select(),value:ft,disabled:mt,"aria-label":`New title for session ${e.title}`,onChange:e=>pt(e.target.value),onClick:e=>e.stopPropagation(),onKeyDown:t=>{t.key===`Enter`?(t.preventDefault(),on(e)):t.key===`Escape`&&(t.preventDefault(),dt(null),pt(``))},onBlur:()=>{Y===e.sessionId&&!mt&&(dt(null),pt(``))}}):(0,M.jsx)(`span`,{className:`conv-name`,title:p,children:p})]}),(0,M.jsxs)(`span`,{className:`conv-timestamp`,children:[(0,M.jsx)(`code`,{className:`conv-session-id`,title:`First 8 characters of this session's id — distinguishes rows with identical auto-titles. The resume/delete buttons act on the full id.`,children:e.sessionId.slice(0,8)}),t&&(0,M.jsxs)(`span`,{children:[` · `,t]})]})]})]}),!G&&(0,M.jsx)(rt,{actions:u,disabled:c})]},e.sessionId)})]})})})(),(0,M.jsxs)(`div`,{className:`side-foot`,children:[(0,M.jsx)(`div`,{className:`avatar`,children:b?(0,M.jsx)(`img`,{src:b,alt:B}):we}),(0,M.jsxs)(`div`,{className:`who`,children:[(0,M.jsx)(`span`,{className:`name`,children:B}),(0,M.jsx)(Ht,{})]}),(0,M.jsx)(`button`,{type:`button`,className:`side-foot-kebab`,"aria-label":`Account menu`,"aria-haspopup":`menu`,"aria-expanded":De,onClick:()=>Oe(e=>!e),children:(0,M.jsx)(L,{size:16})}),De&&(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(`div`,{className:`side-foot-menu-scrim`,"aria-hidden":`true`,onClick:()=>Oe(!1)}),(0,M.jsx)(`div`,{className:`side-foot-menu`,role:`menu`,children:(0,M.jsx)(w,{variant:`admin`,onCloseMenu:()=>Oe(!1),onLogout:ie??(()=>{}),onDisconnect:oe,disconnecting:se,claudeConnected:k,onConnectClaude:u,cacheKey:o,onOpenConversations:de})})]})]}),Pe&&(0,M.jsx)(`div`,{className:`copy-toast${Pe.failed?` copy-toast-failed`:``}`,role:`status`,children:Pe.message}),(0,M.jsx)(wt,{open:jt,pending:X,onConfirm:e=>{Xt(e)},onCancel:e=>{Mt(!1)}}),(0,M.jsx)(Et,{error:Fe,onClose:()=>Ie(null)}),(0,M.jsx)(Ot,{open:Le,onConnect:()=>{Re(!1),u?.()},onClose:()=>Re(!1)}),(0,M.jsx)(bt,{target:J,anchorEl:J?$e.current.get(J.sessionId)??null:null,onCancel:()=>it(null),onConfirm:()=>{let e=J;it(null),e&&$t(e)}},J?.sessionId??`none`),(0,M.jsx)(St,{open:nt,count:K.size,liveCount:H.filter(e=>K.has(e.sessionId)&&e.live).length,onConfirm:()=>{q(!1),nn()},onCancel:()=>q(!1)}),(0,M.jsx)(Pt,{show:gt!==null,onClose:()=>{vt(null),xt(null),kt(null)},anchorEl:gt?$e.current.get(gt.sessionId)??null:null,sessionId:gt?.sessionId??null,summary:yt,loading:Ct,error:Dt},gt?.sessionId??`none`)]})}var Bt=5e3,Vt=3e4;function Ht(){let[e,t]=(0,N.useState)(null);if((0,N.useEffect)(()=>{let e=!1,n=null;async function r(){try{let n=await fetch(`/api/admin/system-stats`);if(!n.ok){console.error(`[admin-ui] system-stats-fetch-failed status=${n.status}`);return}let r=await n.json();e||t(r)}catch(e){console.error(`[admin-ui] system-stats-fetch-failed reason=${e instanceof Error?e.message:String(e)}`)}}function i(){n===null&&(r(),n=setInterval(()=>{r()},Bt))}function a(){n!==null&&(clearInterval(n),n=null)}function o(){document.hidden?a():i()}return document.hidden||i(),document.addEventListener(`visibilitychange`,o),()=>{e=!0,a(),document.removeEventListener(`visibilitychange`,o)}},[]),!e||e.platform===`darwin`)return null;let n=e.cpuPct,r=e.memUsedPct,i=n!==null&&n>=.9,a=n!==null&&n>=.98,o=r!==null&&r>=.9,s=r!==null&&r>=.98,c=i||o,l=a||s,u=e=>e===null?`—`:`${Math.round(e*100)}%`,d=[`system-stats`];return c&&d.push(`system-stats--warn`),l&&d.push(`system-stats--crit`),(0,M.jsxs)(`span`,{className:d.join(` `),role:`status`,"aria-label":`host CPU and RAM`,children:[(0,M.jsxs)(`span`,{className:i?`system-stats__fig system-stats__fig--warn`:`system-stats__fig`,children:[`CPU `,u(n)]}),` · `,(0,M.jsxs)(`span`,{className:o?`system-stats__fig system-stats__fig--warn`:`system-stats__fig`,children:[`RAM `,u(r)]})]})}var Q=`maxy-shell-browser-px`;function Ut(){if(typeof window>`u`)return 0;let e=document.querySelector(`.platform > .side`)?.getBoundingClientRect();return e&&e.width>0?Math.round(e.width):0}function Wt(){return typeof window>`u`?360:Gt(Math.round((window.innerWidth-Ut())/2))}function Gt(e){if(typeof window>`u`)return e;let t=Math.max(360,window.innerWidth-Ut()-480);return Math.min(Math.max(e,360),t)}function Kt(){if(typeof window>`u`)return 360;try{let e=window.localStorage.getItem(Q);if(!e)return Wt();let t=parseInt(e,10);return Number.isFinite(t)?Gt(t):(console.warn(`[admin-ui] browser-width-parse-failed stored=${JSON.stringify(e)}`),Wt())}catch{return Wt()}}function $({targetSelector:e=`.platform`}={}){let t=(0,N.useRef)(null),n=(0,N.useRef)(360),[,r]=(0,N.useState)(0),i=(0,N.useCallback)(t=>{n.current=t;let i=document.querySelector(e);i instanceof HTMLElement&&i.style.setProperty(`--artefact-px`,`${t}px`),r(e=>e+1)},[e]);(0,N.useLayoutEffect)(()=>{i(Kt())},[i]),(0,N.useEffect)(()=>{let e=()=>i(Gt(n.current));return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[i]);let a=e=>{e.preventDefault();let r=t.current;if(!r)return;r.setPointerCapture(e.pointerId),r.classList.add(`dragging`);let a=!1,o=e=>{a=!0,i(Gt(Math.round(window.innerWidth-e.clientX)))},s=()=>{if(r.releasePointerCapture(e.pointerId),r.classList.remove(`dragging`),window.removeEventListener(`pointermove`,o),window.removeEventListener(`pointerup`,s),a)try{window.localStorage.setItem(Q,String(n.current))}catch{}};window.addEventListener(`pointermove`,o),window.addEventListener(`pointerup`,s)},o=()=>{i(Wt());try{window.localStorage.removeItem(Q)}catch{}};return(0,M.jsx)(`div`,{ref:t,className:`browser-resize-handle`,role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize browser`,onPointerDown:a,onDoubleClick:o})}var qt=1;function Jt(e){let t=e.className,n=(typeof t==`string`?t:t?.baseVal??``).trim().split(/\s+/).filter(Boolean);return[e.tagName.toUpperCase(),...n].join(`.`)}function Yt(e,t){let n=t.extent-t.vw;return n<qt?null:{op:`layout-overflow`,route:e,vw:t.vw,extent:Math.round(t.extent),delta:Math.round(n),offender:t.offender??``}}function Xt(e,t){if(!e||!t)return null;let n=e.documentElement?.clientWidth??0;if(n<=0)return null;let r=n,i=null;for(let t of Array.from(e.body?.querySelectorAll(`*`)??[])){let e=t.getBoundingClientRect().right;e>=r&&e>n+.5&&(r=e,i=Jt(t))}return{vw:n,extent:r,offender:i}}function Zt(e){return e?`${e.route}|${e.delta}|${e.offender}`:null}function Qt(e,t){if(!t)return;let n=Yt(e,t);if(n)try{fetch(`/api/_client-error`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({kind:`event`,source:`layout-overflow`,...n}),keepalive:!0}).catch(()=>{})}catch{}}function $t(e,t,n=400){let r=0,i,a=0,o=null,s=()=>{if(a>=5)return;let n=t.location.pathname,r=Xt(e,t),i=Zt(r&&Yt(n,r));if(!i){o=null;return}i!==o&&(o=i,a+=1,Qt(n,r))},c=()=>{t.cancelAnimationFrame(r),r=t.requestAnimationFrame(s)},l=()=>{i!==void 0&&clearTimeout(i),i=setTimeout(c,n)};c(),t.addEventListener(`resize`,c);let u=new MutationObserver(l);return e.body&&u.observe(e.body,{childList:!0,subtree:!0}),()=>{t.cancelAnimationFrame(r),i!==void 0&&clearTimeout(i),t.removeEventListener(`resize`,c),u.disconnect()}}function en(e){return e.supported?e.secureContext?e.permission===`denied`?{show:!1,reason:`permission-denied`}:e.permission===`granted`?e.focused?{show:!1,reason:`focused`}:{show:!0}:{show:!1,reason:`permission-default`}:{show:!1,reason:`insecure-context`}:{show:!1,reason:`unsupported`}}function tn(){let e=typeof window<`u`&&`Notification`in window;return{supported:e,secureContext:typeof window<`u`&&window.isSecureContext===!0,permission:e?Notification.permission:`default`,focused:typeof document<`u`&&typeof document.hasFocus==`function`?document.hasFocus():!0}}var nn=500,rn=new Set,an=new Set;function on(e,t){if(e.size>=nn){for(let t of e)if(e.delete(t),e.size<nn)break}e.add(t)}function sn(e){return e??(typeof globalThis.fetch==`function`?globalThis.fetch:void 0)}function cn(e,t,n){try{Promise.resolve(e(`/api/admin/events`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({event:t,fields:n})})).catch(()=>{})}catch{}}function ln(e,t){let n=sn(t);return n?(cn(n,`wa-notify:desktop-capability`,{supported:e.supported,secure:e.secureContext,permission:e.permission}),!0):!1}function un(e,t,n,r){if(rn.has(e))return!1;let i=sn(r);return i?(on(rn,e),cn(i,`wa-notify:desktop-outcome`,{msgId:e,senderType:t,reason:n}),!0):!1}function dn(e,t,n){try{if(an.has(e.waMessageId))return;on(an,e.waMessageId);let r=en(tn());if(!r.show){un(e.waMessageId,e.senderType,r.reason,n);return}new Notification(`${e.accountName} · ${e.senderDisplay}`,{body:e.body+(e.truncated?`…`:``),icon:t,tag:e.waMessageId}),un(e.waMessageId,e.senderType,`shown`,n)}catch{un(e.waMessageId,e.senderType,`construct-failed`,n)}}var fn=`admin-sidebar-collapsed`,pn=`admin-sidebar-drawer-open`,mn=1080;function hn(){if(typeof window>`u`)return!1;let e=null;try{e=window.sessionStorage.getItem(fn)}catch{e=null}return e===null?typeof window.matchMedia==`function`?window.matchMedia(`(min-width: 721px) and (max-width: ${mn}px)`).matches:!1:e===`1`}function gn(e){if(!(typeof window>`u`))try{e?window.sessionStorage.setItem(fn,`1`):window.sessionStorage.removeItem(fn)}catch{}}function _n(){if(typeof window>`u`)return!1;try{return window.sessionStorage.getItem(pn)===`1`}catch{return!1}}function vn(e){if(!(typeof window>`u`))try{e?window.sessionStorage.setItem(pn,`1`):window.sessionStorage.removeItem(pn)}catch{}}var yn=720;function bn(e,t){return e===`/`?{via:`in-place`}:{via:`navigate`,href:`/?wa=${encodeURIComponent(t.remoteJid??``)}&acct=${encodeURIComponent(t.accountId??``)}`}}function xn(e){return e===`/`?{via:`in-place`}:{via:`navigate`,href:`/?data=1`}}function Sn(e,t){if(e!==`/`)return null;let n=new URLSearchParams(t),r=n.get(`wa`),i=n.get(`acct`);return!r||!i?null:{sessionId:``,projectDir:``,title:``,senderId:null,startedAt:``,channel:`whatsapp`,role:`public`,operatorName:null,whatsappName:null,lastMessageAt:null,modelGated:!1,model:null,source:`store`,accountId:i,remoteJid:r}}function Cn(e,t){return e===`/`?new URLSearchParams(t).has(`data`):!1}function wn(e,t){return t===`operator`&&e===`chat`||e===`dashboard`?`/`:e===`data`?`/data`:e===`graph`?`/graph`:e===`calendar`?`/calendar`:e===`chat`?`/chat`:e===`activity`?`/activity`:`/browser`}var Tn=`maxy-webchat-browser-pane`;function En(){try{let e=window.localStorage.getItem(Tn);return e===`split`||e===`full`?e:`closed`}catch{return`closed`}}function Dn(){return typeof window<`u`&&window.location.pathname.startsWith(`/chat`)}function On(e){let{cacheKey:t,businessName:n,variant:r=`admin`,onLogout:i,onDisconnect:a,disconnecting:o,claudeConnected:c,onConnectClaude:l,userName:u,userAvatar:d,role:f,onOpenConversations:p,children:m,footer:h}=e,{subAccounts:g,activeAccountId:_,switching:v,switchAccount:b,refreshAccounts:x}=re(t),[S,C]=(0,N.useState)([]),[ee,te]=(0,N.useState)(!1),[w,ne]=(0,N.useState)(`closed`);(0,N.useEffect)(()=>{let e=Dn();te(e),e&&ne(En())},[]);let E=(0,N.useCallback)(e=>{ne(e);try{window.localStorage.setItem(Tn,e)}catch{}},[]),D=(0,N.useCallback)(()=>E(`split`),[E]),O=(0,N.useCallback)(()=>{E(w===`full`?`split`:`full`)},[w,E]),ae=(0,N.useCallback)(()=>E(`closed`),[E]),k=ee?w:`closed`,A=k!==`closed`,j=(0,N.useCallback)(e=>{C(t=>t.filter(t=>t.waMessageId!==e))},[]);(0,N.useEffect)(()=>{if(!t)return;let e=null;try{e=new EventSource(ie(`/api/admin/events`,t)),e.addEventListener(He,e=>{try{let t=JSON.parse(e.data);if(!t||typeof t.waMessageId!=`string`)return;C(e=>e.some(e=>e.waMessageId===t.waMessageId)?e:[...e,t]),dn(t,y)}catch{}}),e.onerror=()=>{console.error(`[admin-ui] wa-notify stream error`)}}catch(e){console.error(`[admin-ui] wa-notify unavailable reason=${e instanceof Error?e.message:String(e)}`)}return()=>{e?.close()}},[t]),(0,N.useEffect)(()=>{ln(tn())},[]);let[ce,le]=(0,N.useState)(!0);(0,N.useEffect)(()=>{if(c!==void 0||r!==`admin`)return;let e=!1,t=async()=>{try{let t=await fetch(`/api/health`);if(!t.ok)return;let n=await t.json();e||le(n.auth_status!==`dead`&&n.auth_status!==`missing`)}catch{}};t();let n=setInterval(t,6e4);return()=>{e=!0,clearInterval(n)}},[c,r]);let P=c??ce,F=l??(()=>{window.location.assign(`/?connect=claude`)}),[I,ue]=(0,N.useState)(()=>hn()),[de,fe]=(0,N.useState)(!1),pe=(0,N.useRef)(!0);(0,N.useEffect)(()=>{if(pe.current){pe.current=!1;return}fe(!0);let e=setTimeout(()=>fe(!1),260);return()=>clearTimeout(e)},[I]);let[L,me]=(0,N.useState)(()=>_n()),he=oe(`(max-width: ${yn}px)`),[ge,_e]=(0,N.useState)(()=>typeof window>`u`||Cn(window.location.pathname,window.location.search)?null:Sn(window.location.pathname,window.location.search)),[R,ve]=(0,N.useState)(()=>typeof window>`u`?!1:Cn(window.location.pathname,window.location.search)),[ye]=(0,N.useState)(()=>R),be=(0,N.useCallback)(e=>{gn(e),ue(e)},[]),xe=(0,N.useCallback)(e=>{vn(e),me(e)},[]);(0,N.useEffect)(()=>{typeof window>`u`||window.location?.pathname},[]),(0,N.useEffect)(()=>{typeof window>`u`||!ge||window.history.replaceState(null,``,`/`)},[]),(0,N.useEffect)(()=>{typeof window>`u`||!R||window.history.replaceState(null,``,`/`)},[]);let Se=(0,N.useCallback)(e=>{if(ve(!1),e===null){_e(null);return}let t=bn(typeof window<`u`?window.location.pathname:`/`,e);t.via===`in-place`?_e(e):window.location.href=t.href},[]),Ce=(0,N.useCallback)(()=>{let e=xn(typeof window<`u`?window.location.pathname:`/`);if(e.via===`navigate`){window.location.href=e.href;return}_e(null),ve(!0)},[]),z=he?L:!I,B=(0,N.useCallback)(()=>{typeof window>`u`||(window.matchMedia(`(max-width: ${yn}px)`).matches?xe(!L):be(!I))},[I,L,be,xe]);(0,N.useEffect)(()=>{if(!(typeof window>`u`))return $t(document,window)},[]);let we=(0,N.useCallback)(e=>{let t=wn(e,r);window.location.href=t},[r]),Te={collapsed:I,mobileDrawerOpen:L,sidebarOpen:z,onToggleSidebar:B,setMobileDrawerOpen:xe,selectedWhatsapp:ge,onClearWhatsapp:()=>_e(null),onSelectWhatsappConversation:Se,dataOpen:R};return r===`operator`?(0,M.jsxs)(`div`,{className:`admin-shell admin-page admin-shell-root`,children:[v&&(0,M.jsx)(se,{surface:`switch`}),(0,M.jsx)(T,{businessName:n,variant:r,onNavigate:we,onOpenConversations:p,onToggleSidebar:B,sidebarOpen:z,onLogout:i,onDisconnect:a,disconnecting:o,cacheKey:t,subAccounts:g,activeAccountId:_,switchingAccount:v,onSwitchAccount:b,refreshAccounts:x}),(0,M.jsx)(`div`,{className:`platform platform-operator`,children:typeof m==`function`?m(Te):m}),(0,M.jsx)(Ye,{variant:`operator`,onOpenConversations:p}),h,(0,M.jsx)(Ve,{frames:S,onExpire:j})]}):(0,M.jsxs)(`div`,{className:`admin-shell admin-page admin-shell-root`,children:[v&&(0,M.jsx)(se,{surface:`switch`}),(0,M.jsxs)(`div`,{className:`platform${L?` menu-open`:``}${!he&&I?` sidebar-collapsed`:``}${de?` sidebar-animating`:``}`,"data-artefact":A?`browser`:`closed`,"data-browser-pane":k,children:[(0,M.jsx)(zt,{businessName:n,cacheKey:t,onConnectClaude:F,role:f??null,userName:u,userAvatar:d??null,onSelectProjects:()=>{window.location.href=`/graph?label=${s().label}`},onSelectTasks:()=>{window.location.href=`/tasks`},onCloseMobileDrawer:()=>xe(!1),collapsed:I,mobileDrawerOpen:L,onSelectData:Ce,onCloseData:()=>ve(!1),initialDataSurface:ye,onLogout:i,onDisconnect:a,disconnecting:o,claudeConnected:P,subAccounts:g,activeAccountId:_,switchingAccount:v,onSwitchAccount:b,refreshAccounts:x,onOpenConversations:p}),!he&&(0,M.jsx)($e,{}),(0,M.jsx)(Ge,{sidebarOpen:z,onToggleSidebar:B,claudeConnected:P,onConnectClaude:F,onOpenBrowser:ee&&!A?D:void 0}),typeof m==`function`?m(Te):m,A&&(0,M.jsxs)(`div`,{className:`webchat-browser-pane`,children:[k===`split`&&(0,M.jsx)($,{}),(0,M.jsx)(Fe,{cacheKey:e.cacheKey,surface:`webchat`,onToggleFull:O,onClosePane:ae,isFull:k===`full`})]})]}),L&&(0,M.jsx)(`div`,{className:`sidebar-backdrop menu-open`,"aria-hidden":`true`,onClick:()=>xe(!1)}),(0,M.jsx)(Ye,{}),h,(0,M.jsx)(Ve,{frames:S,onExpire:j})]})}export{pe as C,F as D,I as E,ce as O,L as S,ue as T,R as _,xt as a,he as b,q as c,ot as d,rt as f,ye as g,be as h,Dt as i,j as k,J as l,Se as m,Lt as n,wt as o,Fe as p,Ot as r,it as s,On as t,lt as u,_e as v,fe as w,me as x,ge as y};