@rubytech/create-maxy-code 0.1.552 → 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 (247) 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 +6 -0
  15. package/payload/platform/plugins/scheduling/PLUGIN.md +50 -4
  16. package/payload/platform/plugins/scheduling/mcp/dist/index.js +51 -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-classification.test.d.ts +2 -0
  27. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.d.ts.map +1 -0
  28. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.js +92 -0
  29. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.js.map +1 -0
  30. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js +210 -2
  31. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js.map +1 -1
  32. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js +18 -1
  33. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js.map +1 -1
  34. package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.d.ts +86 -0
  35. package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.d.ts.map +1 -0
  36. package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.js +240 -0
  37. package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.js.map +1 -0
  38. package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.d.ts +2 -0
  39. package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.d.ts.map +1 -0
  40. package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.js +47 -0
  41. package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.js.map +1 -0
  42. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts +1 -1
  43. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts.map +1 -1
  44. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js +9 -1
  45. package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js.map +1 -1
  46. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts +103 -0
  47. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts.map +1 -1
  48. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js +307 -0
  49. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js.map +1 -1
  50. package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.d.ts.map +1 -1
  51. package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.js +11 -1
  52. package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.js.map +1 -1
  53. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +41 -1
  54. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
  55. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-connector-busy-sync.test.js +84 -1
  56. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-connector-busy-sync.test.js.map +1 -1
  57. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.d.ts +2 -0
  58. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.d.ts.map +1 -0
  59. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.js +200 -0
  60. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.js.map +1 -0
  61. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js +21 -1
  62. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js.map +1 -1
  63. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.d.ts +2 -0
  64. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.d.ts.map +1 -0
  65. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.js +208 -0
  66. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.js.map +1 -0
  67. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.d.ts +26 -2
  68. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.d.ts.map +1 -1
  69. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.js +51 -2
  70. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.js.map +1 -1
  71. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts +40 -0
  72. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts.map +1 -1
  73. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +70 -5
  74. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
  75. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
  76. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +67 -0
  77. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
  78. package/payload/platform/plugins/workflows/skills/workflow-manager/SKILL.md +4 -0
  79. package/payload/server/public/activity.html +5 -5
  80. package/payload/server/public/agents.html +4 -4
  81. package/payload/server/public/assets/{AdminLoginScreens-Bjcs9ta9.js → AdminLoginScreens-Ca2QhL18.js} +1 -1
  82. package/payload/server/public/assets/AdminLoginScreens-Ca2QhL18.js.br +0 -0
  83. package/payload/server/public/assets/AdminLoginScreens-Ca2QhL18.js.gz +0 -0
  84. package/payload/server/public/assets/{AdminShell-DVBAMUCy.js → AdminShell-Dc5du5xX.js} +1 -1
  85. package/payload/server/public/assets/AdminShell-Dc5du5xX.js.br +0 -0
  86. package/payload/server/public/assets/AdminShell-Dc5du5xX.js.gz +0 -0
  87. package/payload/server/public/assets/{activity-C8E8-EwQ.js → activity-TSDKmIYb.js} +1 -1
  88. package/payload/server/public/assets/activity-TSDKmIYb.js.br +0 -0
  89. package/payload/server/public/assets/activity-TSDKmIYb.js.gz +0 -0
  90. package/payload/server/public/assets/{admin-CeWAlpRS.js → admin-Ba729Eyg.js} +1 -1
  91. package/payload/server/public/assets/admin-Ba729Eyg.js.br +0 -0
  92. package/payload/server/public/assets/admin-Ba729Eyg.js.gz +0 -0
  93. package/payload/server/public/assets/{agents-DuN92iFb.js → agents-9hlQHOS5.js} +1 -1
  94. package/payload/server/public/assets/agents-9hlQHOS5.js.br +0 -0
  95. package/payload/server/public/assets/agents-9hlQHOS5.js.gz +0 -0
  96. package/payload/server/public/assets/{browser-BxebdKbh.js → browser-BrqoCsqh.js} +1 -1
  97. package/payload/server/public/assets/browser-BrqoCsqh.js.br +0 -0
  98. package/payload/server/public/assets/browser-BrqoCsqh.js.gz +0 -0
  99. package/payload/server/public/assets/{calendar-BtFZQ5Np.js → calendar-DOObQ_m8.js} +1 -1
  100. package/payload/server/public/assets/calendar-DOObQ_m8.js.br +0 -0
  101. package/payload/server/public/assets/calendar-DOObQ_m8.js.gz +0 -0
  102. package/payload/server/public/assets/chat-Xaul2lLF.js +1 -0
  103. package/payload/server/public/assets/chat-Xaul2lLF.js.br +3 -0
  104. package/payload/server/public/assets/chat-Xaul2lLF.js.gz +0 -0
  105. package/payload/server/public/assets/chevron-left-BYH5vH4S.js +1 -0
  106. package/payload/server/public/assets/chevron-left-BYH5vH4S.js.br +0 -0
  107. package/payload/server/public/assets/chevron-right-XxQPHfNH.js +1 -0
  108. package/payload/server/public/assets/chevron-right-XxQPHfNH.js.br +0 -0
  109. package/payload/server/public/assets/clock-BNp2JTKh.js +1 -0
  110. package/payload/server/public/assets/clock-BNp2JTKh.js.br +0 -0
  111. package/payload/server/public/assets/clock-BNp2JTKh.js.gz +0 -0
  112. package/payload/server/public/assets/{copy-DCDHXq3O.js → copy-BkbgmpJo.js} +1 -1
  113. package/payload/server/public/assets/copy-BkbgmpJo.js.br +0 -0
  114. package/payload/server/public/assets/copy-BkbgmpJo.js.gz +0 -0
  115. package/payload/server/public/assets/data-yuHj8g0C.js +1 -0
  116. package/payload/server/public/assets/data-yuHj8g0C.js.br +3 -0
  117. package/payload/server/public/assets/data-yuHj8g0C.js.gz +0 -0
  118. package/payload/server/public/assets/{file-text-zQgEQWCF.js → file-text-DDCrqbWB.js} +1 -1
  119. package/payload/server/public/assets/file-text-DDCrqbWB.js.br +0 -0
  120. package/payload/server/public/assets/file-text-DDCrqbWB.js.gz +0 -0
  121. package/payload/server/public/assets/{graph-CFCEh_YI.js → graph-BKPdL5ph.js} +1 -1
  122. package/payload/server/public/assets/graph-BKPdL5ph.js.br +0 -0
  123. package/payload/server/public/assets/graph-BKPdL5ph.js.gz +0 -0
  124. package/payload/server/public/assets/{graph-labels-CA1UcDuS.js → graph-labels-B2PrHK6O.js} +1 -1
  125. package/payload/server/public/assets/graph-labels-B2PrHK6O.js.br +0 -0
  126. package/payload/server/public/assets/graph-labels-B2PrHK6O.js.gz +0 -0
  127. package/payload/server/public/assets/{operator-hFXPDc2X.js → operator-BVULmN09.js} +1 -1
  128. package/payload/server/public/assets/operator-BVULmN09.js.br +0 -0
  129. package/payload/server/public/assets/operator-BVULmN09.js.gz +0 -0
  130. package/payload/server/public/assets/{page-ne7I_r9L.js → page-BbzdSxuU.js} +1 -1
  131. package/payload/server/public/assets/page-BbzdSxuU.js.br +0 -0
  132. package/payload/server/public/assets/page-BbzdSxuU.js.gz +0 -0
  133. package/payload/server/public/assets/{page-C8jyPH_3.js → page-baQ9FQIg.js} +1 -1
  134. package/payload/server/public/assets/page-baQ9FQIg.js.br +0 -0
  135. package/payload/server/public/assets/page-baQ9FQIg.js.gz +0 -0
  136. package/payload/server/public/assets/play-3hlqzxLI.js +1 -0
  137. package/payload/server/public/assets/play-3hlqzxLI.js.br +0 -0
  138. package/payload/server/public/assets/play-3hlqzxLI.js.gz +0 -0
  139. package/payload/server/public/assets/{public-BgnqjAal.js → public-B_SEBxWy.js} +1 -1
  140. package/payload/server/public/assets/public-B_SEBxWy.js.br +0 -0
  141. package/payload/server/public/assets/public-B_SEBxWy.js.gz +0 -0
  142. package/payload/server/public/assets/{rotate-ccw-DfJWjXAg.js → rotate-ccw-DzXTXh3g.js} +1 -1
  143. package/payload/server/public/assets/rotate-ccw-DzXTXh3g.js.br +0 -0
  144. package/payload/server/public/assets/rotate-ccw-DzXTXh3g.js.gz +0 -0
  145. package/payload/server/public/assets/routines-BQzE0xzC.js +2 -0
  146. package/payload/server/public/assets/routines-BQzE0xzC.js.br +0 -0
  147. package/payload/server/public/assets/routines-BQzE0xzC.js.gz +0 -0
  148. package/payload/server/public/assets/{skills-D-6EbgfP.js → skills-yCZhYVIs.js} +1 -1
  149. package/payload/server/public/assets/skills-yCZhYVIs.js.br +0 -0
  150. package/payload/server/public/assets/skills-yCZhYVIs.js.gz +0 -0
  151. package/payload/server/public/assets/{tasks-DnN5Fyds.js → tasks-DxNFLsHv.js} +1 -1
  152. package/payload/server/public/assets/tasks-DxNFLsHv.js.br +0 -0
  153. package/payload/server/public/assets/tasks-DxNFLsHv.js.gz +0 -0
  154. package/payload/server/public/assets/{triangle-alert-eh9UOKDT.js → triangle-alert-CYwHTcvU.js} +1 -1
  155. package/payload/server/public/assets/triangle-alert-CYwHTcvU.js.br +0 -0
  156. package/payload/server/public/assets/triangle-alert-CYwHTcvU.js.gz +0 -0
  157. package/payload/server/public/assets/{useCopyFeedback-Bz9OJHBb.js → useCopyFeedback-BCRjKc-H.js} +1 -1
  158. package/payload/server/public/assets/useCopyFeedback-BCRjKc-H.js.br +0 -0
  159. package/payload/server/public/assets/useCopyFeedback-BCRjKc-H.js.gz +0 -0
  160. package/payload/server/public/assets/{useMediaQuery-CNxsjKZp.css → useMediaQuery-Vxpamxqq.css} +1 -1
  161. package/payload/server/public/assets/useMediaQuery-Vxpamxqq.css.br +0 -0
  162. package/payload/server/public/assets/{useMediaQuery-CNxsjKZp.css.gz → useMediaQuery-Vxpamxqq.css.gz} +0 -0
  163. package/payload/server/public/assets/{useVoiceRecorder-BaDpMYxX.js → useVoiceRecorder-BaAtMu9T.js} +1 -1
  164. package/payload/server/public/assets/useVoiceRecorder-BaAtMu9T.js.br +0 -0
  165. package/payload/server/public/assets/useVoiceRecorder-BaAtMu9T.js.gz +0 -0
  166. package/payload/server/public/assets/{wrench-BO-l46rF.js → wrench-iI-vx-g2.js} +1 -1
  167. package/payload/server/public/assets/wrench-iI-vx-g2.js.br +0 -0
  168. package/payload/server/public/assets/wrench-iI-vx-g2.js.gz +0 -0
  169. package/payload/server/public/browser.html +4 -4
  170. package/payload/server/public/calendar.html +8 -8
  171. package/payload/server/public/chat.html +13 -13
  172. package/payload/server/public/data.html +11 -11
  173. package/payload/server/public/graph.html +9 -9
  174. package/payload/server/public/index.html +14 -14
  175. package/payload/server/public/operator.html +14 -14
  176. package/payload/server/public/public.html +13 -13
  177. package/payload/server/public/routines.html +6 -6
  178. package/payload/server/public/skills.html +5 -5
  179. package/payload/server/public/tasks.html +6 -6
  180. package/payload/server/server.js +36 -5
  181. package/payload/server/public/assets/AdminLoginScreens-Bjcs9ta9.js.br +0 -0
  182. package/payload/server/public/assets/AdminLoginScreens-Bjcs9ta9.js.gz +0 -0
  183. package/payload/server/public/assets/AdminShell-DVBAMUCy.js.br +0 -0
  184. package/payload/server/public/assets/AdminShell-DVBAMUCy.js.gz +0 -0
  185. package/payload/server/public/assets/activity-C8E8-EwQ.js.br +0 -0
  186. package/payload/server/public/assets/activity-C8E8-EwQ.js.gz +0 -0
  187. package/payload/server/public/assets/admin-CeWAlpRS.js.br +0 -0
  188. package/payload/server/public/assets/admin-CeWAlpRS.js.gz +0 -0
  189. package/payload/server/public/assets/agents-DuN92iFb.js.br +0 -0
  190. package/payload/server/public/assets/agents-DuN92iFb.js.gz +0 -0
  191. package/payload/server/public/assets/browser-BxebdKbh.js.br +0 -0
  192. package/payload/server/public/assets/browser-BxebdKbh.js.gz +0 -0
  193. package/payload/server/public/assets/calendar-BtFZQ5Np.js.br +0 -0
  194. package/payload/server/public/assets/calendar-BtFZQ5Np.js.gz +0 -0
  195. package/payload/server/public/assets/chat-CGIwynaH.js +0 -1
  196. package/payload/server/public/assets/chat-CGIwynaH.js.br +0 -3
  197. package/payload/server/public/assets/chat-CGIwynaH.js.gz +0 -0
  198. package/payload/server/public/assets/chevron-left-DaNP1zDb.js +0 -1
  199. package/payload/server/public/assets/chevron-left-DaNP1zDb.js.br +0 -0
  200. package/payload/server/public/assets/chevron-right-BbbuTUnt.js +0 -1
  201. package/payload/server/public/assets/chevron-right-BbbuTUnt.js.br +0 -0
  202. package/payload/server/public/assets/clock-CfDdatjp.js +0 -1
  203. package/payload/server/public/assets/clock-CfDdatjp.js.br +0 -0
  204. package/payload/server/public/assets/clock-CfDdatjp.js.gz +0 -0
  205. package/payload/server/public/assets/copy-DCDHXq3O.js.br +0 -0
  206. package/payload/server/public/assets/copy-DCDHXq3O.js.gz +0 -0
  207. package/payload/server/public/assets/data-BchSWOju.js +0 -1
  208. package/payload/server/public/assets/data-BchSWOju.js.br +0 -1
  209. package/payload/server/public/assets/data-BchSWOju.js.gz +0 -0
  210. package/payload/server/public/assets/file-text-zQgEQWCF.js.br +0 -0
  211. package/payload/server/public/assets/file-text-zQgEQWCF.js.gz +0 -0
  212. package/payload/server/public/assets/graph-CFCEh_YI.js.br +0 -0
  213. package/payload/server/public/assets/graph-CFCEh_YI.js.gz +0 -0
  214. package/payload/server/public/assets/graph-labels-CA1UcDuS.js.br +0 -0
  215. package/payload/server/public/assets/graph-labels-CA1UcDuS.js.gz +0 -0
  216. package/payload/server/public/assets/operator-hFXPDc2X.js.br +0 -0
  217. package/payload/server/public/assets/operator-hFXPDc2X.js.gz +0 -0
  218. package/payload/server/public/assets/page-C8jyPH_3.js.br +0 -0
  219. package/payload/server/public/assets/page-C8jyPH_3.js.gz +0 -0
  220. package/payload/server/public/assets/page-ne7I_r9L.js.br +0 -0
  221. package/payload/server/public/assets/page-ne7I_r9L.js.gz +0 -0
  222. package/payload/server/public/assets/play-Ep0SZTbr.js +0 -1
  223. package/payload/server/public/assets/play-Ep0SZTbr.js.br +0 -0
  224. package/payload/server/public/assets/play-Ep0SZTbr.js.gz +0 -0
  225. package/payload/server/public/assets/public-BgnqjAal.js.br +0 -0
  226. package/payload/server/public/assets/public-BgnqjAal.js.gz +0 -0
  227. package/payload/server/public/assets/rotate-ccw-DfJWjXAg.js.br +0 -0
  228. package/payload/server/public/assets/rotate-ccw-DfJWjXAg.js.gz +0 -0
  229. package/payload/server/public/assets/routines-OGFXwTFO.js +0 -2
  230. package/payload/server/public/assets/routines-OGFXwTFO.js.br +0 -0
  231. package/payload/server/public/assets/routines-OGFXwTFO.js.gz +0 -0
  232. package/payload/server/public/assets/skills-D-6EbgfP.js.br +0 -0
  233. package/payload/server/public/assets/skills-D-6EbgfP.js.gz +0 -0
  234. package/payload/server/public/assets/tasks-DnN5Fyds.js.br +0 -0
  235. package/payload/server/public/assets/tasks-DnN5Fyds.js.gz +0 -0
  236. package/payload/server/public/assets/triangle-alert-eh9UOKDT.js.br +0 -0
  237. package/payload/server/public/assets/triangle-alert-eh9UOKDT.js.gz +0 -0
  238. package/payload/server/public/assets/useCopyFeedback-Bz9OJHBb.js.br +0 -0
  239. package/payload/server/public/assets/useCopyFeedback-Bz9OJHBb.js.gz +0 -0
  240. package/payload/server/public/assets/useMediaQuery-CNxsjKZp.css.br +0 -0
  241. package/payload/server/public/assets/useVoiceRecorder-BaDpMYxX.js.br +0 -0
  242. package/payload/server/public/assets/useVoiceRecorder-BaDpMYxX.js.gz +0 -0
  243. package/payload/server/public/assets/wrench-BO-l46rF.js.br +0 -0
  244. package/payload/server/public/assets/wrench-BO-l46rF.js.gz +0 -0
  245. /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js → useMediaQuery-Baf4Huvv.js} +0 -0
  246. /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js.br → useMediaQuery-Baf4Huvv.js.br} +0 -0
  247. /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js.gz → useMediaQuery-Baf4Huvv.js.gz} +0 -0
@@ -1,5 +1,6 @@
1
1
  import type { Driver, Session } from "neo4j-driver";
2
2
  import { scheduleList } from "../tools/schedule-list.js";
3
+ import { type ConnectorChoice } from "./connector-freebusy.js";
3
4
  /**
4
5
  * Task 2100 — the standing check for meeting visibility.
5
6
  *
@@ -69,4 +70,106 @@ export declare function auditGateAlwaysSkipping(driver: Driver, localAccountIds:
69
70
  * throws (honours the sweep's contract).
70
71
  */
71
72
  export declare function auditGateWatermarkAge(driver: Driver, localAccountIds: string[], platformRoot: string, nowMs?: number): Promise<void>;
73
+ export interface ConnectorStateEntry {
74
+ connector: ConnectorChoice;
75
+ /** Epoch ms the current unbroken `none` run began; null while a connector
76
+ * resolves. */
77
+ noneSinceMs: number | null;
78
+ }
79
+ export type ConnectorState = Record<string, ConnectorStateEntry>;
80
+ /**
81
+ * The next state for one account.
82
+ *
83
+ * The `none` instant survives consecutive `none` observations and is discarded
84
+ * the moment a connector returns, which is what makes `noneForHours` the length
85
+ * of the CURRENT run rather than a cumulative total. A recovery followed by a
86
+ * fresh revocation therefore starts counting again from zero, which is correct:
87
+ * the operator's exposure began when the calendar went away this time.
88
+ */
89
+ export declare function nextConnectorState(prev: ConnectorStateEntry | undefined, connector: ConnectorChoice, nowMs: number): ConnectorStateEntry;
90
+ /** Whole hours the account has resolved `none` without interruption. */
91
+ export declare function noneForHours(entry: ConnectorStateEntry, nowMs: number): number;
92
+ /**
93
+ * Task 2381 — the standing half of the connector-resolution signal.
94
+ *
95
+ * A revoked or expired authorisation makes every fire of the busy sync write an
96
+ * empty busy list. The action succeeds, the `:RoutineRun` closes clean, nothing
97
+ * errors, and the visible result is a booking page offering slots the operator is
98
+ * not free for. The per-fire `[connector-busy-sync] op=resolved connector=none`
99
+ * line IS emitted every fire, but one healthy-looking line among thousands is not
100
+ * a signal — this is what turns a persistent `none` into one.
101
+ *
102
+ * `ok=false` when an account has resolved `none` for more than 24 consecutive
103
+ * hours WHILE holding a scheduled busy-sync routine. An account with genuinely no
104
+ * calendar and no such routine reports a growing `noneForHours` and `ok=true`:
105
+ * nothing is scheduled to use a connector it does not have, so there is no
106
+ * exposure to report.
107
+ *
108
+ * The routine predicate matches the converted `action` form and the agent form
109
+ * that precedes it, so the audit is live from the day it ships rather than from
110
+ * the day the conversion lands.
111
+ *
112
+ * One line per local account per tick, including every healthy one. A check that
113
+ * goes quiet when healthy cannot be distinguished from one that has stopped
114
+ * running. Never throws (honours the sweep's contract).
115
+ */
116
+ export declare function auditConnectorResolution(driver: Driver, localAccountIds: string[], accountsDir: string, statePath: string, nowMs: number): Promise<void>;
117
+ /**
118
+ * Task 2380 — the install's agent-bearing fire rate, counted from the rows.
119
+ *
120
+ * `recurrencePrevious` records a change made through `schedule-update` and
121
+ * nothing else. A direct Cypher write, a restore, or a future editor changes the
122
+ * row and emits nothing, and the writer that skipped the log skipped the stamp
123
+ * too — so no property on the row can detect it. This totals the rate from the
124
+ * rows themselves, which means a change by ANY writer moves the number on the
125
+ * next tick. It is a census, not an alarm: its value is that the total is
126
+ * greppable across days.
127
+ *
128
+ * Only `scheduled` rows are counted, because the sweep selects that literal by
129
+ * equality (check-due-events.ts:502, :567, :704, :768) and a suspended routine's
130
+ * fire rate is zero, not unknown. Each row is counted in its own timezone.
131
+ *
132
+ * `ok=false` in exactly one case: nothing counted while agent-bearing rows exist
133
+ * at any status. That is the Task 2231 vacuity guard — a zero that means "the
134
+ * enumeration found nothing" must not read the same as a zero that means "there
135
+ * is nothing". An install whose agent routines are all suspended reports
136
+ * `ok=false`, and it clears the moment one is resumed.
137
+ *
138
+ * A gate (Task 2378) does not reduce the count. The gate skips the INJECT; the
139
+ * fire still happens and still costs a headless tool call, so the rate this
140
+ * reports is the rate of fires, which is what it claims to be.
141
+ *
142
+ * Never throws; the sweep's contract.
143
+ */
144
+ export declare function auditFireRateCensus(driver: Driver, localAccountIds: string[]): Promise<void>;
145
+ /**
146
+ * Task 2383 — how the fleet's recurring agent routines answered the gate
147
+ * question.
148
+ *
149
+ * The Task 2378 checks watch a gate that is configured. This one watches whether
150
+ * one was configured at all, and the blind spot it exists for is `gateWaived`
151
+ * becoming the path of least resistance: every waiver is individually logged and
152
+ * individually reasonable, and the fleet drifts back to ungated one justified
153
+ * exception at a time. No single event marks that and it does not reproduce. It
154
+ * is a population moving, not an action failing.
155
+ *
156
+ * So `waived` carries no threshold and never fails the check. It is a number to
157
+ * read across weeks, and the drift it measures is a judgement the operator makes,
158
+ * not a condition code can decide. Only `unclassified` fails: a recurring agent
159
+ * routine that answered neither question, which after this task means a row
160
+ * written before it, or by a path that bypassed `schedule-event`.
161
+ *
162
+ * The population is the one the write-time refusal covers — scheduled, recurring,
163
+ * complete agent dispatch — so the control and the census cannot disagree about
164
+ * what they are counting. A row holding both a gate and a waiver counts as gated,
165
+ * because the gate is what the dispatcher acts on. A blank waiver counts as
166
+ * unclassified, the same rule the write applies.
167
+ *
168
+ * Emitted every tick including zero: a check that goes quiet when healthy cannot
169
+ * be distinguished from one that has stopped running. Never throws. An unreadable
170
+ * census emits `op=gate-classification-unavailable` INSTEAD of the count line and
171
+ * never alongside it, so a database that is down is never read as a fleet that is
172
+ * fully classified.
173
+ */
174
+ export declare function auditGateClassification(driver: Driver, localAccountIds: string[]): Promise<void>;
72
175
  //# sourceMappingURL=schedule-audit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schedule-audit.d.ts","sourceRoot":"","sources":["../../src/lib/schedule-audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,OAAO,YAA2B,GACvC,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBpE;AAWD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EAAE,EACzB,KAAK,GAAE,MAAmB,GACzB,OAAO,CAAC,IAAI,CAAC,CAyDf;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EAAE,EACzB,YAAY,EAAE,MAAM,EACpB,KAAK,GAAE,MAAmB,GACzB,OAAO,CAAC,IAAI,CAAC,CA4Df"}
1
+ {"version":3,"file":"schedule-audit.d.ts","sourceRoot":"","sources":["../../src/lib/schedule-audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAGjF;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,OAAO,YAA2B,GACvC,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBpE;AAWD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EAAE,EACzB,KAAK,GAAE,MAAmB,GACzB,OAAO,CAAC,IAAI,CAAC,CAyDf;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EAAE,EACzB,YAAY,EAAE,MAAM,EACpB,KAAK,GAAE,MAAmB,GACzB,OAAO,CAAC,IAAI,CAAC,CA4Df;AAMD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,eAAe,CAAC;IAC3B;oBACgB;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;AAEjE;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,mBAAmB,GAAG,SAAS,EACrC,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,MAAM,GACZ,mBAAmB,CAGrB;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG9E;AAwCD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EAAE,EACzB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAwDf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyElG;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CAiDf"}
@@ -1,5 +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";
2
4
  import { readWatermarks } from "../tools/scheduling-gate.js";
5
+ import { resolveConnector } from "./connector-freebusy.js";
6
+ import { firesPerDay } from "./fires-per-day.js";
3
7
  /**
4
8
  * Task 2100 — the standing check for meeting visibility.
5
9
  *
@@ -195,4 +199,307 @@ export async function auditGateWatermarkAge(driver, localAccountIds, platformRoo
195
199
  }
196
200
  }
197
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
+ }
198
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;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D;;;;;;;;;;;;;;;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;AAED,gFAAgF;AAChF,SAAS,GAAG,CAAC,GAAY;IACvB,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,GAAG,IAAI,OAAQ,GAAmC,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC/E,OAAQ,GAAkC,CAAC,QAAQ,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAc,EACd,eAAyB,EACzB,QAAgB,IAAI,CAAC,GAAG,EAAE;IAE1B,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACzC,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACxE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG;QAC3B,uEAAuE;QACvE,uEAAuE;QACvE,yEAAyE;QACzE,iDAAiD;QACjD;;;;;;;;;+EASyE,EACzE,EAAE,eAAe,EAAE,WAAW,EAAE,CACjC,CAAC;QACF,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,SAAS,GAAqE,EAAE,CAAC;QACvF,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC9B,OAAO,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;YAC5C,IAAI,IAAI,IAAI,EAAE,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBACrC,SAAS,CAAC,IAAI,CAAC;oBACb,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,SAAS,CAAW;oBACrC,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,WAAW,CAAW;oBACzC,SAAS;iBACV,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,CAAC,KAAK,CACX,2CAA2C,OAAO,mBAAmB,SAAS,CAAC,MAAM,GAAG;YACtF,MAAM,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CACjC,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CACX,oDAAoD,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;gBAC1E,QAAQ,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,SAAS,gBAAgB,CAC3E,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,gDAAgD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACnG,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAc,EACd,eAAyB,EACzB,YAAoB,EACpB,QAAgB,IAAI,CAAC,GAAG,EAAE;IAE1B,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3B;;;;;;6DAMuD,EACvD,EAAE,eAAe,EAAE,CACpB,CAAC;QACF,yEAAyE;QACzE,2EAA2E;QAC3E,4EAA4E;QAC5E,sEAAsE;QACtE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAW,CAAC;YAC7C,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,WAAW,CAAW,CAAC;YACjD,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YACpD,sEAAsE;YACtE,yEAAyE;YACzE,MAAM,QAAQ,GACZ,KAAK,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACjE,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,SAAS;gBACtD,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;YAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,OAAO,KAAK,SAAS,IAAI,QAAQ,GAAG,OAAO,EAAE,CAAC;gBAChD,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACjC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CACX,+CAA+C,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;oBACrE,8BAA8B,CACjC,CAAC;gBACF,SAAS;YACX,CAAC;YACD,MAAM,EAAE,GAAG,GAAG,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CACX,+CAA+C,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;gBACrE,sBAAsB,GAAG,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAChG,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,uDAAuD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC1G,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"schedule-audit.js","sourceRoot":"","sources":["../../src/lib/schedule-audit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAwB,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;;;;;;;;;;;;;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;AAED,gFAAgF;AAChF,SAAS,GAAG,CAAC,GAAY;IACvB,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,GAAG,IAAI,OAAQ,GAAmC,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC/E,OAAQ,GAAkC,CAAC,QAAQ,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAc,EACd,eAAyB,EACzB,QAAgB,IAAI,CAAC,GAAG,EAAE;IAE1B,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACzC,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACxE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG;QAC3B,uEAAuE;QACvE,uEAAuE;QACvE,yEAAyE;QACzE,iDAAiD;QACjD;;;;;;;;;+EASyE,EACzE,EAAE,eAAe,EAAE,WAAW,EAAE,CACjC,CAAC;QACF,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,SAAS,GAAqE,EAAE,CAAC;QACvF,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC9B,OAAO,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;YAC5C,IAAI,IAAI,IAAI,EAAE,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBACrC,SAAS,CAAC,IAAI,CAAC;oBACb,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,SAAS,CAAW;oBACrC,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,WAAW,CAAW;oBACzC,SAAS;iBACV,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,CAAC,KAAK,CACX,2CAA2C,OAAO,mBAAmB,SAAS,CAAC,MAAM,GAAG;YACtF,MAAM,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CACjC,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CACX,oDAAoD,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;gBAC1E,QAAQ,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,SAAS,gBAAgB,CAC3E,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,gDAAgD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACnG,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAc,EACd,eAAyB,EACzB,YAAoB,EACpB,QAAgB,IAAI,CAAC,GAAG,EAAE;IAE1B,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3B;;;;;;6DAMuD,EACvD,EAAE,eAAe,EAAE,CACpB,CAAC;QACF,yEAAyE;QACzE,2EAA2E;QAC3E,4EAA4E;QAC5E,sEAAsE;QACtE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAW,CAAC;YAC7C,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,WAAW,CAAW,CAAC;YACjD,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YACpD,sEAAsE;YACtE,yEAAyE;YACzE,MAAM,QAAQ,GACZ,KAAK,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACjE,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,SAAS;gBACtD,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;YAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,OAAO,KAAK,SAAS,IAAI,QAAQ,GAAG,OAAO,EAAE,CAAC;gBAChD,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACjC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CACX,+CAA+C,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;oBACrE,8BAA8B,CACjC,CAAC;gBACF,SAAS;YACX,CAAC;YACD,MAAM,EAAE,GAAG,GAAG,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CACX,+CAA+C,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;gBACrE,sBAAsB,GAAG,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAChG,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,uDAAuD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC1G,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;AACH,CAAC;AAeD;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAqC,EACrC,SAA0B,EAC1B,KAAa;IAEb,IAAI,SAAS,KAAK,MAAM;QAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAClE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,IAAI,KAAK,EAAE,CAAC;AACxE,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,YAAY,CAAC,KAA0B,EAAE,KAAa;IACpE,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;;;iFAGiF;AACjF,SAAS,kBAAkB,CAAC,IAAY;IACtC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,qCAAqC;IAClD,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QAC1C,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAE,MAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,8DAA8D,IAAI,GAAG;YACnE,UAAU,IAAI,CAAC,SAAS,CAAE,GAAa,CAAC,OAAO,CAAC,mCAAmC,CACtF,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;sEACsE;AACtE,SAAS,mBAAmB,CAAC,IAAY,EAAE,KAAqB;IAC9D,MAAM,GAAG,GAAG,GAAG,IAAI,MAAM,CAAC;IAC1B,IAAI,CAAC;QACH,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1C,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,gEAAgE,IAAI,GAAG;YACrE,UAAU,IAAI,CAAC,SAAS,CAAE,GAAa,CAAC,OAAO,CAAC,qCAAqC,CACxF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAc,EACd,eAAyB,EACzB,WAAmB,EACnB,SAAiB,EACjB,KAAa;IAEb,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,eAA4B,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3B;;;;;gDAK0C,EAC1C,EAAE,eAAe,EAAE,CACpB,CAAC;QACF,eAAe,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAW,CAAC,CAAC,CAAC;IAClF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,yDAAyD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC5G,CAAC;QACF,OAAO;IACT,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5C,2EAA2E;IAC3E,+EAA+E;IAC/E,+CAA+C;IAC/C,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;QACxC,IAAI,SAA0B,CAAC;QAC/B,IAAI,CAAC;YACH,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,2EAA2E;YAC3E,2EAA2E;YAC3E,0EAA0E;YAC1E,OAAO,CAAC,KAAK,CACX,uDAAuD,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;gBAC7E,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC/D,CAAC;YACF,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACrE,KAAK,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;QACzB,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,KAAK,CACX,iDAAiD,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;YACvE,aAAa,SAAS,iBAAiB,KAAK,OAAO,EAAE,EAAE,CAC1D,CAAC;IACJ,CAAC;IACD,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAc,EAAE,eAAyB;IACjF,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,iEAAiE;QACjE,4EAA4E;QAC5E,+DAA+D;QAC/D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3B;;;;;;;2CAOqC,EACrC,EAAE,eAAe,EAAE,CACpB,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAgE,CAAC;QACtF,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;YACxC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,WAAW,CAAW,CAAC;YACjD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACjC,uEAAuE;YACvE,6DAA6D;YAC7D,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,GAAG,CAAC,OAAO,EAAE,CAAC;YAEd,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAkB,CAAC;YACpE,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAAkB,CAAC;YACtE,IAAI,UAAU,KAAK,IAAI,IAAI,WAAW,KAAK,WAAW;gBAAE,SAAS;YAEjE,IAAI,CAAC;gBACH,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAkB,EAAE,SAAS,CAAC,CAAC;gBAChG,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjB,CAAC;YAAC,MAAM,CAAC;gBACP,sEAAsE;gBACtE,uDAAuD;gBACvD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9D,OAAO,CAAC,KAAK,CACX,wDAAwD,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;oBAC9E,WAAW,OAAO,eAAe,UAAU,EAAE,CAChD,CAAC;YACJ,CAAC;QACH,CAAC;QAED,wEAAwE;QACxE,wEAAwE;QACxE,oCAAoC;QACpC,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;YAChC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,KAAK,CACX,6CAA6C,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;gBACnE,iBAAiB,CAAC,CAAC,QAAQ,qBAAqB,CAAC,CAAC,KAAK,OAAO,EAAE,EAAE,CACrE,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,qDAAqD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACxG,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAc,EACd,eAAyB;IAEzB,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3B;;;;;;;+FAOyF,EACzF,EAAE,eAAe,EAAE,CACpB,CAAC;QAEF,MAAM,QAAQ,GAAG,GAAU,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QACnF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAgB,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QACxF,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,WAAW,CAAW,CAAC;YACjD,IAAI,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,GAAG,QAAQ,EAAE,CAAC;gBACnB,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAClC,CAAC;YACD,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACrC,IAAI,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC;gBAAE,KAAK,CAAC,KAAK,EAAE,CAAC;iBACpC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE;gBAAE,KAAK,CAAC,MAAM,EAAE,CAAC;;gBAChE,KAAK,CAAC,YAAY,EAAE,CAAC;QAC5B,CAAC;QACD,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CACX,gDAAgD,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;gBACtE,iBAAiB,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,MAAM,GAAG;gBAC/D,gBAAgB,CAAC,CAAC,YAAY,OAAO,CAAC,CAAC,YAAY,KAAK,CAAC,EAAE,CAC9D,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,8DAA8D,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACjH,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -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"}
@@ -39,7 +39,9 @@ import { chooseDispatchMode, dispatchAgentTurn, runStandingAudit, auditSelfCance
39
39
  // live outside this module because it calls `main()` at import time and so
40
40
  // cannot be imported by a test.
41
41
  import { callPluginTool, evaluateGate, PluginToolError } from "../lib/gate.js";
42
- import { auditGateAlwaysSkipping, auditGateWatermarkAge } from "../lib/schedule-audit.js";
42
+ // Task 2381 adds auditConnectorResolution beside Task 2378's two gate audits;
43
+ // Task 2380 adds auditFireRateCensus and Task 2383 auditGateClassification.
44
+ import { auditConnectorResolution, auditGateAlwaysSkipping, auditGateWatermarkAge, auditFireRateCensus, auditGateClassification, } from "../lib/schedule-audit.js";
43
45
  import { spawn } from "node:child_process";
44
46
  import { shouldRunSentSweep, SENT_SWEEP_INTERVAL_MS, } from "../lib/sent-sweep-throttle.js";
45
47
  import { openRoutineRun, closeRoutineRun, logRunDispatch } from "../lib/routine-run.js";
@@ -862,6 +864,44 @@ async function main() {
862
864
  console.error(`[schedule-audit] op=gate-watermark-age-error detail=${err instanceof Error ? err.message : String(err)}`);
863
865
  errors++;
864
866
  }
867
+ // --- How the fleet answered the gate question (Task 2383) ---
868
+ // The two above watch a gate that is configured. This one watches whether
869
+ // one was configured at all. The drift it measures is a population moving
870
+ // rather than an action failing: every waiver is individually reasonable and
871
+ // the fleet still ends up ungated, so only a standing count can see it.
872
+ try {
873
+ await auditGateClassification(driver, localAccountIds);
874
+ }
875
+ catch (err) {
876
+ console.error(`[schedule-audit] op=gate-classification-error detail=${err instanceof Error ? err.message : String(err)}`);
877
+ errors++;
878
+ }
879
+ // --- Connector resolution (Task 2381) ---
880
+ // Sits beside the failing-dispatch check because both answer "this routine
881
+ // looks live and delivers nothing". A revoked calendar authorisation is the
882
+ // quieter case: the busy sync SUCCEEDS every fire, writing an empty set, and
883
+ // the booking page then offers slots the operator is not free for.
884
+ try {
885
+ await auditConnectorResolution(driver, localAccountIds, resolve(process.env.PLATFORM_ROOT, "..", "data/accounts"), resolve(LOCK_DIR, "connector-resolution-state.json"), Date.parse(now));
886
+ }
887
+ catch (err) {
888
+ console.error(`[schedule-audit] op=connector-resolution-error detail=${err instanceof Error ? err.message : String(err)}`);
889
+ errors++;
890
+ }
891
+ // --- Fire-rate census (Task 2380) ---
892
+ // Sits after the gate and connector checks because all of them read the rows
893
+ // rather than any write path. This one exists because the recurrence stamp
894
+ // `schedule-update` writes cannot see a change made anywhere else: a direct
895
+ // Cypher write or a restore moves the row and emits nothing, and the writer
896
+ // that skipped the log skipped the stamp too. The total is computed from the
897
+ // rows, so any writer moves it on the next tick.
898
+ try {
899
+ await auditFireRateCensus(driver, localAccountIds);
900
+ }
901
+ catch (err) {
902
+ console.error(`[schedule-audit] op=fire-rate-census-error detail=${err instanceof Error ? err.message : String(err)}`);
903
+ errors++;
904
+ }
865
905
  // --- Plugin lifecycle reconciliation ---
866
906
  try {
867
907
  await reconcilePluginLifecycles(driver);