@rubytech/create-maxy-code 0.1.551 → 0.1.553

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 (289) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/routine-templates/dist/index.d.ts +15 -2
  3. package/payload/platform/lib/routine-templates/dist/index.d.ts.map +1 -1
  4. package/payload/platform/lib/routine-templates/dist/index.js +25 -1
  5. package/payload/platform/lib/routine-templates/dist/index.js.map +1 -1
  6. package/payload/platform/lib/routine-templates/dist/roster.d.ts +76 -1
  7. package/payload/platform/lib/routine-templates/dist/roster.d.ts.map +1 -1
  8. package/payload/platform/lib/routine-templates/dist/roster.js +60 -3
  9. package/payload/platform/lib/routine-templates/dist/roster.js.map +1 -1
  10. package/payload/platform/lib/routine-templates/src/__tests__/roster.test.ts +93 -1
  11. package/payload/platform/lib/routine-templates/src/__tests__/seed.test.ts +74 -0
  12. package/payload/platform/lib/routine-templates/src/index.ts +25 -1
  13. package/payload/platform/lib/routine-templates/src/roster.ts +111 -2
  14. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +11 -0
  15. package/payload/platform/plugins/scheduling/PLUGIN.md +54 -4
  16. package/payload/platform/plugins/scheduling/mcp/dist/index.js +113 -6
  17. package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
  18. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-freebusy.test.d.ts +2 -0
  19. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-freebusy.test.d.ts.map +1 -0
  20. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-freebusy.test.js +216 -0
  21. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-freebusy.test.js.map +1 -0
  22. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.d.ts +2 -0
  23. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.d.ts.map +1 -0
  24. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.js +44 -0
  25. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.js.map +1 -0
  26. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.d.ts +2 -0
  27. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.d.ts.map +1 -0
  28. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.js +128 -0
  29. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.js.map +1 -0
  30. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.d.ts +2 -0
  31. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.d.ts.map +1 -0
  32. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.js +92 -0
  33. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.js.map +1 -0
  34. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.d.ts +2 -0
  35. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.d.ts.map +1 -0
  36. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.js +135 -0
  37. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.js.map +1 -0
  38. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js +210 -2
  39. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js.map +1 -1
  40. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js +18 -1
  41. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js.map +1 -1
  42. package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.d.ts +86 -0
  43. package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.d.ts.map +1 -0
  44. package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.js +240 -0
  45. package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.js.map +1 -0
  46. package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.d.ts +2 -0
  47. package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.d.ts.map +1 -0
  48. package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.js +47 -0
  49. package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.js.map +1 -0
  50. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts +92 -0
  51. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts.map +1 -0
  52. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js +193 -0
  53. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js.map +1 -0
  54. package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.d.ts +8 -1
  55. package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.d.ts.map +1 -1
  56. package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.js.map +1 -1
  57. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts +152 -1
  58. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts.map +1 -1
  59. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js +472 -0
  60. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js.map +1 -1
  61. package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.d.ts.map +1 -1
  62. package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.js +11 -1
  63. package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.js.map +1 -1
  64. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/gate-dispatch-wiring.test.d.ts +2 -0
  65. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/gate-dispatch-wiring.test.d.ts.map +1 -0
  66. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/gate-dispatch-wiring.test.js +146 -0
  67. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/gate-dispatch-wiring.test.js.map +1 -0
  68. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts +27 -0
  69. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts.map +1 -1
  70. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js +18 -0
  71. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js.map +1 -1
  72. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +146 -64
  73. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
  74. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-connector-busy-sync.test.js +84 -1
  75. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-connector-busy-sync.test.js.map +1 -1
  76. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.d.ts +2 -0
  77. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.d.ts.map +1 -0
  78. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.js +200 -0
  79. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.js.map +1 -0
  80. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.d.ts +2 -0
  81. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.d.ts.map +1 -0
  82. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js +238 -0
  83. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js.map +1 -0
  84. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.d.ts +2 -0
  85. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.d.ts.map +1 -0
  86. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.js +208 -0
  87. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.js.map +1 -0
  88. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.d.ts +2 -0
  89. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.d.ts.map +1 -0
  90. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js +291 -0
  91. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js.map +1 -0
  92. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.d.ts +26 -2
  93. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.d.ts.map +1 -1
  94. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.js +51 -2
  95. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.js.map +1 -1
  96. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts +71 -0
  97. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts.map +1 -1
  98. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +109 -1
  99. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
  100. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts +3 -1
  101. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
  102. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +124 -3
  103. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
  104. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts +148 -0
  105. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts.map +1 -0
  106. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js +410 -0
  107. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js.map +1 -0
  108. package/payload/platform/plugins/scheduling/mcp/package.json +1 -0
  109. package/payload/platform/plugins/workflows/skills/workflow-manager/SKILL.md +4 -0
  110. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  111. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +1 -0
  112. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  113. package/payload/platform/services/claude-session-manager/dist/pty-census.d.ts +51 -4
  114. package/payload/platform/services/claude-session-manager/dist/pty-census.d.ts.map +1 -1
  115. package/payload/platform/services/claude-session-manager/dist/pty-census.js +60 -10
  116. package/payload/platform/services/claude-session-manager/dist/pty-census.js.map +1 -1
  117. package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.d.ts +64 -1
  118. package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.d.ts.map +1 -1
  119. package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.js +189 -6
  120. package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.js.map +1 -1
  121. package/payload/server/public/activity.html +5 -5
  122. package/payload/server/public/agents.html +4 -4
  123. package/payload/server/public/assets/{AdminLoginScreens-Bjcs9ta9.js → AdminLoginScreens-Ca2QhL18.js} +1 -1
  124. package/payload/server/public/assets/AdminLoginScreens-Ca2QhL18.js.br +0 -0
  125. package/payload/server/public/assets/AdminLoginScreens-Ca2QhL18.js.gz +0 -0
  126. package/payload/server/public/assets/{AdminShell-DVBAMUCy.js → AdminShell-Dc5du5xX.js} +1 -1
  127. package/payload/server/public/assets/AdminShell-Dc5du5xX.js.br +0 -0
  128. package/payload/server/public/assets/AdminShell-Dc5du5xX.js.gz +0 -0
  129. package/payload/server/public/assets/{activity-C8E8-EwQ.js → activity-TSDKmIYb.js} +1 -1
  130. package/payload/server/public/assets/activity-TSDKmIYb.js.br +0 -0
  131. package/payload/server/public/assets/activity-TSDKmIYb.js.gz +0 -0
  132. package/payload/server/public/assets/{admin-CeWAlpRS.js → admin-Ba729Eyg.js} +1 -1
  133. package/payload/server/public/assets/admin-Ba729Eyg.js.br +0 -0
  134. package/payload/server/public/assets/admin-Ba729Eyg.js.gz +0 -0
  135. package/payload/server/public/assets/{agents-DuN92iFb.js → agents-9hlQHOS5.js} +1 -1
  136. package/payload/server/public/assets/agents-9hlQHOS5.js.br +0 -0
  137. package/payload/server/public/assets/agents-9hlQHOS5.js.gz +0 -0
  138. package/payload/server/public/assets/{browser-BxebdKbh.js → browser-BrqoCsqh.js} +1 -1
  139. package/payload/server/public/assets/browser-BrqoCsqh.js.br +0 -0
  140. package/payload/server/public/assets/browser-BrqoCsqh.js.gz +0 -0
  141. package/payload/server/public/assets/{calendar-BtFZQ5Np.js → calendar-DOObQ_m8.js} +1 -1
  142. package/payload/server/public/assets/calendar-DOObQ_m8.js.br +0 -0
  143. package/payload/server/public/assets/calendar-DOObQ_m8.js.gz +0 -0
  144. package/payload/server/public/assets/chat-Xaul2lLF.js +1 -0
  145. package/payload/server/public/assets/chat-Xaul2lLF.js.br +3 -0
  146. package/payload/server/public/assets/chat-Xaul2lLF.js.gz +0 -0
  147. package/payload/server/public/assets/chevron-left-BYH5vH4S.js +1 -0
  148. package/payload/server/public/assets/chevron-left-BYH5vH4S.js.br +0 -0
  149. package/payload/server/public/assets/chevron-right-XxQPHfNH.js +1 -0
  150. package/payload/server/public/assets/chevron-right-XxQPHfNH.js.br +0 -0
  151. package/payload/server/public/assets/clock-BNp2JTKh.js +1 -0
  152. package/payload/server/public/assets/clock-BNp2JTKh.js.br +0 -0
  153. package/payload/server/public/assets/clock-BNp2JTKh.js.gz +0 -0
  154. package/payload/server/public/assets/{copy-DCDHXq3O.js → copy-BkbgmpJo.js} +1 -1
  155. package/payload/server/public/assets/copy-BkbgmpJo.js.br +0 -0
  156. package/payload/server/public/assets/copy-BkbgmpJo.js.gz +0 -0
  157. package/payload/server/public/assets/data-yuHj8g0C.js +1 -0
  158. package/payload/server/public/assets/data-yuHj8g0C.js.br +3 -0
  159. package/payload/server/public/assets/data-yuHj8g0C.js.gz +0 -0
  160. package/payload/server/public/assets/{file-text-zQgEQWCF.js → file-text-DDCrqbWB.js} +1 -1
  161. package/payload/server/public/assets/file-text-DDCrqbWB.js.br +0 -0
  162. package/payload/server/public/assets/file-text-DDCrqbWB.js.gz +0 -0
  163. package/payload/server/public/assets/{graph-CFCEh_YI.js → graph-BKPdL5ph.js} +1 -1
  164. package/payload/server/public/assets/graph-BKPdL5ph.js.br +0 -0
  165. package/payload/server/public/assets/graph-BKPdL5ph.js.gz +0 -0
  166. package/payload/server/public/assets/{graph-labels-CA1UcDuS.js → graph-labels-B2PrHK6O.js} +1 -1
  167. package/payload/server/public/assets/graph-labels-B2PrHK6O.js.br +0 -0
  168. package/payload/server/public/assets/graph-labels-B2PrHK6O.js.gz +0 -0
  169. package/payload/server/public/assets/{operator-hFXPDc2X.js → operator-BVULmN09.js} +1 -1
  170. package/payload/server/public/assets/operator-BVULmN09.js.br +0 -0
  171. package/payload/server/public/assets/operator-BVULmN09.js.gz +0 -0
  172. package/payload/server/public/assets/{page-ne7I_r9L.js → page-BbzdSxuU.js} +1 -1
  173. package/payload/server/public/assets/page-BbzdSxuU.js.br +0 -0
  174. package/payload/server/public/assets/page-BbzdSxuU.js.gz +0 -0
  175. package/payload/server/public/assets/{page-C8jyPH_3.js → page-baQ9FQIg.js} +1 -1
  176. package/payload/server/public/assets/page-baQ9FQIg.js.br +0 -0
  177. package/payload/server/public/assets/page-baQ9FQIg.js.gz +0 -0
  178. package/payload/server/public/assets/play-3hlqzxLI.js +1 -0
  179. package/payload/server/public/assets/play-3hlqzxLI.js.br +0 -0
  180. package/payload/server/public/assets/play-3hlqzxLI.js.gz +0 -0
  181. package/payload/server/public/assets/{public-BgnqjAal.js → public-B_SEBxWy.js} +1 -1
  182. package/payload/server/public/assets/public-B_SEBxWy.js.br +0 -0
  183. package/payload/server/public/assets/public-B_SEBxWy.js.gz +0 -0
  184. package/payload/server/public/assets/{rotate-ccw-DfJWjXAg.js → rotate-ccw-DzXTXh3g.js} +1 -1
  185. package/payload/server/public/assets/rotate-ccw-DzXTXh3g.js.br +0 -0
  186. package/payload/server/public/assets/rotate-ccw-DzXTXh3g.js.gz +0 -0
  187. package/payload/server/public/assets/routines-BQzE0xzC.js +2 -0
  188. package/payload/server/public/assets/routines-BQzE0xzC.js.br +0 -0
  189. package/payload/server/public/assets/routines-BQzE0xzC.js.gz +0 -0
  190. package/payload/server/public/assets/{skills-D-6EbgfP.js → skills-yCZhYVIs.js} +1 -1
  191. package/payload/server/public/assets/skills-yCZhYVIs.js.br +0 -0
  192. package/payload/server/public/assets/skills-yCZhYVIs.js.gz +0 -0
  193. package/payload/server/public/assets/{tasks-DnN5Fyds.js → tasks-DxNFLsHv.js} +1 -1
  194. package/payload/server/public/assets/tasks-DxNFLsHv.js.br +0 -0
  195. package/payload/server/public/assets/tasks-DxNFLsHv.js.gz +0 -0
  196. package/payload/server/public/assets/{triangle-alert-eh9UOKDT.js → triangle-alert-CYwHTcvU.js} +1 -1
  197. package/payload/server/public/assets/triangle-alert-CYwHTcvU.js.br +0 -0
  198. package/payload/server/public/assets/triangle-alert-CYwHTcvU.js.gz +0 -0
  199. package/payload/server/public/assets/{useCopyFeedback-Bz9OJHBb.js → useCopyFeedback-BCRjKc-H.js} +1 -1
  200. package/payload/server/public/assets/useCopyFeedback-BCRjKc-H.js.br +0 -0
  201. package/payload/server/public/assets/useCopyFeedback-BCRjKc-H.js.gz +0 -0
  202. package/payload/server/public/assets/{useMediaQuery-CNxsjKZp.css → useMediaQuery-Vxpamxqq.css} +1 -1
  203. package/payload/server/public/assets/useMediaQuery-Vxpamxqq.css.br +0 -0
  204. package/payload/server/public/assets/{useMediaQuery-CNxsjKZp.css.gz → useMediaQuery-Vxpamxqq.css.gz} +0 -0
  205. package/payload/server/public/assets/{useVoiceRecorder-BaDpMYxX.js → useVoiceRecorder-BaAtMu9T.js} +1 -1
  206. package/payload/server/public/assets/useVoiceRecorder-BaAtMu9T.js.br +0 -0
  207. package/payload/server/public/assets/useVoiceRecorder-BaAtMu9T.js.gz +0 -0
  208. package/payload/server/public/assets/{wrench-BO-l46rF.js → wrench-iI-vx-g2.js} +1 -1
  209. package/payload/server/public/assets/wrench-iI-vx-g2.js.br +0 -0
  210. package/payload/server/public/assets/wrench-iI-vx-g2.js.gz +0 -0
  211. package/payload/server/public/browser.html +4 -4
  212. package/payload/server/public/calendar.html +8 -8
  213. package/payload/server/public/chat.html +13 -13
  214. package/payload/server/public/data.html +11 -11
  215. package/payload/server/public/graph.html +9 -9
  216. package/payload/server/public/index.html +14 -14
  217. package/payload/server/public/operator.html +14 -14
  218. package/payload/server/public/public.html +13 -13
  219. package/payload/server/public/routines.html +6 -6
  220. package/payload/server/public/skills.html +5 -5
  221. package/payload/server/public/tasks.html +6 -6
  222. package/payload/server/server.js +36 -5
  223. package/payload/server/public/assets/AdminLoginScreens-Bjcs9ta9.js.br +0 -0
  224. package/payload/server/public/assets/AdminLoginScreens-Bjcs9ta9.js.gz +0 -0
  225. package/payload/server/public/assets/AdminShell-DVBAMUCy.js.br +0 -0
  226. package/payload/server/public/assets/AdminShell-DVBAMUCy.js.gz +0 -0
  227. package/payload/server/public/assets/activity-C8E8-EwQ.js.br +0 -0
  228. package/payload/server/public/assets/activity-C8E8-EwQ.js.gz +0 -0
  229. package/payload/server/public/assets/admin-CeWAlpRS.js.br +0 -0
  230. package/payload/server/public/assets/admin-CeWAlpRS.js.gz +0 -0
  231. package/payload/server/public/assets/agents-DuN92iFb.js.br +0 -0
  232. package/payload/server/public/assets/agents-DuN92iFb.js.gz +0 -0
  233. package/payload/server/public/assets/browser-BxebdKbh.js.br +0 -0
  234. package/payload/server/public/assets/browser-BxebdKbh.js.gz +0 -0
  235. package/payload/server/public/assets/calendar-BtFZQ5Np.js.br +0 -0
  236. package/payload/server/public/assets/calendar-BtFZQ5Np.js.gz +0 -0
  237. package/payload/server/public/assets/chat-CGIwynaH.js +0 -1
  238. package/payload/server/public/assets/chat-CGIwynaH.js.br +0 -3
  239. package/payload/server/public/assets/chat-CGIwynaH.js.gz +0 -0
  240. package/payload/server/public/assets/chevron-left-DaNP1zDb.js +0 -1
  241. package/payload/server/public/assets/chevron-left-DaNP1zDb.js.br +0 -0
  242. package/payload/server/public/assets/chevron-right-BbbuTUnt.js +0 -1
  243. package/payload/server/public/assets/chevron-right-BbbuTUnt.js.br +0 -0
  244. package/payload/server/public/assets/clock-CfDdatjp.js +0 -1
  245. package/payload/server/public/assets/clock-CfDdatjp.js.br +0 -0
  246. package/payload/server/public/assets/clock-CfDdatjp.js.gz +0 -0
  247. package/payload/server/public/assets/copy-DCDHXq3O.js.br +0 -0
  248. package/payload/server/public/assets/copy-DCDHXq3O.js.gz +0 -0
  249. package/payload/server/public/assets/data-BchSWOju.js +0 -1
  250. package/payload/server/public/assets/data-BchSWOju.js.br +0 -1
  251. package/payload/server/public/assets/data-BchSWOju.js.gz +0 -0
  252. package/payload/server/public/assets/file-text-zQgEQWCF.js.br +0 -0
  253. package/payload/server/public/assets/file-text-zQgEQWCF.js.gz +0 -0
  254. package/payload/server/public/assets/graph-CFCEh_YI.js.br +0 -0
  255. package/payload/server/public/assets/graph-CFCEh_YI.js.gz +0 -0
  256. package/payload/server/public/assets/graph-labels-CA1UcDuS.js.br +0 -0
  257. package/payload/server/public/assets/graph-labels-CA1UcDuS.js.gz +0 -0
  258. package/payload/server/public/assets/operator-hFXPDc2X.js.br +0 -0
  259. package/payload/server/public/assets/operator-hFXPDc2X.js.gz +0 -0
  260. package/payload/server/public/assets/page-C8jyPH_3.js.br +0 -0
  261. package/payload/server/public/assets/page-C8jyPH_3.js.gz +0 -0
  262. package/payload/server/public/assets/page-ne7I_r9L.js.br +0 -0
  263. package/payload/server/public/assets/page-ne7I_r9L.js.gz +0 -0
  264. package/payload/server/public/assets/play-Ep0SZTbr.js +0 -1
  265. package/payload/server/public/assets/play-Ep0SZTbr.js.br +0 -0
  266. package/payload/server/public/assets/play-Ep0SZTbr.js.gz +0 -0
  267. package/payload/server/public/assets/public-BgnqjAal.js.br +0 -0
  268. package/payload/server/public/assets/public-BgnqjAal.js.gz +0 -0
  269. package/payload/server/public/assets/rotate-ccw-DfJWjXAg.js.br +0 -0
  270. package/payload/server/public/assets/rotate-ccw-DfJWjXAg.js.gz +0 -0
  271. package/payload/server/public/assets/routines-OGFXwTFO.js +0 -2
  272. package/payload/server/public/assets/routines-OGFXwTFO.js.br +0 -0
  273. package/payload/server/public/assets/routines-OGFXwTFO.js.gz +0 -0
  274. package/payload/server/public/assets/skills-D-6EbgfP.js.br +0 -0
  275. package/payload/server/public/assets/skills-D-6EbgfP.js.gz +0 -0
  276. package/payload/server/public/assets/tasks-DnN5Fyds.js.br +0 -0
  277. package/payload/server/public/assets/tasks-DnN5Fyds.js.gz +0 -0
  278. package/payload/server/public/assets/triangle-alert-eh9UOKDT.js.br +0 -0
  279. package/payload/server/public/assets/triangle-alert-eh9UOKDT.js.gz +0 -0
  280. package/payload/server/public/assets/useCopyFeedback-Bz9OJHBb.js.br +0 -0
  281. package/payload/server/public/assets/useCopyFeedback-Bz9OJHBb.js.gz +0 -0
  282. package/payload/server/public/assets/useMediaQuery-CNxsjKZp.css.br +0 -0
  283. package/payload/server/public/assets/useVoiceRecorder-BaDpMYxX.js.br +0 -0
  284. package/payload/server/public/assets/useVoiceRecorder-BaDpMYxX.js.gz +0 -0
  285. package/payload/server/public/assets/wrench-BO-l46rF.js.br +0 -0
  286. package/payload/server/public/assets/wrench-BO-l46rF.js.gz +0 -0
  287. /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js → useMediaQuery-Baf4Huvv.js} +0 -0
  288. /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js.br → useMediaQuery-Baf4Huvv.js.br} +0 -0
  289. /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js.gz → useMediaQuery-Baf4Huvv.js.gz} +0 -0
@@ -1,4 +1,9 @@
1
+ import { readFileSync, renameSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
1
3
  import { scheduleList } from "../tools/schedule-list.js";
4
+ import { readWatermarks } from "../tools/scheduling-gate.js";
5
+ import { resolveConnector } from "./connector-freebusy.js";
6
+ import { firesPerDay } from "./fires-per-day.js";
2
7
  /**
3
8
  * Task 2100 — the standing check for meeting visibility.
4
9
  *
@@ -30,4 +35,471 @@ export async function auditScheduleVisibility(session, accountId, list = schedul
30
35
  console.error(`[schedule-audit] account=${accountId} meetings=${meetings} listable=${listable} invisible=${invisible}`);
31
36
  return { meetings, listable, invisible };
32
37
  }
38
+ /** Neo4j integers arrive as `{low, high}` objects; normalise to a JS number. */
39
+ function num(raw) {
40
+ if (typeof raw === "number")
41
+ return raw;
42
+ if (raw && typeof raw.toNumber === "function") {
43
+ return raw.toNumber();
44
+ }
45
+ return Number(raw ?? 0);
46
+ }
47
+ /**
48
+ * Task 2378 — the gate stuck on false.
49
+ *
50
+ * This is the gate's no-event blind spot, and it is invisible by construction. A
51
+ * gate that answers `false` on every fire emits a skip every fire and looks
52
+ * healthy on every surface: the routine is `scheduled`, `nextRun` keeps
53
+ * advancing, the run records close clean, and no error is written anywhere. The
54
+ * only symptom is silence from a routine that was DESIGNED to be silent, which
55
+ * is why no fire-site line can report it and why it needs a standing check.
56
+ *
57
+ * Always-skipping means every trailing-24h `:RoutineRun` for that event closed
58
+ * `gated`, and there are at least 24 of them. Twenty-four is one day at hourly,
59
+ * the cadence the routine that produced this task held for 15 consecutive days.
60
+ * A genuinely quiet 24 hours does trip it: it WARNs, nothing acts on it, and
61
+ * that is the safe direction — the alternative never sees a permanently muted
62
+ * routine at all.
63
+ *
64
+ * `checked=0` is emitted every tick, including on an install with no gated
65
+ * routines. A check that goes quiet when healthy cannot be distinguished from
66
+ * one that has stopped running.
67
+ *
68
+ * Never throws (honours the sweep's contract).
69
+ */
70
+ export async function auditGateAlwaysSkipping(driver, localAccountIds, nowMs = Date.now()) {
71
+ if (localAccountIds.length === 0)
72
+ return;
73
+ const windowStart = new Date(nowMs - 24 * 60 * 60 * 1000).toISOString();
74
+ const session = driver.session();
75
+ try {
76
+ const res = await session.run(
77
+ // Scoped to `scheduled` gated events, the same predicate every sibling
78
+ // "this row is broken" audit uses: a suspended or cancelled routine is
79
+ // silent because someone asked it to be, and counting it would park this
80
+ // number above zero for ever and kill the alarm.
81
+ `MATCH (e:Event)
82
+ WHERE e.accountId IN $localAccountIds
83
+ AND e.eventStatus = 'scheduled'
84
+ AND e.gatePlugin IS NOT NULL
85
+ AND e.gateTool IS NOT NULL
86
+ OPTIONAL MATCH (r:RoutineRun)-[:RUN_OF]->(e)
87
+ WHERE r.startedAt >= $windowStart
88
+ RETURN e.eventId AS eventId, e.accountId AS accountId,
89
+ count(r) AS runs,
90
+ sum(CASE WHEN r.status = 'gated' THEN 1 ELSE 0 END) AS gatedRuns`, { localAccountIds, windowStart });
91
+ let checked = 0;
92
+ const offenders = [];
93
+ for (const rec of res.records) {
94
+ checked++;
95
+ const runs = num(rec.get("runs"));
96
+ const gatedRuns = num(rec.get("gatedRuns"));
97
+ if (runs >= 24 && gatedRuns === runs) {
98
+ offenders.push({
99
+ eventId: rec.get("eventId"),
100
+ accountId: rec.get("accountId"),
101
+ gatedRuns,
102
+ });
103
+ }
104
+ }
105
+ console.error(`[schedule-audit] op=gate-census checked=${checked} alwaysSkipping=${offenders.length} ` +
106
+ `ok=${offenders.length === 0}`);
107
+ for (const o of offenders) {
108
+ console.error(`[schedule-audit] op=gate-always-skipping eventId=${o.eventId.slice(0, 8)} ` +
109
+ `acct=${o.accountId.slice(0, 8)} gatedRuns=${o.gatedRuns} sinceHours=24`);
110
+ }
111
+ }
112
+ catch (err) {
113
+ console.error(`[schedule-audit] op=gate-census-error detail=${err instanceof Error ? err.message : String(err)}`);
114
+ }
115
+ finally {
116
+ try {
117
+ await session.close();
118
+ }
119
+ catch {
120
+ // ignore
121
+ }
122
+ }
123
+ }
124
+ /**
125
+ * Task 2378 — the watermark that stopped advancing.
126
+ *
127
+ * The opposite failure to the one above, and just as quiet. Only the agent turn
128
+ * commits a watermark, at the end of a successful run. If those commits stop —
129
+ * a prompt edited back to its pre-gate wording, a turn that always dies before
130
+ * its last step — the gate keeps comparing against a frozen position, reports
131
+ * work on every fire, and the routine runs every time. There is no error, no
132
+ * missing line and no failed call; it simply reads as a busy week while the
133
+ * whole saving is gone.
134
+ *
135
+ * `op=commit` is emitted only on a successful commit, so its ABSENCE is the
136
+ * signal, and an absence is not greppable on its own. This is the greppable
137
+ * form of it. Together with the always-skipping check it bounds the same 24-hour
138
+ * window from opposite ends: one catches a gate that never passes, this one a
139
+ * gate that never stops passing.
140
+ *
141
+ * Only a routine that has actually fired is judged. A gate bound minutes ago has
142
+ * no commit yet and is not late.
143
+ *
144
+ * `acct=` lines are emitted every tick including when nothing is late. Never
145
+ * throws (honours the sweep's contract).
146
+ */
147
+ export async function auditGateWatermarkAge(driver, localAccountIds, platformRoot, nowMs = Date.now()) {
148
+ if (localAccountIds.length === 0)
149
+ return;
150
+ const session = driver.session();
151
+ try {
152
+ const res = await session.run(`MATCH (e:Event)
153
+ WHERE e.accountId IN $localAccountIds
154
+ AND e.eventStatus = 'scheduled'
155
+ AND e.gatePlugin IS NOT NULL
156
+ AND e.gateTool IS NOT NULL
157
+ AND e.lastTriggered IS NOT NULL
158
+ RETURN e.eventId AS eventId, e.accountId AS accountId`, { localAccountIds });
159
+ // Worst age per account, so one line per account answers "is any gate on
160
+ // this account running blind". Driven by localAccountIds below, not by the
161
+ // result rows: an account with no gated routines emits `-`, and skipping it
162
+ // would make "nothing to check" and "not looked at" the same silence.
163
+ const worst = new Map();
164
+ for (const rec of res.records) {
165
+ const eventId = rec.get("eventId");
166
+ const accountId = rec.get("accountId");
167
+ const marks = readWatermarks(eventId, platformRoot);
168
+ // A routine that has fired and never committed is maximally late, not
169
+ // exempt: never having committed is the state this check exists to find.
170
+ const ageHours = marks.lastCommitAt && !Number.isNaN(Date.parse(marks.lastCommitAt))
171
+ ? (nowMs - Date.parse(marks.lastCommitAt)) / 3_600_000
172
+ : Number.POSITIVE_INFINITY;
173
+ const current = worst.get(accountId);
174
+ if (current === undefined || ageHours > current) {
175
+ worst.set(accountId, ageHours);
176
+ }
177
+ }
178
+ for (const accountId of localAccountIds) {
179
+ const age = worst.get(accountId);
180
+ if (age === undefined) {
181
+ console.error(`[schedule-audit] op=gate-watermark-age acct=${accountId.slice(0, 8)} ` +
182
+ `lastCommitAgeHours=- ok=true`);
183
+ continue;
184
+ }
185
+ const ok = age <= 24;
186
+ console.error(`[schedule-audit] op=gate-watermark-age acct=${accountId.slice(0, 8)} ` +
187
+ `lastCommitAgeHours=${age === Number.POSITIVE_INFINITY ? "never" : Math.round(age)} ok=${ok}`);
188
+ }
189
+ }
190
+ catch (err) {
191
+ console.error(`[schedule-audit] op=gate-watermark-age-error detail=${err instanceof Error ? err.message : String(err)}`);
192
+ }
193
+ finally {
194
+ try {
195
+ await session.close();
196
+ }
197
+ catch {
198
+ // ignore
199
+ }
200
+ }
201
+ }
202
+ /**
203
+ * The next state for one account.
204
+ *
205
+ * The `none` instant survives consecutive `none` observations and is discarded
206
+ * the moment a connector returns, which is what makes `noneForHours` the length
207
+ * of the CURRENT run rather than a cumulative total. A recovery followed by a
208
+ * fresh revocation therefore starts counting again from zero, which is correct:
209
+ * the operator's exposure began when the calendar went away this time.
210
+ */
211
+ export function nextConnectorState(prev, connector, nowMs) {
212
+ if (connector !== "none")
213
+ return { connector, noneSinceMs: null };
214
+ return { connector: "none", noneSinceMs: prev?.noneSinceMs ?? nowMs };
215
+ }
216
+ /** Whole hours the account has resolved `none` without interruption. */
217
+ export function noneForHours(entry, nowMs) {
218
+ if (entry.noneSinceMs === null)
219
+ return 0;
220
+ return Math.max(0, Math.floor((nowMs - entry.noneSinceMs) / 3_600_000));
221
+ }
222
+ /** Read the persisted run lengths. An absent or corrupt file reads as empty,
223
+ * which restarts every account's clock — it can delay an alarm by 24 hours but
224
+ * never raises a false one. A corrupt file is reported, because it is the cause
225
+ * of a fleet-wide clock reset and that reset must carry its own explanation. */
226
+ function readConnectorState(path) {
227
+ let raw;
228
+ try {
229
+ raw = readFileSync(path, "utf-8");
230
+ }
231
+ catch {
232
+ return {}; // absent — the normal first-run case
233
+ }
234
+ try {
235
+ const parsed = JSON.parse(raw);
236
+ return parsed && typeof parsed === "object" ? parsed : {};
237
+ }
238
+ catch (err) {
239
+ console.error(`[schedule-audit] op=connector-state result=unreadable path=${path} ` +
240
+ `reason=${JSON.stringify(err.message)} impact=every-account-clock-reset`);
241
+ return {};
242
+ }
243
+ }
244
+ /** Written to a temp path and renamed, so a kill mid-write cannot leave
245
+ * truncated JSON that reads back as empty and resets every clock. */
246
+ function writeConnectorState(path, state) {
247
+ const tmp = `${path}.tmp`;
248
+ try {
249
+ writeFileSync(tmp, JSON.stringify(state));
250
+ renameSync(tmp, path);
251
+ }
252
+ catch (err) {
253
+ console.error(`[schedule-audit] op=connector-state result=write-failed path=${path} ` +
254
+ `reason=${JSON.stringify(err.message)} impact=none-run-length-never-grows`);
255
+ }
256
+ }
257
+ /**
258
+ * Task 2381 — the standing half of the connector-resolution signal.
259
+ *
260
+ * A revoked or expired authorisation makes every fire of the busy sync write an
261
+ * empty busy list. The action succeeds, the `:RoutineRun` closes clean, nothing
262
+ * errors, and the visible result is a booking page offering slots the operator is
263
+ * not free for. The per-fire `[connector-busy-sync] op=resolved connector=none`
264
+ * line IS emitted every fire, but one healthy-looking line among thousands is not
265
+ * a signal — this is what turns a persistent `none` into one.
266
+ *
267
+ * `ok=false` when an account has resolved `none` for more than 24 consecutive
268
+ * hours WHILE holding a scheduled busy-sync routine. An account with genuinely no
269
+ * calendar and no such routine reports a growing `noneForHours` and `ok=true`:
270
+ * nothing is scheduled to use a connector it does not have, so there is no
271
+ * exposure to report.
272
+ *
273
+ * The routine predicate matches the converted `action` form and the agent form
274
+ * that precedes it, so the audit is live from the day it ships rather than from
275
+ * the day the conversion lands.
276
+ *
277
+ * One line per local account per tick, including every healthy one. A check that
278
+ * goes quiet when healthy cannot be distinguished from one that has stopped
279
+ * running. Never throws (honours the sweep's contract).
280
+ */
281
+ export async function auditConnectorResolution(driver, localAccountIds, accountsDir, statePath, nowMs) {
282
+ if (localAccountIds.length === 0)
283
+ return;
284
+ const session = driver.session();
285
+ let withSyncRoutine;
286
+ try {
287
+ const res = await session.run(`MATCH (e:Event)
288
+ WHERE e.accountId IN $localAccountIds
289
+ AND e.eventStatus = 'scheduled'
290
+ AND ( e.actionTool = 'schedule-connector-busy-sync'
291
+ OR e.agentPrompt CONTAINS 'schedule-connector-busy-sync' )
292
+ RETURN DISTINCT e.accountId AS accountId`, { localAccountIds });
293
+ withSyncRoutine = new Set(res.records.map((r) => r.get("accountId")));
294
+ }
295
+ catch (err) {
296
+ console.error(`[schedule-audit] op=connector-resolution-error detail=${err instanceof Error ? err.message : String(err)}`);
297
+ return;
298
+ }
299
+ finally {
300
+ try {
301
+ await session.close();
302
+ }
303
+ catch {
304
+ // ignore
305
+ }
306
+ }
307
+ const state = readConnectorState(statePath);
308
+ // Driven by localAccountIds, not by the query result: an account resolving
309
+ // nothing returns no row, and skipping it would make "healthy" and "not looked
310
+ // at" the same silence on a multi-account box.
311
+ for (const accountId of localAccountIds) {
312
+ let connector;
313
+ try {
314
+ connector = resolveConnector(join(accountsDir, accountId)).connector;
315
+ }
316
+ catch (err) {
317
+ // detectCalendarConnectors throws when a connector directory exists but is
318
+ // unreadable. That is "the input is unknown", not "there is no connector",
319
+ // and reporting it as `none` would dress a real fault as the boring case.
320
+ console.error(`[schedule-audit] op=connector-resolution-error acct=${accountId.slice(0, 8)} ` +
321
+ `detail=${err instanceof Error ? err.message : String(err)}`);
322
+ continue;
323
+ }
324
+ const entry = nextConnectorState(state[accountId], connector, nowMs);
325
+ state[accountId] = entry;
326
+ const hours = noneForHours(entry, nowMs);
327
+ const ok = !(hours > 24 && withSyncRoutine.has(accountId));
328
+ console.error(`[schedule-audit] op=connector-resolution acct=${accountId.slice(0, 8)} ` +
329
+ `connector=${connector} noneForHours=${hours} ok=${ok}`);
330
+ }
331
+ writeConnectorState(statePath, state);
332
+ }
333
+ /**
334
+ * Task 2380 — the install's agent-bearing fire rate, counted from the rows.
335
+ *
336
+ * `recurrencePrevious` records a change made through `schedule-update` and
337
+ * nothing else. A direct Cypher write, a restore, or a future editor changes the
338
+ * row and emits nothing, and the writer that skipped the log skipped the stamp
339
+ * too — so no property on the row can detect it. This totals the rate from the
340
+ * rows themselves, which means a change by ANY writer moves the number on the
341
+ * next tick. It is a census, not an alarm: its value is that the total is
342
+ * greppable across days.
343
+ *
344
+ * Only `scheduled` rows are counted, because the sweep selects that literal by
345
+ * equality (check-due-events.ts:502, :567, :704, :768) and a suspended routine's
346
+ * fire rate is zero, not unknown. Each row is counted in its own timezone.
347
+ *
348
+ * `ok=false` in exactly one case: nothing counted while agent-bearing rows exist
349
+ * at any status. That is the Task 2231 vacuity guard — a zero that means "the
350
+ * enumeration found nothing" must not read the same as a zero that means "there
351
+ * is nothing". An install whose agent routines are all suspended reports
352
+ * `ok=false`, and it clears the moment one is resumed.
353
+ *
354
+ * A gate (Task 2378) does not reduce the count. The gate skips the INJECT; the
355
+ * fire still happens and still costs a headless tool call, so the rate this
356
+ * reports is the rate of fires, which is what it claims to be.
357
+ *
358
+ * Never throws; the sweep's contract.
359
+ */
360
+ export async function auditFireRateCensus(driver, localAccountIds) {
361
+ if (localAccountIds.length === 0)
362
+ return;
363
+ const session = driver.session();
364
+ try {
365
+ // Every agent-bearing row on the account regardless of status or
366
+ // recurrence: the wider set is what makes the vacuity guard meaningful, and
367
+ // splitting it into a second query would let the two disagree.
368
+ const res = await session.run(`MATCH (e:Event)
369
+ WHERE e.accountId IN $localAccountIds
370
+ AND e.agentChannel IS NOT NULL
371
+ AND e.agentDestination IS NOT NULL
372
+ AND e.agentPrompt IS NOT NULL
373
+ RETURN e.accountId AS accountId, e.eventId AS eventId,
374
+ e.recurrence AS recurrence, e.timezone AS timezone,
375
+ e.eventStatus AS eventStatus`, { localAccountIds });
376
+ const countedAt = new Date();
377
+ const tally = new Map();
378
+ for (const accountId of localAccountIds) {
379
+ tally.set(accountId, { bearing: 0, routines: 0, fires: 0 });
380
+ }
381
+ for (const rec of res.records) {
382
+ const accountId = rec.get("accountId");
383
+ const acc = tally.get(accountId);
384
+ // The predicate cannot return an account this host does not serve, but
385
+ // counting one would silently inflate somebody else's total.
386
+ if (!acc)
387
+ continue;
388
+ acc.bearing++;
389
+ const recurrence = (rec.get("recurrence") ?? null);
390
+ const eventStatus = (rec.get("eventStatus") ?? null);
391
+ if (recurrence === null || eventStatus !== "scheduled")
392
+ continue;
393
+ try {
394
+ acc.fires += firesPerDay(recurrence, (rec.get("timezone") ?? null), countedAt);
395
+ acc.routines++;
396
+ }
397
+ catch {
398
+ // Named rather than swallowed, and dropped from both figures: one row
399
+ // written by hand must not cost the account its total.
400
+ const eventId = String(rec.get("eventId") ?? "-").slice(0, 8);
401
+ console.error(`[schedule-audit] op=fire-rate-census-unparsable acct=${accountId.slice(0, 8)} ` +
402
+ `eventId=${eventId} recurrence=${recurrence}`);
403
+ }
404
+ }
405
+ // Driven by localAccountIds, not by the result rows: an account with no
406
+ // agent routines returns none, and skipping it would make "healthy" and
407
+ // "not looked at" the same silence.
408
+ for (const accountId of localAccountIds) {
409
+ const c = tally.get(accountId);
410
+ const ok = !(c.routines === 0 && c.bearing > 0);
411
+ console.error(`[schedule-audit] op=fire-rate-census acct=${accountId.slice(0, 8)} ` +
412
+ `agentRoutines=${c.routines} agentFiresPerDay=${c.fires} ok=${ok}`);
413
+ }
414
+ }
415
+ catch (err) {
416
+ console.error(`[schedule-audit] op=fire-rate-census-error detail=${err instanceof Error ? err.message : String(err)}`);
417
+ }
418
+ finally {
419
+ try {
420
+ await session.close();
421
+ }
422
+ catch {
423
+ // ignore
424
+ }
425
+ }
426
+ }
427
+ /**
428
+ * Task 2383 — how the fleet's recurring agent routines answered the gate
429
+ * question.
430
+ *
431
+ * The Task 2378 checks watch a gate that is configured. This one watches whether
432
+ * one was configured at all, and the blind spot it exists for is `gateWaived`
433
+ * becoming the path of least resistance: every waiver is individually logged and
434
+ * individually reasonable, and the fleet drifts back to ungated one justified
435
+ * exception at a time. No single event marks that and it does not reproduce. It
436
+ * is a population moving, not an action failing.
437
+ *
438
+ * So `waived` carries no threshold and never fails the check. It is a number to
439
+ * read across weeks, and the drift it measures is a judgement the operator makes,
440
+ * not a condition code can decide. Only `unclassified` fails: a recurring agent
441
+ * routine that answered neither question, which after this task means a row
442
+ * written before it, or by a path that bypassed `schedule-event`.
443
+ *
444
+ * The population is the one the write-time refusal covers — scheduled, recurring,
445
+ * complete agent dispatch — so the control and the census cannot disagree about
446
+ * what they are counting. A row holding both a gate and a waiver counts as gated,
447
+ * because the gate is what the dispatcher acts on. A blank waiver counts as
448
+ * unclassified, the same rule the write applies.
449
+ *
450
+ * Emitted every tick including zero: a check that goes quiet when healthy cannot
451
+ * be distinguished from one that has stopped running. Never throws. An unreadable
452
+ * census emits `op=gate-classification-unavailable` INSTEAD of the count line and
453
+ * never alongside it, so a database that is down is never read as a fleet that is
454
+ * fully classified.
455
+ */
456
+ export async function auditGateClassification(driver, localAccountIds) {
457
+ if (localAccountIds.length === 0)
458
+ return;
459
+ const session = driver.session();
460
+ try {
461
+ const res = await session.run(`MATCH (e:Event)
462
+ WHERE e.accountId IN $localAccountIds
463
+ AND e.eventStatus = 'scheduled'
464
+ AND e.recurrence IS NOT NULL
465
+ AND e.agentChannel IS NOT NULL
466
+ AND e.agentDestination IS NOT NULL
467
+ AND e.agentPrompt IS NOT NULL
468
+ RETURN e.accountId AS accountId, e.gatePlugin AS gatePlugin, e.gateWaived AS gateWaived`, { localAccountIds });
469
+ const newTally = () => ({ total: 0, gated: 0, waived: 0, unclassified: 0 });
470
+ const byAccount = new Map(localAccountIds.map((id) => [id, newTally()]));
471
+ for (const rec of res.records) {
472
+ const accountId = rec.get("accountId");
473
+ let tally = byAccount.get(accountId);
474
+ if (!tally) {
475
+ tally = newTally();
476
+ byAccount.set(accountId, tally);
477
+ }
478
+ tally.total++;
479
+ const waived = rec.get("gateWaived");
480
+ if (rec.get("gatePlugin"))
481
+ tally.gated++;
482
+ else if (typeof waived === "string" && waived.trim())
483
+ tally.waived++;
484
+ else
485
+ tally.unclassified++;
486
+ }
487
+ for (const [accountId, t] of byAccount) {
488
+ console.error(`[schedule-audit] op=gate-classification acct=${accountId.slice(0, 8)} ` +
489
+ `agentRoutines=${t.total} gated=${t.gated} waived=${t.waived} ` +
490
+ `unclassified=${t.unclassified} ok=${t.unclassified === 0}`);
491
+ }
492
+ }
493
+ catch (err) {
494
+ console.error(`[schedule-audit] op=gate-classification-unavailable reason=${err instanceof Error ? err.message : String(err)}`);
495
+ }
496
+ finally {
497
+ try {
498
+ await session.close();
499
+ }
500
+ catch {
501
+ // ignore
502
+ }
503
+ }
504
+ }
33
505
  //# sourceMappingURL=schedule-audit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schedule-audit.js","sourceRoot":"","sources":["../../src/lib/schedule-audit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAgB,EAChB,SAAiB,EACjB,OAA4B,YAAY;IAExC,MAAM,OAAO,GAAG,KAAK,EAAE,KAAa,EAAmB,EAAE;QACvD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3B,YAAY,KAAK,uDAAuD,EACxE,EAAE,SAAS,EAAE,CACd,CAAC;QACF,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5C,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,+EAA+E;IAC/E,oCAAoC;IACpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IACjE,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAEtC,OAAO,CAAC,KAAK,CACX,4BAA4B,SAAS,aAAa,QAAQ,aAAa,QAAQ,cAAc,SAAS,EAAE,CACzG,CAAC;IACF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"schedule-audit.js","sourceRoot":"","sources":["../../src/lib/schedule-audit.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"update-summary.d.ts","sourceRoot":"","sources":["../../src/lib/update-summary.ts"],"names":[],"mappings":"AAMA,gFAAgF;AAChF,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACvB;AASD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAO5D;AAID,sGAAsG;AACtG,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAU/E"}
1
+ {"version":3,"file":"update-summary.d.ts","sourceRoot":"","sources":["../../src/lib/update-summary.ts"],"names":[],"mappings":"AAMA,gFAAgF;AAChF,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACvB;AAmBD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAO5D;AAID,sGAAsG;AACtG,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAU/E"}
@@ -6,7 +6,17 @@
6
6
  // Written on every call, or as a consequence of one, and never the thing the caller wants
7
7
  // confirmed. `notes` is here for the auto-appended suspend/resume line; a caller-supplied note is
8
8
  // reported through `noteAppended` instead.
9
- const BOOKKEEPING = new Set(["updatedAt", "operatorEdited", "notes", "embedding"]);
9
+ // Task 2380 added `recurrencePrevious` and `recurrenceChangedAt` on the same footing as
10
+ // `operatorEdited`: audit stamps written as a consequence of a change the caller DID ask for.
11
+ // Naming them would tell an agent it wrote properties it never mentioned.
12
+ const BOOKKEEPING = new Set([
13
+ "updatedAt",
14
+ "operatorEdited",
15
+ "notes",
16
+ "embedding",
17
+ "recurrencePrevious",
18
+ "recurrenceChangedAt",
19
+ ]);
10
20
  const CLAUSE_PROPERTY = /^e\.(\w+) = /;
11
21
  /**
12
22
  * The properties a SET clause list writes, in clause order, minus bookkeeping.
@@ -1 +1 @@
1
- {"version":3,"file":"update-summary.js","sourceRoot":"","sources":["../../src/lib/update-summary.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,4FAA4F;AAC5F,4FAA4F;AAC5F,kGAAkG;AAClG,gCAAgC;AAShC,0FAA0F;AAC1F,kGAAkG;AAClG,2CAA2C;AAC3C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;AAEnF,MAAM,eAAe,GAAG,cAAc,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,UAAoB;IAChD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,WAAW,GAAG,qDAAqD,CAAC;AAE1E,sGAAsG;AACtG,MAAM,UAAU,cAAc,CAAC,EAAU,EAAE,MAA4B;IACrE,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,aAAa,EAAE,EAAE,CAAC;IACjF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChF,IAAI,MAAM,CAAC,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,6FAA6F;IAC7F,0EAA0E;IAC1E,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;QAAE,OAAO,OAAO,CAAC;IACvF,OAAO,GAAG,OAAO,IAAI,WAAW,EAAE,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"update-summary.js","sourceRoot":"","sources":["../../src/lib/update-summary.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,4FAA4F;AAC5F,4FAA4F;AAC5F,kGAAkG;AAClG,gCAAgC;AAShC,0FAA0F;AAC1F,kGAAkG;AAClG,2CAA2C;AAC3C,wFAAwF;AACxF,8FAA8F;AAC9F,0EAA0E;AAC1E,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,WAAW;IACX,gBAAgB;IAChB,OAAO;IACP,WAAW;IACX,oBAAoB;IACpB,qBAAqB;CACtB,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,cAAc,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,UAAoB;IAChD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,WAAW,GAAG,qDAAqD,CAAC;AAE1E,sGAAsG;AACtG,MAAM,UAAU,cAAc,CAAC,EAAU,EAAE,MAA4B;IACrE,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,aAAa,EAAE,EAAE,CAAC;IACjF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChF,IAAI,MAAM,CAAC,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,6FAA6F;IAC7F,0EAA0E;IAC1E,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;QAAE,OAAO,OAAO,CAAC;IACvF,OAAO,GAAG,OAAO,IAAI,WAAW,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gate-dispatch-wiring.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-dispatch-wiring.test.d.ts","sourceRoot":"","sources":["../../../src/scripts/__tests__/gate-dispatch-wiring.test.ts"],"names":[],"mappings":""}