@rubytech/create-maxy-code 0.1.551 → 0.1.553
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/payload/platform/lib/routine-templates/dist/index.d.ts +15 -2
- package/payload/platform/lib/routine-templates/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/routine-templates/dist/index.js +25 -1
- package/payload/platform/lib/routine-templates/dist/index.js.map +1 -1
- package/payload/platform/lib/routine-templates/dist/roster.d.ts +76 -1
- package/payload/platform/lib/routine-templates/dist/roster.d.ts.map +1 -1
- package/payload/platform/lib/routine-templates/dist/roster.js +60 -3
- package/payload/platform/lib/routine-templates/dist/roster.js.map +1 -1
- package/payload/platform/lib/routine-templates/src/__tests__/roster.test.ts +93 -1
- package/payload/platform/lib/routine-templates/src/__tests__/seed.test.ts +74 -0
- package/payload/platform/lib/routine-templates/src/index.ts +25 -1
- package/payload/platform/lib/routine-templates/src/roster.ts +111 -2
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +11 -0
- package/payload/platform/plugins/scheduling/PLUGIN.md +54 -4
- package/payload/platform/plugins/scheduling/mcp/dist/index.js +113 -6
- package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-freebusy.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-freebusy.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-freebusy.test.js +216 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-freebusy.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.js +44 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.js +128 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.js +92 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.js +135 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js +210 -2
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js +18 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.d.ts +86 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.js +240 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-freebusy.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.js +47 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts +92 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js +193 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.d.ts +8 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts +152 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js +472 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.js +11 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/gate-dispatch-wiring.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/gate-dispatch-wiring.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/gate-dispatch-wiring.test.js +146 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/gate-dispatch-wiring.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts +27 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js +18 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +146 -64
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-connector-busy-sync.test.js +84 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-connector-busy-sync.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.js +200 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js +238 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.js +208 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js +291 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.d.ts +26 -2
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.js +51 -2
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-connector-busy-sync.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts +71 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +109 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts +3 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +124 -3
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts +148 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js +410 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/package.json +1 -0
- package/payload/platform/plugins/workflows/skills/workflow-manager/SKILL.md +4 -0
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +1 -0
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-census.d.ts +51 -4
- package/payload/platform/services/claude-session-manager/dist/pty-census.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-census.js +60 -10
- package/payload/platform/services/claude-session-manager/dist/pty-census.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.d.ts +64 -1
- package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.js +189 -6
- package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.js.map +1 -1
- package/payload/server/public/activity.html +5 -5
- package/payload/server/public/agents.html +4 -4
- package/payload/server/public/assets/{AdminLoginScreens-Bjcs9ta9.js → AdminLoginScreens-Ca2QhL18.js} +1 -1
- package/payload/server/public/assets/AdminLoginScreens-Ca2QhL18.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-Ca2QhL18.js.gz +0 -0
- package/payload/server/public/assets/{AdminShell-DVBAMUCy.js → AdminShell-Dc5du5xX.js} +1 -1
- package/payload/server/public/assets/AdminShell-Dc5du5xX.js.br +0 -0
- package/payload/server/public/assets/AdminShell-Dc5du5xX.js.gz +0 -0
- package/payload/server/public/assets/{activity-C8E8-EwQ.js → activity-TSDKmIYb.js} +1 -1
- package/payload/server/public/assets/activity-TSDKmIYb.js.br +0 -0
- package/payload/server/public/assets/activity-TSDKmIYb.js.gz +0 -0
- package/payload/server/public/assets/{admin-CeWAlpRS.js → admin-Ba729Eyg.js} +1 -1
- package/payload/server/public/assets/admin-Ba729Eyg.js.br +0 -0
- package/payload/server/public/assets/admin-Ba729Eyg.js.gz +0 -0
- package/payload/server/public/assets/{agents-DuN92iFb.js → agents-9hlQHOS5.js} +1 -1
- package/payload/server/public/assets/agents-9hlQHOS5.js.br +0 -0
- package/payload/server/public/assets/agents-9hlQHOS5.js.gz +0 -0
- package/payload/server/public/assets/{browser-BxebdKbh.js → browser-BrqoCsqh.js} +1 -1
- package/payload/server/public/assets/browser-BrqoCsqh.js.br +0 -0
- package/payload/server/public/assets/browser-BrqoCsqh.js.gz +0 -0
- package/payload/server/public/assets/{calendar-BtFZQ5Np.js → calendar-DOObQ_m8.js} +1 -1
- package/payload/server/public/assets/calendar-DOObQ_m8.js.br +0 -0
- package/payload/server/public/assets/calendar-DOObQ_m8.js.gz +0 -0
- package/payload/server/public/assets/chat-Xaul2lLF.js +1 -0
- package/payload/server/public/assets/chat-Xaul2lLF.js.br +3 -0
- package/payload/server/public/assets/chat-Xaul2lLF.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-BYH5vH4S.js +1 -0
- package/payload/server/public/assets/chevron-left-BYH5vH4S.js.br +0 -0
- package/payload/server/public/assets/chevron-right-XxQPHfNH.js +1 -0
- package/payload/server/public/assets/chevron-right-XxQPHfNH.js.br +0 -0
- package/payload/server/public/assets/clock-BNp2JTKh.js +1 -0
- package/payload/server/public/assets/clock-BNp2JTKh.js.br +0 -0
- package/payload/server/public/assets/clock-BNp2JTKh.js.gz +0 -0
- package/payload/server/public/assets/{copy-DCDHXq3O.js → copy-BkbgmpJo.js} +1 -1
- package/payload/server/public/assets/copy-BkbgmpJo.js.br +0 -0
- package/payload/server/public/assets/copy-BkbgmpJo.js.gz +0 -0
- package/payload/server/public/assets/data-yuHj8g0C.js +1 -0
- package/payload/server/public/assets/data-yuHj8g0C.js.br +3 -0
- package/payload/server/public/assets/data-yuHj8g0C.js.gz +0 -0
- package/payload/server/public/assets/{file-text-zQgEQWCF.js → file-text-DDCrqbWB.js} +1 -1
- package/payload/server/public/assets/file-text-DDCrqbWB.js.br +0 -0
- package/payload/server/public/assets/file-text-DDCrqbWB.js.gz +0 -0
- package/payload/server/public/assets/{graph-CFCEh_YI.js → graph-BKPdL5ph.js} +1 -1
- package/payload/server/public/assets/graph-BKPdL5ph.js.br +0 -0
- package/payload/server/public/assets/graph-BKPdL5ph.js.gz +0 -0
- package/payload/server/public/assets/{graph-labels-CA1UcDuS.js → graph-labels-B2PrHK6O.js} +1 -1
- package/payload/server/public/assets/graph-labels-B2PrHK6O.js.br +0 -0
- package/payload/server/public/assets/graph-labels-B2PrHK6O.js.gz +0 -0
- package/payload/server/public/assets/{operator-hFXPDc2X.js → operator-BVULmN09.js} +1 -1
- package/payload/server/public/assets/operator-BVULmN09.js.br +0 -0
- package/payload/server/public/assets/operator-BVULmN09.js.gz +0 -0
- package/payload/server/public/assets/{page-ne7I_r9L.js → page-BbzdSxuU.js} +1 -1
- package/payload/server/public/assets/page-BbzdSxuU.js.br +0 -0
- package/payload/server/public/assets/page-BbzdSxuU.js.gz +0 -0
- package/payload/server/public/assets/{page-C8jyPH_3.js → page-baQ9FQIg.js} +1 -1
- package/payload/server/public/assets/page-baQ9FQIg.js.br +0 -0
- package/payload/server/public/assets/page-baQ9FQIg.js.gz +0 -0
- package/payload/server/public/assets/play-3hlqzxLI.js +1 -0
- package/payload/server/public/assets/play-3hlqzxLI.js.br +0 -0
- package/payload/server/public/assets/play-3hlqzxLI.js.gz +0 -0
- package/payload/server/public/assets/{public-BgnqjAal.js → public-B_SEBxWy.js} +1 -1
- package/payload/server/public/assets/public-B_SEBxWy.js.br +0 -0
- package/payload/server/public/assets/public-B_SEBxWy.js.gz +0 -0
- package/payload/server/public/assets/{rotate-ccw-DfJWjXAg.js → rotate-ccw-DzXTXh3g.js} +1 -1
- package/payload/server/public/assets/rotate-ccw-DzXTXh3g.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-DzXTXh3g.js.gz +0 -0
- package/payload/server/public/assets/routines-BQzE0xzC.js +2 -0
- package/payload/server/public/assets/routines-BQzE0xzC.js.br +0 -0
- package/payload/server/public/assets/routines-BQzE0xzC.js.gz +0 -0
- package/payload/server/public/assets/{skills-D-6EbgfP.js → skills-yCZhYVIs.js} +1 -1
- package/payload/server/public/assets/skills-yCZhYVIs.js.br +0 -0
- package/payload/server/public/assets/skills-yCZhYVIs.js.gz +0 -0
- package/payload/server/public/assets/{tasks-DnN5Fyds.js → tasks-DxNFLsHv.js} +1 -1
- package/payload/server/public/assets/tasks-DxNFLsHv.js.br +0 -0
- package/payload/server/public/assets/tasks-DxNFLsHv.js.gz +0 -0
- package/payload/server/public/assets/{triangle-alert-eh9UOKDT.js → triangle-alert-CYwHTcvU.js} +1 -1
- package/payload/server/public/assets/triangle-alert-CYwHTcvU.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-CYwHTcvU.js.gz +0 -0
- package/payload/server/public/assets/{useCopyFeedback-Bz9OJHBb.js → useCopyFeedback-BCRjKc-H.js} +1 -1
- package/payload/server/public/assets/useCopyFeedback-BCRjKc-H.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-BCRjKc-H.js.gz +0 -0
- package/payload/server/public/assets/{useMediaQuery-CNxsjKZp.css → useMediaQuery-Vxpamxqq.css} +1 -1
- package/payload/server/public/assets/useMediaQuery-Vxpamxqq.css.br +0 -0
- package/payload/server/public/assets/{useMediaQuery-CNxsjKZp.css.gz → useMediaQuery-Vxpamxqq.css.gz} +0 -0
- package/payload/server/public/assets/{useVoiceRecorder-BaDpMYxX.js → useVoiceRecorder-BaAtMu9T.js} +1 -1
- package/payload/server/public/assets/useVoiceRecorder-BaAtMu9T.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BaAtMu9T.js.gz +0 -0
- package/payload/server/public/assets/{wrench-BO-l46rF.js → wrench-iI-vx-g2.js} +1 -1
- package/payload/server/public/assets/wrench-iI-vx-g2.js.br +0 -0
- package/payload/server/public/assets/wrench-iI-vx-g2.js.gz +0 -0
- package/payload/server/public/browser.html +4 -4
- package/payload/server/public/calendar.html +8 -8
- package/payload/server/public/chat.html +13 -13
- package/payload/server/public/data.html +11 -11
- package/payload/server/public/graph.html +9 -9
- package/payload/server/public/index.html +14 -14
- package/payload/server/public/operator.html +14 -14
- package/payload/server/public/public.html +13 -13
- package/payload/server/public/routines.html +6 -6
- package/payload/server/public/skills.html +5 -5
- package/payload/server/public/tasks.html +6 -6
- package/payload/server/server.js +36 -5
- package/payload/server/public/assets/AdminLoginScreens-Bjcs9ta9.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-Bjcs9ta9.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-DVBAMUCy.js.br +0 -0
- package/payload/server/public/assets/AdminShell-DVBAMUCy.js.gz +0 -0
- package/payload/server/public/assets/activity-C8E8-EwQ.js.br +0 -0
- package/payload/server/public/assets/activity-C8E8-EwQ.js.gz +0 -0
- package/payload/server/public/assets/admin-CeWAlpRS.js.br +0 -0
- package/payload/server/public/assets/admin-CeWAlpRS.js.gz +0 -0
- package/payload/server/public/assets/agents-DuN92iFb.js.br +0 -0
- package/payload/server/public/assets/agents-DuN92iFb.js.gz +0 -0
- package/payload/server/public/assets/browser-BxebdKbh.js.br +0 -0
- package/payload/server/public/assets/browser-BxebdKbh.js.gz +0 -0
- package/payload/server/public/assets/calendar-BtFZQ5Np.js.br +0 -0
- package/payload/server/public/assets/calendar-BtFZQ5Np.js.gz +0 -0
- package/payload/server/public/assets/chat-CGIwynaH.js +0 -1
- package/payload/server/public/assets/chat-CGIwynaH.js.br +0 -3
- package/payload/server/public/assets/chat-CGIwynaH.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-DaNP1zDb.js +0 -1
- package/payload/server/public/assets/chevron-left-DaNP1zDb.js.br +0 -0
- package/payload/server/public/assets/chevron-right-BbbuTUnt.js +0 -1
- package/payload/server/public/assets/chevron-right-BbbuTUnt.js.br +0 -0
- package/payload/server/public/assets/clock-CfDdatjp.js +0 -1
- package/payload/server/public/assets/clock-CfDdatjp.js.br +0 -0
- package/payload/server/public/assets/clock-CfDdatjp.js.gz +0 -0
- package/payload/server/public/assets/copy-DCDHXq3O.js.br +0 -0
- package/payload/server/public/assets/copy-DCDHXq3O.js.gz +0 -0
- package/payload/server/public/assets/data-BchSWOju.js +0 -1
- package/payload/server/public/assets/data-BchSWOju.js.br +0 -1
- package/payload/server/public/assets/data-BchSWOju.js.gz +0 -0
- package/payload/server/public/assets/file-text-zQgEQWCF.js.br +0 -0
- package/payload/server/public/assets/file-text-zQgEQWCF.js.gz +0 -0
- package/payload/server/public/assets/graph-CFCEh_YI.js.br +0 -0
- package/payload/server/public/assets/graph-CFCEh_YI.js.gz +0 -0
- package/payload/server/public/assets/graph-labels-CA1UcDuS.js.br +0 -0
- package/payload/server/public/assets/graph-labels-CA1UcDuS.js.gz +0 -0
- package/payload/server/public/assets/operator-hFXPDc2X.js.br +0 -0
- package/payload/server/public/assets/operator-hFXPDc2X.js.gz +0 -0
- package/payload/server/public/assets/page-C8jyPH_3.js.br +0 -0
- package/payload/server/public/assets/page-C8jyPH_3.js.gz +0 -0
- package/payload/server/public/assets/page-ne7I_r9L.js.br +0 -0
- package/payload/server/public/assets/page-ne7I_r9L.js.gz +0 -0
- package/payload/server/public/assets/play-Ep0SZTbr.js +0 -1
- package/payload/server/public/assets/play-Ep0SZTbr.js.br +0 -0
- package/payload/server/public/assets/play-Ep0SZTbr.js.gz +0 -0
- package/payload/server/public/assets/public-BgnqjAal.js.br +0 -0
- package/payload/server/public/assets/public-BgnqjAal.js.gz +0 -0
- package/payload/server/public/assets/rotate-ccw-DfJWjXAg.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-DfJWjXAg.js.gz +0 -0
- package/payload/server/public/assets/routines-OGFXwTFO.js +0 -2
- package/payload/server/public/assets/routines-OGFXwTFO.js.br +0 -0
- package/payload/server/public/assets/routines-OGFXwTFO.js.gz +0 -0
- package/payload/server/public/assets/skills-D-6EbgfP.js.br +0 -0
- package/payload/server/public/assets/skills-D-6EbgfP.js.gz +0 -0
- package/payload/server/public/assets/tasks-DnN5Fyds.js.br +0 -0
- package/payload/server/public/assets/tasks-DnN5Fyds.js.gz +0 -0
- package/payload/server/public/assets/triangle-alert-eh9UOKDT.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-eh9UOKDT.js.gz +0 -0
- package/payload/server/public/assets/useCopyFeedback-Bz9OJHBb.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-Bz9OJHBb.js.gz +0 -0
- package/payload/server/public/assets/useMediaQuery-CNxsjKZp.css.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BaDpMYxX.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BaDpMYxX.js.gz +0 -0
- package/payload/server/public/assets/wrench-BO-l46rF.js.br +0 -0
- package/payload/server/public/assets/wrench-BO-l46rF.js.gz +0 -0
- /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js → useMediaQuery-Baf4Huvv.js} +0 -0
- /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js.br → useMediaQuery-Baf4Huvv.js.br} +0 -0
- /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js.gz → useMediaQuery-Baf4Huvv.js.gz} +0 -0
|
@@ -1,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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"}
|
|
@@ -11,6 +11,70 @@ export interface AgentDispatch {
|
|
|
11
11
|
destination: string;
|
|
12
12
|
prompt: string;
|
|
13
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Task 2378 — the precondition evaluated before the model is invoked.
|
|
16
|
+
*
|
|
17
|
+
* Same shape and handling as `EventAction`: a plugin, a tool, and args stored as
|
|
18
|
+
* a JSON string and passed to the tool verbatim. The dispatcher reads only
|
|
19
|
+
* `structuredContent.hasWork` from the result.
|
|
20
|
+
*/
|
|
21
|
+
export interface EventGate {
|
|
22
|
+
plugin: string;
|
|
23
|
+
tool: string;
|
|
24
|
+
args?: Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Task 2378 — the two write-time refusals a gate carries, shared by
|
|
28
|
+
* `schedule-event` and `schedule-update` so the create path and the edit path
|
|
29
|
+
* cannot disagree about what a valid gate is.
|
|
30
|
+
*
|
|
31
|
+
* A gate on an action-mode event is refused because the action rail already runs
|
|
32
|
+
* headlessly with no model: there is nothing there for a precondition to save,
|
|
33
|
+
* and accepting one would store three properties the dispatcher never reads.
|
|
34
|
+
*
|
|
35
|
+
* A gate with no complete agent dispatch is refused because the gate is only
|
|
36
|
+
* ever consulted on the agent path. Stored on a row that cannot dispatch an
|
|
37
|
+
* agent turn it would read as configured and do nothing, which is precisely the
|
|
38
|
+
* silent-misconfiguration class Task 2130 exists to remove.
|
|
39
|
+
*/
|
|
40
|
+
export declare function validateGate(gate: EventGate, ctx: {
|
|
41
|
+
hasAction: boolean;
|
|
42
|
+
hasCompleteAgentDispatch: boolean;
|
|
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;
|
|
14
78
|
export interface ScheduleEventParams {
|
|
15
79
|
accountId: string;
|
|
16
80
|
name: string;
|
|
@@ -32,6 +96,13 @@ export interface ScheduleEventParams {
|
|
|
32
96
|
sessionKey?: string;
|
|
33
97
|
action?: EventAction;
|
|
34
98
|
agentDispatch?: AgentDispatch;
|
|
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;
|
|
35
106
|
attendees?: ScheduleAttendee[];
|
|
36
107
|
createdBy: CreatedBy;
|
|
37
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,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,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"}
|
|
@@ -10,8 +10,75 @@ const { parseExpression } = cronParser;
|
|
|
10
10
|
import { classifyScheduleWrite } from "../lib/schedule-classify.js";
|
|
11
11
|
import { writeMeeting } from "../lib/meeting-write.js";
|
|
12
12
|
import { validateAgentDispatch } from "../lib/agent-dispatch.js";
|
|
13
|
+
/**
|
|
14
|
+
* Task 2378 — the two write-time refusals a gate carries, shared by
|
|
15
|
+
* `schedule-event` and `schedule-update` so the create path and the edit path
|
|
16
|
+
* cannot disagree about what a valid gate is.
|
|
17
|
+
*
|
|
18
|
+
* A gate on an action-mode event is refused because the action rail already runs
|
|
19
|
+
* headlessly with no model: there is nothing there for a precondition to save,
|
|
20
|
+
* and accepting one would store three properties the dispatcher never reads.
|
|
21
|
+
*
|
|
22
|
+
* A gate with no complete agent dispatch is refused because the gate is only
|
|
23
|
+
* ever consulted on the agent path. Stored on a row that cannot dispatch an
|
|
24
|
+
* agent turn it would read as configured and do nothing, which is precisely the
|
|
25
|
+
* silent-misconfiguration class Task 2130 exists to remove.
|
|
26
|
+
*/
|
|
27
|
+
export function validateGate(gate, ctx) {
|
|
28
|
+
if (!gate.plugin || !gate.tool) {
|
|
29
|
+
throw new Error("Gate requires both 'plugin' and 'tool' fields");
|
|
30
|
+
}
|
|
31
|
+
if (ctx.hasAction) {
|
|
32
|
+
throw new Error("A gate cannot be set on an action-mode event — an action already runs headlessly with no model, so it has nothing to gate. Gates apply to agentDispatch events only.");
|
|
33
|
+
}
|
|
34
|
+
if (!ctx.hasCompleteAgentDispatch) {
|
|
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
|
+
}
|
|
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
|
+
}
|
|
13
80
|
export async function scheduleEvent(params) {
|
|
14
|
-
const { accountId, name, description, startDate, endDate, location, recurrence, timezone, accountTimezone, sessionKey, action, agentDispatch, attendees, createdBy, } = params;
|
|
81
|
+
const { accountId, name, description, startDate, endDate, location, recurrence, timezone, accountTimezone, sessionKey, action, agentDispatch, gate, gateWaived, attendees, createdBy, } = params;
|
|
15
82
|
// Decide the bucket up front. A genuine meeting (a resolvable counterparty, or
|
|
16
83
|
// a bounded start+end with no trigger) lands as a :Meeting; a recurrence/action/
|
|
17
84
|
// agentDispatch or a bare one-time reminder lands as an :Event.
|
|
@@ -51,6 +118,28 @@ export async function scheduleEvent(params) {
|
|
|
51
118
|
if (agentDispatch) {
|
|
52
119
|
validateAgentDispatch(accountId, agentDispatch);
|
|
53
120
|
}
|
|
121
|
+
const hasCompleteAgentDispatch = Boolean(agentDispatch?.channel && agentDispatch?.destination && agentDispatch?.prompt);
|
|
122
|
+
// Task 2378 — refused before the action block below, so a call setting both a
|
|
123
|
+
// gate and an action is told about the gate rather than about an incidental
|
|
124
|
+
// plugin-directory miss.
|
|
125
|
+
if (gate) {
|
|
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=-");
|
|
136
|
+
}
|
|
137
|
+
requireGateAnswer({
|
|
138
|
+
hasRecurrence: Boolean(recurrence),
|
|
139
|
+
hasCompleteAgentDispatch,
|
|
140
|
+
hasGate: Boolean(gate),
|
|
141
|
+
waiver,
|
|
142
|
+
});
|
|
54
143
|
if (action) {
|
|
55
144
|
if (!action.plugin || !action.tool) {
|
|
56
145
|
throw new Error("Action requires both 'plugin' and 'tool' fields");
|
|
@@ -143,6 +232,21 @@ export async function scheduleEvent(params) {
|
|
|
143
232
|
props.agentDestination = agentDispatch.destination;
|
|
144
233
|
props.agentPrompt = agentDispatch.prompt;
|
|
145
234
|
}
|
|
235
|
+
if (gate) {
|
|
236
|
+
props.gatePlugin = gate.plugin;
|
|
237
|
+
props.gateTool = gate.tool;
|
|
238
|
+
if (gate.args && Object.keys(gate.args).length > 0) {
|
|
239
|
+
props.gateArgs = JSON.stringify(gate.args);
|
|
240
|
+
}
|
|
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
|
+
}
|
|
146
250
|
const parts = [`Event: ${name}`];
|
|
147
251
|
if (description)
|
|
148
252
|
parts.push(description);
|
|
@@ -155,6 +259,10 @@ export async function scheduleEvent(params) {
|
|
|
155
259
|
parts.push(`action: ${action.plugin}/${action.tool}`);
|
|
156
260
|
if (agentDispatch)
|
|
157
261
|
parts.push(`agent dispatch: ${agentDispatch.channel} → ${agentDispatch.destination}`);
|
|
262
|
+
if (gate)
|
|
263
|
+
parts.push(`gate: ${gate.plugin}/${gate.tool}`);
|
|
264
|
+
if (waiver)
|
|
265
|
+
parts.push(`gate waived: ${waiver}`);
|
|
158
266
|
const embedding = await computeEmbedding(parts.join(" — "));
|
|
159
267
|
if (embedding.length > 0)
|
|
160
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;
|
|
1
|
+
{"version":3,"file":"schedule-event.js","sourceRoot":"","sources":["../../src/tools/schedule-event.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type ScheduleUpdateResult } from "../lib/update-summary.js";
|
|
2
|
-
import type { EventAction, AgentDispatch } from "./schedule-event.js";
|
|
2
|
+
import type { EventAction, AgentDispatch, EventGate } from "./schedule-event.js";
|
|
3
3
|
/**
|
|
4
4
|
* Task 2134 — the status vocabulary, in one place.
|
|
5
5
|
*
|
|
@@ -33,6 +33,8 @@ export interface ScheduleUpdateParams {
|
|
|
33
33
|
note?: string;
|
|
34
34
|
action?: EventAction | null;
|
|
35
35
|
agentDispatch?: AgentDispatch | null;
|
|
36
|
+
/** Task 2378 — set/replace the precondition, or null to clear it. */
|
|
37
|
+
gate?: EventGate | null;
|
|
36
38
|
}
|
|
37
39
|
/**
|
|
38
40
|
* Task 2134 — the resume decision, separated from the write so it is testable
|
|
@@ -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"}
|
|
@@ -5,8 +5,10 @@ import { appendNotesCapped } from "../lib/notes-cap.js";
|
|
|
5
5
|
import { writtenFields } from "../lib/update-summary.js";
|
|
6
6
|
import { computeEmbedding } from "../lib/embedding.js";
|
|
7
7
|
import { normaliseStartDate } from "../lib/time-format.js";
|
|
8
|
+
import { firesPerDay } from "../lib/fires-per-day.js";
|
|
8
9
|
import cronParser from "cron-parser";
|
|
9
10
|
const { parseExpression } = cronParser;
|
|
11
|
+
import { validateGate } from "./schedule-event.js";
|
|
10
12
|
import { validateAgentDispatch } from "../lib/agent-dispatch.js";
|
|
11
13
|
/**
|
|
12
14
|
* Task 2134 — the status vocabulary, in one place.
|
|
@@ -63,7 +65,7 @@ export function planResume(row, now) {
|
|
|
63
65
|
return { ok: true, nextRun: null };
|
|
64
66
|
}
|
|
65
67
|
export async function scheduleUpdate(params) {
|
|
66
|
-
const { accountId, eventId, note, skipNext, action, agentDispatch, ...updates } = params;
|
|
68
|
+
const { accountId, eventId, note, skipNext, action, agentDispatch, gate, ...updates } = params;
|
|
67
69
|
// Task 1378 — an event carries EITHER an action OR an agent dispatch. Reject a
|
|
68
70
|
// single call that would set both; the individual set branches below also clear
|
|
69
71
|
// the opposite mode so the "at most one" invariant holds across updates.
|
|
@@ -135,13 +137,19 @@ export async function scheduleUpdate(params) {
|
|
|
135
137
|
if (updates.eventStatus !== undefined ||
|
|
136
138
|
updates.recurrence !== undefined ||
|
|
137
139
|
updates.startDate !== undefined ||
|
|
138
|
-
embedNeedsStored
|
|
140
|
+
embedNeedsStored ||
|
|
141
|
+
// Task 2378 — a gate being SET needs the row's dispatch mode to validate
|
|
142
|
+
// against. Clearing one (`gate === null`) needs nothing read: three property
|
|
143
|
+
// writes to null are valid on any row.
|
|
144
|
+
gate != null) {
|
|
139
145
|
const readSession = getSession();
|
|
140
146
|
try {
|
|
141
147
|
const read = await readSession.run(`MATCH (e:Event {eventId: $eventId, accountId: $accountId})
|
|
142
148
|
RETURN e.eventStatus AS eventStatus, e.recurrence AS recurrence,
|
|
143
149
|
e.timezone AS timezone, e.startDate AS startDate,
|
|
144
|
-
e.name AS name, e.description AS description
|
|
150
|
+
e.name AS name, e.description AS description,
|
|
151
|
+
e.agentChannel AS agentChannel, e.agentDestination AS agentDestination,
|
|
152
|
+
e.agentPrompt AS agentPrompt, e.actionPlugin AS actionPlugin`, { eventId, accountId });
|
|
145
153
|
if (read.records.length > 0) {
|
|
146
154
|
const r = read.records[0];
|
|
147
155
|
stored = {
|
|
@@ -151,6 +159,10 @@ export async function scheduleUpdate(params) {
|
|
|
151
159
|
startDate: (r.get("startDate") ?? null),
|
|
152
160
|
name: (r.get("name") ?? null),
|
|
153
161
|
description: (r.get("description") ?? null),
|
|
162
|
+
agentChannel: (r.get("agentChannel") ?? null),
|
|
163
|
+
agentDestination: (r.get("agentDestination") ?? null),
|
|
164
|
+
agentPrompt: (r.get("agentPrompt") ?? null),
|
|
165
|
+
actionPlugin: (r.get("actionPlugin") ?? null),
|
|
154
166
|
};
|
|
155
167
|
}
|
|
156
168
|
}
|
|
@@ -269,6 +281,64 @@ export async function scheduleUpdate(params) {
|
|
|
269
281
|
catch (err) {
|
|
270
282
|
throw new Error(`Invalid recurrence expression: "${updates.recurrence}" — ${err instanceof Error ? err.message : String(err)}`);
|
|
271
283
|
}
|
|
284
|
+
// Task 2380 — the change that left no record.
|
|
285
|
+
//
|
|
286
|
+
// Reaching this line means the expression parsed: the catch above rethrows.
|
|
287
|
+
// It sits outside that try deliberately, because a fault raised in here
|
|
288
|
+
// would otherwise be reported as "Invalid recurrence expression" against a
|
|
289
|
+
// cron the caller had just supplied correctly.
|
|
290
|
+
//
|
|
291
|
+
// The row used to keep only the new expression: no previous value, no
|
|
292
|
+
// changed-at stamp, no line. `e.updatedAt` is bumped by every fire
|
|
293
|
+
// (check-due-events.ts:769-773) so it cannot date the edit either, which is
|
|
294
|
+
// why event 65ef758c's quadrupling was reconstructed a week later by hand
|
|
295
|
+
// from nextRun values. The comparison is against the value the pre-read
|
|
296
|
+
// already fetched, so it costs no extra round trip.
|
|
297
|
+
const previousRecurrence = stored?.recurrence ?? null;
|
|
298
|
+
if (stored !== null && previousRecurrence !== updates.recurrence) {
|
|
299
|
+
// A null previous IS a change — a one-time routine gaining a cadence —
|
|
300
|
+
// but there is nothing to record, and `SET x = null` in Cypher removes
|
|
301
|
+
// the property rather than storing an absence.
|
|
302
|
+
if (previousRecurrence !== null) {
|
|
303
|
+
setClauses.push("e.recurrencePrevious = $recurrencePrevious");
|
|
304
|
+
queryParams.recurrencePrevious = previousRecurrence;
|
|
305
|
+
}
|
|
306
|
+
setClauses.push("e.recurrenceChangedAt = $now");
|
|
307
|
+
// The per-day counts are the incident: 24 to 96 on a fixed ~26,500
|
|
308
|
+
// output-token sweep is ~0.6M to ~2.4M output tokens per day. Counted in
|
|
309
|
+
// the routine's own zone, so a clock-change day reads 23 or 25.
|
|
310
|
+
//
|
|
311
|
+
// A stored expression that no longer parses reports `-` rather than
|
|
312
|
+
// throwing. The blind spot this task names is a writer that bypasses this
|
|
313
|
+
// tool, and a throw here would make a cron written that way unfixable
|
|
314
|
+
// through the tool that exists to fix it.
|
|
315
|
+
const countedAt = new Date();
|
|
316
|
+
const rate = (expr) => {
|
|
317
|
+
if (expr === null)
|
|
318
|
+
return "0";
|
|
319
|
+
try {
|
|
320
|
+
return String(firesPerDay(expr, effectiveTimezone, countedAt));
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
return "-";
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
// `agentBearing` describes the row AFTER this call lands, because it
|
|
327
|
+
// qualifies the cost of the NEW rate and one call can change the cadence
|
|
328
|
+
// and the dispatch mode together. Three sources, in the order the SET
|
|
329
|
+
// clauses below resolve them: this call's own dispatch, then an action
|
|
330
|
+
// being SET (which clears all three agent fields, `action != null` only —
|
|
331
|
+
// `action: null` clears the action and leaves them alone), then the row.
|
|
332
|
+
const agentBearing = agentDispatch !== undefined
|
|
333
|
+
? agentDispatch !== null
|
|
334
|
+
: action != null
|
|
335
|
+
? false
|
|
336
|
+
: Boolean(stored.agentChannel && stored.agentDestination && stored.agentPrompt);
|
|
337
|
+
console.error(`[schedule-audit] op=recurrence-changed eventId=${ids.eventId} ` +
|
|
338
|
+
`from=${previousRecurrence ?? "-"} to=${updates.recurrence} ` +
|
|
339
|
+
`firesPerDayFrom=${rate(previousRecurrence)} firesPerDayTo=${rate(updates.recurrence)} ` +
|
|
340
|
+
`agentBearing=${agentBearing}`);
|
|
341
|
+
}
|
|
272
342
|
}
|
|
273
343
|
// One writer per property. When the cron branch has already recomputed
|
|
274
344
|
// nextRun from the same effective recurrence and zone, a second SET clause on
|
|
@@ -320,6 +390,13 @@ export async function scheduleUpdate(params) {
|
|
|
320
390
|
setClauses.push("e.agentChannel = null");
|
|
321
391
|
setClauses.push("e.agentDestination = null");
|
|
322
392
|
setClauses.push("e.agentPrompt = null");
|
|
393
|
+
// Task 2378 — and with the agent dispatch goes its gate. A gate left behind
|
|
394
|
+
// on a row that is now action-mode is three properties the dispatcher never
|
|
395
|
+
// reads, and the next `gate` edit would be refused against a state the row
|
|
396
|
+
// no longer visibly holds.
|
|
397
|
+
setClauses.push("e.gatePlugin = null");
|
|
398
|
+
setClauses.push("e.gateTool = null");
|
|
399
|
+
setClauses.push("e.gateArgs = null");
|
|
323
400
|
}
|
|
324
401
|
// Agent dispatch: set, replace, or clear (Task 1378) — mirrors the action block.
|
|
325
402
|
if (agentDispatch === null) {
|
|
@@ -349,6 +426,50 @@ export async function scheduleUpdate(params) {
|
|
|
349
426
|
setClauses.push("e.actionTool = null");
|
|
350
427
|
setClauses.push("e.actionArgs = null");
|
|
351
428
|
}
|
|
429
|
+
// Task 2378 — gate: set, replace, or clear. Mirrors the action and
|
|
430
|
+
// agentDispatch blocks. Validated against the state the row will hold after
|
|
431
|
+
// this update: whichever of action/agentDispatch this call supplies wins over
|
|
432
|
+
// the stored value, so a single call that sets both an agentDispatch and its
|
|
433
|
+
// gate is accepted, and one that sets a gate onto a row that is action-mode is
|
|
434
|
+
// refused with the reason named.
|
|
435
|
+
if (gate === null) {
|
|
436
|
+
setClauses.push("e.gatePlugin = null");
|
|
437
|
+
setClauses.push("e.gateTool = null");
|
|
438
|
+
setClauses.push("e.gateArgs = null");
|
|
439
|
+
}
|
|
440
|
+
else if (gate !== undefined) {
|
|
441
|
+
const effectiveAction = action === null ? false : action !== undefined || Boolean(stored?.actionPlugin);
|
|
442
|
+
const effectiveDispatch = agentDispatch === null
|
|
443
|
+
? false
|
|
444
|
+
: agentDispatch !== undefined
|
|
445
|
+
? Boolean(agentDispatch.channel && agentDispatch.destination && agentDispatch.prompt)
|
|
446
|
+
: Boolean(stored?.agentChannel && stored?.agentDestination && stored?.agentPrompt);
|
|
447
|
+
validateGate(gate, {
|
|
448
|
+
hasAction: effectiveAction,
|
|
449
|
+
hasCompleteAgentDispatch: effectiveDispatch,
|
|
450
|
+
});
|
|
451
|
+
setClauses.push("e.gatePlugin = $gatePlugin");
|
|
452
|
+
setClauses.push("e.gateTool = $gateTool");
|
|
453
|
+
queryParams.gatePlugin = gate.plugin;
|
|
454
|
+
queryParams.gateTool = gate.tool;
|
|
455
|
+
if (gate.args && Object.keys(gate.args).length > 0) {
|
|
456
|
+
setClauses.push("e.gateArgs = $gateArgs");
|
|
457
|
+
queryParams.gateArgs = JSON.stringify(gate.args);
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
// Same handling as actionArgs: replacing a gate with an argument-less one
|
|
461
|
+
// must not leave the previous gate's arguments behind for the new tool.
|
|
462
|
+
setClauses.push("e.gateArgs = null");
|
|
463
|
+
}
|
|
464
|
+
// Task 2379 — stamp the binding as operator-owned, for the same reason the
|
|
465
|
+
// agentDispatch block above does. The roster seed refreshes an unedited row
|
|
466
|
+
// on a version bump and writes the template's gate, so without this an
|
|
467
|
+
// operator's own binding is replaced on the next upgrade and the only
|
|
468
|
+
// evidence is the binding having changed. Only the set path stamps:
|
|
469
|
+
// clearing a gate returns the row to its template's classification, which
|
|
470
|
+
// is what the next refresh would write anyway.
|
|
471
|
+
setClauses.push("e.operatorEdited = $now");
|
|
472
|
+
}
|
|
352
473
|
// One append, however many lines it carries. Two appendNotesCapped clauses in
|
|
353
474
|
// the same SET both write e.notes, and the later would drop the earlier.
|
|
354
475
|
const noteLines = [];
|