@rubytech/create-maxy-code 0.1.539 → 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 (261) 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 +81 -13
  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 +7 -0
  25. package/payload/platform/plugins/docs/references/admin-ui.md +47 -0
  26. package/payload/platform/plugins/docs/references/channel-wake-and-prompt.md +31 -10
  27. package/payload/platform/plugins/docs/references/internals.md +2 -2
  28. package/payload/platform/plugins/whatsapp/PLUGIN.md +2 -2
  29. package/payload/platform/plugins/whatsapp/mcp/dist/index.js +6 -1
  30. package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
  31. package/payload/platform/plugins/whatsapp/skills/manage-whatsapp-config/SKILL.md +3 -1
  32. package/payload/platform/scripts/__tests__/check-plugin-tool-declarations.test.ts +51 -0
  33. package/payload/platform/scripts/check-plugin-tool-declarations.mjs +97 -0
  34. package/payload/platform/scripts/check-risk-class.mjs +5 -0
  35. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  36. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +8 -0
  37. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  38. package/payload/platform/services/claude-session-manager/dist/channel-targets.d.ts +3 -0
  39. package/payload/platform/services/claude-session-manager/dist/channel-targets.d.ts.map +1 -1
  40. package/payload/platform/services/claude-session-manager/dist/channel-targets.js.map +1 -1
  41. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  42. package/payload/platform/services/claude-session-manager/dist/http-server.js +20 -1
  43. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  44. package/payload/platform/services/claude-session-manager/dist/index.js +35 -18
  45. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  46. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  47. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +57 -8
  48. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  49. package/payload/platform/services/claude-session-manager/dist/public-knowledge-audit.d.ts +58 -0
  50. package/payload/platform/services/claude-session-manager/dist/public-knowledge-audit.d.ts.map +1 -0
  51. package/payload/platform/services/claude-session-manager/dist/public-knowledge-audit.js +152 -0
  52. package/payload/platform/services/claude-session-manager/dist/public-knowledge-audit.js.map +1 -0
  53. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.d.ts +4 -0
  54. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.d.ts.map +1 -1
  55. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.js +3 -0
  56. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.js.map +1 -1
  57. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +40 -3
  58. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  59. package/payload/platform/services/whatsapp-channel/dist/notification.js +43 -4
  60. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  61. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  62. package/payload/platform/services/whatsapp-channel/dist/server.js +41 -25
  63. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  64. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts +1 -0
  65. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts.map +1 -1
  66. package/payload/platform/services/whatsapp-channel/dist/targets.js +9 -5
  67. package/payload/platform/services/whatsapp-channel/dist/targets.js.map +1 -1
  68. package/payload/server/{chunk-BP7LH7MC.js → chunk-CKTHAHL4.js} +26 -16
  69. package/payload/server/{chunk-IALJPXIO.js → chunk-ERIM3EFB.js} +1 -1
  70. package/payload/server/{chunk-S4FIEM3L.js → chunk-TQTZXAK3.js} +64 -7
  71. package/payload/server/{manager-5QV2EAZ2.js → manager-F6NXSOJW.js} +2 -2
  72. package/payload/server/maxy-edge.js +2 -2
  73. package/payload/server/public/activity.html +5 -5
  74. package/payload/server/public/agents.html +4 -4
  75. package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js +1 -0
  76. package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js.br +0 -0
  77. package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js.gz +0 -0
  78. package/payload/server/public/assets/AdminShell-DJL5DzRX.js +2 -0
  79. package/payload/server/public/assets/AdminShell-DJL5DzRX.js.br +0 -0
  80. package/payload/server/public/assets/AdminShell-DJL5DzRX.js.gz +0 -0
  81. package/payload/server/public/assets/activity-CpMnNr5c.js +1 -0
  82. package/payload/server/public/assets/activity-CpMnNr5c.js.br +0 -0
  83. package/payload/server/public/assets/activity-CpMnNr5c.js.gz +0 -0
  84. package/payload/server/public/assets/admin-CBwKIfaI.js +1 -0
  85. package/payload/server/public/assets/admin-CBwKIfaI.js.br +0 -0
  86. package/payload/server/public/assets/admin-CBwKIfaI.js.gz +0 -0
  87. package/payload/server/public/assets/agents-C4LmSKjb.js +1 -0
  88. package/payload/server/public/assets/agents-C4LmSKjb.js.br +0 -0
  89. package/payload/server/public/assets/agents-C4LmSKjb.js.gz +0 -0
  90. package/payload/server/public/assets/browser-Bm9xm_yc.js +1 -0
  91. package/payload/server/public/assets/browser-Bm9xm_yc.js.br +0 -0
  92. package/payload/server/public/assets/browser-Bm9xm_yc.js.gz +0 -0
  93. package/payload/server/public/assets/calendar-CNY9FTWe.js +1 -0
  94. package/payload/server/public/assets/calendar-CNY9FTWe.js.br +0 -0
  95. package/payload/server/public/assets/calendar-CNY9FTWe.js.gz +0 -0
  96. package/payload/server/public/assets/chat-3WoUGCTd.js +1 -0
  97. package/payload/server/public/assets/chat-3WoUGCTd.js.br +0 -0
  98. package/payload/server/public/assets/chat-3WoUGCTd.js.gz +0 -0
  99. package/payload/server/public/assets/chevron-left-BE16BJnw.js +1 -0
  100. package/payload/server/public/assets/chevron-left-BE16BJnw.js.br +0 -0
  101. package/payload/server/public/assets/chevron-right-Bu2VKpeU.js +1 -0
  102. package/payload/server/public/assets/chevron-right-Bu2VKpeU.js.br +0 -0
  103. package/payload/server/public/assets/clock-C4Nu2aRV.js +1 -0
  104. package/payload/server/public/assets/clock-C4Nu2aRV.js.br +0 -0
  105. package/payload/server/public/assets/copy-3kj9Oaoc.js +1 -0
  106. package/payload/server/public/assets/copy-3kj9Oaoc.js.br +0 -0
  107. package/payload/server/public/assets/copy-3kj9Oaoc.js.gz +0 -0
  108. package/payload/server/public/assets/data-C-x5EHyi.js +1 -0
  109. package/payload/server/public/assets/data-C-x5EHyi.js.br +1 -0
  110. package/payload/server/public/assets/data-C-x5EHyi.js.gz +0 -0
  111. package/payload/server/public/assets/file-text-CBaewT76.js +1 -0
  112. package/payload/server/public/assets/file-text-CBaewT76.js.br +0 -0
  113. package/payload/server/public/assets/file-text-CBaewT76.js.gz +0 -0
  114. package/payload/server/public/assets/{graph-C8cQ6Nqf.js → graph-B8-e2_Z-.js} +3 -3
  115. package/payload/server/public/assets/graph-B8-e2_Z-.js.br +0 -0
  116. package/payload/server/public/assets/graph-B8-e2_Z-.js.gz +0 -0
  117. package/payload/server/public/assets/graph-labels-Bsc23eZU.js +1 -0
  118. package/payload/server/public/assets/graph-labels-Bsc23eZU.js.br +0 -0
  119. package/payload/server/public/assets/graph-labels-Bsc23eZU.js.gz +0 -0
  120. package/payload/server/public/assets/operator-Cve0-qfO.js +1 -0
  121. package/payload/server/public/assets/operator-Cve0-qfO.js.br +0 -0
  122. package/payload/server/public/assets/operator-Cve0-qfO.js.gz +0 -0
  123. package/payload/server/public/assets/page-BgVMs6Vf.js +1 -0
  124. package/payload/server/public/assets/page-BgVMs6Vf.js.br +0 -0
  125. package/payload/server/public/assets/page-BgVMs6Vf.js.gz +0 -0
  126. package/payload/server/public/assets/page-fABub-w8.js +32 -0
  127. package/payload/server/public/assets/page-fABub-w8.js.br +0 -0
  128. package/payload/server/public/assets/page-fABub-w8.js.gz +0 -0
  129. package/payload/server/public/assets/play-B6zXB9K7.js +1 -0
  130. package/payload/server/public/assets/play-B6zXB9K7.js.br +0 -0
  131. package/payload/server/public/assets/play-B6zXB9K7.js.gz +0 -0
  132. package/payload/server/public/assets/public--R2DbdWs.js +1 -0
  133. package/payload/server/public/assets/public--R2DbdWs.js.br +0 -0
  134. package/payload/server/public/assets/public--R2DbdWs.js.gz +0 -0
  135. package/payload/server/public/assets/rotate-ccw-FZW7c8p8.js +1 -0
  136. package/payload/server/public/assets/rotate-ccw-FZW7c8p8.js.br +0 -0
  137. package/payload/server/public/assets/rotate-ccw-FZW7c8p8.js.gz +0 -0
  138. package/payload/server/public/assets/routines-BpZs2SaT.js +2 -0
  139. package/payload/server/public/assets/routines-BpZs2SaT.js.br +0 -0
  140. package/payload/server/public/assets/routines-BpZs2SaT.js.gz +0 -0
  141. package/payload/server/public/assets/skills-DF7uyEEz.js +1 -0
  142. package/payload/server/public/assets/skills-DF7uyEEz.js.br +0 -0
  143. package/payload/server/public/assets/skills-DF7uyEEz.js.gz +0 -0
  144. package/payload/server/public/assets/tasks-BfJJmoWO.js +3 -0
  145. package/payload/server/public/assets/tasks-BfJJmoWO.js.br +0 -0
  146. package/payload/server/public/assets/tasks-BfJJmoWO.js.gz +0 -0
  147. package/payload/server/public/assets/triangle-alert-CR-jRJdI.js +1 -0
  148. package/payload/server/public/assets/triangle-alert-CR-jRJdI.js.br +0 -0
  149. package/payload/server/public/assets/triangle-alert-CR-jRJdI.js.gz +0 -0
  150. package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js +1 -0
  151. package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js.br +0 -0
  152. package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js.gz +0 -0
  153. package/payload/server/public/assets/{useSubAccountSwitcher-C7TtIbR3.js → useMediaQuery-CA6dR5iz.js} +1 -1
  154. package/payload/server/public/assets/useMediaQuery-CA6dR5iz.js.br +0 -0
  155. package/payload/server/public/assets/{useSubAccountSwitcher-C7TtIbR3.js.gz → useMediaQuery-CA6dR5iz.js.gz} +0 -0
  156. package/payload/server/public/assets/{useSubAccountSwitcher-DCkivCBS.css → useMediaQuery-DpwgV1Da.css} +1 -1
  157. package/payload/server/public/assets/useMediaQuery-DpwgV1Da.css.br +0 -0
  158. package/payload/server/public/assets/{useSubAccountSwitcher-DCkivCBS.css.gz → useMediaQuery-DpwgV1Da.css.gz} +0 -0
  159. package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js +2 -0
  160. package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js.br +0 -0
  161. package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js.gz +0 -0
  162. package/payload/server/public/assets/wrench-CpCOYUBc.js +1 -0
  163. package/payload/server/public/assets/wrench-CpCOYUBc.js.br +0 -0
  164. package/payload/server/public/assets/wrench-CpCOYUBc.js.gz +0 -0
  165. package/payload/server/public/browser.html +4 -4
  166. package/payload/server/public/calendar.html +8 -8
  167. package/payload/server/public/chat.html +13 -13
  168. package/payload/server/public/data.html +11 -11
  169. package/payload/server/public/graph.html +9 -9
  170. package/payload/server/public/index.html +14 -14
  171. package/payload/server/public/operator.html +14 -14
  172. package/payload/server/public/public.html +13 -13
  173. package/payload/server/public/routines.html +6 -6
  174. package/payload/server/public/skills.html +5 -5
  175. package/payload/server/public/tasks.html +6 -6
  176. package/payload/server/server.js +329 -104
  177. package/payload/server/public/assets/AdminLoginScreens-BpHnjHp_.js +0 -1
  178. package/payload/server/public/assets/AdminLoginScreens-BpHnjHp_.js.br +0 -0
  179. package/payload/server/public/assets/AdminLoginScreens-BpHnjHp_.js.gz +0 -0
  180. package/payload/server/public/assets/AdminShell-D24evn4t.js +0 -2
  181. package/payload/server/public/assets/AdminShell-D24evn4t.js.br +0 -0
  182. package/payload/server/public/assets/AdminShell-D24evn4t.js.gz +0 -0
  183. package/payload/server/public/assets/activity-ZVUTB5uZ.js +0 -1
  184. package/payload/server/public/assets/activity-ZVUTB5uZ.js.br +0 -0
  185. package/payload/server/public/assets/activity-ZVUTB5uZ.js.gz +0 -0
  186. package/payload/server/public/assets/admin-XJqQz3QJ.js +0 -1
  187. package/payload/server/public/assets/admin-XJqQz3QJ.js.br +0 -0
  188. package/payload/server/public/assets/admin-XJqQz3QJ.js.gz +0 -0
  189. package/payload/server/public/assets/agents-Dc9SNC9N.js +0 -1
  190. package/payload/server/public/assets/agents-Dc9SNC9N.js.br +0 -0
  191. package/payload/server/public/assets/agents-Dc9SNC9N.js.gz +0 -0
  192. package/payload/server/public/assets/browser-CCedMIga.js +0 -1
  193. package/payload/server/public/assets/browser-CCedMIga.js.br +0 -0
  194. package/payload/server/public/assets/browser-CCedMIga.js.gz +0 -0
  195. package/payload/server/public/assets/calendar-BDoMLP2j.js +0 -1
  196. package/payload/server/public/assets/calendar-BDoMLP2j.js.br +0 -0
  197. package/payload/server/public/assets/calendar-BDoMLP2j.js.gz +0 -0
  198. package/payload/server/public/assets/chat-BAhoqTY9.js +0 -1
  199. package/payload/server/public/assets/chat-BAhoqTY9.js.br +0 -0
  200. package/payload/server/public/assets/chat-BAhoqTY9.js.gz +0 -0
  201. package/payload/server/public/assets/chevron-left-NGLHgPjF.js +0 -1
  202. package/payload/server/public/assets/chevron-right-B4B7OkG8.js +0 -1
  203. package/payload/server/public/assets/chevron-right-B4B7OkG8.js.br +0 -0
  204. package/payload/server/public/assets/clock-7IMwxJdH.js +0 -1
  205. package/payload/server/public/assets/clock-7IMwxJdH.js.br +0 -0
  206. package/payload/server/public/assets/clock-7IMwxJdH.js.gz +0 -0
  207. package/payload/server/public/assets/copy-PkR4EFD6.js +0 -1
  208. package/payload/server/public/assets/copy-PkR4EFD6.js.br +0 -0
  209. package/payload/server/public/assets/copy-PkR4EFD6.js.gz +0 -0
  210. package/payload/server/public/assets/data-yQYhw2IR.js +0 -1
  211. package/payload/server/public/assets/data-yQYhw2IR.js.br +0 -1
  212. package/payload/server/public/assets/data-yQYhw2IR.js.gz +0 -0
  213. package/payload/server/public/assets/file-text-BA9p7TLU.js +0 -1
  214. package/payload/server/public/assets/file-text-BA9p7TLU.js.br +0 -0
  215. package/payload/server/public/assets/file-text-BA9p7TLU.js.gz +0 -0
  216. package/payload/server/public/assets/graph-C8cQ6Nqf.js.br +0 -0
  217. package/payload/server/public/assets/graph-C8cQ6Nqf.js.gz +0 -0
  218. package/payload/server/public/assets/graph-labels-CiK412vE.js +0 -1
  219. package/payload/server/public/assets/graph-labels-CiK412vE.js.br +0 -0
  220. package/payload/server/public/assets/graph-labels-CiK412vE.js.gz +0 -0
  221. package/payload/server/public/assets/operator-CaQAEUBu.js +0 -1
  222. package/payload/server/public/assets/operator-CaQAEUBu.js.br +0 -0
  223. package/payload/server/public/assets/operator-CaQAEUBu.js.gz +0 -0
  224. package/payload/server/public/assets/page-CpJpyoPS.js +0 -32
  225. package/payload/server/public/assets/page-CpJpyoPS.js.br +0 -0
  226. package/payload/server/public/assets/page-CpJpyoPS.js.gz +0 -0
  227. package/payload/server/public/assets/page-D0ShNyGE.js +0 -1
  228. package/payload/server/public/assets/page-D0ShNyGE.js.br +0 -0
  229. package/payload/server/public/assets/page-D0ShNyGE.js.gz +0 -0
  230. package/payload/server/public/assets/play-huZpq9ra.js +0 -1
  231. package/payload/server/public/assets/play-huZpq9ra.js.br +0 -0
  232. package/payload/server/public/assets/play-huZpq9ra.js.gz +0 -0
  233. package/payload/server/public/assets/public--8RWWGjF.js +0 -1
  234. package/payload/server/public/assets/public--8RWWGjF.js.br +0 -0
  235. package/payload/server/public/assets/public--8RWWGjF.js.gz +0 -0
  236. package/payload/server/public/assets/rotate-ccw-g7l4ZSR3.js +0 -1
  237. package/payload/server/public/assets/rotate-ccw-g7l4ZSR3.js.br +0 -0
  238. package/payload/server/public/assets/rotate-ccw-g7l4ZSR3.js.gz +0 -0
  239. package/payload/server/public/assets/routines-DzFcPNMb.js +0 -2
  240. package/payload/server/public/assets/routines-DzFcPNMb.js.br +0 -0
  241. package/payload/server/public/assets/routines-DzFcPNMb.js.gz +0 -0
  242. package/payload/server/public/assets/skills-5vl_Bt9U.js +0 -1
  243. package/payload/server/public/assets/skills-5vl_Bt9U.js.br +0 -0
  244. package/payload/server/public/assets/skills-5vl_Bt9U.js.gz +0 -0
  245. package/payload/server/public/assets/tasks-DQHtJ8Pq.js +0 -3
  246. package/payload/server/public/assets/tasks-DQHtJ8Pq.js.br +0 -0
  247. package/payload/server/public/assets/tasks-DQHtJ8Pq.js.gz +0 -0
  248. package/payload/server/public/assets/triangle-alert-Cy4Z0uFv.js +0 -1
  249. package/payload/server/public/assets/triangle-alert-Cy4Z0uFv.js.br +0 -0
  250. package/payload/server/public/assets/triangle-alert-Cy4Z0uFv.js.gz +0 -0
  251. package/payload/server/public/assets/useCopyFeedback-BwK1RhmF.js +0 -1
  252. package/payload/server/public/assets/useCopyFeedback-BwK1RhmF.js.br +0 -0
  253. package/payload/server/public/assets/useCopyFeedback-BwK1RhmF.js.gz +0 -0
  254. package/payload/server/public/assets/useSubAccountSwitcher-C7TtIbR3.js.br +0 -0
  255. package/payload/server/public/assets/useSubAccountSwitcher-DCkivCBS.css.br +0 -0
  256. package/payload/server/public/assets/useVoiceRecorder-DgyAGgmF.js +0 -2
  257. package/payload/server/public/assets/useVoiceRecorder-DgyAGgmF.js.br +0 -0
  258. package/payload/server/public/assets/useVoiceRecorder-DgyAGgmF.js.gz +0 -0
  259. package/payload/server/public/assets/wrench-CICORrSc.js +0 -1
  260. package/payload/server/public/assets/wrench-CICORrSc.js.br +0 -0
  261. package/payload/server/public/assets/wrench-CICORrSc.js.gz +0 -0
@@ -89,8 +89,24 @@ var TELEGRAM_ADMIN_WEBHOOK_SECRET_FILE = resolve(MAXY_DIR, ".telegram-admin-webh
89
89
  var VISITOR_TOKEN_SECRET_FILE = resolve(MAXY_DIR, "credentials", "visitor-token-secret");
90
90
  var CLAUDE_CREDENTIALS_FILE = resolve(MAXY_DIR, ".claude", ".credentials.json");
91
91
 
92
- // app/lib/system-path-slugs.ts
92
+ // ../lib/agent-slug/src/index.ts
93
93
  var SYSTEM_PATH_SLUGS = ["public", "public-chat", "chat", "graph", "data", "browser"];
94
+ var RESERVED_AGENT_SLUGS = [
95
+ "admin",
96
+ "api",
97
+ "assets",
98
+ "agent-assets",
99
+ "brand",
100
+ "bot",
101
+ "privacy"
102
+ ];
103
+ var AGENT_SLUG_PATTERN = /^[a-z][a-z0-9-]{2,49}$/;
104
+ function checkAgentSlug(slug) {
105
+ if (!AGENT_SLUG_PATTERN.test(slug)) return { ok: false, reason: "shape" };
106
+ if (RESERVED_AGENT_SLUGS.includes(slug)) return { ok: false, reason: "reserved" };
107
+ if (SYSTEM_PATH_SLUGS.includes(slug)) return { ok: false, reason: "shadowed" };
108
+ return { ok: true };
109
+ }
94
110
 
95
111
  // app/lib/claude-agent/account.ts
96
112
  import { resolve as resolve2 } from "path";
@@ -258,20 +274,13 @@ function readAgentFile(accountDir, agentName, filename) {
258
274
  }
259
275
  return raw;
260
276
  }
261
- var RESERVED_SLUGS = /* @__PURE__ */ new Set(["admin", "api", "assets", "agent-assets", "brand", "bot", "privacy"]);
262
- var SHADOWED_SLUGS = new Set(SYSTEM_PATH_SLUGS);
263
- var SLUG_PATTERN = /^[a-z][a-z0-9-]{2,49}$/;
264
277
  function validateAgentSlug(slug) {
265
- if (!SLUG_PATTERN.test(slug)) return false;
266
- if (RESERVED_SLUGS.has(slug)) {
267
- console.error(`[agent-slug] op=reject slug=${slug} reason=reserved`);
268
- return false;
278
+ const verdict = checkAgentSlug(slug);
279
+ if (verdict.ok) return true;
280
+ if (verdict.reason !== "shape") {
281
+ console.error(`[agent-slug] op=reject slug=${slug} reason=${verdict.reason}`);
269
282
  }
270
- if (SHADOWED_SLUGS.has(slug)) {
271
- console.error(`[agent-slug] op=reject slug=${slug} reason=shadowed`);
272
- return false;
273
- }
274
- return true;
283
+ return false;
275
284
  }
276
285
  function resolveDefaultAgentSlug(accountDir) {
277
286
  const configPath = resolve2(accountDir, "account.json");
@@ -2002,7 +2011,7 @@ async function projectAgent(accountId, accountDir, slug) {
2002
2011
  console.error(
2003
2012
  `[agent-graph] project FAILED slug=${slug} account=${account8} error="${msg}"`
2004
2013
  );
2005
- return;
2014
+ return { nodesWritten: 0 };
2006
2015
  }
2007
2016
  const agentDir = resolve3(accountDir, "agents", slug);
2008
2017
  const configPath = resolve3(agentDir, "config.json");
@@ -2013,7 +2022,7 @@ async function projectAgent(accountId, accountDir, slug) {
2013
2022
  console.error(
2014
2023
  `[agent-graph] project FAILED slug=${slug} account=${account8} error="config.json missing at ${configPath}"`
2015
2024
  );
2016
- return;
2025
+ return { nodesWritten: 0 };
2017
2026
  }
2018
2027
  config = JSON.parse(readFileSync5(configPath, "utf-8"));
2019
2028
  for (const { filename, role } of AGENT_FILE_ROLES) {
@@ -2027,7 +2036,7 @@ async function projectAgent(accountId, accountDir, slug) {
2027
2036
  console.error(
2028
2037
  `[agent-graph] project FAILED slug=${slug} account=${account8} error="${msg}"`
2029
2038
  );
2030
- return;
2039
+ return { nodesWritten: 0 };
2031
2040
  }
2032
2041
  const session = getSession();
2033
2042
  try {
@@ -2093,6 +2102,7 @@ async function projectAgent(accountId, accountDir, slug) {
2093
2102
  console.error(
2094
2103
  `[agent-graph] project slug=${slug} account=${account8} docs=${presentRoles.length} uses=${usesCount} ms=${ms}`
2095
2104
  );
2105
+ return { nodesWritten: 1 + presentRoles.length };
2096
2106
  } catch (err) {
2097
2107
  const msg = err instanceof Error ? err.message : String(err);
2098
2108
  console.error(
@@ -12,7 +12,7 @@ import {
12
12
  getConversationOwner,
13
13
  isValidAccountId,
14
14
  registerLoop
15
- } from "./chunk-BP7LH7MC.js";
15
+ } from "./chunk-CKTHAHL4.js";
16
16
 
17
17
  // node_modules/hono/dist/compose.js
18
18
  var compose = (middleware, onError, onNotFound) => {
@@ -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."),
@@ -1803,11 +1817,40 @@ function registeredPartyFor(registeredParties, phone) {
1803
1817
  for (const [partyPhone, entry2] of Object.entries(registeredParties)) {
1804
1818
  if (!entry2 || !entry2.account || typeof entry2.party !== "string") continue;
1805
1819
  if (!PARTY_LABEL_PATTERN.test(entry2.party)) continue;
1806
- 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
+ }
1807
1824
  }
1808
1825
  return null;
1809
1826
  }
1810
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
+
1811
1854
  // app/lib/whatsapp/inbound/access-control.ts
1812
1855
  function resolveAccountConfig(config, accountConfig) {
1813
1856
  return {
@@ -1879,7 +1922,8 @@ function checkDmAccess(params) {
1879
1922
  reason: "registered-party",
1880
1923
  agentType: "public",
1881
1924
  effectiveAccountId: accountId,
1882
- party: party.party
1925
+ party: party.party,
1926
+ partyDispatch: partyDispatchAllowed(party)
1883
1927
  };
1884
1928
  }
1885
1929
  switch (cfg.dmPolicy) {
@@ -3922,7 +3966,8 @@ function combineInboundBatch(entries) {
3922
3966
  const last = entries[entries.length - 1];
3923
3967
  const combinedText = entries.map((e) => e.text).filter(Boolean).join("\n");
3924
3968
  const media = entries.flatMap((e) => e.media);
3925
- return { ...last, text: combinedText, media };
3969
+ const msgIds = entries.flatMap((e) => e.msgIds ?? []);
3970
+ return { ...last, text: combinedText, media, msgIds };
3926
3971
  }
3927
3972
 
3928
3973
  // app/lib/whatsapp/opening-hours.ts
@@ -4172,7 +4217,8 @@ function buildNotifyPending(args) {
4172
4217
  var initialized = false;
4173
4218
  function dispatchInboundPayload(conn, payload) {
4174
4219
  if (!onInboundMessage) return;
4175
- 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) });
4176
4222
  }
4177
4223
  function isObserveAccount(accountId) {
4178
4224
  return !shouldDispatchInbound(whatsAppConfig, accountId);
@@ -5452,6 +5498,9 @@ async function handleInboundMessage(conn, msg) {
5452
5498
  // Task 2234 — the gate's registered-party label, undefined for every other
5453
5499
  // sender. Rides to the gateway and on to the spawn env.
5454
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,
5455
5504
  personId: accessResult.personId ?? null,
5456
5505
  senderPhone,
5457
5506
  text: extracted.text,
@@ -5468,7 +5517,11 @@ async function handleInboundMessage(conn, msg) {
5468
5517
  // Task 1575 — the gate's owner-self verdict. Only reason:'self-phone' is the
5469
5518
  // owner's own number; adminPhones/account-manager admits are other admins
5470
5519
  // and must not inherit the owner userId.
5471
- 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] : []
5472
5525
  };
5473
5526
  if (accessResult.agentType === "public") {
5474
5527
  const hoursResult = await isBusinessOpen(conn.accountId);
@@ -5556,6 +5609,10 @@ export {
5556
5609
  managerPhonesForAccount,
5557
5610
  PARTY_LABEL_PATTERN,
5558
5611
  registeredPartyFor,
5612
+ formatPartyDispatchLine,
5613
+ noteLabelledInbound,
5614
+ buildPartyDispatchAudit,
5615
+ formatPartyDispatchAuditLine,
5559
5616
  resolveAccountConfig,
5560
5617
  isAdminPhone,
5561
5618
  buildPolicyInheritance,
@@ -30,8 +30,8 @@ import {
30
30
  startConnection,
31
31
  stopConnection,
32
32
  storeMessage
33
- } from "./chunk-S4FIEM3L.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-ZVUTB5uZ.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-C7TtIbR3.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-D24evn4t.js">
12
- <link rel="modulepreload" crossorigin href="/assets/triangle-alert-Cy4Z0uFv.js">
13
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-DCkivCBS.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-Dc9SNC9N.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-C7TtIbR3.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-D24evn4t.js">
12
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-DCkivCBS.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};
@@ -0,0 +1 @@
1
+ import{o as e}from"./chunk-CltuBf4Z.js";import{B as t,K as n,Q as r,X as i,Y as a,r as o,v as s,y as c}from"./useMediaQuery-CA6dR5iz.js";import{D as l,O as u,k as d,t as f}from"./AdminShell-DJL5DzRX.js";import{t as p}from"./triangle-alert-CR-jRJdI.js";var m=i(),h=e(r(),1),g=n(),_=`—`;function v(e){switch(e){case`waiting`:return`Waiting`;case`never-run`:return`Never run`;case`never-succeeded`:return`Never succeeded`;case`failing`:return`Failing`;case`stalled`:return`Stalled`;case`running`:return`Running`;case`ok`:return`Healthy`}}var y={waiting:`Armed and not due yet. It has no start-up run and its first interval has not elapsed, so it has correctly not fired.`,"never-run":`Its interval has elapsed and it still has not fired once. This is not the same as waiting its turn.`,"never-succeeded":`It has fired, and not one run has finished. The work this loop exists to do has never happened.`,failing:`It worked before and is failing now.`,stalled:`It has not started within three of its own intervals. Something is holding it up.`,running:`A run is in progress right now.`,ok:`The last run finished and the next is due within the interval.`},b=new Set([`never-run`,`never-succeeded`,`failing`,`stalled`]),x=10;function S(e){return e===null||!Number.isFinite(e)?_:`${e.toFixed(1)}%`}function C(e){return e<6e4?`${Math.round(e/1e3)}s`:e<36e5?`${Math.round(e/6e4)}m`:`${Math.round(e/36e5)}h`}function w(e,t){if(e===null)return _;let n=t-e;return n<0?`in ${C(-n)}`:n<6e4?`${Math.round(n/1e3)}s ago`:n<36e5?`${Math.round(n/6e4)}m ago`:`${Math.round(n/36e5)}h ago`}function T(e,t){if(e===null)return _;let n=e-t;return n>=0?`in ${C(n)}`:`overdue by ${C(-n)}`}function E({loops:e,nowMs:t=Date.now()}){let[n,r]=(0,h.useState)(!1);if(!e)return(0,g.jsxs)(`section`,{className:`activity-loops`,children:[(0,g.jsx)(`h2`,{className:`activity-loops-heading`,children:`Scheduled work`}),(0,g.jsx)(`p`,{className:`activity-loops-empty`,children:`Scheduled work could not be read from the server.`})]});let i=e.armed-e.rows.length,a=e.rows.filter(e=>b.has(e.state)),o=e.rows.filter(e=>!b.has(e.state)&&typeof e.cpuPct==`number`&&e.cpuPct>=x),s=n?e.rows:[...a,...o];return(0,g.jsxs)(`section`,{className:`activity-loops`,children:[(0,g.jsx)(`h2`,{className:`activity-loops-heading`,children:`Scheduled work`}),(0,g.jsxs)(`p`,{className:`activity-loops-sub`,children:[e.armed,` `,e.armed===1?`loop`:`loops`,` armed`,a.length>0?` · ${a.length} ${a.length===1?`needs`:`need`} attention`:` · all healthy`,o.length>0&&` · ${o.length} using significant processor`,`. `,(0,g.jsx)(`button`,{type:`button`,className:`activity-loops-toggle`,"aria-expanded":n,onClick:()=>r(e=>!e),children:n?`Show less`:`Show all`})]}),typeof e.processPct==`number`&&(0,g.jsxs)(`p`,{className:`activity-loops-cpu`,children:[`Server process at `,e.processPct.toFixed(1),`% of one core`,typeof e.attributedPct==`number`&&(0,g.jsxs)(g.Fragment,{children:[` · these loops explain `,e.attributedPct.toFixed(1),`%`]}),typeof e.unattributedPct==`number`&&e.unattributedPct>=1&&(0,g.jsxs)(g.Fragment,{children:[` · `,(0,g.jsxs)(`strong`,{children:[e.unattributedPct.toFixed(1),`% is not from these loops`]})]})]}),i>0&&(0,g.jsxs)(`p`,{className:`activity-loops-omission`,role:`status`,children:[i,` armed `,i===1?`loop is`:`loops are`,` missing from this list. The server armed `,e.armed,` but sent `,e.rows.length,`.`]}),s.length===0?null:(0,g.jsx)(`div`,{className:`activity-table-scroll`,children:(0,g.jsxs)(`table`,{className:`activity-table`,children:[(0,g.jsx)(`thead`,{children:(0,g.jsxs)(`tr`,{children:[(0,g.jsx)(`th`,{scope:`col`,className:`activity-th`,children:`Loop`}),(0,g.jsx)(`th`,{scope:`col`,className:`activity-th`,children:`State`}),(0,g.jsx)(`th`,{scope:`col`,className:`activity-th`,children:`Every`}),(0,g.jsx)(`th`,{scope:`col`,className:`activity-th`,children:`Last run`}),(0,g.jsx)(`th`,{scope:`col`,className:`activity-th`,children:`Last OK`}),(0,g.jsx)(`th`,{scope:`col`,className:`activity-th`,children:`Took`}),(0,g.jsx)(`th`,{scope:`col`,className:`activity-th`,children:`CPU`}),(0,g.jsx)(`th`,{scope:`col`,className:`activity-th`,children:`Runs`}),(0,g.jsx)(`th`,{scope:`col`,className:`activity-th`,children:`Produced`}),(0,g.jsx)(`th`,{scope:`col`,className:`activity-th`,children:`Next due`})]})}),(0,g.jsx)(`tbody`,{children:s.map(e=>(0,g.jsxs)(`tr`,{className:b.has(e.state)?`activity-loop-row activity-loop-unhealthy`:`activity-loop-row`,children:[(0,g.jsx)(`td`,{className:`activity-td`,children:e.name}),(0,g.jsx)(`td`,{className:`activity-td`,title:y[e.state],children:(0,g.jsxs)(`span`,{className:`activity-state`,children:[(0,g.jsx)(`span`,{className:e.state===`ok`?`activity-state-dot is-healthy`:b.has(e.state)?`activity-state-dot is-unhealthy`:`activity-state-dot`,"aria-hidden":`true`}),v(e.state)]})}),(0,g.jsx)(`td`,{className:`activity-td activity-num`,children:C(e.intervalMs)}),(0,g.jsx)(`td`,{className:`activity-td activity-num`,children:w(e.lastStartMs,t)}),(0,g.jsx)(`td`,{className:`activity-td activity-num`,children:w(e.lastSuccessMs,t)}),(0,g.jsx)(`td`,{className:`activity-td activity-num`,children:e.lastDurationMs===null?_:`${e.lastDurationMs} ms`}),(0,g.jsx)(`td`,{className:`activity-td activity-num`,title:e.cpuAttributable?e.detached?`Includes the processor time of the separate process this loop starts.`:void 0:`This loop waits on other work while it runs, so the processor time it uses cannot be separated from the rest of the server.`,children:S(e.cpuPct)}),(0,g.jsxs)(`td`,{className:`activity-td activity-num`,children:[e.successCount,`/`,e.runCount]}),(0,g.jsx)(`td`,{className:`activity-td activity-loop-note`,children:(0,g.jsx)(`span`,{className:`activity-loop-note-text`,title:e.lastError??e.lastNote??void 0,children:e.lastError??e.lastNote??_})}),(0,g.jsx)(`td`,{className:`activity-td activity-num`,children:T(e.nextDueMs,t)})]},e.name))})]})}),(0,g.jsxs)(`dl`,{className:`activity-legend`,children:[(0,g.jsxs)(`div`,{className:`activity-legend-item`,children:[(0,g.jsx)(`dt`,{className:`activity-legend-term`,children:`Runs`}),(0,g.jsx)(`dd`,{className:`activity-legend-def`,children:`Finished runs out of attempted runs since the server started. 0 out of a large number means it has tried many times and never once finished.`})]}),(0,g.jsxs)(`div`,{className:`activity-legend-item`,children:[(0,g.jsx)(`dt`,{className:`activity-legend-term`,children:`CPU`}),(0,g.jsx)(`dd`,{className:`activity-legend-def`,children:`Share of one processor core this loop is using, measured between the last two refreshes. It includes any separate process the loop starts, and can pass 100% because those run alongside each other. A dash means it could not be measured: the loop waits on other work while it runs, so its share cannot be separated from the rest of the server.`})]}),(0,g.jsxs)(`div`,{className:`activity-legend-item`,children:[(0,g.jsx)(`dt`,{className:`activity-legend-term`,children:_}),(0,g.jsx)(`dd`,{className:`activity-legend-def`,children:`Not measured. It does not mean zero.`})]})]})]})}var D=`maxy-admin-session-key`;function O(e){switch(e.costUnavailable){case`metering-failed`:return`Cost could not be calculated: ${e.meteringError??`the transcript could not be read`}`;case`model-not-priced`:return`No published price for this model, so cost cannot be estimated.`;case`no-transcript`:return`This session has no transcript yet, so there is nothing to cost.`;default:return}}var k=[{key:`lastMessageAt`,label:`Last activity`,dir:-1},{key:`activeMsInRange`,label:`Active time`,dir:-1},{key:`costGbp`,label:`Cost`,dir:-1},{key:`accountId`,label:`Account name`,dir:1}],A=[{key:`title`,label:`Session`,help:`The conversation name, or its short id when it has none yet.`},{key:`model`,label:`Model`,help:`The model that answered the most recent turn.`},{key:`status`,label:`Status`,help:`What the process is doing right now.`},{key:`activeMsInRange`,label:`Active`,help:`Time this session spent thinking, writing and running tools inside the selected range. This is worked time, not elapsed time.`},{key:`ageMs`,label:`Age`,help:`How long ago this conversation started. Wall-clock, so it counts every hour nobody was working.`},{key:`lastMessageAt`,label:`Last activity`,help:`The clock time of the most recent message, in your timezone. A date appears once it is not today.`},{key:`turnCount`,label:`Turns`,help:`Messages exchanged. A trailing + means the count is a minimum — the conversation is too long to count exactly.`},{key:`rssKb`,label:`RAM`,help:`Memory held by this session and all its helper processes together.`},{key:`cpuPct`,label:`CPU (avg)`,help:`AVERAGE share of one processor core over the last census interval, up to 60 seconds. It is not a reading of this instant, so a session that answered a turn a minute ago still shows a high figure while sitting quiet now. Can exceed 100% because a session runs many processes at once.`},{key:`tokensInRange`,label:`Tokens`,help:`Total tokens billed inside the selected range, added up across every day in it. A cumulative total, not the size of the conversation the model currently reads back.`},{key:`costGbp`,label:`Cost`,help:`Estimated spend inside the selected range, at published prices for this model.`}],j=[`activeMsInRange`,`lastMessageAt`,`cpuPct`,`tokensInRange`],M={label:`Account`,help:`The business this session belongs to. "untagged" means the session records no account.`};function N(e,t){let n=t?.[e];return n&&n.trim()!==``?n:e.slice(0,8)}var P=`—`;function F(e){if(e===null||!Number.isFinite(e)||e<0)return P;let t=Math.floor(e/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/60);if(n<60)return`${n}m`;let r=Math.floor(n/60);return r<24?`${r}h ${n%60}m`:`${Math.floor(r/24)}d ${r%24}h`}function I(e){return e===null||!Number.isFinite(e)?P:`${(e/1024/1024).toFixed(1)} GB`}function L(e,t){if(!e)return P;let n=Date.parse(e);if(!Number.isFinite(n))return P;let r=new Date(n),i=new Date(t),a=`${String(r.getHours()).padStart(2,`0`)}:${String(r.getMinutes()).padStart(2,`0`)}`;return r.getFullYear()===i.getFullYear()&&r.getMonth()===i.getMonth()&&r.getDate()===i.getDate()?a:`${r.getDate()} ${r.toLocaleString(`en-GB`,{month:`short`})} ${a}`}function R(e){return e===null||!Number.isFinite(e)?P:`${e.toFixed(1)}%`}function z(e){return e===null||!Number.isFinite(e)?P:e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(1)}k`:`${(e/1e6).toFixed(2)}M`}function B(e){return e===null||!Number.isFinite(e)?P:`£${e.toFixed(2)}`}function V(e){if(e===null||!Number.isFinite(e)||e<0)return P;let t=Math.floor(e/6e4);return`${Math.floor(t/60)}h ${t%60}m`}function H(e,t,n,r){let i=e[n],a=t[n];if(i===null&&a===null)return 0;if(i===null)return 1;if(a===null)return-1;if(n===`lastMessageAt`){let e=Date.parse(String(i)),t=Date.parse(String(a));return!Number.isFinite(e)&&!Number.isFinite(t)?0:Number.isFinite(e)?Number.isFinite(t)?(e-t)*r:-1:1}return typeof i==`number`&&typeof a==`number`?(i-a)*r:String(i).localeCompare(String(a))*r}function U(e){return e.toISOString().slice(0,10)}function W(e){let t=e.getUTCFullYear(),n=e.getUTCMonth();return{from:U(new Date(Date.UTC(t,n,1))),to:U(new Date(Date.UTC(t,n+1,0)))}}function G(e,t){let n=new Date(`${e}T00:00:00.000Z`);return W(new Date(Date.UTC(n.getUTCFullYear(),n.getUTCMonth()+t,1)))}function ee(e,t){return{from:U(new Date(t-(e-1)*864e5)),to:U(new Date(t))}}function K(e){return new Date(`${e}T00:00:00.000Z`).toLocaleString(`en-GB`,{month:`long`,year:`numeric`,timeZone:`UTC`})}function q(e){if(e===null)return!1;let t=W(new Date(`${e.from}T00:00:00.000Z`));return t.from===e.from&&t.to===e.to}function J(e,t,n){switch(e){case`title`:return t.title??t.sessionId.slice(0,8);case`model`:return t.model??P;case`status`:return t.status??P;case`activeMsInRange`:return V(t.activeMsInRange);case`ageMs`:return F(t.ageMs);case`lastMessageAt`:return L(t.lastMessageAt,n);case`turnCount`:return t.turnCount===null?P:`${t.turnCount}${t.turnCountCapped?`+`:``}`;case`rssKb`:return I(t.rssKb);case`cpuPct`:return R(t.cpuPct);case`tokensInRange`:return z(t.tokensInRange);case`costGbp`:return B(t.costGbp);default:return P}}function Y({adminFetch:e,cacheKey:n}){let[r,i]=(0,h.useState)(null),[a,c]=(0,h.useState)(null),[d,f]=(0,h.useState)(!1),[m,_]=(0,h.useState)(`lastMessageAt`),[v,y]=(0,h.useState)(-1),[b,x]=(0,h.useState)(()=>W(new Date)),[S,C]=(0,h.useState)(!0),[w,T]=(0,h.useState)(!0),[D,I]=(0,h.useState)(!1),L=(0,h.useCallback)(async(e,t)=>{n&&await o(n,e)&&window.location.assign(`/chat?session=${encodeURIComponent(t)}`)},[n]),R=(0,h.useRef)(!1),z=(0,h.useRef)(void 0),B=(0,h.useCallback)(async t=>{if(R.current){z.current=t;return}R.current=!0;try{let n=await e(`/api/admin/activity${t?`?from=${t.from}&to=${t.to}`:``}`);if(n.status===403){c(`This view is available to the house account only.`),f(!0);return}if(!n.ok){c(`The session manager did not answer (status ${n.status}).`),f(!0);return}i(await n.json()),c(null)}catch(e){c(e instanceof Error?e.message:String(e))}finally{f(!0),R.current=!1;let e=z.current;z.current=void 0,e!==void 0&&B(e)}},[e]);(0,h.useEffect)(()=>{B(b);let e=setInterval(()=>void B(b),15e3);return()=>clearInterval(e)},[B,b]);let V=(0,h.useMemo)(()=>r?[...r.rows].sort((e,t)=>H(e,t,m,v)):[],[r,m,v]),U=(0,h.useMemo)(()=>V.filter(e=>e.status===`busy`?S:e.status===`idle`?w:!0),[V,S,w]),Y=V.length-U.length;if(!d)return(0,g.jsx)(s,{surface:`gate`});if(a)return(0,g.jsx)(`div`,{className:`activity-empty`,children:a});if(!r)return(0,g.jsx)(`div`,{className:`activity-empty`,children:`No response.`});let{accounts:X,census:Z,censusAgeMs:Q}=r,te=Date.now(),ne=X.onDisk!==null&&X.onDisk>X.valid,$=r.range===void 0?b:r.range;return(0,g.jsxs)(`div`,{className:`ui-page ui-page--full activity-body`,children:[(0,g.jsxs)(`div`,{className:`activity-head`,children:[(0,g.jsxs)(`span`,{className:`activity-title`,children:[(0,g.jsx)(t,{size:16}),` Live sessions`]}),(0,g.jsxs)(`span`,{className:`activity-meta`,children:[Y>0?`${U.length} of ${V.length} live · ${Y} hidden`:`${V.length} live`,` · `,X.valid,` accounts`,X.untaggedCount>0?` · ${X.untaggedCount} untagged`:``]})]}),(0,g.jsxs)(`div`,{className:`activity-controls`,children:[(0,g.jsxs)(`div`,{className:`activity-control activity-range`,children:[(0,g.jsx)(l,{variant:`secondary`,size:`sm`,"aria-label":`Previous month`,disabled:!q(b),onClick:()=>x(e=>e&&G(e.from,-1)),children:`‹`}),(0,g.jsx)(`span`,{className:`activity-range-label`,children:b===null?`All time`:q(b)?K(b.from):`${b.from} → ${b.to}`}),(0,g.jsx)(l,{variant:`secondary`,size:`sm`,"aria-label":`Next month`,disabled:!q(b),onClick:()=>x(e=>e&&G(e.from,1)),children:`›`})]}),(0,g.jsxs)(`div`,{className:`activity-control activity-presets`,children:[(0,g.jsx)(l,{variant:`secondary`,size:`sm`,"aria-pressed":b!==null&&q(b)&&b.from===W(new Date).from,onClick:()=>x(W(new Date)),children:`This month`}),(0,g.jsx)(l,{variant:`secondary`,size:`sm`,"aria-pressed":b!==null&&!q(b),onClick:()=>x(ee(7,Date.now())),children:`Last 7 days`}),(0,g.jsx)(l,{variant:`secondary`,size:`sm`,"aria-pressed":b===null,onClick:()=>x(null),children:`All time`})]}),(0,g.jsxs)(`div`,{className:`activity-control`,children:[(0,g.jsx)(`label`,{className:`activity-control-label`,htmlFor:`activity-sort`,children:`Sort by`}),(0,g.jsx)(`span`,{className:`activity-select-wrap`,children:(0,g.jsx)(`select`,{id:`activity-sort`,className:`activity-select`,value:m,onChange:e=>{let t=k.find(t=>t.key===e.target.value);t&&(_(t.key),y(t.dir))},children:k.map(e=>(0,g.jsx)(`option`,{value:e.key,children:e.label},e.key))})})]}),(0,g.jsxs)(`div`,{className:`activity-control activity-visibility`,children:[(0,g.jsx)(u,{checked:S,onChange:C,label:`Busy`}),(0,g.jsx)(u,{checked:w,onChange:T,label:`Idle`})]})]}),(0,g.jsxs)(`div`,{className:`activity-range-note`,children:[$===null?`Active time, tokens and cost cover each conversation’s whole history.`:`Active time, tokens and cost cover ${$.from} to ${$.to} (UTC), inclusive.`,r.fullRangeFallback&&(0,g.jsxs)(`strong`,{className:`activity-range-rejected`,children:[` `,`The range was not accepted, so these are all-time figures.`]})]}),(0,g.jsx)(`div`,{className:`activity-census`,children:Z===null?`No census collected yet, so memory and CPU are unavailable.`:`Memory and CPU measured ${F(Q)} ago, averaged over the minute before that · ${Z.cpuNull} of ${Z.live} without a CPU reading`}),ne&&(0,g.jsxs)(`div`,{className:`activity-warning`,children:[(0,g.jsx)(p,{size:14}),` `,X.onDisk,` account folders on disk but only`,` `,X.valid,` are readable. Sessions belonging to the rest cannot be attributed.`]}),V.length===0?(0,g.jsx)(`div`,{className:`activity-empty`,children:`No sessions are running.`}):U.length===0?(0,g.jsxs)(`div`,{className:`activity-empty`,children:[`All `,V.length,` running sessions are hidden by the Busy and Idle filters.`]}):(0,g.jsx)(`div`,{className:`activity-grid`,children:U.map(e=>{let t=e.accountId!==null&&!!n,r=t?()=>void L(e.accountId,e.sessionId):void 0;return(0,g.jsxs)(`article`,{className:`activity-card${t?` activity-card-clickable`:``}`,"data-testid":`activity-card`,"data-session-id":e.sessionId,role:t?`button`:void 0,tabIndex:t?0:void 0,onClick:r,onKeyDown:t?e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),r())}:void 0,children:[(0,g.jsx)(`h3`,{className:`activity-card-heading`,title:e.accountId??void 0,children:e.accountId===null?(0,g.jsx)(`span`,{className:`activity-untagged`,title:`This session records no account, so it cannot be attributed to a business.`,children:`untagged`}):N(e.accountId,X.names)}),(0,g.jsx)(`dl`,{className:`activity-card-rows`,children:A.map(t=>(0,g.jsxs)(`div`,{className:`activity-card-row`,children:[(0,g.jsx)(`dt`,{className:`activity-card-label`,"data-testid":`activity-card-label`,title:t.help,children:t.label}),(0,g.jsx)(`dd`,{className:`activity-card-value`,title:t.key===`costGbp`?O(e):void 0,children:J(t.key,e,te)})]},t.key))})]},e.sessionId)})}),V.length>0&&(0,g.jsxs)(`div`,{className:`activity-glossary`,children:[(0,g.jsxs)(`dl`,{className:`activity-legend`,children:[D&&(0,g.jsxs)(`div`,{className:`activity-legend-item`,children:[(0,g.jsx)(`dt`,{className:`activity-legend-term`,"data-testid":`activity-glossary-term`,children:M.label}),(0,g.jsx)(`dd`,{className:`activity-legend-def`,children:M.help})]},`heading`),(D?A:A.filter(e=>j.includes(e.key))).map(e=>(0,g.jsxs)(`div`,{className:`activity-legend-item`,children:[(0,g.jsx)(`dt`,{className:`activity-legend-term`,"data-testid":`activity-glossary-term`,children:e.label}),(0,g.jsx)(`dd`,{className:`activity-legend-def`,children:e.help})]},e.key)),(0,g.jsxs)(`div`,{className:`activity-legend-item`,children:[(0,g.jsx)(`dt`,{className:`activity-legend-term`,children:P}),(0,g.jsxs)(`dd`,{className:`activity-legend-def`,children:[`Not measured. It does not mean zero — a measured zero is written as a figure, so `,(0,g.jsx)(`em`,{children:`0h 0m`}),` and `,(0,g.jsx)(`em`,{children:`£0.00`}),` are real readings. Hover a dashed value for the reason where one exists.`]})]})]}),(0,g.jsx)(l,{variant:`secondary`,size:`sm`,className:`activity-glossary-toggle`,onClick:()=>I(e=>!e),children:D?`Show fewer`:`Explain every figure`})]}),(0,g.jsx)(E,{loops:r?.loops})]})}function X({cacheKey:e}){let{adminFetch:t}=a({initialCacheKey:e,surface:`activity`});return(0,g.jsx)(Y,{adminFetch:t,cacheKey:e})}function Z(){let[e,t]=(0,h.useState)(null),[n,r]=(0,h.useState)(!1),[i,a]=(0,h.useState)(void 0),[o,l]=(0,h.useState)(null),[u,p]=(0,h.useState)(null),[m,_]=(0,h.useState)(null),[v,y]=(0,h.useState)(null);(0,h.useEffect)(()=>{let e=!1,n=null;try{n=sessionStorage.getItem(D)}catch{}if(!n){t(null),r(!0);return}return fetch(`/api/admin/session?session_key=${encodeURIComponent(n)}`).then(async i=>{if(!e){if(i.status===401){try{sessionStorage.removeItem(D)}catch{}window.location.href=`/`;return}if(i.ok)try{let e=await i.json();typeof e.businessName==`string`&&a(e.businessName),e.sessionId!==void 0&&l(e.sessionId??null),p(e.role??null),_(e.userName===void 0?null:e.userName),y(e.avatar??null)}catch{}t(n),r(!0)}}).catch(()=>{e||(t(n),r(!0))}),()=>{e=!0}},[]);let b=(0,h.useCallback)(()=>{try{sessionStorage.removeItem(D)}catch{}window.location.href=`/`},[]),[x,S]=(0,h.useState)(!1),C=(0,h.useCallback)(async()=>{S(!0);try{let e=await d();if(e){try{sessionStorage.removeItem(D)}catch{}window.location.href=`/`}return e}finally{S(!1)}},[]);return n?e?(0,g.jsx)(c,{cacheKey:e,surface:`activity`,onSessionExpired:({code:e,path:t})=>{console.warn(`[admin-auth] outcome=session-expired-redirect code=${e} path=${t} surface=activity`);try{sessionStorage.removeItem(D)}catch{}window.location.href=`/`},children:(0,g.jsx)(f,{cacheKey:e,businessName:i,sessionId:o,onLogout:b,onDisconnect:C,disconnecting:x,userName:m,userAvatar:v,role:u,children:(0,g.jsx)(X,{cacheKey:e})})}):(0,g.jsx)(`div`,{className:`activity-page`,children:(0,g.jsxs)(`div`,{className:`activity-empty`,children:[(0,g.jsx)(`p`,{children:`You are not signed in.`}),(0,g.jsxs)(`p`,{children:[`Open the `,(0,g.jsx)(`a`,{href:`/`,className:`activity-link`,children:`main admin page`}),` and log in, then return here.`]})]})}):(0,g.jsx)(s,{surface:`gate`})}(0,m.createRoot)(document.getElementById(`root`)).render((0,g.jsx)(Z,{}));