@rubytech/create-sitedesk-code 0.1.515 → 0.1.516

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 (200) hide show
  1. package/dist/__tests__/launchd-bootstrap.test.js +164 -18
  2. package/dist/index.js +15 -14
  3. package/dist/launchd-bootstrap.js +86 -17
  4. package/package.json +1 -1
  5. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +53 -4
  6. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +6 -0
  7. package/payload/platform/plugins/docs/references/admin-ui.md +25 -2
  8. package/payload/platform/plugins/docs/references/deployment.md +4 -0
  9. package/payload/platform/plugins/email/PLUGIN.md +1 -1
  10. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-metadata-calendar.test.d.ts +2 -0
  11. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-metadata-calendar.test.d.ts.map +1 -0
  12. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-metadata-calendar.test.js +94 -0
  13. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-metadata-calendar.test.js.map +1 -0
  14. package/payload/platform/plugins/email/mcp/dist/index.js +1 -1
  15. package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
  16. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +21 -1
  17. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts.map +1 -1
  18. package/payload/platform/plugins/email/mcp/dist/lib/imap.js +49 -8
  19. package/payload/platform/plugins/email/mcp/dist/lib/imap.js.map +1 -1
  20. package/payload/platform/plugins/email/references/email-reference.md +4 -0
  21. package/payload/platform/plugins/outlook/mcp/dist/__tests__/graph-client-retry.test.js +143 -2
  22. package/payload/platform/plugins/outlook/mcp/dist/__tests__/graph-client-retry.test.js.map +1 -1
  23. package/payload/platform/plugins/outlook/mcp/dist/__tests__/graph-client.test.js +33 -3
  24. package/payload/platform/plugins/outlook/mcp/dist/__tests__/graph-client.test.js.map +1 -1
  25. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mail-search-paging.test.js +142 -0
  26. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mail-search-paging.test.js.map +1 -1
  27. package/payload/platform/plugins/outlook/mcp/dist/lib/graph-client.d.ts +8 -0
  28. package/payload/platform/plugins/outlook/mcp/dist/lib/graph-client.d.ts.map +1 -1
  29. package/payload/platform/plugins/outlook/mcp/dist/lib/graph-client.js +40 -0
  30. package/payload/platform/plugins/outlook/mcp/dist/lib/graph-client.js.map +1 -1
  31. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-search.d.ts.map +1 -1
  32. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-search.js +54 -3
  33. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-search.js.map +1 -1
  34. package/payload/platform/plugins/outlook/references/graph-surfaces.md +9 -3
  35. package/payload/server/public/activity.html +5 -5
  36. package/payload/server/public/agents.html +4 -4
  37. package/payload/server/public/assets/{AdminLoginScreens-Cs1jSnOF.js → AdminLoginScreens-B5qKb3YK.js} +1 -1
  38. package/payload/server/public/assets/AdminLoginScreens-B5qKb3YK.js.br +0 -0
  39. package/payload/server/public/assets/AdminLoginScreens-B5qKb3YK.js.gz +0 -0
  40. package/payload/server/public/assets/{AdminShell-DkrURZnF.js → AdminShell-BgJEq2zJ.js} +1 -1
  41. package/payload/server/public/assets/AdminShell-BgJEq2zJ.js.br +0 -0
  42. package/payload/server/public/assets/AdminShell-BgJEq2zJ.js.gz +0 -0
  43. package/payload/server/public/assets/{activity-BgZISMuE.js → activity-DmnVUDYO.js} +1 -1
  44. package/payload/server/public/assets/activity-DmnVUDYO.js.br +0 -0
  45. package/payload/server/public/assets/activity-DmnVUDYO.js.gz +0 -0
  46. package/payload/server/public/assets/{admin-DjFysc3-.js → admin-Dpge4OG9.js} +1 -1
  47. package/payload/server/public/assets/admin-Dpge4OG9.js.br +0 -0
  48. package/payload/server/public/assets/admin-Dpge4OG9.js.gz +0 -0
  49. package/payload/server/public/assets/{agents-Bx-MSZW6.js → agents-Bmq9X7P3.js} +1 -1
  50. package/payload/server/public/assets/agents-Bmq9X7P3.js.br +0 -0
  51. package/payload/server/public/assets/agents-Bmq9X7P3.js.gz +0 -0
  52. package/payload/server/public/assets/{browser-1I7syhHu.js → browser-B1G-W80B.js} +1 -1
  53. package/payload/server/public/assets/browser-B1G-W80B.js.br +0 -0
  54. package/payload/server/public/assets/browser-B1G-W80B.js.gz +0 -0
  55. package/payload/server/public/assets/{calendar-D_04JIo1.js → calendar-CHgrOFIN.js} +1 -1
  56. package/payload/server/public/assets/calendar-CHgrOFIN.js.br +0 -0
  57. package/payload/server/public/assets/calendar-CHgrOFIN.js.gz +0 -0
  58. package/payload/server/public/assets/chat-CIwmmtwP.js +1 -0
  59. package/payload/server/public/assets/chat-CIwmmtwP.js.br +0 -0
  60. package/payload/server/public/assets/chat-CIwmmtwP.js.gz +0 -0
  61. package/payload/server/public/assets/chevron-left-EQjfaQ-n.js +1 -0
  62. package/payload/server/public/assets/chevron-left-EQjfaQ-n.js.br +0 -0
  63. package/payload/server/public/assets/chevron-right-Ct8jZUGP.js +1 -0
  64. package/payload/server/public/assets/chevron-right-Ct8jZUGP.js.br +0 -0
  65. package/payload/server/public/assets/clock-Cxz5ybck.js +1 -0
  66. package/payload/server/public/assets/clock-Cxz5ybck.js.br +0 -0
  67. package/payload/server/public/assets/clock-Cxz5ybck.js.gz +0 -0
  68. package/payload/server/public/assets/data-BQVXKVsJ.js +1 -0
  69. package/payload/server/public/assets/data-BQVXKVsJ.js.br +1 -0
  70. package/payload/server/public/assets/data-BQVXKVsJ.js.gz +0 -0
  71. package/payload/server/public/assets/{file-text-DkvKqHMx.js → file-text-BVqqaDun.js} +1 -1
  72. package/payload/server/public/assets/file-text-BVqqaDun.js.br +0 -0
  73. package/payload/server/public/assets/file-text-BVqqaDun.js.gz +0 -0
  74. package/payload/server/public/assets/{graph-CCZhrwZX.js → graph-CEcME0lp.js} +1 -1
  75. package/payload/server/public/assets/graph-CEcME0lp.js.br +0 -0
  76. package/payload/server/public/assets/graph-CEcME0lp.js.gz +0 -0
  77. package/payload/server/public/assets/{graph-labels-BJ7puQkX.js → graph-labels-Zl32_AOH.js} +1 -1
  78. package/payload/server/public/assets/graph-labels-Zl32_AOH.js.br +0 -0
  79. package/payload/server/public/assets/graph-labels-Zl32_AOH.js.gz +0 -0
  80. package/payload/server/public/assets/{maximize-2-Xdj804U1.js → maximize-2-rkkMyAhf.js} +1 -1
  81. package/payload/server/public/assets/maximize-2-rkkMyAhf.js.br +0 -0
  82. package/payload/server/public/assets/maximize-2-rkkMyAhf.js.gz +0 -0
  83. package/payload/server/public/assets/{operator-BkfNpBs7.js → operator-DlL023ch.js} +1 -1
  84. package/payload/server/public/assets/operator-DlL023ch.js.br +0 -0
  85. package/payload/server/public/assets/operator-DlL023ch.js.gz +0 -0
  86. package/payload/server/public/assets/{page-D5n8ShE7.js → page-BAmYYqxp.js} +1 -1
  87. package/payload/server/public/assets/page-BAmYYqxp.js.br +0 -0
  88. package/payload/server/public/assets/page-BAmYYqxp.js.gz +0 -0
  89. package/payload/server/public/assets/{page-BoYc9c4a.js → page-k0BhBkA2.js} +1 -1
  90. package/payload/server/public/assets/page-k0BhBkA2.js.br +0 -0
  91. package/payload/server/public/assets/page-k0BhBkA2.js.gz +0 -0
  92. package/payload/server/public/assets/{public-CX5XSrxD.js → public-Cqgfmo1D.js} +1 -1
  93. package/payload/server/public/assets/public-Cqgfmo1D.js.br +0 -0
  94. package/payload/server/public/assets/public-Cqgfmo1D.js.gz +0 -0
  95. package/payload/server/public/assets/{rotate-ccw-dh_OhL23.js → rotate-ccw-O3RmqoTy.js} +1 -1
  96. package/payload/server/public/assets/rotate-ccw-O3RmqoTy.js.br +0 -0
  97. package/payload/server/public/assets/rotate-ccw-O3RmqoTy.js.gz +0 -0
  98. package/payload/server/public/assets/{routines-bb7dxcrr.js → routines-DMYObMUy.js} +1 -1
  99. package/payload/server/public/assets/routines-DMYObMUy.js.br +0 -0
  100. package/payload/server/public/assets/routines-DMYObMUy.js.gz +0 -0
  101. package/payload/server/public/assets/{skills-TeMwxXmJ.js → skills-DON1BKu5.js} +1 -1
  102. package/payload/server/public/assets/skills-DON1BKu5.js.br +0 -0
  103. package/payload/server/public/assets/skills-DON1BKu5.js.gz +0 -0
  104. package/payload/server/public/assets/{tasks-BqBBJlkg.js → tasks-C2PhUSrf.js} +1 -1
  105. package/payload/server/public/assets/tasks-C2PhUSrf.js.br +0 -0
  106. package/payload/server/public/assets/tasks-C2PhUSrf.js.gz +0 -0
  107. package/payload/server/public/assets/{time-entry-format-Cy_T-wiD.js → time-entry-format-4zgmuQI0.js} +1 -1
  108. package/payload/server/public/assets/time-entry-format-4zgmuQI0.js.br +0 -0
  109. package/payload/server/public/assets/time-entry-format-4zgmuQI0.js.gz +0 -0
  110. package/payload/server/public/assets/{triangle-alert-D-bSbPnX.js → triangle-alert-By5D7wuI.js} +1 -1
  111. package/payload/server/public/assets/triangle-alert-By5D7wuI.js.br +0 -0
  112. package/payload/server/public/assets/triangle-alert-By5D7wuI.js.gz +0 -0
  113. package/payload/server/public/assets/{useCopyFeedback-L7L55nFl.js → useCopyFeedback-Dx0vtm9s.js} +1 -1
  114. package/payload/server/public/assets/useCopyFeedback-Dx0vtm9s.js.br +0 -0
  115. package/payload/server/public/assets/useCopyFeedback-Dx0vtm9s.js.gz +0 -0
  116. package/payload/server/public/assets/{useSubAccountSwitcher-BYl2c7xA.css → useSubAccountSwitcher-UQQDcj0B.css} +1 -1
  117. package/payload/server/public/assets/useSubAccountSwitcher-UQQDcj0B.css.br +0 -0
  118. package/payload/server/public/assets/useSubAccountSwitcher-UQQDcj0B.css.gz +0 -0
  119. package/payload/server/public/assets/{useVoiceRecorder-MuZ7lpet.js → useVoiceRecorder-BgwOCCwj.js} +1 -1
  120. package/payload/server/public/assets/useVoiceRecorder-BgwOCCwj.js.br +0 -0
  121. package/payload/server/public/assets/useVoiceRecorder-BgwOCCwj.js.gz +0 -0
  122. package/payload/server/public/assets/{wrench-DUG1SZQB.js → wrench-CHfMwLza.js} +1 -1
  123. package/payload/server/public/assets/wrench-CHfMwLza.js.br +0 -0
  124. package/payload/server/public/assets/wrench-CHfMwLza.js.gz +0 -0
  125. package/payload/server/public/browser.html +4 -4
  126. package/payload/server/public/calendar.html +7 -7
  127. package/payload/server/public/chat.html +13 -13
  128. package/payload/server/public/data.html +11 -11
  129. package/payload/server/public/graph.html +9 -9
  130. package/payload/server/public/index.html +14 -14
  131. package/payload/server/public/operator.html +14 -14
  132. package/payload/server/public/public.html +13 -13
  133. package/payload/server/public/routines.html +6 -6
  134. package/payload/server/public/skills.html +5 -5
  135. package/payload/server/public/tasks.html +6 -6
  136. package/payload/server/server.js +38 -4
  137. package/payload/server/public/assets/AdminLoginScreens-Cs1jSnOF.js.br +0 -0
  138. package/payload/server/public/assets/AdminLoginScreens-Cs1jSnOF.js.gz +0 -0
  139. package/payload/server/public/assets/AdminShell-DkrURZnF.js.br +0 -0
  140. package/payload/server/public/assets/AdminShell-DkrURZnF.js.gz +0 -0
  141. package/payload/server/public/assets/activity-BgZISMuE.js.br +0 -0
  142. package/payload/server/public/assets/activity-BgZISMuE.js.gz +0 -0
  143. package/payload/server/public/assets/admin-DjFysc3-.js.br +0 -0
  144. package/payload/server/public/assets/admin-DjFysc3-.js.gz +0 -0
  145. package/payload/server/public/assets/agents-Bx-MSZW6.js.br +0 -0
  146. package/payload/server/public/assets/agents-Bx-MSZW6.js.gz +0 -0
  147. package/payload/server/public/assets/browser-1I7syhHu.js.br +0 -0
  148. package/payload/server/public/assets/browser-1I7syhHu.js.gz +0 -0
  149. package/payload/server/public/assets/calendar-D_04JIo1.js.br +0 -0
  150. package/payload/server/public/assets/calendar-D_04JIo1.js.gz +0 -0
  151. package/payload/server/public/assets/chat-BFH3FM5a.js +0 -1
  152. package/payload/server/public/assets/chat-BFH3FM5a.js.br +0 -0
  153. package/payload/server/public/assets/chat-BFH3FM5a.js.gz +0 -0
  154. package/payload/server/public/assets/chevron-left-Ux9-qLkk.js +0 -1
  155. package/payload/server/public/assets/chevron-right-BwIuCfyG.js +0 -1
  156. package/payload/server/public/assets/chevron-right-BwIuCfyG.js.br +0 -0
  157. package/payload/server/public/assets/clock-DhJdZRhC.js +0 -1
  158. package/payload/server/public/assets/clock-DhJdZRhC.js.br +0 -0
  159. package/payload/server/public/assets/data-ChY_uSIk.js +0 -1
  160. package/payload/server/public/assets/data-ChY_uSIk.js.br +0 -0
  161. package/payload/server/public/assets/data-ChY_uSIk.js.gz +0 -0
  162. package/payload/server/public/assets/file-text-DkvKqHMx.js.br +0 -0
  163. package/payload/server/public/assets/file-text-DkvKqHMx.js.gz +0 -0
  164. package/payload/server/public/assets/graph-CCZhrwZX.js.br +0 -0
  165. package/payload/server/public/assets/graph-CCZhrwZX.js.gz +0 -0
  166. package/payload/server/public/assets/graph-labels-BJ7puQkX.js.br +0 -0
  167. package/payload/server/public/assets/graph-labels-BJ7puQkX.js.gz +0 -0
  168. package/payload/server/public/assets/maximize-2-Xdj804U1.js.br +0 -0
  169. package/payload/server/public/assets/maximize-2-Xdj804U1.js.gz +0 -0
  170. package/payload/server/public/assets/operator-BkfNpBs7.js.br +0 -0
  171. package/payload/server/public/assets/operator-BkfNpBs7.js.gz +0 -0
  172. package/payload/server/public/assets/page-BoYc9c4a.js.br +0 -0
  173. package/payload/server/public/assets/page-BoYc9c4a.js.gz +0 -0
  174. package/payload/server/public/assets/page-D5n8ShE7.js.br +0 -0
  175. package/payload/server/public/assets/page-D5n8ShE7.js.gz +0 -0
  176. package/payload/server/public/assets/public-CX5XSrxD.js.br +0 -0
  177. package/payload/server/public/assets/public-CX5XSrxD.js.gz +0 -0
  178. package/payload/server/public/assets/rotate-ccw-dh_OhL23.js.br +0 -0
  179. package/payload/server/public/assets/rotate-ccw-dh_OhL23.js.gz +0 -0
  180. package/payload/server/public/assets/routines-bb7dxcrr.js.br +0 -0
  181. package/payload/server/public/assets/routines-bb7dxcrr.js.gz +0 -0
  182. package/payload/server/public/assets/skills-TeMwxXmJ.js.br +0 -0
  183. package/payload/server/public/assets/skills-TeMwxXmJ.js.gz +0 -0
  184. package/payload/server/public/assets/tasks-BqBBJlkg.js.br +0 -0
  185. package/payload/server/public/assets/tasks-BqBBJlkg.js.gz +0 -0
  186. package/payload/server/public/assets/time-entry-format-Cy_T-wiD.js.br +0 -3
  187. package/payload/server/public/assets/time-entry-format-Cy_T-wiD.js.gz +0 -0
  188. package/payload/server/public/assets/triangle-alert-D-bSbPnX.js.br +0 -1
  189. package/payload/server/public/assets/triangle-alert-D-bSbPnX.js.gz +0 -0
  190. package/payload/server/public/assets/useCopyFeedback-L7L55nFl.js.br +0 -0
  191. package/payload/server/public/assets/useCopyFeedback-L7L55nFl.js.gz +0 -0
  192. package/payload/server/public/assets/useSubAccountSwitcher-BYl2c7xA.css.br +0 -0
  193. package/payload/server/public/assets/useSubAccountSwitcher-BYl2c7xA.css.gz +0 -0
  194. package/payload/server/public/assets/useVoiceRecorder-MuZ7lpet.js.br +0 -0
  195. package/payload/server/public/assets/useVoiceRecorder-MuZ7lpet.js.gz +0 -0
  196. package/payload/server/public/assets/wrench-DUG1SZQB.js.br +0 -0
  197. package/payload/server/public/assets/wrench-DUG1SZQB.js.gz +0 -0
  198. /package/payload/server/public/assets/{useSubAccountSwitcher-DH0P6QMV.js → useSubAccountSwitcher-CRWoQXuU.js} +0 -0
  199. /package/payload/server/public/assets/{useSubAccountSwitcher-DH0P6QMV.js.br → useSubAccountSwitcher-CRWoQXuU.js.br} +0 -0
  200. /package/payload/server/public/assets/{useSubAccountSwitcher-DH0P6QMV.js.gz → useSubAccountSwitcher-CRWoQXuU.js.gz} +0 -0
@@ -1,2 +1,2 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/pdf-render-C257cidb.js","assets/preload-helper-BQrMkyGX.js"])))=>i.map(i=>d[i]);
2
- import{o as e}from"./chunk-CltuBf4Z.js";import{B as t,K as n,P as r,g as i,k as a,r as o}from"./useSubAccountSwitcher-DH0P6QMV.js";import{n as s,t as c}from"./maximize-2-Xdj804U1.js";import{n as l,t as u}from"./time-entry-format-Cy_T-wiD.js";import{t as d}from"./preload-helper-BQrMkyGX.js";var f=`image/jpeg,image/png,image/gif,image/webp,application/pdf,text/plain,text/markdown,text/csv,text/html,text/calendar,application/zip,application/x-zip-compressed,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.oasis.opendocument.text,text/rtf,application/rtf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel,application/vnd.oasis.opendocument.spreadsheet,application/vnd.openxmlformats-officedocument.presentationml.presentation,application/vnd.ms-powerpoint,application/vnd.oasis.opendocument.presentation,audio/ogg,audio/opus,audio/mp4,audio/x-m4a,audio/mpeg,audio/webm,audio/wav,video/mp4,.docx,.odt,.rtf,.xlsx,.xls,.ods,.pptx,.ppt,.odp,.opus,.ogg,.m4a,.mp4,.mp3,.wav,.webm`,p=new Set(f.split(`,`).filter(e=>!e.startsWith(`.`))),m=50*1024*1024;function h(e){switch(e){case`expanded`:return!0;case`collapsed`:return!1;default:return}}var g=r(`check-check`,[[`path`,{d:`M18 6 7 17l-5-5`,key:`116fxf`}],[`path`,{d:`m22 10-7.5 7.5L13 16`,key:`ke71qq`}]]),_=r(`file-code`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 12.5 8 15l2 2.5`,key:`1tg20x`}],[`path`,{d:`m14 12.5 2 2.5-2 2.5`,key:`yinavb`}]]),v=r(`mic`,[[`path`,{d:`M12 19v3`,key:`npa21l`}],[`path`,{d:`M19 10v2a7 7 0 0 1-14 0v-2`,key:`1vc78b`}],[`rect`,{x:`9`,y:`2`,width:`6`,height:`13`,rx:`3`,key:`s6n7sd`}]]),y=r(`paperclip`,[[`path`,{d:`m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551`,key:`1miecu`}]]),b=r(`pause`,[[`rect`,{x:`14`,y:`3`,width:`5`,height:`18`,rx:`1`,key:`kaeet6`}],[`rect`,{x:`5`,y:`3`,width:`5`,height:`18`,rx:`1`,key:`1wsw3u`}]]),x=r(`reply`,[[`path`,{d:`M20 18v-2a4 4 0 0 0-4-4H4`,key:`5vmcpk`}],[`path`,{d:`m9 17-5-5 5-5`,key:`nvlc11`}]]),S=e(n(),1),C=t();function w({children:e,tail:t=null,repinSignals:n}){let r=(0,S.useRef)(null),i=(0,S.useRef)(null),a=(0,S.useRef)(!0),[o,s]=(0,S.useState)(!0),c=(0,S.useRef)(0),l=(0,S.useRef)(0),u=()=>{let e=r.current;if(!e)return;let t=e.clientHeight,n=e.scrollHeight,i=t!==c.current||n!==l.current;if(c.current=t,l.current=n,i){a.current&&(e.scrollTop=e.scrollHeight);return}let o=n-e.scrollTop-t<=32;a.current=o,s(e=>e===o?e:o)},d=()=>{let e=r.current;e&&(e.scrollTop=e.scrollHeight,l.current=e.scrollHeight,c.current=e.clientHeight,a.current=!0,s(!0))},f=t!=null;return(0,S.useLayoutEffect)(()=>{let e=r.current;e&&a.current&&(e.scrollTop=e.scrollHeight),e&&(l.current=e.scrollHeight,c.current=e.clientHeight)},[...n,f]),(0,S.useLayoutEffect)(()=>{if(typeof ResizeObserver>`u`)return;let e=new ResizeObserver(()=>u());return r.current&&e.observe(r.current),i.current&&e.observe(i.current),()=>e.disconnect()},[]),(0,C.jsxs)(`div`,{className:`wa-reader`,children:[(0,C.jsx)(`div`,{className:`wa-reader-thread`,ref:r,onScroll:u,children:(0,C.jsxs)(`div`,{className:`wa-thread-scroll`,ref:i,children:[e,t]})}),!o&&(0,C.jsx)(`button`,{type:`button`,className:`wa-jump`,onClick:d,"aria-label":`Jump to latest message`,title:`Jump to latest message`,children:`↓`})]})}var T={auth_expired:`Your session has expired. Please sign in again.`,claude_down:`Claude is currently experiencing an outage. Please try again in a few minutes.`,claude_overloaded:`Claude is overloaded right now. Please try again shortly.`,model_unavailable:`The selected model is currently unavailable. Switch to a different model from the model picker to continue.`,agent_error:`Something went wrong. Please try again.`},E={auth_expired:`I'm not available right now. Please try again later.`,claude_down:`I'm not available right now. Please try again later.`,claude_overloaded:`I'm not available right now. Please try again shortly.`,model_unavailable:`I'm not available right now. Please try again later.`,agent_error:`I'm not available right now. Please try again later.`};function D(e,t=`admin`){return t===`public`?E[e]:T[e]}function O(e){return e===`whatsapp`?` · via WhatsApp`:e===`webchat`?` · via web`:``}var k=56,A=5;function j(e,t){let n=Math.max(1,Math.floor(e.length/t)),r=[],i=0;for(let a=0;a<t;a++){let t=a*n,o=0,s=0;for(let r=t;r<t+n&&r<e.length;r++)o+=e[r]*e[r],s++;let c=s>0?Math.sqrt(o/s):0;r.push(c),c>i&&(i=c)}return i>0?r.map(e=>e/i):r}function M({src:e,filename:t,onDecodeFail:n,onMediaError:r}){let i=(0,S.useRef)(null),a=(0,S.useRef)(null),o=(0,S.useRef)(!1),[s,c]=(0,S.useState)([]),[d,f]=(0,S.useState)(void 0),[p,m]=(0,S.useState)(!1),[h,g]=(0,S.useState)(0),[_,v]=(0,S.useState)(0);(0,S.useEffect)(()=>{let t=!1,r=null,i=window.AudioContext??window.webkitAudioContext,a=()=>{t||o.current||(o.current=!0,n())};if(!i){a();return}let s=new i;return(async()=>{try{let n=await fetch(e);if(!n.ok)throw Error(`audio fetch ${n.status}`);let i=await n.blob();if(t)return;r=URL.createObjectURL(i),f(r);let a=await s.decodeAudioData(await i.arrayBuffer());if(t)return;c(j(a.getChannelData(0),k)),Number.isFinite(a.duration)&&a.duration>0&&v(a.duration)}catch{a()}finally{try{s.close()}catch{}}})(),()=>{t=!0,r&&URL.revokeObjectURL(r)}},[e]);let y=()=>{let e=i.current;e&&(p?e.pause():Promise.resolve(e.play()).catch(()=>{}))},x=e=>{let t=i.current;if(!t||!(_>0))return;let n=Math.min(_,Math.max(0,e));t.currentTime=n,g(n)},w=e=>{let t=a.current;if(!t||!(_>0))return;let n=t.getBoundingClientRect();x(Math.min(1,Math.max(0,(e-n.left)/n.width))*_)},T=e=>{w(e.clientX);let t=e=>w(e.clientX),n=()=>{window.removeEventListener(`mousemove`,t),window.removeEventListener(`mouseup`,n)};window.addEventListener(`mousemove`,t),window.addEventListener(`mouseup`,n)},E=e=>{if(!(_>0))return;let t=i.current?.currentTime??0;switch(e.key){case`ArrowRight`:case`ArrowUp`:x(t+A),e.preventDefault();break;case`ArrowLeft`:case`ArrowDown`:x(t-A),e.preventDefault();break;case`Home`:x(0),e.preventDefault();break;case`End`:x(_),e.preventDefault();break;default:break}},D=_>0?Math.min(1,h/_):0,O=Math.round(D*k),M=u(h>0?h:_);return(0,C.jsxs)(`div`,{className:`voice-note`,children:[(0,C.jsx)(`button`,{type:`button`,className:`voice-note-play`,"aria-label":`${p?`Pause`:`Play`} ${t}`,onClick:y,children:p?(0,C.jsx)(b,{size:16,"aria-hidden":!0}):(0,C.jsx)(l,{size:16,"aria-hidden":!0})}),(0,C.jsx)(`div`,{ref:a,className:`voice-note-bars`,role:`slider`,tabIndex:0,"aria-label":`Seek ${t}`,"aria-valuemin":0,"aria-valuemax":Math.round(_),"aria-valuenow":Math.round(h),onMouseDown:T,onKeyDown:E,children:(s.length?s:Array.from({length:k},()=>0)).map((e,t)=>(0,C.jsx)(`span`,{className:`voice-note-bar${t<O?` is-played`:``}`,style:{height:`${Math.max(10,Math.round(e*100))}%`}},t))}),(0,C.jsx)(`span`,{className:`voice-note-time`,children:M}),(0,C.jsx)(`audio`,{ref:i,className:`voice-note-audio`,preload:`metadata`,src:d,"aria-label":t,onPlay:()=>m(!0),onPause:()=>m(!1),onEnded:()=>m(!1),onError:()=>r?.(),onLoadedMetadata:e=>{let t=e.currentTarget.duration;Number.isFinite(t)&&t>0&&v(t)},onTimeUpdate:e=>g(e.currentTarget.currentTime)})]})}var N=/\.(png|jpe?g|gif|webp|svg|bmp)$/i,P=/\.pdf$/i;function ee(e,t){return(t?t.startsWith(`image/`):N.test(e))?`image`:t&&t.startsWith(`audio/`)?`audio`:(t?t===`application/pdf`:P.test(e))?`pdf`:`file`}function F(e,t,n,r){let i=encodeURIComponent(e.path),a=encodeURIComponent(n),o=r?`&disposition=${r}`:``;return e.root===`scratchpad`?`/api/admin/files/download?path=${i}&root=scratchpad&sessionId=${encodeURIComponent(t)}&session_key=${a}${o}`:`/api/admin/files/download?path=${i}&root=data&session_key=${a}${o}`}function I(e,t,n,r){return t===`public`?`/api/public-reader/attachment/${e}?sessionId=${encodeURIComponent(n)}`:`/api/admin/attachment/${e}?session_key=${encodeURIComponent(r)}`}function te(e,t,n){return`/api/admin/session-upload?session_key=${encodeURIComponent(n)}&session_id=${encodeURIComponent(e)}&file=${encodeURIComponent(t)}`}function L(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${t<10?t.toFixed(1):Math.round(t)} KB`;let n=t/1024;return`${n<10?n.toFixed(1):Math.round(n)} MB`}function R({href:e,filename:t,label:n}){return(0,C.jsxs)(`a`,{className:`chat-attachment-chip`,href:e,download:t,children:[(0,C.jsx)(y,{size:14,"aria-hidden":!0}),n]})}function z({href:e,filename:t,className:n,size:r=14,onClick:i}){return(0,C.jsx)(`a`,{className:n,href:e,download:t,"aria-label":`Download ${t}`,onClick:i,children:(0,C.jsx)(a,{size:r,"aria-hidden":!0})})}function ne({src:e,filename:t,sizeBytes:n,expandable:r,onFail:i}){let[a,o]=(0,S.useState)(!1),[s,c]=(0,S.useState)(!1),l=n==null?t:`${t} · ${L(n)}`;return s?(0,C.jsx)(R,{href:e,filename:t,label:l}):(0,C.jsxs)(C.Fragment,{children:[(0,C.jsxs)(`span`,{className:`chat-attachment-image-wrap`,children:[(0,C.jsx)(`img`,{className:`chat-attachment-image`,src:e,alt:t,onClick:r?()=>o(!0):void 0,onError:()=>{c(!0),i?.(`fetch`)}}),(0,C.jsx)(z,{href:e,filename:t,className:`chat-attachment-download`})]}),r&&a&&(0,C.jsx)(`div`,{className:`chat-attachment-overlay`,role:`dialog`,"aria-label":t,onClick:()=>o(!1),children:(0,C.jsx)(`img`,{className:`chat-attachment-overlay-image`,src:e,alt:t})})]})}var re=280,ie=360,ae=16;function B({src:e,filename:t,sizeBytes:n,onFail:r}){let[i,a]=(0,S.useState)(!1),[o,s]=(0,S.useState)(!1),l=(0,S.useRef)(null),u=n==null?t:`${t} · ${L(n)}`;return(0,S.useEffect)(()=>{let t=!1,n=null;return(async()=>{try{let{loadPdf:r,renderPageToFit:i}=await d(async()=>{let{loadPdf:e,renderPageToFit:t}=await import(`./pdf-render-C257cidb.js`);return{loadPdf:e,renderPageToFit:t}},__vite__mapDeps([0,1])),a=await r(e);n=a;let o=l.current;if(t||!o)return;await i(a,1,o,re,ie)}catch{t||(s(!0),r?.(`render`))}})(),()=>{t=!0;try{n?.destroy()}catch{}}},[e]),o?(0,C.jsx)(R,{href:e,filename:t,label:u}):(0,C.jsxs)(C.Fragment,{children:[(0,C.jsxs)(`div`,{className:`chat-attachment-pdf`,children:[(0,C.jsx)(`canvas`,{ref:l,className:`chat-attachment-pdf-canvas`,"aria-label":t}),(0,C.jsx)(z,{href:e,filename:t,className:`chat-attachment-download`}),(0,C.jsx)(`button`,{type:`button`,className:`chat-attachment-pdf-expand`,"aria-label":`Expand ${t}`,onClick:()=>a(!0),children:(0,C.jsx)(c,{size:14,"aria-hidden":!0})})]}),i&&(0,C.jsx)(oe,{src:e,filename:t,label:u,onClose:()=>a(!1),onFail:r})]})}function oe({src:e,filename:t,label:n,onClose:r,onFail:a}){let o=(0,S.useRef)(null),s=(0,S.useRef)(null),[c,l]=(0,S.useState)(null),[u,f]=(0,S.useState)(!1);return(0,S.useEffect)(()=>{let t=!1;return(async()=>{try{let{loadPdf:n}=await d(async()=>{let{loadPdf:e}=await import(`./pdf-render-C257cidb.js`);return{loadPdf:e}},__vite__mapDeps([0,1])),r=await n(e);if(t){try{r.destroy()}catch{}return}s.current=r,l(r.numPages)}catch{t||(f(!0),a?.(`render`))}})(),()=>{t=!0;try{s.current?.destroy()}catch{}}},[e]),(0,S.useEffect)(()=>{if(c==null)return;let e=o.current,t=s.current;if(!e||!t)return;let n=!1;return(async()=>{try{let{renderPageToWidth:r}=await d(async()=>{let{renderPageToWidth:e}=await import(`./pdf-render-C257cidb.js`);return{renderPageToWidth:e}},__vite__mapDeps([0,1])),i=Array.from(e.querySelectorAll(`canvas.chat-attachment-overlay-page`)),a=Math.max(e.clientWidth-ae*2,1);for(let e=0;e<i.length;e++){if(n)return;await r(t,e+1,i[e],a)}}catch{n||(f(!0),a?.(`render`))}})(),()=>{n=!0}},[c]),(0,C.jsxs)(`div`,{className:`chat-attachment-overlay`,role:`dialog`,"aria-label":t,onClick:r,children:[(0,C.jsx)(`div`,{ref:o,className:`chat-attachment-overlay-pdf`,onClick:e=>e.stopPropagation(),children:u?(0,C.jsx)(R,{href:e,filename:t,label:n}):Array.from({length:c??0},(e,n)=>(0,C.jsx)(`canvas`,{className:`chat-attachment-overlay-page`,"aria-label":`${t} page ${n+1}`},n))}),(0,C.jsx)(z,{href:e,filename:t,className:`chat-attachment-overlay-download`,size:20,onClick:e=>e.stopPropagation()}),(0,C.jsx)(`button`,{type:`button`,className:`chat-attachment-overlay-close`,"aria-label":`Close`,onClick:r,children:(0,C.jsx)(i,{size:20,"aria-hidden":!0})})]})}function se({src:e,filename:t,onFail:n}){let[r,i]=(0,S.useState)(!1);return r?(0,C.jsx)(`audio`,{className:`chat-attachment-audio`,controls:!0,preload:`metadata`,src:e,"aria-label":t,onError:()=>n?.(`fetch`)}):(0,C.jsx)(M,{src:e,filename:t,onDecodeFail:()=>{i(!0),n?.(`render`)},onMediaError:()=>{i(!0),n?.(`fetch`)}})}function V({filename:e,href:t,mimeType:n,sizeBytes:r,expandable:i,telemetry:a}){let o=ee(e,n);(0,S.useEffect)(()=>{a?.onRender?.({kind:o,mime:n,served:!!t})},[]);let s=a?.onFail?e=>a.onFail({kind:o===`pdf`?`pdf`:o===`audio`?`audio`:`image`,mime:n,reason:e}):void 0;if(o===`image`&&t)return(0,C.jsx)(ne,{src:t,filename:e,sizeBytes:r,expandable:i,onFail:s});if(o===`audio`&&t)return(0,C.jsx)(se,{src:t,filename:e,onFail:s});if(o===`pdf`&&t)return(0,C.jsx)(B,{src:t,filename:e,sizeBytes:r,onFail:s});let c=r==null?e:`${e} · ${L(r)}`;return t?(0,C.jsx)(R,{href:t,filename:e,label:c}):(0,C.jsxs)(`p`,{className:`chat-doc`,children:[(0,C.jsx)(y,{size:14,"aria-hidden":!0,style:{verticalAlign:`text-bottom`}}),` `,c]})}function ce(e,t,n,r=`/api/whatsapp-reader/stream`,i=e,a=!0){let[o,s]=(0,S.useState)([]),[c,l]=(0,S.useState)(`open`),[u,d]=(0,S.useState)(null),f=(0,S.useRef)([]);return(0,S.useEffect)(()=>{f.current=o},[o]),(0,S.useEffect)(()=>{s([]),f.current=[],d(null)},[i,t,n,r]),(0,S.useEffect)(()=>{if(l(`open`),!a)return;let i=f.current.slice(),o=i.map(H),c=0,u=i.length>0,p=`${r}?sessionId=${encodeURIComponent(e)}&projectDir=${encodeURIComponent(t)}&session_key=${encodeURIComponent(n)}`,m=new EventSource(p);return m.onopen=()=>{console.info(`[admin-ui] wa-stream onopen sessionId=${e}`),l(`open`)},m.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{return}if(u){if(c<o.length&&H(t)===o[c]){c+=1;return}u=!1}s(e=>[...e,t])},m.addEventListener(`activity`,e=>{try{d(JSON.parse(e.data))}catch{}}),m.addEventListener(`activity-clear`,()=>d(null)),m.onerror=()=>{m.readyState===2&&(console.error(`[admin-ui] wa-stream onerror readyState=${m.readyState}`),l(`error`))},()=>m.close()},[e,t,n,r,i,a]),{turns:o,status:c,subagentActivity:u}}function H(e){return JSON.stringify(e)}function le(e,t,n,r=!0){let[i,a]=(0,S.useState)([]),[o,s]=(0,S.useState)(`open`);return(0,S.useEffect)(()=>{if(a([]),s(`open`),!r||!e||!t)return;let i=`/api/whatsapp-reader/store-stream?accountId=${encodeURIComponent(e)}&remoteJid=${encodeURIComponent(t)}&session_key=${encodeURIComponent(n)}`,o=new EventSource(i);return o.onopen=()=>s(`open`),o.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{return}a(e=>[...e,t])},o.addEventListener(`reaction`,e=>{let t;try{t=JSON.parse(e.data)}catch{return}a(e=>e.map(e=>e.kind===`whatsapp-persisted`&&e.msgKeyId===t.targetMsgKeyId?{...e,reactions:t.reactions}:e))}),o.onerror=()=>{o.readyState===2&&s(`error`)},()=>o.close()},[e,t,n,r]),{turns:i,status:o}}var U=e=>{if(!e)return 1/0;let t=new Date(e).getTime();return Number.isNaN(t)?1/0:t};function ue(e,t){let n=[],r=0;return e.forEach((e,t)=>n.push({sort:U(e.ts),sub:1,ins:r++,item:{kind:`turn`,turn:e,idx:t}})),t.forEach(e=>n.push({sort:U(e.ts),sub:0,ins:r++,item:{kind:`directive`,entry:e}})),n.sort((e,t)=>e.sort===t.sort?e.sort===1/0?e.ins-t.ins:e.sub-t.sub||e.ins-t.ins:e.sort<t.sort?-1:1).map(e=>e.item)}function de(e,t,n=!0){let[r,i]=(0,S.useState)([]);return(0,S.useEffect)(()=>{if(!n||typeof fetch!=`function`)return;let r=!0,a=`/api/whatsapp-reader/directives?sessionId=${encodeURIComponent(e)}&session_key=${encodeURIComponent(t)}`;return fetch(a).then(e=>e.ok?e.json():{entries:[]}).then(e=>{r&&i(Array.isArray(e.entries)?e.entries:[])}).catch(()=>{r&&i([])}),()=>{r=!1}},[e,t,n]),r}var fe=new Set([`operator-inbound`,`operator-typed`,`agent-reply`,`agent-reply-document`,`agent-file`,`agent-error`,`agent-webchat-final`,`whatsapp-persisted`]);function W(e){if(!e)return``;let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})}function G(e){let t=e.lastIndexOf(`/`);return t===-1?e:e.slice(t+1)}var pe=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],me=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`];function K(e){let t=String(e.getMonth()+1).padStart(2,`0`),n=String(e.getDate()).padStart(2,`0`);return`${e.getFullYear()}-${t}-${n}`}function q(e){if(!e)return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:K(t)}function he(e,t=new Date){if(!e)return``;let n=new Date(e);if(Number.isNaN(n.getTime()))return``;let r=K(n);if(r===K(t))return`Today`;let i=new Date(t);return i.setDate(i.getDate()-1),r===K(i)?`Yesterday`:`${pe[n.getDay()]} ${n.getDate()} ${me[n.getMonth()]} ${n.getFullYear()}`}function J(e){return e.kind===`turn`?e.turn.ts:e.entry.ts}function Y({ts:e}){return(0,C.jsx)(`div`,{className:`day-divider`,role:`separator`,children:(0,C.jsx)(`span`,{className:`day-divider-label`,children:he(e)})})}function X(){return(0,C.jsx)(`div`,{className:`session-divider`,role:`separator`,children:(0,C.jsx)(`span`,{className:`session-divider-label`,children:`Conversation continued`})})}function Z({label:e,ts:t}){return(0,C.jsxs)(`div`,{className:`wa-turn-head`,children:[(0,C.jsx)(`span`,{className:`wa-who`,children:e}),(0,C.jsx)(`time`,{className:`wa-time`,children:W(t)})]})}function ge({turn:e}){let[t,n]=(0,S.useState)(!1),r=e.kind===`tool-result`,i=r?`wa-turn wa-turn-result${e.isError?` is-error`:``}`:`wa-turn wa-turn-tool`,a=r?e.isError?`result (error)`:`result`:`↳ ${e.name}`,o=r?e.text:JSON.stringify(e.input,null,2);return(0,C.jsxs)(`div`,{className:i,children:[(0,C.jsxs)(`button`,{type:`button`,className:`wa-tool-toggle`,"aria-expanded":t,onClick:()=>n(e=>!e),children:[(0,C.jsx)(`span`,{className:`wa-chevron`,children:t?`▾`:`▸`}),(0,C.jsx)(`span`,{className:`wa-who`,children:a}),(0,C.jsx)(`time`,{className:`wa-time`,children:W(e.ts)})]}),t&&(0,C.jsx)(`pre`,{className:`wa-code`,children:o})]})}function Q({entry:e,sessionId:t,sessionKey:n}){let[r,i]=(0,S.useState)(!1),[a,o]=(0,S.useState)(null),s=()=>{let s=!r;if(i(s),s&&a===null&&typeof fetch==`function`){let r=`/api/whatsapp-reader/directive?sessionId=${encodeURIComponent(t)}&name=${encodeURIComponent(e.name)}&session_key=${encodeURIComponent(n)}`;fetch(r).then(e=>e.ok?e.text():`(directive unavailable)`).then(o).catch(()=>o(`(directive unavailable)`))}};return(0,C.jsxs)(`div`,{className:`wa-turn wa-turn-directive`,children:[(0,C.jsxs)(`button`,{type:`button`,className:`wa-tool-toggle`,"aria-expanded":r,onClick:s,children:[(0,C.jsx)(`span`,{className:`wa-chevron`,children:r?`▾`:`▸`}),(0,C.jsxs)(`span`,{className:`wa-who`,children:[`⚙ directive injected (`,e.len,` B)`]}),(0,C.jsx)(`time`,{className:`wa-time`,children:W(e.ts)})]}),r&&(0,C.jsx)(`pre`,{className:`wa-code`,children:a??`Loading…`})]})}function _e(e){return`text`in e&&typeof e.text==`string`?e.text:``}function ve(e,t){let n=(t??``).trim();if(!n)return e;let r=e.toLowerCase(),i=n.toLowerCase(),a=[],o=0,s=0;for(;;){let t=r.indexOf(i,o);if(t===-1){a.push(e.slice(o));break}t>o&&a.push(e.slice(o,t)),a.push((0,C.jsx)(`mark`,{className:`wa-search-hit`,children:e.slice(t,t+i.length)},s++)),o=t+i.length}return a.length===1?a[0]:(0,C.jsx)(C.Fragment,{children:a})}var $={onRender:({kind:e,mime:t,served:n})=>console.info(`[operator-ui] op=reader-attachment kind=${e} mime=${t??``} served=${n}`),onFail:({kind:e,mime:t,reason:n})=>console.info(`[operator-ui] op=reader-attachment-fail kind=${e} mime=${t??``} reason=${n}`)};function ye(e,t,n){switch(e.kind){case`operator-inbound`:return(0,C.jsxs)(`div`,{className:`wa-turn wa-turn-in`,children:[(0,C.jsx)(Z,{label:`Operator${O(e.source)}`,ts:e.ts}),e.text&&(0,C.jsx)(`p`,{className:`wa-body`,children:e.text}),e.attachments&&e.attachments.length>0&&(0,C.jsx)(`div`,{className:`chat-attachment-list`,children:e.attachments.map((e,t)=>(0,C.jsx)(V,{expandable:!0,filename:e.filename,mimeType:e.mimeType,sizeBytes:e.sizeBytes,href:I(e.attachmentId,n.audience,n.sessionId,n.sessionKey),telemetry:$},t))})]},t);case`operator-typed`:return(0,C.jsxs)(`div`,{className:`wa-turn wa-turn-in wa-turn-typed`,children:[(0,C.jsx)(Z,{label:`Operator (web)`,ts:e.ts}),(0,C.jsx)(`p`,{className:`wa-body`,children:e.text})]},t);case`agent-text`:return(0,C.jsxs)(`div`,{className:`wa-turn wa-turn-think`,children:[(0,C.jsx)(Z,{label:`Agent`,ts:e.ts}),(0,C.jsx)(`p`,{className:`wa-body`,children:e.text})]},t);case`agent-reply`:return(0,C.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,C.jsx)(Z,{label:`Agent`,ts:e.ts}),(0,C.jsx)(`p`,{className:`wa-body`,children:e.text})]},t);case`agent-reply-document`:return(0,C.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,C.jsx)(Z,{label:`Agent`,ts:e.ts}),(0,C.jsxs)(`p`,{className:`wa-doc`,children:[(0,C.jsx)(y,{size:14,"aria-hidden":!0,style:{verticalAlign:`text-bottom`}}),` `,`sent document(s): `,e.files.map(G).join(`, `)]}),e.caption&&(0,C.jsx)(`p`,{className:`wa-body`,children:e.caption})]},t);case`agent-file`:return(0,C.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,C.jsx)(Z,{label:`Agent`,ts:e.ts}),e.files.map((t,r)=>{let i=G(t),a=e.downloads?.[r];return(0,C.jsx)(V,{expandable:!0,filename:i,href:a?F(a,n.sessionId,n.sessionKey,P.test(i)?`inline`:void 0):void 0,telemetry:$},r)}),e.caption&&(0,C.jsx)(`p`,{className:`wa-body`,children:e.caption})]},t);case`whatsapp-persisted`:{let r=e.origin===`operator-manual`,i=e.fromMe?r?`You`:`Sent`:e.senderName??`Contact`;return(0,C.jsxs)(`div`,{className:`wa-turn ${e.fromMe?`wa-turn-out`:`wa-turn-in`}${r?` wa-op-manual`:``}`,children:[n.onReplyTo&&e.msgKeyId&&(0,C.jsx)(`button`,{type:`button`,className:`wa-bubble-reply`,"aria-label":`Reply to this message`,onClick:()=>n.onReplyTo({msgKeyId:e.msgKeyId,body:e.text,senderName:e.senderName,fromMe:e.fromMe}),children:(0,C.jsx)(x,{size:14})}),n.showCopy&&e.text&&(0,C.jsx)(`button`,{type:`button`,className:`wa-bubble-copy`,"aria-label":`Copy this message`,onClick:()=>{let t=e.text;o(t).then(e=>e?console.info(`[operator-ui] op=wa-copy len=${t.length} ok=true`):console.warn(`[operator-ui] op=wa-copy-fail reason=clipboard-unavailable`))},children:(0,C.jsx)(s,{size:14})}),e.quoted&&(0,C.jsxs)(`div`,{className:`wa-quoted`,children:[(0,C.jsx)(`span`,{className:`wa-quoted-who`,children:e.quoted.fromMe?`You`:e.quoted.sender??`Contact`}),(0,C.jsx)(`span`,{className:`wa-quoted-body`,children:e.quoted.body||`Message`})]}),(0,C.jsx)(Z,{label:i,ts:e.ts}),e.text&&(0,C.jsx)(`p`,{className:`wa-body`,children:ve(e.text,n.highlight)}),e.attachments&&e.attachments.length>0&&(0,C.jsx)(`div`,{className:`chat-attachment-list`,children:e.attachments.map((e,t)=>(0,C.jsx)(V,{expandable:!0,filename:e.filename,mimeType:e.mimeType,sizeBytes:e.sizeBytes,href:I(e.attachmentId,n.audience,n.sessionId,n.sessionKey),telemetry:$},t))}),e.reactions&&e.reactions.length>0&&(0,C.jsx)(`div`,{className:`wa-reactions`,children:e.reactions.map((e,t)=>(0,C.jsx)(`span`,{className:`wa-reaction`,title:e.reactorName??void 0,children:e.emoji},t))}),(0,C.jsxs)(`span`,{className:`wa-bubble-meta`,children:[r&&(0,C.jsx)(`span`,{className:`wa-op-tag`,children:`You`}),(0,C.jsx)(`time`,{className:`wa-bubble-time`,children:W(e.ts)}),e.fromMe&&(0,C.jsx)(g,{size:14,className:`wa-bubble-tick`,"aria-hidden":!0})]})]},t)}case`session-continued`:return(0,C.jsx)(X,{},t);case`harness-internal`:return null;case`tool-call`:case`tool-result`:return(0,C.jsx)(ge,{turn:e},t);case`agent-error`:return(0,C.jsxs)(`div`,{className:`wa-turn wa-turn-error`,role:`alert`,children:[(0,C.jsx)(Z,{label:`Agent`,ts:e.ts}),(0,C.jsx)(`p`,{className:`wa-body wa-error-body`,children:D(e.code,`admin`)}),e.code===`agent_error`&&e.raw&&(0,C.jsx)(`pre`,{className:`wa-code`,children:e.raw})]},t)}}function be(e,t,n,r=`admin`,i,a,o){let s={sessionId:t,sessionKey:n,audience:r,highlight:i,onReplyTo:a,showCopy:o},c=[],l=null;return e.forEach((e,r)=>{let i=J(e),a=q(i);a!==null&&a!==l&&(c.push((0,C.jsx)(Y,{ts:i},`day-${r}`)),l=a),c.push(e.kind===`turn`?ye(e.turn,r,s):(0,C.jsx)(Q,{entry:e.entry,sessionId:t,sessionKey:n},r))}),c}function xe(e){return e.filter(e=>e.kind===`turn`&&fe.has(e.turn.kind)&&!(e.turn.kind===`operator-inbound`&&e.turn.scheduled))}var Se=(0,S.memo)(function({sessionId:e,projectDir:t,sessionKey:n,renderItems:r=be,clean:i,onToggleClean:a,forceDeliveredOnly:o=!1,streamEndpoint:s=`/api/whatsapp-reader/stream`,suppressDirectives:c=!1,tail:l=null,resetKey:u,onTurnsChange:d,onActivityChange:f,store:p,search:m,onReplyTo:h}){let g=!!p,_=ce(e,t,n,s,u,!g),v=le(p?.accountId??``,p?.remoteJid??``,n,g),{turns:y,status:b}=g?{turns:v.turns,status:v.status}:{turns:_.turns,status:_.status},x=g?null:_.subagentActivity;(0,S.useEffect)(()=>{f?.(x)},[x,f]),(0,S.useEffect)(()=>{d?.(y.length)},[y.length,d]);let T=ue(y,de(e,n,!c)),E=a==null?!1:!!i,D=o||E?xe(T):T,O=(m??``).trim().toLowerCase(),k=O.length>0,A=k?D.filter(e=>e.kind===`turn`&&_e(e.turn).toLowerCase().includes(O)):D,j=k?D.filter(e=>e.kind===`turn`).length:0;return(0,S.useEffect)(()=>{k&&console.info(`[operator-ui] op=wa-search q=${O} matches=${A.length} ofTurns=${j}`)},[O,k,A.length,j]),(0,C.jsxs)(w,{repinSignals:[y,E,k],tail:l,children:[b===`error`&&(0,C.jsx)(`div`,{className:`wa-reader-error`,children:`Stream disconnected.`}),!k&&y.length===0&&b===`open`&&(0,C.jsx)(`div`,{className:`wa-reader-placeholder`,children:`No messages in this conversation yet.`}),k&&A.length===0&&(0,C.jsxs)(`div`,{className:`wa-reader-placeholder`,children:[`No matches for "`,m,`".`]}),g?be(A,e,n,`admin`,m,h,!0):r(D,e,n)]})});function Ce(e,t){let n=e.split(`;`)[0].trim().toLowerCase();return t.has(n)}var we=[`audio/ogg;codecs=opus`,`audio/webm;codecs=opus`,`audio/webm`,`audio/mp4`];function Te(){for(let e of we)if(MediaRecorder.isTypeSupported(e))return e;return``}function Ee(e){return e.split(`;`)[0]}async function De(){return typeof navigator>`u`||!navigator.mediaDevices?.enumerateDevices?[]:(await navigator.mediaDevices.enumerateDevices()).filter(e=>e.kind===`audioinput`)}function Oe(e){let[t,n]=(0,S.useState)(`idle`),[r,i]=(0,S.useState)(0),[a,o]=(0,S.useState)(null),[s,c]=(0,S.useState)(null),l=(0,S.useRef)(null),u=(0,S.useRef)(null),d=(0,S.useRef)([]),f=(0,S.useRef)(``),p=(0,S.useRef)(null),m=(0,S.useRef)(0),h=(0,S.useRef)(0),g=(0,S.useRef)(null),_=(0,S.useRef)(null),v=(0,S.useRef)(0),y=(0,S.useCallback)(()=>{if(p.current&&=(clearInterval(p.current),null),v.current&&=(cancelAnimationFrame(v.current),0),l.current&&l.current.state!==`inactive`)try{l.current.stop()}catch{}l.current=null,d.current=[],u.current&&=(u.current.getTracks().forEach(e=>e.stop()),null),g.current&&(g.current.close().catch(()=>{}),g.current=null,_.current=null),h.current=0,m.current=0},[]);(0,S.useEffect)(()=>y,[y]);let b=(0,S.useCallback)(()=>{m.current=Date.now(),p.current=setInterval(()=>{let e=Date.now()-m.current,t=h.current+e;i(Math.floor(t/1e3))},200)},[]),x=(0,S.useCallback)(()=>{p.current&&=(clearInterval(p.current),null);let e=Date.now()-m.current;h.current+=e},[]),C=(0,S.useCallback)(()=>{let e=_.current;if(!e)return;let t=new Uint8Array(e.frequencyBinCount),n=()=>{e.getByteTimeDomainData(t),o(new Uint8Array(t)),v.current=requestAnimationFrame(n)};n()},[]),w=(0,S.useCallback)(()=>{v.current&&=(cancelAnimationFrame(v.current),0)},[]),T=e?.onResult,E=(0,S.useCallback)(async e=>{if(!(t!==`idle`&&t!==`error`)){if(c(null),typeof window<`u`&&!window.isSecureContext){n(`error`),c(`Voice recording requires a secure connection (HTTPS). Use your tunnel URL for voice notes.`);return}if(typeof navigator>`u`||!navigator.mediaDevices?.getUserMedia){n(`error`),c(`Voice recording is not supported in this browser.`);return}if(typeof MediaRecorder>`u`){n(`error`),c(`Voice recording is not supported in this browser.`);return}try{let t=e?{audio:{deviceId:{exact:e}}}:{audio:!0},r;try{r=await navigator.mediaDevices.getUserMedia(t)}catch(t){let n=t?.name;if(e&&(n===`OverconstrainedError`||n===`NotFoundError`))r=await navigator.mediaDevices.getUserMedia({audio:!0});else throw t}u.current=r;let a=new AudioContext;g.current=a;let s=a.createMediaStreamSource(r),c=a.createAnalyser();c.fftSize=256,s.connect(c),_.current=c;let p=Te();f.current=p;let m=new MediaRecorder(r,p?{mimeType:p}:void 0);l.current=m,d.current=[],m.ondataavailable=e=>{e.data.size>0&&d.current.push(e.data)},r.getAudioTracks()[0]?.addEventListener(`ended`,()=>{y(),n(`idle`),i(0),o(null)}),m.start(1e3),n(`recording`),i(0),b(),C(),T?.({ok:!0})}catch(e){y(),n(`error`),e instanceof DOMException?(T?.({ok:!1,name:e.name,message:e.message}),e.name===`NotAllowedError`?c(`Microphone access was denied. Check your browser permissions to enable voice recording.`):e.name===`NotFoundError`?c(`No microphone found. Connect a microphone to use voice recording.`):e.name===`NotReadableError`?c(`The microphone could not be started even though access was granted. The browser reported: ${e.message} (${e.name}).`):c(`Microphone error (${e.name}): ${e.message}`)):(T?.({ok:!1}),c(`Could not start recording.`))}}},[t,y,b,C,T]),D=(0,S.useCallback)(()=>{let e=l.current;e&&(t===`recording`&&e.state===`recording`?(e.pause(),x(),w(),n(`paused`)):t===`paused`&&e.state===`paused`&&(e.resume(),b(),C(),n(`recording`)))},[t,x,b,C,w]),O=(0,S.useCallback)(()=>{t!==`recording`&&t!==`paused`||(y(),n(`idle`),i(0),o(null))},[t,y]),k=(0,S.useCallback)(async()=>{if(t!==`recording`&&t!==`paused`)return null;let e=l.current;if(!e)return null;let r=t===`recording`?Date.now()-m.current:0;return h.current+r<1e3?(O(),null):(n(`sending`),x(),w(),new Promise(t=>{e.onstop=()=>{let r=f.current||e.mimeType||`audio/webm`,a=new Blob(d.current,{type:Ee(r)});y(),n(`idle`),i(0),o(null),t(a.size>0?a:null)},e.stop()}))},[t,O,x,w,y]);return(0,S.useEffect)(()=>{if(t!==`error`)return;let e=setTimeout(()=>{n(`idle`),c(null)},8e3);return()=>clearTimeout(e)},[t]),{state:t,elapsedSeconds:r,waveform:a,errorMessage:s,start:E,togglePause:D,discard:O,send:k}}export{_ as C,h as D,p as E,v as S,m as T,F as _,Q as a,b,G as c,J as d,V as f,I as g,P as h,Y as i,q as l,N as m,Oe as n,X as o,B as p,Ce as r,Se as s,De as t,W as u,te as v,f as w,y as x,D as y};
2
+ import{o as e}from"./chunk-CltuBf4Z.js";import{B as t,K as n,P as r,g as i,k as a,r as o}from"./useSubAccountSwitcher-CRWoQXuU.js";import{n as s,t as c}from"./maximize-2-rkkMyAhf.js";import{n as l,t as u}from"./time-entry-format-4zgmuQI0.js";import{t as d}from"./preload-helper-BQrMkyGX.js";var f=`image/jpeg,image/png,image/gif,image/webp,application/pdf,text/plain,text/markdown,text/csv,text/html,text/calendar,application/zip,application/x-zip-compressed,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.oasis.opendocument.text,text/rtf,application/rtf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel,application/vnd.oasis.opendocument.spreadsheet,application/vnd.openxmlformats-officedocument.presentationml.presentation,application/vnd.ms-powerpoint,application/vnd.oasis.opendocument.presentation,audio/ogg,audio/opus,audio/mp4,audio/x-m4a,audio/mpeg,audio/webm,audio/wav,video/mp4,.docx,.odt,.rtf,.xlsx,.xls,.ods,.pptx,.ppt,.odp,.opus,.ogg,.m4a,.mp4,.mp3,.wav,.webm`,p=new Set(f.split(`,`).filter(e=>!e.startsWith(`.`))),m=50*1024*1024;function h(e){switch(e){case`expanded`:return!0;case`collapsed`:return!1;default:return}}var g=r(`check-check`,[[`path`,{d:`M18 6 7 17l-5-5`,key:`116fxf`}],[`path`,{d:`m22 10-7.5 7.5L13 16`,key:`ke71qq`}]]),_=r(`file-code`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 12.5 8 15l2 2.5`,key:`1tg20x`}],[`path`,{d:`m14 12.5 2 2.5-2 2.5`,key:`yinavb`}]]),v=r(`mic`,[[`path`,{d:`M12 19v3`,key:`npa21l`}],[`path`,{d:`M19 10v2a7 7 0 0 1-14 0v-2`,key:`1vc78b`}],[`rect`,{x:`9`,y:`2`,width:`6`,height:`13`,rx:`3`,key:`s6n7sd`}]]),y=r(`paperclip`,[[`path`,{d:`m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551`,key:`1miecu`}]]),b=r(`pause`,[[`rect`,{x:`14`,y:`3`,width:`5`,height:`18`,rx:`1`,key:`kaeet6`}],[`rect`,{x:`5`,y:`3`,width:`5`,height:`18`,rx:`1`,key:`1wsw3u`}]]),x=r(`reply`,[[`path`,{d:`M20 18v-2a4 4 0 0 0-4-4H4`,key:`5vmcpk`}],[`path`,{d:`m9 17-5-5 5-5`,key:`nvlc11`}]]),S=e(n(),1),C=t();function w({children:e,tail:t=null,repinSignals:n}){let r=(0,S.useRef)(null),i=(0,S.useRef)(null),a=(0,S.useRef)(!0),[o,s]=(0,S.useState)(!0),c=(0,S.useRef)(0),l=(0,S.useRef)(0),u=()=>{let e=r.current;if(!e)return;let t=e.clientHeight,n=e.scrollHeight,i=t!==c.current||n!==l.current;if(c.current=t,l.current=n,i){a.current&&(e.scrollTop=e.scrollHeight);return}let o=n-e.scrollTop-t<=32;a.current=o,s(e=>e===o?e:o)},d=()=>{let e=r.current;e&&(e.scrollTop=e.scrollHeight,l.current=e.scrollHeight,c.current=e.clientHeight,a.current=!0,s(!0))},f=t!=null;return(0,S.useLayoutEffect)(()=>{let e=r.current;e&&a.current&&(e.scrollTop=e.scrollHeight),e&&(l.current=e.scrollHeight,c.current=e.clientHeight)},[...n,f]),(0,S.useLayoutEffect)(()=>{if(typeof ResizeObserver>`u`)return;let e=new ResizeObserver(()=>u());return r.current&&e.observe(r.current),i.current&&e.observe(i.current),()=>e.disconnect()},[]),(0,C.jsxs)(`div`,{className:`wa-reader`,children:[(0,C.jsx)(`div`,{className:`wa-reader-thread`,ref:r,onScroll:u,children:(0,C.jsxs)(`div`,{className:`wa-thread-scroll`,ref:i,children:[e,t]})}),!o&&(0,C.jsx)(`button`,{type:`button`,className:`wa-jump`,onClick:d,"aria-label":`Jump to latest message`,title:`Jump to latest message`,children:`↓`})]})}var T={auth_expired:`Your session has expired. Please sign in again.`,claude_down:`Claude is currently experiencing an outage. Please try again in a few minutes.`,claude_overloaded:`Claude is overloaded right now. Please try again shortly.`,model_unavailable:`The selected model is currently unavailable. Switch to a different model from the model picker to continue.`,agent_error:`Something went wrong. Please try again.`},E={auth_expired:`I'm not available right now. Please try again later.`,claude_down:`I'm not available right now. Please try again later.`,claude_overloaded:`I'm not available right now. Please try again shortly.`,model_unavailable:`I'm not available right now. Please try again later.`,agent_error:`I'm not available right now. Please try again later.`};function D(e,t=`admin`){return t===`public`?E[e]:T[e]}function O(e){return e===`whatsapp`?` · via WhatsApp`:e===`webchat`?` · via web`:``}var k=56,A=5;function j(e,t){let n=Math.max(1,Math.floor(e.length/t)),r=[],i=0;for(let a=0;a<t;a++){let t=a*n,o=0,s=0;for(let r=t;r<t+n&&r<e.length;r++)o+=e[r]*e[r],s++;let c=s>0?Math.sqrt(o/s):0;r.push(c),c>i&&(i=c)}return i>0?r.map(e=>e/i):r}function M({src:e,filename:t,onDecodeFail:n,onMediaError:r}){let i=(0,S.useRef)(null),a=(0,S.useRef)(null),o=(0,S.useRef)(!1),[s,c]=(0,S.useState)([]),[d,f]=(0,S.useState)(void 0),[p,m]=(0,S.useState)(!1),[h,g]=(0,S.useState)(0),[_,v]=(0,S.useState)(0);(0,S.useEffect)(()=>{let t=!1,r=null,i=window.AudioContext??window.webkitAudioContext,a=()=>{t||o.current||(o.current=!0,n())};if(!i){a();return}let s=new i;return(async()=>{try{let n=await fetch(e);if(!n.ok)throw Error(`audio fetch ${n.status}`);let i=await n.blob();if(t)return;r=URL.createObjectURL(i),f(r);let a=await s.decodeAudioData(await i.arrayBuffer());if(t)return;c(j(a.getChannelData(0),k)),Number.isFinite(a.duration)&&a.duration>0&&v(a.duration)}catch{a()}finally{try{s.close()}catch{}}})(),()=>{t=!0,r&&URL.revokeObjectURL(r)}},[e]);let y=()=>{let e=i.current;e&&(p?e.pause():Promise.resolve(e.play()).catch(()=>{}))},x=e=>{let t=i.current;if(!t||!(_>0))return;let n=Math.min(_,Math.max(0,e));t.currentTime=n,g(n)},w=e=>{let t=a.current;if(!t||!(_>0))return;let n=t.getBoundingClientRect();x(Math.min(1,Math.max(0,(e-n.left)/n.width))*_)},T=e=>{w(e.clientX);let t=e=>w(e.clientX),n=()=>{window.removeEventListener(`mousemove`,t),window.removeEventListener(`mouseup`,n)};window.addEventListener(`mousemove`,t),window.addEventListener(`mouseup`,n)},E=e=>{if(!(_>0))return;let t=i.current?.currentTime??0;switch(e.key){case`ArrowRight`:case`ArrowUp`:x(t+A),e.preventDefault();break;case`ArrowLeft`:case`ArrowDown`:x(t-A),e.preventDefault();break;case`Home`:x(0),e.preventDefault();break;case`End`:x(_),e.preventDefault();break;default:break}},D=_>0?Math.min(1,h/_):0,O=Math.round(D*k),M=u(h>0?h:_);return(0,C.jsxs)(`div`,{className:`voice-note`,children:[(0,C.jsx)(`button`,{type:`button`,className:`voice-note-play`,"aria-label":`${p?`Pause`:`Play`} ${t}`,onClick:y,children:p?(0,C.jsx)(b,{size:16,"aria-hidden":!0}):(0,C.jsx)(l,{size:16,"aria-hidden":!0})}),(0,C.jsx)(`div`,{ref:a,className:`voice-note-bars`,role:`slider`,tabIndex:0,"aria-label":`Seek ${t}`,"aria-valuemin":0,"aria-valuemax":Math.round(_),"aria-valuenow":Math.round(h),onMouseDown:T,onKeyDown:E,children:(s.length?s:Array.from({length:k},()=>0)).map((e,t)=>(0,C.jsx)(`span`,{className:`voice-note-bar${t<O?` is-played`:``}`,style:{height:`${Math.max(10,Math.round(e*100))}%`}},t))}),(0,C.jsx)(`span`,{className:`voice-note-time`,children:M}),(0,C.jsx)(`audio`,{ref:i,className:`voice-note-audio`,preload:`metadata`,src:d,"aria-label":t,onPlay:()=>m(!0),onPause:()=>m(!1),onEnded:()=>m(!1),onError:()=>r?.(),onLoadedMetadata:e=>{let t=e.currentTarget.duration;Number.isFinite(t)&&t>0&&v(t)},onTimeUpdate:e=>g(e.currentTarget.currentTime)})]})}var N=/\.(png|jpe?g|gif|webp|svg|bmp)$/i,P=/\.pdf$/i;function ee(e,t){return(t?t.startsWith(`image/`):N.test(e))?`image`:t&&t.startsWith(`audio/`)?`audio`:(t?t===`application/pdf`:P.test(e))?`pdf`:`file`}function F(e,t,n,r){let i=encodeURIComponent(e.path),a=encodeURIComponent(n),o=r?`&disposition=${r}`:``;return e.root===`scratchpad`?`/api/admin/files/download?path=${i}&root=scratchpad&sessionId=${encodeURIComponent(t)}&session_key=${a}${o}`:`/api/admin/files/download?path=${i}&root=data&session_key=${a}${o}`}function I(e,t,n,r){return t===`public`?`/api/public-reader/attachment/${e}?sessionId=${encodeURIComponent(n)}`:`/api/admin/attachment/${e}?session_key=${encodeURIComponent(r)}`}function te(e,t,n){return`/api/admin/session-upload?session_key=${encodeURIComponent(n)}&session_id=${encodeURIComponent(e)}&file=${encodeURIComponent(t)}`}function L(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${t<10?t.toFixed(1):Math.round(t)} KB`;let n=t/1024;return`${n<10?n.toFixed(1):Math.round(n)} MB`}function R({href:e,filename:t,label:n}){return(0,C.jsxs)(`a`,{className:`chat-attachment-chip`,href:e,download:t,children:[(0,C.jsx)(y,{size:14,"aria-hidden":!0}),n]})}function z({href:e,filename:t,className:n,size:r=14,onClick:i}){return(0,C.jsx)(`a`,{className:n,href:e,download:t,"aria-label":`Download ${t}`,onClick:i,children:(0,C.jsx)(a,{size:r,"aria-hidden":!0})})}function ne({src:e,filename:t,sizeBytes:n,expandable:r,onFail:i}){let[a,o]=(0,S.useState)(!1),[s,c]=(0,S.useState)(!1),l=n==null?t:`${t} · ${L(n)}`;return s?(0,C.jsx)(R,{href:e,filename:t,label:l}):(0,C.jsxs)(C.Fragment,{children:[(0,C.jsxs)(`span`,{className:`chat-attachment-image-wrap`,children:[(0,C.jsx)(`img`,{className:`chat-attachment-image`,src:e,alt:t,onClick:r?()=>o(!0):void 0,onError:()=>{c(!0),i?.(`fetch`)}}),(0,C.jsx)(z,{href:e,filename:t,className:`chat-attachment-download`})]}),r&&a&&(0,C.jsx)(`div`,{className:`chat-attachment-overlay`,role:`dialog`,"aria-label":t,onClick:()=>o(!1),children:(0,C.jsx)(`img`,{className:`chat-attachment-overlay-image`,src:e,alt:t})})]})}var re=280,ie=360,ae=16;function B({src:e,filename:t,sizeBytes:n,onFail:r}){let[i,a]=(0,S.useState)(!1),[o,s]=(0,S.useState)(!1),l=(0,S.useRef)(null),u=n==null?t:`${t} · ${L(n)}`;return(0,S.useEffect)(()=>{let t=!1,n=null;return(async()=>{try{let{loadPdf:r,renderPageToFit:i}=await d(async()=>{let{loadPdf:e,renderPageToFit:t}=await import(`./pdf-render-C257cidb.js`);return{loadPdf:e,renderPageToFit:t}},__vite__mapDeps([0,1])),a=await r(e);n=a;let o=l.current;if(t||!o)return;await i(a,1,o,re,ie)}catch{t||(s(!0),r?.(`render`))}})(),()=>{t=!0;try{n?.destroy()}catch{}}},[e]),o?(0,C.jsx)(R,{href:e,filename:t,label:u}):(0,C.jsxs)(C.Fragment,{children:[(0,C.jsxs)(`div`,{className:`chat-attachment-pdf`,children:[(0,C.jsx)(`canvas`,{ref:l,className:`chat-attachment-pdf-canvas`,"aria-label":t}),(0,C.jsx)(z,{href:e,filename:t,className:`chat-attachment-download`}),(0,C.jsx)(`button`,{type:`button`,className:`chat-attachment-pdf-expand`,"aria-label":`Expand ${t}`,onClick:()=>a(!0),children:(0,C.jsx)(c,{size:14,"aria-hidden":!0})})]}),i&&(0,C.jsx)(oe,{src:e,filename:t,label:u,onClose:()=>a(!1),onFail:r})]})}function oe({src:e,filename:t,label:n,onClose:r,onFail:a}){let o=(0,S.useRef)(null),s=(0,S.useRef)(null),[c,l]=(0,S.useState)(null),[u,f]=(0,S.useState)(!1);return(0,S.useEffect)(()=>{let t=!1;return(async()=>{try{let{loadPdf:n}=await d(async()=>{let{loadPdf:e}=await import(`./pdf-render-C257cidb.js`);return{loadPdf:e}},__vite__mapDeps([0,1])),r=await n(e);if(t){try{r.destroy()}catch{}return}s.current=r,l(r.numPages)}catch{t||(f(!0),a?.(`render`))}})(),()=>{t=!0;try{s.current?.destroy()}catch{}}},[e]),(0,S.useEffect)(()=>{if(c==null)return;let e=o.current,t=s.current;if(!e||!t)return;let n=!1;return(async()=>{try{let{renderPageToWidth:r}=await d(async()=>{let{renderPageToWidth:e}=await import(`./pdf-render-C257cidb.js`);return{renderPageToWidth:e}},__vite__mapDeps([0,1])),i=Array.from(e.querySelectorAll(`canvas.chat-attachment-overlay-page`)),a=Math.max(e.clientWidth-ae*2,1);for(let e=0;e<i.length;e++){if(n)return;await r(t,e+1,i[e],a)}}catch{n||(f(!0),a?.(`render`))}})(),()=>{n=!0}},[c]),(0,C.jsxs)(`div`,{className:`chat-attachment-overlay`,role:`dialog`,"aria-label":t,onClick:r,children:[(0,C.jsx)(`div`,{ref:o,className:`chat-attachment-overlay-pdf`,onClick:e=>e.stopPropagation(),children:u?(0,C.jsx)(R,{href:e,filename:t,label:n}):Array.from({length:c??0},(e,n)=>(0,C.jsx)(`canvas`,{className:`chat-attachment-overlay-page`,"aria-label":`${t} page ${n+1}`},n))}),(0,C.jsx)(z,{href:e,filename:t,className:`chat-attachment-overlay-download`,size:20,onClick:e=>e.stopPropagation()}),(0,C.jsx)(`button`,{type:`button`,className:`chat-attachment-overlay-close`,"aria-label":`Close`,onClick:r,children:(0,C.jsx)(i,{size:20,"aria-hidden":!0})})]})}function se({src:e,filename:t,onFail:n}){let[r,i]=(0,S.useState)(!1);return r?(0,C.jsx)(`audio`,{className:`chat-attachment-audio`,controls:!0,preload:`metadata`,src:e,"aria-label":t,onError:()=>n?.(`fetch`)}):(0,C.jsx)(M,{src:e,filename:t,onDecodeFail:()=>{i(!0),n?.(`render`)},onMediaError:()=>{i(!0),n?.(`fetch`)}})}function V({filename:e,href:t,mimeType:n,sizeBytes:r,expandable:i,telemetry:a}){let o=ee(e,n);(0,S.useEffect)(()=>{a?.onRender?.({kind:o,mime:n,served:!!t})},[]);let s=a?.onFail?e=>a.onFail({kind:o===`pdf`?`pdf`:o===`audio`?`audio`:`image`,mime:n,reason:e}):void 0;if(o===`image`&&t)return(0,C.jsx)(ne,{src:t,filename:e,sizeBytes:r,expandable:i,onFail:s});if(o===`audio`&&t)return(0,C.jsx)(se,{src:t,filename:e,onFail:s});if(o===`pdf`&&t)return(0,C.jsx)(B,{src:t,filename:e,sizeBytes:r,onFail:s});let c=r==null?e:`${e} · ${L(r)}`;return t?(0,C.jsx)(R,{href:t,filename:e,label:c}):(0,C.jsxs)(`p`,{className:`chat-doc`,children:[(0,C.jsx)(y,{size:14,"aria-hidden":!0,style:{verticalAlign:`text-bottom`}}),` `,c]})}function ce(e,t,n,r=`/api/whatsapp-reader/stream`,i=e,a=!0){let[o,s]=(0,S.useState)([]),[c,l]=(0,S.useState)(`open`),[u,d]=(0,S.useState)(null),f=(0,S.useRef)([]);return(0,S.useEffect)(()=>{f.current=o},[o]),(0,S.useEffect)(()=>{s([]),f.current=[],d(null)},[i,t,n,r]),(0,S.useEffect)(()=>{if(l(`open`),!a)return;let i=f.current.slice(),o=i.map(H),c=0,u=i.length>0,p=`${r}?sessionId=${encodeURIComponent(e)}&projectDir=${encodeURIComponent(t)}&session_key=${encodeURIComponent(n)}`,m=new EventSource(p);return m.onopen=()=>{console.info(`[admin-ui] wa-stream onopen sessionId=${e}`),l(`open`)},m.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{return}if(u){if(c<o.length&&H(t)===o[c]){c+=1;return}u=!1}s(e=>[...e,t])},m.addEventListener(`activity`,e=>{try{d(JSON.parse(e.data))}catch{}}),m.addEventListener(`activity-clear`,()=>d(null)),m.onerror=()=>{m.readyState===2&&(console.error(`[admin-ui] wa-stream onerror readyState=${m.readyState}`),l(`error`))},()=>m.close()},[e,t,n,r,i,a]),{turns:o,status:c,subagentActivity:u}}function H(e){return JSON.stringify(e)}function le(e,t,n,r=!0){let[i,a]=(0,S.useState)([]),[o,s]=(0,S.useState)(`open`);return(0,S.useEffect)(()=>{if(a([]),s(`open`),!r||!e||!t)return;let i=`/api/whatsapp-reader/store-stream?accountId=${encodeURIComponent(e)}&remoteJid=${encodeURIComponent(t)}&session_key=${encodeURIComponent(n)}`,o=new EventSource(i);return o.onopen=()=>s(`open`),o.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{return}a(e=>[...e,t])},o.addEventListener(`reaction`,e=>{let t;try{t=JSON.parse(e.data)}catch{return}a(e=>e.map(e=>e.kind===`whatsapp-persisted`&&e.msgKeyId===t.targetMsgKeyId?{...e,reactions:t.reactions}:e))}),o.onerror=()=>{o.readyState===2&&s(`error`)},()=>o.close()},[e,t,n,r]),{turns:i,status:o}}var U=e=>{if(!e)return 1/0;let t=new Date(e).getTime();return Number.isNaN(t)?1/0:t};function ue(e,t){let n=[],r=0;return e.forEach((e,t)=>n.push({sort:U(e.ts),sub:1,ins:r++,item:{kind:`turn`,turn:e,idx:t}})),t.forEach(e=>n.push({sort:U(e.ts),sub:0,ins:r++,item:{kind:`directive`,entry:e}})),n.sort((e,t)=>e.sort===t.sort?e.sort===1/0?e.ins-t.ins:e.sub-t.sub||e.ins-t.ins:e.sort<t.sort?-1:1).map(e=>e.item)}function de(e,t,n=!0){let[r,i]=(0,S.useState)([]);return(0,S.useEffect)(()=>{if(!n||typeof fetch!=`function`)return;let r=!0,a=`/api/whatsapp-reader/directives?sessionId=${encodeURIComponent(e)}&session_key=${encodeURIComponent(t)}`;return fetch(a).then(e=>e.ok?e.json():{entries:[]}).then(e=>{r&&i(Array.isArray(e.entries)?e.entries:[])}).catch(()=>{r&&i([])}),()=>{r=!1}},[e,t,n]),r}var fe=new Set([`operator-inbound`,`operator-typed`,`agent-reply`,`agent-reply-document`,`agent-file`,`agent-error`,`agent-webchat-final`,`whatsapp-persisted`]);function W(e){if(!e)return``;let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})}function G(e){let t=e.lastIndexOf(`/`);return t===-1?e:e.slice(t+1)}var pe=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],me=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`];function K(e){let t=String(e.getMonth()+1).padStart(2,`0`),n=String(e.getDate()).padStart(2,`0`);return`${e.getFullYear()}-${t}-${n}`}function q(e){if(!e)return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:K(t)}function he(e,t=new Date){if(!e)return``;let n=new Date(e);if(Number.isNaN(n.getTime()))return``;let r=K(n);if(r===K(t))return`Today`;let i=new Date(t);return i.setDate(i.getDate()-1),r===K(i)?`Yesterday`:`${pe[n.getDay()]} ${n.getDate()} ${me[n.getMonth()]} ${n.getFullYear()}`}function J(e){return e.kind===`turn`?e.turn.ts:e.entry.ts}function Y({ts:e}){return(0,C.jsx)(`div`,{className:`day-divider`,role:`separator`,children:(0,C.jsx)(`span`,{className:`day-divider-label`,children:he(e)})})}function X(){return(0,C.jsx)(`div`,{className:`session-divider`,role:`separator`,children:(0,C.jsx)(`span`,{className:`session-divider-label`,children:`Conversation continued`})})}function Z({label:e,ts:t}){return(0,C.jsxs)(`div`,{className:`wa-turn-head`,children:[(0,C.jsx)(`span`,{className:`wa-who`,children:e}),(0,C.jsx)(`time`,{className:`wa-time`,children:W(t)})]})}function ge({turn:e}){let[t,n]=(0,S.useState)(!1),r=e.kind===`tool-result`,i=r?`wa-turn wa-turn-result${e.isError?` is-error`:``}`:`wa-turn wa-turn-tool`,a=r?e.isError?`result (error)`:`result`:`↳ ${e.name}`,o=r?e.text:JSON.stringify(e.input,null,2);return(0,C.jsxs)(`div`,{className:i,children:[(0,C.jsxs)(`button`,{type:`button`,className:`wa-tool-toggle`,"aria-expanded":t,onClick:()=>n(e=>!e),children:[(0,C.jsx)(`span`,{className:`wa-chevron`,children:t?`▾`:`▸`}),(0,C.jsx)(`span`,{className:`wa-who`,children:a}),(0,C.jsx)(`time`,{className:`wa-time`,children:W(e.ts)})]}),t&&(0,C.jsx)(`pre`,{className:`wa-code`,children:o})]})}function Q({entry:e,sessionId:t,sessionKey:n}){let[r,i]=(0,S.useState)(!1),[a,o]=(0,S.useState)(null),s=()=>{let s=!r;if(i(s),s&&a===null&&typeof fetch==`function`){let r=`/api/whatsapp-reader/directive?sessionId=${encodeURIComponent(t)}&name=${encodeURIComponent(e.name)}&session_key=${encodeURIComponent(n)}`;fetch(r).then(e=>e.ok?e.text():`(directive unavailable)`).then(o).catch(()=>o(`(directive unavailable)`))}};return(0,C.jsxs)(`div`,{className:`wa-turn wa-turn-directive`,children:[(0,C.jsxs)(`button`,{type:`button`,className:`wa-tool-toggle`,"aria-expanded":r,onClick:s,children:[(0,C.jsx)(`span`,{className:`wa-chevron`,children:r?`▾`:`▸`}),(0,C.jsxs)(`span`,{className:`wa-who`,children:[`⚙ directive injected (`,e.len,` B)`]}),(0,C.jsx)(`time`,{className:`wa-time`,children:W(e.ts)})]}),r&&(0,C.jsx)(`pre`,{className:`wa-code`,children:a??`Loading…`})]})}function _e(e){return`text`in e&&typeof e.text==`string`?e.text:``}function ve(e,t){let n=(t??``).trim();if(!n)return e;let r=e.toLowerCase(),i=n.toLowerCase(),a=[],o=0,s=0;for(;;){let t=r.indexOf(i,o);if(t===-1){a.push(e.slice(o));break}t>o&&a.push(e.slice(o,t)),a.push((0,C.jsx)(`mark`,{className:`wa-search-hit`,children:e.slice(t,t+i.length)},s++)),o=t+i.length}return a.length===1?a[0]:(0,C.jsx)(C.Fragment,{children:a})}var $={onRender:({kind:e,mime:t,served:n})=>console.info(`[operator-ui] op=reader-attachment kind=${e} mime=${t??``} served=${n}`),onFail:({kind:e,mime:t,reason:n})=>console.info(`[operator-ui] op=reader-attachment-fail kind=${e} mime=${t??``} reason=${n}`)};function ye(e,t,n){switch(e.kind){case`operator-inbound`:return(0,C.jsxs)(`div`,{className:`wa-turn wa-turn-in`,children:[(0,C.jsx)(Z,{label:`Operator${O(e.source)}`,ts:e.ts}),e.text&&(0,C.jsx)(`p`,{className:`wa-body`,children:e.text}),e.attachments&&e.attachments.length>0&&(0,C.jsx)(`div`,{className:`chat-attachment-list`,children:e.attachments.map((e,t)=>(0,C.jsx)(V,{expandable:!0,filename:e.filename,mimeType:e.mimeType,sizeBytes:e.sizeBytes,href:I(e.attachmentId,n.audience,n.sessionId,n.sessionKey),telemetry:$},t))})]},t);case`operator-typed`:return(0,C.jsxs)(`div`,{className:`wa-turn wa-turn-in wa-turn-typed`,children:[(0,C.jsx)(Z,{label:`Operator (web)`,ts:e.ts}),(0,C.jsx)(`p`,{className:`wa-body`,children:e.text})]},t);case`agent-text`:return(0,C.jsxs)(`div`,{className:`wa-turn wa-turn-think`,children:[(0,C.jsx)(Z,{label:`Agent`,ts:e.ts}),(0,C.jsx)(`p`,{className:`wa-body`,children:e.text})]},t);case`agent-reply`:return(0,C.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,C.jsx)(Z,{label:`Agent`,ts:e.ts}),(0,C.jsx)(`p`,{className:`wa-body`,children:e.text})]},t);case`agent-reply-document`:return(0,C.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,C.jsx)(Z,{label:`Agent`,ts:e.ts}),(0,C.jsxs)(`p`,{className:`wa-doc`,children:[(0,C.jsx)(y,{size:14,"aria-hidden":!0,style:{verticalAlign:`text-bottom`}}),` `,`sent document(s): `,e.files.map(G).join(`, `)]}),e.caption&&(0,C.jsx)(`p`,{className:`wa-body`,children:e.caption})]},t);case`agent-file`:return(0,C.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,C.jsx)(Z,{label:`Agent`,ts:e.ts}),e.files.map((t,r)=>{let i=G(t),a=e.downloads?.[r];return(0,C.jsx)(V,{expandable:!0,filename:i,href:a?F(a,n.sessionId,n.sessionKey,P.test(i)?`inline`:void 0):void 0,telemetry:$},r)}),e.caption&&(0,C.jsx)(`p`,{className:`wa-body`,children:e.caption})]},t);case`whatsapp-persisted`:{let r=e.origin===`operator-manual`,i=e.fromMe?r?`You`:`Sent`:e.senderName??`Contact`;return(0,C.jsxs)(`div`,{className:`wa-turn ${e.fromMe?`wa-turn-out`:`wa-turn-in`}${r?` wa-op-manual`:``}`,children:[n.onReplyTo&&e.msgKeyId&&(0,C.jsx)(`button`,{type:`button`,className:`wa-bubble-reply`,"aria-label":`Reply to this message`,onClick:()=>n.onReplyTo({msgKeyId:e.msgKeyId,body:e.text,senderName:e.senderName,fromMe:e.fromMe}),children:(0,C.jsx)(x,{size:14})}),n.showCopy&&e.text&&(0,C.jsx)(`button`,{type:`button`,className:`wa-bubble-copy`,"aria-label":`Copy this message`,onClick:()=>{let t=e.text;o(t).then(e=>e?console.info(`[operator-ui] op=wa-copy len=${t.length} ok=true`):console.warn(`[operator-ui] op=wa-copy-fail reason=clipboard-unavailable`))},children:(0,C.jsx)(s,{size:14})}),e.quoted&&(0,C.jsxs)(`div`,{className:`wa-quoted`,children:[(0,C.jsx)(`span`,{className:`wa-quoted-who`,children:e.quoted.fromMe?`You`:e.quoted.sender??`Contact`}),(0,C.jsx)(`span`,{className:`wa-quoted-body`,children:e.quoted.body||`Message`})]}),(0,C.jsx)(Z,{label:i,ts:e.ts}),e.text&&(0,C.jsx)(`p`,{className:`wa-body`,children:ve(e.text,n.highlight)}),e.attachments&&e.attachments.length>0&&(0,C.jsx)(`div`,{className:`chat-attachment-list`,children:e.attachments.map((e,t)=>(0,C.jsx)(V,{expandable:!0,filename:e.filename,mimeType:e.mimeType,sizeBytes:e.sizeBytes,href:I(e.attachmentId,n.audience,n.sessionId,n.sessionKey),telemetry:$},t))}),e.reactions&&e.reactions.length>0&&(0,C.jsx)(`div`,{className:`wa-reactions`,children:e.reactions.map((e,t)=>(0,C.jsx)(`span`,{className:`wa-reaction`,title:e.reactorName??void 0,children:e.emoji},t))}),(0,C.jsxs)(`span`,{className:`wa-bubble-meta`,children:[r&&(0,C.jsx)(`span`,{className:`wa-op-tag`,children:`You`}),(0,C.jsx)(`time`,{className:`wa-bubble-time`,children:W(e.ts)}),e.fromMe&&(0,C.jsx)(g,{size:14,className:`wa-bubble-tick`,"aria-hidden":!0})]})]},t)}case`session-continued`:return(0,C.jsx)(X,{},t);case`harness-internal`:return null;case`tool-call`:case`tool-result`:return(0,C.jsx)(ge,{turn:e},t);case`agent-error`:return(0,C.jsxs)(`div`,{className:`wa-turn wa-turn-error`,role:`alert`,children:[(0,C.jsx)(Z,{label:`Agent`,ts:e.ts}),(0,C.jsx)(`p`,{className:`wa-body wa-error-body`,children:D(e.code,`admin`)}),e.code===`agent_error`&&e.raw&&(0,C.jsx)(`pre`,{className:`wa-code`,children:e.raw})]},t)}}function be(e,t,n,r=`admin`,i,a,o){let s={sessionId:t,sessionKey:n,audience:r,highlight:i,onReplyTo:a,showCopy:o},c=[],l=null;return e.forEach((e,r)=>{let i=J(e),a=q(i);a!==null&&a!==l&&(c.push((0,C.jsx)(Y,{ts:i},`day-${r}`)),l=a),c.push(e.kind===`turn`?ye(e.turn,r,s):(0,C.jsx)(Q,{entry:e.entry,sessionId:t,sessionKey:n},r))}),c}function xe(e){return e.filter(e=>e.kind===`turn`&&fe.has(e.turn.kind)&&!(e.turn.kind===`operator-inbound`&&e.turn.scheduled))}var Se=(0,S.memo)(function({sessionId:e,projectDir:t,sessionKey:n,renderItems:r=be,clean:i,onToggleClean:a,forceDeliveredOnly:o=!1,streamEndpoint:s=`/api/whatsapp-reader/stream`,suppressDirectives:c=!1,tail:l=null,resetKey:u,onTurnsChange:d,onActivityChange:f,store:p,search:m,onReplyTo:h}){let g=!!p,_=ce(e,t,n,s,u,!g),v=le(p?.accountId??``,p?.remoteJid??``,n,g),{turns:y,status:b}=g?{turns:v.turns,status:v.status}:{turns:_.turns,status:_.status},x=g?null:_.subagentActivity;(0,S.useEffect)(()=>{f?.(x)},[x,f]),(0,S.useEffect)(()=>{d?.(y.length)},[y.length,d]);let T=ue(y,de(e,n,!c)),E=a==null?!1:!!i,D=o||E?xe(T):T,O=(m??``).trim().toLowerCase(),k=O.length>0,A=k?D.filter(e=>e.kind===`turn`&&_e(e.turn).toLowerCase().includes(O)):D,j=k?D.filter(e=>e.kind===`turn`).length:0;return(0,S.useEffect)(()=>{k&&console.info(`[operator-ui] op=wa-search q=${O} matches=${A.length} ofTurns=${j}`)},[O,k,A.length,j]),(0,C.jsxs)(w,{repinSignals:[y,E,k],tail:l,children:[b===`error`&&(0,C.jsx)(`div`,{className:`wa-reader-error`,children:`Stream disconnected.`}),!k&&y.length===0&&b===`open`&&(0,C.jsx)(`div`,{className:`wa-reader-placeholder`,children:`No messages in this conversation yet.`}),k&&A.length===0&&(0,C.jsxs)(`div`,{className:`wa-reader-placeholder`,children:[`No matches for "`,m,`".`]}),g?be(A,e,n,`admin`,m,h,!0):r(D,e,n)]})});function Ce(e,t){let n=e.split(`;`)[0].trim().toLowerCase();return t.has(n)}var we=[`audio/ogg;codecs=opus`,`audio/webm;codecs=opus`,`audio/webm`,`audio/mp4`];function Te(){for(let e of we)if(MediaRecorder.isTypeSupported(e))return e;return``}function Ee(e){return e.split(`;`)[0]}async function De(){return typeof navigator>`u`||!navigator.mediaDevices?.enumerateDevices?[]:(await navigator.mediaDevices.enumerateDevices()).filter(e=>e.kind===`audioinput`)}function Oe(e){let[t,n]=(0,S.useState)(`idle`),[r,i]=(0,S.useState)(0),[a,o]=(0,S.useState)(null),[s,c]=(0,S.useState)(null),l=(0,S.useRef)(null),u=(0,S.useRef)(null),d=(0,S.useRef)([]),f=(0,S.useRef)(``),p=(0,S.useRef)(null),m=(0,S.useRef)(0),h=(0,S.useRef)(0),g=(0,S.useRef)(null),_=(0,S.useRef)(null),v=(0,S.useRef)(0),y=(0,S.useCallback)(()=>{if(p.current&&=(clearInterval(p.current),null),v.current&&=(cancelAnimationFrame(v.current),0),l.current&&l.current.state!==`inactive`)try{l.current.stop()}catch{}l.current=null,d.current=[],u.current&&=(u.current.getTracks().forEach(e=>e.stop()),null),g.current&&(g.current.close().catch(()=>{}),g.current=null,_.current=null),h.current=0,m.current=0},[]);(0,S.useEffect)(()=>y,[y]);let b=(0,S.useCallback)(()=>{m.current=Date.now(),p.current=setInterval(()=>{let e=Date.now()-m.current,t=h.current+e;i(Math.floor(t/1e3))},200)},[]),x=(0,S.useCallback)(()=>{p.current&&=(clearInterval(p.current),null);let e=Date.now()-m.current;h.current+=e},[]),C=(0,S.useCallback)(()=>{let e=_.current;if(!e)return;let t=new Uint8Array(e.frequencyBinCount),n=()=>{e.getByteTimeDomainData(t),o(new Uint8Array(t)),v.current=requestAnimationFrame(n)};n()},[]),w=(0,S.useCallback)(()=>{v.current&&=(cancelAnimationFrame(v.current),0)},[]),T=e?.onResult,E=(0,S.useCallback)(async e=>{if(!(t!==`idle`&&t!==`error`)){if(c(null),typeof window<`u`&&!window.isSecureContext){n(`error`),c(`Voice recording requires a secure connection (HTTPS). Use your tunnel URL for voice notes.`);return}if(typeof navigator>`u`||!navigator.mediaDevices?.getUserMedia){n(`error`),c(`Voice recording is not supported in this browser.`);return}if(typeof MediaRecorder>`u`){n(`error`),c(`Voice recording is not supported in this browser.`);return}try{let t=e?{audio:{deviceId:{exact:e}}}:{audio:!0},r;try{r=await navigator.mediaDevices.getUserMedia(t)}catch(t){let n=t?.name;if(e&&(n===`OverconstrainedError`||n===`NotFoundError`))r=await navigator.mediaDevices.getUserMedia({audio:!0});else throw t}u.current=r;let a=new AudioContext;g.current=a;let s=a.createMediaStreamSource(r),c=a.createAnalyser();c.fftSize=256,s.connect(c),_.current=c;let p=Te();f.current=p;let m=new MediaRecorder(r,p?{mimeType:p}:void 0);l.current=m,d.current=[],m.ondataavailable=e=>{e.data.size>0&&d.current.push(e.data)},r.getAudioTracks()[0]?.addEventListener(`ended`,()=>{y(),n(`idle`),i(0),o(null)}),m.start(1e3),n(`recording`),i(0),b(),C(),T?.({ok:!0})}catch(e){y(),n(`error`),e instanceof DOMException?(T?.({ok:!1,name:e.name,message:e.message}),e.name===`NotAllowedError`?c(`Microphone access was denied. Check your browser permissions to enable voice recording.`):e.name===`NotFoundError`?c(`No microphone found. Connect a microphone to use voice recording.`):e.name===`NotReadableError`?c(`The microphone could not be started even though access was granted. The browser reported: ${e.message} (${e.name}).`):c(`Microphone error (${e.name}): ${e.message}`)):(T?.({ok:!1}),c(`Could not start recording.`))}}},[t,y,b,C,T]),D=(0,S.useCallback)(()=>{let e=l.current;e&&(t===`recording`&&e.state===`recording`?(e.pause(),x(),w(),n(`paused`)):t===`paused`&&e.state===`paused`&&(e.resume(),b(),C(),n(`recording`)))},[t,x,b,C,w]),O=(0,S.useCallback)(()=>{t!==`recording`&&t!==`paused`||(y(),n(`idle`),i(0),o(null))},[t,y]),k=(0,S.useCallback)(async()=>{if(t!==`recording`&&t!==`paused`)return null;let e=l.current;if(!e)return null;let r=t===`recording`?Date.now()-m.current:0;return h.current+r<1e3?(O(),null):(n(`sending`),x(),w(),new Promise(t=>{e.onstop=()=>{let r=f.current||e.mimeType||`audio/webm`,a=new Blob(d.current,{type:Ee(r)});y(),n(`idle`),i(0),o(null),t(a.size>0?a:null)},e.stop()}))},[t,O,x,w,y]);return(0,S.useEffect)(()=>{if(t!==`error`)return;let e=setTimeout(()=>{n(`idle`),c(null)},8e3);return()=>clearTimeout(e)},[t]),{state:t,elapsedSeconds:r,waveform:a,errorMessage:s,start:E,togglePause:D,discard:O,send:k}}export{_ as C,h as D,p as E,v as S,m as T,F as _,Q as a,b,G as c,J as d,V as f,I as g,P as h,Y as i,q as l,N as m,Oe as n,X as o,B as p,Ce as r,Se as s,De as t,W as u,te as v,f as w,y as x,D as y};
@@ -1 +1 @@
1
- import{P as e}from"./useSubAccountSwitcher-DH0P6QMV.js";var t=e(`wrench`,[[`path`,{d:`M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z`,key:`1ngwbx`}]]);export{t};
1
+ import{P as e}from"./useSubAccountSwitcher-CRWoQXuU.js";var t=e(`wrench`,[[`path`,{d:`M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z`,key:`1ngwbx`}]]);export{t};
@@ -5,11 +5,11 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Browser — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/browser-1I7syhHu.js"></script>
8
+ <script type="module" crossorigin src="/assets/browser-B1G-W80B.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DH0P6QMV.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DkrURZnF.js">
12
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-BYl2c7xA.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-CRWoQXuU.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-BgJEq2zJ.js">
12
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-UQQDcj0B.css">
13
13
  <link rel="stylesheet" href="/brand-defaults.css">
14
14
  </head>
15
15
  <body>
@@ -5,14 +5,14 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Calendar — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/calendar-D_04JIo1.js"></script>
8
+ <script type="module" crossorigin src="/assets/calendar-CHgrOFIN.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DH0P6QMV.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DkrURZnF.js">
12
- <link rel="modulepreload" crossorigin href="/assets/chevron-left-Ux9-qLkk.js">
13
- <link rel="modulepreload" crossorigin href="/assets/chevron-right-BwIuCfyG.js">
14
- <link rel="modulepreload" crossorigin href="/assets/clock-DhJdZRhC.js">
15
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-BYl2c7xA.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-CRWoQXuU.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-BgJEq2zJ.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/chevron-left-EQjfaQ-n.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/chevron-right-Ct8jZUGP.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/clock-Cxz5ybck.js">
15
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-UQQDcj0B.css">
16
16
  <link rel="stylesheet" href="/brand-defaults.css">
17
17
  </head>
18
18
  <body>
@@ -5,21 +5,21 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Chat — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/chat-BFH3FM5a.js"></script>
8
+ <script type="module" crossorigin src="/assets/chat-CIwmmtwP.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DH0P6QMV.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DkrURZnF.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-CRWoQXuU.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-BgJEq2zJ.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-BQrMkyGX.js">
13
- <link rel="modulepreload" crossorigin href="/assets/time-entry-format-Cy_T-wiD.js">
14
- <link rel="modulepreload" crossorigin href="/assets/maximize-2-Xdj804U1.js">
15
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-MuZ7lpet.js">
16
- <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-L7L55nFl.js">
17
- <link rel="modulepreload" crossorigin href="/assets/chevron-left-Ux9-qLkk.js">
18
- <link rel="modulepreload" crossorigin href="/assets/file-text-DkvKqHMx.js">
19
- <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-dh_OhL23.js">
20
- <link rel="modulepreload" crossorigin href="/assets/wrench-DUG1SZQB.js">
21
- <link rel="modulepreload" crossorigin href="/assets/page-BoYc9c4a.js">
22
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-BYl2c7xA.css">
13
+ <link rel="modulepreload" crossorigin href="/assets/time-entry-format-4zgmuQI0.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/maximize-2-rkkMyAhf.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-BgwOCCwj.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-Dx0vtm9s.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/chevron-left-EQjfaQ-n.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/file-text-BVqqaDun.js">
19
+ <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-O3RmqoTy.js">
20
+ <link rel="modulepreload" crossorigin href="/assets/wrench-CHfMwLza.js">
21
+ <link rel="modulepreload" crossorigin href="/assets/page-k0BhBkA2.js">
22
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-UQQDcj0B.css">
23
23
  <link rel="stylesheet" href="/brand-defaults.css">
24
24
  </head>
25
25
  <body>
@@ -5,19 +5,19 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Data — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/data-ChY_uSIk.js"></script>
8
+ <script type="module" crossorigin src="/assets/data-BQVXKVsJ.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DH0P6QMV.js">
11
- <link rel="modulepreload" crossorigin href="/assets/graph-labels-BJ7puQkX.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-CRWoQXuU.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/graph-labels-Zl32_AOH.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-BQrMkyGX.js">
13
- <link rel="modulepreload" crossorigin href="/assets/time-entry-format-Cy_T-wiD.js">
14
- <link rel="modulepreload" crossorigin href="/assets/maximize-2-Xdj804U1.js">
15
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-MuZ7lpet.js">
16
- <link rel="modulepreload" crossorigin href="/assets/chevron-left-Ux9-qLkk.js">
17
- <link rel="modulepreload" crossorigin href="/assets/file-text-DkvKqHMx.js">
18
- <link rel="modulepreload" crossorigin href="/assets/triangle-alert-D-bSbPnX.js">
19
- <link rel="modulepreload" crossorigin href="/assets/page-D5n8ShE7.js">
20
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-BYl2c7xA.css">
13
+ <link rel="modulepreload" crossorigin href="/assets/time-entry-format-4zgmuQI0.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/maximize-2-rkkMyAhf.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-BgwOCCwj.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/chevron-left-EQjfaQ-n.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/file-text-BVqqaDun.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/triangle-alert-By5D7wuI.js">
19
+ <link rel="modulepreload" crossorigin href="/assets/page-BAmYYqxp.js">
20
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-UQQDcj0B.css">
21
21
  <link rel="stylesheet" href="/brand-defaults.css">
22
22
  </head>
23
23
  <body>
@@ -5,16 +5,16 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Graph — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/graph-CCZhrwZX.js"></script>
8
+ <script type="module" crossorigin src="/assets/graph-CEcME0lp.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DH0P6QMV.js">
11
- <link rel="modulepreload" crossorigin href="/assets/graph-labels-BJ7puQkX.js">
12
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DkrURZnF.js">
13
- <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-L7L55nFl.js">
14
- <link rel="modulepreload" crossorigin href="/assets/chevron-left-Ux9-qLkk.js">
15
- <link rel="modulepreload" crossorigin href="/assets/maximize-2-Xdj804U1.js">
16
- <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-dh_OhL23.js">
17
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-BYl2c7xA.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-CRWoQXuU.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/graph-labels-Zl32_AOH.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-BgJEq2zJ.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-Dx0vtm9s.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/chevron-left-EQjfaQ-n.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/maximize-2-rkkMyAhf.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-O3RmqoTy.js">
17
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-UQQDcj0B.css">
18
18
  <link rel="stylesheet" href="/brand-defaults.css">
19
19
  </head>
20
20
  <body>
@@ -5,22 +5,22 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>SiteDesk</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/admin-DjFysc3-.js"></script>
8
+ <script type="module" crossorigin src="/assets/admin-Dpge4OG9.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DH0P6QMV.js">
11
- <link rel="modulepreload" crossorigin href="/assets/graph-labels-BJ7puQkX.js">
12
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DkrURZnF.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-CRWoQXuU.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/graph-labels-Zl32_AOH.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-BgJEq2zJ.js">
13
13
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-BQrMkyGX.js">
14
- <link rel="modulepreload" crossorigin href="/assets/time-entry-format-Cy_T-wiD.js">
15
- <link rel="modulepreload" crossorigin href="/assets/maximize-2-Xdj804U1.js">
16
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-MuZ7lpet.js">
17
- <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-Cs1jSnOF.js">
18
- <link rel="modulepreload" crossorigin href="/assets/chevron-left-Ux9-qLkk.js">
19
- <link rel="modulepreload" crossorigin href="/assets/file-text-DkvKqHMx.js">
20
- <link rel="modulepreload" crossorigin href="/assets/triangle-alert-D-bSbPnX.js">
21
- <link rel="modulepreload" crossorigin href="/assets/page-D5n8ShE7.js">
22
- <link rel="modulepreload" crossorigin href="/assets/chevron-right-BwIuCfyG.js">
23
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-BYl2c7xA.css">
14
+ <link rel="modulepreload" crossorigin href="/assets/time-entry-format-4zgmuQI0.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/maximize-2-rkkMyAhf.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-BgwOCCwj.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-B5qKb3YK.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/chevron-left-EQjfaQ-n.js">
19
+ <link rel="modulepreload" crossorigin href="/assets/file-text-BVqqaDun.js">
20
+ <link rel="modulepreload" crossorigin href="/assets/triangle-alert-By5D7wuI.js">
21
+ <link rel="modulepreload" crossorigin href="/assets/page-BAmYYqxp.js">
22
+ <link rel="modulepreload" crossorigin href="/assets/chevron-right-Ct8jZUGP.js">
23
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-UQQDcj0B.css">
24
24
  <link rel="stylesheet" crossorigin href="/assets/AdminLoginScreens-CWMpccrR.css">
25
25
  <link rel="stylesheet" href="/brand-defaults.css">
26
26
  </head>
@@ -5,22 +5,22 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Operator — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/operator-BkfNpBs7.js"></script>
8
+ <script type="module" crossorigin src="/assets/operator-DlL023ch.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DH0P6QMV.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DkrURZnF.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-CRWoQXuU.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-BgJEq2zJ.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-BQrMkyGX.js">
13
- <link rel="modulepreload" crossorigin href="/assets/time-entry-format-Cy_T-wiD.js">
14
- <link rel="modulepreload" crossorigin href="/assets/maximize-2-Xdj804U1.js">
15
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-MuZ7lpet.js">
16
- <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-Cs1jSnOF.js">
17
- <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-L7L55nFl.js">
18
- <link rel="modulepreload" crossorigin href="/assets/chevron-left-Ux9-qLkk.js">
19
- <link rel="modulepreload" crossorigin href="/assets/file-text-DkvKqHMx.js">
20
- <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-dh_OhL23.js">
21
- <link rel="modulepreload" crossorigin href="/assets/wrench-DUG1SZQB.js">
22
- <link rel="modulepreload" crossorigin href="/assets/page-BoYc9c4a.js">
23
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-BYl2c7xA.css">
13
+ <link rel="modulepreload" crossorigin href="/assets/time-entry-format-4zgmuQI0.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/maximize-2-rkkMyAhf.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-BgwOCCwj.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-B5qKb3YK.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-Dx0vtm9s.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/chevron-left-EQjfaQ-n.js">
19
+ <link rel="modulepreload" crossorigin href="/assets/file-text-BVqqaDun.js">
20
+ <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-O3RmqoTy.js">
21
+ <link rel="modulepreload" crossorigin href="/assets/wrench-CHfMwLza.js">
22
+ <link rel="modulepreload" crossorigin href="/assets/page-k0BhBkA2.js">
23
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-UQQDcj0B.css">
24
24
  <link rel="stylesheet" crossorigin href="/assets/AdminLoginScreens-CWMpccrR.css">
25
25
  <link rel="stylesheet" href="/brand-defaults.css">
26
26
  </head>
@@ -5,21 +5,21 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>SiteDesk</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/public-CX5XSrxD.js"></script>
8
+ <script type="module" crossorigin src="/assets/public-Cqgfmo1D.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DH0P6QMV.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DkrURZnF.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-CRWoQXuU.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-BgJEq2zJ.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-BQrMkyGX.js">
13
- <link rel="modulepreload" crossorigin href="/assets/time-entry-format-Cy_T-wiD.js">
14
- <link rel="modulepreload" crossorigin href="/assets/maximize-2-Xdj804U1.js">
15
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-MuZ7lpet.js">
16
- <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-L7L55nFl.js">
17
- <link rel="modulepreload" crossorigin href="/assets/chevron-left-Ux9-qLkk.js">
18
- <link rel="modulepreload" crossorigin href="/assets/file-text-DkvKqHMx.js">
19
- <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-dh_OhL23.js">
20
- <link rel="modulepreload" crossorigin href="/assets/wrench-DUG1SZQB.js">
21
- <link rel="modulepreload" crossorigin href="/assets/page-BoYc9c4a.js">
22
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-BYl2c7xA.css">
13
+ <link rel="modulepreload" crossorigin href="/assets/time-entry-format-4zgmuQI0.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/maximize-2-rkkMyAhf.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-BgwOCCwj.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-Dx0vtm9s.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/chevron-left-EQjfaQ-n.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/file-text-BVqqaDun.js">
19
+ <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-O3RmqoTy.js">
20
+ <link rel="modulepreload" crossorigin href="/assets/wrench-CHfMwLza.js">
21
+ <link rel="modulepreload" crossorigin href="/assets/page-k0BhBkA2.js">
22
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-UQQDcj0B.css">
23
23
  <link rel="stylesheet" href="/brand-defaults.css">
24
24
  </head>
25
25
  <body class="public-surface">
@@ -5,13 +5,13 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Routines — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/routines-bb7dxcrr.js"></script>
8
+ <script type="module" crossorigin src="/assets/routines-DMYObMUy.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DH0P6QMV.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DkrURZnF.js">
12
- <link rel="modulepreload" crossorigin href="/assets/clock-DhJdZRhC.js">
13
- <link rel="modulepreload" crossorigin href="/assets/wrench-DUG1SZQB.js">
14
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-BYl2c7xA.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-CRWoQXuU.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-BgJEq2zJ.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/clock-Cxz5ybck.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/wrench-CHfMwLza.js">
14
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-UQQDcj0B.css">
15
15
  <link rel="stylesheet" href="/brand-defaults.css">
16
16
  </head>
17
17
  <body>
@@ -5,12 +5,12 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Skills — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/skills-TeMwxXmJ.js"></script>
8
+ <script type="module" crossorigin src="/assets/skills-DON1BKu5.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DH0P6QMV.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DkrURZnF.js">
12
- <link rel="modulepreload" crossorigin href="/assets/file-text-DkvKqHMx.js">
13
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-BYl2c7xA.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-CRWoQXuU.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-BgJEq2zJ.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/file-text-BVqqaDun.js">
13
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-UQQDcj0B.css">
14
14
  <link rel="stylesheet" href="/brand-defaults.css">
15
15
  </head>
16
16
  <body>
@@ -5,13 +5,13 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Tasks — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/tasks-BqBBJlkg.js"></script>
8
+ <script type="module" crossorigin src="/assets/tasks-C2PhUSrf.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DH0P6QMV.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DkrURZnF.js">
12
- <link rel="modulepreload" crossorigin href="/assets/time-entry-format-Cy_T-wiD.js">
13
- <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-dh_OhL23.js">
14
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-BYl2c7xA.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-CRWoQXuU.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-BgJEq2zJ.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/time-entry-format-4zgmuQI0.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-O3RmqoTy.js">
14
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-UQQDcj0B.css">
15
15
  <link rel="stylesheet" href="/brand-defaults.css">
16
16
  </head>
17
17
  <body>
@@ -17548,6 +17548,20 @@ function readDisabledStore(accountDir) {
17548
17548
  return /* @__PURE__ */ new Set();
17549
17549
  }
17550
17550
  }
17551
+ function authoredAgentFilenames(accountDir) {
17552
+ const pluginsDir = resolve23(accountDir, "plugins");
17553
+ const names = /* @__PURE__ */ new Set();
17554
+ for (const plugin of subdirs(pluginsDir)) {
17555
+ const dir = resolve23(pluginsDir, plugin, "agents");
17556
+ if (!existsSync31(dir)) continue;
17557
+ try {
17558
+ for (const entry of readdirSync22(dir)) if (entry.endsWith(".md")) names.add(entry);
17559
+ } catch (err) {
17560
+ console.error(`[admin/agents] op=authored-scan read-failed plugin=${plugin} error="${err}"`);
17561
+ }
17562
+ }
17563
+ return names;
17564
+ }
17551
17565
  function shippedSourceDirs(accountDir) {
17552
17566
  return [
17553
17567
  resolve23(accountDir, ...SPECIALISTS_DIR),
@@ -17563,7 +17577,7 @@ function writeDisabledStore(accountDir, disabled) {
17563
17577
  { mode: 384 }
17564
17578
  );
17565
17579
  }
17566
- function listShipped(accountDir, riskByTool, disabled, riskSurfaceFailed) {
17580
+ function listShipped(accountDir, riskByTool, disabled, riskSurfaceFailed, authoredFilenames) {
17567
17581
  const dirs = shippedSourceDirs(accountDir);
17568
17582
  const names = /* @__PURE__ */ new Set();
17569
17583
  for (const dir of dirs) {
@@ -17576,9 +17590,15 @@ function listShipped(accountDir, riskByTool, disabled, riskSurfaceFailed) {
17576
17590
  }
17577
17591
  const shipped = [];
17578
17592
  let shippedSkipped = 0;
17593
+ let deduped = 0;
17579
17594
  for (const filename of [...names].sort()) {
17580
17595
  const source = dirs.find((d) => existsSync31(resolve23(d, filename)));
17581
17596
  if (!source) continue;
17597
+ if (source === dirs[0] && authoredFilenames.has(filename)) {
17598
+ deduped++;
17599
+ console.log(`[admin/agents] op=list-shipped-dedup file=${filename}`);
17600
+ continue;
17601
+ }
17582
17602
  try {
17583
17603
  const { fm } = splitFrontmatter(readFileSync33(resolve23(source, filename), "utf-8"));
17584
17604
  if (!fm.name) {
@@ -17611,7 +17631,7 @@ function listShipped(accountDir, riskByTool, disabled, riskSurfaceFailed) {
17611
17631
  console.error(`[admin/agents] op=list-shipped-skip file=${filename} error="${err}"`);
17612
17632
  }
17613
17633
  }
17614
- return { shipped, shippedSkipped };
17634
+ return { shipped, shippedSkipped, deduped };
17615
17635
  }
17616
17636
  function parseToolsLine(raw) {
17617
17637
  return raw ? raw.split(",").map((t) => t.trim()).filter(Boolean) : [];
@@ -17719,7 +17739,13 @@ app18.get("/", requireAdminSession, (c) => {
17719
17739
  }
17720
17740
  }
17721
17741
  const { specialists, specialistsSkipped } = listSpecialists(account.accountDir, riskByTool, riskSurfaceFailed !== null);
17722
- const { shipped, shippedSkipped } = listShipped(account.accountDir, riskByTool, disabled, riskSurfaceFailed !== null);
17742
+ const { shipped, shippedSkipped, deduped } = listShipped(
17743
+ account.accountDir,
17744
+ riskByTool,
17745
+ disabled,
17746
+ riskSurfaceFailed !== null,
17747
+ authoredAgentFilenames(account.accountDir)
17748
+ );
17723
17749
  const rows = [...agents, ...specialists, ...shipped];
17724
17750
  const acct = account.accountId.slice(0, 8);
17725
17751
  for (const row of rows) {
@@ -17728,13 +17754,17 @@ app18.get("/", requireAdminSession, (c) => {
17728
17754
  `[admin/agents] op=classify account=${acct} agent=${row.slug} origin=${row.origin} risk=${row.risk} riskiestTool=${row.riskiestTool ?? "none"} tools=${row.toolCount} unresolved=${row.unresolved.length > 0 ? row.unresolved.join(",") : "none"} disabled=${row.disabled}`
17729
17755
  );
17730
17756
  }
17731
- console.log(`[admin/agents] op=list accountId=${acct} agents=${agents.length} specialists=${specialists.length} shipped=${shipped.length} skipped=${skipped} specialistsSkipped=${specialistsSkipped} shippedSkipped=${shippedSkipped}`);
17757
+ console.log(`[admin/agents] op=list accountId=${acct} agents=${agents.length} specialists=${specialists.length} shipped=${shipped.length} skipped=${skipped} specialistsSkipped=${specialistsSkipped} shippedSkipped=${shippedSkipped} deduped=${deduped}`);
17732
17758
  return c.json({
17733
17759
  agents: rows,
17734
17760
  accountId: account.accountId,
17735
17761
  skipped,
17736
17762
  specialistsSkipped,
17737
17763
  shippedSkipped,
17764
+ // How many live-directory candidates were dropped as authored duplicates.
17765
+ // `shipped + shippedSkipped + deduped` equals the number of distinct `.md`
17766
+ // names across the three source directories.
17767
+ deduped,
17738
17768
  riskSurfaceFailed: riskSurfaceFailed !== null
17739
17769
  });
17740
17770
  });
@@ -17888,6 +17918,10 @@ app18.post("/:slug/disable", async (c) => {
17888
17918
  const filename = `${slug}.md`;
17889
17919
  const live = resolve23(resolved.accountDir, ...SPECIALISTS_DIR, filename);
17890
17920
  const quarantined = resolve23(resolved.accountDir, ...QUARANTINE_DIR, filename);
17921
+ if (authoredAgentFilenames(resolved.accountDir).has(filename)) {
17922
+ console.error(`[admin/agents] op=disable accountId=${resolved.accountId.slice(0, 8)} slug=${slug} outcome=failed reason=user-created-specialist`);
17923
+ return c.json({ error: "Only a shipped agent can be disabled" }, 404);
17924
+ }
17891
17925
  if (!shippedSourceDirs(resolved.accountDir).some((d) => existsSync31(resolve23(d, filename)))) {
17892
17926
  console.error(`[admin/agents] op=disable accountId=${resolved.accountId.slice(0, 8)} slug=${slug} outcome=failed reason=not-a-shipped-agent`);
17893
17927
  return c.json({ error: "Only a shipped agent can be disabled" }, 404);