@rubytech/create-maxy-code 0.1.546 → 0.1.548

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 (292) hide show
  1. package/dist/index.js +14 -0
  2. package/package.json +1 -1
  3. package/payload/platform/lib/routine-templates/dist/index.d.ts +22 -16
  4. package/payload/platform/lib/routine-templates/dist/index.d.ts.map +1 -1
  5. package/payload/platform/lib/routine-templates/dist/index.js +15 -10
  6. package/payload/platform/lib/routine-templates/dist/index.js.map +1 -1
  7. package/payload/platform/lib/routine-templates/dist/roster.d.ts +3 -3
  8. package/payload/platform/lib/routine-templates/dist/roster.d.ts.map +1 -1
  9. package/payload/platform/lib/routine-templates/src/__tests__/seed.test.ts +15 -11
  10. package/payload/platform/lib/routine-templates/src/index.ts +23 -17
  11. package/payload/platform/lib/routine-templates/src/roster.ts +3 -3
  12. package/payload/platform/plugins/admin/mcp/dist/index.js +32 -16
  13. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  14. package/payload/platform/plugins/admin/mcp/dist/tools/account-default-agent.d.ts +16 -0
  15. package/payload/platform/plugins/admin/mcp/dist/tools/account-default-agent.d.ts.map +1 -0
  16. package/payload/platform/plugins/admin/mcp/dist/tools/account-default-agent.js +21 -0
  17. package/payload/platform/plugins/admin/mcp/dist/tools/account-default-agent.js.map +1 -0
  18. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +78 -33
  19. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +11 -0
  20. package/payload/platform/plugins/docs/references/admin-ui.md +63 -8
  21. package/payload/platform/plugins/docs/references/channel-wake-and-prompt.md +14 -24
  22. package/payload/platform/plugins/scheduling/PLUGIN.md +6 -0
  23. package/payload/platform/plugins/scheduling/mcp/dist/index.js +6 -2
  24. package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
  25. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/routine-run.test.js +109 -1
  26. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/routine-run.test.js.map +1 -1
  27. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.d.ts +2 -0
  28. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.d.ts.map +1 -0
  29. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js +54 -0
  30. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js.map +1 -0
  31. package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.d.ts +31 -0
  32. package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.d.ts.map +1 -1
  33. package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.js +116 -2
  34. package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.js.map +1 -1
  35. package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.d.ts +17 -0
  36. package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.d.ts.map +1 -0
  37. package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.js +43 -0
  38. package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.js.map +1 -0
  39. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-routine-description.test.d.ts +2 -0
  40. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-routine-description.test.d.ts.map +1 -0
  41. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-routine-description.test.js +87 -0
  42. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-routine-description.test.js.map +1 -0
  43. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/description-coverage.test.d.ts +2 -0
  44. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/description-coverage.test.d.ts.map +1 -0
  45. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/description-coverage.test.js +123 -0
  46. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/description-coverage.test.js.map +1 -0
  47. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts +36 -0
  48. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts.map +1 -1
  49. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js +89 -0
  50. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js.map +1 -1
  51. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +13 -1
  52. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
  53. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-routine-description.d.ts +35 -0
  54. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-routine-description.d.ts.map +1 -0
  55. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-routine-description.js +56 -0
  56. package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-routine-description.js.map +1 -0
  57. package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.js +3 -2
  58. package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.js.map +1 -1
  59. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-summary.test.d.ts +2 -0
  60. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-summary.test.d.ts.map +1 -0
  61. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-summary.test.js +80 -0
  62. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-summary.test.js.map +1 -0
  63. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts +2 -1
  64. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
  65. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +19 -1
  66. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
  67. package/payload/platform/plugins/telegram/PLUGIN.md +2 -0
  68. package/payload/platform/plugins/telegram/mcp/dist/index.js +47 -47
  69. package/payload/platform/plugins/telegram/mcp/dist/index.js.map +1 -1
  70. package/payload/platform/plugins/telegram/mcp/dist/lib/secret-path.d.ts +16 -0
  71. package/payload/platform/plugins/telegram/mcp/dist/lib/secret-path.d.ts.map +1 -0
  72. package/payload/platform/plugins/telegram/mcp/dist/lib/secret-path.js +50 -0
  73. package/payload/platform/plugins/telegram/mcp/dist/lib/secret-path.js.map +1 -0
  74. package/payload/platform/plugins/telegram/mcp/dist/lib/webhook-url.d.ts +8 -0
  75. package/payload/platform/plugins/telegram/mcp/dist/lib/webhook-url.d.ts.map +1 -0
  76. package/payload/platform/plugins/telegram/mcp/dist/lib/webhook-url.js +12 -0
  77. package/payload/platform/plugins/telegram/mcp/dist/lib/webhook-url.js.map +1 -0
  78. package/payload/platform/plugins/telegram/references/setup-guide.md +2 -0
  79. package/payload/platform/plugins/telegram/skills/configure/SKILL.md +6 -1
  80. package/payload/platform/plugins/whatsapp/PLUGIN.md +0 -6
  81. package/payload/platform/plugins/whatsapp/mcp/dist/index.js +2 -34
  82. package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
  83. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  84. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +0 -1
  85. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  86. package/payload/platform/services/telegram-channel/dist/notification.d.ts +8 -3
  87. package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
  88. package/payload/platform/services/telegram-channel/dist/notification.js +10 -3
  89. package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
  90. package/payload/platform/services/telegram-channel/dist/server.js +1 -1
  91. package/payload/platform/services/telegram-channel/dist/server.js.map +1 -1
  92. package/payload/platform/services/telegram-channel/dist/turn-follow.d.ts +28 -0
  93. package/payload/platform/services/telegram-channel/dist/turn-follow.d.ts.map +1 -1
  94. package/payload/platform/services/telegram-channel/dist/turn-follow.js +33 -1
  95. package/payload/platform/services/telegram-channel/dist/turn-follow.js.map +1 -1
  96. package/payload/platform/services/webchat-channel/dist/notification.d.ts +8 -3
  97. package/payload/platform/services/webchat-channel/dist/notification.d.ts.map +1 -1
  98. package/payload/platform/services/webchat-channel/dist/notification.js +10 -3
  99. package/payload/platform/services/webchat-channel/dist/notification.js.map +1 -1
  100. package/payload/platform/services/webchat-channel/dist/server.js +1 -1
  101. package/payload/platform/services/webchat-channel/dist/server.js.map +1 -1
  102. package/payload/platform/services/webchat-channel/dist/turn-follow.d.ts +28 -0
  103. package/payload/platform/services/webchat-channel/dist/turn-follow.d.ts.map +1 -1
  104. package/payload/platform/services/webchat-channel/dist/turn-follow.js +33 -1
  105. package/payload/platform/services/webchat-channel/dist/turn-follow.js.map +1 -1
  106. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +42 -20
  107. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  108. package/payload/platform/services/whatsapp-channel/dist/notification.js +44 -27
  109. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  110. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  111. package/payload/platform/services/whatsapp-channel/dist/server.js +13 -5
  112. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  113. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts +6 -4
  114. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts.map +1 -1
  115. package/payload/platform/services/whatsapp-channel/dist/targets.js +17 -6
  116. package/payload/platform/services/whatsapp-channel/dist/targets.js.map +1 -1
  117. package/payload/platform/services/whatsapp-channel/dist/turn-follow.d.ts +28 -0
  118. package/payload/platform/services/whatsapp-channel/dist/turn-follow.d.ts.map +1 -1
  119. package/payload/platform/services/whatsapp-channel/dist/turn-follow.js +34 -1
  120. package/payload/platform/services/whatsapp-channel/dist/turn-follow.js.map +1 -1
  121. package/payload/server/{chunk-CVUSUNXM.js → chunk-G6ULACHG.js} +2 -4
  122. package/payload/server/{chunk-X2RRMHVV.js → chunk-JOVREC6E.js} +117 -1
  123. package/payload/server/{chunk-DU7GPDJJ.js → chunk-SKYZG6OT.js} +15 -0
  124. package/payload/server/{manager-TI2YJQVZ.js → manager-2VEJKVEO.js} +2 -2
  125. package/payload/server/maxy-edge.js +2 -2
  126. package/payload/server/public/activity.html +5 -5
  127. package/payload/server/public/agents.html +4 -4
  128. package/payload/server/public/assets/{AdminLoginScreens-BGKtDqAk.js → AdminLoginScreens-Bjcs9ta9.js} +1 -1
  129. package/payload/server/public/assets/AdminLoginScreens-Bjcs9ta9.js.br +0 -0
  130. package/payload/server/public/assets/AdminLoginScreens-Bjcs9ta9.js.gz +0 -0
  131. package/payload/server/public/assets/{AdminShell-DnfgsAQl.js → AdminShell-DVBAMUCy.js} +1 -1
  132. package/payload/server/public/assets/AdminShell-DVBAMUCy.js.br +0 -0
  133. package/payload/server/public/assets/{AdminShell-DnfgsAQl.js.gz → AdminShell-DVBAMUCy.js.gz} +0 -0
  134. package/payload/server/public/assets/{activity-ByJSut0Q.js → activity-C8E8-EwQ.js} +1 -1
  135. package/payload/server/public/assets/activity-C8E8-EwQ.js.br +0 -0
  136. package/payload/server/public/assets/activity-C8E8-EwQ.js.gz +0 -0
  137. package/payload/server/public/assets/{admin-CkeJO6kA.js → admin-CeWAlpRS.js} +1 -1
  138. package/payload/server/public/assets/admin-CeWAlpRS.js.br +0 -0
  139. package/payload/server/public/assets/admin-CeWAlpRS.js.gz +0 -0
  140. package/payload/server/public/assets/{agents-D8phtRX5.js → agents-DuN92iFb.js} +1 -1
  141. package/payload/server/public/assets/agents-DuN92iFb.js.br +0 -0
  142. package/payload/server/public/assets/agents-DuN92iFb.js.gz +0 -0
  143. package/payload/server/public/assets/{browser-DQSTjdom.js → browser-BxebdKbh.js} +1 -1
  144. package/payload/server/public/assets/browser-BxebdKbh.js.br +0 -0
  145. package/payload/server/public/assets/browser-BxebdKbh.js.gz +0 -0
  146. package/payload/server/public/assets/{calendar-DFJu1XjP.js → calendar-BtFZQ5Np.js} +1 -1
  147. package/payload/server/public/assets/calendar-BtFZQ5Np.js.br +0 -0
  148. package/payload/server/public/assets/calendar-BtFZQ5Np.js.gz +0 -0
  149. package/payload/server/public/assets/chat-CGIwynaH.js +1 -0
  150. package/payload/server/public/assets/chat-CGIwynaH.js.br +3 -0
  151. package/payload/server/public/assets/chat-CGIwynaH.js.gz +0 -0
  152. package/payload/server/public/assets/chevron-left-DaNP1zDb.js +1 -0
  153. package/payload/server/public/assets/chevron-left-DaNP1zDb.js.br +0 -0
  154. package/payload/server/public/assets/chevron-right-BbbuTUnt.js +1 -0
  155. package/payload/server/public/assets/chevron-right-BbbuTUnt.js.br +0 -0
  156. package/payload/server/public/assets/clock-CfDdatjp.js +1 -0
  157. package/payload/server/public/assets/clock-CfDdatjp.js.br +0 -0
  158. package/payload/server/public/assets/clock-CfDdatjp.js.gz +0 -0
  159. package/payload/server/public/assets/{copy-lFFhXRGk.js → copy-DCDHXq3O.js} +1 -1
  160. package/payload/server/public/assets/copy-DCDHXq3O.js.br +0 -0
  161. package/payload/server/public/assets/copy-DCDHXq3O.js.gz +0 -0
  162. package/payload/server/public/assets/data-BchSWOju.js +1 -0
  163. package/payload/server/public/assets/data-BchSWOju.js.br +1 -0
  164. package/payload/server/public/assets/data-BchSWOju.js.gz +0 -0
  165. package/payload/server/public/assets/{file-text-D2Y-bkNy.js → file-text-zQgEQWCF.js} +1 -1
  166. package/payload/server/public/assets/file-text-zQgEQWCF.js.br +0 -0
  167. package/payload/server/public/assets/file-text-zQgEQWCF.js.gz +0 -0
  168. package/payload/server/public/assets/{graph-C-3yN6JD.js → graph-CFCEh_YI.js} +1 -1
  169. package/payload/server/public/assets/graph-CFCEh_YI.js.br +0 -0
  170. package/payload/server/public/assets/graph-CFCEh_YI.js.gz +0 -0
  171. package/payload/server/public/assets/{graph-labels-DiaPLP27.js → graph-labels-CA1UcDuS.js} +1 -1
  172. package/payload/server/public/assets/graph-labels-CA1UcDuS.js.br +0 -0
  173. package/payload/server/public/assets/graph-labels-CA1UcDuS.js.gz +0 -0
  174. package/payload/server/public/assets/{operator-KuGPvSa9.js → operator-hFXPDc2X.js} +1 -1
  175. package/payload/server/public/assets/operator-hFXPDc2X.js.br +0 -0
  176. package/payload/server/public/assets/operator-hFXPDc2X.js.gz +0 -0
  177. package/payload/server/public/assets/{page-BhGeFXWA.js → page-C8jyPH_3.js} +1 -1
  178. package/payload/server/public/assets/page-C8jyPH_3.js.br +0 -0
  179. package/payload/server/public/assets/page-C8jyPH_3.js.gz +0 -0
  180. package/payload/server/public/assets/{page-EnbVC-yM.js → page-ne7I_r9L.js} +1 -1
  181. package/payload/server/public/assets/page-ne7I_r9L.js.br +0 -0
  182. package/payload/server/public/assets/page-ne7I_r9L.js.gz +0 -0
  183. package/payload/server/public/assets/play-Ep0SZTbr.js +1 -0
  184. package/payload/server/public/assets/play-Ep0SZTbr.js.br +0 -0
  185. package/payload/server/public/assets/play-Ep0SZTbr.js.gz +0 -0
  186. package/payload/server/public/assets/{public-CdSgMNC7.js → public-BgnqjAal.js} +1 -1
  187. package/payload/server/public/assets/public-BgnqjAal.js.br +0 -0
  188. package/payload/server/public/assets/public-BgnqjAal.js.gz +0 -0
  189. package/payload/server/public/assets/{rotate-ccw-rTRuTqei.js → rotate-ccw-DfJWjXAg.js} +1 -1
  190. package/payload/server/public/assets/rotate-ccw-DfJWjXAg.js.br +0 -0
  191. package/payload/server/public/assets/rotate-ccw-DfJWjXAg.js.gz +0 -0
  192. package/payload/server/public/assets/routines-OGFXwTFO.js +2 -0
  193. package/payload/server/public/assets/routines-OGFXwTFO.js.br +0 -0
  194. package/payload/server/public/assets/routines-OGFXwTFO.js.gz +0 -0
  195. package/payload/server/public/assets/{skills-DFWtZNkW.js → skills-D-6EbgfP.js} +1 -1
  196. package/payload/server/public/assets/skills-D-6EbgfP.js.br +0 -0
  197. package/payload/server/public/assets/skills-D-6EbgfP.js.gz +0 -0
  198. package/payload/server/public/assets/{tasks-B94AuKSy.js → tasks-DnN5Fyds.js} +1 -1
  199. package/payload/server/public/assets/tasks-DnN5Fyds.js.br +0 -0
  200. package/payload/server/public/assets/tasks-DnN5Fyds.js.gz +0 -0
  201. package/payload/server/public/assets/{triangle-alert-DtWUg6jR.js → triangle-alert-eh9UOKDT.js} +1 -1
  202. package/payload/server/public/assets/triangle-alert-eh9UOKDT.js.br +0 -0
  203. package/payload/server/public/assets/triangle-alert-eh9UOKDT.js.gz +0 -0
  204. package/payload/server/public/assets/{useCopyFeedback-CjKYO-Qf.js → useCopyFeedback-Bz9OJHBb.js} +1 -1
  205. package/payload/server/public/assets/useCopyFeedback-Bz9OJHBb.js.br +0 -0
  206. package/payload/server/public/assets/useCopyFeedback-Bz9OJHBb.js.gz +0 -0
  207. package/payload/server/public/assets/{useMediaQuery-DlOWP56H.css → useMediaQuery-CNxsjKZp.css} +1 -1
  208. package/payload/server/public/assets/useMediaQuery-CNxsjKZp.css.br +0 -0
  209. package/payload/server/public/assets/{useMediaQuery-DlOWP56H.css.gz → useMediaQuery-CNxsjKZp.css.gz} +0 -0
  210. package/payload/server/public/assets/{useVoiceRecorder-BKFAYuzz.js → useVoiceRecorder-BaDpMYxX.js} +1 -1
  211. package/payload/server/public/assets/useVoiceRecorder-BaDpMYxX.js.br +0 -0
  212. package/payload/server/public/assets/useVoiceRecorder-BaDpMYxX.js.gz +0 -0
  213. package/payload/server/public/assets/{wrench-Ct4kf-uv.js → wrench-BO-l46rF.js} +1 -1
  214. package/payload/server/public/assets/wrench-BO-l46rF.js.br +0 -0
  215. package/payload/server/public/assets/wrench-BO-l46rF.js.gz +0 -0
  216. package/payload/server/public/browser.html +4 -4
  217. package/payload/server/public/calendar.html +8 -8
  218. package/payload/server/public/chat.html +13 -13
  219. package/payload/server/public/data.html +11 -11
  220. package/payload/server/public/graph.html +9 -9
  221. package/payload/server/public/index.html +14 -14
  222. package/payload/server/public/operator.html +14 -14
  223. package/payload/server/public/public.html +13 -13
  224. package/payload/server/public/routines.html +6 -6
  225. package/payload/server/public/skills.html +5 -5
  226. package/payload/server/public/tasks.html +6 -6
  227. package/payload/server/server.js +330 -520
  228. package/payload/server/public/assets/AdminLoginScreens-BGKtDqAk.js.br +0 -0
  229. package/payload/server/public/assets/AdminLoginScreens-BGKtDqAk.js.gz +0 -0
  230. package/payload/server/public/assets/AdminShell-DnfgsAQl.js.br +0 -0
  231. package/payload/server/public/assets/activity-ByJSut0Q.js.br +0 -0
  232. package/payload/server/public/assets/activity-ByJSut0Q.js.gz +0 -0
  233. package/payload/server/public/assets/admin-CkeJO6kA.js.br +0 -0
  234. package/payload/server/public/assets/admin-CkeJO6kA.js.gz +0 -0
  235. package/payload/server/public/assets/agents-D8phtRX5.js.br +0 -0
  236. package/payload/server/public/assets/agents-D8phtRX5.js.gz +0 -0
  237. package/payload/server/public/assets/browser-DQSTjdom.js.br +0 -0
  238. package/payload/server/public/assets/browser-DQSTjdom.js.gz +0 -0
  239. package/payload/server/public/assets/calendar-DFJu1XjP.js.br +0 -0
  240. package/payload/server/public/assets/calendar-DFJu1XjP.js.gz +0 -0
  241. package/payload/server/public/assets/chat-DUqtIsOt.js +0 -1
  242. package/payload/server/public/assets/chat-DUqtIsOt.js.br +0 -0
  243. package/payload/server/public/assets/chat-DUqtIsOt.js.gz +0 -0
  244. package/payload/server/public/assets/chevron-left-DFK18xVX.js +0 -1
  245. package/payload/server/public/assets/chevron-left-DFK18xVX.js.br +0 -0
  246. package/payload/server/public/assets/chevron-right-DJ4oaHoN.js +0 -1
  247. package/payload/server/public/assets/chevron-right-DJ4oaHoN.js.br +0 -0
  248. package/payload/server/public/assets/clock-wHIan2DW.js +0 -1
  249. package/payload/server/public/assets/clock-wHIan2DW.js.br +0 -0
  250. package/payload/server/public/assets/copy-lFFhXRGk.js.br +0 -0
  251. package/payload/server/public/assets/copy-lFFhXRGk.js.gz +0 -0
  252. package/payload/server/public/assets/data-Cxv97ARy.js +0 -1
  253. package/payload/server/public/assets/data-Cxv97ARy.js.br +0 -0
  254. package/payload/server/public/assets/data-Cxv97ARy.js.gz +0 -0
  255. package/payload/server/public/assets/file-text-D2Y-bkNy.js.br +0 -0
  256. package/payload/server/public/assets/file-text-D2Y-bkNy.js.gz +0 -0
  257. package/payload/server/public/assets/graph-C-3yN6JD.js.br +0 -0
  258. package/payload/server/public/assets/graph-C-3yN6JD.js.gz +0 -0
  259. package/payload/server/public/assets/graph-labels-DiaPLP27.js.br +0 -0
  260. package/payload/server/public/assets/graph-labels-DiaPLP27.js.gz +0 -0
  261. package/payload/server/public/assets/operator-KuGPvSa9.js.br +0 -0
  262. package/payload/server/public/assets/operator-KuGPvSa9.js.gz +0 -0
  263. package/payload/server/public/assets/page-BhGeFXWA.js.br +0 -0
  264. package/payload/server/public/assets/page-BhGeFXWA.js.gz +0 -0
  265. package/payload/server/public/assets/page-EnbVC-yM.js.br +0 -0
  266. package/payload/server/public/assets/page-EnbVC-yM.js.gz +0 -0
  267. package/payload/server/public/assets/play-jZFZAG-t.js +0 -1
  268. package/payload/server/public/assets/play-jZFZAG-t.js.br +0 -0
  269. package/payload/server/public/assets/play-jZFZAG-t.js.gz +0 -0
  270. package/payload/server/public/assets/public-CdSgMNC7.js.br +0 -0
  271. package/payload/server/public/assets/public-CdSgMNC7.js.gz +0 -0
  272. package/payload/server/public/assets/rotate-ccw-rTRuTqei.js.br +0 -0
  273. package/payload/server/public/assets/rotate-ccw-rTRuTqei.js.gz +0 -0
  274. package/payload/server/public/assets/routines-DNRxNRSQ.js +0 -2
  275. package/payload/server/public/assets/routines-DNRxNRSQ.js.br +0 -0
  276. package/payload/server/public/assets/routines-DNRxNRSQ.js.gz +0 -0
  277. package/payload/server/public/assets/skills-DFWtZNkW.js.br +0 -0
  278. package/payload/server/public/assets/skills-DFWtZNkW.js.gz +0 -0
  279. package/payload/server/public/assets/tasks-B94AuKSy.js.br +0 -0
  280. package/payload/server/public/assets/tasks-B94AuKSy.js.gz +0 -0
  281. package/payload/server/public/assets/triangle-alert-DtWUg6jR.js.br +0 -0
  282. package/payload/server/public/assets/triangle-alert-DtWUg6jR.js.gz +0 -0
  283. package/payload/server/public/assets/useCopyFeedback-CjKYO-Qf.js.br +0 -0
  284. package/payload/server/public/assets/useCopyFeedback-CjKYO-Qf.js.gz +0 -0
  285. package/payload/server/public/assets/useMediaQuery-DlOWP56H.css.br +0 -0
  286. package/payload/server/public/assets/useVoiceRecorder-BKFAYuzz.js.br +0 -0
  287. package/payload/server/public/assets/useVoiceRecorder-BKFAYuzz.js.gz +0 -0
  288. package/payload/server/public/assets/wrench-Ct4kf-uv.js.br +0 -0
  289. package/payload/server/public/assets/wrench-Ct4kf-uv.js.gz +0 -0
  290. /package/payload/server/public/assets/{useMediaQuery-BYIHo-xL.js → useMediaQuery-_mMln3Fu.js} +0 -0
  291. /package/payload/server/public/assets/{useMediaQuery-BYIHo-xL.js.br → useMediaQuery-_mMln3Fu.js.br} +0 -0
  292. /package/payload/server/public/assets/{useMediaQuery-BYIHo-xL.js.gz → useMediaQuery-_mMln3Fu.js.gz} +0 -0
package/dist/index.js CHANGED
@@ -3405,6 +3405,20 @@ function setupAccount() {
3405
3405
  env: { ...neo4jEnv, PLATFORM_ROOT: join(INSTALL_DIR, "platform") },
3406
3406
  });
3407
3407
  }
3408
+ // Task 2361 — collapse the two routine description properties onto
3409
+ // `:Event.description`, preferring whichever value the operator or the agent
3410
+ // wrote. Runs after the seed for the same reasons the convergence above does:
3411
+ // the schema exists by then, and the same Neo4j env is already built. Scoped to
3412
+ // this install's accounts via PLATFORM_ROOT, so a co-resident brand sharing one
3413
+ // Neo4j is untouched. Idempotent: a converged install matches nothing and
3414
+ // prints converged=0.
3415
+ const convergeRoutineDescription = join(INSTALL_DIR, "platform/plugins/scheduling/mcp/dist/scripts/converge-routine-description.js");
3416
+ if (existsSync(convergeRoutineDescription)) {
3417
+ shell("node", [convergeRoutineDescription], {
3418
+ cwd: INSTALL_DIR,
3419
+ env: { ...neo4jEnv, PLATFORM_ROOT: join(INSTALL_DIR, "platform") },
3420
+ });
3421
+ }
3408
3422
  // Task 165 — register every bundled specialist subagent at
3409
3423
  // $CLAUDE_CONFIG_DIR/agents/<name>.md. Claude Code's `--agent <name>`
3410
3424
  // discovery only resolves under this path; without these symlinks,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-maxy-code",
3
- "version": "0.1.546",
3
+ "version": "0.1.548",
4
4
  "description": "Install Maxy — AI for Productive People",
5
5
  "bin": {
6
6
  "create-maxy-code": "./dist/index.js"
@@ -70,13 +70,14 @@ export interface RoutineVerifyCounts {
70
70
  actual: number;
71
71
  suspended: number;
72
72
  nextRunNull: number;
73
- /** Task 2214 — roster rows holding no description. Zero is the healthy value
74
- * on every account, not only a fresh one: `VERIFY_CYPHER` matches
75
- * `routineTemplate IS NOT NULL`, so operator-created routines are outside
76
- * its scope and cannot contribute, and `ON MATCH` writes the description
77
- * unconditionally, so an operator-edited row is covered too. Anything above
78
- * zero while `expected === actual` is a MERGE that wrote no description
79
- * the one failure here that emits no error and does not reproduce. */
73
+ /** Roster rows holding no description. Zero is the healthy value on every
74
+ * account, not only a fresh one: `VERIFY_CYPHER` matches `routineTemplate IS
75
+ * NOT NULL`, so operator-created routines are outside its scope and cannot
76
+ * contribute. Anything above zero while `expected === actual` is a MERGE that
77
+ * wrote no description on create, or a row whose key left the roster before
78
+ * the convergence ran the one failure here that emits no error and does not
79
+ * reproduce. `[schedule-audit] op=description-coverage` is the wider twin,
80
+ * over every automation row rather than the roster alone. */
80
81
  descNull: number;
81
82
  }
82
83
  export interface RoutineSeedReport {
@@ -124,17 +125,22 @@ export declare function resolveOwnerTimezone(session: SeedSessionLike, accountId
124
125
  * destination, or reset a retimed cron. Only the prompt, the name and the
125
126
  * version move, and only when the row is behind and unedited.
126
127
  *
127
- * `routineDescription` (Task 2214) is the one property ON MATCH writes on
128
- * every match rather than only on the refresh branch, and that is not an
129
- * exception to the rule above. It is roster-owned: the routines route projects
130
- * it but its PATCH field set refuses it, so no operator edit exists for this
131
- * to overwrite. Gating it on `refreshing` would leave every operator-edited
132
- * row description-less permanently, because `skip-operator-edited` takes
133
- * neither branch, and that row's card would show a title and nothing else. */
134
- export declare const MERGE_CYPHER = "\nUNWIND $rows AS row\nOPTIONAL MATCH (pre:Event {accountId: $accountId, routineTemplate: row.key})\nWITH row,\n pre IS NOT NULL AS existed,\n coalesce(pre.routineTemplateVersion, 0) AS priorVersion,\n pre.operatorEdited IS NOT NULL AS edited\nWITH row, existed, priorVersion, edited,\n (existed AND NOT edited AND priorVersion < $version) AS refreshing\nMERGE (e:Event {accountId: $accountId, routineTemplate: row.key})\n ON CREATE SET e.eventId = randomUUID(),\n e.name = row.name,\n e.routineDescription = row.description,\n e.agentPrompt = row.prompt,\n e.recurrence = row.recurrence,\n e.routineTemplateVersion = $version,\n e.eventStatus = 'suspended',\n e.nextRun = null,\n e.agentChannel = null,\n e.agentDestination = null,\n e.actionPlugin = null,\n e.actionTool = null,\n e.actionArgs = null,\n e.sourcePlugin = null,\n e.timezone = $timezone,\n e.createdBySource = 'installer',\n e.createdByAgent = 'system',\n e.createdByTool = 'routine-roster-seed',\n e.createdAt = $now,\n e.updatedAt = $now\n ON MATCH SET e.agentPrompt = CASE WHEN refreshing THEN row.prompt ELSE e.agentPrompt END,\n e.name = CASE WHEN refreshing THEN row.name ELSE e.name END,\n e.routineDescription = row.description,\n e.routineTemplateVersion = CASE WHEN refreshing THEN $version ELSE e.routineTemplateVersion END,\n e.updatedAt = CASE WHEN refreshing THEN $now ELSE e.updatedAt END\nRETURN row.key AS key,\n e.eventId AS eventId,\n CASE WHEN NOT existed THEN 'create'\n WHEN priorVersion >= $version THEN 'unchanged'\n WHEN edited THEN 'skip-operator-edited'\n ELSE 'refresh-version' END AS action";
128
+ * `description` (Task 2361) is guarded exactly as the prompt and the name are,
129
+ * and that is a change of shape from Task 2214, which introduced it. It used to
130
+ * be written on every match, on the grounds that it was roster-owned and the
131
+ * routines PATCH refused it, so no operator edit existed for the seed to
132
+ * clobber, and that gating it would leave every operator-edited row
133
+ * description-less permanently because `skip-operator-edited` takes neither
134
+ * branch. Both halves of that argument are gone. The routines PATCH now accepts
135
+ * `description` and stamps `operatorEdited`, so an unconditional write would
136
+ * destroy the operator's own caption on the next version bump; and the
137
+ * scheduling plugin's one-shot `converge-routine-description` has already given
138
+ * every pre-existing row a description, so no row is left holding only a
139
+ * title. */
140
+ export declare const MERGE_CYPHER = "\nUNWIND $rows AS row\nOPTIONAL MATCH (pre:Event {accountId: $accountId, routineTemplate: row.key})\nWITH row,\n pre IS NOT NULL AS existed,\n coalesce(pre.routineTemplateVersion, 0) AS priorVersion,\n pre.operatorEdited IS NOT NULL AS edited\nWITH row, existed, priorVersion, edited,\n (existed AND NOT edited AND priorVersion < $version) AS refreshing\nMERGE (e:Event {accountId: $accountId, routineTemplate: row.key})\n ON CREATE SET e.eventId = randomUUID(),\n e.name = row.name,\n e.description = row.description,\n e.agentPrompt = row.prompt,\n e.recurrence = row.recurrence,\n e.routineTemplateVersion = $version,\n e.eventStatus = 'suspended',\n e.nextRun = null,\n e.agentChannel = null,\n e.agentDestination = null,\n e.actionPlugin = null,\n e.actionTool = null,\n e.actionArgs = null,\n e.sourcePlugin = null,\n e.timezone = $timezone,\n e.createdBySource = 'installer',\n e.createdByAgent = 'system',\n e.createdByTool = 'routine-roster-seed',\n e.createdAt = $now,\n e.updatedAt = $now\n ON MATCH SET e.agentPrompt = CASE WHEN refreshing THEN row.prompt ELSE e.agentPrompt END,\n e.name = CASE WHEN refreshing THEN row.name ELSE e.name END,\n e.description = CASE WHEN refreshing THEN row.description ELSE e.description END,\n e.routineTemplateVersion = CASE WHEN refreshing THEN $version ELSE e.routineTemplateVersion END,\n e.updatedAt = CASE WHEN refreshing THEN $now ELSE e.updatedAt END\nRETURN row.key AS key,\n e.eventId AS eventId,\n CASE WHEN NOT existed THEN 'create'\n WHEN priorVersion >= $version THEN 'unchanged'\n WHEN edited THEN 'skip-operator-edited'\n ELSE 'refresh-version' END AS action";
135
141
  /** The post-condition read. Counts every roster row the account actually holds,
136
142
  * independently of what the MERGE above believes it wrote. */
137
- export declare const VERIFY_CYPHER = "\nMATCH (e:Event {accountId: $accountId})\nWHERE e.routineTemplate IS NOT NULL\nRETURN count(e) AS actual,\n sum(CASE WHEN e.eventStatus = 'suspended' THEN 1 ELSE 0 END) AS suspended,\n sum(CASE WHEN e.nextRun IS NULL THEN 1 ELSE 0 END) AS nextRunNull,\n sum(CASE WHEN e.routineDescription IS NULL THEN 1 ELSE 0 END) AS descNull";
143
+ export declare const VERIFY_CYPHER = "\nMATCH (e:Event {accountId: $accountId})\nWHERE e.routineTemplate IS NOT NULL\nRETURN count(e) AS actual,\n sum(CASE WHEN e.eventStatus = 'suspended' THEN 1 ELSE 0 END) AS suspended,\n sum(CASE WHEN e.nextRun IS NULL THEN 1 ELSE 0 END) AS nextRunNull,\n sum(CASE WHEN e.description IS NULL THEN 1 ELSE 0 END) AS descNull";
138
144
  export interface SeedRoutineRosterArgs {
139
145
  session: SeedSessionLike;
140
146
  accountId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7F,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5F,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;2EAG2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CAClH;AAED;;;;;;;4EAO4E;AAC5E,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,iBAAiB,GAAG,sBAAsB,GAAG,WAAW,CAAC;AAErG,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;;;;;0EAM0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;2EAMuE;IACvE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,eAAe,GAAG,QAAQ,CAAC;IAC3C,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAYD;4DAC4D;AAC5D,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,eAAe,GAAG,QAAQ,CAAA;CAAE,CAAC,CAa1E;AAED;;;;;;;;;;;;;;;;;;;;+EAoB+E;AAC/E,eAAO,MAAM,YAAY,28DAwCwB,CAAC;AAElD;+DAC+D;AAC/D,eAAO,MAAM,aAAa,+VAMuD,CAAC;AAElF,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACpC,+DAA+D;IAC/D,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B;sEACkE;IAClE,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgF/F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7F,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5F,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;2EAG2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CAClH;AAED;;;;;;;4EAO4E;AAC5E,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,iBAAiB,GAAG,sBAAsB,GAAG,WAAW,CAAC;AAErG,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;;;;;0EAM0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;kEAO8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,eAAe,GAAG,QAAQ,CAAC;IAC3C,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAYD;4DAC4D;AAC5D,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,eAAe,GAAG,QAAQ,CAAA;CAAE,CAAC,CAa1E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;aAyBa;AACb,eAAO,MAAM,YAAY,8+DAwCwB,CAAC;AAElD;+DAC+D;AAC/D,eAAO,MAAM,aAAa,wVAMgD,CAAC;AAE3E,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACpC,+DAA+D;IAC/D,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B;sEACkE;IAClE,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgF/F"}
@@ -92,13 +92,18 @@ async function resolveOwnerTimezone(session, accountId) {
92
92
  * destination, or reset a retimed cron. Only the prompt, the name and the
93
93
  * version move, and only when the row is behind and unedited.
94
94
  *
95
- * `routineDescription` (Task 2214) is the one property ON MATCH writes on
96
- * every match rather than only on the refresh branch, and that is not an
97
- * exception to the rule above. It is roster-owned: the routines route projects
98
- * it but its PATCH field set refuses it, so no operator edit exists for this
99
- * to overwrite. Gating it on `refreshing` would leave every operator-edited
100
- * row description-less permanently, because `skip-operator-edited` takes
101
- * neither branch, and that row's card would show a title and nothing else. */
95
+ * `description` (Task 2361) is guarded exactly as the prompt and the name are,
96
+ * and that is a change of shape from Task 2214, which introduced it. It used to
97
+ * be written on every match, on the grounds that it was roster-owned and the
98
+ * routines PATCH refused it, so no operator edit existed for the seed to
99
+ * clobber, and that gating it would leave every operator-edited row
100
+ * description-less permanently because `skip-operator-edited` takes neither
101
+ * branch. Both halves of that argument are gone. The routines PATCH now accepts
102
+ * `description` and stamps `operatorEdited`, so an unconditional write would
103
+ * destroy the operator's own caption on the next version bump; and the
104
+ * scheduling plugin's one-shot `converge-routine-description` has already given
105
+ * every pre-existing row a description, so no row is left holding only a
106
+ * title. */
102
107
  exports.MERGE_CYPHER = `
103
108
  UNWIND $rows AS row
104
109
  OPTIONAL MATCH (pre:Event {accountId: $accountId, routineTemplate: row.key})
@@ -111,7 +116,7 @@ WITH row, existed, priorVersion, edited,
111
116
  MERGE (e:Event {accountId: $accountId, routineTemplate: row.key})
112
117
  ON CREATE SET e.eventId = randomUUID(),
113
118
  e.name = row.name,
114
- e.routineDescription = row.description,
119
+ e.description = row.description,
115
120
  e.agentPrompt = row.prompt,
116
121
  e.recurrence = row.recurrence,
117
122
  e.routineTemplateVersion = $version,
@@ -131,7 +136,7 @@ MERGE (e:Event {accountId: $accountId, routineTemplate: row.key})
131
136
  e.updatedAt = $now
132
137
  ON MATCH SET e.agentPrompt = CASE WHEN refreshing THEN row.prompt ELSE e.agentPrompt END,
133
138
  e.name = CASE WHEN refreshing THEN row.name ELSE e.name END,
134
- e.routineDescription = row.description,
139
+ e.description = CASE WHEN refreshing THEN row.description ELSE e.description END,
135
140
  e.routineTemplateVersion = CASE WHEN refreshing THEN $version ELSE e.routineTemplateVersion END,
136
141
  e.updatedAt = CASE WHEN refreshing THEN $now ELSE e.updatedAt END
137
142
  RETURN row.key AS key,
@@ -148,7 +153,7 @@ WHERE e.routineTemplate IS NOT NULL
148
153
  RETURN count(e) AS actual,
149
154
  sum(CASE WHEN e.eventStatus = 'suspended' THEN 1 ELSE 0 END) AS suspended,
150
155
  sum(CASE WHEN e.nextRun IS NULL THEN 1 ELSE 0 END) AS nextRunNull,
151
- sum(CASE WHEN e.routineDescription IS NULL THEN 1 ELSE 0 END) AS descNull`;
156
+ sum(CASE WHEN e.description IS NULL THEN 1 ELSE 0 END) AS descNull`;
152
157
  /**
153
158
  * Seed (or re-seed) the roster for one account and report what happened.
154
159
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -43,9 +43,9 @@ export interface RoutineTemplate {
43
43
  /** The title shown on `/routines`. */
44
44
  readonly name: string;
45
45
  /** One sentence under the title on the card: what this does and what it will
46
- * not do. Roster-owned and read-only projected by the routines route but
47
- * absent from its PATCH field set, so no operator edit exists for the seed to
48
- * overwrite and the MERGE rewrites it on every match. */
46
+ * not do. Seeded onto `e.description`, which the operator can then edit from
47
+ * the routines page. The seed rewrites it only on a version refresh of an
48
+ * unedited row, so an operator's own wording survives every upgrade. */
49
49
  readonly description: string;
50
50
  /** The proposed cron. Written ON CREATE only, never refreshed, so an operator
51
51
  * who retimes a routine keeps their expression across upgrades. */
@@ -1 +1 @@
1
- {"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../src/roster.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH;;;gFAGgF;AAChF,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B;;mEAE+D;IAC/D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;8DAG0D;IAC1D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;wEACoE;IACpE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAgKD;;;;;;;;iFAQiF;AACjF,eAAO,MAAM,cAAc,EAAE,SAAS,eAAe,EAyGpD,CAAC;AAEF;;6DAE6D;AAC7D,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAqC,CAAC"}
1
+ {"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../src/roster.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH;;;gFAGgF;AAChF,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B;;mEAE+D;IAC/D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;6EAGyE;IACzE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;wEACoE;IACpE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAgKD;;;;;;;;iFAQiF;AACjF,eAAO,MAAM,cAAc,EAAE,SAAS,eAAe,EAyGpD,CAAC;AAEF;;6DAE6D;AAC7D,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAqC,CAAC"}
@@ -84,7 +84,7 @@ describe("MERGE statement shape", () => {
84
84
  for (const required of [
85
85
  "eventId",
86
86
  "name",
87
- "routineDescription",
87
+ "description",
88
88
  "agentPrompt",
89
89
  "recurrence",
90
90
  "routineTemplateVersion",
@@ -121,20 +121,24 @@ describe("MERGE statement shape", () => {
121
121
 
122
122
  it("ON MATCH touches ONLY the prompt, name, description, version and updatedAt", () => {
123
123
  expect(new Set(propertiesSetIn("ON MATCH SET"))).toEqual(
124
- new Set(["agentPrompt", "name", "routineDescription", "routineTemplateVersion", "updatedAt"]),
124
+ new Set(["agentPrompt", "name", "description", "routineTemplateVersion", "updatedAt"]),
125
125
  );
126
126
  });
127
127
 
128
- it("ON MATCH writes the description unconditionally, not only when refreshing", () => {
129
- // Task 2214. The description is roster-owned and absent from the routines
130
- // PATCH field set, so there is no operator edit for this to clobber.
131
- // Gating it on `refreshing` would leave every operator-edited row without
132
- // a description permanently: `skip-operator-edited` takes neither branch,
133
- // so its card would show a title and nothing else, for ever.
128
+ it("ON MATCH writes the description only when refreshing, exactly as the prompt and name are", () => {
129
+ // The 2214 shape wrote it on every match, because gating it would have left
130
+ // every operator-edited row description-less for ever: skip-operator-edited
131
+ // takes neither branch. Task 2361's one-shot convergence removes that
132
+ // argument by giving every pre-existing row a description before the first
133
+ // guarded MERGE runs, and from here the description is operator-writable, so
134
+ // an unconditional write would clobber the operator's own text on every
135
+ // upgrade.
134
136
  const start = MERGE_CYPHER.indexOf("ON MATCH SET");
135
137
  const body = MERGE_CYPHER.slice(start, MERGE_CYPHER.indexOf("RETURN"));
136
- expect(body).toContain("e.routineDescription = row.description");
137
- expect(body).not.toContain("e.routineDescription = CASE");
138
+ expect(body).toContain(
139
+ "e.description = CASE WHEN refreshing THEN row.description ELSE e.description END",
140
+ );
141
+ expect(body).not.toContain("e.routineDescription");
138
142
  });
139
143
 
140
144
  it("verify counts the descriptions the graph actually holds", () => {
@@ -142,7 +146,7 @@ describe("MERGE statement shape", () => {
142
146
  // MERGE succeeds, every action reads `refresh-version`, and the property
143
147
  // is simply absent. `expected` and `actual` agree in that state.
144
148
  expect(VERIFY_CYPHER).toContain(
145
- "sum(CASE WHEN e.routineDescription IS NULL THEN 1 ELSE 0 END) AS descNull",
149
+ "sum(CASE WHEN e.description IS NULL THEN 1 ELSE 0 END) AS descNull",
146
150
  );
147
151
  });
148
152
 
@@ -71,13 +71,14 @@ export interface RoutineVerifyCounts {
71
71
  actual: number;
72
72
  suspended: number;
73
73
  nextRunNull: number;
74
- /** Task 2214 — roster rows holding no description. Zero is the healthy value
75
- * on every account, not only a fresh one: `VERIFY_CYPHER` matches
76
- * `routineTemplate IS NOT NULL`, so operator-created routines are outside
77
- * its scope and cannot contribute, and `ON MATCH` writes the description
78
- * unconditionally, so an operator-edited row is covered too. Anything above
79
- * zero while `expected === actual` is a MERGE that wrote no description
80
- * the one failure here that emits no error and does not reproduce. */
74
+ /** Roster rows holding no description. Zero is the healthy value on every
75
+ * account, not only a fresh one: `VERIFY_CYPHER` matches `routineTemplate IS
76
+ * NOT NULL`, so operator-created routines are outside its scope and cannot
77
+ * contribute. Anything above zero while `expected === actual` is a MERGE that
78
+ * wrote no description on create, or a row whose key left the roster before
79
+ * the convergence ran the one failure here that emits no error and does not
80
+ * reproduce. `[schedule-audit] op=description-coverage` is the wider twin,
81
+ * over every automation row rather than the roster alone. */
81
82
  descNull: number;
82
83
  }
83
84
 
@@ -154,13 +155,18 @@ export async function resolveOwnerTimezone(
154
155
  * destination, or reset a retimed cron. Only the prompt, the name and the
155
156
  * version move, and only when the row is behind and unedited.
156
157
  *
157
- * `routineDescription` (Task 2214) is the one property ON MATCH writes on
158
- * every match rather than only on the refresh branch, and that is not an
159
- * exception to the rule above. It is roster-owned: the routines route projects
160
- * it but its PATCH field set refuses it, so no operator edit exists for this
161
- * to overwrite. Gating it on `refreshing` would leave every operator-edited
162
- * row description-less permanently, because `skip-operator-edited` takes
163
- * neither branch, and that row's card would show a title and nothing else. */
158
+ * `description` (Task 2361) is guarded exactly as the prompt and the name are,
159
+ * and that is a change of shape from Task 2214, which introduced it. It used to
160
+ * be written on every match, on the grounds that it was roster-owned and the
161
+ * routines PATCH refused it, so no operator edit existed for the seed to
162
+ * clobber, and that gating it would leave every operator-edited row
163
+ * description-less permanently because `skip-operator-edited` takes neither
164
+ * branch. Both halves of that argument are gone. The routines PATCH now accepts
165
+ * `description` and stamps `operatorEdited`, so an unconditional write would
166
+ * destroy the operator's own caption on the next version bump; and the
167
+ * scheduling plugin's one-shot `converge-routine-description` has already given
168
+ * every pre-existing row a description, so no row is left holding only a
169
+ * title. */
164
170
  export const MERGE_CYPHER = `
165
171
  UNWIND $rows AS row
166
172
  OPTIONAL MATCH (pre:Event {accountId: $accountId, routineTemplate: row.key})
@@ -173,7 +179,7 @@ WITH row, existed, priorVersion, edited,
173
179
  MERGE (e:Event {accountId: $accountId, routineTemplate: row.key})
174
180
  ON CREATE SET e.eventId = randomUUID(),
175
181
  e.name = row.name,
176
- e.routineDescription = row.description,
182
+ e.description = row.description,
177
183
  e.agentPrompt = row.prompt,
178
184
  e.recurrence = row.recurrence,
179
185
  e.routineTemplateVersion = $version,
@@ -193,7 +199,7 @@ MERGE (e:Event {accountId: $accountId, routineTemplate: row.key})
193
199
  e.updatedAt = $now
194
200
  ON MATCH SET e.agentPrompt = CASE WHEN refreshing THEN row.prompt ELSE e.agentPrompt END,
195
201
  e.name = CASE WHEN refreshing THEN row.name ELSE e.name END,
196
- e.routineDescription = row.description,
202
+ e.description = CASE WHEN refreshing THEN row.description ELSE e.description END,
197
203
  e.routineTemplateVersion = CASE WHEN refreshing THEN $version ELSE e.routineTemplateVersion END,
198
204
  e.updatedAt = CASE WHEN refreshing THEN $now ELSE e.updatedAt END
199
205
  RETURN row.key AS key,
@@ -211,7 +217,7 @@ WHERE e.routineTemplate IS NOT NULL
211
217
  RETURN count(e) AS actual,
212
218
  sum(CASE WHEN e.eventStatus = 'suspended' THEN 1 ELSE 0 END) AS suspended,
213
219
  sum(CASE WHEN e.nextRun IS NULL THEN 1 ELSE 0 END) AS nextRunNull,
214
- sum(CASE WHEN e.routineDescription IS NULL THEN 1 ELSE 0 END) AS descNull`;
220
+ sum(CASE WHEN e.description IS NULL THEN 1 ELSE 0 END) AS descNull`;
215
221
 
216
222
  export interface SeedRoutineRosterArgs {
217
223
  session: SeedSessionLike;
@@ -45,9 +45,9 @@ export interface RoutineTemplate {
45
45
  /** The title shown on `/routines`. */
46
46
  readonly name: string;
47
47
  /** One sentence under the title on the card: what this does and what it will
48
- * not do. Roster-owned and read-only projected by the routines route but
49
- * absent from its PATCH field set, so no operator edit exists for the seed to
50
- * overwrite and the MERGE rewrites it on every match. */
48
+ * not do. Seeded onto `e.description`, which the operator can then edit from
49
+ * the routines page. The seed rewrites it only on a version refresh of an
50
+ * unedited row, so an operator's own wording survives every upgrade. */
51
51
  readonly description: string;
52
52
  /** The proposed cron. Written ON CREATE only, never refreshed, so an operator
53
53
  * who retimes a routine keeps their expression across upgrades. */
@@ -26,6 +26,7 @@ import { resolvePublicHostname } from "./lib/public-hostname.js";
26
26
  import { resolveAdminHostname } from "./lib/admin-hostname.js";
27
27
  import { publishSite } from "./tools/publish-site.js";
28
28
  import { createAgent, updateAgent, projectAgentViaPlatform } from "./tools/agent-write.js";
29
+ import { checkDefaultAgent } from "./tools/account-default-agent.js";
29
30
  import { resolveCapabilitiesHere } from "./tools/capabilities-here.js";
30
31
  import { resolveIngestToken } from "./tools/linkedin-ingest-token.js";
31
32
  import { startCpuTriage, readCpuTriage } from "./tools/cpu-triage.js";
@@ -787,19 +788,30 @@ eagerTool(server, "account-update", "Update a user-configurable setting in accou
787
788
  thinkingView: ["default", "expanded", "collapsed"],
788
789
  effort: ["low", "medium", "high", "max", "auto"],
789
790
  };
790
- // defaultAgent: non-empty slug must reference an existing agent; empty string clears the field
791
+ // defaultAgent: non-empty slug must be slug-shaped AND reference an existing
792
+ // agent; empty string clears the field.
793
+ //
794
+ // Task 2347 — shape before existence. The stored value is read back by
795
+ // resolveDefaultAgentSlug and handed to readAgentFile, which interpolates
796
+ // it into a path; a traversal value's config.json exists on any
797
+ // multi-account install, so existence alone stored a path that led out of
798
+ // the account directory.
799
+ // `defaultAgentSlug` is the canonical value to store: the verdict's trimmed
800
+ // slug, empty for the clear operation. Storing the raw `value` instead
801
+ // would let `" sales "` be accepted here and then refused by the read
802
+ // door's shape rule, which sees the untrimmed string.
803
+ let defaultAgentSlug = "";
791
804
  if (field === "defaultAgent") {
792
- const slug = value.trim();
793
- if (slug) {
794
- const agentConfigPath = join(getAccountDir(), "agents", slug, "config.json");
795
- if (!existsSync(agentConfigPath)) {
796
- return {
797
- content: [{ type: "text", text: `Agent '${slug}' not found no config.json in agents/${slug}/` }],
798
- isError: true,
799
- };
800
- }
805
+ const verdict = checkDefaultAgent(getAccountDir(), value);
806
+ if (!verdict.ok) {
807
+ const slug = value.trim();
808
+ console.error(`[admin:account-update] rejected field=defaultAgent value="${value}" reason=${verdict.reason}`);
809
+ const text = verdict.reason === "shape"
810
+ ? `Invalid agent slug "${slug}" — must be lowercase, start with a letter, and be 3 to 50 characters with no path separators.`
811
+ : `Agent '${slug}' not found — no config.json in agents/${slug}/`;
812
+ return { content: [{ type: "text", text }], isError: true };
801
813
  }
802
- // empty slug is valid — handled below as a delete operation
814
+ defaultAgentSlug = verdict.slug;
803
815
  }
804
816
  // Model fields accept any non-empty string (model IDs change frequently)
805
817
  const FREE_FORM_FIELDS = ["adminModel", "publicModel"];
@@ -822,22 +834,26 @@ eagerTool(server, "account-update", "Update a user-configurable setting in accou
822
834
  const configPath = join(getAccountDir(), "account.json");
823
835
  const config = await readAccountConfig();
824
836
  const oldDefault = field === "defaultAgent" ? config.defaultAgent ?? "(none)" : undefined;
825
- if (field === "defaultAgent" && !value.trim()) {
826
- delete config.defaultAgent;
837
+ if (field === "defaultAgent") {
838
+ if (defaultAgentSlug)
839
+ config.defaultAgent = defaultAgentSlug;
840
+ else
841
+ delete config.defaultAgent;
827
842
  }
828
843
  else {
829
844
  config[field] = value;
830
845
  }
846
+ const writtenValue = field === "defaultAgent" ? defaultAgentSlug : value;
831
847
  await writeFile(configPath, JSON.stringify(config, null, 2) + "\n", "utf-8");
832
- console.error(`[admin:account-update] wrote field=${field} value="${value}" path=${configPath}`);
848
+ console.error(`[admin:account-update] wrote field=${field} value="${writtenValue}" path=${configPath}`);
833
849
  if (field === "defaultAgent") {
834
- if (!value.trim()) {
850
+ if (!defaultAgentSlug) {
835
851
  return {
836
852
  content: [{ type: "text", text: `Default agent cleared (was "${oldDefault}"). Visitors to the root URL will see the first available agent, or a "no agents" message if none exist. Takes effect on next page load.` }],
837
853
  };
838
854
  }
839
855
  return {
840
- content: [{ type: "text", text: `Default agent changed from "${oldDefault}" to "${value}". Takes effect on next page load.` }],
856
+ content: [{ type: "text", text: `Default agent changed from "${oldDefault}" to "${defaultAgentSlug}". Takes effect on next page load.` }],
841
857
  };
842
858
  }
843
859
  return {