@rubytech/create-maxy-code 0.1.572 → 0.1.574

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 (423) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/config/brand.json +2 -2
  3. package/payload/platform/lib/admins-write/__tests__/index.test.ts +97 -0
  4. package/payload/platform/lib/admins-write/dist/index.d.ts +12 -0
  5. package/payload/platform/lib/admins-write/dist/index.d.ts.map +1 -1
  6. package/payload/platform/lib/admins-write/dist/index.js +27 -5
  7. package/payload/platform/lib/admins-write/dist/index.js.map +1 -1
  8. package/payload/platform/lib/admins-write/src/index.ts +35 -5
  9. package/payload/platform/lib/admins-write/vitest.config.ts +14 -0
  10. package/payload/platform/lib/dispatch-read/dist/session.d.ts.map +1 -1
  11. package/payload/platform/lib/dispatch-read/dist/session.js +19 -4
  12. package/payload/platform/lib/dispatch-read/dist/session.js.map +1 -1
  13. package/payload/platform/lib/dispatch-read/src/__tests__/session.test.ts +91 -0
  14. package/payload/platform/lib/dispatch-read/src/session.ts +25 -6
  15. package/payload/platform/lib/routine-templates/dist/index.d.ts +2 -2
  16. package/payload/platform/lib/routine-templates/dist/index.d.ts.map +1 -1
  17. package/payload/platform/lib/routine-templates/dist/index.js +9 -1
  18. package/payload/platform/lib/routine-templates/dist/index.js.map +1 -1
  19. package/payload/platform/lib/routine-templates/src/index.ts +14 -2
  20. package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
  21. package/payload/platform/plugins/admin/PLUGIN.md +8 -3
  22. package/payload/platform/plugins/admin/hooks/__tests__/html-structure-gate.test.sh +264 -0
  23. package/payload/platform/plugins/admin/hooks/__tests__/quote-render-pdf-conformance.test.sh +122 -24
  24. package/payload/platform/plugins/admin/hooks/__tests__/specialist-dispatch-gate.test.sh +158 -0
  25. package/payload/platform/plugins/admin/hooks/html-structure-gate.sh +165 -0
  26. package/payload/platform/plugins/admin/hooks/quote-render-pdf-conformance.sh +111 -19
  27. package/payload/platform/plugins/admin/hooks/specialist-dispatch-gate.sh +159 -0
  28. package/payload/platform/plugins/admin/mcp/dist/admin-bind-classify.d.ts +27 -0
  29. package/payload/platform/plugins/admin/mcp/dist/admin-bind-classify.d.ts.map +1 -0
  30. package/payload/platform/plugins/admin/mcp/dist/admin-bind-classify.js +29 -0
  31. package/payload/platform/plugins/admin/mcp/dist/admin-bind-classify.js.map +1 -0
  32. package/payload/platform/plugins/admin/mcp/dist/binding-validate.d.ts +11 -0
  33. package/payload/platform/plugins/admin/mcp/dist/binding-validate.d.ts.map +1 -0
  34. package/payload/platform/plugins/admin/mcp/dist/binding-validate.js +20 -0
  35. package/payload/platform/plugins/admin/mcp/dist/binding-validate.js.map +1 -0
  36. package/payload/platform/plugins/admin/mcp/dist/index.js +137 -2
  37. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  38. package/payload/platform/plugins/admin/skills/admin-user-management/SKILL.md +32 -2
  39. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +192 -90
  40. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +18 -0
  41. package/payload/platform/plugins/docs/references/admin-ui.md +71 -31
  42. package/payload/platform/plugins/docs/references/channel-wake-and-prompt.md +50 -57
  43. package/payload/platform/plugins/docs/references/internals.md +6 -0
  44. package/payload/platform/plugins/docs/references/outlook-guide.md +31 -1
  45. package/payload/platform/plugins/docs/references/telegram-guide.md +23 -0
  46. package/payload/platform/plugins/docs/references/troubleshooting.md +10 -0
  47. package/payload/platform/plugins/email/PLUGIN.md +1 -1
  48. package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft-send.test.js +36 -5
  49. package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft-send.test.js.map +1 -1
  50. package/payload/platform/plugins/email/mcp/dist/__tests__/imap-drafts.test.js +10 -5
  51. package/payload/platform/plugins/email/mcp/dist/__tests__/imap-drafts.test.js.map +1 -1
  52. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +12 -6
  53. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts.map +1 -1
  54. package/payload/platform/plugins/email/mcp/dist/lib/imap.js +18 -8
  55. package/payload/platform/plugins/email/mcp/dist/lib/imap.js.map +1 -1
  56. package/payload/platform/plugins/email/mcp/dist/tools/email-draft-send.d.ts.map +1 -1
  57. package/payload/platform/plugins/email/mcp/dist/tools/email-draft-send.js +41 -10
  58. package/payload/platform/plugins/email/mcp/dist/tools/email-draft-send.js.map +1 -1
  59. package/payload/platform/plugins/email/references/email-reference.md +12 -0
  60. package/payload/platform/plugins/outlook/PLUGIN.md +3 -1
  61. package/payload/platform/plugins/outlook/mcp/dist/__tests__/draft-ledger-write-sites.test.d.ts +2 -0
  62. package/payload/platform/plugins/outlook/mcp/dist/__tests__/draft-ledger-write-sites.test.d.ts.map +1 -0
  63. package/payload/platform/plugins/outlook/mcp/dist/__tests__/draft-ledger-write-sites.test.js +177 -0
  64. package/payload/platform/plugins/outlook/mcp/dist/__tests__/draft-ledger-write-sites.test.js.map +1 -0
  65. package/payload/platform/plugins/outlook/mcp/dist/__tests__/draft-ledger.test.d.ts +2 -0
  66. package/payload/platform/plugins/outlook/mcp/dist/__tests__/draft-ledger.test.d.ts.map +1 -0
  67. package/payload/platform/plugins/outlook/mcp/dist/__tests__/draft-ledger.test.js +130 -0
  68. package/payload/platform/plugins/outlook/mcp/dist/__tests__/draft-ledger.test.js.map +1 -0
  69. package/payload/platform/plugins/outlook/mcp/dist/__tests__/draft-reconcile.test.d.ts +2 -0
  70. package/payload/platform/plugins/outlook/mcp/dist/__tests__/draft-reconcile.test.d.ts.map +1 -0
  71. package/payload/platform/plugins/outlook/mcp/dist/__tests__/draft-reconcile.test.js +162 -0
  72. package/payload/platform/plugins/outlook/mcp/dist/__tests__/draft-reconcile.test.js.map +1 -0
  73. package/payload/platform/plugins/outlook/mcp/dist/__tests__/draft-state-fields.test.d.ts +2 -0
  74. package/payload/platform/plugins/outlook/mcp/dist/__tests__/draft-state-fields.test.d.ts.map +1 -0
  75. package/payload/platform/plugins/outlook/mcp/dist/__tests__/draft-state-fields.test.js +168 -0
  76. package/payload/platform/plugins/outlook/mcp/dist/__tests__/draft-state-fields.test.js.map +1 -0
  77. package/payload/platform/plugins/outlook/mcp/dist/lib/draft-ledger.d.ts +64 -0
  78. package/payload/platform/plugins/outlook/mcp/dist/lib/draft-ledger.d.ts.map +1 -0
  79. package/payload/platform/plugins/outlook/mcp/dist/lib/draft-ledger.js +110 -0
  80. package/payload/platform/plugins/outlook/mcp/dist/lib/draft-ledger.js.map +1 -0
  81. package/payload/platform/plugins/outlook/mcp/dist/lib/draft-reconcile.d.ts +119 -0
  82. package/payload/platform/plugins/outlook/mcp/dist/lib/draft-reconcile.d.ts.map +1 -0
  83. package/payload/platform/plugins/outlook/mcp/dist/lib/draft-reconcile.js +0 -0
  84. package/payload/platform/plugins/outlook/mcp/dist/lib/draft-reconcile.js.map +1 -0
  85. package/payload/platform/plugins/outlook/mcp/dist/scripts/draft-reconcile.d.ts +8 -0
  86. package/payload/platform/plugins/outlook/mcp/dist/scripts/draft-reconcile.d.ts.map +1 -0
  87. package/payload/platform/plugins/outlook/mcp/dist/scripts/draft-reconcile.js +247 -0
  88. package/payload/platform/plugins/outlook/mcp/dist/scripts/draft-reconcile.js.map +1 -0
  89. package/payload/platform/plugins/outlook/mcp/dist/tools/draft-send.d.ts.map +1 -1
  90. package/payload/platform/plugins/outlook/mcp/dist/tools/draft-send.js +10 -0
  91. package/payload/platform/plugins/outlook/mcp/dist/tools/draft-send.js.map +1 -1
  92. package/payload/platform/plugins/outlook/mcp/dist/tools/draft.d.ts.map +1 -1
  93. package/payload/platform/plugins/outlook/mcp/dist/tools/draft.js +21 -0
  94. package/payload/platform/plugins/outlook/mcp/dist/tools/draft.js.map +1 -1
  95. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-fetch-body.d.ts +16 -0
  96. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-fetch-body.d.ts.map +1 -1
  97. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-fetch-body.js +5 -1
  98. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-fetch-body.js.map +1 -1
  99. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-list.d.ts +4 -0
  100. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-list.d.ts.map +1 -1
  101. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-list.js +2 -1
  102. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-list.js.map +1 -1
  103. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-reply.d.ts.map +1 -1
  104. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-reply.js +24 -0
  105. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-reply.js.map +1 -1
  106. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-search.d.ts.map +1 -1
  107. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-search.js +2 -1
  108. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-search.js.map +1 -1
  109. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-send.d.ts.map +1 -1
  110. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-send.js +29 -0
  111. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-send.js.map +1 -1
  112. package/payload/platform/plugins/scheduling/PLUGIN.md +4 -0
  113. package/payload/platform/plugins/scheduling/mcp/dist/__tests__/draft-reconcile-throttle.test.d.ts +2 -0
  114. package/payload/platform/plugins/scheduling/mcp/dist/__tests__/draft-reconcile-throttle.test.d.ts.map +1 -0
  115. package/payload/platform/plugins/scheduling/mcp/dist/__tests__/draft-reconcile-throttle.test.js +21 -0
  116. package/payload/platform/plugins/scheduling/mcp/dist/__tests__/draft-reconcile-throttle.test.js.map +1 -0
  117. package/payload/platform/plugins/scheduling/mcp/dist/lib/draft-reconcile-throttle.d.ts +13 -0
  118. package/payload/platform/plugins/scheduling/mcp/dist/lib/draft-reconcile-throttle.d.ts.map +1 -0
  119. package/payload/platform/plugins/scheduling/mcp/dist/lib/draft-reconcile-throttle.js +10 -0
  120. package/payload/platform/plugins/scheduling/mcp/dist/lib/draft-reconcile-throttle.js.map +1 -0
  121. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +54 -0
  122. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
  123. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js +78 -5
  124. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js.map +1 -1
  125. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js +133 -2
  126. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js.map +1 -1
  127. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts +11 -0
  128. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts.map +1 -1
  129. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +30 -1
  130. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
  131. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
  132. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +8 -0
  133. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
  134. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts.map +1 -1
  135. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js +37 -6
  136. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js.map +1 -1
  137. package/payload/platform/plugins/telegram/.claude-plugin/plugin.json +1 -1
  138. package/payload/platform/plugins/telegram/PLUGIN.md +14 -2
  139. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-census.test.d.ts +2 -0
  140. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-census.test.d.ts.map +1 -0
  141. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-census.test.js +77 -0
  142. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-census.test.js.map +1 -0
  143. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-guard.test.d.ts +2 -0
  144. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-guard.test.d.ts.map +1 -0
  145. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-guard.test.js +49 -0
  146. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-guard.test.js.map +1 -0
  147. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-methods.test.d.ts +2 -0
  148. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-methods.test.d.ts.map +1 -0
  149. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-methods.test.js +25 -0
  150. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-methods.test.js.map +1 -0
  151. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-tool.test.d.ts +2 -0
  152. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-tool.test.d.ts.map +1 -0
  153. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-tool.test.js +115 -0
  154. package/payload/platform/plugins/telegram/mcp/dist/__tests__/api-tool.test.js.map +1 -0
  155. package/payload/platform/plugins/telegram/mcp/dist/__tests__/bot-api.test.d.ts +2 -0
  156. package/payload/platform/plugins/telegram/mcp/dist/__tests__/bot-api.test.d.ts.map +1 -0
  157. package/payload/platform/plugins/telegram/mcp/dist/__tests__/bot-api.test.js +83 -0
  158. package/payload/platform/plugins/telegram/mcp/dist/__tests__/bot-api.test.js.map +1 -0
  159. package/payload/platform/plugins/telegram/mcp/dist/index.js +42 -0
  160. package/payload/platform/plugins/telegram/mcp/dist/index.js.map +1 -1
  161. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.d.ts +32 -0
  162. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.d.ts.map +1 -0
  163. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.js +59 -0
  164. package/payload/platform/plugins/telegram/mcp/dist/lib/api-census.js.map +1 -0
  165. package/payload/platform/plugins/telegram/mcp/dist/lib/api-guard.d.ts +18 -0
  166. package/payload/platform/plugins/telegram/mcp/dist/lib/api-guard.d.ts.map +1 -0
  167. package/payload/platform/plugins/telegram/mcp/dist/lib/api-guard.js +35 -0
  168. package/payload/platform/plugins/telegram/mcp/dist/lib/api-guard.js.map +1 -0
  169. package/payload/platform/plugins/telegram/mcp/dist/lib/api-methods.d.ts +38 -0
  170. package/payload/platform/plugins/telegram/mcp/dist/lib/api-methods.d.ts.map +1 -0
  171. package/payload/platform/plugins/telegram/mcp/dist/lib/api-methods.js +21 -0
  172. package/payload/platform/plugins/telegram/mcp/dist/lib/api-methods.js.map +1 -0
  173. package/payload/platform/plugins/telegram/mcp/dist/lib/bot-api.d.ts +24 -0
  174. package/payload/platform/plugins/telegram/mcp/dist/lib/bot-api.d.ts.map +1 -0
  175. package/payload/platform/plugins/telegram/mcp/dist/lib/bot-api.js +57 -0
  176. package/payload/platform/plugins/telegram/mcp/dist/lib/bot-api.js.map +1 -0
  177. package/payload/platform/plugins/telegram/mcp/dist/tools/api-census.d.ts +16 -0
  178. package/payload/platform/plugins/telegram/mcp/dist/tools/api-census.d.ts.map +1 -0
  179. package/payload/platform/plugins/telegram/mcp/dist/tools/api-census.js +34 -0
  180. package/payload/platform/plugins/telegram/mcp/dist/tools/api-census.js.map +1 -0
  181. package/payload/platform/plugins/telegram/mcp/dist/tools/api.d.ts +26 -0
  182. package/payload/platform/plugins/telegram/mcp/dist/tools/api.d.ts.map +1 -0
  183. package/payload/platform/plugins/telegram/mcp/dist/tools/api.js +80 -0
  184. package/payload/platform/plugins/telegram/mcp/dist/tools/api.js.map +1 -0
  185. package/payload/platform/plugins/telegram/skills/build/SKILL.md +110 -0
  186. package/payload/platform/plugins/telegram/skills/build/references/methods.md +219 -0
  187. package/payload/platform/scripts/check-no-esm-require.mjs +4 -0
  188. package/payload/platform/services/claude-session-manager/dist/authored-specialist-tools.d.ts +32 -0
  189. package/payload/platform/services/claude-session-manager/dist/authored-specialist-tools.d.ts.map +1 -0
  190. package/payload/platform/services/claude-session-manager/dist/authored-specialist-tools.js +144 -0
  191. package/payload/platform/services/claude-session-manager/dist/authored-specialist-tools.js.map +1 -0
  192. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  193. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +3 -0
  194. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  195. package/payload/platform/services/claude-session-manager/dist/html-structure-census.d.ts +44 -0
  196. package/payload/platform/services/claude-session-manager/dist/html-structure-census.d.ts.map +1 -0
  197. package/payload/platform/services/claude-session-manager/dist/html-structure-census.js +185 -0
  198. package/payload/platform/services/claude-session-manager/dist/html-structure-census.js.map +1 -0
  199. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  200. package/payload/platform/services/claude-session-manager/dist/http-server.js +32 -5
  201. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  202. package/payload/platform/services/claude-session-manager/dist/index.js +125 -0
  203. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  204. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +12 -1
  205. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  206. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +13 -1
  207. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  208. package/payload/platform/services/claude-session-manager/dist/quote-delivery-reconcile.d.ts.map +1 -1
  209. package/payload/platform/services/claude-session-manager/dist/quote-delivery-reconcile.js +7 -0
  210. package/payload/platform/services/claude-session-manager/dist/quote-delivery-reconcile.js.map +1 -1
  211. package/payload/platform/services/claude-session-manager/dist/quote-print-census.d.ts +42 -0
  212. package/payload/platform/services/claude-session-manager/dist/quote-print-census.d.ts.map +1 -0
  213. package/payload/platform/services/claude-session-manager/dist/quote-print-census.js +254 -0
  214. package/payload/platform/services/claude-session-manager/dist/quote-print-census.js.map +1 -0
  215. package/payload/platform/services/claude-session-manager/dist/specialist-census.d.ts +92 -0
  216. package/payload/platform/services/claude-session-manager/dist/specialist-census.d.ts.map +1 -0
  217. package/payload/platform/services/claude-session-manager/dist/specialist-census.js +227 -0
  218. package/payload/platform/services/claude-session-manager/dist/specialist-census.js.map +1 -0
  219. package/payload/platform/services/telegram-channel/dist/jsonl.d.ts +8 -0
  220. package/payload/platform/services/telegram-channel/dist/jsonl.d.ts.map +1 -0
  221. package/payload/platform/services/telegram-channel/dist/jsonl.js +42 -0
  222. package/payload/platform/services/telegram-channel/dist/jsonl.js.map +1 -0
  223. package/payload/platform/services/telegram-channel/dist/notification.d.ts +0 -31
  224. package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
  225. package/payload/platform/services/telegram-channel/dist/notification.js +4 -33
  226. package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
  227. package/payload/platform/services/telegram-channel/dist/server.d.ts +0 -5
  228. package/payload/platform/services/telegram-channel/dist/server.d.ts.map +1 -1
  229. package/payload/platform/services/telegram-channel/dist/server.js +7 -101
  230. package/payload/platform/services/telegram-channel/dist/server.js.map +1 -1
  231. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +0 -66
  232. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  233. package/payload/platform/services/whatsapp-channel/dist/notification.js +2 -64
  234. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  235. package/payload/platform/services/whatsapp-channel/dist/server.d.ts +0 -12
  236. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  237. package/payload/platform/services/whatsapp-channel/dist/server.js +15 -268
  238. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  239. package/payload/platform/templates/account-settings.json +8 -4
  240. package/payload/server/public/activity.html +6 -6
  241. package/payload/server/public/agents.html +5 -5
  242. package/payload/server/public/assets/{AdminLoginScreens-CMdj1W5p.js → AdminLoginScreens-Dp6k1XgD.js} +1 -1
  243. package/payload/server/public/assets/AdminLoginScreens-Dp6k1XgD.js.br +0 -0
  244. package/payload/server/public/assets/AdminLoginScreens-Dp6k1XgD.js.gz +0 -0
  245. package/payload/server/public/assets/{AdminShell-CZcaW3BQ.js → AdminShell-D-wB90c3.js} +1 -1
  246. package/payload/server/public/assets/AdminShell-D-wB90c3.js.br +0 -0
  247. package/payload/server/public/assets/AdminShell-D-wB90c3.js.gz +0 -0
  248. package/payload/server/public/assets/{activity-CAhibgb-.js → activity-BJxhblz-.js} +1 -1
  249. package/payload/server/public/assets/activity-BJxhblz-.js.br +0 -0
  250. package/payload/server/public/assets/activity-BJxhblz-.js.gz +0 -0
  251. package/payload/server/public/assets/{admin-xEXv3w9e.js → admin-DzEi8shs.js} +1 -1
  252. package/payload/server/public/assets/admin-DzEi8shs.js.br +0 -0
  253. package/payload/server/public/assets/admin-DzEi8shs.js.gz +0 -0
  254. package/payload/server/public/assets/{agents-CiAmzTaT.js → agents-DTL8kjfD.js} +1 -1
  255. package/payload/server/public/assets/agents-DTL8kjfD.js.br +0 -0
  256. package/payload/server/public/assets/agents-DTL8kjfD.js.gz +0 -0
  257. package/payload/server/public/assets/{browser-D36BiYhS.js → browser-UZp75zhx.js} +1 -1
  258. package/payload/server/public/assets/browser-UZp75zhx.js.br +0 -0
  259. package/payload/server/public/assets/browser-UZp75zhx.js.gz +0 -0
  260. package/payload/server/public/assets/{calendar-CJAM-iXn.js → calendar-Dfo0O2K_.js} +1 -1
  261. package/payload/server/public/assets/calendar-Dfo0O2K_.js.br +0 -0
  262. package/payload/server/public/assets/calendar-Dfo0O2K_.js.gz +0 -0
  263. package/payload/server/public/assets/chat-ByJAvEWZ.js +1 -0
  264. package/payload/server/public/assets/chat-ByJAvEWZ.js.br +0 -0
  265. package/payload/server/public/assets/chat-ByJAvEWZ.js.gz +0 -0
  266. package/payload/server/public/assets/chevron-left-iG7sYNm7.js +1 -0
  267. package/payload/server/public/assets/chevron-left-iG7sYNm7.js.br +0 -0
  268. package/payload/server/public/assets/clock-xSs0UF10.js +1 -0
  269. package/payload/server/public/assets/clock-xSs0UF10.js.br +0 -0
  270. package/payload/server/public/assets/clock-xSs0UF10.js.gz +0 -0
  271. package/payload/server/public/assets/{copy-axBe92iY.js → copy-CGI2jioK.js} +1 -1
  272. package/payload/server/public/assets/copy-CGI2jioK.js.br +0 -0
  273. package/payload/server/public/assets/copy-CGI2jioK.js.gz +0 -0
  274. package/payload/server/public/assets/data-dvwK4BcP.js +1 -0
  275. package/payload/server/public/assets/data-dvwK4BcP.js.br +0 -0
  276. package/payload/server/public/assets/data-dvwK4BcP.js.gz +0 -0
  277. package/payload/server/public/assets/{dispatch-D_i2ko7K.js → dispatch-Dx9-ty1K.js} +1 -1
  278. package/payload/server/public/assets/dispatch-Dx9-ty1K.js.br +0 -0
  279. package/payload/server/public/assets/dispatch-Dx9-ty1K.js.gz +0 -0
  280. package/payload/server/public/assets/{field-DFgkqq1P.js → field-D-P6CsWA.js} +1 -1
  281. package/payload/server/public/assets/field-D-P6CsWA.js.br +0 -0
  282. package/payload/server/public/assets/field-D-P6CsWA.js.gz +0 -0
  283. package/payload/server/public/assets/{file-text-CEFoq0Je.js → file-text-RWintp9q.js} +1 -1
  284. package/payload/server/public/assets/file-text-RWintp9q.js.br +0 -0
  285. package/payload/server/public/assets/file-text-RWintp9q.js.gz +0 -0
  286. package/payload/server/public/assets/{graph-BrpbilNr.js → graph-CpBlfYrJ.js} +1 -1
  287. package/payload/server/public/assets/graph-CpBlfYrJ.js.br +0 -0
  288. package/payload/server/public/assets/graph-CpBlfYrJ.js.gz +0 -0
  289. package/payload/server/public/assets/{graph-labels-BtmcWzo7.js → graph-labels-BOMyPppX.js} +1 -1
  290. package/payload/server/public/assets/graph-labels-BOMyPppX.js.br +0 -0
  291. package/payload/server/public/assets/graph-labels-BOMyPppX.js.gz +0 -0
  292. package/payload/server/public/assets/jsx-runtime-DxsQ5Y-z.css +1 -0
  293. package/payload/server/public/assets/jsx-runtime-DxsQ5Y-z.css.br +0 -0
  294. package/payload/server/public/assets/jsx-runtime-DxsQ5Y-z.css.gz +0 -0
  295. package/payload/server/public/assets/{operator-Dl7dJt1G.js → operator-DFgW6GiH.js} +1 -1
  296. package/payload/server/public/assets/operator-DFgW6GiH.js.br +0 -0
  297. package/payload/server/public/assets/operator-DFgW6GiH.js.gz +0 -0
  298. package/payload/server/public/assets/{page-nx31Ij0T.js → page-BRShHSH0.js} +1 -1
  299. package/payload/server/public/assets/page-BRShHSH0.js.br +0 -0
  300. package/payload/server/public/assets/page-BRShHSH0.js.gz +0 -0
  301. package/payload/server/public/assets/{page-zC66xzNT.js → page-BbBCu9iP.js} +5 -5
  302. package/payload/server/public/assets/page-BbBCu9iP.js.br +0 -0
  303. package/payload/server/public/assets/page-BbBCu9iP.js.gz +0 -0
  304. package/payload/server/public/assets/play-BJxUaf6-.js +1 -0
  305. package/payload/server/public/assets/play-BJxUaf6-.js.br +0 -0
  306. package/payload/server/public/assets/play-BJxUaf6-.js.gz +0 -0
  307. package/payload/server/public/assets/{public-DEKnH5Q0.js → public-DkObqkzL.js} +1 -1
  308. package/payload/server/public/assets/public-DkObqkzL.js.br +0 -0
  309. package/payload/server/public/assets/public-DkObqkzL.js.gz +0 -0
  310. package/payload/server/public/assets/{rotate-ccw-CBex8gon.js → rotate-ccw-DgMO69nh.js} +1 -1
  311. package/payload/server/public/assets/rotate-ccw-DgMO69nh.js.br +0 -0
  312. package/payload/server/public/assets/rotate-ccw-DgMO69nh.js.gz +0 -0
  313. package/payload/server/public/assets/routines-D9kvg_Xu.js +2 -0
  314. package/payload/server/public/assets/routines-D9kvg_Xu.js.br +0 -0
  315. package/payload/server/public/assets/routines-D9kvg_Xu.js.gz +0 -0
  316. package/payload/server/public/assets/{skills-BmxjPOmq.js → skills-l5I9HZ3D.js} +1 -1
  317. package/payload/server/public/assets/skills-l5I9HZ3D.js.br +0 -0
  318. package/payload/server/public/assets/skills-l5I9HZ3D.js.gz +0 -0
  319. package/payload/server/public/assets/{tasks-BTFYO9vT.js → tasks-C2qJMv6i.js} +1 -1
  320. package/payload/server/public/assets/tasks-C2qJMv6i.js.br +0 -0
  321. package/payload/server/public/assets/tasks-C2qJMv6i.js.gz +0 -0
  322. package/payload/server/public/assets/{triangle-alert-px1YRJJ7.js → triangle-alert-BnC67uSs.js} +1 -1
  323. package/payload/server/public/assets/triangle-alert-BnC67uSs.js.br +0 -0
  324. package/payload/server/public/assets/triangle-alert-BnC67uSs.js.gz +0 -0
  325. package/payload/server/public/assets/{useCopyFeedback-nMXwRcDX.js → useCopyFeedback-1RmgkTFh.js} +1 -1
  326. package/payload/server/public/assets/useCopyFeedback-1RmgkTFh.js.br +0 -0
  327. package/payload/server/public/assets/useCopyFeedback-1RmgkTFh.js.gz +0 -0
  328. package/payload/server/public/assets/{useMediaQuery-DjbOTk2X.js → useMediaQuery-BQslddHQ.js} +1 -1
  329. package/payload/server/public/assets/useMediaQuery-BQslddHQ.js.br +0 -0
  330. package/payload/server/public/assets/useMediaQuery-BQslddHQ.js.gz +0 -0
  331. package/payload/server/public/assets/{useVoiceRecorder-Cx7AOmib.js → useVoiceRecorder-BeZNQEC4.js} +1 -1
  332. package/payload/server/public/assets/useVoiceRecorder-BeZNQEC4.js.br +0 -0
  333. package/payload/server/public/assets/useVoiceRecorder-BeZNQEC4.js.gz +0 -0
  334. package/payload/server/public/assets/{wrench-Cexvlx6J.js → wrench-D4ufQG6C.js} +1 -1
  335. package/payload/server/public/assets/wrench-D4ufQG6C.js.br +0 -0
  336. package/payload/server/public/assets/wrench-D4ufQG6C.js.gz +0 -0
  337. package/payload/server/public/browser.html +5 -5
  338. package/payload/server/public/calendar.html +8 -8
  339. package/payload/server/public/chat.html +14 -14
  340. package/payload/server/public/data.html +12 -12
  341. package/payload/server/public/dispatch.html +5 -5
  342. package/payload/server/public/field.html +3 -3
  343. package/payload/server/public/graph.html +10 -10
  344. package/payload/server/public/index.html +14 -14
  345. package/payload/server/public/operator.html +16 -16
  346. package/payload/server/public/public.html +14 -14
  347. package/payload/server/public/routines.html +8 -8
  348. package/payload/server/public/skills.html +6 -6
  349. package/payload/server/public/tasks.html +7 -7
  350. package/payload/server/server.js +1088 -694
  351. package/payload/server/public/assets/AdminLoginScreens-CMdj1W5p.js.br +0 -0
  352. package/payload/server/public/assets/AdminLoginScreens-CMdj1W5p.js.gz +0 -0
  353. package/payload/server/public/assets/AdminShell-CZcaW3BQ.js.br +0 -0
  354. package/payload/server/public/assets/AdminShell-CZcaW3BQ.js.gz +0 -0
  355. package/payload/server/public/assets/activity-CAhibgb-.js.br +0 -0
  356. package/payload/server/public/assets/activity-CAhibgb-.js.gz +0 -0
  357. package/payload/server/public/assets/admin-xEXv3w9e.js.br +0 -0
  358. package/payload/server/public/assets/admin-xEXv3w9e.js.gz +0 -0
  359. package/payload/server/public/assets/agents-CiAmzTaT.js.br +0 -0
  360. package/payload/server/public/assets/agents-CiAmzTaT.js.gz +0 -0
  361. package/payload/server/public/assets/browser-D36BiYhS.js.br +0 -0
  362. package/payload/server/public/assets/browser-D36BiYhS.js.gz +0 -0
  363. package/payload/server/public/assets/calendar-CJAM-iXn.js.br +0 -0
  364. package/payload/server/public/assets/calendar-CJAM-iXn.js.gz +0 -0
  365. package/payload/server/public/assets/chat-DhZSvtZK.js +0 -1
  366. package/payload/server/public/assets/chat-DhZSvtZK.js.br +0 -0
  367. package/payload/server/public/assets/chat-DhZSvtZK.js.gz +0 -0
  368. package/payload/server/public/assets/chevron-left-CXEcNlc3.js +0 -1
  369. package/payload/server/public/assets/chevron-left-CXEcNlc3.js.br +0 -0
  370. package/payload/server/public/assets/clock-DdxIJwTr.js +0 -1
  371. package/payload/server/public/assets/clock-DdxIJwTr.js.br +0 -0
  372. package/payload/server/public/assets/clock-DdxIJwTr.js.gz +0 -0
  373. package/payload/server/public/assets/copy-axBe92iY.js.br +0 -0
  374. package/payload/server/public/assets/copy-axBe92iY.js.gz +0 -0
  375. package/payload/server/public/assets/data-DUvkI-zq.js +0 -1
  376. package/payload/server/public/assets/data-DUvkI-zq.js.br +0 -0
  377. package/payload/server/public/assets/data-DUvkI-zq.js.gz +0 -0
  378. package/payload/server/public/assets/dispatch-D_i2ko7K.js.br +0 -0
  379. package/payload/server/public/assets/dispatch-D_i2ko7K.js.gz +0 -0
  380. package/payload/server/public/assets/field-DFgkqq1P.js.br +0 -0
  381. package/payload/server/public/assets/field-DFgkqq1P.js.gz +0 -0
  382. package/payload/server/public/assets/file-text-CEFoq0Je.js.br +0 -0
  383. package/payload/server/public/assets/file-text-CEFoq0Je.js.gz +0 -0
  384. package/payload/server/public/assets/graph-BrpbilNr.js.br +0 -0
  385. package/payload/server/public/assets/graph-BrpbilNr.js.gz +0 -0
  386. package/payload/server/public/assets/graph-labels-BtmcWzo7.js.br +0 -0
  387. package/payload/server/public/assets/graph-labels-BtmcWzo7.js.gz +0 -0
  388. package/payload/server/public/assets/jsx-runtime-XuYKjgVb.css +0 -1
  389. package/payload/server/public/assets/jsx-runtime-XuYKjgVb.css.br +0 -0
  390. package/payload/server/public/assets/jsx-runtime-XuYKjgVb.css.gz +0 -0
  391. package/payload/server/public/assets/operator-Dl7dJt1G.js.br +0 -3
  392. package/payload/server/public/assets/operator-Dl7dJt1G.js.gz +0 -0
  393. package/payload/server/public/assets/page-nx31Ij0T.js.br +0 -0
  394. package/payload/server/public/assets/page-nx31Ij0T.js.gz +0 -0
  395. package/payload/server/public/assets/page-zC66xzNT.js.br +0 -0
  396. package/payload/server/public/assets/page-zC66xzNT.js.gz +0 -0
  397. package/payload/server/public/assets/play-MbU8O2iC.js +0 -1
  398. package/payload/server/public/assets/play-MbU8O2iC.js.br +0 -0
  399. package/payload/server/public/assets/play-MbU8O2iC.js.gz +0 -0
  400. package/payload/server/public/assets/public-DEKnH5Q0.js.br +0 -0
  401. package/payload/server/public/assets/public-DEKnH5Q0.js.gz +0 -0
  402. package/payload/server/public/assets/rotate-ccw-CBex8gon.js.br +0 -0
  403. package/payload/server/public/assets/rotate-ccw-CBex8gon.js.gz +0 -0
  404. package/payload/server/public/assets/routines-BqCmbvFJ.js +0 -2
  405. package/payload/server/public/assets/routines-BqCmbvFJ.js.br +0 -0
  406. package/payload/server/public/assets/routines-BqCmbvFJ.js.gz +0 -0
  407. package/payload/server/public/assets/skills-BmxjPOmq.js.br +0 -0
  408. package/payload/server/public/assets/skills-BmxjPOmq.js.gz +0 -0
  409. package/payload/server/public/assets/tasks-BTFYO9vT.js.br +0 -0
  410. package/payload/server/public/assets/tasks-BTFYO9vT.js.gz +0 -0
  411. package/payload/server/public/assets/triangle-alert-px1YRJJ7.js.br +0 -0
  412. package/payload/server/public/assets/triangle-alert-px1YRJJ7.js.gz +0 -0
  413. package/payload/server/public/assets/useCopyFeedback-nMXwRcDX.js.br +0 -0
  414. package/payload/server/public/assets/useCopyFeedback-nMXwRcDX.js.gz +0 -0
  415. package/payload/server/public/assets/useMediaQuery-DjbOTk2X.js.br +0 -0
  416. package/payload/server/public/assets/useMediaQuery-DjbOTk2X.js.gz +0 -0
  417. package/payload/server/public/assets/useVoiceRecorder-Cx7AOmib.js.br +0 -0
  418. package/payload/server/public/assets/useVoiceRecorder-Cx7AOmib.js.gz +0 -0
  419. package/payload/server/public/assets/wrench-Cexvlx6J.js.br +0 -0
  420. package/payload/server/public/assets/wrench-Cexvlx6J.js.gz +0 -0
  421. /package/payload/server/public/assets/{jsx-runtime-C5Hcfj84.js → jsx-runtime-5lmxFBIw.js} +0 -0
  422. /package/payload/server/public/assets/{jsx-runtime-C5Hcfj84.js.br → jsx-runtime-5lmxFBIw.js.br} +0 -0
  423. /package/payload/server/public/assets/{jsx-runtime-C5Hcfj84.js.gz → jsx-runtime-5lmxFBIw.js.gz} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-maxy-code",
3
- "version": "0.1.572",
3
+ "version": "0.1.574",
4
4
  "description": "Install Maxy — AI for Productive People",
5
5
  "bin": {
6
6
  "create-maxy-code": "./dist/index.js"
@@ -72,7 +72,8 @@
72
72
  "contacts",
73
73
  "projects",
74
74
  "prompt-optimiser",
75
- "browser"
75
+ "browser",
76
+ "telegram"
76
77
  ],
77
78
  "defaultEnabled": [
78
79
  "business-assistant",
@@ -82,7 +83,6 @@
82
83
  "available": [
83
84
  "connector",
84
85
  "dispatch",
85
- "telegram",
86
86
  "deep-research",
87
87
  "whatsapp",
88
88
  "replicate",
@@ -207,3 +207,100 @@ describe('users-audit target attribution (Task 1573)', () => {
207
207
  expect(line).not.toContain('explicitUserId=')
208
208
  })
209
209
  })
210
+
211
+ describe('writeAdminEntry — channel bindings (Task 2531)', () => {
212
+ const rows = (usersFile: string) => JSON.parse(readFileSync(usersFile, 'utf-8')) as Array<Record<string, string>>
213
+
214
+ it('writes phone and telegram onto a new entry', () => {
215
+ const f = fixture({ users: [], admins: [] })
216
+ writeAdminEntry({
217
+ userId: 'bbbbbbbb-2', pin: 'hash', role: 'admin',
218
+ usersFile: f.usersFile, accountDir: f.accountDir, caller: 'admin-add',
219
+ audit: { actor: 'aaaaaaaa-1', logFile: f.logFile },
220
+ phone: '+447504472444', telegram: '1311221864',
221
+ })
222
+ const [row] = rows(f.usersFile)
223
+ expect(row.phone).toBe('+447504472444')
224
+ expect(row.telegram).toBe('1311221864')
225
+ })
226
+
227
+ it('sets one binding on an existing entry and leaves the other and the pin alone', () => {
228
+ const f = fixture({ users: [{ userId: 'bbbbbbbb-2', pin: 'h1' }], admins: [] })
229
+ writeAdminEntry({
230
+ userId: 'bbbbbbbb-2', pin: 'h1', role: 'admin',
231
+ usersFile: f.usersFile, accountDir: f.accountDir, caller: 'admin-bind',
232
+ audit: { actor: 'aaaaaaaa-1', logFile: f.logFile },
233
+ phone: '+447504472444', telegram: '1311221864',
234
+ })
235
+ writeAdminEntry({
236
+ userId: 'bbbbbbbb-2', pin: 'h1', role: 'admin',
237
+ usersFile: f.usersFile, accountDir: f.accountDir, caller: 'admin-bind',
238
+ audit: { actor: 'aaaaaaaa-1', logFile: f.logFile },
239
+ telegram: '9999',
240
+ })
241
+ const [row] = rows(f.usersFile)
242
+ expect(row.phone).toBe('+447504472444')
243
+ expect(row.telegram).toBe('9999')
244
+ expect(row.pin).toBe('h1')
245
+ })
246
+
247
+ it('audits a binding-only write as set-binding, never as a pin rotation', () => {
248
+ // admin-bind carries the EXISTING hash through so it rotates nothing. If the
249
+ // audit line still said action=set-pin the credential trail would record a
250
+ // rotation that did not happen, which is worse than no line at all.
251
+ const f = fixture({ users: [{ userId: 'bbbbbbbb-2', pin: 'h1' }], admins: [] })
252
+ writeAdminEntry({
253
+ userId: 'bbbbbbbb-2', pin: 'h1', role: 'admin',
254
+ usersFile: f.usersFile, accountDir: f.accountDir, caller: 'admin-bind',
255
+ audit: { actor: 'aaaaaaaa-1', logFile: f.logFile },
256
+ phone: '+447504472444',
257
+ })
258
+ const lines = readAudit(f.logFile)
259
+ expect(lines).toHaveLength(1)
260
+ expect(lines[0]).toContain('action=set-binding')
261
+ expect(lines[0]).toContain('field=phone')
262
+ expect(lines[0]).not.toContain('field=pin')
263
+ })
264
+
265
+ it('names both fields when both bindings are set at once', () => {
266
+ const f = fixture({ users: [{ userId: 'bbbbbbbb-2', pin: 'h1' }], admins: [] })
267
+ writeAdminEntry({
268
+ userId: 'bbbbbbbb-2', pin: 'h1', role: 'admin',
269
+ usersFile: f.usersFile, accountDir: f.accountDir, caller: 'admin-bind',
270
+ audit: { actor: 'aaaaaaaa-1', logFile: f.logFile },
271
+ phone: '+447504472444', telegram: '1311221864',
272
+ })
273
+ expect(readAudit(f.logFile)[0]).toContain('field=phone,telegram')
274
+ })
275
+
276
+ it('still audits a genuine pin rotation as set-pin even when a binding rides along', () => {
277
+ const f = fixture({ users: [{ userId: 'bbbbbbbb-2', pin: 'h1' }], admins: [] })
278
+ writeAdminEntry({
279
+ userId: 'bbbbbbbb-2', pin: 'h2', role: 'admin',
280
+ usersFile: f.usersFile, accountDir: f.accountDir, caller: 'test',
281
+ audit: { actor: 'aaaaaaaa-1', logFile: f.logFile },
282
+ phone: '+447504472444',
283
+ })
284
+ expect(readAudit(f.logFile)[0]).toContain('action=set-pin')
285
+ })
286
+
287
+ it('a write that supplies no binding does not erase an existing one', () => {
288
+ // The PIN-rotation path. Task 2531 requires that admin-update-pin can never
289
+ // silently clear a channel binding.
290
+ const f = fixture({ users: [{ userId: 'bbbbbbbb-2', pin: 'h1' }], admins: [] })
291
+ writeAdminEntry({
292
+ userId: 'bbbbbbbb-2', pin: 'h1', role: 'admin',
293
+ usersFile: f.usersFile, accountDir: f.accountDir, caller: 'admin-bind',
294
+ audit: { actor: 'aaaaaaaa-1', logFile: f.logFile },
295
+ phone: '+447504472444',
296
+ })
297
+ writeAdminEntry({
298
+ userId: 'bbbbbbbb-2', pin: 'h2', role: 'admin',
299
+ usersFile: f.usersFile, accountDir: f.accountDir, caller: 'admin-update-pin',
300
+ audit: { actor: 'aaaaaaaa-1', logFile: f.logFile },
301
+ })
302
+ const [row] = rows(f.usersFile)
303
+ expect(row.phone).toBe('+447504472444')
304
+ expect(row.pin).toBe('h2')
305
+ })
306
+ })
@@ -1,6 +1,13 @@
1
1
  export interface UserEntry {
2
2
  userId: string;
3
3
  pin: string;
4
+ /** Task 2531 — E.164 phone binding this person to their WhatsApp sender.
5
+ * Mirrors platform/ui/app/lib/admin-identity/pin-validator.ts, the record
6
+ * resolveAdminUserId actually reads. Its absence from THIS declaration is why
7
+ * the one writer could not set it and every admin was created unbound. */
8
+ phone?: string;
9
+ /** Task 2531 — the Telegram chat id, matched by exact string equality. */
10
+ telegram?: string;
4
11
  }
5
12
  /**
6
13
  * Identity + destination for one credential-store audit line. The writer is
@@ -50,6 +57,11 @@ export interface AdminWriteInput {
50
57
  accountDir: string;
51
58
  caller: string;
52
59
  audit: AuditContext;
60
+ /** Task 2531 — set when supplied; an unsupplied field is left untouched, so a
61
+ * PIN rotation can never erase a binding and binding one channel never
62
+ * clears the other. */
63
+ phone?: string;
64
+ telegram?: string;
53
65
  }
54
66
  export interface AdminWriteResult {
55
67
  usersJsonResult: "ok" | "fail" | "noop";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -110,19 +110,41 @@ function writeAdminEntry(input) {
110
110
  }
111
111
  const rowsBefore = users.map(u => id8(u.userId)).join(",");
112
112
  const existing = users.findIndex(u => u.userId === input.userId);
113
+ // Task 2531 — what this write actually changes, decided BEFORE the row is
114
+ // rewritten. admin-bind carries the existing hash through so it rotates
115
+ // nothing; auditing that as `set-pin` would record a credential rotation
116
+ // that did not happen, which is worse for an audit trail than no line.
117
+ const pinRotated = existing !== -1 && users[existing].pin !== input.pin;
118
+ const boundFields = [
119
+ input.phone !== undefined ? "phone" : null,
120
+ input.telegram !== undefined ? "telegram" : null,
121
+ ].filter(Boolean);
113
122
  if (existing === -1) {
114
- users.push({ userId: input.userId, pin: input.pin });
123
+ const row = { userId: input.userId, pin: input.pin };
124
+ if (input.phone !== undefined)
125
+ row.phone = input.phone;
126
+ if (input.telegram !== undefined)
127
+ row.telegram = input.telegram;
128
+ users.push(row);
115
129
  }
116
130
  else {
117
131
  // Preserve sibling fields other writers may have set; overwrite pin.
118
- users[existing] = { ...users[existing], pin: input.pin };
132
+ const row = { ...users[existing], pin: input.pin };
133
+ // Task 2531 — set only what this call supplied. An absent field is not an
134
+ // instruction to clear one.
135
+ if (input.phone !== undefined)
136
+ row.phone = input.phone;
137
+ if (input.telegram !== undefined)
138
+ row.telegram = input.telegram;
139
+ users[existing] = row;
119
140
  }
120
141
  writeFileAtomic(input.usersFile, JSON.stringify(users, null, 2) + "\n", 0o600);
121
142
  result.usersJsonResult = "ok";
122
- // A new userId is a row add; an existing userId is a pin rotation.
143
+ // A new userId is a row add. An existing userId is a pin rotation when the
144
+ // hash actually moved, and otherwise a binding write naming the fields set.
123
145
  appendUsersAuditLine(input.audit, {
124
- action: existing === -1 ? "add" : "set-pin",
125
- field: existing === -1 ? "row" : "pin",
146
+ action: existing === -1 ? "add" : pinRotated ? "set-pin" : "set-binding",
147
+ field: existing === -1 ? "row" : pinRotated ? "pin" : boundFields.join(","),
126
148
  rowsBefore,
127
149
  rowsAfter: users.map(u => id8(u.userId)).join(","),
128
150
  });
@@ -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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"}
@@ -25,6 +25,13 @@ import { dirname, join } from "node:path";
25
25
  export interface UserEntry {
26
26
  userId: string;
27
27
  pin: string; // SHA-256 hash
28
+ /** Task 2531 — E.164 phone binding this person to their WhatsApp sender.
29
+ * Mirrors platform/ui/app/lib/admin-identity/pin-validator.ts, the record
30
+ * resolveAdminUserId actually reads. Its absence from THIS declaration is why
31
+ * the one writer could not set it and every admin was created unbound. */
32
+ phone?: string;
33
+ /** Task 2531 — the Telegram chat id, matched by exact string equality. */
34
+ telegram?: string;
28
35
  }
29
36
 
30
37
  /**
@@ -118,6 +125,11 @@ export interface AdminWriteInput {
118
125
  accountDir: string; // absolute path to account dir (containing account.json)
119
126
  caller: string; // identifier for the [admins-write] log line
120
127
  audit: AuditContext; // actor/session/logFile for the [users-audit] line
128
+ /** Task 2531 — set when supplied; an unsupplied field is left untouched, so a
129
+ * PIN rotation can never erase a binding and binding one channel never
130
+ * clears the other. */
131
+ phone?: string;
132
+ telegram?: string;
121
133
  }
122
134
 
123
135
  export interface AdminWriteResult {
@@ -174,19 +186,37 @@ export function writeAdminEntry(input: AdminWriteInput): AdminWriteResult {
174
186
 
175
187
  const rowsBefore = users.map(u => id8(u.userId)).join(",");
176
188
  const existing = users.findIndex(u => u.userId === input.userId);
189
+ // Task 2531 — what this write actually changes, decided BEFORE the row is
190
+ // rewritten. admin-bind carries the existing hash through so it rotates
191
+ // nothing; auditing that as `set-pin` would record a credential rotation
192
+ // that did not happen, which is worse for an audit trail than no line.
193
+ const pinRotated = existing !== -1 && users[existing].pin !== input.pin;
194
+ const boundFields = [
195
+ input.phone !== undefined ? "phone" : null,
196
+ input.telegram !== undefined ? "telegram" : null,
197
+ ].filter(Boolean) as string[];
177
198
  if (existing === -1) {
178
- users.push({ userId: input.userId, pin: input.pin });
199
+ const row: UserEntry = { userId: input.userId, pin: input.pin };
200
+ if (input.phone !== undefined) row.phone = input.phone;
201
+ if (input.telegram !== undefined) row.telegram = input.telegram;
202
+ users.push(row);
179
203
  } else {
180
204
  // Preserve sibling fields other writers may have set; overwrite pin.
181
- users[existing] = { ...users[existing], pin: input.pin };
205
+ const row: UserEntry = { ...users[existing], pin: input.pin };
206
+ // Task 2531 — set only what this call supplied. An absent field is not an
207
+ // instruction to clear one.
208
+ if (input.phone !== undefined) row.phone = input.phone;
209
+ if (input.telegram !== undefined) row.telegram = input.telegram;
210
+ users[existing] = row;
182
211
  }
183
212
 
184
213
  writeFileAtomic(input.usersFile, JSON.stringify(users, null, 2) + "\n", 0o600);
185
214
  result.usersJsonResult = "ok";
186
- // A new userId is a row add; an existing userId is a pin rotation.
215
+ // A new userId is a row add. An existing userId is a pin rotation when the
216
+ // hash actually moved, and otherwise a binding write naming the fields set.
187
217
  appendUsersAuditLine(input.audit, {
188
- action: existing === -1 ? "add" : "set-pin",
189
- field: existing === -1 ? "row" : "pin",
218
+ action: existing === -1 ? "add" : pinRotated ? "set-pin" : "set-binding",
219
+ field: existing === -1 ? "row" : pinRotated ? "pin" : boundFields.join(","),
190
220
  rowsBefore,
191
221
  rowsAfter: users.map(u => id8(u.userId)).join(","),
192
222
  });
@@ -0,0 +1,14 @@
1
+ import { defineConfig } from "vitest/config";
2
+
3
+ // Task 2531 — this lib shipped a 210-line test file and no runner: the sibling
4
+ // libs' configs all include `src/__tests__/**`, and these tests live one level
5
+ // up at `__tests__/`, so no config matched them and nothing ever executed the
6
+ // credential-store chokepoint's coverage. The include below is the layout that
7
+ // is actually on disk.
8
+ export default defineConfig({
9
+ test: {
10
+ environment: "node",
11
+ globals: false,
12
+ include: ["__tests__/**/*.test.ts"],
13
+ },
14
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AACA,OAAc,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAmChE,kCAAkC;AAClC,wBAAsB,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOrF;AAED,oEAAoE;AACpE,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE1D"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAEA,OAAc,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAqDhE,kCAAkC;AAClC,wBAAsB,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOrF;AAED,oEAAoE;AACpE,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE1D"}
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.withSession = withSession;
7
7
  exports.__setDriverForTests = __setDriverForTests;
8
8
  const node_fs_1 = require("node:fs");
9
+ const node_path_1 = require("node:path");
9
10
  const neo4j_driver_1 = __importDefault(require("neo4j-driver"));
10
11
  /**
11
12
  * This package owns its Neo4j session.
@@ -18,10 +19,24 @@ let driver = null;
18
19
  function password() {
19
20
  if (process.env.NEO4J_PASSWORD)
20
21
  return process.env.NEO4J_PASSWORD;
21
- const file = process.env.NEO4J_PASSWORD_FILE;
22
- if (file && (0, node_fs_1.existsSync)(file))
23
- return (0, node_fs_1.readFileSync)(file, "utf-8").trim();
24
- throw new Error("[dispatch-read] Neo4j password not found in NEO4J_PASSWORD or NEO4J_PASSWORD_FILE");
22
+ // The platform root from env, never a path computed from this file. The
23
+ // correct segment count differs between src and dist, and this package is
24
+ // loaded from src by the admin server and from dist by the dispatch MCP.
25
+ // The two processes also disagree on the variable name, so both are read.
26
+ const root = process.env.MAXY_PLATFORM_ROOT ?? process.env.PLATFORM_ROOT;
27
+ if (!root) {
28
+ throw new Error("[dispatch-read] neither MAXY_PLATFORM_ROOT nor PLATFORM_ROOT is set — cannot locate config/.neo4j-password");
29
+ }
30
+ const passwordFile = (0, node_path_1.resolve)(root, "config/.neo4j-password");
31
+ try {
32
+ return (0, node_fs_1.readFileSync)(passwordFile, "utf-8").trim();
33
+ }
34
+ catch (err) {
35
+ // The cause is carried, not swallowed. A permissions failure reported as
36
+ // "not found" sends the reader to a path where the file is plainly
37
+ // present, which is the misdirection this package's own outage was.
38
+ throw new Error(`[dispatch-read] Neo4j password not found. Expected at ${passwordFile}, or in NEO4J_PASSWORD. Read failed: ${err instanceof Error ? err.message : String(err)}`);
39
+ }
25
40
  }
26
41
  function getDriver() {
27
42
  if (driver)
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":";;;;;AAqCA,kCAOC;AAGD,kDAEC;AAjDD,qCAAmD;AACnD,gEAAgE;AAEhE;;;;;;GAMG;AAEH,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC,SAAS,QAAQ;IACf,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAClE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC7C,IAAI,IAAI,IAAI,IAAA,oBAAU,EAAC,IAAI,CAAC;QAAE,OAAO,IAAA,sBAAY,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACxE,MAAM,IAAI,KAAK,CACb,mFAAmF,CACpF,CAAC;AACJ,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,8EAA8E;IAC9E,gEAAgE;IAChE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IAClC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,sBAAK,CAAC,MAAM,CAAC,GAAG,EAAE,sBAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC5F,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,kCAAkC;AAC3B,KAAK,UAAU,WAAW,CAAI,EAAoC;IACvE,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,SAAgB,mBAAmB,CAAC,CAAgB;IAClD,MAAM,GAAG,CAAC,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":";;;;;AAwDA,kCAOC;AAGD,kDAEC;AApED,qCAAuC;AACvC,yCAAoC;AACpC,gEAAgE;AAEhE;;;;;;GAMG;AAEH,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC,SAAS,QAAQ;IACf,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAClE,wEAAwE;IACxE,0EAA0E;IAC1E,yEAAyE;IACzE,0EAA0E;IAC1E,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,4GAA4G,CAC7G,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,OAAO,IAAA,sBAAY,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,yEAAyE;QACzE,mEAAmE;QACnE,oEAAoE;QACpE,MAAM,IAAI,KAAK,CACb,yDAAyD,YAAY,wCACnE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE,CACH,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,8EAA8E;IAC9E,gEAAgE;IAChE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IAClC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,sBAAK,CAAC,MAAM,CAAC,GAAG,EAAE,sBAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC5F,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,kCAAkC;AAC3B,KAAK,UAAU,WAAW,CAAI,EAAoC;IACvE,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,SAAgB,mBAAmB,CAAC,CAAgB;IAClD,MAAM,GAAG,CAAC,CAAC;AACb,CAAC"}
@@ -0,0 +1,91 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+
6
+ // `vi.mock` is hoisted above every `const` in this file, so the fakes it
7
+ // closes over must come from `vi.hoisted` or they are read before init.
8
+ const mocks = vi.hoisted(() => ({
9
+ basic: vi.fn((user: string, password: string) => ({ user, password })),
10
+ driver: vi.fn(() => ({
11
+ session: () => ({ close: async () => {} }),
12
+ close: async () => {},
13
+ })),
14
+ }));
15
+
16
+ // `session.ts` imports neo4j-driver as a default import and takes only types
17
+ // from its named exports, so the default is the whole surface to fake.
18
+ vi.mock("neo4j-driver", () => ({
19
+ default: { driver: mocks.driver, auth: { basic: mocks.basic } },
20
+ }));
21
+
22
+ import { __setDriverForTests, withSession } from "../session.js";
23
+
24
+ describe("Task 2525 — password resolution", () => {
25
+ let root = "";
26
+ const originalEnv = { ...process.env };
27
+
28
+ beforeEach(() => {
29
+ root = mkdtempSync(join(tmpdir(), "task2525-"));
30
+ mkdirSync(join(root, "config"), { recursive: true });
31
+ writeFileSync(join(root, "config", ".neo4j-password"), "file-secret\n");
32
+ delete process.env.NEO4J_PASSWORD;
33
+ delete process.env.NEO4J_PASSWORD_FILE;
34
+ delete process.env.MAXY_PLATFORM_ROOT;
35
+ delete process.env.PLATFORM_ROOT;
36
+ process.env.NEO4J_URI = "bolt://127.0.0.1:59999";
37
+ __setDriverForTests(null);
38
+ mocks.driver.mockClear();
39
+ mocks.basic.mockClear();
40
+ });
41
+
42
+ afterEach(() => {
43
+ process.env = { ...originalEnv };
44
+ rmSync(root, { recursive: true, force: true });
45
+ });
46
+
47
+ it("reads <MAXY_PLATFORM_ROOT>/config/.neo4j-password, the name the admin server exports", async () => {
48
+ process.env.MAXY_PLATFORM_ROOT = root;
49
+ await withSession(async () => "ok");
50
+ expect(mocks.basic).toHaveBeenCalledWith("neo4j", "file-secret");
51
+ });
52
+
53
+ it("falls back to PLATFORM_ROOT, the name the dispatch MCP exports", async () => {
54
+ process.env.PLATFORM_ROOT = root;
55
+ await withSession(async () => "ok");
56
+ expect(mocks.basic).toHaveBeenCalledWith("neo4j", "file-secret");
57
+ });
58
+
59
+ it("prefers NEO4J_PASSWORD over the file", async () => {
60
+ process.env.NEO4J_PASSWORD = "env-secret";
61
+ process.env.MAXY_PLATFORM_ROOT = root;
62
+ await withSession(async () => "ok");
63
+ expect(mocks.basic).toHaveBeenCalledWith("neo4j", "env-secret");
64
+ });
65
+
66
+ it("throws naming both root variables when neither is set", async () => {
67
+ await expect(withSession(async () => "ok")).rejects.toThrow(
68
+ /MAXY_PLATFORM_ROOT.*PLATFORM_ROOT/,
69
+ );
70
+ });
71
+
72
+ it("ignores NEO4J_PASSWORD_FILE, the variable nothing in the platform sets", async () => {
73
+ const decoy = join(root, "decoy-password");
74
+ writeFileSync(decoy, "decoy-secret\n");
75
+ process.env.NEO4J_PASSWORD_FILE = decoy;
76
+ process.env.MAXY_PLATFORM_ROOT = root;
77
+ await withSession(async () => "ok");
78
+ expect(mocks.basic).toHaveBeenCalledWith("neo4j", "file-secret");
79
+ });
80
+
81
+ it("throws naming the resolved path and carrying the read failure when the file is missing", async () => {
82
+ rmSync(join(root, "config", ".neo4j-password"));
83
+ process.env.MAXY_PLATFORM_ROOT = root;
84
+ // Both halves matter: the path tells the reader where to look, the cause
85
+ // distinguishes "absent" from "present but unreadable".
86
+ await expect(withSession(async () => "ok")).rejects.toThrow(
87
+ /config\/\.neo4j-password/,
88
+ );
89
+ await expect(withSession(async () => "ok")).rejects.toThrow(/ENOENT/);
90
+ });
91
+ });
@@ -1,4 +1,5 @@
1
- import { existsSync, readFileSync } from "node:fs";
1
+ import { readFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
2
3
  import neo4j, { type Driver, type Session } from "neo4j-driver";
3
4
 
4
5
  /**
@@ -13,11 +14,29 @@ let driver: Driver | null = null;
13
14
 
14
15
  function password(): string {
15
16
  if (process.env.NEO4J_PASSWORD) return process.env.NEO4J_PASSWORD;
16
- const file = process.env.NEO4J_PASSWORD_FILE;
17
- if (file && existsSync(file)) return readFileSync(file, "utf-8").trim();
18
- throw new Error(
19
- "[dispatch-read] Neo4j password not found in NEO4J_PASSWORD or NEO4J_PASSWORD_FILE",
20
- );
17
+ // The platform root from env, never a path computed from this file. The
18
+ // correct segment count differs between src and dist, and this package is
19
+ // loaded from src by the admin server and from dist by the dispatch MCP.
20
+ // The two processes also disagree on the variable name, so both are read.
21
+ const root = process.env.MAXY_PLATFORM_ROOT ?? process.env.PLATFORM_ROOT;
22
+ if (!root) {
23
+ throw new Error(
24
+ "[dispatch-read] neither MAXY_PLATFORM_ROOT nor PLATFORM_ROOT is set — cannot locate config/.neo4j-password",
25
+ );
26
+ }
27
+ const passwordFile = resolve(root, "config/.neo4j-password");
28
+ try {
29
+ return readFileSync(passwordFile, "utf-8").trim();
30
+ } catch (err) {
31
+ // The cause is carried, not swallowed. A permissions failure reported as
32
+ // "not found" sends the reader to a path where the file is plainly
33
+ // present, which is the misdirection this package's own outage was.
34
+ throw new Error(
35
+ `[dispatch-read] Neo4j password not found. Expected at ${passwordFile}, or in NEO4J_PASSWORD. Read failed: ${
36
+ err instanceof Error ? err.message : String(err)
37
+ }`,
38
+ );
39
+ }
21
40
  }
22
41
 
23
42
  function getDriver(): Driver {
@@ -31,8 +31,8 @@
31
31
  * unrelated, which is worse than no citation.
32
32
  */
33
33
  import { type RoutineTemplate } from "./roster.js";
34
- export { ROUTINE_ROSTER, ROUTINE_ROSTER_KEYS, ROUTINE_TEMPLATE_VERSION } from "./roster.js";
35
- export type { RoutineTemplate } from "./roster.js";
34
+ export { ROUTINE_ROSTER, ROUTINE_ROSTER_KEYS, ROUTINE_TEMPLATE_VERSION, isWatermarkedCheck, gateNeedsCommit, } from "./roster.js";
35
+ export type { RoutineTemplate, RoutineGate, RoutineGateCheck } from "./roster.js";
36
36
  /** The minimal Neo4j session surface the seed needs. Both the admin plugin's
37
37
  * `getSession()` and a driver session from `seed-cli` satisfy it; the tests
38
38
  * pass an in-memory fake. Deliberately not `neo4j-driver`'s `Session` type, so
@@ -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;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CAsC+C;AAC/C,eAAO,MAAM,YAAY,iyFA+CwB,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,CAoF/F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VERIFY_CYPHER = exports.MERGE_CYPHER = exports.ROUTINE_TEMPLATE_VERSION = exports.ROUTINE_ROSTER_KEYS = exports.ROUTINE_ROSTER = void 0;
3
+ exports.VERIFY_CYPHER = exports.MERGE_CYPHER = exports.gateNeedsCommit = exports.isWatermarkedCheck = exports.ROUTINE_TEMPLATE_VERSION = exports.ROUTINE_ROSTER_KEYS = exports.ROUTINE_ROSTER = void 0;
4
4
  exports.acctTag = acctTag;
5
5
  exports.resolveOwnerTimezone = resolveOwnerTimezone;
6
6
  exports.seedRoutineRoster = seedRoutineRoster;
@@ -37,10 +37,18 @@ exports.seedRoutineRoster = seedRoutineRoster;
37
37
  * unrelated, which is worse than no citation.
38
38
  */
39
39
  const roster_js_1 = require("./roster.js");
40
+ // Task 2471 — `isWatermarkedCheck` and `gateNeedsCommit` were declared but not
41
+ // re-exported, so the only callers they ever had were this lib's own tests and
42
+ // the invariant they express went unenforced at both gate write paths. They are
43
+ // public now so the scheduling plugin's `validateGate` can reuse them, rather
44
+ // than restating which check types carry a watermark and letting the two lists
45
+ // drift.
40
46
  var roster_js_2 = require("./roster.js");
41
47
  Object.defineProperty(exports, "ROUTINE_ROSTER", { enumerable: true, get: function () { return roster_js_2.ROUTINE_ROSTER; } });
42
48
  Object.defineProperty(exports, "ROUTINE_ROSTER_KEYS", { enumerable: true, get: function () { return roster_js_2.ROUTINE_ROSTER_KEYS; } });
43
49
  Object.defineProperty(exports, "ROUTINE_TEMPLATE_VERSION", { enumerable: true, get: function () { return roster_js_2.ROUTINE_TEMPLATE_VERSION; } });
50
+ Object.defineProperty(exports, "isWatermarkedCheck", { enumerable: true, get: function () { return roster_js_2.isWatermarkedCheck; } });
51
+ Object.defineProperty(exports, "gateNeedsCommit", { enumerable: true, get: function () { return roster_js_2.gateNeedsCommit; } });
44
52
  /** Neo4j returns integers as its own `Integer` type over bolt and as plain
45
53
  * numbers through a test fake. Normalise both without importing the driver. */
46
54
  function toInt(raw) {
@@ -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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"}