@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.
- package/package.json +1 -1
- package/payload/platform/lib/routine-templates/dist/index.d.ts +15 -2
- package/payload/platform/lib/routine-templates/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/routine-templates/dist/index.js +25 -1
- package/payload/platform/lib/routine-templates/dist/index.js.map +1 -1
- package/payload/platform/lib/routine-templates/dist/roster.d.ts +76 -1
- package/payload/platform/lib/routine-templates/dist/roster.d.ts.map +1 -1
- package/payload/platform/lib/routine-templates/dist/roster.js +60 -3
- package/payload/platform/lib/routine-templates/dist/roster.js.map +1 -1
- package/payload/platform/lib/routine-templates/src/__tests__/roster.test.ts +93 -1
- package/payload/platform/lib/routine-templates/src/__tests__/seed.test.ts +74 -0
- package/payload/platform/lib/routine-templates/src/index.ts +25 -1
- package/payload/platform/lib/routine-templates/src/roster.ts +111 -2
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +6 -0
- package/payload/platform/plugins/scheduling/PLUGIN.md +50 -4
- package/payload/platform/plugins/scheduling/mcp/dist/index.js +51 -6
- package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-freebusy.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-freebusy.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-freebusy.test.js +216 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-freebusy.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.js +44 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.js +92 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js +210 -2
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js +18 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.d.ts +86 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.js +240 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.js +47 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js +9 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts +103 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js +307 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.js +11 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +41 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-connector-busy-sync.test.js +84 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-connector-busy-sync.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.js +200 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js +21 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.js +208 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.d.ts +26 -2
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.js +51 -2
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts +40 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +70 -5
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +67 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
- package/payload/platform/plugins/workflows/skills/workflow-manager/SKILL.md +4 -0
- package/payload/server/public/activity.html +5 -5
- package/payload/server/public/agents.html +4 -4
- package/payload/server/public/assets/{AdminLoginScreens-Bjcs9ta9.js → AdminLoginScreens-Ca2QhL18.js} +1 -1
- package/payload/server/public/assets/AdminLoginScreens-Ca2QhL18.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-Ca2QhL18.js.gz +0 -0
- package/payload/server/public/assets/{AdminShell-DVBAMUCy.js → AdminShell-Dc5du5xX.js} +1 -1
- package/payload/server/public/assets/AdminShell-Dc5du5xX.js.br +0 -0
- package/payload/server/public/assets/AdminShell-Dc5du5xX.js.gz +0 -0
- package/payload/server/public/assets/{activity-C8E8-EwQ.js → activity-TSDKmIYb.js} +1 -1
- package/payload/server/public/assets/activity-TSDKmIYb.js.br +0 -0
- package/payload/server/public/assets/activity-TSDKmIYb.js.gz +0 -0
- package/payload/server/public/assets/{admin-CeWAlpRS.js → admin-Ba729Eyg.js} +1 -1
- package/payload/server/public/assets/admin-Ba729Eyg.js.br +0 -0
- package/payload/server/public/assets/admin-Ba729Eyg.js.gz +0 -0
- package/payload/server/public/assets/{agents-DuN92iFb.js → agents-9hlQHOS5.js} +1 -1
- package/payload/server/public/assets/agents-9hlQHOS5.js.br +0 -0
- package/payload/server/public/assets/agents-9hlQHOS5.js.gz +0 -0
- package/payload/server/public/assets/{browser-BxebdKbh.js → browser-BrqoCsqh.js} +1 -1
- package/payload/server/public/assets/browser-BrqoCsqh.js.br +0 -0
- package/payload/server/public/assets/browser-BrqoCsqh.js.gz +0 -0
- package/payload/server/public/assets/{calendar-BtFZQ5Np.js → calendar-DOObQ_m8.js} +1 -1
- package/payload/server/public/assets/calendar-DOObQ_m8.js.br +0 -0
- package/payload/server/public/assets/calendar-DOObQ_m8.js.gz +0 -0
- package/payload/server/public/assets/chat-Xaul2lLF.js +1 -0
- package/payload/server/public/assets/chat-Xaul2lLF.js.br +3 -0
- package/payload/server/public/assets/chat-Xaul2lLF.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-BYH5vH4S.js +1 -0
- package/payload/server/public/assets/chevron-left-BYH5vH4S.js.br +0 -0
- package/payload/server/public/assets/chevron-right-XxQPHfNH.js +1 -0
- package/payload/server/public/assets/chevron-right-XxQPHfNH.js.br +0 -0
- package/payload/server/public/assets/clock-BNp2JTKh.js +1 -0
- package/payload/server/public/assets/clock-BNp2JTKh.js.br +0 -0
- package/payload/server/public/assets/clock-BNp2JTKh.js.gz +0 -0
- package/payload/server/public/assets/{copy-DCDHXq3O.js → copy-BkbgmpJo.js} +1 -1
- package/payload/server/public/assets/copy-BkbgmpJo.js.br +0 -0
- package/payload/server/public/assets/copy-BkbgmpJo.js.gz +0 -0
- package/payload/server/public/assets/data-yuHj8g0C.js +1 -0
- package/payload/server/public/assets/data-yuHj8g0C.js.br +3 -0
- package/payload/server/public/assets/data-yuHj8g0C.js.gz +0 -0
- package/payload/server/public/assets/{file-text-zQgEQWCF.js → file-text-DDCrqbWB.js} +1 -1
- package/payload/server/public/assets/file-text-DDCrqbWB.js.br +0 -0
- package/payload/server/public/assets/file-text-DDCrqbWB.js.gz +0 -0
- package/payload/server/public/assets/{graph-CFCEh_YI.js → graph-BKPdL5ph.js} +1 -1
- package/payload/server/public/assets/graph-BKPdL5ph.js.br +0 -0
- package/payload/server/public/assets/graph-BKPdL5ph.js.gz +0 -0
- package/payload/server/public/assets/{graph-labels-CA1UcDuS.js → graph-labels-B2PrHK6O.js} +1 -1
- package/payload/server/public/assets/graph-labels-B2PrHK6O.js.br +0 -0
- package/payload/server/public/assets/graph-labels-B2PrHK6O.js.gz +0 -0
- package/payload/server/public/assets/{operator-hFXPDc2X.js → operator-BVULmN09.js} +1 -1
- package/payload/server/public/assets/operator-BVULmN09.js.br +0 -0
- package/payload/server/public/assets/operator-BVULmN09.js.gz +0 -0
- package/payload/server/public/assets/{page-ne7I_r9L.js → page-BbzdSxuU.js} +1 -1
- package/payload/server/public/assets/page-BbzdSxuU.js.br +0 -0
- package/payload/server/public/assets/page-BbzdSxuU.js.gz +0 -0
- package/payload/server/public/assets/{page-C8jyPH_3.js → page-baQ9FQIg.js} +1 -1
- package/payload/server/public/assets/page-baQ9FQIg.js.br +0 -0
- package/payload/server/public/assets/page-baQ9FQIg.js.gz +0 -0
- package/payload/server/public/assets/play-3hlqzxLI.js +1 -0
- package/payload/server/public/assets/play-3hlqzxLI.js.br +0 -0
- package/payload/server/public/assets/play-3hlqzxLI.js.gz +0 -0
- package/payload/server/public/assets/{public-BgnqjAal.js → public-B_SEBxWy.js} +1 -1
- package/payload/server/public/assets/public-B_SEBxWy.js.br +0 -0
- package/payload/server/public/assets/public-B_SEBxWy.js.gz +0 -0
- package/payload/server/public/assets/{rotate-ccw-DfJWjXAg.js → rotate-ccw-DzXTXh3g.js} +1 -1
- package/payload/server/public/assets/rotate-ccw-DzXTXh3g.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-DzXTXh3g.js.gz +0 -0
- package/payload/server/public/assets/routines-BQzE0xzC.js +2 -0
- package/payload/server/public/assets/routines-BQzE0xzC.js.br +0 -0
- package/payload/server/public/assets/routines-BQzE0xzC.js.gz +0 -0
- package/payload/server/public/assets/{skills-D-6EbgfP.js → skills-yCZhYVIs.js} +1 -1
- package/payload/server/public/assets/skills-yCZhYVIs.js.br +0 -0
- package/payload/server/public/assets/skills-yCZhYVIs.js.gz +0 -0
- package/payload/server/public/assets/{tasks-DnN5Fyds.js → tasks-DxNFLsHv.js} +1 -1
- package/payload/server/public/assets/tasks-DxNFLsHv.js.br +0 -0
- package/payload/server/public/assets/tasks-DxNFLsHv.js.gz +0 -0
- package/payload/server/public/assets/{triangle-alert-eh9UOKDT.js → triangle-alert-CYwHTcvU.js} +1 -1
- package/payload/server/public/assets/triangle-alert-CYwHTcvU.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-CYwHTcvU.js.gz +0 -0
- package/payload/server/public/assets/{useCopyFeedback-Bz9OJHBb.js → useCopyFeedback-BCRjKc-H.js} +1 -1
- package/payload/server/public/assets/useCopyFeedback-BCRjKc-H.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-BCRjKc-H.js.gz +0 -0
- package/payload/server/public/assets/{useMediaQuery-CNxsjKZp.css → useMediaQuery-Vxpamxqq.css} +1 -1
- package/payload/server/public/assets/useMediaQuery-Vxpamxqq.css.br +0 -0
- package/payload/server/public/assets/{useMediaQuery-CNxsjKZp.css.gz → useMediaQuery-Vxpamxqq.css.gz} +0 -0
- package/payload/server/public/assets/{useVoiceRecorder-BaDpMYxX.js → useVoiceRecorder-BaAtMu9T.js} +1 -1
- package/payload/server/public/assets/useVoiceRecorder-BaAtMu9T.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BaAtMu9T.js.gz +0 -0
- package/payload/server/public/assets/{wrench-BO-l46rF.js → wrench-iI-vx-g2.js} +1 -1
- package/payload/server/public/assets/wrench-iI-vx-g2.js.br +0 -0
- package/payload/server/public/assets/wrench-iI-vx-g2.js.gz +0 -0
- package/payload/server/public/browser.html +4 -4
- package/payload/server/public/calendar.html +8 -8
- package/payload/server/public/chat.html +13 -13
- package/payload/server/public/data.html +11 -11
- package/payload/server/public/graph.html +9 -9
- package/payload/server/public/index.html +14 -14
- package/payload/server/public/operator.html +14 -14
- package/payload/server/public/public.html +13 -13
- package/payload/server/public/routines.html +6 -6
- package/payload/server/public/skills.html +5 -5
- package/payload/server/public/tasks.html +6 -6
- package/payload/server/server.js +36 -5
- package/payload/server/public/assets/AdminLoginScreens-Bjcs9ta9.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-Bjcs9ta9.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-DVBAMUCy.js.br +0 -0
- package/payload/server/public/assets/AdminShell-DVBAMUCy.js.gz +0 -0
- package/payload/server/public/assets/activity-C8E8-EwQ.js.br +0 -0
- package/payload/server/public/assets/activity-C8E8-EwQ.js.gz +0 -0
- package/payload/server/public/assets/admin-CeWAlpRS.js.br +0 -0
- package/payload/server/public/assets/admin-CeWAlpRS.js.gz +0 -0
- package/payload/server/public/assets/agents-DuN92iFb.js.br +0 -0
- package/payload/server/public/assets/agents-DuN92iFb.js.gz +0 -0
- package/payload/server/public/assets/browser-BxebdKbh.js.br +0 -0
- package/payload/server/public/assets/browser-BxebdKbh.js.gz +0 -0
- package/payload/server/public/assets/calendar-BtFZQ5Np.js.br +0 -0
- package/payload/server/public/assets/calendar-BtFZQ5Np.js.gz +0 -0
- package/payload/server/public/assets/chat-CGIwynaH.js +0 -1
- package/payload/server/public/assets/chat-CGIwynaH.js.br +0 -3
- package/payload/server/public/assets/chat-CGIwynaH.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-DaNP1zDb.js +0 -1
- package/payload/server/public/assets/chevron-left-DaNP1zDb.js.br +0 -0
- package/payload/server/public/assets/chevron-right-BbbuTUnt.js +0 -1
- package/payload/server/public/assets/chevron-right-BbbuTUnt.js.br +0 -0
- package/payload/server/public/assets/clock-CfDdatjp.js +0 -1
- package/payload/server/public/assets/clock-CfDdatjp.js.br +0 -0
- package/payload/server/public/assets/clock-CfDdatjp.js.gz +0 -0
- package/payload/server/public/assets/copy-DCDHXq3O.js.br +0 -0
- package/payload/server/public/assets/copy-DCDHXq3O.js.gz +0 -0
- package/payload/server/public/assets/data-BchSWOju.js +0 -1
- package/payload/server/public/assets/data-BchSWOju.js.br +0 -1
- package/payload/server/public/assets/data-BchSWOju.js.gz +0 -0
- package/payload/server/public/assets/file-text-zQgEQWCF.js.br +0 -0
- package/payload/server/public/assets/file-text-zQgEQWCF.js.gz +0 -0
- package/payload/server/public/assets/graph-CFCEh_YI.js.br +0 -0
- package/payload/server/public/assets/graph-CFCEh_YI.js.gz +0 -0
- package/payload/server/public/assets/graph-labels-CA1UcDuS.js.br +0 -0
- package/payload/server/public/assets/graph-labels-CA1UcDuS.js.gz +0 -0
- package/payload/server/public/assets/operator-hFXPDc2X.js.br +0 -0
- package/payload/server/public/assets/operator-hFXPDc2X.js.gz +0 -0
- package/payload/server/public/assets/page-C8jyPH_3.js.br +0 -0
- package/payload/server/public/assets/page-C8jyPH_3.js.gz +0 -0
- package/payload/server/public/assets/page-ne7I_r9L.js.br +0 -0
- package/payload/server/public/assets/page-ne7I_r9L.js.gz +0 -0
- package/payload/server/public/assets/play-Ep0SZTbr.js +0 -1
- package/payload/server/public/assets/play-Ep0SZTbr.js.br +0 -0
- package/payload/server/public/assets/play-Ep0SZTbr.js.gz +0 -0
- package/payload/server/public/assets/public-BgnqjAal.js.br +0 -0
- package/payload/server/public/assets/public-BgnqjAal.js.gz +0 -0
- package/payload/server/public/assets/rotate-ccw-DfJWjXAg.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-DfJWjXAg.js.gz +0 -0
- package/payload/server/public/assets/routines-OGFXwTFO.js +0 -2
- package/payload/server/public/assets/routines-OGFXwTFO.js.br +0 -0
- package/payload/server/public/assets/routines-OGFXwTFO.js.gz +0 -0
- package/payload/server/public/assets/skills-D-6EbgfP.js.br +0 -0
- package/payload/server/public/assets/skills-D-6EbgfP.js.gz +0 -0
- package/payload/server/public/assets/tasks-DnN5Fyds.js.br +0 -0
- package/payload/server/public/assets/tasks-DnN5Fyds.js.gz +0 -0
- package/payload/server/public/assets/triangle-alert-eh9UOKDT.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-eh9UOKDT.js.gz +0 -0
- package/payload/server/public/assets/useCopyFeedback-Bz9OJHBb.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-Bz9OJHBb.js.gz +0 -0
- package/payload/server/public/assets/useMediaQuery-CNxsjKZp.css.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BaDpMYxX.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BaDpMYxX.js.gz +0 -0
- package/payload/server/public/assets/wrench-BO-l46rF.js.br +0 -0
- package/payload/server/public/assets/wrench-BO-l46rF.js.gz +0 -0
- /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js → useMediaQuery-Baf4Huvv.js} +0 -0
- /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js.br → useMediaQuery-Baf4Huvv.js.br} +0 -0
- /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;
|
|
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":"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"}
|
|
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;
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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);
|