@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
@@ -0,0 +1,144 @@
1
+ // Task 2244 — which specialists are the ACCOUNT's own, and which tools are
2
+ // theirs.
3
+ //
4
+ // Task 2244 defined both its deliverables against every card under
5
+ // `<accountDir>/specialists/agents/`. Measured against the tree, that rule
6
+ // refuses the admin nearly its whole surface: `provision-account-dir.sh:179-181`
7
+ // copies every shipped template into each account, and `personal-assistant.md`
8
+ // alone declares roughly 130 tools including the entire email, WhatsApp,
9
+ // calendar and browser surfaces, while `content-producer.md` and
10
+ // `sitedesk--quoter.md` declare Bash, Read, Edit and Write. So the set is
11
+ // narrowed on two axes, both settled with the operator before implementation.
12
+ //
13
+ // Card axis — a card is the account's own when its filename appears in none of
14
+ // the shipped roots. `<accountDir>/plugins/*/agents/` is deliberately NOT one of
15
+ // those: that is where `store-skill` files an authored agent's durable copy, so
16
+ // a card found there is still the account's own. These are the same roots
17
+ // `runRosterCensus` takes as `durableDirs` and `durablePluginRoots`, used here as
18
+ // a set difference so no new registry is introduced — the failure this tree has
19
+ // already hit twice, in Task 2460's three unreconciled agent directories and
20
+ // Task 2467's provision-time-only hook set.
21
+ //
22
+ // Tool axis — native tools are subtracted. Gating Bash or Read would refuse the
23
+ // admin its own seat, and every authored card declares some of them.
24
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
25
+ import { join } from 'node:path';
26
+ import { CC_NATIVE_TOOLS } from './specialist-drift.js';
27
+ /** `*.md` entries directly in `dir`, for a SHIPPED root. An absent or unreadable
28
+ * one contributes nothing: not every install carries premium-plugins, and an
29
+ * unreadable platform tree must not cost an account its census line. The
30
+ * consequence of swallowing here is a card wrongly counted as the account's
31
+ * own, which is a visible over-count rather than a silent zero. */
32
+ function markdownIn(dir) {
33
+ if (!existsSync(dir))
34
+ return [];
35
+ try {
36
+ return readdirSync(dir).filter((entry) => entry.endsWith('.md'));
37
+ }
38
+ catch {
39
+ return [];
40
+ }
41
+ }
42
+ /** `*.md` entries in the ACCOUNT's own specialists directory.
43
+ *
44
+ * Absent means an account with no specialists, which is normal and yields
45
+ * nothing. Present-but-unreadable is a measurement failure and THROWS, because
46
+ * the two must not collapse: returning nothing there would report `declared=0`,
47
+ * the unmeasured zero the census is forbidden to assert, and it would be
48
+ * indistinguishable from an account that genuinely has none. The gate throws on
49
+ * the same fault, so swallowing it here would leave the two surfaces disagreeing
50
+ * about one account. */
51
+ function accountMarkdownIn(dir) {
52
+ if (!existsSync(dir))
53
+ return [];
54
+ return readdirSync(dir).filter((entry) => entry.endsWith('.md'));
55
+ }
56
+ function subdirs(dir) {
57
+ if (!existsSync(dir))
58
+ return [];
59
+ try {
60
+ return readdirSync(dir, { withFileTypes: true })
61
+ .filter((entry) => entry.isDirectory())
62
+ .map((entry) => entry.name);
63
+ }
64
+ catch {
65
+ return [];
66
+ }
67
+ }
68
+ /** One frontmatter scalar, CRLF-tolerant and quote-stripping — the same idiom
69
+ * `specialist-roster.ts` and `roster-census.ts` use, so all three agree on what
70
+ * a card is called and what it declares. */
71
+ function frontmatterField(raw, field) {
72
+ const fm = raw.match(/^---\r?\n([\s\S]*?)\r?\n---/);
73
+ if (!fm)
74
+ return null;
75
+ const m = fm[1].match(new RegExp(`^${field}:\\s*(.*?)\\r?$`, 'm'));
76
+ if (!m)
77
+ return null;
78
+ let value = m[1].trim();
79
+ if ((value.startsWith('"') && value.endsWith('"')) ||
80
+ (value.startsWith("'") && value.endsWith("'"))) {
81
+ value = value.slice(1, -1);
82
+ }
83
+ return value || null;
84
+ }
85
+ /** Every card in the account's specialists directory that no shipped root
86
+ * delivers, sorted by filename so the derived tool map is stable across ticks.
87
+ *
88
+ * A card missing `name` is skipped rather than throwing — the same tolerance
89
+ * `readSpecialistRoster` applies, because one malformed file must not cost the
90
+ * account its whole set. A card with no `tools` declares none, which is a real
91
+ * state (an authored card can own a domain through prose alone) and not an
92
+ * error. */
93
+ export function readAuthoredCards(input) {
94
+ const shipped = new Set();
95
+ for (const dir of input.shippedDirs) {
96
+ for (const filename of markdownIn(dir))
97
+ shipped.add(filename);
98
+ }
99
+ for (const root of input.shippedPluginRoots) {
100
+ for (const plugin of subdirs(root)) {
101
+ for (const filename of markdownIn(join(root, plugin, 'agents')))
102
+ shipped.add(filename);
103
+ }
104
+ }
105
+ const out = [];
106
+ for (const filename of accountMarkdownIn(input.specialistsAgentsDir).sort()) {
107
+ if (shipped.has(filename))
108
+ continue;
109
+ let raw;
110
+ try {
111
+ raw = readFileSync(join(input.specialistsAgentsDir, filename), 'utf8');
112
+ }
113
+ catch {
114
+ continue;
115
+ }
116
+ const name = frontmatterField(raw, 'name');
117
+ if (!name)
118
+ continue;
119
+ const tools = (frontmatterField(raw, 'tools') ?? '')
120
+ .split(',')
121
+ .map((tool) => tool.trim())
122
+ .filter((tool) => tool.length > 0);
123
+ out.push({ filename, name, tools });
124
+ }
125
+ return out;
126
+ }
127
+ /** Tool name to the authored specialist that owns it, native tools removed.
128
+ *
129
+ * First declarer wins when two cards name the same tool. The refusal names one
130
+ * specialist, and an account that split a tool across two of its own clerks has
131
+ * a roster problem that this gate is not the place to report. */
132
+ export function gatedToolMap(cards) {
133
+ const map = new Map();
134
+ for (const card of cards) {
135
+ for (const tool of card.tools) {
136
+ if (CC_NATIVE_TOOLS.has(tool))
137
+ continue;
138
+ if (!map.has(tool))
139
+ map.set(tool, card.name);
140
+ }
141
+ }
142
+ return map;
143
+ }
144
+ //# sourceMappingURL=authored-specialist-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authored-specialist-tools.js","sourceRoot":"","sources":["../src/authored-specialist-tools.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"canonical-tool-names.generated.d.ts","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EA2B7C,CAAA;AAED,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAoWtD,CAAA"}
1
+ {"version":3,"file":"canonical-tool-names.generated.d.ts","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EA2B7C,CAAA;AAED,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAuWtD,CAAA"}
@@ -52,6 +52,7 @@ export const CANONICAL_MAXY_TOOL_NAMES = [
52
52
  "mcp__plugin_admin_admin__action-pending",
53
53
  "mcp__plugin_admin_admin__action-reject",
54
54
  "mcp__plugin_admin_admin__admin-add",
55
+ "mcp__plugin_admin_admin__admin-bind",
55
56
  "mcp__plugin_admin_admin__admin-hostname",
56
57
  "mcp__plugin_admin_admin__admin-list",
57
58
  "mcp__plugin_admin_admin__admin-remove",
@@ -348,6 +349,8 @@ export const CANONICAL_MAXY_TOOL_NAMES = [
348
349
  "mcp__plugin_storage-broker_storage-broker__storage-r2-object-put",
349
350
  "mcp__plugin_telegram_telegram__message",
350
351
  "mcp__plugin_telegram_telegram__message-history",
352
+ "mcp__plugin_telegram_telegram__telegram-api",
353
+ "mcp__plugin_telegram_telegram__telegram-api-census",
351
354
  "mcp__plugin_telegram_telegram__telegram-menu-button",
352
355
  "mcp__plugin_telegram_telegram__telegram-webhook-register",
353
356
  "mcp__plugin_url-get_url-get__url-get",
@@ -1 +1 @@
1
- {"version":3,"file":"canonical-tool-names.generated.js","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canonical-tool-names.generated.js","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,kEAAkE;AAClE,yDAAyD;AACzD,kFAAkF;AAClF,EAAE;AACF,yEAAyE;AACzE,6DAA6D;AAE7D,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gBAAgB,GAAsB;IACjD,OAAO;IACP,KAAK;IACL,SAAS;IACT,WAAW;IACX,UAAU;IACV,UAAU;IACV,OAAO;IACP,YAAY;IACZ,QAAQ;IACR,OAAO;IACP,cAAc;IACd,WAAW;IACX,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,UAAU;IACV,SAAS;IACT,cAAc;IACd,UAAU;IACV,MAAM;IACN,WAAW;CACZ,CAAA;AAED,gEAAgE;AAChE,MAAM,CAAC,MAAM,yBAAyB,GAAsB;IAC1D,yCAAyC;IACzC,yCAAyC;IACzC,kDAAkD;IAClD,sDAAsD;IACtD,yCAAyC;IACzC,yCAAyC;IACzC,uCAAuC;IACvC,wCAAwC;IACxC,iDAAiD;IACjD,yCAAyC;IACzC,iDAAiD;IACjD,yCAAyC;IACzC,sCAAsC;IACtC,yCAAyC;IACzC,wCAAwC;IACxC,oCAAoC;IACpC,qCAAqC;IACrC,yCAAyC;IACzC,qCAAqC;IACrC,uCAAuC;IACvC,2CAA2C;IAC3C,4CAA4C;IAC5C,uCAAuC;IACvC,uCAAuC;IACvC,sCAAsC;IACtC,qCAAqC;IACrC,uCAAuC;IACvC,yCAAyC;IACzC,4CAA4C;IAC5C,0CAA0C;IAC1C,2CAA2C;IAC3C,gDAAgD;IAChD,oCAAoC;IACpC,sCAAsC;IACtC,gDAAgD;IAChD,0CAA0C;IAC1C,uCAAuC;IACvC,0CAA0C;IAC1C,uCAAuC;IACvC,sCAAsC;IACtC,sDAAsD;IACtD,mDAAmD;IACnD,6CAA6C;IAC7C,wCAAwC;IACxC,yCAAyC;IACzC,qCAAqC;IACrC,qCAAqC;IACrC,uCAAuC;IACvC,sCAAsC;IACtC,wCAAwC;IACxC,+BAA+B;IAC/B,qCAAqC;IACrC,sCAAsC;IACtC,yCAAyC;IACzC,4CAA4C;IAC5C,uDAAuD;IACvD,+CAA+C;IAC/C,2CAA2C;IAC3C,gDAAgD;IAChD,oDAAoD;IACpD,4CAA4C;IAC5C,+CAA+C;IAC/C,+CAA+C;IAC/C,gDAAgD;IAChD,6CAA6C;IAC7C,6CAA6C;IAC7C,iDAAiD;IACjD,oDAAoD;IACpD,+CAA+C;IAC/C,2CAA2C;IAC3C,2CAA2C;IAC3C,+CAA+C;IAC/C,iDAAiD;IACjD,uDAAuD;IACvD,iDAAiD;IACjD,qDAAqD;IACrD,+CAA+C;IAC/C,+CAA+C;IAC/C,8CAA8C;IAC9C,+CAA+C;IAC/C,6CAA6C;IAC7C,+CAA+C;IAC/C,+CAA+C;IAC/C,6CAA6C;IAC7C,6CAA6C;IAC7C,kDAAkD;IAClD,6DAA6D;IAC7D,oDAAoD;IACpD,6CAA6C;IAC7C,oDAAoD;IACpD,iDAAiD;IACjD,kDAAkD;IAClD,sDAAsD;IACtD,sDAAsD;IACtD,0DAA0D;IAC1D,uCAAuC;IACvC,sCAAsC;IACtC,2CAA2C;IAC3C,2CAA2C;IAC3C,2CAA2C;IAC3C,sCAAsC;IACtC,iDAAiD;IACjD,2CAA2C;IAC3C,4CAA4C;IAC5C,uCAAuC;IACvC,4CAA4C;IAC5C,8CAA8C;IAC9C,qCAAqC;IACrC,sCAAsC;IACtC,uCAAuC;IACvC,qCAAqC;IACrC,qDAAqD;IACrD,sCAAsC;IACtC,8CAA8C;IAC9C,uCAAuC;IACvC,8CAA8C;IAC9C,8CAA8C;IAC9C,8CAA8C;IAC9C,8CAA8C;IAC9C,8CAA8C;IAC9C,+CAA+C;IAC/C,gDAAgD;IAChD,gDAAgD;IAChD,oDAAoD;IACpD,yDAAyD;IACzD,2DAA2D;IAC3D,mDAAmD;IACnD,mDAAmD;IACnD,kDAAkD;IAClD,qDAAqD;IACrD,iDAAiD;IACjD,oDAAoD;IACpD,mDAAmD;IACnD,qDAAqD;IACrD,sDAAsD;IACtD,uDAAuD;IACvD,wDAAwD;IACxD,0DAA0D;IAC1D,qDAAqD;IACrD,uDAAuD;IACvD,kEAAkE;IAClE,2DAA2D;IAC3D,yDAAyD;IACzD,+DAA+D;IAC/D,sDAAsD;IACtD,mDAAmD;IACnD,oDAAoD;IACpD,sDAAsD;IACtD,iEAAiE;IACjE,2DAA2D;IAC3D,yDAAyD;IACzD,yDAAyD;IACzD,sDAAsD;IACtD,uDAAuD;IACvD,yDAAyD;IACzD,sDAAsD;IACtD,uDAAuD;IACvD,2DAA2D;IAC3D,0DAA0D;IAC1D,wDAAwD;IACxD,qDAAqD;IACrD,sDAAsD;IACtD,gEAAgE;IAChE,qDAAqD;IACrD,oDAAoD;IACpD,iDAAiD;IACjD,kDAAkD;IAClD,wDAAwD;IACxD,oDAAoD;IACpD,wDAAwD;IACxD,wDAAwD;IACxD,qDAAqD;IACrD,uDAAuD;IACvD,sDAAsD;IACtD,mDAAmD;IACnD,oDAAoD;IACpD,qDAAqD;IACrD,kDAAkD;IAClD,mDAAmD;IACnD,qDAAqD;IACrD,0DAA0D;IAC1D,wDAAwD;IACxD,0DAA0D;IAC1D,sDAAsD;IACtD,sDAAsD;IACtD,sDAAsD;IACtD,mDAAmD;IACnD,8DAA8D;IAC9D,sDAAsD;IACtD,2CAA2C;IAC3C,+CAA+C;IAC/C,iDAAiD;IACjD,kDAAkD;IAClD,kDAAkD;IAClD,6CAA6C;IAC7C,6CAA6C;IAC7C,iEAAiE;IACjE,kEAAkE;IAClE,6DAA6D;IAC7D,8CAA8C;IAC9C,wDAAwD;IACxD,gDAAgD;IAChD,qDAAqD;IACrD,sDAAsD;IACtD,wDAAwD;IACxD,wCAAwC;IACxC,wCAAwC;IACxC,6CAA6C;IAC7C,6CAA6C;IAC7C,2CAA2C;IAC3C,iDAAiD;IACjD,wDAAwD;IACxD,0DAA0D;IAC1D,0CAA0C;IAC1C,6CAA6C;IAC7C,wCAAwC;IACxC,mDAAmD;IACnD,+CAA+C;IAC/C,mDAAmD;IACnD,0CAA0C;IAC1C,kDAAkD;IAClD,8CAA8C;IAC9C,oDAAoD;IACpD,kDAAkD;IAClD,+CAA+C;IAC/C,mDAAmD;IACnD,2CAA2C;IAC3C,qDAAqD;IACrD,+CAA+C;IAC/C,sDAAsD;IACtD,gDAAgD;IAChD,2CAA2C;IAC3C,gDAAgD;IAChD,0CAA0C;IAC1C,0CAA0C;IAC1C,kDAAkD;IAClD,yCAAyC;IACzC,kDAAkD;IAClD,2CAA2C;IAC3C,yCAAyC;IACzC,2CAA2C;IAC3C,4CAA4C;IAC5C,mDAAmD;IACnD,uDAAuD;IACvD,4DAA4D;IAC5D,sDAAsD;IACtD,sDAAsD;IACtD,qDAAqD;IACrD,wDAAwD;IACxD,oDAAoD;IACpD,uDAAuD;IACvD,sDAAsD;IACtD,oDAAoD;IACpD,4CAA4C;IAC5C,iDAAiD;IACjD,iDAAiD;IACjD,sDAAsD;IACtD,kDAAkD;IAClD,sDAAsD;IACtD,kDAAkD;IAClD,gDAAgD;IAChD,uDAAuD;IACvD,iDAAiD;IACjD,kDAAkD;IAClD,gDAAgD;IAChD,mDAAmD;IACnD,mDAAmD;IACnD,yDAAyD;IACzD,4DAA4D;IAC5D,6DAA6D;IAC7D,2DAA2D;IAC3D,2DAA2D;IAC3D,+DAA+D;IAC/D,+DAA+D;IAC/D,+DAA+D;IAC/D,0DAA0D;IAC1D,6DAA6D;IAC7D,6DAA6D;IAC7D,8DAA8D;IAC9D,8DAA8D;IAC9D,8DAA8D;IAC9D,qDAAqD;IACrD,sDAAsD;IACtD,2DAA2D;IAC3D,iDAAiD;IACjD,sDAAsD;IACtD,uDAAuD;IACvD,yDAAyD;IACzD,oDAAoD;IACpD,iEAAiE;IACjE,mDAAmD;IACnD,wDAAwD;IACxD,iDAAiD;IACjD,wDAAwD;IACxD,kDAAkD;IAClD,kDAAkD;IAClD,oDAAoD;IACpD,oDAAoD;IACpD,iDAAiD;IACjD,8DAA8D;IAC9D,4DAA4D;IAC5D,6DAA6D;IAC7D,gEAAgE;IAChE,iEAAiE;IACjE,iEAAiE;IACjE,qEAAqE;IACrE,mEAAmE;IACnE,qEAAqE;IACrE,kEAAkE;IAClE,mEAAmE;IACnE,kEAAkE;IAClE,wCAAwC;IACxC,gDAAgD;IAChD,6CAA6C;IAC7C,oDAAoD;IACpD,qDAAqD;IACrD,0DAA0D;IAC1D,sCAAsC;IACtC,6DAA6D;IAC7D,kEAAkE;IAClE,8DAA8D;IAC9D,oEAAoE;IACpE,0DAA0D;IAC1D,kDAAkD;IAClD,gDAAgD;IAChD,kEAAkE;IAClE,uDAAuD;IACvD,oDAAoD;IACpD,oDAAoD;IACpD,qDAAqD;IACrD,oDAAoD;IACpD,kDAAkD;IAClD,+CAA+C;IAC/C,oDAAoD;IACpD,gDAAgD;IAChD,yCAAyC;IACzC,uCAAuC;IACvC,oCAAoC;IACpC,qCAAqC;IACrC,uCAAuC;IACvC,qCAAqC;IACrC,yCAAyC;IACzC,qCAAqC;IACrC,sCAAsC;IACtC,oCAAoC;IACpC,iCAAiC;IACjC,kCAAkC;IAClC,mCAAmC;IACnC,oCAAoC;IACpC,oCAAoC;IACpC,kDAAkD;IAClD,kDAAkD;IAClD,mDAAmD;IACnD,+CAA+C;IAC/C,gDAAgD;IAChD,gDAAgD;IAChD,kDAAkD;IAClD,oDAAoD;CACrD,CAAA"}
@@ -0,0 +1,44 @@
1
+ export interface HtmlStructureFinding {
2
+ accountId: string;
3
+ /** Path of the malformed document, relative to the account dir. */
4
+ path: string;
5
+ /** Line of the nested or unmatched <style> opener. */
6
+ line: number;
7
+ }
8
+ export interface HtmlStructureResult {
9
+ /** HTML documents walked on this account. */
10
+ documents: number;
11
+ findings: HtmlStructureFinding[];
12
+ }
13
+ /** One line per run, emitted with a zero count as well — silence is a broken
14
+ * walk, not a clean install. */
15
+ export declare function formatHtmlStructureCensusSummary(accounts: number, documents: number, malformed: number): string;
16
+ /** One line per malformed document. The path is JSON-quoted because these
17
+ * filenames carry spaces and a bare key=value line truncates at the first one. */
18
+ export declare function formatHtmlStructureFinding(f: HtmlStructureFinding): string;
19
+ /** Line of the first nested or unmatched <style> opener in `source`, else null.
20
+ *
21
+ * HTML comments are stripped first, each replaced by its own newlines, so a
22
+ * <style> inside <!-- … --> is not scanned and line numbers do not shift. That
23
+ * case is real: two account templates carry one and are clean, and a
24
+ * comment-blind detector reports both.
25
+ *
26
+ * A CSS comment protects an OPENER but never a CLOSER, and the asymmetry is the
27
+ * browser's, not a convenience. Style content is raw text to the HTML parser, so
28
+ * `</style>` terminates the element wherever it appears, comment or not. An
29
+ * opener, by contrast, is never a parse event inside a stylesheet — it is text
30
+ * the CSS parser reads as an invalid selector, which is what eats the rule after
31
+ * it. Inside a comment the CSS parser discards it and nothing is eaten: the
32
+ * shipped property-brochure template documents its override slot exactly that
33
+ * way and is correct. */
34
+ export declare function htmlStyleFaultLine(source: string): number | null;
35
+ /** Walk one account's HTML documents and report every malformed one. */
36
+ export declare function collectAccountHtmlFindings(accountDir: string, accountId: string): HtmlStructureResult;
37
+ export interface HtmlStructureCensusDeps {
38
+ /** <installDir>/data/accounts */
39
+ accountsDir: string;
40
+ logger: (line: string) => void;
41
+ }
42
+ /** One pass over every account. Called from the [quote-reconcile] tick. */
43
+ export declare function runHtmlStructureCensus(deps: HtmlStructureCensusDeps): void;
44
+ //# sourceMappingURL=html-structure-census.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-structure-census.d.ts","sourceRoot":"","sources":["../src/html-structure-census.ts"],"names":[],"mappings":"AAmCA,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAA;IACZ,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,oBAAoB,EAAE,CAAA;CACjC;AAED;iCACiC;AACjC,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,MAAM,CAER;AAED;mFACmF;AACnF,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAE1E;AAWD;;;;;;;;;;;;;;0BAc0B;AAC1B,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqBhE;AA+CD,wEAAwE;AACxE,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,mBAAmB,CAkBrB;AAED,MAAM,WAAW,uBAAuB;IACtC,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/B;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAoB1E"}
@@ -0,0 +1,185 @@
1
+ // Standing census of malformed <style> nesting across every account's HTML.
2
+ //
3
+ // A second <style> opener inside an open <style> element is not cosmetic. HTML
4
+ // parses style content as raw text, so the FIRST </style> closes the outer
5
+ // element: everything after it becomes body content and renders as visible text,
6
+ // and the rule immediately after the stray opener is eaten as part of an invalid
7
+ // selector. One fault, two symptoms — and on 2026-08-07 both were reported on a
8
+ // client quotation that had been live since 2026-07-24.
9
+ //
10
+ // The write gate (plugins/admin/hooks/html-structure-gate.sh) refuses the write.
11
+ // It cannot close the fault on its own: it cannot see what is already on disk,
12
+ // and a Bash heredoc writes a file without passing a Write gate at all. This
13
+ // pass is the backstop, and it is the only instrument that can see the state —
14
+ // the failure emits no event and re-running the render surfaces nothing.
15
+ //
16
+ // The detector is the same three rules as the hook: comments stripped first,
17
+ // then a depth-tracking walk of <style…>/</style…>, then an openers-equal-closers
18
+ // check at end of input.
19
+ //
20
+ // Shape mirrors the standing-audit family (quote-delivery-reconcile.ts): pure
21
+ // formatters that are unit-tested, an impure per-account collector, and a
22
+ // one-pass entry point. It carries no timer of its own — the pass is called from
23
+ // the [quote-reconcile] tick, so one timer drives both audits. Filesystem only:
24
+ // no Neo4j, no writes, no deletes. A per-account error is caught so one bad
25
+ // account never aborts the run.
26
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
27
+ import { join, relative } from 'node:path';
28
+ const TAG = '[html-structure-census]';
29
+ /** Directories whose HTML is not a client document: vendored packages, build
30
+ * scratch, tool state and the account's own trash. */
31
+ const EXCLUDED = new Set(['node_modules', '.wrangler', '.tool', '.trash']);
32
+ /** One line per run, emitted with a zero count as well — silence is a broken
33
+ * walk, not a clean install. */
34
+ export function formatHtmlStructureCensusSummary(accounts, documents, malformed) {
35
+ return `${TAG} accounts=${accounts} documents=${documents} malformed=${malformed}`;
36
+ }
37
+ /** One line per malformed document. The path is JSON-quoted because these
38
+ * filenames carry spaces and a bare key=value line truncates at the first one. */
39
+ export function formatHtmlStructureFinding(f) {
40
+ return `${TAG} op=malformed account=${f.accountId} file=${JSON.stringify(f.path)} line=${f.line}`;
41
+ }
42
+ /** Spans of `/* … *​/` in `source`, as [start, end) index pairs. */
43
+ function cssCommentSpans(source) {
44
+ const spans = [];
45
+ const re = /\/\*[\s\S]*?\*\//g;
46
+ let m;
47
+ while ((m = re.exec(source)) !== null)
48
+ spans.push([m.index, m.index + m[0].length]);
49
+ return spans;
50
+ }
51
+ /** Line of the first nested or unmatched <style> opener in `source`, else null.
52
+ *
53
+ * HTML comments are stripped first, each replaced by its own newlines, so a
54
+ * <style> inside <!-- … --> is not scanned and line numbers do not shift. That
55
+ * case is real: two account templates carry one and are clean, and a
56
+ * comment-blind detector reports both.
57
+ *
58
+ * A CSS comment protects an OPENER but never a CLOSER, and the asymmetry is the
59
+ * browser's, not a convenience. Style content is raw text to the HTML parser, so
60
+ * `</style>` terminates the element wherever it appears, comment or not. An
61
+ * opener, by contrast, is never a parse event inside a stylesheet — it is text
62
+ * the CSS parser reads as an invalid selector, which is what eats the rule after
63
+ * it. Inside a comment the CSS parser discards it and nothing is eaten: the
64
+ * shipped property-brochure template documents its override slot exactly that
65
+ * way and is correct. */
66
+ export function htmlStyleFaultLine(source) {
67
+ const stripped = source.replace(/<!--[\s\S]*?-->/g, (m) => '\n'.repeat((m.match(/\n/g) ?? []).length));
68
+ const comments = cssCommentSpans(stripped);
69
+ const inComment = (i) => comments.some(([s, e]) => i >= s && i < e);
70
+ const re = /<\s*(\/)?\s*style\b[^>]*>/gi;
71
+ let depth = 0;
72
+ let openLine = 0;
73
+ let m;
74
+ while ((m = re.exec(stripped)) !== null) {
75
+ const line = stripped.slice(0, m.index).split('\n').length;
76
+ if (m[1]) {
77
+ if (depth > 0)
78
+ depth -= 1;
79
+ }
80
+ else if (depth > 0) {
81
+ if (inComment(m.index))
82
+ continue;
83
+ return line;
84
+ }
85
+ else {
86
+ depth = 1;
87
+ openLine = line;
88
+ }
89
+ }
90
+ return depth > 0 ? openLine : null;
91
+ }
92
+ /** Every .html/.htm under `dir` at any depth, skipping the excluded directories.
93
+ * Scope is the whole account with an exclusion list, never a bucket list: a
94
+ * bucket list is what let the live document through, since it sat under
95
+ * sites/<project>/public/, which no quote bucket covers. */
96
+ function listHtmlDeep(dir) {
97
+ const out = [];
98
+ let entries;
99
+ try {
100
+ entries = readdirSync(dir);
101
+ }
102
+ catch {
103
+ return out;
104
+ }
105
+ for (const name of entries) {
106
+ const p = join(dir, name);
107
+ try {
108
+ const st = statSync(p);
109
+ if (st.isDirectory()) {
110
+ if (!EXCLUDED.has(name))
111
+ out.push(...listHtmlDeep(p));
112
+ }
113
+ else if (st.isFile()) {
114
+ const lower = name.toLowerCase();
115
+ if (lower.endsWith('.html') || lower.endsWith('.htm'))
116
+ out.push(p);
117
+ }
118
+ }
119
+ catch {
120
+ // An entry that vanished mid-walk is not a finding.
121
+ }
122
+ }
123
+ return out;
124
+ }
125
+ function listDirs(dir) {
126
+ try {
127
+ return readdirSync(dir)
128
+ .map((n) => join(dir, n))
129
+ .filter((p) => {
130
+ try {
131
+ return statSync(p).isDirectory();
132
+ }
133
+ catch {
134
+ return false;
135
+ }
136
+ });
137
+ }
138
+ catch {
139
+ return [];
140
+ }
141
+ }
142
+ /** Walk one account's HTML documents and report every malformed one. */
143
+ export function collectAccountHtmlFindings(accountDir, accountId) {
144
+ const findings = [];
145
+ let documents = 0;
146
+ for (const f of listHtmlDeep(accountDir)) {
147
+ documents += 1;
148
+ let source;
149
+ try {
150
+ source = readFileSync(f, 'utf8');
151
+ }
152
+ catch {
153
+ // An unreadable document is not evidence of a fault.
154
+ continue;
155
+ }
156
+ const line = htmlStyleFaultLine(source);
157
+ if (line !== null)
158
+ findings.push({ accountId, path: relative(accountDir, f), line });
159
+ }
160
+ return { documents, findings };
161
+ }
162
+ /** One pass over every account. Called from the [quote-reconcile] tick. */
163
+ export function runHtmlStructureCensus(deps) {
164
+ let accounts = 0;
165
+ let documents = 0;
166
+ const findings = [];
167
+ for (const accountDir of listDirs(deps.accountsDir)) {
168
+ if (!existsSync(join(accountDir, 'account.json')))
169
+ continue;
170
+ accounts += 1;
171
+ const accountId = accountDir.slice(accountDir.lastIndexOf('/') + 1);
172
+ try {
173
+ const r = collectAccountHtmlFindings(accountDir, accountId);
174
+ documents += r.documents;
175
+ findings.push(...r.findings);
176
+ }
177
+ catch {
178
+ // One unreadable account never aborts the run.
179
+ }
180
+ }
181
+ for (const f of findings)
182
+ deps.logger(formatHtmlStructureFinding(f));
183
+ deps.logger(formatHtmlStructureCensusSummary(accounts, documents, findings.length));
184
+ }
185
+ //# sourceMappingURL=html-structure-census.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-structure-census.js","sourceRoot":"","sources":["../src/html-structure-census.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
@@ -2837,6 +2837,11 @@ export function buildHttpApp(deps) {
2837
2837
  // respawns ONLY a wedged one (busy → idempotent-busy reply; not-live → a
2838
2838
  // no-op `live:false`). Carried only by the gateway's recovery pass.
2839
2839
  const recover = body.recover === true;
2840
+ // Task 2466 — the gateway's answer to "is this session's channel server
2841
+ // attached under any conversation key". Only meaningful alongside
2842
+ // recover:true; absent or non-boolean reads as false, which leaves the
2843
+ // freshness signals in charge exactly as before this task.
2844
+ const subscriberAttached = body.subscriberAttached === true;
2840
2845
  // Task 724 — the bridge routes EVERY role=admin channel inbound here, not
2841
2846
  // just WhatsApp, and supplies the real channel (+ role, senderId) so the
2842
2847
  // classification sidecar below records the actual channel. The WaGateway
@@ -2972,16 +2977,38 @@ export function buildHttpApp(deps) {
2972
2977
  catch {
2973
2978
  jsonlMtimeMs = null;
2974
2979
  }
2980
+ const now = Date.now();
2981
+ const staleMs = finitePositive(process.env.WEBCHAT_WEDGE_STALE_MS, 20_000);
2982
+ // One variable, read by both the classifier and the line below, so the
2983
+ // audit reports the value the verdict was actually computed from. A
2984
+ // missing row and a row that was never refreshed both arrive here as 0
2985
+ // and the classifier cannot tell them apart; the log must not imply it
2986
+ // can.
2987
+ const updatedAt = liveRow?.updatedAt ?? 0;
2975
2988
  const klass = classifyLiveness({
2989
+ subscriberAttached,
2976
2990
  jsonlMtimeMs,
2977
2991
  status: liveRow?.status,
2978
- updatedAt: liveRow?.updatedAt ?? 0,
2979
- now: Date.now(),
2980
- staleMs: finitePositive(process.env.WEBCHAT_WEDGE_STALE_MS, 20_000),
2992
+ updatedAt,
2993
+ now,
2994
+ staleMs,
2981
2995
  });
2996
+ // Task 2466 — the kill decision's own record. Before this, a correct
2997
+ // wedged verdict and a wrong one were byte-identical in server.log:
2998
+ // op=recover-respawn carried the outcome and none of the inputs, which is
2999
+ // why the 2026-08-06 misclassification stayed invisible until the respawn
3000
+ // was traced for another reason. Emitted on BOTH verdicts, so the busy
3001
+ // path is auditable too. `verdict=wedged subscriber=attached` is
3002
+ // impossible once this lands; a non-zero count is the regression signal.
3003
+ deps.logger(`[rc-spawn] op=recover-classify sessionId=${sessionId.slice(0, 8)} verdict=${klass}` +
3004
+ ` subscriber=${subscriberAttached ? 'attached' : 'absent'}` +
3005
+ ` jsonlAgeMs=${jsonlMtimeMs == null ? 'null' : Math.max(0, Math.round(now - jsonlMtimeMs))}` +
3006
+ ` updatedAtAgeMs=${Math.max(0, Math.round(now - updatedAt))}` +
3007
+ ` status=${liveRow?.status ?? 'null'}`);
2982
3008
  if (klass === 'busy') {
2983
- // Making progress (or just slow): never kill mid-turn. The channel
2984
- // server's 2s auto-reconnect will drain the queue once it frees up.
3009
+ // Making progress, reachable, or just slow: never kill mid-turn. The
3010
+ // channel server's 2s auto-reconnect will drain the queue once it
3011
+ // frees up.
2985
3012
  deps.logger(`[rc-spawn] op=recover-busy sessionId=${sessionId.slice(0, 8)}`);
2986
3013
  timed(deps.logger, 'POST', '/rc-spawn', 200, Date.now() - start);
2987
3014
  return c.json({ live: true, classification: 'busy', recovered: false, sessionId }, 200);