@rubytech/create-maxy-code 0.1.427 → 0.1.431

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 (250) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/embed-client/dist/index.d.ts +5 -1
  3. package/payload/platform/lib/embed-client/dist/index.d.ts.map +1 -1
  4. package/payload/platform/lib/embed-client/dist/index.js +114 -36
  5. package/payload/platform/lib/embed-client/dist/index.js.map +1 -1
  6. package/payload/platform/lib/embed-client/src/index.ts +141 -34
  7. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +72 -4
  8. package/payload/platform/plugins/docs/PLUGIN.md +1 -0
  9. package/payload/platform/plugins/docs/references/admin-ui.md +2 -0
  10. package/payload/platform/plugins/docs/references/internals.md +3 -3
  11. package/payload/platform/plugins/docs/references/workflows.md +61 -0
  12. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-throughput.test.d.ts +2 -0
  13. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-throughput.test.d.ts.map +1 -0
  14. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-throughput.test.js +92 -0
  15. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-throughput.test.js.map +1 -0
  16. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-timeout.test.d.ts +2 -0
  17. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-timeout.test.d.ts.map +1 -0
  18. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-timeout.test.js +56 -0
  19. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-timeout.test.js.map +1 -0
  20. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.js +56 -0
  21. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.js.map +1 -1
  22. package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.d.ts +8 -1
  23. package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.d.ts.map +1 -1
  24. package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.js +8 -1
  25. package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.js.map +1 -1
  26. package/payload/platform/plugins/work/mcp/dist/lib/embeddings.d.ts +9 -3
  27. package/payload/platform/plugins/work/mcp/dist/lib/embeddings.d.ts.map +1 -1
  28. package/payload/platform/plugins/work/mcp/dist/lib/embeddings.js +19 -15
  29. package/payload/platform/plugins/work/mcp/dist/lib/embeddings.js.map +1 -1
  30. package/payload/platform/plugins/workflows/PLUGIN.md +29 -9
  31. package/payload/platform/plugins/workflows/mcp/dist/index.js +34 -0
  32. package/payload/platform/plugins/workflows/mcp/dist/index.js.map +1 -1
  33. package/payload/platform/plugins/workflows/mcp/dist/lib/embeddings.d.ts +1 -1
  34. package/payload/platform/plugins/workflows/mcp/dist/lib/embeddings.d.ts.map +1 -1
  35. package/payload/platform/plugins/workflows/mcp/dist/lib/embeddings.js +7 -18
  36. package/payload/platform/plugins/workflows/mcp/dist/lib/embeddings.js.map +1 -1
  37. package/payload/platform/plugins/workflows/mcp/dist/lib/step-resolver.d.ts +2 -2
  38. package/payload/platform/plugins/workflows/mcp/dist/lib/step-resolver.d.ts.map +1 -1
  39. package/payload/platform/plugins/workflows/mcp/dist/lib/step-resolver.js.map +1 -1
  40. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.d.ts +25 -0
  41. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.d.ts.map +1 -1
  42. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.js +14 -1
  43. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.js.map +1 -1
  44. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.d.ts +25 -1
  45. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.d.ts.map +1 -1
  46. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js +79 -15
  47. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js.map +1 -1
  48. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-get.d.ts +2 -0
  49. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-get.d.ts.map +1 -1
  50. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-get.js +4 -0
  51. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-get.js.map +1 -1
  52. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-update.d.ts +3 -1
  53. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-update.d.ts.map +1 -1
  54. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-update.js +8 -1
  55. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-update.js.map +1 -1
  56. package/payload/platform/plugins/workflows/skills/workflow-manager/SKILL.md +24 -3
  57. package/payload/platform/services/telegram-channel/dist/instructions.js +1 -1
  58. package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
  59. package/payload/platform/services/telegram-channel/dist/notification.d.ts +10 -5
  60. package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
  61. package/payload/platform/services/telegram-channel/dist/notification.js +9 -6
  62. package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
  63. package/payload/platform/services/telegram-channel/dist/server.d.ts.map +1 -1
  64. package/payload/platform/services/telegram-channel/dist/server.js +15 -5
  65. package/payload/platform/services/telegram-channel/dist/server.js.map +1 -1
  66. package/payload/platform/services/webchat-channel/dist/instructions.js +1 -1
  67. package/payload/platform/services/webchat-channel/dist/instructions.js.map +1 -1
  68. package/payload/platform/services/webchat-channel/dist/notification.d.ts +12 -10
  69. package/payload/platform/services/webchat-channel/dist/notification.d.ts.map +1 -1
  70. package/payload/platform/services/webchat-channel/dist/notification.js +12 -11
  71. package/payload/platform/services/webchat-channel/dist/notification.js.map +1 -1
  72. package/payload/platform/services/webchat-channel/dist/server.d.ts.map +1 -1
  73. package/payload/platform/services/webchat-channel/dist/server.js +12 -1
  74. package/payload/platform/services/webchat-channel/dist/server.js.map +1 -1
  75. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +11 -6
  76. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  77. package/payload/platform/services/whatsapp-channel/dist/notification.js +11 -8
  78. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  79. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  80. package/payload/platform/services/whatsapp-channel/dist/server.js +39 -14
  81. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  82. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts +17 -2
  83. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts.map +1 -1
  84. package/payload/platform/services/whatsapp-channel/dist/targets.js +37 -2
  85. package/payload/platform/services/whatsapp-channel/dist/targets.js.map +1 -1
  86. package/payload/server/{chunk-3Z5WE53X.js → chunk-UUG6ZSO5.js} +65 -9
  87. package/payload/server/maxy-edge.js +1 -1
  88. package/payload/server/public/assets/AdminLoginScreens-CcW3pAAZ.js +1 -0
  89. package/payload/server/public/assets/AdminShell-BfLQQ27Z.js +2 -0
  90. package/payload/server/public/assets/{Checkbox-B_lfjsqd.js → Checkbox-BC0c_gbn.js} +1 -1
  91. package/payload/server/public/assets/admin-Co3hOTNp.js +1 -0
  92. package/payload/server/public/assets/{arc-dVLpR-ec.js → arc-qKfXIt8v.js} +1 -1
  93. package/payload/server/public/assets/architecture-YZFGNWBL-FPHT7s-C.js +1 -0
  94. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-C6u_CVzb.js → architectureDiagram-Q4EWVU46-DkVrGn7G.js} +1 -1
  95. package/payload/server/public/assets/audio-attachment-mime-CwYrV1pg.js +2 -0
  96. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-Cy8F5b8O.js → blockDiagram-DXYQGD6D-DqavswGH.js} +1 -1
  97. package/payload/server/public/assets/{browser-CCWufeXr.js → browser-CvZxNdKw.js} +1 -1
  98. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-DRXrlepj.js → c4Diagram-AHTNJAMY-B7fyKiXe.js} +1 -1
  99. package/payload/server/public/assets/calendar-DXxLMF2J.js +1 -0
  100. package/payload/server/public/assets/channel-j70eMvcL.js +1 -0
  101. package/payload/server/public/assets/chat-rxbGimwf.js +1 -0
  102. package/payload/server/public/assets/chevron-left-CLPxfjDV.js +1 -0
  103. package/payload/server/public/assets/{chunk-2KRD3SAO-fEyfhRLz.js → chunk-2KRD3SAO-DsgMtGkv.js} +1 -1
  104. package/payload/server/public/assets/{chunk-336JU56O-NUWO4y7q.js → chunk-336JU56O-CkdISfNt.js} +2 -2
  105. package/payload/server/public/assets/chunk-426QAEUC-D-NcAlTW.js +1 -0
  106. package/payload/server/public/assets/{chunk-4BX2VUAB-BnfiNR3l.js → chunk-4BX2VUAB-CYpiF2bl.js} +1 -1
  107. package/payload/server/public/assets/{chunk-4TB4RGXK-Bj_aJOz8.js → chunk-4TB4RGXK-CWyc_F7v.js} +1 -1
  108. package/payload/server/public/assets/{chunk-55IACEB6-aK0DNSKb.js → chunk-55IACEB6-BbzKMw2Z.js} +1 -1
  109. package/payload/server/public/assets/{chunk-5FUZZQ4R-DeqAkq5C.js → chunk-5FUZZQ4R-u19Nai9e.js} +1 -1
  110. package/payload/server/public/assets/{chunk-5PVQY5BW-SShlujAQ.js → chunk-5PVQY5BW-Ba8by6Uy.js} +1 -1
  111. package/payload/server/public/assets/{chunk-67CJDMHE-CZpzQ0DL.js → chunk-67CJDMHE-BwUuxtyb.js} +1 -1
  112. package/payload/server/public/assets/{chunk-7N4EOEYR-COnjO6jy.js → chunk-7N4EOEYR-BRH9iM9L.js} +1 -1
  113. package/payload/server/public/assets/{chunk-AA7GKIK3-C9V31L2z.js → chunk-AA7GKIK3-BGoztgLL.js} +1 -1
  114. package/payload/server/public/assets/{chunk-BSJP7CBP-DSwnSGe3.js → chunk-BSJP7CBP-C5GDAZTl.js} +1 -1
  115. package/payload/server/public/assets/{chunk-CIAEETIT-CnRUTuta.js → chunk-CIAEETIT-ChY32VPS.js} +1 -1
  116. package/payload/server/public/assets/{chunk-EDXVE4YY-BexiL2LH.js → chunk-EDXVE4YY-CPSD3p6p.js} +1 -1
  117. package/payload/server/public/assets/{chunk-ENJZ2VHE-aTklWdJQ.js → chunk-ENJZ2VHE-D1oL-iUr.js} +1 -1
  118. package/payload/server/public/assets/{chunk-FMBD7UC4-svcEBQzs.js → chunk-FMBD7UC4-CPvYEr54.js} +1 -1
  119. package/payload/server/public/assets/{chunk-FOC6F5B3-CG7R7Xri.js → chunk-FOC6F5B3-9Yyj7Vbz.js} +1 -1
  120. package/payload/server/public/assets/{chunk-ICPOFSXX-CGN7Z4x9.js → chunk-ICPOFSXX-BaYgh8FR.js} +2 -2
  121. package/payload/server/public/assets/{chunk-K5T4RW27-CWBh78jw.js → chunk-K5T4RW27-5ucpeRvm.js} +1 -1
  122. package/payload/server/public/assets/{chunk-KGLVRYIC-Ctiq4q-5.js → chunk-KGLVRYIC-DW-FHk7T.js} +1 -1
  123. package/payload/server/public/assets/{chunk-LIHQZDEY-BII77Q7K.js → chunk-LIHQZDEY-CGGVfAyG.js} +1 -1
  124. package/payload/server/public/assets/{chunk-ORNJ4GCN-DT7R01H8.js → chunk-ORNJ4GCN-Bv8EUa5d.js} +1 -1
  125. package/payload/server/public/assets/{chunk-OYMX7WX6-y-Jkbd4C.js → chunk-OYMX7WX6-C1mXJnyw.js} +1 -1
  126. package/payload/server/public/assets/chunk-QZHKN3VN-CAwbQBtf.js +1 -0
  127. package/payload/server/public/assets/{chunk-U2HBQHQK-DzFo6KbQ.js → chunk-U2HBQHQK-PwSQz6EP.js} +1 -1
  128. package/payload/server/public/assets/{chunk-X2U36JSP-CYSwgtLV.js → chunk-X2U36JSP--NPHTBlU.js} +1 -1
  129. package/payload/server/public/assets/{chunk-XPW4576I-DHlM4tOn.js → chunk-XPW4576I-Bbc7Da32.js} +1 -1
  130. package/payload/server/public/assets/{chunk-YZCP3GAM-B20rTmLl.js → chunk-YZCP3GAM-D-9v8e--.js} +1 -1
  131. package/payload/server/public/assets/{chunk-ZZ45TVLE-C7hP4J8m.js → chunk-ZZ45TVLE-CMPg670Q.js} +1 -1
  132. package/payload/server/public/assets/classDiagram-6PBFFD2Q-Ct6Rn0vt.js +1 -0
  133. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-B_2XCIFv.js +1 -0
  134. package/payload/server/public/assets/clone-DjPWA_NH.js +1 -0
  135. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-nKjTv9sR.js → cose-bilkent-S5V4N54A-NVSb1Bhy.js} +1 -1
  136. package/payload/server/public/assets/{dagre-KV5264BT-BNJYTnls.js → dagre-KV5264BT-V2Ai1DFl.js} +1 -1
  137. package/payload/server/public/assets/{dagre-Cx8LiiUZ.js → dagre-QfLcO-1j.js} +1 -1
  138. package/payload/server/public/assets/data-D0YFYP1i.js +1 -0
  139. package/payload/server/public/assets/{diagram-5BDNPKRD-CoAN5_f9.js → diagram-5BDNPKRD-Caw21693.js} +1 -1
  140. package/payload/server/public/assets/{diagram-G4DWMVQ6-pRmsN4_x.js → diagram-G4DWMVQ6-CgwVkT2q.js} +1 -1
  141. package/payload/server/public/assets/{diagram-MMDJMWI5-CRoylyp4.js → diagram-MMDJMWI5-DFUrLZhs.js} +1 -1
  142. package/payload/server/public/assets/{diagram-TYMM5635-BT3ZtG5b.js → diagram-TYMM5635-CEEiEuZJ.js} +1 -1
  143. package/payload/server/public/assets/{erDiagram-SMLLAGMA-DSKws1ZV.js → erDiagram-SMLLAGMA-CG10NrT3.js} +1 -1
  144. package/payload/server/public/assets/file-download-B2B2DTar.js +1 -0
  145. package/payload/server/public/assets/{flatten-jn8bZgcI.js → flatten-DAO0sfCM.js} +1 -1
  146. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-C2L38ZE5.js → flowDiagram-DWJPFMVM-BqkV9Okv.js} +1 -1
  147. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-Bm2h-vjm.js → ganttDiagram-T4ZO3ILL-DRiCDQF6.js} +1 -1
  148. package/payload/server/public/assets/gitGraph-7Q5UKJZL-B8Hx7f-D.js +1 -0
  149. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BoowbF7u.js → gitGraphDiagram-UUTBAWPF-BZV2voyy.js} +1 -1
  150. package/payload/server/public/assets/graph-DRNzDBTV.js +51 -0
  151. package/payload/server/public/assets/{graph-labels-BLx-0vyT.js → graph-labels-DxqDdO7G.js} +1 -1
  152. package/payload/server/public/assets/{graphlib-BvT2s_o1.js → graphlib-DGPThX8M.js} +1 -1
  153. package/payload/server/public/assets/info-OMHHGYJF-BicCJTqU.js +1 -0
  154. package/payload/server/public/assets/infoDiagram-42DDH7IO-tf-8rOez.js +2 -0
  155. package/payload/server/public/assets/{isEmpty-Dkk6_L-B.js → isEmpty-Cb_U81C6.js} +1 -1
  156. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-nxcmj-IX.js → ishikawaDiagram-UXIWVN3A-BKsAxSvp.js} +1 -1
  157. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-q5SNIvmS.js → journeyDiagram-VCZTEJTY-CmliuOd-.js} +1 -1
  158. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-BugG9Q1o.js → kanban-definition-6JOO6SKY-DAlElMb-.js} +1 -1
  159. package/payload/server/public/assets/{line-MZCQLR-q.js → line-DKZqLKAC.js} +1 -1
  160. package/payload/server/public/assets/{linear-DmQGNk-g.js → linear-CbSGdh1x.js} +1 -1
  161. package/payload/server/public/assets/{maximize-2-CnNQnj_v.js → maximize-2-DKx6OBKv.js} +1 -1
  162. package/payload/server/public/assets/{mermaid-parser.core-DvoeqLxw.js → mermaid-parser.core-DFvbao9C.js} +2 -2
  163. package/payload/server/public/assets/{mermaid.core-BLaw7iG4.js → mermaid.core-C0vEBxDm.js} +3 -3
  164. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-DMkt10Vc.js → mindmap-definition-QFDTVHPH-CShASUKd.js} +1 -1
  165. package/payload/server/public/assets/operator-Djv3MdcL.js +1 -0
  166. package/payload/server/public/assets/{ordinal-DuJYM7p1.js → ordinal-H0tVmBDP.js} +1 -1
  167. package/payload/server/public/assets/packet-4T2RLAQJ-Ckn_5hq0.js +1 -0
  168. package/payload/server/public/assets/page-Ci27UrJz.js +32 -0
  169. package/payload/server/public/assets/page-D1EAVC_9.js +1 -0
  170. package/payload/server/public/assets/{pdf-render-riHufgrn.js → pdf-render-jAQU0nXt.js} +1 -1
  171. package/payload/server/public/assets/pie-ZZUOXDRM-DzlGQW3J.js +1 -0
  172. package/payload/server/public/assets/{pieDiagram-DEJITSTG-DRp4lD2B.js → pieDiagram-DEJITSTG-CBZHpDAJ.js} +1 -1
  173. package/payload/server/public/assets/{play-yEkd7ouW.js → play-DHttF4fl.js} +1 -1
  174. package/payload/server/public/assets/public-C6k-fPfx.js +1 -0
  175. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-DkT63Dn4.js → quadrantDiagram-34T5L4WZ-n3bB3K91.js} +1 -1
  176. package/payload/server/public/assets/radar-PYXPWWZC-BHo2YD8b.js +1 -0
  177. package/payload/server/public/assets/{reduce-COyotL2V.js → reduce-DAvwat-a.js} +1 -1
  178. package/payload/server/public/assets/{requirementDiagram-MS252O5E-65GGtDkc.js → requirementDiagram-MS252O5E-DiDvQK3c.js} +1 -1
  179. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-D1vRwLWd.js → sankeyDiagram-XADWPNL6-DWDQQZmd.js} +1 -1
  180. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-Bp47ZSN2.js → sequenceDiagram-FGHM5R23-DmAqRlBT.js} +1 -1
  181. package/payload/server/public/assets/square-CHcQHtK8.js +1 -0
  182. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BZHHcP_e.js → stateDiagram-FHFEXIEX-D4R-n6bZ.js} +1 -1
  183. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BcFRbGRu.js +1 -0
  184. package/payload/server/public/assets/tasks-ClfJU1CK.js +1 -0
  185. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-DZ1wUyj-.js → timeline-definition-GMOUNBTQ-CjiHGP4l.js} +1 -1
  186. package/payload/server/public/assets/treeView-SZITEDCU-BtRr5vXp.js +1 -0
  187. package/payload/server/public/assets/treemap-W4RFUUIX-D8p0sbyo.js +1 -0
  188. package/payload/server/public/assets/useCopyFeedback-CPEOUSGU.js +1 -0
  189. package/payload/server/public/assets/{useSubAccountSwitcher-ayajZz8T.css → useSubAccountSwitcher-CdS1CorH.css} +1 -1
  190. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-CttBahsn.js → vennDiagram-DHZGUBPP-CBdDQ7c-.js} +1 -1
  191. package/payload/server/public/assets/wardley-RL74JXVD-DgMn-9ZJ.js +1 -0
  192. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-Y5tWieZg.js → wardleyDiagram-NUSXRM2D-BlIQPKLb.js} +1 -1
  193. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-C78A9qbe.js → xychartDiagram-5P7HB3ND-CslKgh9B.js} +1 -1
  194. package/payload/server/public/browser.html +6 -6
  195. package/payload/server/public/calendar.html +7 -7
  196. package/payload/server/public/chat.html +13 -14
  197. package/payload/server/public/data.html +10 -10
  198. package/payload/server/public/graph.html +11 -11
  199. package/payload/server/public/index.html +14 -15
  200. package/payload/server/public/operator.html +15 -16
  201. package/payload/server/public/public.html +13 -14
  202. package/payload/server/public/tasks.html +5 -5
  203. package/payload/server/server.js +321 -32
  204. package/payload/server/public/assets/AdminLoginScreens-yAIhWcGc.js +0 -1
  205. package/payload/server/public/assets/AdminShell-Bk1AFQ4D.js +0 -2
  206. package/payload/server/public/assets/Transcript-D67OZnVM.js +0 -2
  207. package/payload/server/public/assets/admin-DuOhkvrZ.js +0 -1
  208. package/payload/server/public/assets/admin-types-ClHBm0ni.js +0 -1
  209. package/payload/server/public/assets/architecture-YZFGNWBL-CgeA3HPD.js +0 -1
  210. package/payload/server/public/assets/calendar-CNk1iPrA.js +0 -1
  211. package/payload/server/public/assets/channel-B04VBWf7.js +0 -1
  212. package/payload/server/public/assets/chat-7qB-dwBq.js +0 -1
  213. package/payload/server/public/assets/chevron-left-CpcDbHIz.js +0 -1
  214. package/payload/server/public/assets/chunk-426QAEUC-DZkHcXRA.js +0 -1
  215. package/payload/server/public/assets/chunk-QZHKN3VN-D9Mwgzti.js +0 -1
  216. package/payload/server/public/assets/classDiagram-6PBFFD2Q-CIo_TzfF.js +0 -1
  217. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-SzQYvAUZ.js +0 -1
  218. package/payload/server/public/assets/clone-BVjcjsBA.js +0 -1
  219. package/payload/server/public/assets/data-BnHcS27X.js +0 -1
  220. package/payload/server/public/assets/file-download-Hf_UILaA.js +0 -1
  221. package/payload/server/public/assets/gitGraph-7Q5UKJZL-DzQ18i0T.js +0 -1
  222. package/payload/server/public/assets/graph-klLugHEK.js +0 -51
  223. package/payload/server/public/assets/info-OMHHGYJF-CwsoaVzV.js +0 -1
  224. package/payload/server/public/assets/infoDiagram-42DDH7IO-ieNsH2bV.js +0 -2
  225. package/payload/server/public/assets/operator-CRcySYv9.js +0 -1
  226. package/payload/server/public/assets/packet-4T2RLAQJ-DxB-bO4L.js +0 -1
  227. package/payload/server/public/assets/page-CVo3CWIY.js +0 -1
  228. package/payload/server/public/assets/page-DPTbZRwl.js +0 -32
  229. package/payload/server/public/assets/pie-ZZUOXDRM-PSdKvB8-.js +0 -1
  230. package/payload/server/public/assets/public-Fi6ccYaE.js +0 -1
  231. package/payload/server/public/assets/radar-PYXPWWZC-D8FqRiWq.js +0 -1
  232. package/payload/server/public/assets/rotate-ccw-xHksz9mr.js +0 -1
  233. package/payload/server/public/assets/square-BZqaxg7D.js +0 -1
  234. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-qVtoGx56.js +0 -1
  235. package/payload/server/public/assets/tasks-COWmfts8.js +0 -1
  236. package/payload/server/public/assets/treeView-SZITEDCU-i-w4rJmQ.js +0 -1
  237. package/payload/server/public/assets/treemap-W4RFUUIX-Dij6AlAj.js +0 -1
  238. package/payload/server/public/assets/wardley-RL74JXVD-BJhOQVqW.js +0 -1
  239. /package/payload/server/public/assets/{_baseFor-Bjj9It3Q.js → _baseFor-D3BqAOBr.js} +0 -0
  240. /package/payload/server/public/assets/{array-BrrxEo12.js → array-iYP9fzJp.js} +0 -0
  241. /package/payload/server/public/assets/{cytoscape.esm-CTWJxUxo.js → cytoscape.esm-BQSBzPsB.js} +0 -0
  242. /package/payload/server/public/assets/{defaultLocale-CFDbRV4k.js → defaultLocale-BrdA1gDi.js} +0 -0
  243. /package/payload/server/public/assets/{dist-CRpLAnCP.js → dist-Cvgxm7qv.js} +0 -0
  244. /package/payload/server/public/assets/{init-dXCzGgLP.js → init-Bx0S6pkp.js} +0 -0
  245. /package/payload/server/public/assets/{katex-CHA1JFYJ.js → katex-BsiH_a6d.js} +0 -0
  246. /package/payload/server/public/assets/{path-CCRpdXhK.js → path-BLSgTy3w.js} +0 -0
  247. /package/payload/server/public/assets/{preload-helper-CH6UZRzu.js → preload-helper-ClBMtM1g.js} +0 -0
  248. /package/payload/server/public/assets/{rough.esm-Bud4g4fh.js → rough.esm-BMOtDaaS.js} +0 -0
  249. /package/payload/server/public/assets/{src-xN1oULc8.js → src-DV4LKv2E.js} +0 -0
  250. /package/payload/server/public/assets/{useSubAccountSwitcher-DADvGnr1.js → useSubAccountSwitcher-DyjTbzQR.js} +0 -0
@@ -75,6 +75,7 @@ import {
75
75
  loadUserProfile,
76
76
  migrateLegacyRemotePassword,
77
77
  persistMessage,
78
+ preloadEmbedModel,
78
79
  projectAgent,
79
80
  reconcileEnabledPlugins,
80
81
  recordFailedAttempt,
@@ -110,7 +111,7 @@ import {
110
111
  vncLog,
111
112
  walkPremiumBundles,
112
113
  writeAdminUserAndPerson
113
- } from "./chunk-3Z5WE53X.js";
114
+ } from "./chunk-UUG6ZSO5.js";
114
115
  import {
115
116
  __commonJS,
116
117
  __toESM
@@ -3336,6 +3337,17 @@ var STORE_ROOT = () => join3(process.env.MAXY_DIR_OVERRIDE ?? MAXY_DIR, "data",
3336
3337
  function conversationFile(platformAccountId, remoteJid) {
3337
3338
  return join3(STORE_ROOT(), platformAccountId, `${remoteJid}.jsonl`);
3338
3339
  }
3340
+ function listStoredAccountIds() {
3341
+ const root = STORE_ROOT();
3342
+ if (!existsSync3(root)) return [];
3343
+ return readdirSync(root).filter((name) => {
3344
+ try {
3345
+ return statSync2(join3(root, name)).isDirectory();
3346
+ } catch {
3347
+ return false;
3348
+ }
3349
+ });
3350
+ }
3339
3351
  function conversationFilePath(platformAccountId, remoteJid) {
3340
3352
  return conversationFile(platformAccountId, remoteJid);
3341
3353
  }
@@ -4207,6 +4219,9 @@ var whatsAppConfig = {};
4207
4219
  var onInboundMessage = null;
4208
4220
  var initialized = false;
4209
4221
  var messageStore = /* @__PURE__ */ new Map();
4222
+ function messageStoreKey(accountId, remoteJid) {
4223
+ return `${accountId}:${remoteJid}`;
4224
+ }
4210
4225
  function storeMessage(storeKey, entry) {
4211
4226
  let entries = messageStore.get(storeKey);
4212
4227
  if (!entries) {
@@ -4360,9 +4375,12 @@ function getStatus() {
4360
4375
  function getSocket(accountId) {
4361
4376
  return connections.get(accountId)?.sock ?? null;
4362
4377
  }
4378
+ function findConnectionByKey(conns, accountId) {
4379
+ return conns.find((c) => c.accountId === accountId) ?? conns.find((c) => c.platformAccountId === accountId);
4380
+ }
4363
4381
  function selectConnection(conns, accountId) {
4364
4382
  const presentKeys = conns.map((c) => c.accountId);
4365
- const conn = conns.find((c) => c.accountId === accountId) ?? conns.find((c) => c.platformAccountId === accountId);
4383
+ const conn = findConnectionByKey(conns, accountId);
4366
4384
  if (!conn) return { ok: false, reason: "key-miss", presentKeys };
4367
4385
  if (!conn.sock) return { ok: false, reason: "disconnected", presentKeys };
4368
4386
  return { ok: true, sock: conn.sock, accountId: conn.accountId };
@@ -4370,6 +4388,16 @@ function selectConnection(conns, accountId) {
4370
4388
  function resolveSocket(accountId) {
4371
4389
  return selectConnection(Array.from(connections.values()), accountId);
4372
4390
  }
4391
+ function selectStoreAccountKey(conns, accountId) {
4392
+ const conn = findConnectionByKey(conns, accountId);
4393
+ return conn ? conn.platformAccountId : accountId;
4394
+ }
4395
+ function resolveReadStoreKey(accountId) {
4396
+ return selectStoreAccountKey(Array.from(connections.values()), accountId);
4397
+ }
4398
+ function listConnectionPlatformAccountIds() {
4399
+ return [...connections.values()].map((conn) => conn.platformAccountId);
4400
+ }
4373
4401
  async function registerLoginSocket(accountId, sock, authDir) {
4374
4402
  if (!configDir) throw new Error("WhatsApp manager not initialized");
4375
4403
  let platformAccountId;
@@ -4460,11 +4488,11 @@ function reloadConfig(accountConfig) {
4460
4488
  loadConfig(accountConfig);
4461
4489
  }
4462
4490
  function getMessages(accountId, jid, limit) {
4463
- const entries = messageStore.get(`${accountId}:${jid}`) ?? [];
4491
+ const entries = messageStore.get(messageStoreKey(accountId, jid)) ?? [];
4464
4492
  return limit ? entries.slice(-limit) : entries.slice();
4465
4493
  }
4466
4494
  function listConversationJids(accountId) {
4467
- const prefix = `${accountId}:`;
4495
+ const prefix = messageStoreKey(accountId, "");
4468
4496
  const jids = [];
4469
4497
  for (const key of messageStore.keys()) {
4470
4498
  if (key.startsWith(prefix)) {
@@ -4473,6 +4501,14 @@ function listConversationJids(accountId) {
4473
4501
  }
4474
4502
  return jids;
4475
4503
  }
4504
+ function listStoreAccountKeys() {
4505
+ const accounts = /* @__PURE__ */ new Set();
4506
+ for (const key of messageStore.keys()) {
4507
+ const i = key.indexOf(":");
4508
+ if (i > 0) accounts.add(key.slice(0, i));
4509
+ }
4510
+ return [...accounts];
4511
+ }
4476
4512
  async function shutdown() {
4477
4513
  await drainCredsSaveQueue();
4478
4514
  const ids = Array.from(connections.keys());
@@ -4682,7 +4718,7 @@ function monitorInbound(conn) {
4682
4718
  const senderJid = isGroup ? msg.key.participant ?? remoteJid : remoteJid;
4683
4719
  const senderPhone = await resolveJidToE164(senderJid, conn.lidMapping) ?? senderJid;
4684
4720
  const ts = msg.messageTimestamp ? Number(msg.messageTimestamp) : Math.floor(Date.now() / 1e3);
4685
- const storeKey = `${conn.accountId}:${remoteJid}`;
4721
+ const storeKey = messageStoreKey(conn.platformAccountId, remoteJid);
4686
4722
  storeMessage(storeKey, {
4687
4723
  id: msg.key.id ?? `${remoteJid}-${ts}`,
4688
4724
  sender: senderPhone,
@@ -4694,7 +4730,7 @@ function monitorInbound(conn) {
4694
4730
  });
4695
4731
  const entries = messageStore.get(storeKey);
4696
4732
  console.error(
4697
- `${TAG13} stored message ${msg.key.id ?? "?"} for ${remoteJid} (type: ${upsert.type}, store size: ${entries?.length ?? 0}/${MESSAGE_STORE_MAX}) account=${conn.accountId}`
4733
+ `${TAG13} stored message ${msg.key.id ?? "?"} for ${remoteJid} (type: ${upsert.type}, store size: ${entries?.length ?? 0}/${MESSAGE_STORE_MAX}) account=${conn.platformAccountId}`
4698
4734
  );
4699
4735
  recordActivity({
4700
4736
  accountId: conn.accountId,
@@ -7074,6 +7110,13 @@ function listActiveLoginAccountIds() {
7074
7110
  return ids;
7075
7111
  }
7076
7112
 
7113
+ // app/lib/whatsapp/store-key-reconcile.ts
7114
+ function reconcileMessageStoreAccountKeys(input) {
7115
+ const reachable = new Set(input.reachableAccountIds);
7116
+ const orphanLiveKeys = input.liveAccountKeys.filter((k) => !reachable.has(k));
7117
+ return { ok: orphanLiveKeys.length === 0, orphanLiveKeys };
7118
+ }
7119
+
7077
7120
  // app/lib/whatsapp/outbound/send-document.ts
7078
7121
  import { realpathSync as realpathSync3 } from "fs";
7079
7122
  import { readFile, stat as stat2 } from "fs/promises";
@@ -7454,7 +7497,17 @@ app2.get("/status", (c) => {
7454
7497
  const accounts = [...live, ...reconciled];
7455
7498
  const summary = accounts.map((a) => `${a.accountId}:${a.connected ? "up" : a.linkedUnconfigured ? "linked-unconfigured" : "down"}`).join(", ");
7456
7499
  console.error(`${TAG21} status accounts=${accounts.length} [${summary}]`);
7457
- return c.json({ accounts });
7500
+ const reachableAccountIds = [
7501
+ .../* @__PURE__ */ new Set([...listStoredAccountIds(), ...listConnectionPlatformAccountIds()])
7502
+ ];
7503
+ const storeKeyReconcile = reconcileMessageStoreAccountKeys({
7504
+ liveAccountKeys: listStoreAccountKeys(),
7505
+ reachableAccountIds
7506
+ });
7507
+ if (!storeKeyReconcile.ok) {
7508
+ console.warn(`${TAG21} store-key-drift orphanLiveKeys=[${storeKeyReconcile.orphanLiveKeys.join(",")}] \u2014 in-memory cache keyed by a value with no disk account; read tools will miss`);
7509
+ }
7510
+ return c.json({ accounts, storeKeyReconcile });
7458
7511
  } catch (err) {
7459
7512
  console.error(`${TAG21} status error: ${String(err)}`);
7460
7513
  return c.json({ error: String(err) }, 500);
@@ -7745,9 +7798,10 @@ app2.get("/activity", (c) => {
7745
7798
  });
7746
7799
  app2.get("/conversations", (c) => {
7747
7800
  try {
7748
- const accountId = validateAccountId(c.req.query("accountId") ?? null);
7749
- const denial = callerScopeDenial(c, accountId);
7801
+ const requestedAccountId = validateAccountId(c.req.query("accountId") ?? null);
7802
+ const denial = callerScopeDenial(c, requestedAccountId);
7750
7803
  if (denial) return denial;
7804
+ const accountId = resolveReadStoreKey(requestedAccountId);
7751
7805
  const jids = listConversationJids(accountId);
7752
7806
  const conversations = jids.map((jid) => {
7753
7807
  const messages = getMessages(accountId, jid);
@@ -7760,7 +7814,7 @@ app2.get("/conversations", (c) => {
7760
7814
  };
7761
7815
  });
7762
7816
  conversations.sort((a, b) => (b.lastMessageTimestamp ?? 0) - (a.lastMessageTimestamp ?? 0));
7763
- console.error(`${TAG21} conversations account=${accountId} count=${conversations.length}`);
7817
+ console.error(`${TAG21} conversations requested=${requestedAccountId} account=${accountId} storeKeyFound=${jids.length > 0} count=${conversations.length}`);
7764
7818
  return c.json({ conversations });
7765
7819
  } catch (err) {
7766
7820
  console.error(`${TAG21} conversations error: ${String(err)}`);
@@ -7769,9 +7823,10 @@ app2.get("/conversations", (c) => {
7769
7823
  });
7770
7824
  app2.get("/messages", (c) => {
7771
7825
  try {
7772
- const accountId = validateAccountId(c.req.query("accountId") ?? null);
7773
- const denial = callerScopeDenial(c, accountId);
7826
+ const requestedAccountId = validateAccountId(c.req.query("accountId") ?? null);
7827
+ const denial = callerScopeDenial(c, requestedAccountId);
7774
7828
  if (denial) return denial;
7829
+ const accountId = resolveReadStoreKey(requestedAccountId);
7775
7830
  const jid = c.req.query("jid");
7776
7831
  if (!jid) {
7777
7832
  return c.json({ error: "Missing required parameter: jid" }, 400);
@@ -7780,7 +7835,8 @@ app2.get("/messages", (c) => {
7780
7835
  const limit = limitParam ? parseInt(limitParam, 10) : void 0;
7781
7836
  const effectiveLimit = limit && !Number.isNaN(limit) && limit > 0 ? limit : void 0;
7782
7837
  const messages = getMessages(accountId, jid, effectiveLimit);
7783
- console.error(`${TAG21} messages account=${accountId} jid=${jid} limit=${effectiveLimit ?? "all"} returned=${messages.length}`);
7838
+ const storeKeyFound = listConversationJids(accountId).length > 0;
7839
+ console.error(`${TAG21} messages requested=${requestedAccountId} account=${accountId} jid=${jid} storeKeyFound=${storeKeyFound} limit=${effectiveLimit ?? "all"} returned=${messages.length}`);
7784
7840
  return c.json({ messages });
7785
7841
  } catch (err) {
7786
7842
  console.error(`${TAG21} messages error: ${String(err)}`);
@@ -8437,14 +8493,14 @@ function joinTextBlocks(content) {
8437
8493
  }
8438
8494
  return parts.join("");
8439
8495
  }
8440
- function assistantTurns(content, ts) {
8496
+ function assistantTurns(content, ts, promoteFinal = false) {
8441
8497
  if (!Array.isArray(content)) return [];
8442
8498
  const out = [];
8443
8499
  for (const block of content) {
8444
8500
  if (!block || typeof block !== "object") continue;
8445
8501
  const b = block;
8446
8502
  if (b.type === "text" && typeof b.text === "string") {
8447
- out.push({ kind: "agent-text", text: b.text, ts });
8503
+ out.push(promoteFinal && b.text.trim().length > 0 ? { kind: "agent-webchat-final", text: b.text, ts } : { kind: "agent-text", text: b.text, ts });
8448
8504
  } else if (b.type === "tool_use" && (b.name === WA_REPLY_TOOL || b.name === WEBCHAT_REPLY_TOOL || b.name === CHANNEL_REPLY_TOOL)) {
8449
8505
  const text = b.input?.text;
8450
8506
  out.push({ kind: "agent-reply", text: typeof text === "string" ? text : "", ts });
@@ -8495,7 +8551,7 @@ function renderOrSuppressChannelInbound(u, ts, out, queuedPendingSuppress) {
8495
8551
  out.push(operatorInboundTurn(u, ts));
8496
8552
  }
8497
8553
  }
8498
- function parseTranscript(lines, queuedPendingSuppress = /* @__PURE__ */ new Map()) {
8554
+ function parseTranscript(lines, queuedPendingSuppress = /* @__PURE__ */ new Map(), turnCtx = {}) {
8499
8555
  const out = [];
8500
8556
  for (const line of lines) {
8501
8557
  if (!line || line[0] !== "{") continue;
@@ -8518,23 +8574,31 @@ function parseTranscript(lines, queuedPendingSuppress = /* @__PURE__ */ new Map(
8518
8574
  out.push({ kind: "agent-error", code, raw, ts });
8519
8575
  continue;
8520
8576
  }
8521
- out.push(...assistantTurns(msg?.content, ts));
8577
+ const isEnd = msg?.stop_reason === "end_turn";
8578
+ out.push(...assistantTurns(msg?.content, ts, isEnd && turnCtx.lastChannelSource === "webchat"));
8522
8579
  continue;
8523
8580
  }
8524
8581
  if (row.type === "queue-operation" && row.operation === "enqueue") {
8525
8582
  const content = asString(row.content);
8526
- if (content !== null && CHANNEL_WRAPPER2.test(content) && !isScheduleSource(content)) {
8583
+ if (content !== null && CHANNEL_WRAPPER2.test(content)) {
8527
8584
  const u = unwrapChannel(content);
8528
- out.push(operatorInboundTurn(u, ts));
8529
- queuedPendingSuppress.set(u.text, (queuedPendingSuppress.get(u.text) ?? 0) + 1);
8585
+ turnCtx.lastChannelSource = u.source;
8586
+ if (!isScheduleSource(content)) {
8587
+ out.push(operatorInboundTurn(u, ts));
8588
+ queuedPendingSuppress.set(u.text, (queuedPendingSuppress.get(u.text) ?? 0) + 1);
8589
+ }
8530
8590
  }
8531
8591
  continue;
8532
8592
  }
8533
8593
  if (row.type === "attachment") {
8534
8594
  const att = row.attachment;
8535
8595
  const isChannelQueued = att?.type === "queued_command" && att.isMeta === true && typeof att.origin === "object" && att.origin !== null && att.origin.kind === "channel" && typeof att.prompt === "string";
8536
- if (isChannelQueued && !isScheduleSource(att.prompt)) {
8537
- renderOrSuppressChannelInbound(unwrapChannel(att.prompt), ts, out, queuedPendingSuppress);
8596
+ if (isChannelQueued) {
8597
+ const u = unwrapChannel(att.prompt);
8598
+ turnCtx.lastChannelSource = u.source;
8599
+ if (!isScheduleSource(att.prompt)) {
8600
+ renderOrSuppressChannelInbound(u, ts, out, queuedPendingSuppress);
8601
+ }
8538
8602
  }
8539
8603
  continue;
8540
8604
  }
@@ -8559,8 +8623,10 @@ function parseTranscript(lines, queuedPendingSuppress = /* @__PURE__ */ new Map(
8559
8623
  // enqueue row AND this row both render and every channel message doubles.
8560
8624
  CHANNEL_WRAPPER2.test(text);
8561
8625
  if (isChannel) {
8626
+ const u = unwrapChannel(text);
8627
+ turnCtx.lastChannelSource = u.source;
8562
8628
  if (!isScheduleSource(text)) {
8563
- renderOrSuppressChannelInbound(unwrapChannel(text), ts, out, queuedPendingSuppress);
8629
+ renderOrSuppressChannelInbound(u, ts, out, queuedPendingSuppress);
8564
8630
  }
8565
8631
  } else if (row.isMeta === true) {
8566
8632
  out.push({ kind: "harness-internal", text, ts });
@@ -8663,6 +8729,18 @@ function pickActivity(entries, grown, nowMs, concurrencyWindowMs) {
8663
8729
  return { hex: newest.hex, lastEmitAt: newest.mtimeMs, count };
8664
8730
  }
8665
8731
 
8732
+ // app/admin-types.ts
8733
+ var ACCEPT_MIME = "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,audio/ogg,audio/opus,audio/mp4,audio/x-m4a,audio/mpeg,audio/webm,audio/wav,video/mp4,.docx,.odt,.rtf,.opus,.ogg,.m4a,.mp4,.mp3,.wav,.webm";
8734
+ var SUPPORTED_MIME_SET = new Set(ACCEPT_MIME.split(",").filter((t) => !t.startsWith(".")));
8735
+ var MAX_ATTACHMENTS = 5;
8736
+ var MAX_FILE_BYTES = 50 * 1024 * 1024;
8737
+
8738
+ // app/lib/audio-attachment-mime.ts
8739
+ function isMimeAdmitted(mimeType, supportedSet) {
8740
+ const bare = mimeType.split(";")[0].trim().toLowerCase();
8741
+ return supportedSet.has(bare);
8742
+ }
8743
+
8666
8744
  // server/routes/whatsapp-reader.ts
8667
8745
  var app4 = new Hono();
8668
8746
  app4.get("/conversations", requireAdminSession, async (c) => {
@@ -8988,6 +9066,7 @@ data: ${JSON.stringify(obj)}
8988
9066
  log: (line) => console.log(line)
8989
9067
  });
8990
9068
  const queuedPendingSuppress = /* @__PURE__ */ new Map();
9069
+ const turnCtx = {};
8991
9070
  const drain = () => {
8992
9071
  try {
8993
9072
  const { buf, end } = readFrom(jsonlPath, offset);
@@ -8995,7 +9074,7 @@ data: ${JSON.stringify(obj)}
8995
9074
  const { lines, nextOffset } = splitNewLines(buf, offset);
8996
9075
  offset = nextOffset;
8997
9076
  let n = 0;
8998
- for (const turn of parseTranscript(lines, queuedPendingSuppress)) {
9077
+ for (const turn of parseTranscript(lines, queuedPendingSuppress, turnCtx)) {
8999
9078
  send(controller, enrichAdminAttachments(enrichDownloads(turn, scratchpadRoot)), offset);
9000
9079
  actx.lastParentTurns.push(turn);
9001
9080
  if (turn.kind === "agent-error") {
@@ -9015,7 +9094,7 @@ data: ${JSON.stringify(obj)}
9015
9094
  const { buf, end } = readFrom(jsonlPath, 0);
9016
9095
  offset = end;
9017
9096
  let n = 0;
9018
- for (const turn of parseTranscript(buf.toString("utf8").split("\n"), queuedPendingSuppress)) {
9097
+ for (const turn of parseTranscript(buf.toString("utf8").split("\n"), queuedPendingSuppress, turnCtx)) {
9019
9098
  send(controller, enrichAdminAttachments(enrichDownloads(turn, scratchpadRoot)), offset);
9020
9099
  actx.lastParentTurns.push(turn);
9021
9100
  if (turn.kind === "agent-error") {
@@ -9140,7 +9219,8 @@ app4.get("/store-stream", requireAdminSession, (c) => {
9140
9219
  text: r.body,
9141
9220
  ts: r.dateSent,
9142
9221
  fromMe: r.fromMe,
9143
- senderName: r.senderName
9222
+ senderName: r.senderName,
9223
+ origin: r.origin
9144
9224
  });
9145
9225
  const readable = new ReadableStream({
9146
9226
  start(controller) {
@@ -9233,6 +9313,167 @@ data: ${JSON.stringify(turn)}
9233
9313
  headers: { "Content-Type": "text/event-stream", "Cache-Control": "no-cache", Connection: "keep-alive" }
9234
9314
  });
9235
9315
  });
9316
+ var MANUAL_TAG = "[wa-manual-send]";
9317
+ function mediaTypeForMime(mime) {
9318
+ if (mime.startsWith("image/")) return "image";
9319
+ if (mime.startsWith("audio/")) return "audio";
9320
+ if (mime.startsWith("video/")) return "video";
9321
+ return null;
9322
+ }
9323
+ app4.post("/reply", requireAdminSession, async (c) => {
9324
+ const sendId = process.hrtime.bigint().toString(36).slice(-8);
9325
+ const t0 = Date.now();
9326
+ const exit = (outcome) => console.log(`${MANUAL_TAG} op=exit sendId=${sendId} ranMs=${Date.now() - t0} outcome=${outcome}`);
9327
+ try {
9328
+ const ct = c.req.header("content-type") ?? "";
9329
+ let accountIdRaw;
9330
+ let remoteJid;
9331
+ let text;
9332
+ let files = [];
9333
+ if (ct.includes("multipart/form-data")) {
9334
+ const form = await c.req.formData();
9335
+ accountIdRaw = form.get("accountId")?.toString();
9336
+ remoteJid = form.get("remoteJid")?.toString();
9337
+ const t = form.get("text")?.toString();
9338
+ text = t && t.trim().length ? t : void 0;
9339
+ files = form.getAll("files").filter((f) => f instanceof File);
9340
+ } else {
9341
+ const body = await c.req.json().catch(() => ({}));
9342
+ accountIdRaw = typeof body.accountId === "string" ? body.accountId : void 0;
9343
+ remoteJid = typeof body.remoteJid === "string" ? body.remoteJid : void 0;
9344
+ text = typeof body.text === "string" && body.text.trim().length ? body.text : void 0;
9345
+ }
9346
+ console.log(`${MANUAL_TAG} op=request sendId=${sendId} accountId=${accountIdRaw ?? ""} remoteJid=${remoteJid ?? ""} textLen=${text?.length ?? 0} fileCount=${files.length}`);
9347
+ if (!accountIdRaw || !remoteJid) {
9348
+ exit("rejected");
9349
+ return c.json({ error: "accountId and remoteJid are required" }, 400);
9350
+ }
9351
+ if (!text && files.length === 0) {
9352
+ exit("rejected");
9353
+ return c.json({ error: "nothing to send: provide text or attachments" }, 400);
9354
+ }
9355
+ if (files.length > MAX_ATTACHMENTS) {
9356
+ exit("rejected");
9357
+ return c.json({ error: `at most ${MAX_ATTACHMENTS} attachments` }, 400);
9358
+ }
9359
+ let accountId;
9360
+ try {
9361
+ accountId = validateAccountId(accountIdRaw);
9362
+ } catch {
9363
+ exit("rejected");
9364
+ return c.json({ error: "invalid accountId" }, 400);
9365
+ }
9366
+ const validAccount = isValidAccountId(accountId);
9367
+ console.log(`${MANUAL_TAG} op=scope sendId=${sendId} accountId=${accountId} validAccount=${validAccount}`);
9368
+ if (!validAccount) {
9369
+ exit("rejected");
9370
+ return c.json({ error: "unknown account" }, 400);
9371
+ }
9372
+ if (isGroupJid(remoteJid)) {
9373
+ console.log(`${MANUAL_TAG} op=reject sendId=${sendId} reason=group-send-blocked`);
9374
+ exit("rejected");
9375
+ return c.json({ error: "group conversations are read-only", reason: "group-send-blocked" }, 403);
9376
+ }
9377
+ if (!isUserJid(remoteJid)) {
9378
+ exit("rejected");
9379
+ return c.json({ error: "invalid remoteJid" }, 400);
9380
+ }
9381
+ const convo = readConversation(accountId, remoteJid);
9382
+ const hasConversation = convo.length > 0;
9383
+ console.log(`${MANUAL_TAG} op=guard sendId=${sendId} remoteJid=${remoteJid} hasConversation=${hasConversation}`);
9384
+ if (!hasConversation) {
9385
+ console.log(`${MANUAL_TAG} op=reject sendId=${sendId} reason=no-existing-conversation`);
9386
+ exit("rejected");
9387
+ return c.json({ error: "no existing conversation with this contact", reason: "no-existing-conversation" }, 403);
9388
+ }
9389
+ const template = convo[convo.length - 1];
9390
+ for (const f of files) {
9391
+ if (!isMimeAdmitted(f.type, SUPPORTED_MIME_SET)) {
9392
+ exit("rejected");
9393
+ return c.json({ error: `unsupported file type: ${f.type}` }, 400);
9394
+ }
9395
+ if (f.size > MAX_FILE_BYTES) {
9396
+ exit("rejected");
9397
+ return c.json({ error: `"${f.name}" exceeds the 50 MB limit` }, 400);
9398
+ }
9399
+ }
9400
+ const res = resolveSocket(accountId);
9401
+ if (!res.ok) {
9402
+ console.log(`${MANUAL_TAG} op=socket sendId=${sendId} accountId=${accountId} result=${res.reason} presentKeys=${res.presentKeys.join(",") || "none"}`);
9403
+ exit("error");
9404
+ if (res.reason === "key-miss") return c.json({ error: `No WhatsApp socket is registered for account "${accountId}" (present: ${res.presentKeys.join(", ") || "none"}). This is an account-keying mismatch, not a dropped connection.` }, 503);
9405
+ return c.json({ error: `WhatsApp account "${accountId}" is registered but its socket is disconnected.` }, 503);
9406
+ }
9407
+ console.log(`${MANUAL_TAG} op=socket sendId=${sendId} accountId=${accountId} result=ok socketAccountId=${res.accountId}`);
9408
+ const record = (waMessageId, body) => {
9409
+ const nowIso = (/* @__PURE__ */ new Date()).toISOString();
9410
+ const rec = {
9411
+ messageId: `whatsapp-live:${res.accountId}:${remoteJid}:${waMessageId}`,
9412
+ sessionId: template.sessionId,
9413
+ dateSent: nowIso,
9414
+ body,
9415
+ fromMe: true,
9416
+ senderTelephone: template.fromMe ? template.senderTelephone : "",
9417
+ senderName: null,
9418
+ remoteJid,
9419
+ msgKeyId: waMessageId,
9420
+ quotedId: null,
9421
+ quotedSender: null,
9422
+ scope: template.scope,
9423
+ origin: "operator-manual",
9424
+ createdAt: nowIso
9425
+ };
9426
+ appendMessage(accountId, rec);
9427
+ const present = readConversation(accountId, remoteJid).some((r) => r.messageId === rec.messageId);
9428
+ console.log(`${MANUAL_TAG} op=recorded sendId=${sendId} waMessageId=${waMessageId} present=${present}`);
9429
+ };
9430
+ let sent = 0;
9431
+ if (text) {
9432
+ const r = await sendTextMessage(res.sock, remoteJid, text, { accountId: res.accountId });
9433
+ if (!r.success) {
9434
+ console.log(`${MANUAL_TAG} op=send-fail sendId=${sendId} kind=text error=${r.error ?? ""}`);
9435
+ exit("error");
9436
+ return c.json({ error: r.error ?? "send failed" }, 500);
9437
+ }
9438
+ console.log(`${MANUAL_TAG} op=sent sendId=${sendId} kind=text waMessageId=${r.messageId ?? ""}`);
9439
+ if (r.messageId) record(r.messageId, text);
9440
+ sent++;
9441
+ }
9442
+ for (let i = 0; i < files.length; i++) {
9443
+ const stored = await storeAttachment(accountId, files[i]);
9444
+ console.log(`${MANUAL_TAG} op=staged sendId=${sendId} idx=${i} bytes=${stored.sizeBytes} mime=${stored.mimeType}`);
9445
+ const kind = mediaTypeForMime(stored.mimeType);
9446
+ let mid;
9447
+ if (kind) {
9448
+ const buffer = Buffer.from(await files[i].arrayBuffer());
9449
+ const r = await sendMediaMessage(res.sock, remoteJid, { type: kind, buffer, mimetype: stored.mimeType, filename: stored.filename, ptt: kind === "audio" }, { accountId: res.accountId });
9450
+ if (!r.success) {
9451
+ console.log(`${MANUAL_TAG} op=send-fail sendId=${sendId} kind=${kind} idx=${i} error=${r.error ?? ""}`);
9452
+ exit("error");
9453
+ return c.json({ error: r.error ?? "media send failed" }, 500);
9454
+ }
9455
+ mid = r.messageId;
9456
+ } else {
9457
+ const r = await sendWhatsAppDocument({ to: remoteJid, filePath: stored.storagePath, accountId: res.accountId, maxyAccountId: accountId, platformRoot: PLATFORM_ROOT });
9458
+ if (!r.ok) {
9459
+ console.log(`${MANUAL_TAG} op=send-fail sendId=${sendId} kind=document idx=${i} error=${r.error}`);
9460
+ exit("error");
9461
+ return c.json({ error: r.error }, r.status);
9462
+ }
9463
+ mid = r.messageId;
9464
+ }
9465
+ console.log(`${MANUAL_TAG} op=sent sendId=${sendId} kind=${kind ?? "document"} idx=${i} waMessageId=${mid ?? ""}`);
9466
+ if (mid) record(mid, `[sent ${stored.filename}]`);
9467
+ sent++;
9468
+ }
9469
+ exit("delivered");
9470
+ return c.json({ success: true, sent });
9471
+ } catch (err) {
9472
+ console.error(`${MANUAL_TAG} op=error sendId=${sendId} error=${String(err)}`);
9473
+ exit("error");
9474
+ return c.json({ error: String(err) }, 500);
9475
+ }
9476
+ });
9236
9477
  var whatsapp_reader_default = app4;
9237
9478
 
9238
9479
  // server/routes/public-reader.ts
@@ -21855,7 +22096,24 @@ function createWaChannelRoutes(deps) {
21855
22096
  if (typeof senderId !== "string" || typeof sessionId !== "string" || typeof replied !== "boolean") {
21856
22097
  return c.json({ error: "senderId, sessionId and replied required" }, 400);
21857
22098
  }
22099
+ const interactive = body?.interactive === true;
22100
+ const finalText = typeof body?.finalText === "string" ? body.finalText : "";
21858
22101
  const sid = sessionId.slice(0, 8);
22102
+ const deliver = interactive && finalText.trim().length > 0;
22103
+ if (deliver) {
22104
+ const bytes = Buffer.byteLength(finalText, "utf8");
22105
+ try {
22106
+ await deps.sendOutbound(senderId, finalText);
22107
+ } catch (err) {
22108
+ const message = err instanceof Error ? err.message : String(err);
22109
+ console.error(
22110
+ `[whatsapp-native] op=turn-strand-anomaly senderId=${senderId} sessionId=${sid} interactive=yes bytes=${bytes} delivered=undelivered error=${message}`
22111
+ );
22112
+ return c.json({ ok: true, delivered: "undelivered" });
22113
+ }
22114
+ console.error(`[whatsapp-native] op=turn-end sessionId=${sid} replied=${replied ? "yes" : "no"} delivered=fallback bytes=${bytes}`);
22115
+ return c.json({ ok: true, delivered: "fallback" });
22116
+ }
21859
22117
  if (replied) {
21860
22118
  console.error(`[whatsapp-native] op=turn-end sessionId=${sid} replied=yes delivered=reply`);
21861
22119
  return c.json({ ok: true, delivered: "reply" });
@@ -21976,6 +22234,11 @@ var WaGateway = class {
21976
22234
  console.error(
21977
22235
  `[whatsapp-native] op=inbound senderId=${input.senderId} accountId=${input.accountId} bytes=${bytes} ${mediaField} source=${source} delivery=${willDeliverNow ? "immediate" : "queued"}`
21978
22236
  );
22237
+ if (source === "schedule" && (hadSubscriber || this.spawning.has(input.senderId))) {
22238
+ console.error(
22239
+ `[whatsapp-native] op=coalesced-onto-live-session eventId=${input.scheduleProvenance?.eventId ?? "-"} senderId=${input.senderId} droppedSeat=${input.scheduledSessionId ?? "-"} reason=${hadSubscriber ? "live-subscriber" : "spawn-in-flight"}`
22240
+ );
22241
+ }
21979
22242
  if (!hadSubscriber && !this.spawning.has(input.senderId)) {
21980
22243
  this.spawning.add(input.senderId);
21981
22244
  console.error(`[whatsapp-native] op=spawn-trigger senderId=${input.senderId}`);
@@ -22282,17 +22545,20 @@ function createWebchatChannelRoutes(deps) {
22282
22545
  if (typeof key !== "string" || typeof sessionId !== "string" || typeof replied !== "boolean") {
22283
22546
  return c.json({ error: "key, sessionId and replied required" }, 400);
22284
22547
  }
22548
+ const interactive = body?.interactive === true;
22549
+ const finalBytes = typeof body?.finalBytes === "number" && Number.isFinite(body.finalBytes) ? body.finalBytes : 0;
22285
22550
  const k = key.slice(0, 8);
22286
22551
  const sid = sessionId.slice(0, 8);
22552
+ if (interactive && finalBytes > 0) {
22553
+ console.error(`[webchat-native] op=turn-end channel=webchat key=${k} sessionId=${sid} replied=${replied ? "yes" : "no"} delivered=fallback bytes=${finalBytes}`);
22554
+ return c.json({ ok: true, delivered: "fallback" });
22555
+ }
22287
22556
  if (replied) {
22557
+ console.error(`[webchat-native] op=turn-end channel=webchat key=${k} sessionId=${sid} delivered=reply`);
22288
22558
  return c.json({ ok: true, delivered: "reply" });
22289
22559
  }
22290
- const finalBytes = typeof body?.finalBytes === "number" && Number.isFinite(body.finalBytes) ? body.finalBytes : 0;
22291
- if (finalBytes <= 0) {
22292
- return c.json({ ok: true, delivered: "none" });
22293
- }
22294
- console.error(`[webchat-native] op=turn-undelivered channel=webchat key=${k} sessionId=${sid} bytes=${finalBytes}`);
22295
- return c.json({ ok: true, delivered: "undelivered" });
22560
+ console.error(`[webchat-native] op=turn-end channel=webchat key=${k} sessionId=${sid} delivered=none`);
22561
+ return c.json({ ok: true, delivered: "none" });
22296
22562
  });
22297
22563
  return app61;
22298
22564
  }
@@ -23225,7 +23491,24 @@ function createTelegramChannelRoutes(deps) {
23225
23491
  if (typeof key !== "string" || typeof sessionId !== "string" || typeof replied !== "boolean") {
23226
23492
  return c.json({ error: "key, sessionId and replied required" }, 400);
23227
23493
  }
23494
+ const interactive = body?.interactive === true;
23495
+ const finalText = typeof body?.finalText === "string" ? body.finalText : "";
23228
23496
  const sid = sessionId.slice(0, 8);
23497
+ const deliver = interactive && finalText.trim().length > 0;
23498
+ if (deliver) {
23499
+ const bytes = Buffer.byteLength(finalText, "utf8");
23500
+ try {
23501
+ await deps.sendOutbound(key, finalText);
23502
+ } catch (err) {
23503
+ const message = err instanceof Error ? err.message : String(err);
23504
+ console.error(
23505
+ `[telegram-native] op=turn-strand-anomaly key=${key} sessionId=${sid} interactive=yes bytes=${bytes} delivered=undelivered error=${message}`
23506
+ );
23507
+ return c.json({ ok: true, delivered: "undelivered" });
23508
+ }
23509
+ console.error(`[telegram-native] op=turn-end key=${key} sessionId=${sid} replied=${replied ? "yes" : "no"} delivered=fallback bytes=${bytes}`);
23510
+ return c.json({ ok: true, delivered: "fallback" });
23511
+ }
23229
23512
  if (replied) {
23230
23513
  console.error(`[telegram-native] op=turn-end key=${key} sessionId=${sid} replied=yes delivered=reply`);
23231
23514
  return c.json({ ok: true, delivered: "reply" });
@@ -23306,6 +23589,11 @@ var TelegramGateway = class {
23306
23589
  console.error(
23307
23590
  `[telegram-native] op=inbound key=${input.senderId} accountId=${input.accountId} botType=${input.role} bytes=${bytes} source=${source} delivery=${willDeliverNow ? "immediate" : "queued"}`
23308
23591
  );
23592
+ if (source === "schedule" && (hadSubscriber || this.spawning.has(input.senderId))) {
23593
+ console.error(
23594
+ `[telegram-native] op=coalesced-onto-live-session eventId=${input.scheduleProvenance?.eventId ?? "-"} senderId=${input.senderId} droppedSeat=${input.scheduledSessionId ?? "-"} reason=${hadSubscriber ? "live-subscriber" : "spawn-in-flight"}`
23595
+ );
23596
+ }
23309
23597
  if (!hadSubscriber && !this.spawning.has(input.senderId)) {
23310
23598
  this.spawning.add(input.senderId);
23311
23599
  console.error(`[telegram-native] op=spawn-trigger key=${input.senderId} role=${input.role}`);
@@ -25351,6 +25639,7 @@ for (const acct of listValidAccounts()) {
25351
25639
  cleanupLeakedPremiumSubs(acct.accountDir, acct.config, acct.accountId);
25352
25640
  }
25353
25641
  purgeNonSocketAdminPhonesAtBoot();
25642
+ void preloadEmbedModel();
25354
25643
  warnOnChannelAdminBindingDrift();
25355
25644
  var bootEnabled = Array.isArray(bootAccountConfig?.enabledPlugins) ? bootAccountConfig.enabledPlugins : [];
25356
25645
  var bootDelivered = [];
@@ -1 +0,0 @@
1
- import{o as e}from"./chunk-Ck5AOu5v.js";import{_ as t,b as n,h as r,w as i,y as a}from"./useSubAccountSwitcher-DADvGnr1.js";import{i as o}from"./admin-types-ClHBm0ni.js";import{b as s,y as c}from"./AdminShell-Bk1AFQ4D.js";import{t as l}from"./Checkbox-B_lfjsqd.js";var u=`admin-landing-redirected`,d=`/graph`;function f(e){return e.variant===`operator`?!1:e.appState===`chat`&&!e.alreadyRedirected}var p=e(i(),1);function m(e=`admin`){let[t,r]=(0,p.useState)(`loading`),[i,a]=(0,p.useState)(``),[c,l]=(0,p.useState)(``),[m,h]=(0,p.useState)(``),[g,_]=(0,p.useState)(!1),[v,y]=(0,p.useState)(!1),[b,x]=(0,p.useState)(!1),[S,C]=(0,p.useState)(!1),[w,T]=(0,p.useState)(!1),[E,D]=(0,p.useState)(null),[O,k]=(0,p.useState)(null),[A,j]=(0,p.useState)(void 0),[M,N]=(0,p.useState)(null),[P,F]=(0,p.useState)(void 0),[I,L]=(0,p.useState)(null),[R,z]=(0,p.useState)(null),[B,V]=(0,p.useState)(void 0),H=(0,p.useRef)(void 0),[U,W]=(0,p.useState)(!1),[G,K]=(0,p.useState)(!0);(0,p.useEffect)(()=>{typeof window>`u`||fetch(`/api/remote-auth/status`).then(e=>e.ok?e.json():null).then(e=>{e?.configured&&W(!0)}).catch(()=>{})},[]);let q=(0,p.useRef)(null),J=(0,p.useRef)(null);(0,p.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();D(n.session_key),z(n.sessionId??null),j(n.businessName),N(n.role??null),F(n.userName===void 0?null:n.userName),L(n.avatar??null);let i=o(n.thinkingView);return H.current=i,V(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}K(!!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,p.useEffect)(()=>{t===`chat`&&fetch(`/api/admin/claude-info`).then(e=>{if(e.ok)return e.json()}).then(e=>{e&&k(e)}).catch(()=>{})},[t]),(0,p.useEffect)(()=>{if(typeof window>`u`)return;let n=!1;try{n=sessionStorage.getItem(u)===`1`}catch{}if(f({appState:t,alreadyRedirected:n,variant:e})){try{sessionStorage.setItem(u,`1`)}catch{}console.info(`[admin-ui] landing-redirect target=${d}`),window.location.replace(d)}},[t,e]);let Y=(0,p.useRef)(null);(0,p.useEffect)(()=>{if(t!==`chat`)return;let e=setInterval(async()=>{try{let e=await fetch(`/api/health`);if(e.ok){let t=await e.json();K(t.auth_status!==`dead`&&t.auth_status!==`missing`)}}catch{}if(E)try{let e=await fetch(`/api/admin/session?session_key=${encodeURIComponent(E)}`);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}`),Y.current?.()}catch{}},300*1e3);return()=>clearInterval(e)},[t,E]),(0,p.useEffect)(()=>{t===`connect-claude`&&fetch(`/api/health`).then(e=>e.ok?e.json():null).then(e=>{e?.claude_authenticated&&(K(!0),r(`enter-pin`))}).catch(()=>{})},[t]);async function X(e,t){y(!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}h(e.error||`Invalid PIN`);return}let s=await i.json();D(s.session_key),z(s.sessionId??null),j(s.businessName),N(s.role??null),F(s.userName===void 0?null:s.userName),L(s.avatar??null);let c=o(s.thinkingView);H.current=c,V(c);try{sessionStorage.setItem(`maxy-admin-session-key`,s.session_key)}catch{}a(``),r(`chat`)}catch(e){console.error(`[admin] connection error:`,e),h(`Could not connect.`)}finally{y(!1)}}let Z=(0,p.useCallback)(async e=>{if(e.preventDefault(),v)return;h(``);let t=c.trim();if(!t){h(`Please enter your name.`);return}if(i.length<4){h(`PIN must be at least 4 characters.`);return}let o=i;y(!0);try{let e=await fetch(`/api/onboarding/set-pin`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({pin:o,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){console.log(`[admin] PIN already configured — re-checking health`);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`):h(t.error||`Failed to set PIN.`)}else r(`enter-pin`)}catch{r(`enter-pin`)}return}h(t.error||`Failed to set PIN.`);return}let i=await fetch(`/api/health`);if((i.ok?await i.json():null)?.claude_authenticated){await X(o);return}a(``),r(`connect-claude`)}catch(e){console.error(`[admin] connection error:`,e),h(`Could not connect.`)}finally{y(!1)}},[i,v,c]),Q=(0,p.useCallback)(async e=>{e.preventDefault(),h(``),await X(i)},[i]),ee=(0,p.useCallback)(async()=>{T(!0);try{if(!await s())return console.warn(`[admin-ui] claude-disconnect not verified — credentials may persist; staying put`),!1;K(!1),D(null),N(null),F(void 0),L(null);try{sessionStorage.removeItem(`maxy-admin-session-key`),sessionStorage.removeItem(u)}catch{}return r(`connect-claude`),!0}finally{T(!1)}},[]),$=(0,p.useCallback)(()=>{D(null),N(null),F(void 0),L(null);try{sessionStorage.removeItem(`maxy-admin-session-key`),sessionStorage.removeItem(u)}catch{}a(``),h(``),r(`enter-pin`)},[]);return(0,p.useEffect)(()=>{Y.current=$},[$]),{appState:t,setAppState:r,pin:i,setPin:a,operatorName:c,setOperatorName:l,pinError:m,setPinError:h,showPin:g,setShowPin:_,pinLoading:v,authPolling:b,setAuthPolling:x,authLoading:S,setAuthLoading:C,disconnecting:w,cacheKey:E,setCacheKey:D,claudeInfo:O,setClaudeInfo:k,businessName:A,role:M,userName:P,userAvatar:I,sessionId:R,setSessionId:z,expandAll:B,setExpandAll:V,expandAllDefaultRef:H,remoteAuthEnabled:U,claudeConnected:G,pinInputRef:q,setPinFormRef:J,handleSetPin:Z,handleLogin:Q,handleDisconnect:ee,handleLogout:$}}var h=a();function g({inputRef:e,value:t,onChange:n,onComplete:r,showPin:i,autoFocus:a}){let o=(0,p.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,h.jsx)(`div`,{className:`pin-field`,children:Array.from({length:6}).map((n,r)=>(0,h.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 _(e){let{pin:n,setPin:i,showPin:a,setShowPin:o,pinLoading:s,pinError:u,pinInputRef:d,setPinFormRef:f,onSubmit:p,operatorName:m,setOperatorName:_}=e;return(0,h.jsx)(`div`,{className:`connect-page`,children:(0,h.jsxs)(`div`,{className:`connect-content`,children:[(0,h.jsx)(`img`,{src:t,alt:r.productName,className:`connect-logo connect-logo--maxy`}),!r.logoContainsName&&(0,h.jsxs)(`h1`,{className:`connect-title`,children:[`Welcome to `,r.productName]}),(0,h.jsxs)(`p`,{className:`connect-subtitle`,children:[`Tell `,r.productName,` who you are, then choose a PIN.`]}),(0,h.jsxs)(`form`,{ref:f,onSubmit:p,className:`connect-pin-form`,children:[(0,h.jsxs)(`div`,{className:`pin-input-row`,children:[(0,h.jsx)(`input`,{type:`text`,className:`connect-name-input`,placeholder:`Your full name`,value:m,onChange:e=>_(e.target.value),autoComplete:`name`,autoFocus:!0,required:!0,"aria-label":`Your full name`}),(0,h.jsx)(`div`,{style:{width:38,flexShrink:0},"aria-hidden":`true`})]}),(0,h.jsxs)(`div`,{className:`pin-input-row`,children:[(0,h.jsx)(g,{inputRef:d,value:n,onChange:i,onComplete:()=>{},showPin:a}),(0,h.jsx)(c,{variant:`send`,type:`submit`,disabled:!n||!m.trim(),loading:s,"aria-label":`Set PIN`,children:(0,h.jsxs)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,h.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`}),(0,h.jsx)(`polyline`,{points:`12 5 19 12 12 19`})]})})]}),(0,h.jsx)(l,{checked:a,onChange:()=>o(e=>!e),label:`Show PIN`})]}),u&&(0,h.jsx)(`p`,{className:`admin-pin-error`,children:u})]})})}function v(e){let{pin:n,setPin:i,showPin:a,setShowPin:o,pinLoading:s,pinError:u,pinInputRef:d,onSubmit:f,remoteAuthEnabled:p,onSignOutRemote:m}=e;return(0,h.jsxs)(`div`,{className:`connect-page`,children:[p&&m&&(0,h.jsx)(`button`,{type:`button`,className:`connect-signout`,onClick:m,children:`Sign out`}),(0,h.jsxs)(`div`,{className:`connect-content`,children:[(0,h.jsx)(`img`,{src:t,alt:r.productName,className:`connect-logo connect-logo--maxy`}),!r.logoContainsName&&(0,h.jsx)(`h1`,{className:`connect-title`,children:r.productName}),(0,h.jsxs)(`form`,{onSubmit:f,className:`connect-pin-form`,children:[(0,h.jsxs)(`div`,{className:`pin-input-row`,children:[(0,h.jsx)(g,{inputRef:d,value:n,onChange:i,onComplete:()=>{},showPin:a,autoFocus:!0}),(0,h.jsx)(c,{variant:`send`,type:`submit`,disabled:!n,loading:s,children:(0,h.jsxs)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,h.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`}),(0,h.jsx)(`polyline`,{points:`12 5 19 12 12 19`})]})})]}),(0,h.jsx)(`div`,{className:`pin-options`,children:(0,h.jsx)(l,{checked:a,onChange:()=>o(e=>!e),label:`Show PIN`})})]}),u&&(0,h.jsx)(`p`,{className:`admin-pin-error`,children:u})]})]})}function y(e){let{authPolling:n,setAuthPolling:i,authLoading:a,setAuthLoading:o,pinError:s,setPinError:l,setAppState:u}=e,[d,f]=(0,p.useState)(!1),[m,g]=(0,p.useState)(!1),[_,v]=(0,p.useState)(``),[y,b]=(0,p.useState)(``),[x,S]=(0,p.useState)(``);async function C(){S(``);try{let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`paste-code`,code:y})})).json();e.accepted?(S(`Code submitted. Finishing sign-in…`),b(``)):S(e.error||`Could not submit code.`)}catch(e){console.error(`[admin] paste-code error:`,e),S(`Could not submit code.`)}}async function w(){g(!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?f(!0):e.error&&l(e.error)}catch(e){console.error(`[admin] browser launch error:`,e),l(`Could not launch browser.`)}g(!1)}async function T(){o(!0),l(``);try{let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`})).json();if(e.started){i(!0),f(!0),o(!1),v(e.transport||``);for(let e=0;e<120;e++)if(await new Promise(e=>setTimeout(e,2e3)),(await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`wait`})})).json()).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.`),i(!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 E(){await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`stop`})}),i(!1),l(``)}return n||d?(0,h.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100dvh`,overflow:`auto`},children:[(0,h.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,h.jsx)(`button`,{onClick:E,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,h.jsx)(`button`,{onClick:()=>f(!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,h.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`chat-logo`}),(0,h.jsx)(`h1`,{className:`chat-tagline`,children:`Connect Claude`}),(0,h.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,h.jsx)(`div`,{style:{marginTop:`12px`},children:(0,h.jsx)(c,{variant:`primary`,onClick:T,disabled:a,children:a?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`span`,{className:`spin`,style:{display:`inline-block`},children:`✱`}),` Connecting…`]}):`Sign in to Claude`})}),n&&_===`native`&&(0,h.jsxs)(`div`,{style:{marginTop:`14px`,maxWidth:`420px`,margin:`14px auto 0`,display:`flex`,flexDirection:`column`,gap:`8px`},children:[(0,h.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,h.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,h.jsx)(`input`,{type:`text`,value:y,onChange:e=>b(e.target.value),placeholder:`Paste code or redirect URL`,style:{flex:1,padding:`8px 10px`,fontSize:`13px`,border:`1px solid #ccc`,borderRadius:`6px`}}),(0,h.jsx)(c,{variant:`primary`,onClick:C,disabled:!y.trim(),children:`Submit`})]}),x&&(0,h.jsx)(`p`,{style:{fontSize:`12px`,color:`#999`,margin:0},children:x})]})]}),(0,h.jsx)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,minHeight:0,gap:`10px`,padding:`0 0 16px`},children:(0,h.jsx)(`iframe`,{src:`/vnc-viewer.html`,style:{flex:1,width:`100%`,minHeight:0,border:`none`,background:`#111`,display:`block`},title:`Claude Sign-in`})}),s&&(0,h.jsx)(`p`,{className:`admin-pin-error`,style:{textAlign:`center`,padding:`0 20px 16px`},children:s})]}):(0,h.jsx)(`div`,{className:`connect-page`,children:(0,h.jsxs)(`div`,{className:`connect-content`,children:[(0,h.jsxs)(`div`,{className:`connect-logos`,children:[(0,h.jsx)(`div`,{className:`connect-logo-wrap`,children:(0,h.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`connect-logo`})}),(0,h.jsx)(`svg`,{className:`connect-arrow`,viewBox:`0 0 48 24`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,children:(0,h.jsx)(`path`,{d:`M0 12h44m0 0l-8-8m8 8l-8 8`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`})}),(0,h.jsxs)(`div`,{className:`connect-logo-wrap`,children:[(0,h.jsx)(`img`,{src:t,alt:r.productName,className:`connect-logo connect-logo--maxy`}),!r.logoContainsName&&(0,h.jsx)(`span`,{className:`connect-logo-label`,children:r.productName})]})]}),(0,h.jsxs)(`h1`,{className:`connect-title`,children:[`Connect Claude to power `,r.productName]}),(0,h.jsx)(`p`,{className:`connect-subtitle`,children:`Sign in with your Anthropic account to get started.`}),(0,h.jsx)(c,{variant:`primary`,onClick:T,disabled:a,children:a?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`span`,{className:`spin`,style:{display:`inline-block`},children:`✱`}),` Connecting…`]}):`Sign in to Claude`}),(0,h.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,h.jsx)(`button`,{onClick:w,disabled:m,style:{marginTop:`12px`,background:`none`,border:`none`,color:`var(--color-primary, #666)`,fontSize:`13px`,cursor:`pointer`,textDecoration:`underline`,textUnderlineOffset:`3px`},children:m?`Launching…`:`Open browser first`}),s&&(0,h.jsx)(`p`,{className:`admin-pin-error`,children:s})]})})}function b({auth:e}){return e.appState===`loading`?(0,h.jsx)(`div`,{className:`connect-page`}):e.appState===`set-pin`?(0,h.jsx)(_,{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,h.jsx)(y,{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,h.jsx)(v,{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:()=>{console.info(`[admin-ui] remote-auth sign-out → /__remote-auth/logout`),window.location.href=`/__remote-auth/logout`}}):null}export{m as n,b as t};