@rubytech/create-maxy-code 0.1.600 → 0.1.602

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 (274) hide show
  1. package/dist/__tests__/email-sampler-unit.test.js +31 -0
  2. package/dist/index.js +18 -2
  3. package/dist/port-resolution.js +24 -0
  4. package/package.json +1 -1
  5. package/payload/platform/plugins/admin/hooks/video-frames-inject.sh +141 -0
  6. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +5 -1
  7. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +10 -0
  8. package/payload/platform/plugins/docs/references/admin-ui.md +2 -0
  9. package/payload/platform/plugins/docs/references/telegram-guide.md +2 -0
  10. package/payload/platform/plugins/email/PLUGIN.md +7 -1
  11. package/payload/platform/plugins/email/mcp/dist/lib/credentials.d.ts +27 -0
  12. package/payload/platform/plugins/email/mcp/dist/lib/credentials.d.ts.map +1 -1
  13. package/payload/platform/plugins/email/mcp/dist/lib/credentials.js +78 -0
  14. package/payload/platform/plugins/email/mcp/dist/lib/credentials.js.map +1 -1
  15. package/payload/platform/plugins/email/mcp/dist/sampler/__tests__/sample-mailbox.test.d.ts +2 -0
  16. package/payload/platform/plugins/email/mcp/dist/sampler/__tests__/sample-mailbox.test.d.ts.map +1 -0
  17. package/payload/platform/plugins/email/mcp/dist/sampler/__tests__/sample-mailbox.test.js +96 -0
  18. package/payload/platform/plugins/email/mcp/dist/sampler/__tests__/sample-mailbox.test.js.map +1 -0
  19. package/payload/platform/plugins/email/mcp/dist/sampler/main.d.ts +2 -0
  20. package/payload/platform/plugins/email/mcp/dist/sampler/main.d.ts.map +1 -0
  21. package/payload/platform/plugins/email/mcp/dist/sampler/main.js +75 -0
  22. package/payload/platform/plugins/email/mcp/dist/sampler/main.js.map +1 -0
  23. package/payload/platform/plugins/email/mcp/dist/sampler/sample-mailbox.d.ts +48 -0
  24. package/payload/platform/plugins/email/mcp/dist/sampler/sample-mailbox.d.ts.map +1 -0
  25. package/payload/platform/plugins/email/mcp/dist/sampler/sample-mailbox.js +77 -0
  26. package/payload/platform/plugins/email/mcp/dist/sampler/sample-mailbox.js.map +1 -0
  27. package/payload/platform/plugins/scheduling/PLUGIN.md +2 -0
  28. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.js +67 -1
  29. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.js.map +1 -1
  30. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.js +89 -1
  31. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.js.map +1 -1
  32. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/outage-marker.test.d.ts +2 -0
  33. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/outage-marker.test.d.ts.map +1 -0
  34. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/outage-marker.test.js +160 -0
  35. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/outage-marker.test.js.map +1 -0
  36. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/routine-run.test.js +16 -0
  37. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/routine-run.test.js.map +1 -1
  38. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts +31 -1
  39. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts.map +1 -1
  40. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js +42 -4
  41. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js.map +1 -1
  42. package/payload/platform/plugins/scheduling/mcp/dist/lib/outage-marker.d.ts +101 -0
  43. package/payload/platform/plugins/scheduling/mcp/dist/lib/outage-marker.d.ts.map +1 -0
  44. package/payload/platform/plugins/scheduling/mcp/dist/lib/outage-marker.js +130 -0
  45. package/payload/platform/plugins/scheduling/mcp/dist/lib/outage-marker.js.map +1 -0
  46. package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.d.ts +10 -1
  47. package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.d.ts.map +1 -1
  48. package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.js.map +1 -1
  49. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts +24 -0
  50. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts.map +1 -1
  51. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js +89 -0
  52. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js.map +1 -1
  53. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js +67 -1
  54. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js.map +1 -1
  55. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/gate-dispatch-wiring.test.js +31 -0
  56. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/gate-dispatch-wiring.test.js.map +1 -1
  57. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts +10 -1
  58. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts.map +1 -1
  59. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js +46 -1
  60. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js.map +1 -1
  61. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +72 -4
  62. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
  63. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js +81 -4
  64. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js.map +1 -1
  65. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts +50 -0
  66. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts.map +1 -1
  67. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js +48 -7
  68. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js.map +1 -1
  69. package/payload/platform/plugins/telegram/PLUGIN.md +4 -0
  70. package/payload/platform/plugins/telegram/mcp/dist/__tests__/public-pin-registry.test.js +33 -1
  71. package/payload/platform/plugins/telegram/mcp/dist/__tests__/public-pin-registry.test.js.map +1 -1
  72. package/payload/platform/plugins/telegram/mcp/dist/__tests__/public-pin.test.js +166 -1
  73. package/payload/platform/plugins/telegram/mcp/dist/__tests__/public-pin.test.js.map +1 -1
  74. package/payload/platform/plugins/telegram/mcp/dist/index.js +39 -14
  75. package/payload/platform/plugins/telegram/mcp/dist/index.js.map +1 -1
  76. package/payload/platform/plugins/telegram/mcp/dist/lib/public-pin.d.ts +95 -0
  77. package/payload/platform/plugins/telegram/mcp/dist/lib/public-pin.d.ts.map +1 -1
  78. package/payload/platform/plugins/telegram/mcp/dist/lib/public-pin.js +125 -0
  79. package/payload/platform/plugins/telegram/mcp/dist/lib/public-pin.js.map +1 -1
  80. package/payload/platform/scripts/logs-read.sh +18 -3
  81. package/payload/platform/services/telegram-channel/dist/notification.d.ts +6 -0
  82. package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
  83. package/payload/platform/services/telegram-channel/dist/notification.js +12 -5
  84. package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
  85. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +5 -0
  86. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  87. package/payload/platform/services/whatsapp-channel/dist/notification.js +9 -3
  88. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  89. package/payload/platform/templates/account-settings.json +6 -0
  90. package/payload/server/chunk-CYU75QAV.js +377 -0
  91. package/payload/server/{chunk-34FPJYHN.js → chunk-GI5AVCRG.js} +87 -146
  92. package/payload/server/chunk-KUVNCAE4.js +77 -0
  93. package/payload/server/{manager-7BXVB76I.js → manager-VDHT3YYI.js} +2 -1
  94. package/payload/server/maxy-edge.js +33 -1
  95. package/payload/server/public/activity.html +6 -6
  96. package/payload/server/public/agents.html +5 -5
  97. package/payload/server/public/assets/{AdminLoginScreens-B3W6J6Bl.js → AdminLoginScreens-CaQqLuxZ.js} +1 -1
  98. package/payload/server/public/assets/AdminLoginScreens-CaQqLuxZ.js.br +0 -0
  99. package/payload/server/public/assets/AdminLoginScreens-CaQqLuxZ.js.gz +0 -0
  100. package/payload/server/public/assets/{AdminShell-C3R-vMZ5.js → AdminShell-D8WTrqem.js} +1 -1
  101. package/payload/server/public/assets/AdminShell-D8WTrqem.js.br +0 -0
  102. package/payload/server/public/assets/AdminShell-D8WTrqem.js.gz +0 -0
  103. package/payload/server/public/assets/{activity-tzv68iBs.js → activity-B3fiJrC2.js} +1 -1
  104. package/payload/server/public/assets/activity-B3fiJrC2.js.br +0 -0
  105. package/payload/server/public/assets/activity-B3fiJrC2.js.gz +0 -0
  106. package/payload/server/public/assets/admin-ouF-DflP.js +1 -0
  107. package/payload/server/public/assets/admin-ouF-DflP.js.br +0 -0
  108. package/payload/server/public/assets/admin-ouF-DflP.js.gz +0 -0
  109. package/payload/server/public/assets/{agents-DUZfeY3X.js → agents-C8RSXHdh.js} +1 -1
  110. package/payload/server/public/assets/agents-C8RSXHdh.js.br +0 -0
  111. package/payload/server/public/assets/agents-C8RSXHdh.js.gz +0 -0
  112. package/payload/server/public/assets/{browser-DwLaXqjO.js → browser-Dbv6-Rag.js} +1 -1
  113. package/payload/server/public/assets/browser-Dbv6-Rag.js.br +0 -0
  114. package/payload/server/public/assets/browser-Dbv6-Rag.js.gz +0 -0
  115. package/payload/server/public/assets/{calendar-Cli8Qjl9.js → calendar-vJjtsH9n.js} +1 -1
  116. package/payload/server/public/assets/calendar-vJjtsH9n.js.br +0 -0
  117. package/payload/server/public/assets/calendar-vJjtsH9n.js.gz +0 -0
  118. package/payload/server/public/assets/chat-cqL4qPUy.js +1 -0
  119. package/payload/server/public/assets/chat-cqL4qPUy.js.br +1 -0
  120. package/payload/server/public/assets/chat-cqL4qPUy.js.gz +0 -0
  121. package/payload/server/public/assets/chevron-left-DB98DSG3.js +1 -0
  122. package/payload/server/public/assets/chevron-left-DB98DSG3.js.br +0 -0
  123. package/payload/server/public/assets/clock-4YwsYe4L.js +1 -0
  124. package/payload/server/public/assets/clock-4YwsYe4L.js.br +0 -0
  125. package/payload/server/public/assets/clock-4YwsYe4L.js.gz +0 -0
  126. package/payload/server/public/assets/{copy-yhhwfEbQ.js → copy-DyG7sC5o.js} +1 -1
  127. package/payload/server/public/assets/copy-DyG7sC5o.js.br +0 -0
  128. package/payload/server/public/assets/copy-DyG7sC5o.js.gz +0 -0
  129. package/payload/server/public/assets/data-BAzLtx9C.js +1 -0
  130. package/payload/server/public/assets/data-BAzLtx9C.js.br +0 -0
  131. package/payload/server/public/assets/data-BAzLtx9C.js.gz +0 -0
  132. package/payload/server/public/assets/{field-jg0YQNDy.js → field-Bx6pM-vq.js} +1 -1
  133. package/payload/server/public/assets/field-Bx6pM-vq.js.br +0 -0
  134. package/payload/server/public/assets/field-Bx6pM-vq.js.gz +0 -0
  135. package/payload/server/public/assets/{file-text-D0EdW7h4.js → file-text-CpHWsMGe.js} +1 -1
  136. package/payload/server/public/assets/file-text-CpHWsMGe.js.br +0 -0
  137. package/payload/server/public/assets/file-text-CpHWsMGe.js.gz +0 -0
  138. package/payload/server/public/assets/{graph--AUr4uBc.js → graph-DjOywuv_.js} +1 -1
  139. package/payload/server/public/assets/graph-DjOywuv_.js.br +0 -0
  140. package/payload/server/public/assets/graph-DjOywuv_.js.gz +0 -0
  141. package/payload/server/public/assets/{graph-labels-DM0CiAX1.js → graph-labels-CGWtqa-m.js} +1 -1
  142. package/payload/server/public/assets/graph-labels-CGWtqa-m.js.br +0 -0
  143. package/payload/server/public/assets/graph-labels-CGWtqa-m.js.gz +0 -0
  144. package/payload/server/public/assets/{jsx-runtime-lfcjzaWi.css → jsx-runtime-D75_aR1J.css} +1 -1
  145. package/payload/server/public/assets/jsx-runtime-D75_aR1J.css.br +0 -0
  146. package/payload/server/public/assets/{jsx-runtime-lfcjzaWi.css.gz → jsx-runtime-D75_aR1J.css.gz} +0 -0
  147. package/payload/server/public/assets/{operator-CNYKStFX.js → operator-_DN0RF1R.js} +1 -1
  148. package/payload/server/public/assets/operator-_DN0RF1R.js.br +0 -0
  149. package/payload/server/public/assets/operator-_DN0RF1R.js.gz +0 -0
  150. package/payload/server/public/assets/page-DI4qQIK0.js +1 -0
  151. package/payload/server/public/assets/page-DI4qQIK0.js.br +0 -0
  152. package/payload/server/public/assets/page-DI4qQIK0.js.gz +0 -0
  153. package/payload/server/public/assets/page-zCwgrs8m.js +32 -0
  154. package/payload/server/public/assets/page-zCwgrs8m.js.br +0 -0
  155. package/payload/server/public/assets/page-zCwgrs8m.js.gz +0 -0
  156. package/payload/server/public/assets/play-CHQ5a9yh.js +1 -0
  157. package/payload/server/public/assets/play-CHQ5a9yh.js.br +0 -0
  158. package/payload/server/public/assets/play-CHQ5a9yh.js.gz +0 -0
  159. package/payload/server/public/assets/{public-7gXDqCog.js → public-DDVWBNSH.js} +1 -1
  160. package/payload/server/public/assets/public-DDVWBNSH.js.br +0 -0
  161. package/payload/server/public/assets/public-DDVWBNSH.js.gz +0 -0
  162. package/payload/server/public/assets/{rotate-ccw-DhqNTPpo.js → rotate-ccw-xTwkf-m7.js} +1 -1
  163. package/payload/server/public/assets/rotate-ccw-xTwkf-m7.js.br +0 -0
  164. package/payload/server/public/assets/rotate-ccw-xTwkf-m7.js.gz +0 -0
  165. package/payload/server/public/assets/{routines-DN_yDtEj.js → routines-Bu5MdNmG.js} +1 -1
  166. package/payload/server/public/assets/routines-Bu5MdNmG.js.br +0 -0
  167. package/payload/server/public/assets/routines-Bu5MdNmG.js.gz +0 -0
  168. package/payload/server/public/assets/{skills-pb_3BdOl.js → skills-DRunh5vy.js} +1 -1
  169. package/payload/server/public/assets/skills-DRunh5vy.js.br +0 -0
  170. package/payload/server/public/assets/skills-DRunh5vy.js.gz +0 -0
  171. package/payload/server/public/assets/{tasks-BQm4boat.js → tasks-DI2fznvd.js} +1 -1
  172. package/payload/server/public/assets/tasks-DI2fznvd.js.br +0 -0
  173. package/payload/server/public/assets/tasks-DI2fznvd.js.gz +0 -0
  174. package/payload/server/public/assets/{triangle-alert-d7yjaIqv.js → triangle-alert-B6CHZeUf.js} +1 -1
  175. package/payload/server/public/assets/triangle-alert-B6CHZeUf.js.br +0 -0
  176. package/payload/server/public/assets/triangle-alert-B6CHZeUf.js.gz +0 -0
  177. package/payload/server/public/assets/{useCopyFeedback-CZ6Qhfkj.js → useCopyFeedback-6rU2IEPk.js} +1 -1
  178. package/payload/server/public/assets/useCopyFeedback-6rU2IEPk.js.br +2 -0
  179. package/payload/server/public/assets/useCopyFeedback-6rU2IEPk.js.gz +0 -0
  180. package/payload/server/public/assets/{useMediaQuery-R1smYLx4.js → useMediaQuery-D7A5Bzs3.js} +1 -1
  181. package/payload/server/public/assets/useMediaQuery-D7A5Bzs3.js.br +0 -0
  182. package/payload/server/public/assets/useMediaQuery-D7A5Bzs3.js.gz +0 -0
  183. package/payload/server/public/assets/useVoiceRecorder-CptrerVA.js +2 -0
  184. package/payload/server/public/assets/useVoiceRecorder-CptrerVA.js.br +0 -0
  185. package/payload/server/public/assets/useVoiceRecorder-CptrerVA.js.gz +0 -0
  186. package/payload/server/public/assets/{wrench-DL1pbaCs.js → wrench-DyX4C8aY.js} +1 -1
  187. package/payload/server/public/assets/wrench-DyX4C8aY.js.br +0 -0
  188. package/payload/server/public/assets/wrench-DyX4C8aY.js.gz +0 -0
  189. package/payload/server/public/browser.html +5 -5
  190. package/payload/server/public/calendar.html +8 -8
  191. package/payload/server/public/chat.html +14 -14
  192. package/payload/server/public/data.html +12 -12
  193. package/payload/server/public/field.html +3 -3
  194. package/payload/server/public/graph.html +10 -10
  195. package/payload/server/public/index.html +14 -14
  196. package/payload/server/public/operator.html +15 -15
  197. package/payload/server/public/public.html +14 -14
  198. package/payload/server/public/routines.html +8 -8
  199. package/payload/server/public/skills.html +6 -6
  200. package/payload/server/public/tasks.html +7 -7
  201. package/payload/server/server.js +634 -461
  202. package/payload/server/video-extract.js +36 -0
  203. package/payload/server/public/assets/AdminLoginScreens-B3W6J6Bl.js.br +0 -0
  204. package/payload/server/public/assets/AdminLoginScreens-B3W6J6Bl.js.gz +0 -0
  205. package/payload/server/public/assets/AdminShell-C3R-vMZ5.js.br +0 -0
  206. package/payload/server/public/assets/AdminShell-C3R-vMZ5.js.gz +0 -0
  207. package/payload/server/public/assets/activity-tzv68iBs.js.br +0 -0
  208. package/payload/server/public/assets/activity-tzv68iBs.js.gz +0 -0
  209. package/payload/server/public/assets/admin-CzW_9jm3.js +0 -1
  210. package/payload/server/public/assets/admin-CzW_9jm3.js.br +0 -0
  211. package/payload/server/public/assets/admin-CzW_9jm3.js.gz +0 -0
  212. package/payload/server/public/assets/agents-DUZfeY3X.js.br +0 -0
  213. package/payload/server/public/assets/agents-DUZfeY3X.js.gz +0 -0
  214. package/payload/server/public/assets/browser-DwLaXqjO.js.br +0 -0
  215. package/payload/server/public/assets/browser-DwLaXqjO.js.gz +0 -0
  216. package/payload/server/public/assets/calendar-Cli8Qjl9.js.br +0 -0
  217. package/payload/server/public/assets/calendar-Cli8Qjl9.js.gz +0 -0
  218. package/payload/server/public/assets/chat-ByAgBgm1.js +0 -1
  219. package/payload/server/public/assets/chat-ByAgBgm1.js.br +0 -1
  220. package/payload/server/public/assets/chat-ByAgBgm1.js.gz +0 -0
  221. package/payload/server/public/assets/chevron-left-BIYVnwvk.js +0 -1
  222. package/payload/server/public/assets/chevron-left-BIYVnwvk.js.br +0 -0
  223. package/payload/server/public/assets/clock-Dzy79hq3.js +0 -1
  224. package/payload/server/public/assets/clock-Dzy79hq3.js.br +0 -0
  225. package/payload/server/public/assets/clock-Dzy79hq3.js.gz +0 -0
  226. package/payload/server/public/assets/copy-yhhwfEbQ.js.br +0 -0
  227. package/payload/server/public/assets/copy-yhhwfEbQ.js.gz +0 -0
  228. package/payload/server/public/assets/data-CsMMki2A.js +0 -1
  229. package/payload/server/public/assets/data-CsMMki2A.js.br +0 -0
  230. package/payload/server/public/assets/data-CsMMki2A.js.gz +0 -0
  231. package/payload/server/public/assets/field-jg0YQNDy.js.br +0 -0
  232. package/payload/server/public/assets/field-jg0YQNDy.js.gz +0 -0
  233. package/payload/server/public/assets/file-text-D0EdW7h4.js.br +0 -0
  234. package/payload/server/public/assets/file-text-D0EdW7h4.js.gz +0 -0
  235. package/payload/server/public/assets/graph--AUr4uBc.js.br +0 -0
  236. package/payload/server/public/assets/graph--AUr4uBc.js.gz +0 -0
  237. package/payload/server/public/assets/graph-labels-DM0CiAX1.js.br +0 -0
  238. package/payload/server/public/assets/graph-labels-DM0CiAX1.js.gz +0 -0
  239. package/payload/server/public/assets/jsx-runtime-lfcjzaWi.css.br +0 -0
  240. package/payload/server/public/assets/operator-CNYKStFX.js.br +0 -0
  241. package/payload/server/public/assets/operator-CNYKStFX.js.gz +0 -0
  242. package/payload/server/public/assets/page-DSsEpl8J.js +0 -32
  243. package/payload/server/public/assets/page-DSsEpl8J.js.br +0 -0
  244. package/payload/server/public/assets/page-DSsEpl8J.js.gz +0 -0
  245. package/payload/server/public/assets/page-DjhmwxnY.js +0 -1
  246. package/payload/server/public/assets/page-DjhmwxnY.js.br +0 -0
  247. package/payload/server/public/assets/page-DjhmwxnY.js.gz +0 -0
  248. package/payload/server/public/assets/play-DhZlml5b.js +0 -1
  249. package/payload/server/public/assets/play-DhZlml5b.js.br +0 -0
  250. package/payload/server/public/assets/play-DhZlml5b.js.gz +0 -0
  251. package/payload/server/public/assets/public-7gXDqCog.js.br +0 -0
  252. package/payload/server/public/assets/public-7gXDqCog.js.gz +0 -0
  253. package/payload/server/public/assets/rotate-ccw-DhqNTPpo.js.br +0 -0
  254. package/payload/server/public/assets/rotate-ccw-DhqNTPpo.js.gz +0 -0
  255. package/payload/server/public/assets/routines-DN_yDtEj.js.br +0 -0
  256. package/payload/server/public/assets/routines-DN_yDtEj.js.gz +0 -0
  257. package/payload/server/public/assets/skills-pb_3BdOl.js.br +0 -0
  258. package/payload/server/public/assets/skills-pb_3BdOl.js.gz +0 -0
  259. package/payload/server/public/assets/tasks-BQm4boat.js.br +0 -0
  260. package/payload/server/public/assets/tasks-BQm4boat.js.gz +0 -0
  261. package/payload/server/public/assets/triangle-alert-d7yjaIqv.js.br +0 -0
  262. package/payload/server/public/assets/triangle-alert-d7yjaIqv.js.gz +0 -0
  263. package/payload/server/public/assets/useCopyFeedback-CZ6Qhfkj.js.br +0 -0
  264. package/payload/server/public/assets/useCopyFeedback-CZ6Qhfkj.js.gz +0 -0
  265. package/payload/server/public/assets/useMediaQuery-R1smYLx4.js.br +0 -0
  266. package/payload/server/public/assets/useMediaQuery-R1smYLx4.js.gz +0 -0
  267. package/payload/server/public/assets/useVoiceRecorder-DM1v6sRa.js +0 -2
  268. package/payload/server/public/assets/useVoiceRecorder-DM1v6sRa.js.br +0 -0
  269. package/payload/server/public/assets/useVoiceRecorder-DM1v6sRa.js.gz +0 -0
  270. package/payload/server/public/assets/wrench-DL1pbaCs.js.br +0 -0
  271. package/payload/server/public/assets/wrench-DL1pbaCs.js.gz +0 -0
  272. /package/payload/server/public/assets/{jsx-runtime-BtDK2X5t.js → jsx-runtime-B2Q1UOSJ.js} +0 -0
  273. /package/payload/server/public/assets/{jsx-runtime-BtDK2X5t.js.br → jsx-runtime-B2Q1UOSJ.js.br} +0 -0
  274. /package/payload/server/public/assets/{jsx-runtime-BtDK2X5t.js.gz → jsx-runtime-B2Q1UOSJ.js.gz} +0 -0
@@ -0,0 +1,31 @@
1
+ // Acceptance gate for the email-sampler systemd unit (Task 2682).
2
+ //
3
+ // The sampler runs the plugin's compiled entrypoint as its own per-brand user
4
+ // unit. Two invariants:
5
+ // (a) it runs `node dist/sampler/main.js` from the email plugin's mcp dir, so
6
+ // its relative imports of the plugin's lib resolve;
7
+ // (b) it carries the same runtime env the email MCP server needs —
8
+ // PLATFORM_ROOT, ACCOUNT_ID, the sampler log path — plus the brand .env
9
+ // (which supplies NEO4J_URI and the neo4j password source).
10
+ import test from "node:test";
11
+ import assert from "node:assert/strict";
12
+ import { buildEmailSamplerUnitFile } from "../port-resolution.js";
13
+ const unit = buildEmailSamplerUnitFile({
14
+ productName: "Maxy",
15
+ installDir: "/home/x/maxy-code",
16
+ persistDir: "/home/x/.maxy",
17
+ accountId: "acc-1",
18
+ logPath: "/home/x/.maxy/logs/email-sampler.log",
19
+ intervalSec: 60,
20
+ });
21
+ test("runs the compiled sampler from the plugin dir", () => {
22
+ assert.match(unit, /^WorkingDirectory=\/home\/x\/maxy-code\/platform\/plugins\/email\/mcp$/m);
23
+ assert.match(unit, /^ExecStart=\/usr\/bin\/node dist\/sampler\/main\.js$/m);
24
+ });
25
+ test("carries the plugin runtime env and the brand .env", () => {
26
+ assert.match(unit, /^Environment=PLATFORM_ROOT=\/home\/x\/maxy-code\/platform$/m);
27
+ assert.match(unit, /^Environment=ACCOUNT_ID=acc-1$/m);
28
+ assert.match(unit, /^Environment=EMAIL_SAMPLER_LOG_PATH=\/home\/x\/\.maxy\/logs\/email-sampler\.log$/m);
29
+ assert.match(unit, /^Environment=EMAIL_SAMPLER_INTERVAL_SEC=60$/m);
30
+ assert.match(unit, /^EnvironmentFile=-\/home\/x\/\.maxy\/\.env$/m);
31
+ });
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import { clearBrandAgentRoot } from "./brand-agent-root.js";
5
5
  import { seedBypassPermissionsSettings, assertBypassPermissionsSeed } from "./permissions-seed.js";
6
6
  import { resolve, join, dirname } from "node:path";
7
7
  import { randomBytes } from "node:crypto";
8
- import { resolveInstallPortFromFs, buildMaxyUnitFile, buildClaudeSessionManagerUnitFile, buildClaudePtysSliceUnitFile, buildCloudflaredSliceUnitFile, buildDarwinServiceEnvPath } from "./port-resolution.js";
8
+ import { resolveInstallPortFromFs, buildMaxyUnitFile, buildClaudeSessionManagerUnitFile, buildEmailSamplerUnitFile, buildClaudePtysSliceUnitFile, buildCloudflaredSliceUnitFile, buildDarwinServiceEnvPath } from "./port-resolution.js";
9
9
  import { buildBrandCronBlock, mergeBrandCronBlock } from "./cron-registration.js";
10
10
  import { validateTierFlag, validateEntitlementBase64, applyTierToAccountConfig, entitlementPath } from "./tier-flag.js";
11
11
  import { parseOsRelease, isUbuntuLike as isUbuntuLikePure, parseAptCacheCandidate, decideAptResolution, } from "./apt-resolve.js";
@@ -4571,6 +4571,20 @@ WantedBy=default.target
4571
4571
  `;
4572
4572
  writeFileSync(join(serviceDir, rssSamplerUnitName), rssSamplerUnit);
4573
4573
  logFile(` rss-sampler installed: ${rssSamplerUnitName} LOG_PATH=${rssSamplerLogPath} BRAND_SERVICE=${memBrandService} EDGE_SERVICE=${memEdgeService} NEO4J_UNIT=${memNeo4jUnit} MEM_PRESSURE_PCT=${memPressurePct}`);
4574
+ // Task 2682 — the email-sampler unit: an always-on user service that writes
4575
+ // every inbound IMAP message to the graph, independent of any agent turn. It
4576
+ // runs the email plugin's compiled sampler entrypoint from the plugin dir.
4577
+ const emailSamplerUnitName = `${BRAND.hostname}-email-sampler.service`;
4578
+ const emailSamplerLogPath = join(persistDir, "logs", "email-sampler.log");
4579
+ const emailSamplerUnit = buildEmailSamplerUnitFile({
4580
+ productName: BRAND.productName,
4581
+ installDir: INSTALL_DIR,
4582
+ persistDir,
4583
+ accountId: installAccountId,
4584
+ logPath: emailSamplerLogPath,
4585
+ });
4586
+ writeFileSync(join(serviceDir, emailSamplerUnitName), emailSamplerUnit);
4587
+ logFile(` email-sampler installed: ${emailSamplerUnitName} LOG_PATH=${emailSamplerLogPath}`);
4574
4588
  // the edge service: always-on front door that owns the public
4575
4589
  // port (PORT) and the VNC stack (Xtigervnc + websockify). Its lifecycle is
4576
4590
  // independent of the main brand service, so an in-place upgrade triggered
@@ -4791,13 +4805,15 @@ WantedBy=multi-user.target
4791
4805
  spawnSync("systemctl", ["--user", "enable", claudeSessionManagerUnitShort], { stdio: "inherit" });
4792
4806
  spawnSync("systemctl", ["--user", "enable", unitName], { stdio: "inherit" });
4793
4807
  spawnSync("systemctl", ["--user", "enable", `${BRAND.hostname}-rss-sampler`], { stdio: "inherit" });
4808
+ spawnSync("systemctl", ["--user", "enable", `${BRAND.hostname}-email-sampler`], { stdio: "inherit" });
4794
4809
  // edge first: binds public port + starts VNC stack. Then claude-session-manager
4795
4810
  // (so the main brand unit's Requires= is satisfied). Then main brand service.
4796
- // rss-sampler is independent — start last, failure is non-blocking.
4811
+ // rss-sampler and email-sampler are independent — start last, failure is non-blocking.
4797
4812
  spawnSync("systemctl", ["--user", "restart", edgeUnitShort], { stdio: "inherit" });
4798
4813
  spawnSync("systemctl", ["--user", "restart", claudeSessionManagerUnitShort], { stdio: "inherit" });
4799
4814
  spawnSync("systemctl", ["--user", "restart", unitName], { stdio: "inherit" });
4800
4815
  spawnSync("systemctl", ["--user", "restart", `${BRAND.hostname}-rss-sampler`], { stdio: "inherit" });
4816
+ spawnSync("systemctl", ["--user", "restart", `${BRAND.hostname}-email-sampler`], { stdio: "inherit" });
4801
4817
  // Session manager runs in its own systemd user unit and can boot-fail silently
4802
4818
  // (e.g. mcp-block-missing). The web server below comes up regardless, so the
4803
4819
  // install terminal would otherwise report success while every API call 503s.
@@ -167,6 +167,30 @@ EnvironmentFile=-${o.persistDir}/.env
167
167
  StandardOutput=append:${o.persistDir}/logs/server.log
168
168
  StandardError=append:${o.persistDir}/logs/server.log
169
169
 
170
+ [Install]
171
+ WantedBy=default.target
172
+ `;
173
+ }
174
+ export function buildEmailSamplerUnitFile(o) {
175
+ return `[Unit]
176
+ Description=${o.productName} Email Sampler
177
+ After=network.target
178
+
179
+ [Service]
180
+ Type=simple
181
+ WorkingDirectory=${o.installDir}/platform/plugins/email/mcp
182
+ ExecStart=/usr/bin/node dist/sampler/main.js
183
+ Restart=on-failure
184
+ RestartSec=10
185
+ Environment=NODE_ENV=production
186
+ Environment=ACCOUNT_ID=${o.accountId}
187
+ Environment=PLATFORM_ROOT=${o.installDir}/platform
188
+ Environment=EMAIL_SAMPLER_LOG_PATH=${o.logPath}
189
+ Environment=EMAIL_SAMPLER_INTERVAL_SEC=${o.intervalSec ?? 60}
190
+ EnvironmentFile=-${o.persistDir}/.env
191
+ StandardOutput=append:${o.persistDir}/logs/server.log
192
+ StandardError=append:${o.persistDir}/logs/server.log
193
+
170
194
  [Install]
171
195
  WantedBy=default.target
172
196
  `;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-maxy-code",
3
- "version": "0.1.600",
3
+ "version": "0.1.602",
4
4
  "description": "Install Maxy — AI for Productive People",
5
5
  "bin": {
6
6
  "create-maxy-code": "./dist/index.js"
@@ -0,0 +1,141 @@
1
+ #!/usr/bin/env bash
2
+ # video-frames-inject — PreToolUse gate on Read of a video file (Task 2696).
3
+ #
4
+ # Read cannot decode a video at all: it refuses with "This tool cannot read
5
+ # binary files", so an agent handed a video path either gives up or improvises
6
+ # its own ffmpeg frame grab with no relation to the audio. This hook runs the
7
+ # same deterministic extraction the three channels use and hands back the frame
8
+ # and speech timeline, so the filesystem route stops being the one door where
9
+ # seeing a video depends on the model deciding to.
10
+ #
11
+ # PreToolUse, NOT PostToolUse — the opposite of pdf-text-layer-inject.sh, and
12
+ # for a measured reason. Read SUCCEEDS on a PDF (returning page images), so the
13
+ # PDF hook injects its text layer afterwards. Read FAILS on a video, so there is
14
+ # no successful call to attach to; blocking the doomed Read and returning the
15
+ # timeline as the reason is the only way the content reaches the turn.
16
+ #
17
+ # Exit codes: 2 = the Read is blocked and the timeline on stderr reaches the
18
+ # model (the same feedback mechanism pdf-text-layer-inject.sh and
19
+ # task-authoring-gate.sh rely on); 0 = not a video, or extraction had nothing to
20
+ # say, and the Read proceeds untouched. Fail OPEN on every uninspectable path —
21
+ # a hook that cannot extract must never block a Read it has no opinion on.
22
+ #
23
+ # One line per video Read to <logDir>/video-frames.log, including the reads that
24
+ # inject nothing: a clip past the duration ceiling and a hook that never fired
25
+ # are different states and only the log tells them apart.
26
+
27
+ set -uo pipefail
28
+
29
+ if [ -t 0 ]; then exit 0; fi
30
+ INPUT=$(cat)
31
+ [ -z "$INPUT" ] && exit 0
32
+
33
+ # --- log sink ---------------------------------------------------------------
34
+ # Same ladder as pdf-text-layer-inject.sh: a hook's stderr on exit 0 reaches no
35
+ # file on this platform. LOG_DIR is stamped only on the rc-spawn path,
36
+ # CLAUDE_SESSION_MANAGER_PERSIST_DIR is on the systemd unit and resolves to the
37
+ # same directory, ACCOUNT_DIR/logs is the last resort.
38
+ LOGD=""
39
+ if [ -n "${LOG_DIR:-}" ] && [ -d "${LOG_DIR}" ]; then
40
+ LOGD="$LOG_DIR"
41
+ elif [ -n "${CLAUDE_SESSION_MANAGER_PERSIST_DIR:-}" ] && [ -d "${CLAUDE_SESSION_MANAGER_PERSIST_DIR}/logs" ]; then
42
+ LOGD="$CLAUDE_SESSION_MANAGER_PERSIST_DIR/logs"
43
+ elif [ -n "${ACCOUNT_DIR:-}" ] && [ -d "${ACCOUNT_DIR}/logs" ]; then
44
+ LOGD="$ACCOUNT_DIR/logs"
45
+ fi
46
+
47
+ INPUT="$INPUT" LOGD="$LOGD" \
48
+ NOW_ISO="$(date -u +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || echo '?')" \
49
+ PLATFORM_ROOT="${PLATFORM_ROOT:-}" \
50
+ python3 - <<'PY'
51
+ import json, os, subprocess, sys
52
+
53
+ VIDEO_EXTS = (".mp4", ".mov", ".webm", ".mkv", ".3gp")
54
+
55
+ logd = os.environ.get("LOGD", "")
56
+ now = os.environ.get("NOW_ISO", "?")
57
+
58
+ account = os.environ.get("ACCOUNT_ID") or ""
59
+ if not account:
60
+ acct_dir = os.environ.get("ACCOUNT_DIR") or ""
61
+ account = os.path.basename(acct_dir.rstrip("/")) if acct_dir else ""
62
+ account = account or "?"
63
+
64
+
65
+ def emit_log(base, chars, injected, reason, sid):
66
+ if not logd:
67
+ return
68
+ line = ("%s [video-frames] op=video-frames file=%s chars=%d "
69
+ "injected=%s reason=%s account=%s session=%s"
70
+ % (now, base, chars, injected, reason, account, sid))
71
+ try:
72
+ with open(os.path.join(logd, "video-frames.log"), "a") as fh:
73
+ fh.write(line + "\n")
74
+ except Exception:
75
+ pass
76
+
77
+
78
+ try:
79
+ d = json.loads(os.environ["INPUT"])
80
+ except Exception:
81
+ sys.exit(0)
82
+
83
+ if (d.get("hook_event_name") or "") != "PreToolUse":
84
+ sys.exit(0)
85
+ if (d.get("tool_name") or "") != "Read":
86
+ sys.exit(0)
87
+ path = (d.get("tool_input") or {}).get("file_path") or ""
88
+ if not path.lower().endswith(VIDEO_EXTS):
89
+ sys.exit(0)
90
+
91
+ sid = d.get("session_id") or "?"
92
+ base = os.path.basename(path)
93
+
94
+ # The extraction CLI is built beside the server (tsup entry `video-extract`), so
95
+ # the pipeline here is the same code the WhatsApp, Telegram and admin webchat
96
+ # doors run. Re-implementing ffmpeg and whisper in this hook would be a second
97
+ # authority for the same fact.
98
+ root = os.environ.get("PLATFORM_ROOT") or ""
99
+ cli = os.path.join(root, "ui", "dist", "video-extract.js") if root else ""
100
+ if not cli or not os.path.exists(cli):
101
+ emit_log(base, 0, "no", "no-cli", sid)
102
+ sys.exit(0)
103
+
104
+ # 25 minutes, and it must stay above the extraction's own budget or this door
105
+ # caps lower than the channels and MAX_DURATION_S means two different things.
106
+ # A 300s clip (the ceiling) costs ~1200s of whisper at 0.25x real time, which
107
+ # is WHISPER_TIMEOUT_MS; frame extraction is on top. Cutting in below that would
108
+ # kill work the channel doors would have completed.
109
+ try:
110
+ proc = subprocess.run(["node", cli, path], capture_output=True, timeout=1500)
111
+ except FileNotFoundError:
112
+ emit_log(base, 0, "no", "no-node", sid)
113
+ sys.exit(0)
114
+ except Exception:
115
+ emit_log(base, 0, "no", "unreadable", sid)
116
+ sys.exit(0)
117
+
118
+ # Exit 1 is the CLI's "nothing useful to say": not a video, past the duration
119
+ # ceiling, no video stream, or no frame extracted. The [video] line written by
120
+ # the extraction itself carries which one.
121
+ if proc.returncode != 0:
122
+ emit_log(base, 0, "no", "no-timeline", sid)
123
+ sys.exit(0)
124
+
125
+ timeline = proc.stdout.decode("utf-8", "replace").strip()
126
+ if not timeline:
127
+ emit_log(base, 0, "no", "empty-timeline", sid)
128
+ sys.exit(0)
129
+
130
+ # Log before writing the payload, so a failure mid-write still leaves the record.
131
+ emit_log(base, len(timeline), "yes", "timeline", sid)
132
+
133
+ sys.stderr.write(
134
+ "Read cannot decode %s, so it was not opened. Below is that video as "
135
+ "sampled frames and its spoken transcript, on the video's own clock. Read "
136
+ "the frame paths to see those moments.\n\n%s\n" % (base, timeline))
137
+ sys.exit(2)
138
+ PY
139
+ rc=$?
140
+ [ "$rc" -eq 2 ] && exit 2
141
+ exit 0
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: platform-architecture
3
3
  description: Use when grounding any documented-surface claim about what Maxy ships — plugins, skills, specialists, install/deploy flows, internals. This is the install catalogue, not evidence of what is enabled on the current account. For install state on this account, call `capabilities-here`; for documented surface, cite the `Source:` URL inline.
4
- content-hash: sha256:154b4b17ecfbf8967fc500322307751a50e6c24c934bd43400a821b99ad94c71
4
+ content-hash: sha256:e4040096c05f9e3fb874192816e5dfba38bb5d72f70c6ecc95a3ba7e03c246e0
5
5
  brand: maxy-code
6
6
  product-name: Maxy
7
7
  ---
@@ -2868,6 +2868,8 @@ Maxy asks for your bot token, then asks what kind of bot this is:
2868
2868
 
2869
2869
  A public Telegram bot holds five things and nothing else: the reply that carries its answer, cards with tappable buttons, polls and quizzes and map pins, outgoing photos and documents and voice notes, and the ability to open a file a visitor sent it. That set is fixed by the platform for every public agent on every account, so there is no tools setting on an agent to turn any of it on or off. A public bot on webchat or WhatsApp still has the reply alone, because those channels ship no equivalent set.
2870
2870
 
2871
+ Everything outside that set is not offered to a public bot at all, rather than offered and then refused. The difference matters to a visitor: an agent shown a tool it cannot use will sometimes try it, and the refusal it gets back reads to the person waiting as the assistant talking to itself. A public spawn states its surface when it starts — `[telegram-tools] op=public-surface registered=4` in the server log — and a count above four is a fault worth reporting.
2872
+
2871
2873
  It verifies the token, registers the bot's webhook on your brand's edge, stores the token under your brand's config (never in a shared system directory), and sets whichever agent or specialist will answer. The bot is now connected.
2872
2874
 
2873
2875
  ### Step 3: Start the bot
@@ -4082,6 +4084,8 @@ either is a regression.
4082
4084
 
4083
4085
  **`/chat` composer transport button.** The button at the end of the input shows a **microphone** while the box is empty — tap it to record a voice note. Type a character, or attach a file, and the same button becomes the **send** arrow; while the agent is replying it becomes a **stop** square. So an empty composer offers voice, a composer with something to send offers send, and a running turn offers stop — one button, three states. The microphone-device chooser (which input to record from) stays in the row of icons below the box. This is the same on the admin `/chat`, the public chat, and the maxy-lite webchat.
4084
4086
 
4087
+ **`/chat` a voice note or video clears the composer as soon as it uploads.** Sending audio or video used to hold the request open for the whole of transcription — a ~25 MB clip measures around three minutes — and the tunnel cancels anything past 125 seconds. The reply still arrived, but the browser had already given up, so the operator read an answer sitting above a composer that still held their text and the audio chip, and sent again. The send now answers as soon as the upload is stored: the composer clears in a couple of seconds, and "Transcribing audio…" stays up for the whole of the real transcription because the server reports that state on the session pointer rather than the browser guessing it from its own request. The bare microphone path behaves the same way and gains the same line, where before it re-staged the recording and said "Voice note failed to send" while the turn was landing. Every refusal an operator can trigger — too many files, an unsupported file, an oversize recording, a storage failure — is still answered on the request itself, so a rejected send is still rejected on screen. A send that genuinely never reaches the server now says "Couldn't be sent — press send to retry." and writes a `webchat-send-failed` line to `client-errors.log`; that is a different statement from the existing "Message not delivered" banner, which means an accepted send that produced no turn. Operators triaging this have three server-side lines: `op=send-staged` when the upload was taken, `op=send-continuation-failed` if transcription died, and a 15-minute `op=send-response-lost-census` in the edge log that reports `aborted=0` too, so a quiet census is distinguishable from a stopped one. Detail lives in `.docs/admin-webchat-native-channel.md` ("A voice or video send accepts on upload").
4088
+
4085
4089
  **`/chat` Conversations flyout + zero-sessions splash.** The admin `/chat` `HeaderMenu` carries a **Conversations** item (rendered only when `onOpenConversations` is wired, which scopes it to `/chat`) that opens an in-chat session-management pane (`app/chat/SessionList.tsx`) hosted by `chat/page.tsx` — distinct from, and sharing endpoints with, the `Sidebar` Sessions list (which stays hidden on narrow viewports). It enumerates the admin's own webchat sessions via `GET /api/admin/sidebar-sessions` (carries the per-row `live` marker and `archived` flag, install-wide), **filtering out `channel:'whatsapp'`/`'telegram'` rows** (those are channel-bound, cannot be chatted in webchat, and live in the WhatsApp/Telegram reader panels; the same endpoint now also feeds the sidebar Sessions list, which does show them), lists the remainder newest-first with the live one marked and archived rows folded under a collapsible subsection, and offers per-row resume (`/chat?session=<id>`), rename, archive/unarchive, two-tap delete, an **End** control on the live row (`session-stop`), plus a New-session control (`session-rc-spawn`) and a copyable full id. The pane header carries the title and a top-right close (X) control that dismisses the flyout (no back-chevron/"Chat" label); the New-session control floats at the pane's bottom-left. When the canonical pointer is `known:false` (`canonical-empty`) and enumeration returns zero rows, the surface renders a splash (brand logo + New session) instead of a dead bootstrap thread; a freshly-spawned New session is `known:true`, so its greeting is preserved. Client breadcrumbs: `[chat-conversations] op=enumerate owned=<n>` and `op=action name=<open|rename|archive|delete|stop> sessionId=<id8>` (`op=action-failed … status=…` on a non-2xx). Detail lives in `.docs/admin-webchat-native-channel.md` ("Conversations flyout + zero-sessions splash").
4086
4090
 
4087
4091
  **`/chat` header always shows the account name.** The admin/operator `HeaderMenu` centre always renders the active account's name alongside the brand logo, on every chat surface, regardless of the active conversation — `headerTitle = businessName || brand.productName`. There is no per-conversation header title: the active conversation's label stays in the sidebar and the Conversations flyout (each resolves its own per-session title independently), never in the header. The account name is `LocalBusiness.name`, resolved by `fetchAccountName(accountId)` in `neo4j-store.ts` with **no theme gate** — unlike `fetchBranding` (which returns null unless a colour/logo property is also set, and stays the source for actual theming). The house account is seeded with `LocalBusiness.name = <brand productName>` (`seed-neo4j.sh`, coalesced ON MATCH so a re-seed backfills a name-less node and never clobbers a name the business-profile recorder set later), so the sub-account picker's house row shows the product name (e.g. "SiteDesk"), not the raw accountId UUID. When a name is absent the resolver emits `[branding] account-name-fallback accountId=<id8>… reason=no-name`, and the picker falls back to the accountId; the seed + backfill is the name source. The lite variant header is unchanged.
@@ -9,6 +9,16 @@ Invoked by the admin agent directly.
9
9
 
10
10
  This is the platform's release timeline, newest first. Each entry shows the date it shipped and the version it shipped in, so you can tell the operator how current their install is. To compare, read the installed version from `capabilities-here` and match it against the versions below. Keep answers high level and in plain English; this is a summary, not a full commit log.
11
11
 
12
+ ## 2026-08-13 (0.1.602)
13
+
14
+ - Voice and video sends from the webchat composer are now accepted the moment the upload lands, instead of holding the confirmation until transcription completes.
15
+ - A new 15-minute census on the edge counts aborted webchat send responses, and a `webchat-send-failed` client-error kind lets a failed send surface honestly.
16
+ - Read a failed transcription state from the pointer instead of the request path, and count staged sends per key rather than in aggregate.
17
+
18
+ ## 2026-08-13 (0.1.601)
19
+
20
+ - Your incoming email is now recorded automatically. A background service checks each connected mailbox on its own and saves every new message so the assistant can recall it later, without you having to say "check my email" first.
21
+
12
22
  ## 2026-08-13 (0.1.600)
13
23
 
14
24
  - The routine that keeps your diary and the app's view of it in step now also wakes when an appointment changes in the app, not only when your provider calendar changes. It stays quiet on a check where neither side moved.
@@ -73,6 +73,8 @@ either is a regression.
73
73
 
74
74
  **`/chat` composer transport button.** The button at the end of the input shows a **microphone** while the box is empty — tap it to record a voice note. Type a character, or attach a file, and the same button becomes the **send** arrow; while the agent is replying it becomes a **stop** square. So an empty composer offers voice, a composer with something to send offers send, and a running turn offers stop — one button, three states. The microphone-device chooser (which input to record from) stays in the row of icons below the box. This is the same on the admin `/chat`, the public chat, and the maxy-lite webchat.
75
75
 
76
+ **`/chat` a voice note or video clears the composer as soon as it uploads.** Sending audio or video used to hold the request open for the whole of transcription — a ~25 MB clip measures around three minutes — and the tunnel cancels anything past 125 seconds. The reply still arrived, but the browser had already given up, so the operator read an answer sitting above a composer that still held their text and the audio chip, and sent again. The send now answers as soon as the upload is stored: the composer clears in a couple of seconds, and "Transcribing audio…" stays up for the whole of the real transcription because the server reports that state on the session pointer rather than the browser guessing it from its own request. The bare microphone path behaves the same way and gains the same line, where before it re-staged the recording and said "Voice note failed to send" while the turn was landing. Every refusal an operator can trigger — too many files, an unsupported file, an oversize recording, a storage failure — is still answered on the request itself, so a rejected send is still rejected on screen. A send that genuinely never reaches the server now says "Couldn't be sent — press send to retry." and writes a `webchat-send-failed` line to `client-errors.log`; that is a different statement from the existing "Message not delivered" banner, which means an accepted send that produced no turn. Operators triaging this have three server-side lines: `op=send-staged` when the upload was taken, `op=send-continuation-failed` if transcription died, and a 15-minute `op=send-response-lost-census` in the edge log that reports `aborted=0` too, so a quiet census is distinguishable from a stopped one. Detail lives in `.docs/admin-webchat-native-channel.md` ("A voice or video send accepts on upload").
77
+
76
78
  **`/chat` Conversations flyout + zero-sessions splash.** The admin `/chat` `HeaderMenu` carries a **Conversations** item (rendered only when `onOpenConversations` is wired, which scopes it to `/chat`) that opens an in-chat session-management pane (`app/chat/SessionList.tsx`) hosted by `chat/page.tsx` — distinct from, and sharing endpoints with, the `Sidebar` Sessions list (which stays hidden on narrow viewports). It enumerates the admin's own webchat sessions via `GET /api/admin/sidebar-sessions` (carries the per-row `live` marker and `archived` flag, install-wide), **filtering out `channel:'whatsapp'`/`'telegram'` rows** (those are channel-bound, cannot be chatted in webchat, and live in the WhatsApp/Telegram reader panels; the same endpoint now also feeds the sidebar Sessions list, which does show them), lists the remainder newest-first with the live one marked and archived rows folded under a collapsible subsection, and offers per-row resume (`/chat?session=<id>`), rename, archive/unarchive, two-tap delete, an **End** control on the live row (`session-stop`), plus a New-session control (`session-rc-spawn`) and a copyable full id. The pane header carries the title and a top-right close (X) control that dismisses the flyout (no back-chevron/"Chat" label); the New-session control floats at the pane's bottom-left. When the canonical pointer is `known:false` (`canonical-empty`) and enumeration returns zero rows, the surface renders a splash (brand logo + New session) instead of a dead bootstrap thread; a freshly-spawned New session is `known:true`, so its greeting is preserved. Client breadcrumbs: `[chat-conversations] op=enumerate owned=<n>` and `op=action name=<open|rename|archive|delete|stop> sessionId=<id8>` (`op=action-failed … status=…` on a non-2xx). Detail lives in `.docs/admin-webchat-native-channel.md` ("Conversations flyout + zero-sessions splash").
77
79
 
78
80
  **`/chat` header always shows the account name.** The admin/operator `HeaderMenu` centre always renders the active account's name alongside the brand logo, on every chat surface, regardless of the active conversation — `headerTitle = businessName || brand.productName`. There is no per-conversation header title: the active conversation's label stays in the sidebar and the Conversations flyout (each resolves its own per-session title independently), never in the header. The account name is `LocalBusiness.name`, resolved by `fetchAccountName(accountId)` in `neo4j-store.ts` with **no theme gate** — unlike `fetchBranding` (which returns null unless a colour/logo property is also set, and stays the source for actual theming). The house account is seeded with `LocalBusiness.name = <brand productName>` (`seed-neo4j.sh`, coalesced ON MATCH so a re-seed backfills a name-less node and never clobbers a name the business-profile recorder set later), so the sub-account picker's house row shows the product name (e.g. "SiteDesk"), not the raw accountId UUID. When a name is absent the resolver emits `[branding] account-name-fallback accountId=<id8>… reason=no-name`, and the picker falls back to the accountId; the seed + backfill is the name source. The lite variant header is unchanged.
@@ -47,6 +47,8 @@ Tell {{productName}}: "Set up Telegram" or "Configure the Telegram bot." Setup r
47
47
 
48
48
  A public Telegram bot holds five things and nothing else: the reply that carries its answer, cards with tappable buttons, polls and quizzes and map pins, outgoing photos and documents and voice notes, and the ability to open a file a visitor sent it. That set is fixed by the platform for every public agent on every account, so there is no tools setting on an agent to turn any of it on or off. A public bot on webchat or WhatsApp still has the reply alone, because those channels ship no equivalent set.
49
49
 
50
+ Everything outside that set is not offered to a public bot at all, rather than offered and then refused. The difference matters to a visitor: an agent shown a tool it cannot use will sometimes try it, and the refusal it gets back reads to the person waiting as the assistant talking to itself. A public spawn states its surface when it starts — `[telegram-tools] op=public-surface registered=4` in the server log — and a count above four is a fault worth reporting.
51
+
50
52
  It verifies the token, registers the bot's webhook on your brand's edge, stores the token under your brand's config (never in a shared system directory), and sets whichever agent or specialist will answer. The bot is now connected.
51
53
 
52
54
  ### Step 3: Start the bot
@@ -143,7 +143,13 @@ Manages the agent's own dedicated email account — IMAP for reading, SMTP for s
143
143
 
144
144
  ## Ingestion model
145
145
 
146
- Email ingestion is **operator-initiated and human-in-the-loop**. There is no background poll, cron, or auto-classifier. New messages enter the graph only when the operator says "check my emails" and approves each one. See `skills/email-ingest/SKILL.md` for the conversation flow and `skills/email-composition/SKILL.md` for drafting replies once a thread is stored.
146
+ There are two independent paths into the graph, both writing `:ConversationArchive {source:'email'}`:
147
+
148
+ - **Deterministic ingest — the `email-sampler` service.** A per-brand, always-on systemd user unit (`<brand>-email-sampler.service`) runs the plugin's compiled `dist/sampler/main.js`. Each cycle it enumerates every connected IMAP mailbox on the install and writes every inbound message above its own cursor, with no agent turn and no approval step. Its cursor is `:EmailAccount.samplerCursorUid` + `samplerUidValidity`, written only by the sampler and kept strictly independent of `lastFetchedUid` (which `email-fetch` owns). This is the foundation a gate that reads email-in-graph can trust: every inbound message lands within one cycle. Observability: one `op=sample mailbox=<addr> fetched=<n> cursor=<uid>` line per mailbox per cycle (`op=sample-error` on failure, cursor unadvanced), read with `logs-read.sh --tail email-sampler`. Attachment archival by the sampler is deferred (see the task follow-up).
149
+
150
+ - **Operator-initiated ingest — human-in-the-loop.** When the operator says "check my emails", `email-fetch` lists new messages and the operator approves each one; only the approved subset is written via `email-ingest`, which also fetches and archives attachment bytes. See `skills/email-ingest/SKILL.md` for the conversation flow and `skills/email-composition/SKILL.md` for drafting replies once a thread is stored.
151
+
152
+ The two watermarks are independent by design, so a message may be seen by both; `dispatch` uses MERGE, so a double write is idempotent and never duplicates a node.
147
153
 
148
154
  ## Retrieval paths
149
155
 
@@ -61,6 +61,33 @@ export declare function readConfig(accountId: string, email: string): Promise<Em
61
61
  * own :EmailAccount node keyed by (accountId, email).
62
62
  */
63
63
  export declare function listConfigs(accountId: string): Promise<EmailConfig[]>;
64
+ /** The sampler's own high-water mark for one mailbox, keyed by uidValidity. */
65
+ export interface SamplerCursor {
66
+ cursorUid: number;
67
+ uidValidity: number | null;
68
+ }
69
+ /**
70
+ * Every configured IMAP mailbox across every account on the install, with its
71
+ * password resolved. An account whose password cannot be read is skipped (with
72
+ * a stderr note) rather than failing the whole enumeration, so one broken
73
+ * credential never stops the sampler from servicing the others.
74
+ */
75
+ export declare function listAllImapAccounts(): Promise<Array<{
76
+ accountId: string;
77
+ config: EmailConfig;
78
+ password: string;
79
+ }>>;
80
+ /**
81
+ * Read the sampler's cursor for one mailbox. Returns null when the node is
82
+ * absent or the sampler has never written a cursor for it — the caller treats
83
+ * that as "start from a fresh backfill".
84
+ */
85
+ export declare function readSamplerCursor(accountId: string, email: string): Promise<SamplerCursor | null>;
86
+ /**
87
+ * Advance the sampler's cursor for one mailbox. Written only by the sampler,
88
+ * never touching `lastFetchedUid`. Integer-typed to match `lastFetchedUid`.
89
+ */
90
+ export declare function advanceSamplerCursor(accountId: string, email: string, cursorUid: number, uidValidity: number): Promise<void>;
64
91
  /**
65
92
  * Resolve which configured mailbox a call targets.
66
93
  * Resolution order:
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
@@ -144,6 +144,84 @@ export async function listConfigs(accountId) {
144
144
  await session.close();
145
145
  }
146
146
  }
147
+ /**
148
+ * Every configured IMAP mailbox across every account on the install, with its
149
+ * password resolved. An account whose password cannot be read is skipped (with
150
+ * a stderr note) rather than failing the whole enumeration, so one broken
151
+ * credential never stops the sampler from servicing the others.
152
+ */
153
+ export async function listAllImapAccounts() {
154
+ const session = getSession();
155
+ let propRows;
156
+ try {
157
+ const result = await session.run(`MATCH (e:EmailAccount) RETURN e ORDER BY e.accountId, e.email`);
158
+ propRows = result.records.map((r) => r.get("e").properties);
159
+ }
160
+ finally {
161
+ await session.close();
162
+ }
163
+ // Map + resolve the password per row, skipping any row that throws (a
164
+ // malformed node whose nodeToConfig fails, or a missing password) rather than
165
+ // letting one bad node blank the whole enumeration — the sampler runs
166
+ // unattended, so a single bad row must never stop it servicing the others.
167
+ const out = [];
168
+ for (const props of propRows) {
169
+ const accountId = props.accountId;
170
+ try {
171
+ const config = nodeToConfig(props);
172
+ out.push({ accountId, config, password: readPassword(config.email) });
173
+ }
174
+ catch (err) {
175
+ process.stderr.write(`[email-sampler] WARN skip account=${(accountId ?? "").slice(0, 8)} mailbox=${props.email ?? "?"} ` +
176
+ `reason=${err instanceof Error ? err.message : String(err)}\n`);
177
+ }
178
+ }
179
+ return out;
180
+ }
181
+ /**
182
+ * Read the sampler's cursor for one mailbox. Returns null when the node is
183
+ * absent or the sampler has never written a cursor for it — the caller treats
184
+ * that as "start from a fresh backfill".
185
+ */
186
+ export async function readSamplerCursor(accountId, email) {
187
+ const session = getSession();
188
+ try {
189
+ const result = await session.run(`MATCH (e:EmailAccount {accountId: $accountId, email: $email})
190
+ RETURN e.samplerCursorUid AS uid, e.samplerUidValidity AS v LIMIT 1`, { accountId, email });
191
+ if (result.records.length === 0)
192
+ return null;
193
+ const uid = result.records[0].get("uid");
194
+ if (uid === null || uid === undefined)
195
+ return null;
196
+ const v = result.records[0].get("v");
197
+ return {
198
+ cursorUid: neo4j.integer.toNumber(uid),
199
+ uidValidity: v === null || v === undefined ? null : neo4j.integer.toNumber(v),
200
+ };
201
+ }
202
+ finally {
203
+ await session.close();
204
+ }
205
+ }
206
+ /**
207
+ * Advance the sampler's cursor for one mailbox. Written only by the sampler,
208
+ * never touching `lastFetchedUid`. Integer-typed to match `lastFetchedUid`.
209
+ */
210
+ export async function advanceSamplerCursor(accountId, email, cursorUid, uidValidity) {
211
+ const session = getSession();
212
+ try {
213
+ await session.run(`MATCH (e:EmailAccount {accountId: $accountId, email: $email})
214
+ SET e.samplerCursorUid = $cursorUid, e.samplerUidValidity = $uidValidity`, {
215
+ accountId,
216
+ email,
217
+ cursorUid: neo4j.int(cursorUid),
218
+ uidValidity: neo4j.int(uidValidity),
219
+ });
220
+ }
221
+ finally {
222
+ await session.close();
223
+ }
224
+ }
147
225
  /**
148
226
  * The one line that makes an outbound mailbox choice attributable: which
149
227
  * address was picked, and which of the three routes picked it (Task 2194).
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sample-mailbox.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sample-mailbox.test.d.ts","sourceRoot":"","sources":["../../../src/sampler/__tests__/sample-mailbox.test.ts"],"names":[],"mappings":""}