@rubytech/create-maxy-code 0.1.552 → 0.1.553
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/payload/platform/lib/routine-templates/dist/index.d.ts +15 -2
- package/payload/platform/lib/routine-templates/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/routine-templates/dist/index.js +25 -1
- package/payload/platform/lib/routine-templates/dist/index.js.map +1 -1
- package/payload/platform/lib/routine-templates/dist/roster.d.ts +76 -1
- package/payload/platform/lib/routine-templates/dist/roster.d.ts.map +1 -1
- package/payload/platform/lib/routine-templates/dist/roster.js +60 -3
- package/payload/platform/lib/routine-templates/dist/roster.js.map +1 -1
- package/payload/platform/lib/routine-templates/src/__tests__/roster.test.ts +93 -1
- package/payload/platform/lib/routine-templates/src/__tests__/seed.test.ts +74 -0
- package/payload/platform/lib/routine-templates/src/index.ts +25 -1
- package/payload/platform/lib/routine-templates/src/roster.ts +111 -2
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +6 -0
- package/payload/platform/plugins/scheduling/PLUGIN.md +50 -4
- package/payload/platform/plugins/scheduling/mcp/dist/index.js +51 -6
- package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-freebusy.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-freebusy.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-freebusy.test.js +216 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-freebusy.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.js +44 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.js +92 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js +210 -2
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js +18 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.d.ts +86 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.js +240 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.js +47 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js +9 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts +103 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js +307 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.js +11 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +41 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-connector-busy-sync.test.js +84 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-connector-busy-sync.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.js +200 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js +21 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.js +208 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.d.ts +26 -2
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.js +51 -2
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts +40 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +70 -5
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +67 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
- package/payload/platform/plugins/workflows/skills/workflow-manager/SKILL.md +4 -0
- package/payload/server/public/activity.html +5 -5
- package/payload/server/public/agents.html +4 -4
- package/payload/server/public/assets/{AdminLoginScreens-Bjcs9ta9.js → AdminLoginScreens-Ca2QhL18.js} +1 -1
- package/payload/server/public/assets/AdminLoginScreens-Ca2QhL18.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-Ca2QhL18.js.gz +0 -0
- package/payload/server/public/assets/{AdminShell-DVBAMUCy.js → AdminShell-Dc5du5xX.js} +1 -1
- package/payload/server/public/assets/AdminShell-Dc5du5xX.js.br +0 -0
- package/payload/server/public/assets/AdminShell-Dc5du5xX.js.gz +0 -0
- package/payload/server/public/assets/{activity-C8E8-EwQ.js → activity-TSDKmIYb.js} +1 -1
- package/payload/server/public/assets/activity-TSDKmIYb.js.br +0 -0
- package/payload/server/public/assets/activity-TSDKmIYb.js.gz +0 -0
- package/payload/server/public/assets/{admin-CeWAlpRS.js → admin-Ba729Eyg.js} +1 -1
- package/payload/server/public/assets/admin-Ba729Eyg.js.br +0 -0
- package/payload/server/public/assets/admin-Ba729Eyg.js.gz +0 -0
- package/payload/server/public/assets/{agents-DuN92iFb.js → agents-9hlQHOS5.js} +1 -1
- package/payload/server/public/assets/agents-9hlQHOS5.js.br +0 -0
- package/payload/server/public/assets/agents-9hlQHOS5.js.gz +0 -0
- package/payload/server/public/assets/{browser-BxebdKbh.js → browser-BrqoCsqh.js} +1 -1
- package/payload/server/public/assets/browser-BrqoCsqh.js.br +0 -0
- package/payload/server/public/assets/browser-BrqoCsqh.js.gz +0 -0
- package/payload/server/public/assets/{calendar-BtFZQ5Np.js → calendar-DOObQ_m8.js} +1 -1
- package/payload/server/public/assets/calendar-DOObQ_m8.js.br +0 -0
- package/payload/server/public/assets/calendar-DOObQ_m8.js.gz +0 -0
- package/payload/server/public/assets/chat-Xaul2lLF.js +1 -0
- package/payload/server/public/assets/chat-Xaul2lLF.js.br +3 -0
- package/payload/server/public/assets/chat-Xaul2lLF.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-BYH5vH4S.js +1 -0
- package/payload/server/public/assets/chevron-left-BYH5vH4S.js.br +0 -0
- package/payload/server/public/assets/chevron-right-XxQPHfNH.js +1 -0
- package/payload/server/public/assets/chevron-right-XxQPHfNH.js.br +0 -0
- package/payload/server/public/assets/clock-BNp2JTKh.js +1 -0
- package/payload/server/public/assets/clock-BNp2JTKh.js.br +0 -0
- package/payload/server/public/assets/clock-BNp2JTKh.js.gz +0 -0
- package/payload/server/public/assets/{copy-DCDHXq3O.js → copy-BkbgmpJo.js} +1 -1
- package/payload/server/public/assets/copy-BkbgmpJo.js.br +0 -0
- package/payload/server/public/assets/copy-BkbgmpJo.js.gz +0 -0
- package/payload/server/public/assets/data-yuHj8g0C.js +1 -0
- package/payload/server/public/assets/data-yuHj8g0C.js.br +3 -0
- package/payload/server/public/assets/data-yuHj8g0C.js.gz +0 -0
- package/payload/server/public/assets/{file-text-zQgEQWCF.js → file-text-DDCrqbWB.js} +1 -1
- package/payload/server/public/assets/file-text-DDCrqbWB.js.br +0 -0
- package/payload/server/public/assets/file-text-DDCrqbWB.js.gz +0 -0
- package/payload/server/public/assets/{graph-CFCEh_YI.js → graph-BKPdL5ph.js} +1 -1
- package/payload/server/public/assets/graph-BKPdL5ph.js.br +0 -0
- package/payload/server/public/assets/graph-BKPdL5ph.js.gz +0 -0
- package/payload/server/public/assets/{graph-labels-CA1UcDuS.js → graph-labels-B2PrHK6O.js} +1 -1
- package/payload/server/public/assets/graph-labels-B2PrHK6O.js.br +0 -0
- package/payload/server/public/assets/graph-labels-B2PrHK6O.js.gz +0 -0
- package/payload/server/public/assets/{operator-hFXPDc2X.js → operator-BVULmN09.js} +1 -1
- package/payload/server/public/assets/operator-BVULmN09.js.br +0 -0
- package/payload/server/public/assets/operator-BVULmN09.js.gz +0 -0
- package/payload/server/public/assets/{page-ne7I_r9L.js → page-BbzdSxuU.js} +1 -1
- package/payload/server/public/assets/page-BbzdSxuU.js.br +0 -0
- package/payload/server/public/assets/page-BbzdSxuU.js.gz +0 -0
- package/payload/server/public/assets/{page-C8jyPH_3.js → page-baQ9FQIg.js} +1 -1
- package/payload/server/public/assets/page-baQ9FQIg.js.br +0 -0
- package/payload/server/public/assets/page-baQ9FQIg.js.gz +0 -0
- package/payload/server/public/assets/play-3hlqzxLI.js +1 -0
- package/payload/server/public/assets/play-3hlqzxLI.js.br +0 -0
- package/payload/server/public/assets/play-3hlqzxLI.js.gz +0 -0
- package/payload/server/public/assets/{public-BgnqjAal.js → public-B_SEBxWy.js} +1 -1
- package/payload/server/public/assets/public-B_SEBxWy.js.br +0 -0
- package/payload/server/public/assets/public-B_SEBxWy.js.gz +0 -0
- package/payload/server/public/assets/{rotate-ccw-DfJWjXAg.js → rotate-ccw-DzXTXh3g.js} +1 -1
- package/payload/server/public/assets/rotate-ccw-DzXTXh3g.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-DzXTXh3g.js.gz +0 -0
- package/payload/server/public/assets/routines-BQzE0xzC.js +2 -0
- package/payload/server/public/assets/routines-BQzE0xzC.js.br +0 -0
- package/payload/server/public/assets/routines-BQzE0xzC.js.gz +0 -0
- package/payload/server/public/assets/{skills-D-6EbgfP.js → skills-yCZhYVIs.js} +1 -1
- package/payload/server/public/assets/skills-yCZhYVIs.js.br +0 -0
- package/payload/server/public/assets/skills-yCZhYVIs.js.gz +0 -0
- package/payload/server/public/assets/{tasks-DnN5Fyds.js → tasks-DxNFLsHv.js} +1 -1
- package/payload/server/public/assets/tasks-DxNFLsHv.js.br +0 -0
- package/payload/server/public/assets/tasks-DxNFLsHv.js.gz +0 -0
- package/payload/server/public/assets/{triangle-alert-eh9UOKDT.js → triangle-alert-CYwHTcvU.js} +1 -1
- package/payload/server/public/assets/triangle-alert-CYwHTcvU.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-CYwHTcvU.js.gz +0 -0
- package/payload/server/public/assets/{useCopyFeedback-Bz9OJHBb.js → useCopyFeedback-BCRjKc-H.js} +1 -1
- package/payload/server/public/assets/useCopyFeedback-BCRjKc-H.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-BCRjKc-H.js.gz +0 -0
- package/payload/server/public/assets/{useMediaQuery-CNxsjKZp.css → useMediaQuery-Vxpamxqq.css} +1 -1
- package/payload/server/public/assets/useMediaQuery-Vxpamxqq.css.br +0 -0
- package/payload/server/public/assets/{useMediaQuery-CNxsjKZp.css.gz → useMediaQuery-Vxpamxqq.css.gz} +0 -0
- package/payload/server/public/assets/{useVoiceRecorder-BaDpMYxX.js → useVoiceRecorder-BaAtMu9T.js} +1 -1
- package/payload/server/public/assets/useVoiceRecorder-BaAtMu9T.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BaAtMu9T.js.gz +0 -0
- package/payload/server/public/assets/{wrench-BO-l46rF.js → wrench-iI-vx-g2.js} +1 -1
- package/payload/server/public/assets/wrench-iI-vx-g2.js.br +0 -0
- package/payload/server/public/assets/wrench-iI-vx-g2.js.gz +0 -0
- package/payload/server/public/browser.html +4 -4
- package/payload/server/public/calendar.html +8 -8
- package/payload/server/public/chat.html +13 -13
- package/payload/server/public/data.html +11 -11
- package/payload/server/public/graph.html +9 -9
- package/payload/server/public/index.html +14 -14
- package/payload/server/public/operator.html +14 -14
- package/payload/server/public/public.html +13 -13
- package/payload/server/public/routines.html +6 -6
- package/payload/server/public/skills.html +5 -5
- package/payload/server/public/tasks.html +6 -6
- package/payload/server/server.js +36 -5
- package/payload/server/public/assets/AdminLoginScreens-Bjcs9ta9.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-Bjcs9ta9.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-DVBAMUCy.js.br +0 -0
- package/payload/server/public/assets/AdminShell-DVBAMUCy.js.gz +0 -0
- package/payload/server/public/assets/activity-C8E8-EwQ.js.br +0 -0
- package/payload/server/public/assets/activity-C8E8-EwQ.js.gz +0 -0
- package/payload/server/public/assets/admin-CeWAlpRS.js.br +0 -0
- package/payload/server/public/assets/admin-CeWAlpRS.js.gz +0 -0
- package/payload/server/public/assets/agents-DuN92iFb.js.br +0 -0
- package/payload/server/public/assets/agents-DuN92iFb.js.gz +0 -0
- package/payload/server/public/assets/browser-BxebdKbh.js.br +0 -0
- package/payload/server/public/assets/browser-BxebdKbh.js.gz +0 -0
- package/payload/server/public/assets/calendar-BtFZQ5Np.js.br +0 -0
- package/payload/server/public/assets/calendar-BtFZQ5Np.js.gz +0 -0
- package/payload/server/public/assets/chat-CGIwynaH.js +0 -1
- package/payload/server/public/assets/chat-CGIwynaH.js.br +0 -3
- package/payload/server/public/assets/chat-CGIwynaH.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-DaNP1zDb.js +0 -1
- package/payload/server/public/assets/chevron-left-DaNP1zDb.js.br +0 -0
- package/payload/server/public/assets/chevron-right-BbbuTUnt.js +0 -1
- package/payload/server/public/assets/chevron-right-BbbuTUnt.js.br +0 -0
- package/payload/server/public/assets/clock-CfDdatjp.js +0 -1
- package/payload/server/public/assets/clock-CfDdatjp.js.br +0 -0
- package/payload/server/public/assets/clock-CfDdatjp.js.gz +0 -0
- package/payload/server/public/assets/copy-DCDHXq3O.js.br +0 -0
- package/payload/server/public/assets/copy-DCDHXq3O.js.gz +0 -0
- package/payload/server/public/assets/data-BchSWOju.js +0 -1
- package/payload/server/public/assets/data-BchSWOju.js.br +0 -1
- package/payload/server/public/assets/data-BchSWOju.js.gz +0 -0
- package/payload/server/public/assets/file-text-zQgEQWCF.js.br +0 -0
- package/payload/server/public/assets/file-text-zQgEQWCF.js.gz +0 -0
- package/payload/server/public/assets/graph-CFCEh_YI.js.br +0 -0
- package/payload/server/public/assets/graph-CFCEh_YI.js.gz +0 -0
- package/payload/server/public/assets/graph-labels-CA1UcDuS.js.br +0 -0
- package/payload/server/public/assets/graph-labels-CA1UcDuS.js.gz +0 -0
- package/payload/server/public/assets/operator-hFXPDc2X.js.br +0 -0
- package/payload/server/public/assets/operator-hFXPDc2X.js.gz +0 -0
- package/payload/server/public/assets/page-C8jyPH_3.js.br +0 -0
- package/payload/server/public/assets/page-C8jyPH_3.js.gz +0 -0
- package/payload/server/public/assets/page-ne7I_r9L.js.br +0 -0
- package/payload/server/public/assets/page-ne7I_r9L.js.gz +0 -0
- package/payload/server/public/assets/play-Ep0SZTbr.js +0 -1
- package/payload/server/public/assets/play-Ep0SZTbr.js.br +0 -0
- package/payload/server/public/assets/play-Ep0SZTbr.js.gz +0 -0
- package/payload/server/public/assets/public-BgnqjAal.js.br +0 -0
- package/payload/server/public/assets/public-BgnqjAal.js.gz +0 -0
- package/payload/server/public/assets/rotate-ccw-DfJWjXAg.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-DfJWjXAg.js.gz +0 -0
- package/payload/server/public/assets/routines-OGFXwTFO.js +0 -2
- package/payload/server/public/assets/routines-OGFXwTFO.js.br +0 -0
- package/payload/server/public/assets/routines-OGFXwTFO.js.gz +0 -0
- package/payload/server/public/assets/skills-D-6EbgfP.js.br +0 -0
- package/payload/server/public/assets/skills-D-6EbgfP.js.gz +0 -0
- package/payload/server/public/assets/tasks-DnN5Fyds.js.br +0 -0
- package/payload/server/public/assets/tasks-DnN5Fyds.js.gz +0 -0
- package/payload/server/public/assets/triangle-alert-eh9UOKDT.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-eh9UOKDT.js.gz +0 -0
- package/payload/server/public/assets/useCopyFeedback-Bz9OJHBb.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-Bz9OJHBb.js.gz +0 -0
- package/payload/server/public/assets/useMediaQuery-CNxsjKZp.css.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BaDpMYxX.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BaDpMYxX.js.gz +0 -0
- package/payload/server/public/assets/wrench-BO-l46rF.js.br +0 -0
- package/payload/server/public/assets/wrench-BO-l46rF.js.gz +0 -0
- /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js → useMediaQuery-Baf4Huvv.js} +0 -0
- /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js.br → useMediaQuery-Baf4Huvv.js.br} +0 -0
- /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js.gz → useMediaQuery-Baf4Huvv.js.gz} +0 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
// Task 2380 — the change that left no record.
|
|
2
|
+
//
|
|
3
|
+
// Event 65ef758c went from `0 * * * *` to `*/15 * * * *` on 2026-07-28 and the
|
|
4
|
+
// row kept nothing: no previous value, no changed-at stamp, no line.
|
|
5
|
+
// `e.updatedAt` is bumped by every fire, so it cannot date the edit either, and
|
|
6
|
+
// the quadrupling was reconstructed a week later by hand from nextRun values in
|
|
7
|
+
// check-due-events.log.
|
|
8
|
+
//
|
|
9
|
+
// The clock is frozen on an ordinary day. Every per-day count here is a real
|
|
10
|
+
// assertion about the routine's zone, and on a live clock two days a year would
|
|
11
|
+
// legitimately produce different numbers.
|
|
12
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
|
13
|
+
import { mkdtempSync, mkdirSync } from "node:fs";
|
|
14
|
+
import { tmpdir } from "node:os";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
const runCalls = [];
|
|
17
|
+
let storedRow = null;
|
|
18
|
+
vi.mock("../../lib/embedding.js", () => ({
|
|
19
|
+
computeEmbedding: vi.fn(async () => []),
|
|
20
|
+
}));
|
|
21
|
+
// The destination rule resolves the socket-owning house off disk. This file
|
|
22
|
+
// asserts what the recurrence branch records, not who may be dispatched to —
|
|
23
|
+
// that rule is covered by schedule-update-agent.test.ts against a seeded
|
|
24
|
+
// accounts directory.
|
|
25
|
+
vi.mock("../../lib/agent-dispatch.js", () => ({
|
|
26
|
+
validateAgentDispatch: vi.fn(() => { }),
|
|
27
|
+
}));
|
|
28
|
+
vi.mock("../../lib/neo4j.js", () => ({
|
|
29
|
+
getSession: () => ({
|
|
30
|
+
run: vi.fn(async (query, params) => {
|
|
31
|
+
runCalls.push({ query, params });
|
|
32
|
+
// The pre-read is the only RETURN-without-SET against :Event.
|
|
33
|
+
if (query.includes("RETURN e.eventStatus AS eventStatus")) {
|
|
34
|
+
if (!storedRow)
|
|
35
|
+
return { records: [] };
|
|
36
|
+
return {
|
|
37
|
+
records: [{ get: (k) => storedRow[k] ?? null }],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
if (query.includes("MATCH (m:Meeting"))
|
|
41
|
+
return { records: [] };
|
|
42
|
+
// An id that matched no row on the pre-read matches none on the SET
|
|
43
|
+
// either — the same MATCH, one statement later.
|
|
44
|
+
if (query.includes("MATCH (e:Event") && !storedRow)
|
|
45
|
+
return { records: [] };
|
|
46
|
+
return { records: [{ get: () => null }] };
|
|
47
|
+
}),
|
|
48
|
+
close: vi.fn(async () => { }),
|
|
49
|
+
}),
|
|
50
|
+
}));
|
|
51
|
+
import { scheduleUpdate } from "../schedule-update.js";
|
|
52
|
+
const ACCOUNT_ID = "11111111-1111-4111-8111-111111111111";
|
|
53
|
+
const EVENT_ID = "22222222-2222-4222-8222-222222222222";
|
|
54
|
+
/** The SET statement the updater ran against :Event (never the pre-read). */
|
|
55
|
+
function setCall() {
|
|
56
|
+
const hit = runCalls.filter((c) => c.query.includes("SET ") && c.query.includes("MATCH (e:Event"));
|
|
57
|
+
return hit[hit.length - 1];
|
|
58
|
+
}
|
|
59
|
+
let logs = [];
|
|
60
|
+
const recurrenceLine = () => logs.find((l) => l.includes("op=recurrence-changed"));
|
|
61
|
+
const row = (over = {}) => ({
|
|
62
|
+
eventStatus: "scheduled",
|
|
63
|
+
recurrence: "0 * * * *",
|
|
64
|
+
timezone: "Europe/London",
|
|
65
|
+
startDate: null,
|
|
66
|
+
name: "sweep",
|
|
67
|
+
description: null,
|
|
68
|
+
agentChannel: null,
|
|
69
|
+
agentDestination: null,
|
|
70
|
+
agentPrompt: null,
|
|
71
|
+
...over,
|
|
72
|
+
});
|
|
73
|
+
beforeEach(() => {
|
|
74
|
+
runCalls.length = 0;
|
|
75
|
+
logs = [];
|
|
76
|
+
// Only Date is faked: faking timers wholesale would stall the awaited mocks.
|
|
77
|
+
vi.useFakeTimers({ toFake: ["Date"] });
|
|
78
|
+
vi.setSystemTime(new Date("2026-08-02T12:00:00Z"));
|
|
79
|
+
vi.spyOn(console, "error").mockImplementation((...args) => {
|
|
80
|
+
logs.push(args.map(String).join(" "));
|
|
81
|
+
});
|
|
82
|
+
storedRow = row();
|
|
83
|
+
});
|
|
84
|
+
afterEach(() => {
|
|
85
|
+
vi.useRealTimers();
|
|
86
|
+
vi.restoreAllMocks();
|
|
87
|
+
});
|
|
88
|
+
describe("recording a recurrence change (Task 2380)", () => {
|
|
89
|
+
it("stamps the previous expression and the time it changed", async () => {
|
|
90
|
+
await scheduleUpdate({ accountId: ACCOUNT_ID, eventId: EVENT_ID, recurrence: "*/15 * * * *" });
|
|
91
|
+
const { query, params } = setCall();
|
|
92
|
+
expect(query).toContain("e.recurrencePrevious = $recurrencePrevious");
|
|
93
|
+
expect(params.recurrencePrevious).toBe("0 * * * *");
|
|
94
|
+
expect(query).toContain("e.recurrenceChangedAt = $now");
|
|
95
|
+
expect(typeof params.now).toBe("string");
|
|
96
|
+
});
|
|
97
|
+
it("logs the cost delta that IS the incident", async () => {
|
|
98
|
+
await scheduleUpdate({
|
|
99
|
+
accountId: ACCOUNT_ID,
|
|
100
|
+
eventId: EVENT_ID,
|
|
101
|
+
recurrence: "*/15 * * * *",
|
|
102
|
+
agentDispatch: { channel: "whatsapp", destination: "admin", prompt: "sweep" },
|
|
103
|
+
});
|
|
104
|
+
expect(recurrenceLine()).toContain("from=0 * * * * to=*/15 * * * *");
|
|
105
|
+
expect(recurrenceLine()).toContain("firesPerDayFrom=24 firesPerDayTo=96");
|
|
106
|
+
expect(recurrenceLine()).toContain("agentBearing=true");
|
|
107
|
+
});
|
|
108
|
+
it("writes neither property and logs nothing when the value is unchanged", async () => {
|
|
109
|
+
// A line on every no-op edit would bury the real ones, so the absence is
|
|
110
|
+
// the assertion.
|
|
111
|
+
await scheduleUpdate({ accountId: ACCOUNT_ID, eventId: EVENT_ID, recurrence: "0 * * * *" });
|
|
112
|
+
const { query } = setCall();
|
|
113
|
+
expect(query).not.toContain("e.recurrencePrevious");
|
|
114
|
+
expect(query).not.toContain("e.recurrenceChangedAt");
|
|
115
|
+
expect(recurrenceLine()).toBeUndefined();
|
|
116
|
+
});
|
|
117
|
+
it("writes neither property and logs nothing on an unrelated edit", async () => {
|
|
118
|
+
await scheduleUpdate({ accountId: ACCOUNT_ID, eventId: EVENT_ID, name: "renamed" });
|
|
119
|
+
const { query } = setCall();
|
|
120
|
+
expect(query).not.toContain("e.recurrencePrevious");
|
|
121
|
+
expect(query).not.toContain("e.recurrenceChangedAt");
|
|
122
|
+
expect(recurrenceLine()).toBeUndefined();
|
|
123
|
+
});
|
|
124
|
+
it("treats a one-time routine gaining a cron as a change with no previous value", async () => {
|
|
125
|
+
storedRow = row({ recurrence: null });
|
|
126
|
+
await scheduleUpdate({ accountId: ACCOUNT_ID, eventId: EVENT_ID, recurrence: "0 * * * *" });
|
|
127
|
+
const { query } = setCall();
|
|
128
|
+
// Cypher SET x = null REMOVES the property, so a null previous records
|
|
129
|
+
// nothing and is not written at all.
|
|
130
|
+
expect(query).not.toContain("e.recurrencePrevious");
|
|
131
|
+
expect(query).toContain("e.recurrenceChangedAt = $now");
|
|
132
|
+
expect(recurrenceLine()).toContain("from=- to=0 * * * *");
|
|
133
|
+
expect(recurrenceLine()).toContain("firesPerDayFrom=0 firesPerDayTo=24");
|
|
134
|
+
});
|
|
135
|
+
it("counts the day in the routine's own zone, so a clock-change day is 25", async () => {
|
|
136
|
+
// Asserted as the number rather than assumed to be 24, or the count drifts
|
|
137
|
+
// twice a year with nothing saying so.
|
|
138
|
+
vi.setSystemTime(new Date("2026-10-25T12:00:00Z"));
|
|
139
|
+
await scheduleUpdate({ accountId: ACCOUNT_ID, eventId: EVENT_ID, recurrence: "*/15 * * * *" });
|
|
140
|
+
expect(recurrenceLine()).toContain("firesPerDayFrom=25 firesPerDayTo=100");
|
|
141
|
+
});
|
|
142
|
+
it("reports the count as - when the STORED expression no longer parses", async () => {
|
|
143
|
+
// Reachable: the blind spot this task names is a writer that bypasses the
|
|
144
|
+
// tool. A throw here would make a cron written that way unfixable through
|
|
145
|
+
// the tool that exists to fix it.
|
|
146
|
+
storedRow = row({ recurrence: "not a cron" });
|
|
147
|
+
await scheduleUpdate({ accountId: ACCOUNT_ID, eventId: EVENT_ID, recurrence: "0 * * * *" });
|
|
148
|
+
expect(recurrenceLine()).toContain("firesPerDayFrom=- firesPerDayTo=24");
|
|
149
|
+
});
|
|
150
|
+
it("writes nothing when the id matches no :Event", async () => {
|
|
151
|
+
storedRow = null;
|
|
152
|
+
await expect(scheduleUpdate({ accountId: ACCOUNT_ID, eventId: EVENT_ID, recurrence: "*/15 * * * *" })).rejects.toThrow();
|
|
153
|
+
expect(recurrenceLine()).toBeUndefined();
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
describe("agentBearing on the recurrence-changed line (Task 2380)", () => {
|
|
157
|
+
it("reads the stored row when the call does not touch dispatch", async () => {
|
|
158
|
+
storedRow = row({ agentChannel: "whatsapp", agentDestination: "admin", agentPrompt: "sweep" });
|
|
159
|
+
await scheduleUpdate({ accountId: ACCOUNT_ID, eventId: EVENT_ID, recurrence: "*/15 * * * *" });
|
|
160
|
+
expect(recurrenceLine()).toContain("agentBearing=true");
|
|
161
|
+
});
|
|
162
|
+
it("is false on a stored row carrying only part of a dispatch", async () => {
|
|
163
|
+
storedRow = row({ agentChannel: "whatsapp", agentDestination: "admin", agentPrompt: null });
|
|
164
|
+
await scheduleUpdate({ accountId: ACCOUNT_ID, eventId: EVENT_ID, recurrence: "*/15 * * * *" });
|
|
165
|
+
expect(recurrenceLine()).toContain("agentBearing=false");
|
|
166
|
+
});
|
|
167
|
+
it("is false when the same call sets an action, which clears the dispatch", async () => {
|
|
168
|
+
// The action branch writes agentChannel/Destination/Prompt to null, so a row
|
|
169
|
+
// that was agent-bearing before this call is not agent-bearing after it.
|
|
170
|
+
// Reading the stored triple alone would report the new rate as costing model
|
|
171
|
+
// turns when it will cost headless tool calls.
|
|
172
|
+
// The action branch resolves the plugin directory on disk before writing.
|
|
173
|
+
const platformRoot = join(mkdtempSync(join(tmpdir(), "sched-rec-")), "platform");
|
|
174
|
+
mkdirSync(join(platformRoot, "plugins", "scheduling"), { recursive: true });
|
|
175
|
+
process.env.PLATFORM_ROOT = platformRoot;
|
|
176
|
+
storedRow = row({ agentChannel: "whatsapp", agentDestination: "admin", agentPrompt: "sweep" });
|
|
177
|
+
await scheduleUpdate({
|
|
178
|
+
accountId: ACCOUNT_ID,
|
|
179
|
+
eventId: EVENT_ID,
|
|
180
|
+
recurrence: "*/15 * * * *",
|
|
181
|
+
action: { plugin: "scheduling", tool: "schedule-list" },
|
|
182
|
+
});
|
|
183
|
+
expect(recurrenceLine()).toContain("agentBearing=false");
|
|
184
|
+
});
|
|
185
|
+
it("still reads the stored triple when the same call CLEARS an action", async () => {
|
|
186
|
+
// `action: null` clears only the action's three properties; the agent fields
|
|
187
|
+
// are untouched, so the row keeps whatever dispatch it had.
|
|
188
|
+
storedRow = row({ agentChannel: "whatsapp", agentDestination: "admin", agentPrompt: "sweep" });
|
|
189
|
+
await scheduleUpdate({
|
|
190
|
+
accountId: ACCOUNT_ID,
|
|
191
|
+
eventId: EVENT_ID,
|
|
192
|
+
recurrence: "*/15 * * * *",
|
|
193
|
+
action: null,
|
|
194
|
+
});
|
|
195
|
+
expect(recurrenceLine()).toContain("agentBearing=true");
|
|
196
|
+
});
|
|
197
|
+
it("is false when the same call clears the dispatch", async () => {
|
|
198
|
+
storedRow = row({ agentChannel: "whatsapp", agentDestination: "admin", agentPrompt: "sweep" });
|
|
199
|
+
await scheduleUpdate({
|
|
200
|
+
accountId: ACCOUNT_ID,
|
|
201
|
+
eventId: EVENT_ID,
|
|
202
|
+
recurrence: "*/15 * * * *",
|
|
203
|
+
agentDispatch: null,
|
|
204
|
+
});
|
|
205
|
+
expect(recurrenceLine()).toContain("agentBearing=false");
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
//# sourceMappingURL=schedule-update-recurrence-record.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-update-recurrence-record.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/schedule-update-recurrence-record.test.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,EAAE;AACF,+EAA+E;AAC/E,qEAAqE;AACrE,gFAAgF;AAChF,gFAAgF;AAChF,wBAAwB;AACxB,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,0CAA0C;AAC1C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAcjC,MAAM,QAAQ,GAA8D,EAAE,CAAC;AAC/E,IAAI,SAAS,GAAe,IAAI,CAAC;AAEjC,EAAE,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,EAAc,CAAC;CACpD,CAAC,CAAC,CAAC;AAEJ,4EAA4E;AAC5E,6EAA6E;AAC7E,yEAAyE;AACzE,sBAAsB;AACtB,EAAE,CAAC,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5C,qBAAqB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;CACvC,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACjB,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,KAAa,EAAE,MAA+B,EAAE,EAAE;YAClE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACjC,8DAA8D;YAC9D,IAAI,KAAK,CAAC,QAAQ,CAAC,qCAAqC,CAAC,EAAE,CAAC;gBAC1D,IAAI,CAAC,SAAS;oBAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;gBACvC,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAE,SAAgD,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;iBAChG,CAAC;YACJ,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC;gBAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAC/D,oEAAoE;YACpE,gDAAgD;YAChD,IAAI,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS;gBAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAC3E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5C,CAAC,CAAC;QACF,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;KAC7B,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,UAAU,GAAG,sCAAsC,CAAC;AAC1D,MAAM,QAAQ,GAAG,sCAAsC,CAAC;AAExD,6EAA6E;AAC7E,SAAS,OAAO;IACd,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACnG,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,IAAI,IAAI,GAAa,EAAE,CAAC;AACxB,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC;AAEnF,MAAM,GAAG,GAAG,CAAC,OAAqB,EAAE,EAAO,EAAE,CAAC,CAAC;IAC7C,WAAW,EAAE,WAAW;IACxB,UAAU,EAAE,WAAW;IACvB,QAAQ,EAAE,eAAe;IACzB,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,IAAI;IACjB,YAAY,EAAE,IAAI;IAClB,gBAAgB,EAAE,IAAI;IACtB,WAAW,EAAE,IAAI;IACjB,GAAG,IAAI;CACR,CAAC,CAAC;AAEH,UAAU,CAAC,GAAG,EAAE;IACd,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACpB,IAAI,GAAG,EAAE,CAAC;IACV,6EAA6E;IAC7E,EAAE,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvC,EAAE,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACnD,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAe,EAAE,EAAE;QACnE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IACH,SAAS,GAAG,GAAG,EAAE,CAAC;AACpB,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,aAAa,EAAE,CAAC;IACnB,EAAE,CAAC,eAAe,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,cAAc,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC;QAC/F,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,4CAA4C,CAAC,CAAC;QACtE,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,cAAc,CAAC;YACnB,SAAS,EAAE,UAAU;YACrB,OAAO,EAAE,QAAQ;YACjB,UAAU,EAAE,cAAc;YAC1B,aAAa,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;SAC9E,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACrE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;QAC1E,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,yEAAyE;QACzE,iBAAiB;QACjB,MAAM,cAAc,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QAC5F,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACrD,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,cAAc,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACpF,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACrD,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,SAAS,GAAG,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,MAAM,cAAc,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QAC5F,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC;QAC5B,uEAAuE;QACvE,qCAAqC;QACrC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QACxD,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC1D,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,2EAA2E;QAC3E,uCAAuC;QACvC,EAAE,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACnD,MAAM,cAAc,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC;QAC/F,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,0EAA0E;QAC1E,0EAA0E;QAC1E,kCAAkC;QAClC,SAAS,GAAG,GAAG,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC;QAC9C,MAAM,cAAc,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QAC5F,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,SAAS,GAAG,IAAI,CAAC;QACjB,MAAM,MAAM,CACV,cAAc,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CACzF,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACvE,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,SAAS,GAAG,GAAG,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/F,MAAM,cAAc,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC;QAC/F,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,SAAS,GAAG,GAAG,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5F,MAAM,cAAc,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC;QAC/F,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,6EAA6E;QAC7E,yEAAyE;QACzE,6EAA6E;QAC7E,+CAA+C;QAC/C,0EAA0E;QAC1E,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACjF,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,YAAY,CAAC;QAEzC,SAAS,GAAG,GAAG,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/F,MAAM,cAAc,CAAC;YACnB,SAAS,EAAE,UAAU;YACrB,OAAO,EAAE,QAAQ;YACjB,UAAU,EAAE,cAAc;YAC1B,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE;SACxD,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,6EAA6E;QAC7E,4DAA4D;QAC5D,SAAS,GAAG,GAAG,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/F,MAAM,cAAc,CAAC;YACnB,SAAS,EAAE,UAAU;YACrB,OAAO,EAAE,QAAQ;YACjB,UAAU,EAAE,cAAc;YAC1B,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,SAAS,GAAG,GAAG,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/F,MAAM,cAAc,CAAC;YACnB,SAAS,EAAE,UAAU;YACrB,OAAO,EAAE,QAAQ;YACjB,UAAU,EAAE,cAAc;YAC1B,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Session } from "neo4j-driver";
|
|
2
|
+
import { type ProviderCall } from "../lib/connector-freebusy.js";
|
|
2
3
|
export type ConnectorKind = "google" | "m365" | "none";
|
|
3
4
|
export interface BusyInterval {
|
|
4
5
|
start: string;
|
|
@@ -15,7 +16,7 @@ export interface SyncResult {
|
|
|
15
16
|
}
|
|
16
17
|
/**
|
|
17
18
|
* Wholesale-replace the account's :ConnectorBusy nodes with the busy intervals
|
|
18
|
-
*
|
|
19
|
+
* its calendar connector reported. Delete-then-insert so an
|
|
19
20
|
* upstream-deleted connector event stops blocking on the next sync, and a
|
|
20
21
|
* deauthorised connector (connector='none', busy=[]) clears all blocks.
|
|
21
22
|
*
|
|
@@ -25,7 +26,30 @@ export interface SyncResult {
|
|
|
25
26
|
* busy time as an open slot), and a mid-write failure rolls back to the prior
|
|
26
27
|
* complete set rather than leaving a partial one.
|
|
27
28
|
*
|
|
28
|
-
*
|
|
29
|
+
* Task 2381 — the read is deterministic too now. `resolveAndSyncConnectorBusy`
|
|
30
|
+
* below resolves the connector and reads it without a model turn; a caller that
|
|
31
|
+
* has already read the intervals still calls this directly.
|
|
29
32
|
*/
|
|
30
33
|
export declare function syncConnectorBusy(session: Session, accountId: string, input: ConnectorBusyInput): Promise<SyncResult>;
|
|
34
|
+
export interface ResolveAndSyncOptions {
|
|
35
|
+
accountsDir: string;
|
|
36
|
+
platformRoot: string;
|
|
37
|
+
now: Date;
|
|
38
|
+
call: ProviderCall;
|
|
39
|
+
windowDays?: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Task 2381 — read the account's own connector, then sync what it returned.
|
|
43
|
+
*
|
|
44
|
+
* This is the branch that takes the model out of the routine. The connector is
|
|
45
|
+
* resolved from the account's authorised token directories rather than chosen by
|
|
46
|
+
* a model reading a prompt, and the window is a constant rather than a sentence
|
|
47
|
+
* re-interpreted on every fire.
|
|
48
|
+
*
|
|
49
|
+
* A failed read throws BEFORE `syncConnectorBusy` is reached, so the stored busy
|
|
50
|
+
* set survives a transient provider outage. `connector='none'` is NOT a failure:
|
|
51
|
+
* it syncs an empty set, which is how a deauthorised connector's stale blocks are
|
|
52
|
+
* cleared, and it is the case the routine's prompt covers today.
|
|
53
|
+
*/
|
|
54
|
+
export declare function resolveAndSyncConnectorBusy(session: Session, accountId: string, opts: ResolveAndSyncOptions): Promise<SyncResult>;
|
|
31
55
|
//# sourceMappingURL=schedule-connector-busy-sync.d.ts.map
|
package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule-connector-busy-sync.d.ts","sourceRoot":"","sources":["../../src/tools/schedule-connector-busy-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,aAAa,CAAC;IACzB,IAAI,EAAE,YAAY,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AASD
|
|
1
|
+
{"version":3,"file":"schedule-connector-busy-sync.d.ts","sourceRoot":"","sources":["../../src/tools/schedule-connector-busy-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,aAAa,CAAC;IACzB,IAAI,EAAE,YAAY,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AASD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,UAAU,CAAC,CAsBrB;AAMD,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,IAAI,CAAC;IACV,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,UAAU,CAAC,CA+BrB"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { readConnectorBusy, resolveConnector, } from "../lib/connector-freebusy.js";
|
|
1
3
|
/** A busy interval is valid iff both ends parse as ISO and start < end. */
|
|
2
4
|
function isValidInterval(iv) {
|
|
3
5
|
const s = Date.parse(iv.start);
|
|
@@ -6,7 +8,7 @@ function isValidInterval(iv) {
|
|
|
6
8
|
}
|
|
7
9
|
/**
|
|
8
10
|
* Wholesale-replace the account's :ConnectorBusy nodes with the busy intervals
|
|
9
|
-
*
|
|
11
|
+
* its calendar connector reported. Delete-then-insert so an
|
|
10
12
|
* upstream-deleted connector event stops blocking on the next sync, and a
|
|
11
13
|
* deauthorised connector (connector='none', busy=[]) clears all blocks.
|
|
12
14
|
*
|
|
@@ -16,7 +18,9 @@ function isValidInterval(iv) {
|
|
|
16
18
|
* busy time as an open slot), and a mid-write failure rolls back to the prior
|
|
17
19
|
* complete set rather than leaving a partial one.
|
|
18
20
|
*
|
|
19
|
-
*
|
|
21
|
+
* Task 2381 — the read is deterministic too now. `resolveAndSyncConnectorBusy`
|
|
22
|
+
* below resolves the connector and reads it without a model turn; a caller that
|
|
23
|
+
* has already read the intervals still calls this directly.
|
|
20
24
|
*/
|
|
21
25
|
export async function syncConnectorBusy(session, accountId, input) {
|
|
22
26
|
const now = new Date().toISOString();
|
|
@@ -38,4 +42,49 @@ export async function syncConnectorBusy(session, accountId, input) {
|
|
|
38
42
|
});
|
|
39
43
|
return { connector: input.connector, busyBlocks: input.busy.length, reflected: valid.length };
|
|
40
44
|
}
|
|
45
|
+
/** The window the booking page publishes. Fixed here rather than restated in an
|
|
46
|
+
* agent prompt on every fire. */
|
|
47
|
+
const DEFAULT_WINDOW_DAYS = 15;
|
|
48
|
+
/**
|
|
49
|
+
* Task 2381 — read the account's own connector, then sync what it returned.
|
|
50
|
+
*
|
|
51
|
+
* This is the branch that takes the model out of the routine. The connector is
|
|
52
|
+
* resolved from the account's authorised token directories rather than chosen by
|
|
53
|
+
* a model reading a prompt, and the window is a constant rather than a sentence
|
|
54
|
+
* re-interpreted on every fire.
|
|
55
|
+
*
|
|
56
|
+
* A failed read throws BEFORE `syncConnectorBusy` is reached, so the stored busy
|
|
57
|
+
* set survives a transient provider outage. `connector='none'` is NOT a failure:
|
|
58
|
+
* it syncs an empty set, which is how a deauthorised connector's stale blocks are
|
|
59
|
+
* cleared, and it is the case the routine's prompt covers today.
|
|
60
|
+
*/
|
|
61
|
+
export async function resolveAndSyncConnectorBusy(session, accountId, opts) {
|
|
62
|
+
const startedMs = opts.now.getTime();
|
|
63
|
+
const days = opts.windowDays ?? DEFAULT_WINDOW_DAYS;
|
|
64
|
+
const { connector, skipped } = resolveConnector(join(opts.accountsDir, accountId));
|
|
65
|
+
let busy = [];
|
|
66
|
+
if (connector !== "none") {
|
|
67
|
+
try {
|
|
68
|
+
busy = await readConnectorBusy({
|
|
69
|
+
connector,
|
|
70
|
+
platformRoot: opts.platformRoot,
|
|
71
|
+
accountId,
|
|
72
|
+
from: opts.now.toISOString(),
|
|
73
|
+
to: new Date(startedMs + days * 24 * 60 * 60 * 1000).toISOString(),
|
|
74
|
+
call: opts.call,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
// `synced=false` is stated because the whole point of this branch is that
|
|
79
|
+
// it does not write: wiping a booking page's availability on a transient
|
|
80
|
+
// provider failure is worse than not syncing at all.
|
|
81
|
+
console.error(`[connector-busy-sync] op=read-failed connector=${connector} ` +
|
|
82
|
+
`detail=${JSON.stringify(err instanceof Error ? err.message : String(err))} synced=false`);
|
|
83
|
+
throw err;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
console.error(`[connector-busy-sync] op=resolved connector=${connector} source=account-auth days=${days} ` +
|
|
87
|
+
`intervals=${busy.length} skipped=${skipped ?? "-"} ms=${Date.now() - startedMs}`);
|
|
88
|
+
return syncConnectorBusy(session, accountId, { connector, busy });
|
|
89
|
+
}
|
|
41
90
|
//# sourceMappingURL=schedule-connector-busy-sync.js.map
|
package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule-connector-busy-sync.js","sourceRoot":"","sources":["../../src/tools/schedule-connector-busy-sync.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schedule-connector-busy-sync.js","sourceRoot":"","sources":["../../src/tools/schedule-connector-busy-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,6 +41,40 @@ export declare function validateGate(gate: EventGate, ctx: {
|
|
|
41
41
|
hasAction: boolean;
|
|
42
42
|
hasCompleteAgentDispatch: boolean;
|
|
43
43
|
}): void;
|
|
44
|
+
/**
|
|
45
|
+
* Task 2383 — a waiver is a reason, not a flag.
|
|
46
|
+
*
|
|
47
|
+
* Blank is treated as absent because the whole control is a required answer: a
|
|
48
|
+
* `gateWaived` that accepted `""` would be a one-character bypass, and the
|
|
49
|
+
* stamped row would carry no record of why the exception was taken.
|
|
50
|
+
*/
|
|
51
|
+
export declare function normaliseGateWaiver(raw: string | undefined): string | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* Task 2383 — the two questions, asked separately.
|
|
54
|
+
*
|
|
55
|
+
* `PLUGIN.md` framed one question over two decisions: whether to run at all, and
|
|
56
|
+
* what to say once it runs. An author with a conditional sweep answers yes,
|
|
57
|
+
* because composing the message does need a model, and never notices that the
|
|
58
|
+
* check does not. All 16 live bespoke routines follow that shape and none is
|
|
59
|
+
* gated; one cost 13.41M output tokens in a week on fires that sent nothing.
|
|
60
|
+
*
|
|
61
|
+
* Prose in a doc drifts and cannot be measured, so the question is a required
|
|
62
|
+
* argument instead: either a `gate` the dispatcher evaluates, or an explicit
|
|
63
|
+
* `gateWaived` reason stamped on the row and counted by `auditGateClassification`.
|
|
64
|
+
* Both are answers; only silence is refused.
|
|
65
|
+
*
|
|
66
|
+
* Recurring only. A one-time agent event is never gated — `check-due-events`
|
|
67
|
+
* passes null on that path unconditionally, because the row is already `due` by
|
|
68
|
+
* selection time and a skip there drops the routine for good — so asking its
|
|
69
|
+
* author about a check the dispatcher will never run would teach the wrong rule
|
|
70
|
+
* and store properties nothing reads.
|
|
71
|
+
*/
|
|
72
|
+
export declare function requireGateAnswer(ctx: {
|
|
73
|
+
hasRecurrence: boolean;
|
|
74
|
+
hasCompleteAgentDispatch: boolean;
|
|
75
|
+
hasGate: boolean;
|
|
76
|
+
waiver: string | undefined;
|
|
77
|
+
}): void;
|
|
44
78
|
export interface ScheduleEventParams {
|
|
45
79
|
accountId: string;
|
|
46
80
|
name: string;
|
|
@@ -63,6 +97,12 @@ export interface ScheduleEventParams {
|
|
|
63
97
|
action?: EventAction;
|
|
64
98
|
agentDispatch?: AgentDispatch;
|
|
65
99
|
gate?: EventGate;
|
|
100
|
+
/**
|
|
101
|
+
* Task 2383 — the declared exception to the gate rule. Stored trimmed on
|
|
102
|
+
* `e.gateWaived`, so every deliberate ungated routine leaves a readable record
|
|
103
|
+
* and the standing census can count them.
|
|
104
|
+
*/
|
|
105
|
+
gateWaived?: string;
|
|
66
106
|
attendees?: ScheduleAttendee[];
|
|
67
107
|
createdBy: CreatedBy;
|
|
68
108
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule-event.d.ts","sourceRoot":"","sources":["../../src/tools/schedule-event.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,8CAA8C,CAAC;AAGtD,OAAO,EAAyB,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE/G,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEpF,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,EACf,GAAG,EAAE;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,wBAAwB,EAAE,OAAO,CAAA;CAAE,GAC7D,IAAI,CAcN;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,aAAa,CAAC;IACrB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,
|
|
1
|
+
{"version":3,"file":"schedule-event.d.ts","sourceRoot":"","sources":["../../src/tools/schedule-event.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,8CAA8C,CAAC;AAGtD,OAAO,EAAyB,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE/G,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEpF,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,EACf,GAAG,EAAE;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,wBAAwB,EAAE,OAAO,CAAA;CAAE,GAC7D,IAAI,CAcN;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAG/E;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE;IACrC,aAAa,EAAE,OAAO,CAAC;IACvB,wBAAwB,EAAE,OAAO,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,GAAG,IAAI,CAUP;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,aAAa,CAAC;IACrB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAkQ7F"}
|
|
@@ -35,8 +35,50 @@ export function validateGate(gate, ctx) {
|
|
|
35
35
|
throw new Error("A gate requires a complete agentDispatch (channel, destination and prompt) — the gate is only evaluated on the agent dispatch path.");
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Task 2383 — a waiver is a reason, not a flag.
|
|
40
|
+
*
|
|
41
|
+
* Blank is treated as absent because the whole control is a required answer: a
|
|
42
|
+
* `gateWaived` that accepted `""` would be a one-character bypass, and the
|
|
43
|
+
* stamped row would carry no record of why the exception was taken.
|
|
44
|
+
*/
|
|
45
|
+
export function normaliseGateWaiver(raw) {
|
|
46
|
+
const trimmed = raw?.trim();
|
|
47
|
+
return trimmed ? trimmed : undefined;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Task 2383 — the two questions, asked separately.
|
|
51
|
+
*
|
|
52
|
+
* `PLUGIN.md` framed one question over two decisions: whether to run at all, and
|
|
53
|
+
* what to say once it runs. An author with a conditional sweep answers yes,
|
|
54
|
+
* because composing the message does need a model, and never notices that the
|
|
55
|
+
* check does not. All 16 live bespoke routines follow that shape and none is
|
|
56
|
+
* gated; one cost 13.41M output tokens in a week on fires that sent nothing.
|
|
57
|
+
*
|
|
58
|
+
* Prose in a doc drifts and cannot be measured, so the question is a required
|
|
59
|
+
* argument instead: either a `gate` the dispatcher evaluates, or an explicit
|
|
60
|
+
* `gateWaived` reason stamped on the row and counted by `auditGateClassification`.
|
|
61
|
+
* Both are answers; only silence is refused.
|
|
62
|
+
*
|
|
63
|
+
* Recurring only. A one-time agent event is never gated — `check-due-events`
|
|
64
|
+
* passes null on that path unconditionally, because the row is already `due` by
|
|
65
|
+
* selection time and a skip there drops the routine for good — so asking its
|
|
66
|
+
* author about a check the dispatcher will never run would teach the wrong rule
|
|
67
|
+
* and store properties nothing reads.
|
|
68
|
+
*/
|
|
69
|
+
export function requireGateAnswer(ctx) {
|
|
70
|
+
if (!ctx.hasRecurrence || !ctx.hasCompleteAgentDispatch)
|
|
71
|
+
return;
|
|
72
|
+
if (ctx.hasGate || ctx.waiver)
|
|
73
|
+
return;
|
|
74
|
+
throw new Error("A recurring agentDispatch must answer whether it should run at all, not only what to say once it runs. " +
|
|
75
|
+
"Pass a 'gate' — a tool the dispatcher calls headlessly before spawning the turn, skipping the fire when it " +
|
|
76
|
+
"answers hasWork:false — for anything conditional. Or pass 'gateWaived: \"<reason>\"' when the routine has " +
|
|
77
|
+
"judgement to apply on every fire, such as a daily briefing or a weekly digest; the reason is stored on the " +
|
|
78
|
+
"event and counted by the standing gate-classification check.");
|
|
79
|
+
}
|
|
38
80
|
export async function scheduleEvent(params) {
|
|
39
|
-
const { accountId, name, description, startDate, endDate, location, recurrence, timezone, accountTimezone, sessionKey, action, agentDispatch, gate, attendees, createdBy, } = params;
|
|
81
|
+
const { accountId, name, description, startDate, endDate, location, recurrence, timezone, accountTimezone, sessionKey, action, agentDispatch, gate, gateWaived, attendees, createdBy, } = params;
|
|
40
82
|
// Decide the bucket up front. A genuine meeting (a resolvable counterparty, or
|
|
41
83
|
// a bounded start+end with no trigger) lands as a :Meeting; a recurrence/action/
|
|
42
84
|
// agentDispatch or a bare one-time reminder lands as an :Event.
|
|
@@ -76,15 +118,28 @@ export async function scheduleEvent(params) {
|
|
|
76
118
|
if (agentDispatch) {
|
|
77
119
|
validateAgentDispatch(accountId, agentDispatch);
|
|
78
120
|
}
|
|
121
|
+
const hasCompleteAgentDispatch = Boolean(agentDispatch?.channel && agentDispatch?.destination && agentDispatch?.prompt);
|
|
79
122
|
// Task 2378 — refused before the action block below, so a call setting both a
|
|
80
123
|
// gate and an action is told about the gate rather than about an incidental
|
|
81
124
|
// plugin-directory miss.
|
|
82
125
|
if (gate) {
|
|
83
|
-
validateGate(gate, {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
126
|
+
validateGate(gate, { hasAction: Boolean(action), hasCompleteAgentDispatch });
|
|
127
|
+
}
|
|
128
|
+
// Task 2383 — the four states an agent-bearing creation can be in, decided
|
|
129
|
+
// once and reported on both sides of the refusal below.
|
|
130
|
+
const waiver = normaliseGateWaiver(gateWaived);
|
|
131
|
+
const gateState = !recurrence ? "one-time" : gate ? "yes" : waiver ? "waived" : "refused";
|
|
132
|
+
// A refused write never becomes a row, so this line is its only record. It is
|
|
133
|
+
// emitted before the throw and carries no event id, because none is minted.
|
|
134
|
+
if (hasCompleteAgentDispatch && gateState === "refused") {
|
|
135
|
+
console.error("[schedule-authoring] op=create eventId=- mode=agent gate=refused reason=-");
|
|
87
136
|
}
|
|
137
|
+
requireGateAnswer({
|
|
138
|
+
hasRecurrence: Boolean(recurrence),
|
|
139
|
+
hasCompleteAgentDispatch,
|
|
140
|
+
hasGate: Boolean(gate),
|
|
141
|
+
waiver,
|
|
142
|
+
});
|
|
88
143
|
if (action) {
|
|
89
144
|
if (!action.plugin || !action.tool) {
|
|
90
145
|
throw new Error("Action requires both 'plugin' and 'tool' fields");
|
|
@@ -184,6 +239,14 @@ export async function scheduleEvent(params) {
|
|
|
184
239
|
props.gateArgs = JSON.stringify(gate.args);
|
|
185
240
|
}
|
|
186
241
|
}
|
|
242
|
+
if (waiver)
|
|
243
|
+
props.gateWaived = waiver;
|
|
244
|
+
// Task 2383 — the accepted twin of the refusal line above, emitted where the
|
|
245
|
+
// event id exists so a creation can be correlated with its later fires.
|
|
246
|
+
if (hasCompleteAgentDispatch) {
|
|
247
|
+
console.error(`[schedule-authoring] op=create eventId=${eventId.slice(0, 8)} mode=agent ` +
|
|
248
|
+
`gate=${gateState} reason=${waiver ?? "-"}`);
|
|
249
|
+
}
|
|
187
250
|
const parts = [`Event: ${name}`];
|
|
188
251
|
if (description)
|
|
189
252
|
parts.push(description);
|
|
@@ -198,6 +261,8 @@ export async function scheduleEvent(params) {
|
|
|
198
261
|
parts.push(`agent dispatch: ${agentDispatch.channel} → ${agentDispatch.destination}`);
|
|
199
262
|
if (gate)
|
|
200
263
|
parts.push(`gate: ${gate.plugin}/${gate.tool}`);
|
|
264
|
+
if (waiver)
|
|
265
|
+
parts.push(`gate waived: ${waiver}`);
|
|
201
266
|
const embedding = await computeEmbedding(parts.join(" — "));
|
|
202
267
|
if (embedding.length > 0)
|
|
203
268
|
props.embedding = embedding;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule-event.js","sourceRoot":"","sources":["../../src/tools/schedule-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,kBAAkB,GAGnB,MAAM,8CAA8C,CAAC;AACtD,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,MAAM,EAAE,eAAe,EAAE,GAAG,UAAU,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAA6C,MAAM,6BAA6B,CAAC;AAC/G,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAqB,MAAM,0BAA0B,CAAC;AA2BpF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAe,EACf,GAA8D;IAE9D,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,sKAAsK,CACvK,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,qIAAqI,CACtI,CAAC;IACJ,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"schedule-event.js","sourceRoot":"","sources":["../../src/tools/schedule-event.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule-update.d.ts","sourceRoot":"","sources":["../../src/tools/schedule-update.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiB,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"schedule-update.d.ts","sourceRoot":"","sources":["../../src/tools/schedule-update.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiB,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAOpF,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIjF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,cAAc,sEAAuE,CAAC;AAEnG,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC,qEAAqE;IACrE,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CACzB;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACpC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,GAAG,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7E,wBAAgB,UAAU,CACxB,GAAG,EAAE;IAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACrF,GAAG,EAAE,IAAI,GACR,UAAU,CAmCZ;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAqmBhG"}
|