@rubytech/create-sitedesk-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 +32 -4
- package/payload/platform/plugins/scheduling/mcp/dist/index.js +6 -0
- package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
- 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 +78 -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/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/schedule-audit.d.ts +58 -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 +173 -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 +29 -2
- 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-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-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
package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// @vitest-environment node
|
|
2
|
+
// Task 2383 — how the fleet's recurring agent routines answered the gate
|
|
3
|
+
// question.
|
|
4
|
+
//
|
|
5
|
+
// The two Task 2378 checks watch a gate that is configured. This one watches
|
|
6
|
+
// whether one was configured at all, because the drift it measures is a
|
|
7
|
+
// population moving rather than an action failing: every waiver is individually
|
|
8
|
+
// reasonable and the fleet still ends up ungated.
|
|
9
|
+
//
|
|
10
|
+
// The zero case is asserted as hard as the alarm. A check that goes quiet when
|
|
11
|
+
// healthy cannot be distinguished from one that has stopped running.
|
|
12
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
|
13
|
+
import { auditGateClassification } from "../schedule-audit.js";
|
|
14
|
+
const ACCT = "20028fb5-0000-4000-8000-000000000000";
|
|
15
|
+
const OTHER = "9f3c1d2e-0000-4000-8000-000000000000";
|
|
16
|
+
/** A driver returning one fixed record set, or throwing on the read. */
|
|
17
|
+
function driverOf(rows, throws = false) {
|
|
18
|
+
return {
|
|
19
|
+
session: () => ({
|
|
20
|
+
run: async () => {
|
|
21
|
+
if (throws)
|
|
22
|
+
throw new Error("neo4j down");
|
|
23
|
+
return { records: rows.map((r) => ({ get: (k) => r[k] ?? null })) };
|
|
24
|
+
},
|
|
25
|
+
close: async () => { },
|
|
26
|
+
}),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
let lines;
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
lines = [];
|
|
32
|
+
vi.spyOn(console, "error").mockImplementation((...args) => {
|
|
33
|
+
lines.push(args.map(String).join(" "));
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
afterEach(() => {
|
|
37
|
+
vi.restoreAllMocks();
|
|
38
|
+
});
|
|
39
|
+
function census(acct = ACCT) {
|
|
40
|
+
return lines.find((l) => l.includes(`op=gate-classification acct=${acct.slice(0, 8)}`));
|
|
41
|
+
}
|
|
42
|
+
describe("auditGateClassification", () => {
|
|
43
|
+
it("classifies each row exactly once", async () => {
|
|
44
|
+
await auditGateClassification(driverOf([
|
|
45
|
+
{ accountId: ACCT, gatePlugin: "scheduling", gateWaived: null },
|
|
46
|
+
{ accountId: ACCT, gatePlugin: null, gateWaived: "daily briefing" },
|
|
47
|
+
{ accountId: ACCT, gatePlugin: null, gateWaived: null },
|
|
48
|
+
]), [ACCT]);
|
|
49
|
+
expect(census()).toMatch(/agentRoutines=3 gated=1 waived=1 unclassified=1 ok=false/);
|
|
50
|
+
});
|
|
51
|
+
it("counts a row holding both a gate and a waiver as gated", async () => {
|
|
52
|
+
// The gate is what the dispatcher acts on, so it decides the bucket.
|
|
53
|
+
await auditGateClassification(driverOf([{ accountId: ACCT, gatePlugin: "scheduling", gateWaived: "belt and braces" }]), [ACCT]);
|
|
54
|
+
expect(census()).toMatch(/agentRoutines=1 gated=1 waived=0 unclassified=0 ok=true/);
|
|
55
|
+
});
|
|
56
|
+
it("treats a blank waiver as unclassified", async () => {
|
|
57
|
+
// Same rule as the write: blank is absent, so a row that slipped past with
|
|
58
|
+
// an empty string is not reported as a declared exception.
|
|
59
|
+
await auditGateClassification(driverOf([{ accountId: ACCT, gatePlugin: null, gateWaived: " " }]), [ACCT]);
|
|
60
|
+
expect(census()).toMatch(/waived=0 unclassified=1 ok=false/);
|
|
61
|
+
});
|
|
62
|
+
it("never fails on the waived count alone", async () => {
|
|
63
|
+
// Waived carries no threshold. The drift it measures is a judgement the
|
|
64
|
+
// operator makes across weeks, not a condition code can decide.
|
|
65
|
+
await auditGateClassification(driverOf([
|
|
66
|
+
{ accountId: ACCT, gatePlugin: null, gateWaived: "weekly digest" },
|
|
67
|
+
{ accountId: ACCT, gatePlugin: null, gateWaived: "daily briefing" },
|
|
68
|
+
{ accountId: ACCT, gatePlugin: null, gateWaived: "monthly recap" },
|
|
69
|
+
]), [ACCT]);
|
|
70
|
+
expect(census()).toMatch(/waived=3 unclassified=0 ok=true/);
|
|
71
|
+
});
|
|
72
|
+
it("emits a zero line for an account with no agent routines", async () => {
|
|
73
|
+
await auditGateClassification(driverOf([]), [ACCT]);
|
|
74
|
+
expect(census()).toMatch(/agentRoutines=0 gated=0 waived=0 unclassified=0 ok=true/);
|
|
75
|
+
});
|
|
76
|
+
it("emits one line per local account", async () => {
|
|
77
|
+
await auditGateClassification(driverOf([{ accountId: ACCT, gatePlugin: "scheduling", gateWaived: null }]), [ACCT, OTHER]);
|
|
78
|
+
expect(census(ACCT)).toMatch(/agentRoutines=1 gated=1/);
|
|
79
|
+
expect(census(OTHER)).toMatch(/agentRoutines=0 gated=0 waived=0 unclassified=0 ok=true/);
|
|
80
|
+
});
|
|
81
|
+
it("emits the unavailable line INSTEAD of a census when the read fails", async () => {
|
|
82
|
+
// An unreadable census must never be mistaken for a fully classified fleet.
|
|
83
|
+
await auditGateClassification(driverOf([], true), [ACCT]);
|
|
84
|
+
expect(census()).toBeUndefined();
|
|
85
|
+
expect(lines.some((l) => l.includes("op=gate-classification-unavailable reason=neo4j down"))).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
it("does nothing with no local accounts", async () => {
|
|
88
|
+
await auditGateClassification(driverOf([]), []);
|
|
89
|
+
expect(lines).toHaveLength(0);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=gate-classification.test.js.map
|
package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-classification.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/gate-classification.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Task 2100. The audit exists because the failure it guards emitted nothing:
|
|
2
2
|
// the write logged ok, the read logged ok, and the two disagreed about which
|
|
3
3
|
// label the calendar lives on.
|
|
4
|
-
import { describe, it, expect, vi } from "vitest";
|
|
5
|
-
import { auditScheduleVisibility } from "../schedule-audit.js";
|
|
4
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
5
|
+
import { auditScheduleVisibility, auditFireRateCensus } from "../schedule-audit.js";
|
|
6
6
|
/** Counts :Meeting and :Event for the account; the list function is injected. */
|
|
7
7
|
function countingSession(meetings, events) {
|
|
8
8
|
return {
|
|
@@ -177,4 +177,80 @@ describe("auditConnectorResolution", () => {
|
|
|
177
177
|
expect(logs.some((l) => l.includes("op=connector-resolution-error"))).toBe(true);
|
|
178
178
|
});
|
|
179
179
|
});
|
|
180
|
+
function censusDriver(rows) {
|
|
181
|
+
return {
|
|
182
|
+
session: () => ({
|
|
183
|
+
run: vi.fn(async () => ({
|
|
184
|
+
records: rows.map((r) => ({
|
|
185
|
+
get: (k) => r[k] ?? null,
|
|
186
|
+
})),
|
|
187
|
+
})),
|
|
188
|
+
close: vi.fn(async () => { }),
|
|
189
|
+
}),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
const censusRow = (over = {}) => ({
|
|
193
|
+
accountId: "acct-1111-2222",
|
|
194
|
+
eventId: "evt-3333-4444",
|
|
195
|
+
recurrence: "0 * * * *",
|
|
196
|
+
timezone: "Europe/London",
|
|
197
|
+
eventStatus: "scheduled",
|
|
198
|
+
...over,
|
|
199
|
+
});
|
|
200
|
+
describe("auditFireRateCensus (Task 2380)", () => {
|
|
201
|
+
let censusLogs = [];
|
|
202
|
+
beforeEach(() => {
|
|
203
|
+
censusLogs = [];
|
|
204
|
+
// Only Date is faked: the per-day counts are real assertions, and on a live
|
|
205
|
+
// clock the two British clock-change days would produce different numbers.
|
|
206
|
+
vi.useFakeTimers({ toFake: ["Date"] });
|
|
207
|
+
vi.setSystemTime(new Date("2026-08-02T12:00:00Z"));
|
|
208
|
+
vi.spyOn(console, "error").mockImplementation((...args) => {
|
|
209
|
+
censusLogs.push(args.map(String).join(" "));
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
afterEach(() => {
|
|
213
|
+
vi.useRealTimers();
|
|
214
|
+
vi.restoreAllMocks();
|
|
215
|
+
});
|
|
216
|
+
const censusLine = () => censusLogs.find((l) => l.includes("op=fire-rate-census "));
|
|
217
|
+
it("totals the daily fires of every agent-bearing scheduled routine", async () => {
|
|
218
|
+
await auditFireRateCensus(censusDriver([censusRow(), censusRow({ recurrence: "*/15 * * * *" })]), ["acct-1111-2222"]);
|
|
219
|
+
expect(censusLine()).toContain("agentRoutines=2");
|
|
220
|
+
expect(censusLine()).toContain("agentFiresPerDay=120");
|
|
221
|
+
expect(censusLine()).toContain("ok=true");
|
|
222
|
+
});
|
|
223
|
+
it("counts a suspended routine in neither figure, because its rate is zero", async () => {
|
|
224
|
+
await auditFireRateCensus(censusDriver([censusRow(), censusRow({ eventStatus: "suspended", recurrence: "*/15 * * * *" })]), ["acct-1111-2222"]);
|
|
225
|
+
expect(censusLine()).toContain("agentRoutines=1");
|
|
226
|
+
expect(censusLine()).toContain("agentFiresPerDay=24");
|
|
227
|
+
});
|
|
228
|
+
it("emits a line for an account with no rows at all", async () => {
|
|
229
|
+
// A check that goes quiet when healthy cannot be told apart from one that
|
|
230
|
+
// stopped running.
|
|
231
|
+
await auditFireRateCensus(censusDriver([]), ["acct-1111-2222"]);
|
|
232
|
+
expect(censusLine()).toContain("agentRoutines=0");
|
|
233
|
+
expect(censusLine()).toContain("agentFiresPerDay=0");
|
|
234
|
+
expect(censusLine()).toContain("ok=true");
|
|
235
|
+
});
|
|
236
|
+
it("fails the vacuity guard when agent rows exist but none is counted", async () => {
|
|
237
|
+
// Task 2231's convention: a zero meaning "the enumeration found nothing"
|
|
238
|
+
// must not read the same as a zero meaning "there is nothing".
|
|
239
|
+
await auditFireRateCensus(censusDriver([censusRow({ eventStatus: "suspended" })]), [
|
|
240
|
+
"acct-1111-2222",
|
|
241
|
+
]);
|
|
242
|
+
expect(censusLine()).toContain("agentRoutines=0");
|
|
243
|
+
expect(censusLine()).toContain("ok=false");
|
|
244
|
+
});
|
|
245
|
+
it("names an unparsable row and keeps the rest of the total", async () => {
|
|
246
|
+
await auditFireRateCensus(censusDriver([censusRow(), censusRow({ eventId: "evt-bad", recurrence: "not a cron" })]), ["acct-1111-2222"]);
|
|
247
|
+
expect(censusLogs.find((l) => l.includes("op=fire-rate-census-unparsable"))).toContain("eventId=evt-bad");
|
|
248
|
+
expect(censusLine()).toContain("agentRoutines=1");
|
|
249
|
+
expect(censusLine()).toContain("agentFiresPerDay=24");
|
|
250
|
+
});
|
|
251
|
+
it("emits nothing when there are no local accounts", async () => {
|
|
252
|
+
await auditFireRateCensus(censusDriver([censusRow()]), []);
|
|
253
|
+
expect(censusLine()).toBeUndefined();
|
|
254
|
+
});
|
|
255
|
+
});
|
|
180
256
|
//# sourceMappingURL=schedule-audit.test.js.map
|
package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule-audit.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/schedule-audit.test.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,6EAA6E;AAC7E,+BAA+B;AAC/B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,iFAAiF;AACjF,SAAS,eAAe,CAAC,QAAgB,EAAE,MAAc;IACvD,OAAO;QACL,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE,CAAC,CAAC;YACpC,OAAO,EAAE;gBACP,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;aACvF;SACF,CAAC,CAAC;KACK,CAAC;AACb,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC;IACjC,IAAI,EAAE,SAAkB;IACxB,OAAO,EAAE,SAAS,CAAC,EAAE;IACrB,IAAI,EAAE,IAAI,CAAC,EAAE;IACb,SAAS,EAAE,sBAAsB;CAClC,CAAC,CAAC;AACH,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC;IAC/B,IAAI,EAAE,OAAgB;IACtB,OAAO,EAAE,OAAO,CAAC,EAAE;IACnB,IAAI,EAAE,IAAI,CAAC,EAAE;IACb,SAAS,EAAE,sBAAsB;IACjC,WAAW,EAAE,WAAW;CACzB,CAAC,CAAC;AAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,MAAM,CAAC,GAAG,MAAM,uBAAuB,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAa,CAAC,CAAC;QACxF,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,6EAA6E;QAC7E,0CAA0C;QAC1C,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,MAAM,uBAAuB,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAa,CAAC,CAAC;QACxF,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,uBAAuB,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAa,CAAC,CAAC;QAC9E,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,uEAAuE;AACvE,+EAA+E;AAC/E,iFAAiF;AACjF,gBAAgB;AAChB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAE9B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAClD,MAAM,IAAI,GAAG,SAAS,CAAC;AAEvB,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IACpG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7D,SAAS,EAAE,QAAQ;YACnB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,6EAA6E;AAC7E,SAAS,WAAW,CAAC,IAA8C;IACjE,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IACxD,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,GAAG,EAAE,MAAM,CAAC,CAAC;YAC9D,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;eACe;AACf,SAAS,sBAAsB,CAAC,UAAoB;IAClD,MAAM,OAAO,GAAG;QACd,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YACtB,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;SACrD,CAAC,CAAC;QACH,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;KAC7B,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAW,EAAE,OAAO,EAAE,CAAC;AAClE,CAAC;AAED,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,EAAE,MAAM,EAAE,GAAG,sBAAsB,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC9E,MAAM,wBAAwB,CAC5B,MAAM,EACN,CAAC,QAAQ,EAAE,QAAQ,CAAC,EACpB,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,EACnD,SAAS,EACT,EAAE,CACH,CAAC;QACF,GAAG,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACtC,yEAAyE;QACzE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC9E,MAAM,EAAE,MAAM,EAAE,GAAG,sBAAsB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtD,MAAM,wBAAwB,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACvE,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,wBAAwB,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACnF,GAAG,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAE,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC9E,MAAM,EAAE,MAAM,EAAE,GAAG,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,wBAAwB,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACvE,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,wBAAwB,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACnF,GAAG,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAE,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC9E,MAAM,EAAE,MAAM,EAAE,GAAG,sBAAsB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtD,MAAM,wBAAwB,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;YACrE,SAAS,EAAE,MAAM;YACjB,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,OAAO,GAAG;YACd,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;gBACpB,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;YAChC,CAAC,CAAC;YACF,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;SAC7B,CAAC;QACF,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,MAAM,CACV,wBAAwB,CACtB,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAW,EACnC,CAAC,QAAQ,CAAC,EACV,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,EAC7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,EAC3D,EAAE,CACH,CACF,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC3B,GAAG,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"schedule-audit.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/schedule-audit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,9 @@ describe("writtenFields", () => {
|
|
|
7
7
|
expect(writtenFields(["e.updatedAt = $now", "e.description = $description"]))
|
|
8
8
|
.toEqual(["description"]);
|
|
9
9
|
});
|
|
10
|
-
|
|
10
|
+
// Task 2380 took the set from four to six; the two it added are asserted
|
|
11
|
+
// separately below, so this name says which four it means.
|
|
12
|
+
it("drops the four bookkeeping properties a call writes for itself", () => {
|
|
11
13
|
const clauses = [
|
|
12
14
|
"e.updatedAt = $now",
|
|
13
15
|
"e.operatorEdited = $now",
|
|
@@ -24,6 +26,21 @@ describe("writtenFields", () => {
|
|
|
24
26
|
it("returns an empty list when only bookkeeping was written", () => {
|
|
25
27
|
expect(writtenFields(["e.updatedAt = $now"])).toEqual([]);
|
|
26
28
|
});
|
|
29
|
+
it("drops Task 2380's audit stamps, which no caller asked for", () => {
|
|
30
|
+
// `recurrencePrevious` and `recurrenceChangedAt` are written as a
|
|
31
|
+
// consequence of changing the cron, the same way `operatorEdited` is written
|
|
32
|
+
// as a consequence of setting a prompt. Naming them in the confirmation
|
|
33
|
+
// tells the agent it wrote properties it never mentioned, which is the
|
|
34
|
+
// confusion Task 2362 exists to remove.
|
|
35
|
+
const clauses = [
|
|
36
|
+
"e.updatedAt = $now",
|
|
37
|
+
"e.recurrence = $recurrence",
|
|
38
|
+
"e.nextRun = $newNextRun",
|
|
39
|
+
"e.recurrencePrevious = $recurrencePrevious",
|
|
40
|
+
"e.recurrenceChangedAt = $now",
|
|
41
|
+
];
|
|
42
|
+
expect(writtenFields(clauses)).toEqual(["recurrence", "nextRun"]);
|
|
43
|
+
});
|
|
27
44
|
});
|
|
28
45
|
describe("describeUpdate", () => {
|
|
29
46
|
it("names the fields and says the instruction did not change", () => {
|
package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-summary.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/update-summary.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,cAAc,EAA6B,MAAM,sBAAsB,CAAC;AAEhG,MAAM,EAAE,GAAG,CAAC,MAAgB,EAAE,YAAY,GAAG,KAAK,EAAwB,EAAE,CAC1E,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;AAE5C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,EAAE,8BAA8B,CAAC,CAAC,CAAC;aAC1E,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"update-summary.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/update-summary.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fires-per-day.d.ts","sourceRoot":"","sources":["../../src/lib/fires-per-day.ts"],"names":[],"mappings":"AAyBA,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM,CAwBhG"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import cronParser from "cron-parser";
|
|
2
|
+
const { parseExpression } = cronParser;
|
|
3
|
+
/**
|
|
4
|
+
* Task 2380 — how many times a cron fires on one calendar day, in the event's
|
|
5
|
+
* own timezone.
|
|
6
|
+
*
|
|
7
|
+
* The zone is not a detail. A rolling 24-hour window reports 24 for an hourly
|
|
8
|
+
* routine on every day of the year, including the two on which a British day is
|
|
9
|
+
* 23 or 25 hours long, so a cost figure built on it drifts twice a year and
|
|
10
|
+
* nothing says so. Here both day boundaries are themselves cron occurrences —
|
|
11
|
+
* `0 0 * * *` resolved in the same zone — so the window is the local day by
|
|
12
|
+
* construction and `cron-parser` does the clock-change arithmetic.
|
|
13
|
+
*
|
|
14
|
+
* `.prev()` is taken from one millisecond AFTER the reference so that a
|
|
15
|
+
* reference sitting exactly on local midnight yields that midnight rather than
|
|
16
|
+
* the previous day's.
|
|
17
|
+
*
|
|
18
|
+
* Throws when `recurrence` does not parse. Both callers catch: the tool reports
|
|
19
|
+
* `-` for the count, and the census names the row and drops it from the total.
|
|
20
|
+
*/
|
|
21
|
+
/** Runaway guard. A five-field cron tops out at 1,440 fires in a day. */
|
|
22
|
+
const MAX_OCCURRENCES = 100_000;
|
|
23
|
+
export function firesPerDay(recurrence, timezone, reference) {
|
|
24
|
+
const tz = timezone ?? undefined;
|
|
25
|
+
const start = parseExpression("0 0 * * *", {
|
|
26
|
+
currentDate: new Date(reference.getTime() + 1),
|
|
27
|
+
tz,
|
|
28
|
+
})
|
|
29
|
+
.prev()
|
|
30
|
+
.toDate();
|
|
31
|
+
const end = parseExpression("0 0 * * *", { currentDate: reference, tz }).next().toDate();
|
|
32
|
+
// One millisecond before the boundary, because `.next()` returns the first
|
|
33
|
+
// occurrence STRICTLY after `currentDate` and a routine firing at local
|
|
34
|
+
// midnight belongs to the day it opens.
|
|
35
|
+
const occurrences = parseExpression(recurrence, {
|
|
36
|
+
currentDate: new Date(start.getTime() - 1),
|
|
37
|
+
tz,
|
|
38
|
+
});
|
|
39
|
+
let count = 0;
|
|
40
|
+
for (let i = 0; i < MAX_OCCURRENCES; i++) {
|
|
41
|
+
if (occurrences.next().toDate() >= end)
|
|
42
|
+
break;
|
|
43
|
+
count++;
|
|
44
|
+
}
|
|
45
|
+
return count;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=fires-per-day.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fires-per-day.js","sourceRoot":"","sources":["../../src/lib/fires-per-day.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,MAAM,EAAE,eAAe,EAAE,GAAG,UAAU,CAAC;AAEvC;;;;;;;;;;;;;;;;;GAiBG;AAEH,yEAAyE;AACzE,MAAM,eAAe,GAAG,OAAO,CAAC;AAEhC,MAAM,UAAU,WAAW,CAAC,UAAkB,EAAE,QAAuB,EAAE,SAAe;IACtF,MAAM,EAAE,GAAG,QAAQ,IAAI,SAAS,CAAC;IACjC,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,EAAE;QACzC,WAAW,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC9C,EAAE;KACH,CAAC;SACC,IAAI,EAAE;SACN,MAAM,EAAE,CAAC;IACZ,MAAM,GAAG,GAAG,eAAe,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;IAEzF,2EAA2E;IAC3E,wEAAwE;IACxE,wCAAwC;IACxC,MAAM,WAAW,GAAG,eAAe,CAAC,UAAU,EAAE;QAC9C,WAAW,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1C,EAAE;KACH,CAAC,CAAC;IAEH,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,GAAG;YAAE,MAAM;QAC9C,KAAK,EAAE,CAAC;IACV,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -114,4 +114,62 @@ export declare function noneForHours(entry: ConnectorStateEntry, nowMs: number):
|
|
|
114
114
|
* running. Never throws (honours the sweep's contract).
|
|
115
115
|
*/
|
|
116
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>;
|
|
117
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;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,yBAAyB,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"}
|
|
@@ -3,6 +3,7 @@ import { join } from "node:path";
|
|
|
3
3
|
import { scheduleList } from "../tools/schedule-list.js";
|
|
4
4
|
import { readWatermarks } from "../tools/scheduling-gate.js";
|
|
5
5
|
import { resolveConnector } from "./connector-freebusy.js";
|
|
6
|
+
import { firesPerDay } from "./fires-per-day.js";
|
|
6
7
|
/**
|
|
7
8
|
* Task 2100 — the standing check for meeting visibility.
|
|
8
9
|
*
|
|
@@ -329,4 +330,176 @@ export async function auditConnectorResolution(driver, localAccountIds, accounts
|
|
|
329
330
|
}
|
|
330
331
|
writeConnectorState(statePath, state);
|
|
331
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
|
+
}
|
|
332
505
|
//# sourceMappingURL=schedule-audit.js.map
|