@rubytech/create-maxy-code 0.1.576 → 0.1.578

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 (259) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/active-rules/dist/index.d.ts.map +1 -1
  3. package/payload/platform/lib/active-rules/dist/index.js +32 -1
  4. package/payload/platform/lib/active-rules/dist/index.js.map +1 -1
  5. package/payload/platform/lib/active-rules/src/index.test.ts +52 -3
  6. package/payload/platform/lib/active-rules/src/index.ts +36 -2
  7. package/payload/platform/lib/dispatch-read/dist/allocate.d.ts +57 -0
  8. package/payload/platform/lib/dispatch-read/dist/allocate.d.ts.map +1 -0
  9. package/payload/platform/lib/dispatch-read/dist/allocate.js +33 -0
  10. package/payload/platform/lib/dispatch-read/dist/allocate.js.map +1 -0
  11. package/payload/platform/lib/dispatch-read/dist/index.d.ts +2 -0
  12. package/payload/platform/lib/dispatch-read/dist/index.d.ts.map +1 -1
  13. package/payload/platform/lib/dispatch-read/dist/index.js +10 -1
  14. package/payload/platform/lib/dispatch-read/dist/index.js.map +1 -1
  15. package/payload/platform/lib/dispatch-read/src/__tests__/allocate.test.ts +41 -0
  16. package/payload/platform/lib/dispatch-read/src/allocate.ts +89 -0
  17. package/payload/platform/lib/dispatch-read/src/index.ts +14 -0
  18. package/payload/platform/lib/routine-templates/dist/index.d.ts +4 -4
  19. package/payload/platform/lib/routine-templates/dist/index.js +4 -4
  20. package/payload/platform/lib/routine-templates/src/index.ts +4 -4
  21. package/payload/platform/plugins/admin/hooks/__tests__/prompt-optimiser-compliance.test.sh +7 -2
  22. package/payload/platform/plugins/admin/hooks/prompt-optimiser-compliance.sh +8 -2
  23. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +4 -2
  24. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +17 -0
  25. package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-visit-status-write.test.ts +333 -22
  26. package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-visits-scope.test.ts +262 -0
  27. package/payload/platform/plugins/cloudflare/skills/data-portal/schema.sql +126 -21
  28. package/payload/platform/plugins/cloudflare/skills/data-portal/template/functions/api/visit-status.ts +142 -2
  29. package/payload/platform/plugins/cloudflare/skills/data-portal/template/functions/api/visits.ts +118 -6
  30. package/payload/platform/plugins/dispatch/PLUGIN.md +2 -0
  31. package/payload/platform/plugins/dispatch/mcp/dist/lib/allocate.d.ts +19 -50
  32. package/payload/platform/plugins/dispatch/mcp/dist/lib/allocate.d.ts.map +1 -1
  33. package/payload/platform/plugins/dispatch/mcp/dist/lib/allocate.js +1 -28
  34. package/payload/platform/plugins/dispatch/mcp/dist/lib/allocate.js.map +1 -1
  35. package/payload/platform/plugins/dispatch/skills/dispatch-page/SKILL.md +45 -6
  36. package/payload/platform/plugins/dispatch/skills/dispatch-page/template/planner.css +60 -0
  37. package/payload/platform/plugins/dispatch/skills/dispatch-page/template/planner.html +13 -0
  38. package/payload/platform/plugins/dispatch/skills/dispatch-page/template/planner.js +203 -5
  39. package/payload/platform/plugins/docs/references/internals.md +1 -1
  40. package/payload/platform/plugins/docs/references/platform.md +2 -0
  41. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +0 -2
  42. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
  43. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-path.test.d.ts +2 -0
  44. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-path.test.d.ts.map +1 -0
  45. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-path.test.js +19 -0
  46. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-path.test.js.map +1 -0
  47. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-register.test.d.ts +2 -0
  48. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-register.test.d.ts.map +1 -0
  49. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-register.test.js +110 -0
  50. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-register.test.js.map +1 -0
  51. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-verdict.test.d.ts +2 -0
  52. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-verdict.test.d.ts.map +1 -0
  53. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-verdict.test.js +22 -0
  54. package/payload/platform/plugins/telegram/mcp/dist/__tests__/webhook-verdict.test.js.map +1 -0
  55. package/payload/platform/plugins/telegram/mcp/dist/index.js +19 -163
  56. package/payload/platform/plugins/telegram/mcp/dist/index.js.map +1 -1
  57. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.d.ts +9 -0
  58. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.d.ts.map +1 -1
  59. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.js +11 -0
  60. package/payload/platform/plugins/telegram/mcp/dist/lib/account-write.js.map +1 -1
  61. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.d.ts +30 -3
  62. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.d.ts.map +1 -1
  63. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.js +29 -4
  64. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.js.map +1 -1
  65. package/payload/platform/plugins/telegram/mcp/dist/tools/webhook-register.d.ts +33 -0
  66. package/payload/platform/plugins/telegram/mcp/dist/tools/webhook-register.d.ts.map +1 -0
  67. package/payload/platform/plugins/telegram/mcp/dist/tools/webhook-register.js +145 -0
  68. package/payload/platform/plugins/telegram/mcp/dist/tools/webhook-register.js.map +1 -0
  69. package/payload/platform/plugins/telegram/skills/configure/SKILL.md +4 -2
  70. package/payload/platform/services/telegram-channel/dist/notification.d.ts +35 -3
  71. package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
  72. package/payload/platform/services/telegram-channel/dist/notification.js +38 -5
  73. package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
  74. package/payload/platform/services/telegram-channel/dist/server.js +1 -1
  75. package/payload/platform/services/telegram-channel/dist/server.js.map +1 -1
  76. package/payload/platform/services/webchat-channel/dist/notification.d.ts +2 -1
  77. package/payload/platform/services/webchat-channel/dist/notification.d.ts.map +1 -1
  78. package/payload/platform/services/webchat-channel/dist/notification.js.map +1 -1
  79. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +2 -2
  80. package/payload/platform/templates/agents/admin/IDENTITY.md +1 -1
  81. package/payload/server/public/activity.html +4 -4
  82. package/payload/server/public/agents.html +3 -3
  83. package/payload/server/public/assets/{AdminLoginScreens-BLGZEaKU.js → AdminLoginScreens-CAZ3DSwA.js} +1 -1
  84. package/payload/server/public/assets/AdminLoginScreens-CAZ3DSwA.js.br +0 -0
  85. package/payload/server/public/assets/AdminLoginScreens-CAZ3DSwA.js.gz +0 -0
  86. package/payload/server/public/assets/{AdminShell-C_M7YE5Z.js → AdminShell-BLs5v0qF.js} +1 -1
  87. package/payload/server/public/assets/AdminShell-BLs5v0qF.js.br +0 -0
  88. package/payload/server/public/assets/AdminShell-BLs5v0qF.js.gz +0 -0
  89. package/payload/server/public/assets/{activity-BL6qbB9a.js → activity-BwPck2yT.js} +1 -1
  90. package/payload/server/public/assets/activity-BwPck2yT.js.br +0 -0
  91. package/payload/server/public/assets/activity-BwPck2yT.js.gz +0 -0
  92. package/payload/server/public/assets/{admin-jnJ3P2u4.js → admin-DjtOoabA.js} +1 -1
  93. package/payload/server/public/assets/admin-DjtOoabA.js.br +0 -0
  94. package/payload/server/public/assets/admin-DjtOoabA.js.gz +0 -0
  95. package/payload/server/public/assets/{agents-BzhfKZDN.js → agents-IQYaRvoh.js} +1 -1
  96. package/payload/server/public/assets/agents-IQYaRvoh.js.br +0 -0
  97. package/payload/server/public/assets/agents-IQYaRvoh.js.gz +0 -0
  98. package/payload/server/public/assets/{browser-C-6io2B9.js → browser-CPG8w8rQ.js} +1 -1
  99. package/payload/server/public/assets/browser-CPG8w8rQ.js.br +0 -0
  100. package/payload/server/public/assets/browser-CPG8w8rQ.js.gz +0 -0
  101. package/payload/server/public/assets/{calendar-Dt3gS88s.js → calendar-CRwrgNdq.js} +1 -1
  102. package/payload/server/public/assets/calendar-CRwrgNdq.js.br +0 -0
  103. package/payload/server/public/assets/calendar-CRwrgNdq.js.gz +0 -0
  104. package/payload/server/public/assets/chat-B7yZ4KLl.js +1 -0
  105. package/payload/server/public/assets/chat-B7yZ4KLl.js.br +3 -0
  106. package/payload/server/public/assets/chat-B7yZ4KLl.js.gz +0 -0
  107. package/payload/server/public/assets/chevron-left-BzKUQqLy.js +1 -0
  108. package/payload/server/public/assets/chevron-left-BzKUQqLy.js.br +0 -0
  109. package/payload/server/public/assets/clock-BafWFNGo.js +1 -0
  110. package/payload/server/public/assets/clock-BafWFNGo.js.br +0 -0
  111. package/payload/server/public/assets/{copy-TkPJgllS.js → copy-JyiMTV0k.js} +1 -1
  112. package/payload/server/public/assets/copy-JyiMTV0k.js.br +0 -0
  113. package/payload/server/public/assets/copy-JyiMTV0k.js.gz +0 -0
  114. package/payload/server/public/assets/data-DHtGCVrl.js +1 -0
  115. package/payload/server/public/assets/data-DHtGCVrl.js.br +0 -0
  116. package/payload/server/public/assets/data-DHtGCVrl.js.gz +0 -0
  117. package/payload/server/public/assets/{file-text-DyAL2DCh.js → file-text-cnHv9ZS6.js} +1 -1
  118. package/payload/server/public/assets/file-text-cnHv9ZS6.js.br +0 -0
  119. package/payload/server/public/assets/file-text-cnHv9ZS6.js.gz +0 -0
  120. package/payload/server/public/assets/{graph-PiNIcCfX.js → graph-lFwEUDSH.js} +1 -1
  121. package/payload/server/public/assets/graph-lFwEUDSH.js.br +0 -0
  122. package/payload/server/public/assets/graph-lFwEUDSH.js.gz +0 -0
  123. package/payload/server/public/assets/{graph-labels-8jKFrLHn.js → graph-labels-C6qUA0vO.js} +1 -1
  124. package/payload/server/public/assets/graph-labels-C6qUA0vO.js.br +0 -0
  125. package/payload/server/public/assets/graph-labels-C6qUA0vO.js.gz +0 -0
  126. package/payload/server/public/assets/{operator-DKGKGzrb.js → operator-BdoEy5mh.js} +1 -1
  127. package/payload/server/public/assets/operator-BdoEy5mh.js.br +0 -0
  128. package/payload/server/public/assets/operator-BdoEy5mh.js.gz +0 -0
  129. package/payload/server/public/assets/{page-DXz_K10G.js → page-DMrnnXNA.js} +1 -1
  130. package/payload/server/public/assets/page-DMrnnXNA.js.br +0 -0
  131. package/payload/server/public/assets/page-DMrnnXNA.js.gz +0 -0
  132. package/payload/server/public/assets/{page-BU5vlY9Y.js → page-DeMikGYL.js} +1 -1
  133. package/payload/server/public/assets/page-DeMikGYL.js.br +0 -0
  134. package/payload/server/public/assets/page-DeMikGYL.js.gz +0 -0
  135. package/payload/server/public/assets/play-D6OAQVJ_.js +1 -0
  136. package/payload/server/public/assets/play-D6OAQVJ_.js.br +0 -0
  137. package/payload/server/public/assets/play-D6OAQVJ_.js.gz +0 -0
  138. package/payload/server/public/assets/{public-BmA3-jLj.js → public-B-X1Cxfw.js} +1 -1
  139. package/payload/server/public/assets/public-B-X1Cxfw.js.br +0 -0
  140. package/payload/server/public/assets/public-B-X1Cxfw.js.gz +0 -0
  141. package/payload/server/public/assets/{rotate-ccw-fCH0LSMq.js → rotate-ccw-DVFvQAHG.js} +1 -1
  142. package/payload/server/public/assets/rotate-ccw-DVFvQAHG.js.br +0 -0
  143. package/payload/server/public/assets/rotate-ccw-DVFvQAHG.js.gz +0 -0
  144. package/payload/server/public/assets/{routines-BeFrmkls.js → routines-CgkkGJaS.js} +1 -1
  145. package/payload/server/public/assets/routines-CgkkGJaS.js.br +0 -0
  146. package/payload/server/public/assets/routines-CgkkGJaS.js.gz +0 -0
  147. package/payload/server/public/assets/{skills-mjls5HBa.js → skills-CW7gVcaG.js} +1 -1
  148. package/payload/server/public/assets/skills-CW7gVcaG.js.br +0 -0
  149. package/payload/server/public/assets/skills-CW7gVcaG.js.gz +0 -0
  150. package/payload/server/public/assets/{tasks-p6puHHD0.js → tasks-Ddjp0Rwh.js} +1 -1
  151. package/payload/server/public/assets/tasks-Ddjp0Rwh.js.br +0 -0
  152. package/payload/server/public/assets/tasks-Ddjp0Rwh.js.gz +0 -0
  153. package/payload/server/public/assets/{triangle-alert-CrZ1ewbd.js → triangle-alert-DUrUutX4.js} +1 -1
  154. package/payload/server/public/assets/triangle-alert-DUrUutX4.js.br +0 -0
  155. package/payload/server/public/assets/triangle-alert-DUrUutX4.js.gz +0 -0
  156. package/payload/server/public/assets/{useCopyFeedback-zOQNrIwd.js → useCopyFeedback-ClVINDrQ.js} +1 -1
  157. package/payload/server/public/assets/useCopyFeedback-ClVINDrQ.js.br +0 -0
  158. package/payload/server/public/assets/useCopyFeedback-ClVINDrQ.js.gz +0 -0
  159. package/payload/server/public/assets/{useMediaQuery-BmG090FR.js → useMediaQuery-BUFkZYRs.js} +1 -1
  160. package/payload/server/public/assets/useMediaQuery-BUFkZYRs.js.br +0 -0
  161. package/payload/server/public/assets/{useMediaQuery-BmG090FR.js.gz → useMediaQuery-BUFkZYRs.js.gz} +0 -0
  162. package/payload/server/public/assets/{useVoiceRecorder-9pf6FFJ-.js → useVoiceRecorder-DnyqQFet.js} +1 -1
  163. package/payload/server/public/assets/useVoiceRecorder-DnyqQFet.js.br +0 -0
  164. package/payload/server/public/assets/useVoiceRecorder-DnyqQFet.js.gz +0 -0
  165. package/payload/server/public/assets/{wrench-k4GYG5rc.js → wrench-BW28s_d0.js} +1 -1
  166. package/payload/server/public/assets/wrench-BW28s_d0.js.br +0 -0
  167. package/payload/server/public/assets/wrench-BW28s_d0.js.gz +0 -0
  168. package/payload/server/public/browser.html +3 -3
  169. package/payload/server/public/calendar.html +6 -6
  170. package/payload/server/public/chat.html +12 -12
  171. package/payload/server/public/data.html +10 -10
  172. package/payload/server/public/graph.html +8 -8
  173. package/payload/server/public/index.html +12 -12
  174. package/payload/server/public/operator.html +13 -13
  175. package/payload/server/public/public.html +12 -12
  176. package/payload/server/public/routines.html +6 -6
  177. package/payload/server/public/skills.html +4 -4
  178. package/payload/server/public/tasks.html +5 -5
  179. package/payload/server/server.js +1014 -375
  180. package/payload/platform/plugins/dispatch/mcp/dist/scripts/converge-visit-instants.d.ts +0 -6
  181. package/payload/platform/plugins/dispatch/mcp/dist/scripts/converge-visit-instants.d.ts.map +0 -1
  182. package/payload/platform/plugins/dispatch/mcp/dist/scripts/converge-visit-instants.js +0 -102
  183. package/payload/platform/plugins/dispatch/mcp/dist/scripts/converge-visit-instants.js.map +0 -1
  184. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-routine-description.test.d.ts +0 -2
  185. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-routine-description.test.d.ts.map +0 -1
  186. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-routine-description.test.js +0 -87
  187. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-routine-description.test.js.map +0 -1
  188. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-startdate-utc.test.d.ts +0 -2
  189. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-startdate-utc.test.d.ts.map +0 -1
  190. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-startdate-utc.test.js +0 -79
  191. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-startdate-utc.test.js.map +0 -1
  192. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-routine-description.d.ts +0 -35
  193. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-routine-description.d.ts.map +0 -1
  194. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-routine-description.js +0 -56
  195. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-routine-description.js.map +0 -1
  196. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.d.ts +0 -24
  197. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.d.ts.map +0 -1
  198. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.js +0 -87
  199. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.js.map +0 -1
  200. package/payload/server/public/assets/AdminLoginScreens-BLGZEaKU.js.br +0 -0
  201. package/payload/server/public/assets/AdminLoginScreens-BLGZEaKU.js.gz +0 -0
  202. package/payload/server/public/assets/AdminShell-C_M7YE5Z.js.br +0 -0
  203. package/payload/server/public/assets/AdminShell-C_M7YE5Z.js.gz +0 -0
  204. package/payload/server/public/assets/activity-BL6qbB9a.js.br +0 -0
  205. package/payload/server/public/assets/activity-BL6qbB9a.js.gz +0 -0
  206. package/payload/server/public/assets/admin-jnJ3P2u4.js.br +0 -0
  207. package/payload/server/public/assets/admin-jnJ3P2u4.js.gz +0 -0
  208. package/payload/server/public/assets/agents-BzhfKZDN.js.br +0 -0
  209. package/payload/server/public/assets/agents-BzhfKZDN.js.gz +0 -0
  210. package/payload/server/public/assets/browser-C-6io2B9.js.br +0 -0
  211. package/payload/server/public/assets/browser-C-6io2B9.js.gz +0 -0
  212. package/payload/server/public/assets/calendar-Dt3gS88s.js.br +0 -0
  213. package/payload/server/public/assets/calendar-Dt3gS88s.js.gz +0 -0
  214. package/payload/server/public/assets/chat-IUOvVkL-.js +0 -1
  215. package/payload/server/public/assets/chat-IUOvVkL-.js.br +0 -1
  216. package/payload/server/public/assets/chat-IUOvVkL-.js.gz +0 -0
  217. package/payload/server/public/assets/chevron-left-DSzR9zR7.js +0 -1
  218. package/payload/server/public/assets/chevron-left-DSzR9zR7.js.br +0 -0
  219. package/payload/server/public/assets/clock-C5xE5p2I.js +0 -1
  220. package/payload/server/public/assets/clock-C5xE5p2I.js.br +0 -0
  221. package/payload/server/public/assets/copy-TkPJgllS.js.br +0 -0
  222. package/payload/server/public/assets/copy-TkPJgllS.js.gz +0 -0
  223. package/payload/server/public/assets/data-Bhv0Pvfl.js +0 -1
  224. package/payload/server/public/assets/data-Bhv0Pvfl.js.br +0 -0
  225. package/payload/server/public/assets/data-Bhv0Pvfl.js.gz +0 -0
  226. package/payload/server/public/assets/file-text-DyAL2DCh.js.br +0 -0
  227. package/payload/server/public/assets/file-text-DyAL2DCh.js.gz +0 -0
  228. package/payload/server/public/assets/graph-PiNIcCfX.js.br +0 -0
  229. package/payload/server/public/assets/graph-PiNIcCfX.js.gz +0 -0
  230. package/payload/server/public/assets/graph-labels-8jKFrLHn.js.br +0 -0
  231. package/payload/server/public/assets/graph-labels-8jKFrLHn.js.gz +0 -0
  232. package/payload/server/public/assets/operator-DKGKGzrb.js.br +0 -0
  233. package/payload/server/public/assets/operator-DKGKGzrb.js.gz +0 -0
  234. package/payload/server/public/assets/page-BU5vlY9Y.js.br +0 -0
  235. package/payload/server/public/assets/page-BU5vlY9Y.js.gz +0 -0
  236. package/payload/server/public/assets/page-DXz_K10G.js.br +0 -0
  237. package/payload/server/public/assets/page-DXz_K10G.js.gz +0 -0
  238. package/payload/server/public/assets/play-CmSyYrB6.js +0 -1
  239. package/payload/server/public/assets/play-CmSyYrB6.js.br +0 -0
  240. package/payload/server/public/assets/play-CmSyYrB6.js.gz +0 -0
  241. package/payload/server/public/assets/public-BmA3-jLj.js.br +0 -0
  242. package/payload/server/public/assets/public-BmA3-jLj.js.gz +0 -0
  243. package/payload/server/public/assets/rotate-ccw-fCH0LSMq.js.br +0 -0
  244. package/payload/server/public/assets/rotate-ccw-fCH0LSMq.js.gz +0 -0
  245. package/payload/server/public/assets/routines-BeFrmkls.js.br +0 -0
  246. package/payload/server/public/assets/routines-BeFrmkls.js.gz +0 -0
  247. package/payload/server/public/assets/skills-mjls5HBa.js.br +0 -0
  248. package/payload/server/public/assets/skills-mjls5HBa.js.gz +0 -0
  249. package/payload/server/public/assets/tasks-p6puHHD0.js.br +0 -0
  250. package/payload/server/public/assets/tasks-p6puHHD0.js.gz +0 -0
  251. package/payload/server/public/assets/triangle-alert-CrZ1ewbd.js.br +0 -0
  252. package/payload/server/public/assets/triangle-alert-CrZ1ewbd.js.gz +0 -0
  253. package/payload/server/public/assets/useCopyFeedback-zOQNrIwd.js.br +0 -0
  254. package/payload/server/public/assets/useCopyFeedback-zOQNrIwd.js.gz +0 -0
  255. package/payload/server/public/assets/useMediaQuery-BmG090FR.js.br +0 -0
  256. package/payload/server/public/assets/useVoiceRecorder-9pf6FFJ-.js.br +0 -0
  257. package/payload/server/public/assets/useVoiceRecorder-9pf6FFJ-.js.gz +0 -0
  258. package/payload/server/public/assets/wrench-k4GYG5rc.js.br +0 -0
  259. package/payload/server/public/assets/wrench-k4GYG5rc.js.gz +0 -0
@@ -1,6 +0,0 @@
1
- export declare function convergeVisitInstants(accountIds: string[]): Promise<{
2
- scanned: number;
3
- rewritten: number;
4
- unparseable: number;
5
- }>;
6
- //# sourceMappingURL=converge-visit-instants.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"converge-visit-instants.d.ts","sourceRoot":"","sources":["../../src/scripts/converge-visit-instants.ts"],"names":[],"mappings":"AAqCA,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAqEtE"}
@@ -1,102 +0,0 @@
1
- /**
2
- * Task 2513 — one-shot convergence of `:Visit.startDate` and `:Visit.endDate`
3
- * onto canonical UTC.
4
- *
5
- * Run by the installer immediately after `seed-neo4j.sh`, beside Task 2213's
6
- * `:Event` convergence. It is an installer step, not a
7
- * `platform/scripts/backfill-*`, because nothing invokes anything in that
8
- * directory: those run only when an operator SSHes in, which leaves the rows
9
- * wrong on every box nobody visits. The shape follows Task 1623's
10
- * `converge-client-admins.ts` — "reaching all installs and brands without a
11
- * per-box script".
12
- *
13
- * It needs no connection code of its own. `dispatch-read`'s `withSession`
14
- * already refuses to default `NEO4J_URI`, which is what keeps a co-resident
15
- * brand's graph untouched, and resolves the password from `PLATFORM_ROOT`.
16
- *
17
- * It imports the same `normaliseInstant` the writer uses, so the migration and
18
- * the writer cannot disagree about what canonical means.
19
- *
20
- * PLATFORM_ROOT=... NEO4J_URI=... node dist/scripts/converge-visit-instants.js
21
- */
22
- import { resolve } from "node:path";
23
- import { isCanonicalInstant, normaliseInstant, } from "../../../../../lib/canonical-instant/dist/index.js";
24
- import { resolveAccountZone, withSession } from "../../../../../lib/dispatch-read/dist/index.js";
25
- import { enumerateValidAccountIds } from "../../../../../lib/account-enumeration/dist/index.js";
26
- const TAG = "[dispatch]";
27
- export async function convergeVisitInstants(accountIds) {
28
- let scanned = 0;
29
- let rewritten = 0;
30
- let unparseable = 0;
31
- for (const accountId of accountIds) {
32
- const zone = await resolveAccountZone(accountId);
33
- const rows = await withSession(async (session) => {
34
- const r = await session.run(`MATCH (v:Visit {accountId: $accountId})
35
- RETURN v.visitId AS visitId, v.startDate AS startDate, v.endDate AS endDate`, { accountId });
36
- return r.records.map((g) => ({
37
- visitId: String(g.get("visitId")),
38
- startDate: g.get("startDate") ?? null,
39
- endDate: g.get("endDate") ?? null,
40
- }));
41
- });
42
- for (const row of rows) {
43
- scanned++;
44
- // A NULL instant is not a defect: a visit can carry no end. Only a stored
45
- // value that is not canonical is in scope.
46
- const needsStart = row.startDate !== null && !isCanonicalInstant(row.startDate);
47
- const needsEnd = row.endDate !== null && !isCanonicalInstant(row.endDate);
48
- if (!needsStart && !needsEnd)
49
- continue;
50
- let startOut = row.startDate;
51
- let endOut = row.endDate;
52
- try {
53
- if (needsStart)
54
- startOut = normaliseInstant(row.startDate, zone);
55
- if (needsEnd)
56
- endOut = normaliseInstant(row.endDate, zone);
57
- }
58
- catch (err) {
59
- // Counted apart from `rewritten`, always. A row nobody could fix must
60
- // never be reported as fixed.
61
- unparseable++;
62
- console.error(`${TAG} op=migration-refused visitId=${row.visitId} account=${accountId} ` +
63
- `startIn=${row.startDate ?? "-"} endIn=${row.endDate ?? "-"} tz=${zone ?? "none"} ` +
64
- `detail=${err instanceof Error ? err.message : String(err)}`);
65
- continue;
66
- }
67
- await withSession(async (session) => {
68
- await session.run(`MATCH (v:Visit {accountId: $accountId, visitId: $visitId})
69
- SET v.startDate = $startDate, v.endDate = $endDate`, { accountId, visitId: row.visitId, startDate: startOut, endDate: endOut });
70
- });
71
- rewritten++;
72
- console.error(`${TAG} op=rewrite visitId=${row.visitId} account=${accountId} ` +
73
- `startIn=${row.startDate ?? "-"} startOut=${startOut ?? "-"} ` +
74
- `endIn=${row.endDate ?? "-"} endOut=${endOut ?? "-"} tz=${zone ?? "none"}`);
75
- }
76
- }
77
- // Printed even when nothing changed. A run that says nothing is
78
- // indistinguishable from a run that never happened.
79
- console.error(`${TAG} op=start-migration scanned=${scanned} rewritten=${rewritten} unparseable=${unparseable}`);
80
- return { scanned, rewritten, unparseable };
81
- }
82
- async function main() {
83
- // The accounts directory is derived from PLATFORM_ROOT, which is what the
84
- // installer exports. `getAccountsDirFromEnv` is NOT used: it reads
85
- // MAXY_PLATFORM_ROOT and loud-throws when unset, so calling it here would
86
- // abort the migration on every install. Same resolution as
87
- // `listLocalAccountIds` in the scheduling plugin's dispatcher-env.
88
- const root = process.env.PLATFORM_ROOT;
89
- if (!root) {
90
- throw new Error("PLATFORM_ROOT environment variable is required");
91
- }
92
- await convergeVisitInstants(enumerateValidAccountIds(resolve(root, "..", "data/accounts")));
93
- }
94
- // Entry point only when executed directly, so the test can import the function
95
- // without running a migration.
96
- if (process.argv[1] && process.argv[1].endsWith("converge-visit-instants.js")) {
97
- main().catch((err) => {
98
- console.error(`${TAG} op=migration-fatal detail=${err instanceof Error ? err.message : String(err)}`);
99
- process.exit(1);
100
- });
101
- }
102
- //# sourceMappingURL=converge-visit-instants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"converge-visit-instants.js","sourceRoot":"","sources":["../../src/scripts/converge-visit-instants.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=converge-routine-description.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"converge-routine-description.test.d.ts","sourceRoot":"","sources":["../../../src/scripts/__tests__/converge-routine-description.test.ts"],"names":[],"mappings":""}
@@ -1,87 +0,0 @@
1
- // @vitest-environment node
2
- // Task 2361. The convergence must prefer a description the operator or the agent
3
- // wrote over the template's, must remove the old property, and must report zero
4
- // on a second run — a migration that cannot say "nothing left to do" is
5
- // indistinguishable from one that never ran.
6
- import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
7
- import { convergeRoutineDescriptions } from "../converge-routine-description.js";
8
- const ACCT = "aaaaaaaa-1111-4111-8111-111111111111";
9
- /** A driver over an in-memory row set. One statement both writes and removes, so
10
- * the fake applies the coalesce and the REMOVE itself and returns the count the
11
- * real statement returns. */
12
- function fakeDriver(rows, capture) {
13
- return {
14
- session: () => ({
15
- run: vi.fn(async (cypher) => {
16
- capture?.cypher.push(String(cypher));
17
- const touched = rows.filter((r) => r.routineDescription !== null);
18
- for (const r of touched) {
19
- r.description = r.description ?? r.routineDescription;
20
- r.routineDescription = null;
21
- }
22
- return { records: [{ get: () => touched.length }] };
23
- }),
24
- close: vi.fn(async () => { }),
25
- }),
26
- };
27
- }
28
- let errSpy;
29
- function lines() {
30
- return errSpy.mock.calls.map((c) => String(c[0]));
31
- }
32
- beforeEach(() => {
33
- errSpy = vi.spyOn(console, "error").mockImplementation(() => { });
34
- });
35
- afterEach(() => {
36
- errSpy.mockRestore();
37
- });
38
- describe("convergeRoutineDescriptions", () => {
39
- it("keeps an operator-written description and takes the template's where there is none", async () => {
40
- const rows = [
41
- {
42
- eventId: "e-operator",
43
- description: "The operator's own words.",
44
- routineDescription: "Template words.",
45
- },
46
- { eventId: "e-template", description: null, routineDescription: "Template words." },
47
- { eventId: "e-neither", description: null, routineDescription: null },
48
- ];
49
- const r = await convergeRoutineDescriptions(fakeDriver(rows), [ACCT]);
50
- expect(rows.find((x) => x.eventId === "e-operator").description).toBe("The operator's own words.");
51
- expect(rows.find((x) => x.eventId === "e-template").description).toBe("Template words.");
52
- expect(rows.find((x) => x.eventId === "e-neither").description).toBeNull();
53
- expect(rows.every((x) => x.routineDescription === null)).toBe(true);
54
- expect(r.converged).toBe(2);
55
- });
56
- it("uses coalesce so the precedence is in the statement, not in a loop", async () => {
57
- // The precedence is the whole point of the migration, and a per-row loop
58
- // could get it right for the rows the test happens to supply while the
59
- // statement got it wrong. Assert the statement.
60
- const capture = { cypher: [] };
61
- await convergeRoutineDescriptions(fakeDriver([], capture), [ACCT]);
62
- expect(capture.cypher[0]).toContain("SET e.description = coalesce(e.description, e.routineDescription)");
63
- expect(capture.cypher[0]).toContain("REMOVE e.routineDescription");
64
- expect(capture.cypher[0]).toContain("e.accountId IN $localAccountIds");
65
- });
66
- it("reports zero on a second run and writes nothing", async () => {
67
- const rows = [
68
- { eventId: "e-done", description: "Already here.", routineDescription: null },
69
- ];
70
- expect((await convergeRoutineDescriptions(fakeDriver(rows), [ACCT])).converged).toBe(0);
71
- expect(rows[0].description).toBe("Already here.");
72
- });
73
- it("is a no-op with no local accounts, so a shared Neo4j is never swept", async () => {
74
- const rows = [{ eventId: "e-foreign", description: null, routineDescription: "Theirs." }];
75
- expect((await convergeRoutineDescriptions(fakeDriver(rows), [])).converged).toBe(0);
76
- expect(rows[0].routineDescription).toBe("Theirs.");
77
- });
78
- it("prints op=done even when it converged nothing", async () => {
79
- await convergeRoutineDescriptions(fakeDriver([]), [ACCT]);
80
- expect(lines()).toContain("[converge-routine-description] op=done converged=0");
81
- });
82
- it("prints op=done with a reason when there are no local accounts", async () => {
83
- await convergeRoutineDescriptions(fakeDriver([]), []);
84
- expect(lines()).toContain("[converge-routine-description] op=done converged=0 reason=no-local-accounts");
85
- });
86
- });
87
- //# sourceMappingURL=converge-routine-description.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"converge-routine-description.test.js","sourceRoot":"","sources":["../../../src/scripts/__tests__/converge-routine-description.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=converge-startdate-utc.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"converge-startdate-utc.test.d.ts","sourceRoot":"","sources":["../../../src/scripts/__tests__/converge-startdate-utc.test.ts"],"names":[],"mappings":""}
@@ -1,79 +0,0 @@
1
- // Task 2213. The migration must be idempotent and must never guess a zone.
2
- import { describe, it, expect, vi } from "vitest";
3
- import { convergeStartDates } from "../converge-startdate-utc.js";
4
- const ACCT = "acct-2213-aaaa";
5
- /** A driver over an in-memory row set; SET writes mutate the rows. */
6
- function fakeDriver(rows) {
7
- return {
8
- session: () => ({
9
- run: vi.fn(async (cypher, params) => {
10
- if (String(cypher).includes("SET e.startDate")) {
11
- const row = rows.find((r) => r.eventId === params.eventId);
12
- if (row)
13
- row.startDate = params.startDate;
14
- return { records: [] };
15
- }
16
- return {
17
- records: rows
18
- .filter((r) => r.startDate !== null)
19
- .map((r) => ({ get: (k) => r[k] })),
20
- };
21
- }),
22
- close: vi.fn(async () => { }),
23
- }),
24
- };
25
- }
26
- describe("convergeStartDates", () => {
27
- it("rewrites every non-canonical form and leaves canonical and null alone", async () => {
28
- const rows = [
29
- { eventId: "e-offset", startDate: "2026-07-06T09:50:00+01:00", timezone: "Europe/London" },
30
- { eventId: "e-zoneless", startDate: "2026-07-20T09:00:00", timezone: "Europe/London" },
31
- {
32
- eventId: "e-ms-offset",
33
- startDate: "2026-08-02T19:00:00.000+01:00",
34
- timezone: "Europe/London",
35
- },
36
- { eventId: "e-canonical", startDate: "2026-06-28T05:00:00.000Z", timezone: "UTC" },
37
- { eventId: "e-null", startDate: null, timezone: "Europe/London" },
38
- ];
39
- const r = await convergeStartDates(fakeDriver(rows), [ACCT]);
40
- expect(rows.find((x) => x.eventId === "e-offset").startDate).toBe("2026-07-06T08:50:00.000Z");
41
- expect(rows.find((x) => x.eventId === "e-zoneless").startDate).toBe("2026-07-20T08:00:00.000Z");
42
- expect(rows.find((x) => x.eventId === "e-ms-offset").startDate).toBe("2026-08-02T18:00:00.000Z");
43
- expect(rows.find((x) => x.eventId === "e-canonical").startDate).toBe("2026-06-28T05:00:00.000Z");
44
- expect(rows.find((x) => x.eventId === "e-null").startDate).toBeNull();
45
- expect(r.rewritten).toBe(3);
46
- });
47
- it("is idempotent — a second run rewrites nothing", async () => {
48
- const rows = [
49
- { eventId: "e-offset", startDate: "2026-07-06T09:50:00+01:00", timezone: "Europe/London" },
50
- ];
51
- const driver = fakeDriver(rows);
52
- await convergeStartDates(driver, [ACCT]);
53
- const second = await convergeStartDates(driver, [ACCT]);
54
- expect(second.rewritten).toBe(0);
55
- expect(rows[0].startDate).toBe("2026-07-06T08:50:00.000Z");
56
- });
57
- it("refuses a zoneless row with no timezone instead of guessing", async () => {
58
- const rows = [
59
- { eventId: "e-nozone", startDate: "2026-07-20T09:00:00", timezone: null },
60
- ];
61
- const err = vi.spyOn(console, "error").mockImplementation(() => { });
62
- const r = await convergeStartDates(fakeDriver(rows), [ACCT]);
63
- expect(r.refused).toBe(1);
64
- expect(rows[0].startDate).toBe("2026-07-20T09:00:00");
65
- expect(err.mock.calls.map(String).some((l) => l.includes("op=refuse") && l.includes("e-nozone"))).toBe(true);
66
- err.mockRestore();
67
- });
68
- it("prints a summary even when it changes nothing", async () => {
69
- const err = vi.spyOn(console, "error").mockImplementation(() => { });
70
- await convergeStartDates(fakeDriver([]), [ACCT]);
71
- expect(err.mock.calls.map(String).some((l) => l.includes("op=done") && l.includes("rewritten=0"))).toBe(true);
72
- err.mockRestore();
73
- });
74
- it("is a no-op with no local accounts", async () => {
75
- const r = await convergeStartDates({ session: vi.fn() }, []);
76
- expect(r).toEqual({ scanned: 0, rewritten: 0, refused: 0 });
77
- });
78
- });
79
- //# sourceMappingURL=converge-startdate-utc.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"converge-startdate-utc.test.js","sourceRoot":"","sources":["../../../src/scripts/__tests__/converge-startdate-utc.test.ts"],"names":[],"mappings":"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"}
@@ -1,35 +0,0 @@
1
- /**
2
- * Task 2361 — one-shot convergence of the routine caption onto
3
- * `:Event.description`.
4
- *
5
- * Two properties held a routine's description and neither reached both a writer
6
- * and a reader. `routineDescription` was written only by the roster seed and
7
- * drawn only on the routines card, and the PATCH route refused it, so no
8
- * operator could ever write one. `description` was written only by
9
- * `schedule-event` and `schedule-update`, fed the row's search embedding, and
10
- * reached no routines surface at all. `description` survives, because the
11
- * operator and the agent can both write it and the calendar route already reads
12
- * it.
13
- *
14
- * `coalesce` is the whole point: where a row carries both, the one the operator
15
- * or the agent wrote wins over the template's. Expressing the precedence in the
16
- * statement rather than in a per-row loop is deliberate — there is no decision to
17
- * make per row, and a loop would be a second place for the rule to be wrong.
18
- *
19
- * Run by the installer immediately after `seed-neo4j.sh`, with the same
20
- * NEO4J_URI / NEO4J_PASSWORD env that step already builds. It is an installer
21
- * step, not a script under `platform/scripts`, for the reason the sibling
22
- * `converge-startdate-utc.ts` records: nothing invokes anything in that
23
- * directory except an operator over SSH, which leaves the rows wrong on every
24
- * box nobody visits.
25
- *
26
- * Scoped to this install's accounts, so a co-resident brand sharing one Neo4j is
27
- * never touched.
28
- *
29
- * PLATFORM_ROOT=... NEO4J_URI=... node dist/scripts/converge-routine-description.js
30
- */
31
- import type { Driver } from "neo4j-driver";
32
- export declare function convergeRoutineDescriptions(driver: Driver, localAccountIds: string[]): Promise<{
33
- converged: number;
34
- }>;
35
- //# sourceMappingURL=converge-routine-description.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"converge-routine-description.d.ts","sourceRoot":"","sources":["../../src/scripts/converge-routine-description.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAuChC"}
@@ -1,56 +0,0 @@
1
- import { connectNeo4j, listLocalAccountIds } from "../lib/dispatcher-env.js";
2
- export async function convergeRoutineDescriptions(driver, localAccountIds) {
3
- if (localAccountIds.length === 0) {
4
- // Printed even here. An install that resolved no accounts must not look the
5
- // same as one where the convergence never ran, and the reason is what tells
6
- // the two apart.
7
- console.error("[converge-routine-description] op=done converged=0 reason=no-local-accounts");
8
- return { converged: 0 };
9
- }
10
- const session = driver.session();
11
- let converged = 0;
12
- try {
13
- const res = await session.run(`MATCH (e:Event)
14
- WHERE e.accountId IN $localAccountIds AND e.routineDescription IS NOT NULL
15
- SET e.description = coalesce(e.description, e.routineDescription)
16
- REMOVE e.routineDescription
17
- RETURN count(e) AS converged`, { localAccountIds });
18
- const raw = res.records[0]?.get("converged");
19
- converged =
20
- typeof raw === "number"
21
- ? raw
22
- : raw && typeof raw.toNumber === "function"
23
- ? raw.toNumber()
24
- : Number(raw ?? 0);
25
- }
26
- finally {
27
- try {
28
- await session.close();
29
- }
30
- catch {
31
- // ignore
32
- }
33
- }
34
- // Printed even when nothing changed. A run that says nothing is
35
- // indistinguishable from a run that never happened.
36
- console.error(`[converge-routine-description] op=done converged=${converged}`);
37
- return { converged };
38
- }
39
- async function main() {
40
- const driver = connectNeo4j("converge-routine-description");
41
- try {
42
- await convergeRoutineDescriptions(driver, listLocalAccountIds(process.env.PLATFORM_ROOT));
43
- }
44
- finally {
45
- await driver.close();
46
- }
47
- }
48
- // Entry point only when executed directly, so the test can import the function
49
- // without running a migration.
50
- if (process.argv[1] && process.argv[1].endsWith("converge-routine-description.js")) {
51
- main().catch((err) => {
52
- console.error(`[converge-routine-description] op=fatal detail=${err instanceof Error ? err.message : String(err)}`);
53
- process.exit(1);
54
- });
55
- }
56
- //# sourceMappingURL=converge-routine-description.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"converge-routine-description.js","sourceRoot":"","sources":["../../src/scripts/converge-routine-description.ts"],"names":[],"mappings":"AA+BA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE7E,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,MAAc,EACd,eAAyB;IAEzB,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,4EAA4E;QAC5E,4EAA4E;QAC5E,iBAAiB;QACjB,OAAO,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAC;QAC7F,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3B;;;;oCAI8B,EAC9B,EAAE,eAAe,EAAE,CACpB,CAAC;QACF,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7C,SAAS;YACP,OAAO,GAAG,KAAK,QAAQ;gBACrB,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC,GAAG,IAAI,OAAQ,GAAmC,CAAC,QAAQ,KAAK,UAAU;oBAC1E,CAAC,CAAE,GAAkC,CAAC,QAAQ,EAAE;oBAChD,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,oDAAoD;IACpD,OAAO,CAAC,KAAK,CAAC,oDAAoD,SAAS,EAAE,CAAC,CAAC;IAC/E,OAAO,EAAE,SAAS,EAAE,CAAC;AACvB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,2BAA2B,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,aAAc,CAAC,CAAC,CAAC;IAC7F,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,+BAA+B;AAC/B,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,CAAC;IACnF,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,OAAO,CAAC,KAAK,CACX,kDAAkD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACrG,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,24 +0,0 @@
1
- /**
2
- * Task 2213 — one-shot convergence of `:Event.startDate` onto canonical UTC.
3
- *
4
- * Run by the installer immediately after `seed-neo4j.sh`, with the same
5
- * NEO4J_URI / NEO4J_PASSWORD env that step already builds. It is an installer
6
- * step, not a `platform/scripts/backfill-*.sh`, because nothing invokes anything
7
- * in that directory: `backfill-bypass-permissions.sh`, `backfill-task-ids.sh`
8
- * and `migrate-whatsapp-to-disk.mjs` all run only when an operator SSHes in,
9
- * which leaves the rows wrong on every box nobody visits. The shape follows Task
10
- * 1623's `converge-client-admins.ts` — "reaching all installs and brands without
11
- * a per-box script".
12
- *
13
- * It imports the same `normaliseInstant` the two writers use, so the migration
14
- * and the writers cannot disagree about what canonical means.
15
- *
16
- * PLATFORM_ROOT=... NEO4J_URI=... node dist/scripts/converge-startdate-utc.js
17
- */
18
- import type { Driver } from "neo4j-driver";
19
- export declare function convergeStartDates(driver: Driver, localAccountIds: string[]): Promise<{
20
- scanned: number;
21
- rewritten: number;
22
- refused: number;
23
- }>;
24
- //# sourceMappingURL=converge-startdate-utc.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"converge-startdate-utc.d.ts","sourceRoot":"","sources":["../../src/scripts/converge-startdate-utc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAyElE"}
@@ -1,87 +0,0 @@
1
- import { connectNeo4j, listLocalAccountIds } from "../lib/dispatcher-env.js";
2
- import { normaliseInstant, isCanonicalInstant } from "../../../../../lib/canonical-instant/dist/index.js";
3
- export async function convergeStartDates(driver, localAccountIds) {
4
- if (localAccountIds.length === 0) {
5
- return { scanned: 0, rewritten: 0, refused: 0 };
6
- }
7
- let scanned = 0;
8
- let rewritten = 0;
9
- let refused = 0;
10
- const readSession = driver.session();
11
- let rows = [];
12
- try {
13
- const res = await readSession.run(`MATCH (e:Event)
14
- WHERE e.accountId IN $localAccountIds AND e.startDate IS NOT NULL
15
- RETURN e.eventId AS eventId, e.startDate AS startDate, e.timezone AS timezone`, { localAccountIds });
16
- rows = res.records.map((r) => ({
17
- eventId: r.get("eventId"),
18
- startDate: r.get("startDate"),
19
- timezone: r.get("timezone") ?? null,
20
- }));
21
- }
22
- finally {
23
- try {
24
- await readSession.close();
25
- }
26
- catch {
27
- // ignore
28
- }
29
- }
30
- for (const row of rows) {
31
- scanned++;
32
- if (isCanonicalInstant(row.startDate)) {
33
- console.error(`[converge-startdate] op=skip eventId=${row.eventId} reason=canonical`);
34
- continue;
35
- }
36
- let canonical;
37
- try {
38
- canonical = normaliseInstant(row.startDate, row.timezone);
39
- }
40
- catch (err) {
41
- refused++;
42
- console.error(`[converge-startdate] op=refuse eventId=${row.eventId} reason=no-zone ` +
43
- `in=${row.startDate} detail=${err instanceof Error ? err.message : String(err)}`);
44
- continue;
45
- }
46
- const writeSession = driver.session();
47
- try {
48
- await writeSession.run(`MATCH (e:Event {eventId: $eventId}) SET e.startDate = $startDate`, {
49
- eventId: row.eventId,
50
- startDate: canonical,
51
- });
52
- rewritten++;
53
- console.error(`[converge-startdate] op=rewrite eventId=${row.eventId} in=${row.startDate} ` +
54
- `out=${canonical} tz=${row.timezone ?? "-"}`);
55
- }
56
- finally {
57
- try {
58
- await writeSession.close();
59
- }
60
- catch {
61
- // ignore
62
- }
63
- }
64
- }
65
- // Printed even when nothing changed. A run that says nothing is
66
- // indistinguishable from a run that never happened.
67
- console.error(`[converge-startdate] op=done scanned=${scanned} rewritten=${rewritten} refused=${refused}`);
68
- return { scanned, rewritten, refused };
69
- }
70
- async function main() {
71
- const driver = connectNeo4j("converge-startdate-utc");
72
- try {
73
- await convergeStartDates(driver, listLocalAccountIds(process.env.PLATFORM_ROOT));
74
- }
75
- finally {
76
- await driver.close();
77
- }
78
- }
79
- // Entry point only when executed directly, so the test can import the function
80
- // without running a migration.
81
- if (process.argv[1] && process.argv[1].endsWith("converge-startdate-utc.js")) {
82
- main().catch((err) => {
83
- console.error(`[converge-startdate] op=fatal detail=${err instanceof Error ? err.message : String(err)}`);
84
- process.exit(1);
85
- });
86
- }
87
- //# sourceMappingURL=converge-startdate-utc.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"converge-startdate-utc.js","sourceRoot":"","sources":["../../src/scripts/converge-startdate-utc.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AAE1G,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAc,EACd,eAAyB;IAEzB,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACrC,IAAI,IAAI,GAA2E,EAAE,CAAC;IACtF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,GAAG,CAC/B;;qFAE+E,EAC/E,EAAE,eAAe,EAAE,CACpB,CAAC;QACF,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7B,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAW;YACnC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAW;YACvC,QAAQ,EAAG,CAAC,CAAC,GAAG,CAAC,UAAU,CAAmB,IAAI,IAAI;SACvD,CAAC,CAAC,CAAC;IACN,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;QACV,IAAI,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,wCAAwC,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC;YACtF,SAAS;QACX,CAAC;QACD,IAAI,SAAiB,CAAC;QACtB,IAAI,CAAC;YACH,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CACX,0CAA0C,GAAG,CAAC,OAAO,kBAAkB;gBACrE,MAAM,GAAG,CAAC,SAAS,WAAW,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACnF,CAAC;YACF,SAAS;QACX,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,GAAG,CAAC,kEAAkE,EAAE;gBACzF,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,SAAS,EAAE,SAAS;aACrB,CAAC,CAAC;YACH,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CACX,2CAA2C,GAAG,CAAC,OAAO,OAAO,GAAG,CAAC,SAAS,GAAG;gBAC3E,OAAO,SAAS,OAAO,GAAG,CAAC,QAAQ,IAAI,GAAG,EAAE,CAC/C,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,oDAAoD;IACpD,OAAO,CAAC,KAAK,CACX,wCAAwC,OAAO,cAAc,SAAS,YAAY,OAAO,EAAE,CAC5F,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,aAAc,CAAC,CAAC,CAAC;IACpF,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,+BAA+B;AAC/B,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC,EAAE,CAAC;IAC7E,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,OAAO,CAAC,KAAK,CACX,wCAAwC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC3F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1 +0,0 @@
1
- import{n as e,t}from"./jsx-runtime-YcUntiud.js";import"./useMediaQuery-BmG090FR.js";import"./useVoiceRecorder-9pf6FFJ-.js";import"./AdminShell-C_M7YE5Z.js";import{n}from"./page-DXz_K10G.js";import"./useCopyFeedback-zOQNrIwd.js";var r=e(),i=t();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));
@@ -1 +0,0 @@
1
- =`dU��V�b)N����;`��_�<y�▕b���r[ A��L_�E���{��WnNom�3as}��~��؞��z��͕w�$��9AD�J��>)Zb����2��U�:-�D"��`W�>�7F�y��:�}�t��>ì$&K�*�ӎ�b�pI?g���_�9��n"� 3�R�x�1�]�����e�r��������8
@@ -1 +0,0 @@
1
- import{Z as e}from"./useMediaQuery-BmG090FR.js";var t=e(`chevron-left`,[[`path`,{d:`m15 18-6-6 6-6`,key:`1wnfg3`}]]);export{t};
@@ -1 +0,0 @@
1
- import{Z as e}from"./useMediaQuery-BmG090FR.js";var t=e(`clock`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 6v6l4 2`,key:`mmk7yg`}]]);export{t};
@@ -1 +0,0 @@
1
- import{n as e,t}from"./jsx-runtime-YcUntiud.js";import"./useMediaQuery-BmG090FR.js";import"./useVoiceRecorder-9pf6FFJ-.js";import{t as n}from"./page-BU5vlY9Y.js";import"./graph-labels-8jKFrLHn.js";var r=e(),i=t();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));