@rubytech/create-maxy-code 0.1.356 → 0.1.358

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 (256) hide show
  1. package/dist/__tests__/claude-ptys-slice.test.js +36 -1
  2. package/dist/port-resolution.js +18 -1
  3. package/package.json +1 -1
  4. package/payload/platform/package-lock.json +237 -0
  5. package/payload/platform/plugins/admin/mcp/dist/__tests__/capabilities-here.test.js +79 -1
  6. package/payload/platform/plugins/admin/mcp/dist/__tests__/capabilities-here.test.js.map +1 -1
  7. package/payload/platform/plugins/admin/mcp/dist/index.js +17 -3
  8. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  9. package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.d.ts +16 -0
  10. package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.d.ts.map +1 -1
  11. package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.js +52 -0
  12. package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.js.map +1 -1
  13. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +59 -1
  14. package/payload/platform/plugins/cloudflare/PLUGIN.md +7 -1
  15. package/payload/platform/plugins/cloudflare/bin/__tests__/cf-token.test.sh +195 -0
  16. package/payload/platform/plugins/cloudflare/bin/cf-token.sh +157 -0
  17. package/payload/platform/plugins/cloudflare/references/api.md +2 -0
  18. package/payload/platform/plugins/cloudflare/skills/cloudflare/SKILL.md +14 -0
  19. package/payload/platform/plugins/cloudflare/skills/site-deploy/SKILL.md +10 -1
  20. package/payload/platform/plugins/docs/PLUGIN.md +2 -0
  21. package/payload/platform/plugins/docs/references/claudeai-connectors.md +45 -0
  22. package/payload/platform/plugins/docs/references/cloudflare.md +6 -0
  23. package/payload/platform/plugins/docs/references/troubleshooting.md +2 -0
  24. package/payload/platform/plugins/email/.claude-plugin/plugin.json +1 -1
  25. package/payload/platform/plugins/email/PLUGIN.md +7 -3
  26. package/payload/platform/plugins/email/mcp/dist/__tests__/body-extract.test.d.ts +2 -0
  27. package/payload/platform/plugins/email/mcp/dist/__tests__/body-extract.test.d.ts.map +1 -0
  28. package/payload/platform/plugins/email/mcp/dist/__tests__/body-extract.test.js +99 -0
  29. package/payload/platform/plugins/email/mcp/dist/__tests__/body-extract.test.js.map +1 -0
  30. package/payload/platform/plugins/email/mcp/dist/__tests__/compose-draft-id.test.d.ts +2 -0
  31. package/payload/platform/plugins/email/mcp/dist/__tests__/compose-draft-id.test.d.ts.map +1 -0
  32. package/payload/platform/plugins/email/mcp/dist/__tests__/compose-draft-id.test.js +32 -0
  33. package/payload/platform/plugins/email/mcp/dist/__tests__/compose-draft-id.test.js.map +1 -0
  34. package/payload/platform/plugins/email/mcp/dist/__tests__/credentials.test.d.ts +2 -0
  35. package/payload/platform/plugins/email/mcp/dist/__tests__/credentials.test.d.ts.map +1 -0
  36. package/payload/platform/plugins/email/mcp/dist/__tests__/credentials.test.js +109 -0
  37. package/payload/platform/plugins/email/mcp/dist/__tests__/credentials.test.js.map +1 -0
  38. package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft-edit.test.js +64 -6
  39. package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft-edit.test.js.map +1 -1
  40. package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft.test.js +12 -0
  41. package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft.test.js.map +1 -1
  42. package/payload/platform/plugins/email/mcp/dist/__tests__/email-setup.test.js +22 -0
  43. package/payload/platform/plugins/email/mcp/dist/__tests__/email-setup.test.js.map +1 -1
  44. package/payload/platform/plugins/email/mcp/dist/__tests__/imap-drafts.test.js +94 -9
  45. package/payload/platform/plugins/email/mcp/dist/__tests__/imap-drafts.test.js.map +1 -1
  46. package/payload/platform/plugins/email/mcp/dist/__tests__/mail-options.test.js +4 -0
  47. package/payload/platform/plugins/email/mcp/dist/__tests__/mail-options.test.js.map +1 -1
  48. package/payload/platform/plugins/email/mcp/dist/index.js +39 -2
  49. package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
  50. package/payload/platform/plugins/email/mcp/dist/lib/compose.d.ts +5 -0
  51. package/payload/platform/plugins/email/mcp/dist/lib/compose.d.ts.map +1 -1
  52. package/payload/platform/plugins/email/mcp/dist/lib/compose.js +8 -1
  53. package/payload/platform/plugins/email/mcp/dist/lib/compose.js.map +1 -1
  54. package/payload/platform/plugins/email/mcp/dist/lib/credentials.d.ts +14 -7
  55. package/payload/platform/plugins/email/mcp/dist/lib/credentials.d.ts.map +1 -1
  56. package/payload/platform/plugins/email/mcp/dist/lib/credentials.js +87 -31
  57. package/payload/platform/plugins/email/mcp/dist/lib/credentials.js.map +1 -1
  58. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +68 -33
  59. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts.map +1 -1
  60. package/payload/platform/plugins/email/mcp/dist/lib/imap.js +253 -97
  61. package/payload/platform/plugins/email/mcp/dist/lib/imap.js.map +1 -1
  62. package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts +6 -0
  63. package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts.map +1 -1
  64. package/payload/platform/plugins/email/mcp/dist/lib/smtp.js +4 -0
  65. package/payload/platform/plugins/email/mcp/dist/lib/smtp.js.map +1 -1
  66. package/payload/platform/plugins/email/mcp/dist/tools/email-draft-edit.d.ts +8 -1
  67. package/payload/platform/plugins/email/mcp/dist/tools/email-draft-edit.d.ts.map +1 -1
  68. package/payload/platform/plugins/email/mcp/dist/tools/email-draft-edit.js +10 -6
  69. package/payload/platform/plugins/email/mcp/dist/tools/email-draft-edit.js.map +1 -1
  70. package/payload/platform/plugins/email/mcp/dist/tools/email-draft.d.ts.map +1 -1
  71. package/payload/platform/plugins/email/mcp/dist/tools/email-draft.js +4 -2
  72. package/payload/platform/plugins/email/mcp/dist/tools/email-draft.js.map +1 -1
  73. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch-body.d.ts +15 -0
  74. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch-body.d.ts.map +1 -0
  75. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch-body.js +29 -0
  76. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch-body.js.map +1 -0
  77. package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js +1 -1
  78. package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js.map +1 -1
  79. package/payload/platform/plugins/email/mcp/dist/tools/email-status.d.ts.map +1 -1
  80. package/payload/platform/plugins/email/mcp/dist/tools/email-status.js +2 -1
  81. package/payload/platform/plugins/email/mcp/dist/tools/email-status.js.map +1 -1
  82. package/payload/platform/plugins/email/mcp/package.json +2 -0
  83. package/payload/platform/plugins/email/references/email-reference.md +21 -1
  84. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-bootstrap.test.d.ts +2 -0
  85. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-bootstrap.test.d.ts.map +1 -0
  86. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-bootstrap.test.js +60 -0
  87. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-bootstrap.test.js.map +1 -0
  88. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js +11 -1
  89. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js.map +1 -1
  90. package/payload/platform/scripts/rss-sampler.sh +21 -0
  91. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  92. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +1 -0
  93. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  94. package/payload/platform/services/claude-session-manager/dist/connector-auth.d.ts +31 -0
  95. package/payload/platform/services/claude-session-manager/dist/connector-auth.d.ts.map +1 -0
  96. package/payload/platform/services/claude-session-manager/dist/connector-auth.js +49 -0
  97. package/payload/platform/services/claude-session-manager/dist/connector-auth.js.map +1 -0
  98. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +24 -0
  99. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  100. package/payload/platform/services/claude-session-manager/dist/http-server.js +214 -17
  101. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  102. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +2 -1
  103. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
  104. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +24 -4
  105. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
  106. package/payload/platform/services/webchat-channel/dist/instructions.d.ts +1 -0
  107. package/payload/platform/services/webchat-channel/dist/instructions.d.ts.map +1 -1
  108. package/payload/platform/services/webchat-channel/dist/instructions.js +28 -0
  109. package/payload/platform/services/webchat-channel/dist/instructions.js.map +1 -1
  110. package/payload/platform/services/webchat-channel/dist/server.d.ts.map +1 -1
  111. package/payload/platform/services/webchat-channel/dist/server.js +75 -5
  112. package/payload/platform/services/webchat-channel/dist/server.js.map +1 -1
  113. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  114. package/payload/server/{chunk-25UVZNFA.js → chunk-CXEC5RWB.js} +26 -3
  115. package/payload/server/maxy-edge.js +1 -1
  116. package/payload/server/public/assets/{AdminLoginScreens-4I5CdIWl.js → AdminLoginScreens-Ro_RUTDh.js} +1 -1
  117. package/payload/server/public/assets/{AdminShell-Bc9F7X_N.js → AdminShell-CmqhpAPU.js} +1 -1
  118. package/payload/server/public/assets/{Checkbox-DoQV18Ow.js → Checkbox-dYLaMEdh.js} +1 -1
  119. package/payload/server/public/assets/OperatorConversations-2zJh7qnO.css +1 -0
  120. package/payload/server/public/assets/OperatorConversations-Cei12sSK.js +9 -0
  121. package/payload/server/public/assets/{admin-DLsMA09F.js → admin-BldZQrJF.js} +1 -1
  122. package/payload/server/public/assets/{arc-DpkSQNto.js → arc-Crkz45LN.js} +1 -1
  123. package/payload/server/public/assets/architecture-YZFGNWBL-Dma4Bgha.js +1 -0
  124. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-Bw7Yq8O9.js → architectureDiagram-Q4EWVU46-C9JThHgP.js} +1 -1
  125. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-BBtJQFSz.js → blockDiagram-DXYQGD6D-DpsV_HXT.js} +1 -1
  126. package/payload/server/public/assets/{browser-w6rY_KAO.js → browser-DrXZ4wpy.js} +1 -1
  127. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-JAMgxzOr.js → c4Diagram-AHTNJAMY-CTm_6aKi.js} +1 -1
  128. package/payload/server/public/assets/{calendar-CvEdDFYd.js → calendar-CQ4TCbO7.js} +1 -1
  129. package/payload/server/public/assets/channel-B_-5bau1.js +1 -0
  130. package/payload/server/public/assets/chat-D7w6_NE1.js +1 -0
  131. package/payload/server/public/assets/{chunk-2KRD3SAO-eDugsc2L.js → chunk-2KRD3SAO-1KSJW1q6.js} +1 -1
  132. package/payload/server/public/assets/{chunk-336JU56O-BXfECwdC.js → chunk-336JU56O-C3t08Ip-.js} +2 -2
  133. package/payload/server/public/assets/chunk-426QAEUC-Dirxdwjh.js +1 -0
  134. package/payload/server/public/assets/{chunk-4BX2VUAB-CByVeKCY.js → chunk-4BX2VUAB-kl1ze33n.js} +1 -1
  135. package/payload/server/public/assets/{chunk-4TB4RGXK-CpY0DcUB.js → chunk-4TB4RGXK-DxpoDoHg.js} +1 -1
  136. package/payload/server/public/assets/{chunk-55IACEB6-C3YxgyIb.js → chunk-55IACEB6-WM9VJzha.js} +1 -1
  137. package/payload/server/public/assets/{chunk-5FUZZQ4R-Bc0d7j8A.js → chunk-5FUZZQ4R-CLH63ZH3.js} +1 -1
  138. package/payload/server/public/assets/{chunk-5PVQY5BW-CTUGMRIa.js → chunk-5PVQY5BW-DCTb8IAT.js} +1 -1
  139. package/payload/server/public/assets/{chunk-67CJDMHE-CbdPnpLd.js → chunk-67CJDMHE-BSYzyaoH.js} +1 -1
  140. package/payload/server/public/assets/{chunk-7N4EOEYR-Cjl2kevz.js → chunk-7N4EOEYR-CarJ7O2P.js} +1 -1
  141. package/payload/server/public/assets/{chunk-AA7GKIK3-BgozIh5p.js → chunk-AA7GKIK3-DTNLyBpH.js} +1 -1
  142. package/payload/server/public/assets/{chunk-BSJP7CBP-6Ufq45NW.js → chunk-BSJP7CBP-BFmHflHY.js} +1 -1
  143. package/payload/server/public/assets/{chunk-CIAEETIT-BhhYuMnA.js → chunk-CIAEETIT-BpjG0IzU.js} +1 -1
  144. package/payload/server/public/assets/{chunk-EDXVE4YY-BfaJ3yDD.js → chunk-EDXVE4YY-2fSowhlW.js} +1 -1
  145. package/payload/server/public/assets/{chunk-ENJZ2VHE-C7-hIGVC.js → chunk-ENJZ2VHE-ClcranGV.js} +1 -1
  146. package/payload/server/public/assets/{chunk-FMBD7UC4-BQvvyocF.js → chunk-FMBD7UC4-DLq4BItQ.js} +1 -1
  147. package/payload/server/public/assets/{chunk-FOC6F5B3-C6rBDOxH.js → chunk-FOC6F5B3-B9QI3Guz.js} +1 -1
  148. package/payload/server/public/assets/{chunk-ICPOFSXX-BjOJvkVa.js → chunk-ICPOFSXX-BAr-Mv1Z.js} +2 -2
  149. package/payload/server/public/assets/{chunk-K5T4RW27-kKowRHhn.js → chunk-K5T4RW27-8PvAHasY.js} +1 -1
  150. package/payload/server/public/assets/{chunk-KGLVRYIC-bAEV_5eH.js → chunk-KGLVRYIC--aGaDRH5.js} +1 -1
  151. package/payload/server/public/assets/{chunk-LIHQZDEY-BLvsQAfg.js → chunk-LIHQZDEY-BrWj7mw2.js} +1 -1
  152. package/payload/server/public/assets/{chunk-ORNJ4GCN-BzYZfPZ7.js → chunk-ORNJ4GCN-kYQmkMTi.js} +1 -1
  153. package/payload/server/public/assets/{chunk-OYMX7WX6-CL7WRw42.js → chunk-OYMX7WX6-CIsryCWH.js} +1 -1
  154. package/payload/server/public/assets/chunk-QZHKN3VN-Duipo1kI.js +1 -0
  155. package/payload/server/public/assets/{chunk-U2HBQHQK-BdcVGjau.js → chunk-U2HBQHQK-68X653e3.js} +1 -1
  156. package/payload/server/public/assets/{chunk-X2U36JSP-C0CL_Jin.js → chunk-X2U36JSP-v3v9soX3.js} +1 -1
  157. package/payload/server/public/assets/{chunk-XPW4576I-CsV7CUxH.js → chunk-XPW4576I-CW5DPpop.js} +1 -1
  158. package/payload/server/public/assets/{chunk-YZCP3GAM-Cj0_fLkR.js → chunk-YZCP3GAM-B1VP7Rl2.js} +1 -1
  159. package/payload/server/public/assets/{chunk-ZZ45TVLE-DLuquyoY.js → chunk-ZZ45TVLE-DiJrujNY.js} +1 -1
  160. package/payload/server/public/assets/classDiagram-6PBFFD2Q-B3kX5SuB.js +1 -0
  161. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-D761c7Lr.js +1 -0
  162. package/payload/server/public/assets/clone-BrhFv6Tb.js +1 -0
  163. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-BU3EOLXX.js → cose-bilkent-S5V4N54A-BscXxLMc.js} +1 -1
  164. package/payload/server/public/assets/{dagre-KV5264BT-CoCAYhFc.js → dagre-KV5264BT-DVgGlTQ1.js} +1 -1
  165. package/payload/server/public/assets/{dagre-BRq8C9NU.js → dagre-MBv6WlCS.js} +1 -1
  166. package/payload/server/public/assets/data-Dc5XNWgF.js +1 -0
  167. package/payload/server/public/assets/{diagram-5BDNPKRD-DBy5GNaQ.js → diagram-5BDNPKRD-BmhCaO0a.js} +1 -1
  168. package/payload/server/public/assets/{diagram-G4DWMVQ6-l93MsBLv.js → diagram-G4DWMVQ6-ChU9L8vz.js} +1 -1
  169. package/payload/server/public/assets/{diagram-MMDJMWI5-BIfXkVlL.js → diagram-MMDJMWI5-Oy409Zc_.js} +1 -1
  170. package/payload/server/public/assets/{diagram-TYMM5635-BuTJLBny.js → diagram-TYMM5635-Cn1YByqk.js} +1 -1
  171. package/payload/server/public/assets/{erDiagram-SMLLAGMA-BwPxWDbP.js → erDiagram-SMLLAGMA-e17yfLvr.js} +1 -1
  172. package/payload/server/public/assets/{flatten-DtM0XAMt.js → flatten-Cl1Bc3dR.js} +1 -1
  173. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-BhPtHXMR.js → flowDiagram-DWJPFMVM-Dqt7sCVZ.js} +1 -1
  174. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BlXjprdD.js → ganttDiagram-T4ZO3ILL-B4IhwS2r.js} +1 -1
  175. package/payload/server/public/assets/gitGraph-7Q5UKJZL-BCQAqtLy.js +1 -0
  176. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BW36BDiu.js → gitGraphDiagram-UUTBAWPF-BDw-PKcI.js} +1 -1
  177. package/payload/server/public/assets/{graph-BrwfYOr3.js → graph-l_3_j3I9.js} +3 -3
  178. package/payload/server/public/assets/{graph-labels-BNZ8u8TE.js → graph-labels-CJj55nHk.js} +1 -1
  179. package/payload/server/public/assets/{graphlib-Bjg3Tq-k.js → graphlib-DPIYk_sg.js} +1 -1
  180. package/payload/server/public/assets/info-OMHHGYJF-qU7hK50T.js +1 -0
  181. package/payload/server/public/assets/infoDiagram-42DDH7IO-KGdcJeTs.js +2 -0
  182. package/payload/server/public/assets/{isEmpty-D__iH1WQ.js → isEmpty-D1pGOD1J.js} +1 -1
  183. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-CmB-bA_O.js → ishikawaDiagram-UXIWVN3A-BRIHsB3G.js} +1 -1
  184. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-Bt1fJKmc.js → journeyDiagram-VCZTEJTY-aKNgmoHd.js} +1 -1
  185. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DVbksz_J.js → kanban-definition-6JOO6SKY-cwBwT-nm.js} +1 -1
  186. package/payload/server/public/assets/{line-BX2Ugx3B.js → line-DVtVRzUA.js} +1 -1
  187. package/payload/server/public/assets/{linear-Bdc-QJWI.js → linear-DtoOFPO2.js} +1 -1
  188. package/payload/server/public/assets/{mermaid-parser.core-qv1e-J5x.js → mermaid-parser.core-G7YD_zO3.js} +2 -2
  189. package/payload/server/public/assets/{mermaid.core-C_d9YQX_.js → mermaid.core-DpFyndHm.js} +3 -3
  190. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-DwKGvF14.js → mindmap-definition-QFDTVHPH-CYXK_Pvz.js} +1 -1
  191. package/payload/server/public/assets/{operator-BNY1P_mH.js → operator-CKmOgXNa.js} +1 -1
  192. package/payload/server/public/assets/{ordinal-BRQ5CzZY.js → ordinal-CBZeH4Yp.js} +1 -1
  193. package/payload/server/public/assets/packet-4T2RLAQJ-DiU2yS9m.js +1 -0
  194. package/payload/server/public/assets/page-hG7xTrcO.js +32 -0
  195. package/payload/server/public/assets/pie-ZZUOXDRM-zHUKKlVv.js +1 -0
  196. package/payload/server/public/assets/{pieDiagram-DEJITSTG-dUvQC_4S.js → pieDiagram-DEJITSTG-DFo4N6WH.js} +1 -1
  197. package/payload/server/public/assets/{public-CDzw6yjH.js → public-smrhkkxD.js} +1 -1
  198. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CebX_oPa.js → quadrantDiagram-34T5L4WZ-BlH5iIhl.js} +1 -1
  199. package/payload/server/public/assets/radar-PYXPWWZC-BUnVoaPg.js +1 -0
  200. package/payload/server/public/assets/{reduce-CkcXOmmJ.js → reduce-PuPlFPRX.js} +1 -1
  201. package/payload/server/public/assets/{requirementDiagram-MS252O5E-h2euIqGj.js → requirementDiagram-MS252O5E-D5WLty8A.js} +1 -1
  202. package/payload/server/public/assets/rotate-ccw-Dd8aAvU7.js +1 -0
  203. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-DCii3fkF.js → sankeyDiagram-XADWPNL6-vB85IxHG.js} +1 -1
  204. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-CQSGYmlq.js → sequenceDiagram-FGHM5R23-Cxraa0Ee.js} +1 -1
  205. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-CVtU0iXH.js → stateDiagram-FHFEXIEX-BBPssYBx.js} +1 -1
  206. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BWmmUwDt.js +1 -0
  207. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-ChvsBltI.js → timeline-definition-GMOUNBTQ-Bgk6PT62.js} +1 -1
  208. package/payload/server/public/assets/treeView-SZITEDCU-C3Y-Q52h.js +1 -0
  209. package/payload/server/public/assets/treemap-W4RFUUIX-Dk0qZpAg.js +1 -0
  210. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-e-EZiiba.js → vennDiagram-DHZGUBPP-B-APTs3L.js} +1 -1
  211. package/payload/server/public/assets/wardley-RL74JXVD-BAWI02OA.js +1 -0
  212. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-4JaRn1s5.js → wardleyDiagram-NUSXRM2D-CkXJSs_i.js} +1 -1
  213. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-kxwmCNuM.js → xychartDiagram-5P7HB3ND-BkyshPMV.js} +1 -1
  214. package/payload/server/public/browser.html +4 -4
  215. package/payload/server/public/calendar.html +4 -4
  216. package/payload/server/public/chat.html +7 -6
  217. package/payload/server/public/data.html +4 -4
  218. package/payload/server/public/graph.html +7 -6
  219. package/payload/server/public/index.html +6 -6
  220. package/payload/server/public/operator.html +9 -8
  221. package/payload/server/public/public.html +7 -6
  222. package/payload/server/server.js +255 -26
  223. package/payload/server/userprofile-reconcile-GLGKDVQQ.js +48 -0
  224. package/payload/server/public/assets/OperatorConversations-BJY9FZbr.js +0 -9
  225. package/payload/server/public/assets/OperatorConversations-C1I78hON.css +0 -1
  226. package/payload/server/public/assets/architecture-YZFGNWBL-Csj53u5T.js +0 -1
  227. package/payload/server/public/assets/channel-BUQUAUts.js +0 -1
  228. package/payload/server/public/assets/chat-BlOWMUVI.js +0 -1
  229. package/payload/server/public/assets/chunk-426QAEUC-CdknReB2.js +0 -1
  230. package/payload/server/public/assets/chunk-QZHKN3VN-8tHoEDE9.js +0 -1
  231. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BEGZ3DLg.js +0 -1
  232. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DsLxnm5U.js +0 -1
  233. package/payload/server/public/assets/clone-uiXbH_kh.js +0 -1
  234. package/payload/server/public/assets/data-p3T_EZFq.js +0 -1
  235. package/payload/server/public/assets/gitGraph-7Q5UKJZL-D_2KrZoP.js +0 -1
  236. package/payload/server/public/assets/info-OMHHGYJF-BP2TNwQ4.js +0 -1
  237. package/payload/server/public/assets/infoDiagram-42DDH7IO-D1kDtBOY.js +0 -2
  238. package/payload/server/public/assets/packet-4T2RLAQJ-BDg8fde8.js +0 -1
  239. package/payload/server/public/assets/page-CtygoIXt.js +0 -32
  240. package/payload/server/public/assets/pie-ZZUOXDRM-CXDyYMkZ.js +0 -1
  241. package/payload/server/public/assets/radar-PYXPWWZC-xen_zv8F.js +0 -1
  242. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BywcXjtb.js +0 -1
  243. package/payload/server/public/assets/treeView-SZITEDCU-2FBf_1It.js +0 -1
  244. package/payload/server/public/assets/treemap-W4RFUUIX-BDdb30P-.js +0 -1
  245. package/payload/server/public/assets/wardley-RL74JXVD-BLq5MxjR.js +0 -1
  246. /package/payload/server/public/assets/{_baseFor-SRtUHe7G.js → _baseFor-brRjpUOX.js} +0 -0
  247. /package/payload/server/public/assets/{array-BpsnM-Py.js → array-BGFCBI0e.js} +0 -0
  248. /package/payload/server/public/assets/{cytoscape.esm-D4Rl1H5h.js → cytoscape.esm-TvRJ2tGX.js} +0 -0
  249. /package/payload/server/public/assets/{defaultLocale-C7sQPl-O.js → defaultLocale-CRZydyG6.js} +0 -0
  250. /package/payload/server/public/assets/{dist-CtUNt3w8.js → dist-B0CkUodR.js} +0 -0
  251. /package/payload/server/public/assets/{init-BydxaDEV.js → init-B8gtcn7T.js} +0 -0
  252. /package/payload/server/public/assets/{katex-B0fVeDx4.js → katex-RxgSu_dy.js} +0 -0
  253. /package/payload/server/public/assets/{path-jlWYQ2i9.js → path-DZF-JdEe.js} +0 -0
  254. /package/payload/server/public/assets/{preload-helper-uTix4PVD.js → preload-helper-CQ36nxok.js} +0 -0
  255. /package/payload/server/public/assets/{rough.esm-c4PR5shF.js → rough.esm-6CnTHTkH.js} +0 -0
  256. /package/payload/server/public/assets/{src-48kCpScq.js → src-CR_MU8uy.js} +0 -0
@@ -87,6 +87,7 @@ import {
87
87
  resolveClientIp,
88
88
  resolveDefaultAgentSlug,
89
89
  runAdminUserSelfHeal,
90
+ runUserProfileReconcile,
90
91
  safeJson,
91
92
  sanitizeClientCorrId,
92
93
  serve,
@@ -106,7 +107,7 @@ import {
106
107
  vncLog,
107
108
  walkPremiumBundles,
108
109
  writeAdminUserAndPerson
109
- } from "./chunk-25UVZNFA.js";
110
+ } from "./chunk-CXEC5RWB.js";
110
111
  import {
111
112
  __commonJS,
112
113
  __toESM
@@ -7271,6 +7272,8 @@ var SOURCE_ATTR2 = /\bsource="([^"]+)"/;
7271
7272
  var SOURCE_MAP = {
7272
7273
  whatsapp: "whatsapp",
7273
7274
  "whatsapp-channel": "whatsapp",
7275
+ telegram: "telegram",
7276
+ "telegram-channel": "telegram",
7274
7277
  webchat: "webchat",
7275
7278
  "webchat-channel": "webchat"
7276
7279
  };
@@ -7442,7 +7445,12 @@ function parseTranscript(lines, queuedPendingSuppress = /* @__PURE__ */ new Map(
7442
7445
  if (text === null) continue;
7443
7446
  if (CLI_MARKER_PREFIXES2.some((p) => text.startsWith(p))) continue;
7444
7447
  if (HARNESS_LIFECYCLE_PREFIXES.some((p) => text.startsWith(p))) continue;
7445
- const isChannel = row.isMeta === true && typeof row.origin === "object" && row.origin !== null && row.origin.kind === "channel";
7448
+ const isChannel = row.isMeta === true && typeof row.origin === "object" && row.origin !== null && row.origin.kind === "channel" || // Native Claude Code channels (maxy-lite) journal the delivery twin as a PLAIN
7449
+ // `type:"user"` row whose content is the `<channel source="…">` wrapper, with no
7450
+ // `isMeta`/`origin` stamp. Detect it by the wrapper so it is treated as the
7451
+ // channel twin and consumes the enqueue row's suppression — otherwise the
7452
+ // enqueue row AND this row both render and every channel message doubles.
7453
+ CHANNEL_WRAPPER2.test(text);
7446
7454
  if (isChannel) {
7447
7455
  renderOrSuppressChannelInbound(unwrapChannel(text), ts, out, queuedPendingSuppress);
7448
7456
  } else {
@@ -8529,6 +8537,7 @@ function conflictingBinding(channel) {
8529
8537
  }
8530
8538
  var NO_INDICATORS = {
8531
8539
  activity: null,
8540
+ turnAborted: false,
8532
8541
  permissionMode: null,
8533
8542
  effectivePermissionMode: null,
8534
8543
  model: null,
@@ -8560,6 +8569,7 @@ async function fetchComposerIndicators(sessionId) {
8560
8569
  console.log(`[webchat-session] op=context-usage key=${sessionId} turns=${turnCount} used=${usedTokens ?? "absent"} window=${window} pct=${pct ?? "absent"}`);
8561
8570
  return {
8562
8571
  activity: typeof body.activity === "string" ? body.activity : null,
8572
+ turnAborted: body.turnAborted === true,
8563
8573
  permissionMode: typeof body.permissionMode === "string" ? body.permissionMode : null,
8564
8574
  effectivePermissionMode: typeof body.effectivePermissionMode === "string" ? body.effectivePermissionMode : null,
8565
8575
  model,
@@ -8598,7 +8608,7 @@ async function managerInterrupt(sessionId, trigger) {
8598
8608
  try {
8599
8609
  port2 = requirePortEnv("CLAUDE_SESSION_MANAGER_PORT", { tag: "webchat:interrupt" });
8600
8610
  } catch {
8601
- return { ok: false, stopped: false, intId: null };
8611
+ return { ok: false, stopped: false, intId: null, deadChild: false };
8602
8612
  }
8603
8613
  try {
8604
8614
  const res = await fetch(`http://127.0.0.1:${port2}/${sessionId}/interrupt`, {
@@ -8607,15 +8617,16 @@ async function managerInterrupt(sessionId, trigger) {
8607
8617
  body: JSON.stringify({ byte: "esc", trigger }),
8608
8618
  signal: AbortSignal.timeout(INTERRUPT_TIMEOUT_MS)
8609
8619
  });
8610
- if (!res.ok) return { ok: false, stopped: false, intId: null };
8620
+ if (!res.ok) return { ok: false, stopped: false, intId: null, deadChild: false };
8611
8621
  const body = await res.json();
8612
8622
  return {
8613
8623
  ok: true,
8614
8624
  stopped: body.stopped === true,
8615
- intId: typeof body.intId === "string" ? body.intId : null
8625
+ intId: typeof body.intId === "string" ? body.intId : null,
8626
+ deadChild: body.deadChild === true
8616
8627
  };
8617
8628
  } catch {
8618
- return { ok: false, stopped: false, intId: null };
8629
+ return { ok: false, stopped: false, intId: null, deadChild: false };
8619
8630
  }
8620
8631
  }
8621
8632
  var MODEL_ID_PATTERN = /^claude-[a-z0-9][a-z0-9.-]*(\[1m\])?$/;
@@ -8918,7 +8929,7 @@ ${note}` : note;
8918
8929
  if (!outcome.ok) {
8919
8930
  return c.json({ error: "interrupt-failed" }, 502);
8920
8931
  }
8921
- return c.json({ ok: true, stopped: outcome.stopped, intId: outcome.intId }, 200);
8932
+ return c.json({ ok: true, stopped: outcome.stopped, intId: outcome.intId, deadChild: outcome.deadChild }, 200);
8922
8933
  });
8923
8934
  app55.post("/settings", requireAdminSession, async (c) => {
8924
8935
  const body = await c.req.json().catch(() => null);
@@ -13132,18 +13143,10 @@ function dataUploadCeiling() {
13132
13143
  const override = Number(process.env.MAXY_DATA_UPLOAD_MAX_BYTES);
13133
13144
  return Number.isFinite(override) && override > 0 ? override : MAX_DATA_UPLOAD_BYTES;
13134
13145
  }
13135
- app20.post("/upload", requireAdminSession, async (c) => {
13136
- const cacheKey = c.var.cacheKey;
13137
- const accountId = getAccountIdForSession(cacheKey);
13138
- if (!accountId) {
13139
- console.error(`[data-upload] op=auth-reject reason="no account for session"`);
13140
- return c.json({ error: "Account not found for session" }, 401);
13141
- }
13146
+ async function resolveUploadTarget(c, accountId, uid) {
13142
13147
  const rawName = c.req.query("filename") ?? "";
13143
13148
  const safeName = basename7(rawName).replace(/[\0/\\]/g, "_");
13144
- if (!safeName) return c.json({ error: "filename query param required" }, 400);
13145
- const uid = `${Date.now()}-${randomUUID9().slice(0, 8)}`;
13146
- const declaredBytes = c.req.header("content-length") ?? "unknown";
13149
+ if (!safeName) return { ok: false, status: 400, error: "filename query param required" };
13147
13150
  const rawRelpath = c.req.query("relpath") ?? "";
13148
13151
  const relpath = rawRelpath !== "" ? rawRelpath : null;
13149
13152
  const token = c.req.query("token") ?? "";
@@ -13151,22 +13154,20 @@ app20.post("/upload", requireAdminSession, async (c) => {
13151
13154
  const mimeType = (c.req.header("content-type") ?? "").split(";")[0].trim();
13152
13155
  if (!SUPPORTED_MIME_TYPES.has(mimeType)) {
13153
13156
  console.error(`[data-upload] op=reject-mime uid=${uid} mime="${mimeType}" token=${token} rel="${relpath ?? ""}"`);
13154
- return c.json({
13155
- error: `Unsupported file type: "${mimeType}". Supported: ${[...SUPPORTED_MIME_TYPES].join(", ")}.`
13156
- }, 422);
13157
+ return { ok: false, status: 422, error: `Unsupported file type: "${mimeType}". Supported: ${[...SUPPORTED_MIME_TYPES].join(", ")}.` };
13157
13158
  }
13158
13159
  const rawDir = c.req.query("path") ?? "";
13159
13160
  const base = resolveOwnAccountWrite(rawDir, accountId, "POST /api/admin/files/upload");
13160
- if (!base.ok) return c.json({ error: base.error }, base.status);
13161
+ if (!base.ok) return { ok: false, status: base.status, error: base.error };
13161
13162
  const relDir = relpath ? dirname6(relpath) : ".";
13162
13163
  const destRel = relDir === "." ? base.relative : join25(base.relative, relDir);
13163
13164
  if (crossesForeignAccountPartition(destRel, accountId)) {
13164
13165
  console.error(`[data] account-scope-blocked endpoint="POST /api/admin/files/upload" path="${destRel}" account=${accountId.slice(0, 8)}\u2026`);
13165
- return c.json({ error: "Not found" }, 404);
13166
+ return { ok: false, status: 404, error: "Not found" };
13166
13167
  }
13167
13168
  if (!isWithinOwnAccountPartition(destRel, accountId)) {
13168
13169
  console.error(`[data] write-scope-blocked endpoint="POST /api/admin/files/upload" path="${destRel}" account=${accountId.slice(0, 8)}\u2026`);
13169
- return c.json({ error: "Path is outside your account folder" }, 403);
13170
+ return { ok: false, status: 403, error: "Path is outside your account folder" };
13170
13171
  }
13171
13172
  const destDir = relDir === "." ? base.absolute : resolve21(base.absolute, relDir);
13172
13173
  const destPath = resolve21(destDir, finalName);
@@ -13175,14 +13176,40 @@ app20.post("/upload", requireAdminSession, async (c) => {
13175
13176
  if (firstCreated) console.error(`[data-upload] op=mkdir uid=${uid} token=${token} dir="${destRel}"`);
13176
13177
  } else {
13177
13178
  const info = await stat4(destDir).catch(() => null);
13178
- if (!info || !info.isDirectory()) return c.json({ error: "Upload destination is not a directory" }, 400);
13179
+ if (!info || !info.isDirectory()) return { ok: false, status: 400, error: "Upload destination is not a directory" };
13179
13180
  }
13180
13181
  const dataRootReal = realpathSync4(DATA_ROOT);
13181
13182
  const destDirReal = realpathSync4(destDir);
13182
13183
  if (destDirReal !== dataRootReal && !destDirReal.startsWith(dataRootReal + sep6)) {
13183
13184
  console.error(`[data-upload] op=path-traversal-blocked uid=${uid} requested="${destRel}" resolved="${destDirReal}"`);
13184
- return c.json({ error: "Upload destination escapes DATA_ROOT" }, 403);
13185
+ return { ok: false, status: 403, error: "Upload destination escapes DATA_ROOT" };
13186
+ }
13187
+ return { ok: true, destDir, destPath, destRel, finalName, mimeType, relpath, token };
13188
+ }
13189
+ async function logUploadsTmpCensus(accountId) {
13190
+ const tmpDir = resolve21(DATA_ROOT, "accounts", accountId, UPLOAD_TMP_DIR);
13191
+ let live = 0;
13192
+ try {
13193
+ live = (await readdir3(tmpDir)).length;
13194
+ } catch {
13185
13195
  }
13196
+ console.error(`[uploads-tmp-census] dir=${accountId} live=${live}`);
13197
+ }
13198
+ app20.post("/upload", requireAdminSession, async (c) => {
13199
+ const cacheKey = c.var.cacheKey;
13200
+ const accountId = getAccountIdForSession(cacheKey);
13201
+ if (!accountId) {
13202
+ console.error(`[data-upload] op=auth-reject reason="no account for session"`);
13203
+ return c.json({ error: "Account not found for session" }, 401);
13204
+ }
13205
+ if (c.req.query("uploadId") !== void 0) {
13206
+ return handleChunkUpload(c, accountId);
13207
+ }
13208
+ const uid = `${Date.now()}-${randomUUID9().slice(0, 8)}`;
13209
+ const declaredBytes = c.req.header("content-length") ?? "unknown";
13210
+ const target = await resolveUploadTarget(c, accountId, uid);
13211
+ if (!target.ok) return c.json({ error: target.error }, target.status);
13212
+ const { destPath, destRel, finalName, mimeType, relpath, token } = target;
13186
13213
  const body = c.req.raw.body;
13187
13214
  if (!body) return c.json({ error: "Empty request body" }, 400);
13188
13215
  console.error(`[data-upload] op=request uid=${uid} account=${accountId} dir="${destRel}" token=${token} rel="${relpath ?? ""}" declaredBytes=${declaredBytes}`);
@@ -13263,6 +13290,7 @@ app20.post("/upload", requireAdminSession, async (c) => {
13263
13290
  void indexFile(accountId, relativeDest).catch((err) => {
13264
13291
  console.error(`[data-upload] op=index-failed uid=${uid} dest="${relativeDest}" err="${err instanceof Error ? err.message : String(err)}"`);
13265
13292
  });
13293
+ void logUploadsTmpCensus(accountId);
13266
13294
  return c.json({
13267
13295
  path: relativeDest,
13268
13296
  filename: finalName,
@@ -13270,6 +13298,178 @@ app20.post("/upload", requireAdminSession, async (c) => {
13270
13298
  mimeType
13271
13299
  });
13272
13300
  });
13301
+ var chunkUploads = /* @__PURE__ */ new Map();
13302
+ async function discardChunkUpload(uploadId, state) {
13303
+ chunkUploads.delete(uploadId);
13304
+ await new Promise((res) => {
13305
+ if (state.out.closed) return res();
13306
+ state.out.once("close", () => res());
13307
+ state.out.destroy();
13308
+ });
13309
+ await unlink2(state.tmpPath).catch(() => {
13310
+ });
13311
+ const tempRemoved = !existsSync23(state.tmpPath);
13312
+ console.error(`[data-upload] op=cleanup uid=${uploadId} tempRemoved=${tempRemoved}`);
13313
+ }
13314
+ async function writeChunkBody(body, out, alreadyReceived, ceiling) {
13315
+ const reader = body.getReader();
13316
+ let written = 0;
13317
+ for (; ; ) {
13318
+ const { done, value } = await reader.read();
13319
+ if (done) break;
13320
+ if (!value) continue;
13321
+ if (alreadyReceived + written + value.byteLength > ceiling) {
13322
+ written += value.byteLength;
13323
+ await reader.cancel().catch(() => {
13324
+ });
13325
+ return { written, overCeiling: true };
13326
+ }
13327
+ written += value.byteLength;
13328
+ if (!out.write(value)) {
13329
+ await new Promise((res, rej) => {
13330
+ const onDrain = () => {
13331
+ out.off("error", onErr);
13332
+ res();
13333
+ };
13334
+ const onErr = (e) => {
13335
+ out.off("drain", onDrain);
13336
+ rej(e);
13337
+ };
13338
+ out.once("drain", onDrain);
13339
+ out.once("error", onErr);
13340
+ });
13341
+ }
13342
+ }
13343
+ return { written, overCeiling: false };
13344
+ }
13345
+ async function handleChunkUpload(c, accountId) {
13346
+ const uploadId = c.req.query("uploadId") ?? "";
13347
+ const seq = Number(c.req.query("seq"));
13348
+ const total = Number(c.req.query("total"));
13349
+ if (!uploadId || !Number.isInteger(seq) || !Number.isInteger(total) || seq < 0 || total < 1 || seq >= total) {
13350
+ return c.json({ error: "Invalid chunk parameters" }, 400);
13351
+ }
13352
+ const body = c.req.raw.body;
13353
+ if (!body) return c.json({ error: "Empty request body" }, 400);
13354
+ const ceiling = dataUploadCeiling();
13355
+ if (seq === 0) {
13356
+ const existing = chunkUploads.get(uploadId);
13357
+ if (existing) {
13358
+ if (existing.accountId !== accountId) {
13359
+ console.error(`[data-upload] op=chunk-gap uid=${uploadId} reason=foreign-seq0`);
13360
+ return c.json({ error: "Chunk out of order \u2014 restart the upload" }, 409);
13361
+ }
13362
+ await discardChunkUpload(uploadId, existing);
13363
+ }
13364
+ const target = await resolveUploadTarget(c, accountId, uploadId);
13365
+ if (!target.ok) return c.json({ error: target.error }, target.status);
13366
+ const tmpDir = resolve21(DATA_ROOT, "accounts", accountId, UPLOAD_TMP_DIR);
13367
+ await mkdir3(tmpDir, { recursive: true });
13368
+ const tmpPath = resolve21(tmpDir, `${uploadId}.part`);
13369
+ const out = createWriteStream2(tmpPath);
13370
+ const state2 = {
13371
+ accountId,
13372
+ destPath: target.destPath,
13373
+ destRel: target.destRel,
13374
+ finalName: target.finalName,
13375
+ tmpPath,
13376
+ out,
13377
+ writeError: null,
13378
+ busy: false,
13379
+ received: 0,
13380
+ nextSeq: 0,
13381
+ total,
13382
+ mimeType: target.mimeType,
13383
+ token: target.token,
13384
+ relpath: target.relpath,
13385
+ t0: Date.now(),
13386
+ lastActivityMs: Date.now()
13387
+ };
13388
+ out.on("error", (e) => {
13389
+ state2.writeError = e;
13390
+ });
13391
+ chunkUploads.set(uploadId, state2);
13392
+ console.error(`[data-upload] op=request uid=${uploadId} account=${accountId} dir="${target.destRel}" token=${target.token} rel="${target.relpath ?? ""}" declaredBytes=chunked total=${total}`);
13393
+ return acceptChunk(c, uploadId, state2, seq, body, ceiling);
13394
+ }
13395
+ const state = chunkUploads.get(uploadId);
13396
+ if (!state || state.accountId !== accountId || seq !== state.nextSeq) {
13397
+ console.error(`[data-upload] op=chunk-gap uid=${uploadId} expected=${state ? state.nextSeq : "none"} got=${seq}`);
13398
+ if (state && state.accountId === accountId) await discardChunkUpload(uploadId, state);
13399
+ return c.json({ error: "Chunk out of order \u2014 restart the upload" }, 409);
13400
+ }
13401
+ return acceptChunk(c, uploadId, state, seq, body, ceiling);
13402
+ }
13403
+ async function acceptChunk(c, uploadId, state, seq, body, ceiling) {
13404
+ if (state.busy) {
13405
+ console.error(`[data-upload] op=chunk-gap uid=${uploadId} expected=${state.nextSeq} got=${seq} reason=busy`);
13406
+ return c.json({ error: "Chunk out of order \u2014 restart the upload" }, 409);
13407
+ }
13408
+ state.busy = true;
13409
+ try {
13410
+ try {
13411
+ const { written, overCeiling } = await writeChunkBody(body, state.out, state.received, ceiling);
13412
+ if (state.writeError) throw state.writeError;
13413
+ state.received += written;
13414
+ if (overCeiling || state.received > ceiling) {
13415
+ console.error(`[data-upload] op=reject-size uid=${uploadId} received=${state.received} ceiling=${ceiling}`);
13416
+ await discardChunkUpload(uploadId, state);
13417
+ return c.json({ error: `File exceeds the ${Math.floor(ceiling / 1024 / 1024)} MB limit.` }, 413);
13418
+ }
13419
+ state.nextSeq = seq + 1;
13420
+ state.lastActivityMs = Date.now();
13421
+ console.error(`[data-upload] op=chunk uid=${uploadId} token=${state.token} seq=${seq}/${state.total} bytes=${written} received=${state.received}`);
13422
+ } catch (err) {
13423
+ const message = err instanceof Error ? err.message : String(err);
13424
+ console.error(`[data-upload] op=error uid=${uploadId} err="${message}" token=${state.token} rel="${state.relpath ?? ""}"`);
13425
+ await discardChunkUpload(uploadId, state);
13426
+ return c.json({ error: message }, 500);
13427
+ }
13428
+ if (seq < state.total - 1) {
13429
+ return c.json({ ok: true, received: state.received, seq, total: state.total });
13430
+ }
13431
+ chunkUploads.delete(uploadId);
13432
+ try {
13433
+ await new Promise((res, rej) => {
13434
+ state.out.once("error", rej);
13435
+ state.out.end(() => res());
13436
+ });
13437
+ await rename(state.tmpPath, state.destPath);
13438
+ } catch (err) {
13439
+ const message = err instanceof Error ? err.message : String(err);
13440
+ console.error(`[data-upload] op=error uid=${uploadId} err="${message}" token=${state.token} rel="${state.relpath ?? ""}"`);
13441
+ await unlink2(state.tmpPath).catch(() => {
13442
+ });
13443
+ return c.json({ error: message }, 500);
13444
+ }
13445
+ const relativeDest = `${state.destRel}/${state.finalName}`;
13446
+ console.error(`[data-upload] op=assemble uid=${uploadId} chunks=${state.total} totalBytes=${state.received} path="${relativeDest}" token=${state.token} ms=${Date.now() - state.t0}`);
13447
+ void indexFile(state.accountId, relativeDest).catch((err) => {
13448
+ console.error(`[data-upload] op=index-failed uid=${uploadId} dest="${relativeDest}" err="${err instanceof Error ? err.message : String(err)}"`);
13449
+ });
13450
+ void logUploadsTmpCensus(state.accountId);
13451
+ return c.json({
13452
+ path: relativeDest,
13453
+ filename: state.finalName,
13454
+ sizeBytes: state.received,
13455
+ mimeType: state.mimeType
13456
+ });
13457
+ } finally {
13458
+ state.busy = false;
13459
+ }
13460
+ }
13461
+ async function evictStaleChunkUploads(ttlMs) {
13462
+ const now = Date.now();
13463
+ let evicted = 0;
13464
+ for (const [uploadId, state] of [...chunkUploads.entries()]) {
13465
+ if (now - state.lastActivityMs > ttlMs) {
13466
+ console.error(`[data-upload] op=cleanup uid=${uploadId} reason=idle-ttl`);
13467
+ await discardChunkUpload(uploadId, state);
13468
+ evicted++;
13469
+ }
13470
+ }
13471
+ return evicted;
13472
+ }
13273
13473
  async function sweepStaleUploadTemps() {
13274
13474
  const accountsRoot = resolve21(DATA_ROOT, "accounts");
13275
13475
  let accounts;
@@ -16232,6 +16432,16 @@ function managerBase2() {
16232
16432
  const port2 = requirePortEnv("CLAUDE_SESSION_MANAGER_PORT", { tag: "channel-pty-bridge:manager-client" });
16233
16433
  return `http://127.0.0.1:${port2}`;
16234
16434
  }
16435
+ async function connectorAuthLogin(opts) {
16436
+ const res = await fetch(`${managerBase2()}/connector-auth-login`, {
16437
+ method: "POST",
16438
+ headers: { "content-type": "application/json" },
16439
+ body: JSON.stringify(opts)
16440
+ });
16441
+ const body = await res.json().catch(() => null);
16442
+ if (!res.ok || !body) return { error: `manager-${res.status}` };
16443
+ return body;
16444
+ }
16235
16445
  async function managerSpawn(opts) {
16236
16446
  const auth = await ensureAuth();
16237
16447
  if (auth.status === "dead" || auth.status === "missing") {
@@ -19951,6 +20161,19 @@ function createWebchatChannelRoutes(deps) {
19951
20161
  deps.onReply?.(key, text);
19952
20162
  return c.json({ ok: true });
19953
20163
  });
20164
+ app55.post("/webchat-channel/connector-auth", async (c) => {
20165
+ const body = await c.req.json().catch(() => null);
20166
+ const key = body?.key;
20167
+ const sessionId = body?.sessionId;
20168
+ const name = body?.name;
20169
+ const completed = body?.completed === true;
20170
+ if (typeof key !== "string" || typeof sessionId !== "string" || typeof name !== "string" || !name.trim()) {
20171
+ return c.json({ error: "key, sessionId and name required" }, 400);
20172
+ }
20173
+ if (!deps.onConnectorAuth) return c.json({ error: "connector-auth-unavailable" }, 503);
20174
+ const result = await deps.onConnectorAuth({ key, sessionId, name, completed });
20175
+ return c.json(result);
20176
+ });
19954
20177
  app55.post("/webchat-channel/ready", async (c) => {
19955
20178
  const body = await c.req.json().catch(() => null);
19956
20179
  const key = body?.key;
@@ -20230,7 +20453,8 @@ var WebchatGateway = class _WebchatGateway {
20230
20453
  }
20231
20454
  },
20232
20455
  onReply: (key, text) => this.handleReply(key, text),
20233
- awaitPermissionVerdict: (p) => this.awaitPermissionVerdict(p, permissionVerdictTtlMs())
20456
+ awaitPermissionVerdict: (p) => this.awaitPermissionVerdict(p, permissionVerdictTtlMs()),
20457
+ onConnectorAuth: ({ sessionId, name, completed }) => connectorAuthLogin({ sessionId, name, completed })
20234
20458
  });
20235
20459
  }
20236
20460
  /** Run one reconciliation pass: log every terminal delivery event the sweep
@@ -22800,6 +23024,7 @@ async function runAdminUserReconcileTick() {
22800
23024
  return;
22801
23025
  }
22802
23026
  await runAdminUserSelfHeal({ userId, accountId: account.accountId });
23027
+ await runUserProfileReconcile();
22803
23028
  } catch (err) {
22804
23029
  console.error(`[adminuser-self-heal] rejected: ${err instanceof Error ? err.message : String(err)}`);
22805
23030
  }
@@ -22845,6 +23070,10 @@ void migrateUploads().catch((err) => console.error(`[uploads-migrate] failed err
22845
23070
  });
22846
23071
  });
22847
23072
  void sweepStaleUploadTemps().catch((err) => console.error(`[data-upload] op=sweep-failed err="${err instanceof Error ? err.message : String(err)}"`));
23073
+ var CHUNK_IDLE_TTL_MS = 30 * 60 * 1e3;
23074
+ setInterval(() => {
23075
+ void evictStaleChunkUploads(CHUNK_IDLE_TTL_MS).catch((err) => console.error(`[data-upload] op=evict-failed err="${err instanceof Error ? err.message : String(err)}"`));
23076
+ }, 10 * 60 * 1e3).unref();
22848
23077
  void migrateAdminWebchatSidecars().catch((err) => console.error(`[sidecar-backfill] failed err="${err instanceof Error ? err.message : String(err)}"`));
22849
23078
  try {
22850
23079
  const accounts = enumerateValidAccountIds(getAccountsDirFromEnv());
@@ -0,0 +1,48 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import "./chunk-PFF6I7KP.js";
3
+
4
+ // app/lib/userprofile-reconcile.ts
5
+ function toNum(raw) {
6
+ if (typeof raw === "number") return raw;
7
+ if (raw && typeof raw.toNumber === "function") {
8
+ return raw.toNumber();
9
+ }
10
+ return 0;
11
+ }
12
+ async function reconcileUserProfiles(args) {
13
+ const { driver } = args;
14
+ const serverTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
15
+ const now = (/* @__PURE__ */ new Date()).toISOString();
16
+ const session = driver.session();
17
+ try {
18
+ const provResult = await session.run(
19
+ `MATCH (au:AdminUser)
20
+ WHERE au.accountId IS NOT NULL AND au.userId IS NOT NULL
21
+ AND NOT (au)-[:HAS_PROFILE]->(:UserProfile)
22
+ MERGE (au)-[:HAS_PROFILE]->(up:UserProfile {accountId: au.accountId, userId: au.userId})
23
+ ON CREATE SET
24
+ up.createdAt = $now,
25
+ up.updatedAt = $now,
26
+ up.profileVersion = 0,
27
+ up.scope = 'admin',
28
+ up.timezone = $serverTimezone
29
+ RETURN count(up) AS provisioned`,
30
+ { now, serverTimezone }
31
+ );
32
+ const provisioned = toNum(provResult.records[0]?.get("provisioned"));
33
+ console.error(`[userprofile-reconcile] provisioned=${provisioned}`);
34
+ const residualResult = await session.run(
35
+ `MATCH (au:AdminUser)
36
+ WHERE NOT (au)-[:HAS_PROFILE]->(:UserProfile)
37
+ RETURN count(au) AS residual`
38
+ );
39
+ const residual = toNum(residualResult.records[0]?.get("residual"));
40
+ console.error(`[userprofile-reconcile] residual=${residual}`);
41
+ return { provisioned, residual };
42
+ } finally {
43
+ await session.close();
44
+ }
45
+ }
46
+ export {
47
+ reconcileUserProfiles
48
+ };