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