@rubytech/create-maxy-code 0.1.539 → 0.1.541

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 (269) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/agent-slug/dist/index.d.ts +31 -0
  3. package/payload/platform/lib/agent-slug/dist/index.d.ts.map +1 -0
  4. package/payload/platform/lib/agent-slug/dist/index.js +53 -0
  5. package/payload/platform/lib/agent-slug/dist/index.js.map +1 -0
  6. package/payload/platform/lib/agent-slug/src/index.ts +53 -0
  7. package/payload/platform/lib/agent-slug/tsconfig.json +8 -0
  8. package/payload/platform/package.json +2 -2
  9. package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
  10. package/payload/platform/plugins/admin/PLUGIN.md +33 -1
  11. package/payload/platform/plugins/admin/mcp/dist/index.js +136 -0
  12. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  13. package/payload/platform/plugins/admin/mcp/dist/tools/agent-config-schema.d.ts +9 -0
  14. package/payload/platform/plugins/admin/mcp/dist/tools/agent-config-schema.d.ts.map +1 -0
  15. package/payload/platform/plugins/admin/mcp/dist/tools/agent-config-schema.js +49 -0
  16. package/payload/platform/plugins/admin/mcp/dist/tools/agent-config-schema.js.map +1 -0
  17. package/payload/platform/plugins/admin/mcp/dist/tools/agent-write.d.ts +64 -0
  18. package/payload/platform/plugins/admin/mcp/dist/tools/agent-write.d.ts.map +1 -0
  19. package/payload/platform/plugins/admin/mcp/dist/tools/agent-write.js +151 -0
  20. package/payload/platform/plugins/admin/mcp/dist/tools/agent-write.js.map +1 -0
  21. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +81 -13
  22. package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +36 -20
  23. package/payload/platform/plugins/admin/skills/update-knowledge/SKILL.md +4 -3
  24. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +12 -0
  25. package/payload/platform/plugins/docs/references/admin-ui.md +47 -0
  26. package/payload/platform/plugins/docs/references/channel-wake-and-prompt.md +31 -10
  27. package/payload/platform/plugins/docs/references/internals.md +2 -2
  28. package/payload/platform/plugins/whatsapp/PLUGIN.md +2 -2
  29. package/payload/platform/plugins/whatsapp/mcp/dist/__tests__/config-forwards-every-declared-field.test.d.ts +2 -0
  30. package/payload/platform/plugins/whatsapp/mcp/dist/__tests__/config-forwards-every-declared-field.test.d.ts.map +1 -0
  31. package/payload/platform/plugins/whatsapp/mcp/dist/__tests__/config-forwards-every-declared-field.test.js +57 -0
  32. package/payload/platform/plugins/whatsapp/mcp/dist/__tests__/config-forwards-every-declared-field.test.js.map +1 -0
  33. package/payload/platform/plugins/whatsapp/mcp/dist/__tests__/deliverability-grounding.test.js +9 -2
  34. package/payload/platform/plugins/whatsapp/mcp/dist/__tests__/deliverability-grounding.test.js.map +1 -1
  35. package/payload/platform/plugins/whatsapp/mcp/dist/index.js +8 -3
  36. package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
  37. package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +3 -3
  38. package/payload/platform/plugins/whatsapp/skills/manage-whatsapp-config/SKILL.md +3 -1
  39. package/payload/platform/scripts/__tests__/check-plugin-tool-declarations.test.ts +51 -0
  40. package/payload/platform/scripts/check-no-live-location-claims.mjs +73 -0
  41. package/payload/platform/scripts/check-plugin-tool-declarations.mjs +97 -0
  42. package/payload/platform/scripts/check-risk-class.mjs +5 -0
  43. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  44. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +8 -0
  45. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  46. package/payload/platform/services/claude-session-manager/dist/channel-targets.d.ts +3 -0
  47. package/payload/platform/services/claude-session-manager/dist/channel-targets.d.ts.map +1 -1
  48. package/payload/platform/services/claude-session-manager/dist/channel-targets.js.map +1 -1
  49. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  50. package/payload/platform/services/claude-session-manager/dist/http-server.js +20 -1
  51. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  52. package/payload/platform/services/claude-session-manager/dist/index.js +76 -46
  53. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  54. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  55. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +57 -8
  56. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  57. package/payload/platform/services/claude-session-manager/dist/public-knowledge-audit.d.ts +58 -0
  58. package/payload/platform/services/claude-session-manager/dist/public-knowledge-audit.d.ts.map +1 -0
  59. package/payload/platform/services/claude-session-manager/dist/public-knowledge-audit.js +152 -0
  60. package/payload/platform/services/claude-session-manager/dist/public-knowledge-audit.js.map +1 -0
  61. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.d.ts +4 -0
  62. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.d.ts.map +1 -1
  63. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.js +3 -0
  64. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.js.map +1 -1
  65. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +40 -3
  66. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  67. package/payload/platform/services/whatsapp-channel/dist/notification.js +43 -4
  68. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  69. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  70. package/payload/platform/services/whatsapp-channel/dist/server.js +41 -25
  71. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  72. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts +1 -0
  73. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts.map +1 -1
  74. package/payload/platform/services/whatsapp-channel/dist/targets.js +9 -5
  75. package/payload/platform/services/whatsapp-channel/dist/targets.js.map +1 -1
  76. package/payload/server/{chunk-BP7LH7MC.js → chunk-CKTHAHL4.js} +26 -16
  77. package/payload/server/{chunk-IALJPXIO.js → chunk-ERIM3EFB.js} +1 -1
  78. package/payload/server/{chunk-S4FIEM3L.js → chunk-HZP7BKBF.js} +64 -98
  79. package/payload/server/{manager-5QV2EAZ2.js → manager-CM55K4J2.js} +2 -2
  80. package/payload/server/maxy-edge.js +2 -2
  81. package/payload/server/public/activity.html +5 -5
  82. package/payload/server/public/agents.html +4 -4
  83. package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js +1 -0
  84. package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js.br +0 -0
  85. package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js.gz +0 -0
  86. package/payload/server/public/assets/AdminShell-DJL5DzRX.js +2 -0
  87. package/payload/server/public/assets/AdminShell-DJL5DzRX.js.br +0 -0
  88. package/payload/server/public/assets/AdminShell-DJL5DzRX.js.gz +0 -0
  89. package/payload/server/public/assets/activity-CpMnNr5c.js +1 -0
  90. package/payload/server/public/assets/activity-CpMnNr5c.js.br +0 -0
  91. package/payload/server/public/assets/activity-CpMnNr5c.js.gz +0 -0
  92. package/payload/server/public/assets/admin-CBwKIfaI.js +1 -0
  93. package/payload/server/public/assets/admin-CBwKIfaI.js.br +0 -0
  94. package/payload/server/public/assets/admin-CBwKIfaI.js.gz +0 -0
  95. package/payload/server/public/assets/agents-C4LmSKjb.js +1 -0
  96. package/payload/server/public/assets/agents-C4LmSKjb.js.br +0 -0
  97. package/payload/server/public/assets/agents-C4LmSKjb.js.gz +0 -0
  98. package/payload/server/public/assets/browser-Bm9xm_yc.js +1 -0
  99. package/payload/server/public/assets/browser-Bm9xm_yc.js.br +0 -0
  100. package/payload/server/public/assets/browser-Bm9xm_yc.js.gz +0 -0
  101. package/payload/server/public/assets/calendar-CNY9FTWe.js +1 -0
  102. package/payload/server/public/assets/calendar-CNY9FTWe.js.br +0 -0
  103. package/payload/server/public/assets/calendar-CNY9FTWe.js.gz +0 -0
  104. package/payload/server/public/assets/chat-3WoUGCTd.js +1 -0
  105. package/payload/server/public/assets/chat-3WoUGCTd.js.br +0 -0
  106. package/payload/server/public/assets/chat-3WoUGCTd.js.gz +0 -0
  107. package/payload/server/public/assets/chevron-left-BE16BJnw.js +1 -0
  108. package/payload/server/public/assets/chevron-left-BE16BJnw.js.br +0 -0
  109. package/payload/server/public/assets/chevron-right-Bu2VKpeU.js +1 -0
  110. package/payload/server/public/assets/chevron-right-Bu2VKpeU.js.br +0 -0
  111. package/payload/server/public/assets/clock-C4Nu2aRV.js +1 -0
  112. package/payload/server/public/assets/clock-C4Nu2aRV.js.br +0 -0
  113. package/payload/server/public/assets/copy-3kj9Oaoc.js +1 -0
  114. package/payload/server/public/assets/copy-3kj9Oaoc.js.br +0 -0
  115. package/payload/server/public/assets/copy-3kj9Oaoc.js.gz +0 -0
  116. package/payload/server/public/assets/data-C-x5EHyi.js +1 -0
  117. package/payload/server/public/assets/data-C-x5EHyi.js.br +1 -0
  118. package/payload/server/public/assets/data-C-x5EHyi.js.gz +0 -0
  119. package/payload/server/public/assets/file-text-CBaewT76.js +1 -0
  120. package/payload/server/public/assets/file-text-CBaewT76.js.br +0 -0
  121. package/payload/server/public/assets/file-text-CBaewT76.js.gz +0 -0
  122. package/payload/server/public/assets/{graph-C8cQ6Nqf.js → graph-B8-e2_Z-.js} +3 -3
  123. package/payload/server/public/assets/graph-B8-e2_Z-.js.br +0 -0
  124. package/payload/server/public/assets/graph-B8-e2_Z-.js.gz +0 -0
  125. package/payload/server/public/assets/graph-labels-Bsc23eZU.js +1 -0
  126. package/payload/server/public/assets/graph-labels-Bsc23eZU.js.br +0 -0
  127. package/payload/server/public/assets/graph-labels-Bsc23eZU.js.gz +0 -0
  128. package/payload/server/public/assets/operator-Cve0-qfO.js +1 -0
  129. package/payload/server/public/assets/operator-Cve0-qfO.js.br +0 -0
  130. package/payload/server/public/assets/operator-Cve0-qfO.js.gz +0 -0
  131. package/payload/server/public/assets/page-BgVMs6Vf.js +1 -0
  132. package/payload/server/public/assets/page-BgVMs6Vf.js.br +0 -0
  133. package/payload/server/public/assets/page-BgVMs6Vf.js.gz +0 -0
  134. package/payload/server/public/assets/page-fABub-w8.js +32 -0
  135. package/payload/server/public/assets/page-fABub-w8.js.br +0 -0
  136. package/payload/server/public/assets/page-fABub-w8.js.gz +0 -0
  137. package/payload/server/public/assets/play-B6zXB9K7.js +1 -0
  138. package/payload/server/public/assets/play-B6zXB9K7.js.br +0 -0
  139. package/payload/server/public/assets/play-B6zXB9K7.js.gz +0 -0
  140. package/payload/server/public/assets/public--R2DbdWs.js +1 -0
  141. package/payload/server/public/assets/public--R2DbdWs.js.br +0 -0
  142. package/payload/server/public/assets/public--R2DbdWs.js.gz +0 -0
  143. package/payload/server/public/assets/rotate-ccw-FZW7c8p8.js +1 -0
  144. package/payload/server/public/assets/rotate-ccw-FZW7c8p8.js.br +0 -0
  145. package/payload/server/public/assets/rotate-ccw-FZW7c8p8.js.gz +0 -0
  146. package/payload/server/public/assets/routines-BpZs2SaT.js +2 -0
  147. package/payload/server/public/assets/routines-BpZs2SaT.js.br +0 -0
  148. package/payload/server/public/assets/routines-BpZs2SaT.js.gz +0 -0
  149. package/payload/server/public/assets/skills-DF7uyEEz.js +1 -0
  150. package/payload/server/public/assets/skills-DF7uyEEz.js.br +0 -0
  151. package/payload/server/public/assets/skills-DF7uyEEz.js.gz +0 -0
  152. package/payload/server/public/assets/tasks-BfJJmoWO.js +3 -0
  153. package/payload/server/public/assets/tasks-BfJJmoWO.js.br +0 -0
  154. package/payload/server/public/assets/tasks-BfJJmoWO.js.gz +0 -0
  155. package/payload/server/public/assets/triangle-alert-CR-jRJdI.js +1 -0
  156. package/payload/server/public/assets/triangle-alert-CR-jRJdI.js.br +0 -0
  157. package/payload/server/public/assets/triangle-alert-CR-jRJdI.js.gz +0 -0
  158. package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js +1 -0
  159. package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js.br +0 -0
  160. package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js.gz +0 -0
  161. package/payload/server/public/assets/{useSubAccountSwitcher-C7TtIbR3.js → useMediaQuery-CA6dR5iz.js} +1 -1
  162. package/payload/server/public/assets/useMediaQuery-CA6dR5iz.js.br +0 -0
  163. package/payload/server/public/assets/{useSubAccountSwitcher-C7TtIbR3.js.gz → useMediaQuery-CA6dR5iz.js.gz} +0 -0
  164. package/payload/server/public/assets/{useSubAccountSwitcher-DCkivCBS.css → useMediaQuery-DpwgV1Da.css} +1 -1
  165. package/payload/server/public/assets/useMediaQuery-DpwgV1Da.css.br +0 -0
  166. package/payload/server/public/assets/{useSubAccountSwitcher-DCkivCBS.css.gz → useMediaQuery-DpwgV1Da.css.gz} +0 -0
  167. package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js +2 -0
  168. package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js.br +0 -0
  169. package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js.gz +0 -0
  170. package/payload/server/public/assets/wrench-CpCOYUBc.js +1 -0
  171. package/payload/server/public/assets/wrench-CpCOYUBc.js.br +0 -0
  172. package/payload/server/public/assets/wrench-CpCOYUBc.js.gz +0 -0
  173. package/payload/server/public/browser.html +4 -4
  174. package/payload/server/public/calendar.html +8 -8
  175. package/payload/server/public/chat.html +13 -13
  176. package/payload/server/public/data.html +11 -11
  177. package/payload/server/public/graph.html +9 -9
  178. package/payload/server/public/index.html +14 -14
  179. package/payload/server/public/operator.html +14 -14
  180. package/payload/server/public/public.html +13 -13
  181. package/payload/server/public/routines.html +6 -6
  182. package/payload/server/public/skills.html +5 -5
  183. package/payload/server/public/tasks.html +6 -6
  184. package/payload/server/server.js +329 -104
  185. package/payload/server/public/assets/AdminLoginScreens-BpHnjHp_.js +0 -1
  186. package/payload/server/public/assets/AdminLoginScreens-BpHnjHp_.js.br +0 -0
  187. package/payload/server/public/assets/AdminLoginScreens-BpHnjHp_.js.gz +0 -0
  188. package/payload/server/public/assets/AdminShell-D24evn4t.js +0 -2
  189. package/payload/server/public/assets/AdminShell-D24evn4t.js.br +0 -0
  190. package/payload/server/public/assets/AdminShell-D24evn4t.js.gz +0 -0
  191. package/payload/server/public/assets/activity-ZVUTB5uZ.js +0 -1
  192. package/payload/server/public/assets/activity-ZVUTB5uZ.js.br +0 -0
  193. package/payload/server/public/assets/activity-ZVUTB5uZ.js.gz +0 -0
  194. package/payload/server/public/assets/admin-XJqQz3QJ.js +0 -1
  195. package/payload/server/public/assets/admin-XJqQz3QJ.js.br +0 -0
  196. package/payload/server/public/assets/admin-XJqQz3QJ.js.gz +0 -0
  197. package/payload/server/public/assets/agents-Dc9SNC9N.js +0 -1
  198. package/payload/server/public/assets/agents-Dc9SNC9N.js.br +0 -0
  199. package/payload/server/public/assets/agents-Dc9SNC9N.js.gz +0 -0
  200. package/payload/server/public/assets/browser-CCedMIga.js +0 -1
  201. package/payload/server/public/assets/browser-CCedMIga.js.br +0 -0
  202. package/payload/server/public/assets/browser-CCedMIga.js.gz +0 -0
  203. package/payload/server/public/assets/calendar-BDoMLP2j.js +0 -1
  204. package/payload/server/public/assets/calendar-BDoMLP2j.js.br +0 -0
  205. package/payload/server/public/assets/calendar-BDoMLP2j.js.gz +0 -0
  206. package/payload/server/public/assets/chat-BAhoqTY9.js +0 -1
  207. package/payload/server/public/assets/chat-BAhoqTY9.js.br +0 -0
  208. package/payload/server/public/assets/chat-BAhoqTY9.js.gz +0 -0
  209. package/payload/server/public/assets/chevron-left-NGLHgPjF.js +0 -1
  210. package/payload/server/public/assets/chevron-right-B4B7OkG8.js +0 -1
  211. package/payload/server/public/assets/chevron-right-B4B7OkG8.js.br +0 -0
  212. package/payload/server/public/assets/clock-7IMwxJdH.js +0 -1
  213. package/payload/server/public/assets/clock-7IMwxJdH.js.br +0 -0
  214. package/payload/server/public/assets/clock-7IMwxJdH.js.gz +0 -0
  215. package/payload/server/public/assets/copy-PkR4EFD6.js +0 -1
  216. package/payload/server/public/assets/copy-PkR4EFD6.js.br +0 -0
  217. package/payload/server/public/assets/copy-PkR4EFD6.js.gz +0 -0
  218. package/payload/server/public/assets/data-yQYhw2IR.js +0 -1
  219. package/payload/server/public/assets/data-yQYhw2IR.js.br +0 -1
  220. package/payload/server/public/assets/data-yQYhw2IR.js.gz +0 -0
  221. package/payload/server/public/assets/file-text-BA9p7TLU.js +0 -1
  222. package/payload/server/public/assets/file-text-BA9p7TLU.js.br +0 -0
  223. package/payload/server/public/assets/file-text-BA9p7TLU.js.gz +0 -0
  224. package/payload/server/public/assets/graph-C8cQ6Nqf.js.br +0 -0
  225. package/payload/server/public/assets/graph-C8cQ6Nqf.js.gz +0 -0
  226. package/payload/server/public/assets/graph-labels-CiK412vE.js +0 -1
  227. package/payload/server/public/assets/graph-labels-CiK412vE.js.br +0 -0
  228. package/payload/server/public/assets/graph-labels-CiK412vE.js.gz +0 -0
  229. package/payload/server/public/assets/operator-CaQAEUBu.js +0 -1
  230. package/payload/server/public/assets/operator-CaQAEUBu.js.br +0 -0
  231. package/payload/server/public/assets/operator-CaQAEUBu.js.gz +0 -0
  232. package/payload/server/public/assets/page-CpJpyoPS.js +0 -32
  233. package/payload/server/public/assets/page-CpJpyoPS.js.br +0 -0
  234. package/payload/server/public/assets/page-CpJpyoPS.js.gz +0 -0
  235. package/payload/server/public/assets/page-D0ShNyGE.js +0 -1
  236. package/payload/server/public/assets/page-D0ShNyGE.js.br +0 -0
  237. package/payload/server/public/assets/page-D0ShNyGE.js.gz +0 -0
  238. package/payload/server/public/assets/play-huZpq9ra.js +0 -1
  239. package/payload/server/public/assets/play-huZpq9ra.js.br +0 -0
  240. package/payload/server/public/assets/play-huZpq9ra.js.gz +0 -0
  241. package/payload/server/public/assets/public--8RWWGjF.js +0 -1
  242. package/payload/server/public/assets/public--8RWWGjF.js.br +0 -0
  243. package/payload/server/public/assets/public--8RWWGjF.js.gz +0 -0
  244. package/payload/server/public/assets/rotate-ccw-g7l4ZSR3.js +0 -1
  245. package/payload/server/public/assets/rotate-ccw-g7l4ZSR3.js.br +0 -0
  246. package/payload/server/public/assets/rotate-ccw-g7l4ZSR3.js.gz +0 -0
  247. package/payload/server/public/assets/routines-DzFcPNMb.js +0 -2
  248. package/payload/server/public/assets/routines-DzFcPNMb.js.br +0 -0
  249. package/payload/server/public/assets/routines-DzFcPNMb.js.gz +0 -0
  250. package/payload/server/public/assets/skills-5vl_Bt9U.js +0 -1
  251. package/payload/server/public/assets/skills-5vl_Bt9U.js.br +0 -0
  252. package/payload/server/public/assets/skills-5vl_Bt9U.js.gz +0 -0
  253. package/payload/server/public/assets/tasks-DQHtJ8Pq.js +0 -3
  254. package/payload/server/public/assets/tasks-DQHtJ8Pq.js.br +0 -0
  255. package/payload/server/public/assets/tasks-DQHtJ8Pq.js.gz +0 -0
  256. package/payload/server/public/assets/triangle-alert-Cy4Z0uFv.js +0 -1
  257. package/payload/server/public/assets/triangle-alert-Cy4Z0uFv.js.br +0 -0
  258. package/payload/server/public/assets/triangle-alert-Cy4Z0uFv.js.gz +0 -0
  259. package/payload/server/public/assets/useCopyFeedback-BwK1RhmF.js +0 -1
  260. package/payload/server/public/assets/useCopyFeedback-BwK1RhmF.js.br +0 -0
  261. package/payload/server/public/assets/useCopyFeedback-BwK1RhmF.js.gz +0 -0
  262. package/payload/server/public/assets/useSubAccountSwitcher-C7TtIbR3.js.br +0 -0
  263. package/payload/server/public/assets/useSubAccountSwitcher-DCkivCBS.css.br +0 -0
  264. package/payload/server/public/assets/useVoiceRecorder-DgyAGgmF.js +0 -2
  265. package/payload/server/public/assets/useVoiceRecorder-DgyAGgmF.js.br +0 -0
  266. package/payload/server/public/assets/useVoiceRecorder-DgyAGgmF.js.gz +0 -0
  267. package/payload/server/public/assets/wrench-CICORrSc.js +0 -1
  268. package/payload/server/public/assets/wrench-CICORrSc.js.br +0 -0
  269. package/payload/server/public/assets/wrench-CICORrSc.js.gz +0 -0
@@ -89,8 +89,24 @@ var TELEGRAM_ADMIN_WEBHOOK_SECRET_FILE = resolve(MAXY_DIR, ".telegram-admin-webh
89
89
  var VISITOR_TOKEN_SECRET_FILE = resolve(MAXY_DIR, "credentials", "visitor-token-secret");
90
90
  var CLAUDE_CREDENTIALS_FILE = resolve(MAXY_DIR, ".claude", ".credentials.json");
91
91
 
92
- // app/lib/system-path-slugs.ts
92
+ // ../lib/agent-slug/src/index.ts
93
93
  var SYSTEM_PATH_SLUGS = ["public", "public-chat", "chat", "graph", "data", "browser"];
94
+ var RESERVED_AGENT_SLUGS = [
95
+ "admin",
96
+ "api",
97
+ "assets",
98
+ "agent-assets",
99
+ "brand",
100
+ "bot",
101
+ "privacy"
102
+ ];
103
+ var AGENT_SLUG_PATTERN = /^[a-z][a-z0-9-]{2,49}$/;
104
+ function checkAgentSlug(slug) {
105
+ if (!AGENT_SLUG_PATTERN.test(slug)) return { ok: false, reason: "shape" };
106
+ if (RESERVED_AGENT_SLUGS.includes(slug)) return { ok: false, reason: "reserved" };
107
+ if (SYSTEM_PATH_SLUGS.includes(slug)) return { ok: false, reason: "shadowed" };
108
+ return { ok: true };
109
+ }
94
110
 
95
111
  // app/lib/claude-agent/account.ts
96
112
  import { resolve as resolve2 } from "path";
@@ -258,20 +274,13 @@ function readAgentFile(accountDir, agentName, filename) {
258
274
  }
259
275
  return raw;
260
276
  }
261
- var RESERVED_SLUGS = /* @__PURE__ */ new Set(["admin", "api", "assets", "agent-assets", "brand", "bot", "privacy"]);
262
- var SHADOWED_SLUGS = new Set(SYSTEM_PATH_SLUGS);
263
- var SLUG_PATTERN = /^[a-z][a-z0-9-]{2,49}$/;
264
277
  function validateAgentSlug(slug) {
265
- if (!SLUG_PATTERN.test(slug)) return false;
266
- if (RESERVED_SLUGS.has(slug)) {
267
- console.error(`[agent-slug] op=reject slug=${slug} reason=reserved`);
268
- return false;
278
+ const verdict = checkAgentSlug(slug);
279
+ if (verdict.ok) return true;
280
+ if (verdict.reason !== "shape") {
281
+ console.error(`[agent-slug] op=reject slug=${slug} reason=${verdict.reason}`);
269
282
  }
270
- if (SHADOWED_SLUGS.has(slug)) {
271
- console.error(`[agent-slug] op=reject slug=${slug} reason=shadowed`);
272
- return false;
273
- }
274
- return true;
283
+ return false;
275
284
  }
276
285
  function resolveDefaultAgentSlug(accountDir) {
277
286
  const configPath = resolve2(accountDir, "account.json");
@@ -2002,7 +2011,7 @@ async function projectAgent(accountId, accountDir, slug) {
2002
2011
  console.error(
2003
2012
  `[agent-graph] project FAILED slug=${slug} account=${account8} error="${msg}"`
2004
2013
  );
2005
- return;
2014
+ return { nodesWritten: 0 };
2006
2015
  }
2007
2016
  const agentDir = resolve3(accountDir, "agents", slug);
2008
2017
  const configPath = resolve3(agentDir, "config.json");
@@ -2013,7 +2022,7 @@ async function projectAgent(accountId, accountDir, slug) {
2013
2022
  console.error(
2014
2023
  `[agent-graph] project FAILED slug=${slug} account=${account8} error="config.json missing at ${configPath}"`
2015
2024
  );
2016
- return;
2025
+ return { nodesWritten: 0 };
2017
2026
  }
2018
2027
  config = JSON.parse(readFileSync5(configPath, "utf-8"));
2019
2028
  for (const { filename, role } of AGENT_FILE_ROLES) {
@@ -2027,7 +2036,7 @@ async function projectAgent(accountId, accountDir, slug) {
2027
2036
  console.error(
2028
2037
  `[agent-graph] project FAILED slug=${slug} account=${account8} error="${msg}"`
2029
2038
  );
2030
- return;
2039
+ return { nodesWritten: 0 };
2031
2040
  }
2032
2041
  const session = getSession();
2033
2042
  try {
@@ -2093,6 +2102,7 @@ async function projectAgent(accountId, accountDir, slug) {
2093
2102
  console.error(
2094
2103
  `[agent-graph] project slug=${slug} account=${account8} docs=${presentRoles.length} uses=${usesCount} ms=${ms}`
2095
2104
  );
2105
+ return { nodesWritten: 1 + presentRoles.length };
2096
2106
  } catch (err) {
2097
2107
  const msg = err instanceof Error ? err.message : String(err);
2098
2108
  console.error(
@@ -12,7 +12,7 @@ import {
12
12
  getConversationOwner,
13
13
  isValidAccountId,
14
14
  registerLoop
15
- } from "./chunk-BP7LH7MC.js";
15
+ } from "./chunk-CKTHAHL4.js";
16
16
 
17
17
  // node_modules/hono/dist/compose.js
18
18
  var compose = (middleware, onError, onNotFound) => {
@@ -8,7 +8,10 @@ import {
8
8
  getUserTimezone,
9
9
  isValidAccountId,
10
10
  registerLoop
11
- } from "./chunk-BP7LH7MC.js";
11
+ } from "./chunk-CKTHAHL4.js";
12
+
13
+ // app/lib/whatsapp/manager.ts
14
+ import { randomUUID as randomUUID5 } from "crypto";
12
15
 
13
16
  // app/lib/whatsapp/schema.ts
14
17
  import { z } from "zod";
@@ -69,7 +72,18 @@ var WhatsAppConfigSchema = z.object({
69
72
  // match a malformed row (so it can never reach a log line or the spawn
70
73
  // env), and the /rc-spawn body guard re-checks. `.strict()` stays — an
71
74
  // unknown key inside the entry IS recoverable by the tolerant parser.
72
- z.object({ account: z.string(), party: z.string() }).strict()
75
+ z.object({
76
+ account: z.string(),
77
+ party: z.string(),
78
+ // Task 2292 — `.catch(undefined)`, never a bare `z.boolean()`. Once
79
+ // `dispatch` is a KNOWN key, a hand-edited non-boolean is an
80
+ // `invalid_type` issue, and the tolerant parser recovers only from
81
+ // `unrecognized_keys` — so a strict type here would fail the whole
82
+ // parse and empty routing install-wide, the exact outage class the
83
+ // `party` comment above describes. `.catch` keeps the declared type
84
+ // and reads a bad value as absent, which dispatches.
85
+ dispatch: z.boolean().optional().catch(void 0)
86
+ }).strict()
73
87
  ).optional().describe("Registered non-operator counterparties: E.164 phone \u2192 { account, party }. The sender is admitted to the PUBLIC agent on that account's own number, carrying the label; they are never granted admin, which is what separates this from accountManagers. Reached on the house number they take the normal DM policy instead. 'party' is an operator-chosen label (e.g. 'driver'), lowercase letters, digits and hyphens, 1-64 characters; the platform carries it and never interprets it. Managed via add-registered-party / remove-registered-party. A phone here must not also be in adminPhones or accountManagers. Read only from the account whose account.json the manager loads its config from (the house); add-registered-party is refused on any other account, and a map left there is inert and purged at boot."),
74
88
  allowFrom: z.array(z.string()).optional().describe("Phone numbers allowed to message the public agent when DM policy is 'allowlist'. Add '*' for open access. Does not affect admin routing \u2014 use adminPhones for that."),
75
89
  sendReadReceipts: z.boolean().optional().default(true).describe("Whether to send read receipts (blue ticks) when messages are received. Disabling may feel less responsive but preserves privacy."),
@@ -1434,95 +1448,10 @@ function formatLiveLocationPayloadLine(msg) {
1434
1448
  const thumbBytes = live.jpegThumbnail ? live.jpegThumbnail.length : 0;
1435
1449
  return `${WIRE_TAG3} op=live-location-payload msgKeyId=${msg.key?.id ?? "none"} seq=${num(live.sequenceNumber)} timeOffsetS=${num(live.timeOffset)} accuracyM=${num(live.accuracyInMeters)} speedMps=${num(live.speedInMps)} headingDeg=${num(live.degreesClockwiseFromMagneticNorth)} captionBytes=${captionBytes} thumbBytes=${thumbBytes} envDurationS=${num(msg.duration)} envFinal=${msg.finalLiveLocation ? "yes" : "no"}`;
1436
1450
  }
1437
- function liveLocationTargetJid(msg) {
1438
- if (msg.key?.fromMe) return null;
1439
- const remoteJid = msg.key?.remoteJid;
1440
- if (!remoteJid) return null;
1441
- return remoteJid.endsWith("@g.us") ? msg.key?.participant ?? remoteJid : remoteJid;
1442
- }
1443
1451
  function formatMessageUpdateLine(u) {
1444
1452
  const names = u.update ? Object.keys(u.update) : [];
1445
1453
  return `${WIRE_TAG3} op=message-update msgKeyId=${u.key?.id ?? "none"} fields=${names.length ? names.join(",") : "none"}`;
1446
1454
  }
1447
- function formatSubscribeReplyLine(account, jid, reply) {
1448
- const head = `${WIRE_TAG3} op=live-location-subscribe-reply account=${account} jid=${jid}`;
1449
- if (!reply || typeof reply !== "object") {
1450
- return `${head} type=no-reply from=none children=`;
1451
- }
1452
- const node = reply;
1453
- const attrs = node.attrs ?? {};
1454
- const children = Array.isArray(node.content) ? node.content.map((c) => {
1455
- const child = c ?? {};
1456
- const ca = child.attrs ?? {};
1457
- const pairs = Object.keys(ca).map((k) => `${k}=${String(ca[k])}`).join(",");
1458
- return `${child.tag ?? "none"}${pairs ? `[${pairs}]` : ""}`;
1459
- }).join(" ").slice(0, 200) : "";
1460
- return `${head} type=${attrs.type ?? "none"} from=${attrs.from ?? "none"} children=${children}`;
1461
- }
1462
-
1463
- // app/lib/whatsapp/live-location.ts
1464
- var WIRE_TAG4 = "[whatsapp:wire]";
1465
- var REARM_MS = 3e4;
1466
- var SILENCE_MS = 9e4;
1467
- var subscriptions = /* @__PURE__ */ new Map();
1468
- var keyOf = (account, jid) => `${account}:${jid}`;
1469
- function sendEnrolment(sock, account, jid) {
1470
- const node = {
1471
- tag: "iq",
1472
- attrs: { xmlns: "location", type: "get", to: "s.whatsapp.net", target: jid },
1473
- content: [{ tag: "subscribe", attrs: { participants: "true" } }]
1474
- };
1475
- Promise.resolve(sock.query(node)).then((reply) => {
1476
- console.error(formatSubscribeReplyLine(account, jid, reply));
1477
- }).catch((err) => {
1478
- console.error(
1479
- `${WIRE_TAG4} op=live-location-subscribe account=${account} jid=${jid} outcome=fail reason=${(err instanceof Error ? err.message : String(err)).slice(0, 120)}`
1480
- );
1481
- });
1482
- }
1483
- function subscribeLiveLocation(sock, account, jid) {
1484
- const key = keyOf(account, jid);
1485
- const existing = subscriptions.get(key);
1486
- if (existing) {
1487
- existing.lastSeenAt = Date.now();
1488
- return;
1489
- }
1490
- const timer = setInterval(() => {
1491
- const sub = subscriptions.get(key);
1492
- if (!sub) return;
1493
- if (Date.now() - sub.lastSeenAt >= SILENCE_MS) {
1494
- console.error(
1495
- `${WIRE_TAG4} op=live-location-subscribe account=${account} jid=${jid} outcome=stopped reason=silence`
1496
- );
1497
- stopLiveLocation(account, jid);
1498
- return;
1499
- }
1500
- sendEnrolment(sock, account, jid);
1501
- }, REARM_MS);
1502
- subscriptions.set(key, { timer, lastSeenAt: Date.now(), account });
1503
- console.error(
1504
- `${WIRE_TAG4} op=live-location-subscribe account=${account} jid=${jid} outcome=armed rearmMs=${REARM_MS}`
1505
- );
1506
- sendEnrolment(sock, account, jid);
1507
- }
1508
- function noteMessageFrom(account, jid) {
1509
- const sub = subscriptions.get(keyOf(account, jid));
1510
- if (sub) sub.lastSeenAt = Date.now();
1511
- }
1512
- function stopLiveLocation(account, jid) {
1513
- const key = keyOf(account, jid);
1514
- const sub = subscriptions.get(key);
1515
- if (!sub) return;
1516
- clearInterval(sub.timer);
1517
- subscriptions.delete(key);
1518
- }
1519
- function stopLiveLocationForAccount(account) {
1520
- for (const [key, sub] of [...subscriptions]) {
1521
- if (sub.account !== account) continue;
1522
- clearInterval(sub.timer);
1523
- subscriptions.delete(key);
1524
- }
1525
- }
1526
1455
 
1527
1456
  // app/lib/whatsapp/inbound/reaction.ts
1528
1457
  function toMillis(v) {
@@ -1803,11 +1732,40 @@ function registeredPartyFor(registeredParties, phone) {
1803
1732
  for (const [partyPhone, entry2] of Object.entries(registeredParties)) {
1804
1733
  if (!entry2 || !entry2.account || typeof entry2.party !== "string") continue;
1805
1734
  if (!PARTY_LABEL_PATTERN.test(entry2.party)) continue;
1806
- if (phonesMatch(partyPhone, phone)) return { account: entry2.account, party: entry2.party };
1735
+ if (phonesMatch(partyPhone, phone)) {
1736
+ const dispatch = typeof entry2.dispatch === "boolean" ? entry2.dispatch : void 0;
1737
+ return dispatch === void 0 ? { account: entry2.account, party: entry2.party } : { account: entry2.account, party: entry2.party, dispatch };
1738
+ }
1807
1739
  }
1808
1740
  return null;
1809
1741
  }
1810
1742
 
1743
+ // app/lib/whatsapp/inbound/party-dispatch.ts
1744
+ function partyDispatchAllowed(entry2) {
1745
+ return entry2?.dispatch !== false;
1746
+ }
1747
+ function formatPartyDispatchLine(p) {
1748
+ return `[whatsapp:party] op=dispatch-decision inboundId=${p.inboundId ?? ""} account=${p.accountId.slice(0, 8)} sender=${p.senderPhone} party=${p.party} dispatch=${p.dispatch} spawned=${p.spawned ? 1 : 0}`;
1749
+ }
1750
+ var labelledInbounds = 0;
1751
+ function noteLabelledInbound() {
1752
+ labelledInbounds += 1;
1753
+ }
1754
+ function readLabelledInbounds() {
1755
+ return labelledInbounds;
1756
+ }
1757
+ function buildPartyDispatchAudit(p) {
1758
+ const rows = Object.values(p.registeredParties);
1759
+ return {
1760
+ registrations: rows.length,
1761
+ suppressed: rows.filter((r) => !partyDispatchAllowed(r)).length,
1762
+ inbounds: readLabelledInbounds()
1763
+ };
1764
+ }
1765
+ function formatPartyDispatchAuditLine(a) {
1766
+ return `[whatsapp:party] op=party-dispatch-audit registrations=${a.registrations} suppressed=${a.suppressed} inbounds=${a.inbounds}`;
1767
+ }
1768
+
1811
1769
  // app/lib/whatsapp/inbound/access-control.ts
1812
1770
  function resolveAccountConfig(config, accountConfig) {
1813
1771
  return {
@@ -1879,7 +1837,8 @@ function checkDmAccess(params) {
1879
1837
  reason: "registered-party",
1880
1838
  agentType: "public",
1881
1839
  effectiveAccountId: accountId,
1882
- party: party.party
1840
+ party: party.party,
1841
+ partyDispatch: partyDispatchAllowed(party)
1883
1842
  };
1884
1843
  }
1885
1844
  switch (cfg.dmPolicy) {
@@ -3922,7 +3881,8 @@ function combineInboundBatch(entries) {
3922
3881
  const last = entries[entries.length - 1];
3923
3882
  const combinedText = entries.map((e) => e.text).filter(Boolean).join("\n");
3924
3883
  const media = entries.flatMap((e) => e.media);
3925
- return { ...last, text: combinedText, media };
3884
+ const msgIds = entries.flatMap((e) => e.msgIds ?? []);
3885
+ return { ...last, text: combinedText, media, msgIds };
3926
3886
  }
3927
3887
 
3928
3888
  // app/lib/whatsapp/opening-hours.ts
@@ -4172,7 +4132,8 @@ function buildNotifyPending(args) {
4172
4132
  var initialized = false;
4173
4133
  function dispatchInboundPayload(conn, payload) {
4174
4134
  if (!onInboundMessage) return;
4175
- decideDispatch(conn, payload, { config: whatsAppConfig, emit: onInboundMessage, log: (l) => console.error(l) });
4135
+ const dispatched = { ...payload, inboundId: randomUUID5().slice(0, 8) };
4136
+ decideDispatch(conn, dispatched, { config: whatsAppConfig, emit: onInboundMessage, log: (l) => console.error(l) });
4176
4137
  }
4177
4138
  function isObserveAccount(accountId) {
4178
4139
  return !shouldDispatchInbound(whatsAppConfig, accountId);
@@ -4720,7 +4681,6 @@ function watchForDisconnect(conn) {
4720
4681
  if (!conn.sock) return;
4721
4682
  conn.sock.ev.on("connection.update", (update) => {
4722
4683
  if (update.connection === "close") {
4723
- stopLiveLocationForAccount(conn.accountId);
4724
4684
  if (connections.get(conn.accountId) !== conn) return;
4725
4685
  console.error(`${TAG17} socket disconnected for account=${conn.accountId}`);
4726
4686
  conn.connected = false;
@@ -4871,11 +4831,6 @@ function monitorInbound(conn) {
4871
4831
  const extracted = extractMessage(msg);
4872
4832
  const liveLocationLine = formatLiveLocationPayloadLine(msg);
4873
4833
  if (liveLocationLine) console.error(liveLocationLine);
4874
- const liveTargetJid = liveLocationTargetJid(msg);
4875
- if (liveTargetJid) {
4876
- noteMessageFrom(conn.accountId, liveTargetJid);
4877
- if (liveLocationLine) subscribeLiveLocation(sock, conn.accountId, liveTargetJid);
4878
- }
4879
4834
  const mediaServable = !!(extracted.mediaType && extracted.mimetype);
4880
4835
  if (!extracted.text && !mediaServable && msg.key.id) {
4881
4836
  markDeclined({
@@ -5452,6 +5407,9 @@ async function handleInboundMessage(conn, msg) {
5452
5407
  // Task 2234 — the gate's registered-party label, undefined for every other
5453
5408
  // sender. Rides to the gateway and on to the spawn env.
5454
5409
  party: accessResult.party,
5410
+ // Task 2292 — the gate's per-party dispatch verdict. The router reads this,
5411
+ // never the config, so the gate and the suppression cannot disagree.
5412
+ partyDispatch: accessResult.partyDispatch,
5455
5413
  personId: accessResult.personId ?? null,
5456
5414
  senderPhone,
5457
5415
  text: extracted.text,
@@ -5468,7 +5426,11 @@ async function handleInboundMessage(conn, msg) {
5468
5426
  // Task 1575 — the gate's owner-self verdict. Only reason:'self-phone' is the
5469
5427
  // owner's own number; adminPhones/account-manager admits are other admins
5470
5428
  // and must not inherit the owner userId.
5471
- ownerSelfPhone: accessResult.reason === "self-phone"
5429
+ ownerSelfPhone: accessResult.reason === "self-phone",
5430
+ // Task 2281 — this stanza's own id, single-valued here. combineInboundBatch
5431
+ // replaces it with the batch's concatenation when the debouncer merges, so
5432
+ // one field carries both cases and no log site needs a fallback.
5433
+ msgIds: msg.key.id ? [msg.key.id] : []
5472
5434
  };
5473
5435
  if (accessResult.agentType === "public") {
5474
5436
  const hoursResult = await isBusinessOpen(conn.accountId);
@@ -5556,6 +5518,10 @@ export {
5556
5518
  managerPhonesForAccount,
5557
5519
  PARTY_LABEL_PATTERN,
5558
5520
  registeredPartyFor,
5521
+ formatPartyDispatchLine,
5522
+ noteLabelledInbound,
5523
+ buildPartyDispatchAudit,
5524
+ formatPartyDispatchAuditLine,
5559
5525
  resolveAccountConfig,
5560
5526
  isAdminPhone,
5561
5527
  buildPolicyInheritance,
@@ -30,8 +30,8 @@ import {
30
30
  startConnection,
31
31
  stopConnection,
32
32
  storeMessage
33
- } from "./chunk-S4FIEM3L.js";
34
- import "./chunk-BP7LH7MC.js";
33
+ } from "./chunk-HZP7BKBF.js";
34
+ import "./chunk-CKTHAHL4.js";
35
35
  import "./chunk-PFF6I7KP.js";
36
36
  export {
37
37
  buildNotifyPending,
@@ -19,12 +19,12 @@ import {
19
19
  screencastLog,
20
20
  vncLog,
21
21
  websockifyLog
22
- } from "./chunk-IALJPXIO.js";
22
+ } from "./chunk-ERIM3EFB.js";
23
23
  import {
24
24
  CDP_PORT,
25
25
  LOG_DIR,
26
26
  WEBSOCKIFY_PORT
27
- } from "./chunk-BP7LH7MC.js";
27
+ } from "./chunk-CKTHAHL4.js";
28
28
  import "./chunk-PFF6I7KP.js";
29
29
 
30
30
  // server/edge.ts
@@ -5,12 +5,12 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Activity — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/activity-ZVUTB5uZ.js"></script>
8
+ <script type="module" crossorigin src="/assets/activity-CpMnNr5c.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-C7TtIbR3.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-D24evn4t.js">
12
- <link rel="modulepreload" crossorigin href="/assets/triangle-alert-Cy4Z0uFv.js">
13
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-DCkivCBS.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-CA6dR5iz.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-DJL5DzRX.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/triangle-alert-CR-jRJdI.js">
13
+ <link rel="stylesheet" crossorigin href="/assets/useMediaQuery-DpwgV1Da.css">
14
14
  <link rel="stylesheet" href="/brand-defaults.css">
15
15
  </head>
16
16
  <body>
@@ -5,11 +5,11 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Agents — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/agents-Dc9SNC9N.js"></script>
8
+ <script type="module" crossorigin src="/assets/agents-C4LmSKjb.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-C7TtIbR3.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-D24evn4t.js">
12
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-DCkivCBS.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-CA6dR5iz.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-DJL5DzRX.js">
12
+ <link rel="stylesheet" crossorigin href="/assets/useMediaQuery-DpwgV1Da.css">
13
13
  <link rel="stylesheet" href="/brand-defaults.css">
14
14
  </head>
15
15
  <body>
@@ -0,0 +1 @@
1
+ import{o as e}from"./chunk-CltuBf4Z.js";import{H as t,J as n,K as r,Q as i,W as a,v as o}from"./useMediaQuery-CA6dR5iz.js";import{A as s}from"./useVoiceRecorder-DGhsN7nV.js";import{D as c,O as l,k as u,p as d}from"./AdminShell-DJL5DzRX.js";var f=e(i(),1);function p(e=`admin`){let[t,r]=(0,f.useState)(`loading`),[i,a]=(0,f.useState)(``),[o,c]=(0,f.useState)(``),[l,d]=(0,f.useState)(``),[p,m]=(0,f.useState)(!1),[h,g]=(0,f.useState)(!1),[_,v]=(0,f.useState)(!1),[y,b]=(0,f.useState)(!1),[x,S]=(0,f.useState)(!1),[C,w]=(0,f.useState)(null),[T,E]=(0,f.useState)(null),[D,O]=(0,f.useState)(void 0),[k,A]=(0,f.useState)(null),[j,M]=(0,f.useState)(void 0),[N,P]=(0,f.useState)(null),[F,I]=(0,f.useState)(null),[L,R]=(0,f.useState)(void 0),z=(0,f.useRef)(void 0),[B,V]=(0,f.useState)(!1),[H,U]=(0,f.useState)(!0);(0,f.useEffect)(()=>{typeof window>`u`||fetch(`/api/remote-auth/status`).then(e=>e.ok?e.json():null).then(e=>{e?.configured&&V(!0)}).catch(()=>{})},[]);let W=(0,f.useRef)(null),G=(0,f.useRef)(null);(0,f.useEffect)(()=>{async function e(){let e=null;try{e=sessionStorage.getItem(`maxy-admin-session-key`)}catch{}if(!e)return!1;try{let t=await fetch(`/api/admin/session?session_key=${encodeURIComponent(e)}`);if(t.status===401){try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}return!1}if(!t.ok)return!1;let n=await t.json();w(n.session_key),I(n.sessionId??null),O(n.businessName),A(n.role??null),M(n.userName===void 0?null:n.userName),P(n.avatar??null);let i=s(n.thinkingView);return z.current=i,R(i),r(`chat`),!0}catch(e){return console.error(`[admin] session restore failed:`,e),!1}}async function t(n=2){try{let i=await fetch(`/api/health`);if(!i.ok){if(n>0)return await new Promise(e=>setTimeout(e,1500)),t(n-1);console.error(`[admin] health check returned ${i.status} after retries`),r(`set-pin`);return}let a=await i.json();if(!a.pin_configured){r(`set-pin`);return}U(!!a.claude_authenticated);let o=!1;try{o=new URLSearchParams(window.location.search).get(`connect`)===`claude`}catch{}if(o){try{let e=new URL(window.location.href);e.searchParams.delete(`connect`),window.history.replaceState(null,``,e.pathname+e.search+e.hash)}catch{}if(!a.claude_authenticated){r(`connect-claude`);return}}if(await e())return;r(`enter-pin`)}catch(e){if(n>0)return await new Promise(e=>setTimeout(e,1500)),t(n-1);console.error(`[admin] health check failed:`,e),r(`set-pin`)}}t()},[]),(0,f.useEffect)(()=>{t===`chat`&&C&&fetch(`/api/admin/claude-info?session_key=${encodeURIComponent(C)}`).then(e=>{if(e.ok)return e.json()}).then(e=>{e&&E(e)}).catch(()=>{})},[t,C]);let K=(0,f.useRef)(null);(0,f.useEffect)(()=>{if(t!==`chat`)return;let e=setInterval(async()=>{try{let e=await fetch(`/api/health`);if(e.ok){let t=await e.json();U(t.auth_status!==`dead`&&t.auth_status!==`missing`)}}catch{}if(C)try{let e=await fetch(`/api/admin/session?session_key=${encodeURIComponent(C)}`);if(e.status!==401)return;let t=(await e.clone().json().catch(()=>null))?.code??`unknown-401`;if(t===`remote-auth-required`){n(`heartbeat`,`/api/admin/session`);return}console.warn(`[admin-auth] outcome=heartbeat-detected-expiry code=${t}`),K.current?.()}catch{}},300*1e3);return()=>clearInterval(e)},[t,C]),(0,f.useEffect)(()=>{t===`connect-claude`&&fetch(`/api/health`).then(e=>e.ok?e.json():null).then(e=>{e?.claude_authenticated&&(U(!0),r(`enter-pin`))}).catch(()=>{})},[t]);async function q(e,t){g(!0);try{let i=await fetch(`/api/admin/session`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({pin:e,...t?{accountId:t}:{}})});if(!i.ok){let e=await i.json().catch(()=>({}));if(i.status===401&&e?.code===`remote-auth-required`){n(`enter-pin`,`/api/admin/session`);return}d(e.error||`Invalid PIN`);return}let o=await i.json();w(o.session_key),I(o.sessionId??null),O(o.businessName),A(o.role??null),M(o.userName===void 0?null:o.userName),P(o.avatar??null);let c=s(o.thinkingView);z.current=c,R(c);try{sessionStorage.setItem(`maxy-admin-session-key`,o.session_key)}catch{}a(``),r(`chat`)}catch(e){console.error(`[admin] connection error:`,e),d(`Could not connect.`)}finally{g(!1)}}let J=(0,f.useCallback)(async e=>{if(e.preventDefault(),h)return;d(``);let t=o.trim();if(!t){d(`Please enter your name.`);return}if(i.length<4){d(`PIN must be at least 4 characters.`);return}let s=i;g(!0);try{let e=await fetch(`/api/onboarding/set-pin`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({pin:s,name:t})});if(!e.ok){let t=await e.json().catch(()=>({}));if(e.status===401&&t?.code===`remote-auth-required`){n(`set-pin`,`/api/onboarding/set-pin`);return}if(e.status===409){try{let e=await fetch(`/api/health`);if(e.ok){let n=await e.json();n.pin_configured&&n.claude_authenticated?r(`enter-pin`):n.pin_configured?r(`connect-claude`):d(t.error||`Failed to set PIN.`)}else r(`enter-pin`)}catch{r(`enter-pin`)}return}d(t.error||`Failed to set PIN.`);return}let i=await fetch(`/api/health`);if((i.ok?await i.json():null)?.claude_authenticated){await q(s);return}a(``),r(`connect-claude`)}catch(e){console.error(`[admin] connection error:`,e),d(`Could not connect.`)}finally{g(!1)}},[i,h,o]),Y=(0,f.useCallback)(async e=>{e.preventDefault(),d(``),await q(i)},[i]),X=(0,f.useCallback)(async()=>{S(!0);try{if(!await u())return console.warn(`[admin-ui] claude-disconnect not verified — credentials may persist; staying put`),!1;U(!1),w(null),A(null),M(void 0),P(null);try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}return r(`connect-claude`),!0}finally{S(!1)}},[]),Z=(0,f.useCallback)(()=>{w(null),A(null),M(void 0),P(null);try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}a(``),d(``),r(`enter-pin`)},[]);return(0,f.useEffect)(()=>{K.current=Z},[Z]),{appState:t,setAppState:r,pin:i,setPin:a,operatorName:o,setOperatorName:c,pinError:l,setPinError:d,showPin:p,setShowPin:m,pinLoading:h,authPolling:_,setAuthPolling:v,authLoading:y,setAuthLoading:b,disconnecting:x,cacheKey:C,setCacheKey:w,claudeInfo:T,setClaudeInfo:E,businessName:D,role:k,userName:j,userAvatar:N,sessionId:F,setSessionId:I,expandAll:L,setExpandAll:R,expandAllDefaultRef:z,remoteAuthEnabled:B,claudeConnected:H,pinInputRef:W,setPinFormRef:G,handleSetPin:J,handleLogin:Y,handleDisconnect:X,handleLogout:Z}}var m=r();function h({inputRef:e,value:t,onChange:n,onComplete:r,showPin:i,autoFocus:a}){let o=(0,f.useRef)([]);function s(e,r){r.key===`Backspace`?(r.preventDefault(),t[e]?n(t.slice(0,e)+t.slice(e+1)):e>0&&(n(t.slice(0,e-1)+t.slice(e)),o.current[e-1]?.focus())):r.key===`ArrowLeft`&&e>0?o.current[e-1]?.focus():r.key===`ArrowRight`&&e<5?o.current[e+1]?.focus():r.key===`Enter`&&(r.preventDefault(),r.currentTarget.form?.requestSubmit())}function c(e,i){let a=i.nativeEvent.data;if(!a||!/^\d$/.test(a))return;let s=t.split(``);for(s[e]=a;s.length<e;)s.push(``);let c=s.join(``).replace(/\D/g,``).slice(0,6);n(c),c.length===6?r?.(c):e<5&&o.current[e+1]?.focus()}function l(e){e.preventDefault();let t=e.clipboardData.getData(`text`).replace(/\D/g,``).slice(0,6);t&&(n(t),t.length===6?r?.(t):o.current[t.length]?.focus())}return(0,m.jsx)(`div`,{className:`pin-field`,children:Array.from({length:6}).map((n,r)=>(0,m.jsx)(`input`,{ref:t=>{o.current[r]=t,r===0&&e&&(e.current=t)},type:`text`,inputMode:`numeric`,className:`pin-box${t[r]?` pin-box-filled`:``}`,value:t[r]?i?t[r]:`•`:``,onKeyDown:e=>s(r,e),onInput:e=>c(r,e),onPaste:l,onFocus:e=>e.target.select(),autoFocus:a&&r===0,autoComplete:`off`,maxLength:1,"aria-label":`PIN digit ${r+1}`},r))})}function g(e){let{pin:n,setPin:r,showPin:i,setShowPin:o,pinLoading:s,pinError:u,pinInputRef:d,setPinFormRef:f,onSubmit:p,operatorName:g,setOperatorName:_}=e;return(0,m.jsx)(`div`,{className:`connect-page`,children:(0,m.jsxs)(`div`,{className:`connect-content`,children:[(0,m.jsx)(`img`,{src:a,alt:t.productName,className:`connect-logo connect-logo--maxy`}),!t.logoContainsName&&(0,m.jsxs)(`h1`,{className:`connect-title`,children:[`Welcome to `,t.productName]}),(0,m.jsxs)(`p`,{className:`connect-subtitle`,children:[`Tell `,t.productName,` who you are, then choose a PIN.`]}),(0,m.jsxs)(`form`,{ref:f,onSubmit:p,className:`connect-pin-form`,children:[(0,m.jsxs)(`div`,{className:`pin-input-row`,children:[(0,m.jsx)(`input`,{type:`text`,className:`connect-name-input`,placeholder:`Your full name`,value:g,onChange:e=>_(e.target.value),autoComplete:`name`,autoFocus:!0,required:!0,"aria-label":`Your full name`}),(0,m.jsx)(`div`,{style:{width:38,flexShrink:0},"aria-hidden":`true`})]}),(0,m.jsxs)(`div`,{className:`pin-input-row`,children:[(0,m.jsx)(h,{inputRef:d,value:n,onChange:r,onComplete:()=>{},showPin:i}),(0,m.jsx)(c,{variant:`send`,type:`submit`,disabled:!n||!g.trim(),loading:s,"aria-label":`Set PIN`,children:(0,m.jsxs)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,m.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`}),(0,m.jsx)(`polyline`,{points:`12 5 19 12 12 19`})]})})]}),(0,m.jsx)(l,{checked:i,onChange:()=>o(e=>!e),label:`Show PIN`})]}),u&&(0,m.jsx)(`p`,{className:`admin-pin-error`,children:u})]})})}function _(e){let{pin:n,setPin:r,showPin:i,setShowPin:o,pinLoading:s,pinError:u,pinInputRef:d,onSubmit:f,remoteAuthEnabled:p,onSignOutRemote:g}=e;return(0,m.jsxs)(`div`,{className:`connect-page`,children:[p&&g&&(0,m.jsx)(`button`,{type:`button`,className:`connect-signout`,onClick:g,children:`Sign out`}),(0,m.jsxs)(`div`,{className:`connect-content`,children:[(0,m.jsx)(`img`,{src:a,alt:t.productName,className:`connect-logo connect-logo--maxy`}),!t.logoContainsName&&(0,m.jsx)(`h1`,{className:`connect-title`,children:t.productName}),(0,m.jsxs)(`form`,{onSubmit:f,className:`connect-pin-form`,children:[(0,m.jsxs)(`div`,{className:`pin-input-row`,children:[(0,m.jsx)(h,{inputRef:d,value:n,onChange:r,onComplete:()=>{},showPin:i,autoFocus:!0}),(0,m.jsx)(c,{variant:`send`,type:`submit`,disabled:!n,loading:s,children:(0,m.jsxs)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,m.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`}),(0,m.jsx)(`polyline`,{points:`12 5 19 12 12 19`})]})})]}),(0,m.jsx)(`div`,{className:`pin-options`,children:(0,m.jsx)(l,{checked:i,onChange:()=>o(e=>!e),label:`Show PIN`})})]}),u&&(0,m.jsx)(`p`,{className:`admin-pin-error`,children:u})]})]})}function v(e){let{authPolling:n,setAuthPolling:r,authLoading:i,setAuthLoading:o,pinError:s,setPinError:l,setAppState:u}=e,[p,h]=(0,f.useState)(!1),[g,_]=(0,f.useState)(!1),[v,y]=(0,f.useState)(``),[b,x]=(0,f.useState)(``),[S,C]=(0,f.useState)(``),[w,T]=(0,f.useState)(null),[E,D]=(0,f.useState)(null),[O,k]=(0,f.useState)(!1);(0,f.useEffect)(()=>{try{D(sessionStorage.getItem(`maxy-admin-session-key`))}catch{}k(!0)},[]);async function A(){C(``);try{let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`paste-code`,code:b})})).json();e.accepted?(C(`Code submitted. Finishing sign-in…`),x(``)):C(e.error||`Could not submit code.`)}catch(e){console.error(`[admin] paste-code error:`,e),C(`Could not submit code.`)}}async function j(){_(!0),l(``);try{let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`launch-browser`})})).json();e.launched?h(!0):e.error&&l(e.error)}catch(e){console.error(`[admin] browser launch error:`,e),l(`Could not launch browser.`)}_(!1)}async function M(){o(!0),l(``);try{let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`})).json();if(e.started){r(!0),h(!0),o(!1),y(e.transport||``);for(let e=0;e<120;e++){await new Promise(e=>setTimeout(e,2e3));let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`wait`})})).json();if(typeof e.authTargetId==`string`&&T(e.authTargetId),e.authenticated){await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`stop`})}),u(`enter-pin`);return}}l(`Timed out waiting for sign-in. Try again.`),r(!1)}else e.error&&l(e.error)}catch(e){console.error(`[admin] auth flow error:`,e),l(`Could not start auth flow.`)}o(!1)}async function N(){await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`stop`})}),r(!1),l(``)}return n||p?(0,m.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100dvh`,overflow:`auto`},children:[(0,m.jsxs)(`header`,{className:`chat-header`,style:{paddingBottom:`12px`,flexShrink:0,position:`relative`,maxWidth:`680px`,width:`100%`,margin:`0 auto`,padding:`24px 20px 12px`},children:[n?(0,m.jsx)(`button`,{onClick:N,style:{position:`absolute`,top:`12px`,right:`12px`,background:`none`,border:`none`,color:`#999`,fontSize:`13px`,cursor:`pointer`,padding:`4px 8px`},"aria-label":`Cancel`,children:`✕`}):(0,m.jsx)(`button`,{onClick:()=>h(!1),style:{position:`absolute`,top:`12px`,right:`12px`,background:`none`,border:`none`,color:`#999`,fontSize:`13px`,cursor:`pointer`,padding:`4px 8px`},"aria-label":`Close browser`,children:`✕`}),(0,m.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`chat-logo`}),(0,m.jsx)(`h1`,{className:`chat-tagline`,children:`Connect Claude`}),(0,m.jsx)(`p`,{className:`chat-intro`,children:n?`Sign in and authorize in the browser below.`:`Open your email or prepare your accounts, then sign in.`}),!n&&(0,m.jsx)(`div`,{style:{marginTop:`12px`},children:(0,m.jsx)(c,{variant:`primary`,onClick:M,disabled:i,children:i?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(`span`,{className:`spin`,style:{display:`inline-block`},children:`✱`}),` Connecting…`]}):`Sign in to Claude`})}),n&&v===`native`&&(0,m.jsxs)(`div`,{style:{marginTop:`14px`,maxWidth:`420px`,margin:`14px auto 0`,display:`flex`,flexDirection:`column`,gap:`8px`},children:[(0,m.jsx)(`label`,{style:{fontSize:`12px`,color:`#999`,lineHeight:1.4},children:`If the browser didn't finish sign-in, paste the code or full redirect URL from Claude's page:`}),(0,m.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,m.jsx)(`input`,{type:`text`,value:b,onChange:e=>x(e.target.value),placeholder:`Paste code or redirect URL`,style:{flex:1,padding:`8px 10px`,fontSize:`13px`,border:`1px solid #ccc`,borderRadius:`6px`}}),(0,m.jsx)(c,{variant:`primary`,onClick:A,disabled:!b.trim(),children:`Submit`})]}),S&&(0,m.jsx)(`p`,{style:{fontSize:`12px`,color:`#999`,margin:0},children:S})]})]}),(0,m.jsx)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,minHeight:0,gap:`10px`,padding:`0 0 16px`},children:O&&(0,m.jsx)(d,{preferTargetId:w,cacheKey:E,chrome:!1})}),s&&(0,m.jsx)(`p`,{className:`admin-pin-error`,style:{textAlign:`center`,padding:`0 20px 16px`},children:s})]}):(0,m.jsx)(`div`,{className:`connect-page`,children:(0,m.jsxs)(`div`,{className:`connect-content`,children:[(0,m.jsxs)(`div`,{className:`connect-logos`,children:[(0,m.jsx)(`div`,{className:`connect-logo-wrap`,children:(0,m.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`connect-logo`})}),(0,m.jsx)(`svg`,{className:`connect-arrow`,viewBox:`0 0 48 24`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,children:(0,m.jsx)(`path`,{d:`M0 12h44m0 0l-8-8m8 8l-8 8`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`})}),(0,m.jsxs)(`div`,{className:`connect-logo-wrap`,children:[(0,m.jsx)(`img`,{src:a,alt:t.productName,className:`connect-logo connect-logo--maxy`}),!t.logoContainsName&&(0,m.jsx)(`span`,{className:`connect-logo-label`,children:t.productName})]})]}),(0,m.jsxs)(`h1`,{className:`connect-title`,children:[`Connect Claude to power `,t.productName]}),(0,m.jsx)(`p`,{className:`connect-subtitle`,children:`Sign in with your Anthropic account to get started.`}),(0,m.jsx)(c,{variant:`primary`,onClick:M,disabled:i,children:i?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(`span`,{className:`spin`,style:{display:`inline-block`},children:`✱`}),` Connecting…`]}):`Sign in to Claude`}),(0,m.jsx)(`p`,{style:{marginTop:`6px`,fontSize:`11px`,color:`#999`,maxWidth:`300px`,textAlign:`center`,lineHeight:`1.4`},children:`First time? You may need to sign into your email and Anthropic account in the browser before connecting.`}),(0,m.jsx)(`button`,{onClick:j,disabled:g,style:{marginTop:`12px`,background:`none`,border:`none`,color:`var(--color-primary, #666)`,fontSize:`13px`,cursor:`pointer`,textDecoration:`underline`,textUnderlineOffset:`3px`},children:g?`Launching…`:`Open browser first`}),s&&(0,m.jsx)(`p`,{className:`admin-pin-error`,children:s})]})})}function y({auth:e}){return e.appState===`loading`?(0,m.jsx)(o,{surface:`gate`}):e.appState===`set-pin`?(0,m.jsx)(g,{pin:e.pin,setPin:e.setPin,showPin:e.showPin,setShowPin:e.setShowPin,pinLoading:e.pinLoading,pinError:e.pinError,pinInputRef:e.pinInputRef,setPinFormRef:e.setPinFormRef,onSubmit:e.handleSetPin,operatorName:e.operatorName,setOperatorName:e.setOperatorName}):e.appState===`connect-claude`?(0,m.jsx)(v,{authPolling:e.authPolling,setAuthPolling:e.setAuthPolling,authLoading:e.authLoading,setAuthLoading:e.setAuthLoading,pinError:e.pinError,setPinError:e.setPinError,setAppState:e.setAppState}):e.appState===`enter-pin`?(0,m.jsx)(_,{pin:e.pin,setPin:e.setPin,showPin:e.showPin,setShowPin:e.setShowPin,pinLoading:e.pinLoading,pinError:e.pinError,pinInputRef:e.pinInputRef,onSubmit:e.handleLogin,remoteAuthEnabled:e.remoteAuthEnabled,onSignOutRemote:()=>{window.location.href=`/__remote-auth/logout`}}):null}export{p as n,y as t};