@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
package/payload/server/server.js
CHANGED
|
@@ -24093,9 +24093,25 @@ var ROUTINE_COLS = `e.eventId AS eventId, e.name AS name, e.eventStatus AS event
|
|
|
24093
24093
|
e.actionPlugin AS actionPlugin, e.actionTool AS actionTool, e.actionArgs AS actionArgs,
|
|
24094
24094
|
e.notes AS notes, e.description AS description,
|
|
24095
24095
|
e.lastDispatchResult AS lastDispatchResult, e.lastDispatchAt AS lastDispatchAt,
|
|
24096
|
-
e.suspendedInBulk AS suspendedInBulk
|
|
24096
|
+
e.suspendedInBulk AS suspendedInBulk,
|
|
24097
|
+
e.gatePlugin AS gatePlugin, e.gateTool AS gateTool, e.gateArgs AS gateArgs,
|
|
24098
|
+
e.gateWaived AS gateWaived,
|
|
24099
|
+
size([(e)<-[:RUN_OF]-(r:RoutineRun)
|
|
24100
|
+
WHERE r.accountId = e.accountId AND r.startedAt >= $since | r]) AS runs24h,
|
|
24101
|
+
size([(e)<-[:RUN_OF]-(r:RoutineRun)
|
|
24102
|
+
WHERE r.accountId = e.accountId AND r.startedAt >= $since AND r.status = 'gated' | r]) AS gated24h`;
|
|
24103
|
+
function since24h() {
|
|
24104
|
+
return new Date(Date.now() - 24 * 60 * 60 * 1e3).toISOString();
|
|
24105
|
+
}
|
|
24097
24106
|
function mapRoutine(r) {
|
|
24098
24107
|
const g = (k) => r.get(k) ?? null;
|
|
24108
|
+
const n = (k) => {
|
|
24109
|
+
const v = r.get(k);
|
|
24110
|
+
if (v == null) return 0;
|
|
24111
|
+
if (typeof v === "object" && "toNumber" in v) return v.toNumber();
|
|
24112
|
+
const x = Number(v);
|
|
24113
|
+
return Number.isFinite(x) ? x : 0;
|
|
24114
|
+
};
|
|
24099
24115
|
return {
|
|
24100
24116
|
eventId: g("eventId"),
|
|
24101
24117
|
name: g("name"),
|
|
@@ -24123,7 +24139,20 @@ function mapRoutine(r) {
|
|
|
24123
24139
|
// server will actually act on. Without it the control reads `suspended`,
|
|
24124
24140
|
// which includes the thirteen seeded roster rows on every fresh install, and
|
|
24125
24141
|
// pressing it reports restoring nothing.
|
|
24126
|
-
suspendedInBulk: r.get("suspendedInBulk") === true
|
|
24142
|
+
suspendedInBulk: r.get("suspendedInBulk") === true,
|
|
24143
|
+
// Task 2384 — 2378's gate, and 2383's waiver. gateTool is the field the
|
|
24144
|
+
// client's routineMode() reads to tell "checks first" from "model every
|
|
24145
|
+
// fire"; gateWaived carries the reason 2383's schedule-event stamps on a
|
|
24146
|
+
// deliberately ungated routine, and is null on rows predating it.
|
|
24147
|
+
gatePlugin: g("gatePlugin"),
|
|
24148
|
+
gateTool: g("gateTool"),
|
|
24149
|
+
gateArgs: g("gateArgs"),
|
|
24150
|
+
gateWaived: g("gateWaived"),
|
|
24151
|
+
// Task 2384 — the trailing 24 hours, on every routine response rather than
|
|
24152
|
+
// only the list: the modal's save replaces the list row wholesale
|
|
24153
|
+
// (page.tsx:202), so counts served on the list alone would blank on save.
|
|
24154
|
+
runs24h: n("runs24h"),
|
|
24155
|
+
gated24h: n("gated24h")
|
|
24127
24156
|
};
|
|
24128
24157
|
}
|
|
24129
24158
|
function planResume(row, now) {
|
|
@@ -24162,7 +24191,7 @@ app51.get("/", requireAdminSession, async (c) => {
|
|
|
24162
24191
|
WHERE ${AUTOMATION_WHERE}
|
|
24163
24192
|
RETURN ${ROUTINE_COLS}
|
|
24164
24193
|
ORDER BY e.nextRun`,
|
|
24165
|
-
{ accountId }
|
|
24194
|
+
{ accountId, since: since24h() }
|
|
24166
24195
|
);
|
|
24167
24196
|
const routines = res.records.map(mapRoutine);
|
|
24168
24197
|
console.log(`[admin:routines] op=list accountId=${accountId.slice(0, 8)} count=${routines.length}`);
|
|
@@ -24374,7 +24403,7 @@ app51.get("/:eventId", requireAdminSession, async (c) => {
|
|
|
24374
24403
|
`MATCH (e:Event {eventId: $eventId, accountId: $accountId})
|
|
24375
24404
|
WHERE ${AUTOMATION_WHERE}
|
|
24376
24405
|
RETURN ${ROUTINE_COLS}`,
|
|
24377
|
-
{ eventId, accountId }
|
|
24406
|
+
{ eventId, accountId, since: since24h() }
|
|
24378
24407
|
);
|
|
24379
24408
|
const found = res.records.length > 0;
|
|
24380
24409
|
console.log(`[admin:routines] op=get id=${eventId.slice(0, 8)} found=${found}`);
|
|
@@ -24541,6 +24570,7 @@ app51.patch("/:eventId", requireAdminSession, async (c) => {
|
|
|
24541
24570
|
if (setClauses.length === 0) return c.json({ error: "No editable fields supplied" }, 400);
|
|
24542
24571
|
setClauses.push("e.updatedAt = $updatedAt");
|
|
24543
24572
|
params.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
24573
|
+
params.since = since24h();
|
|
24544
24574
|
const session = getSession();
|
|
24545
24575
|
try {
|
|
24546
24576
|
const res = await session.run(
|
|
@@ -24666,7 +24696,7 @@ app51.post("/:eventId/suspend", requireAdminSession, async (c) => {
|
|
|
24666
24696
|
e.updatedAt = $now,
|
|
24667
24697
|
e.notes = COALESCE(e.notes, '') + $noteEntry
|
|
24668
24698
|
RETURN ${ROUTINE_COLS}`,
|
|
24669
|
-
{ eventId, accountId, now, noteEntry: `
|
|
24699
|
+
{ eventId, accountId, now, since: since24h(), noteEntry: `
|
|
24670
24700
|
[${now}] Suspended from the routines dashboard` }
|
|
24671
24701
|
);
|
|
24672
24702
|
if (res.records.length === 0) {
|
|
@@ -24730,6 +24760,7 @@ app51.post("/:eventId/resume", requireAdminSession, async (c) => {
|
|
|
24730
24760
|
setClauses.push("e.nextRun = $nextRun");
|
|
24731
24761
|
params.nextRun = plan.nextRun;
|
|
24732
24762
|
}
|
|
24763
|
+
params.since = since24h();
|
|
24733
24764
|
const res = await session.run(
|
|
24734
24765
|
`MATCH (e:Event {eventId: $eventId, accountId: $accountId})
|
|
24735
24766
|
WHERE ${AUTOMATION_WHERE} AND e.eventStatus = 'suspended'
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{nt as e,ot as t}from"./useMediaQuery-_mMln3Fu.js";import"./useVoiceRecorder-BaDpMYxX.js";import"./AdminShell-DVBAMUCy.js";import{n}from"./page-ne7I_r9L.js";import"./useCopyFeedback-Bz9OJHBb.js";var r=t(),i=e();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Z as e}from"./useMediaQuery-_mMln3Fu.js";var t=e(`chevron-left`,[[`path`,{d:`m15 18-6-6 6-6`,key:`1wnfg3`}]]);export{t};
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Z as e}from"./useMediaQuery-_mMln3Fu.js";var t=e(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]);export{t};
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Z as e}from"./useMediaQuery-_mMln3Fu.js";var t=e(`clock`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 6v6l4 2`,key:`mmk7yg`}]]);export{t};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{nt as e,ot as t}from"./useMediaQuery-_mMln3Fu.js";import"./useVoiceRecorder-BaDpMYxX.js";import{t as n}from"./page-C8jyPH_3.js";import"./graph-labels-CA1UcDuS.js";var r=t(),i=e();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@�v��[�K��4c����&��nI��i�a�4�u�;��eG�U==�L����,
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Z as e}from"./useMediaQuery-_mMln3Fu.js";var t=e(`play`,[[`path`,{d:`M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z`,key:`10ikf1`}]]);export{t};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{o as e}from"./chunk-CltuBf4Z.js";import{F as t,G as n,L as r,M as i,O as a,V as o,Y as s,Z as c,_ as l,at as u,ct as d,f,j as p,k as m,m as h,nt as g,ot as _,v}from"./useMediaQuery-_mMln3Fu.js";import{k as y,m as b,t as x}from"./AdminShell-DVBAMUCy.js";import{t as S}from"./clock-CfDdatjp.js";import{t as C}from"./wrench-BO-l46rF.js";import{r as w}from"./file-download-DbNIjWiK.js";var ee=c(`circle-pause`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`line`,{x1:`10`,x2:`10`,y1:`15`,y2:`9`,key:`c1nkhi`}],[`line`,{x1:`14`,x2:`14`,y1:`15`,y2:`9`,key:`h65svq`}]]),te=c(`circle-play`,[[`path`,{d:`M9 9.003a1 1 0 0 1 1.517-.859l4.997 2.997a1 1 0 0 1 0 1.718l-4.997 2.997A1 1 0 0 1 9 14.996z`,key:`kmsa83`}],[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),T=c(`history`,[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M12 7v5l4 2`,key:`1fdv2h`}]]),E=_(),D=e(d(),1),O=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function k(e,t){if(e===`*`)return{kind:`any`,value:0,rangeStart:null,rangeEnd:null,step:1};let n=e.match(/^(\*|\d+-\d+)\/(\d+)$/);if(n){let e=Number(n[2]);if(e<1)return null;if(n[1]===`*`)return{kind:`step`,value:0,rangeStart:null,rangeEnd:null,step:e};let[r,i]=n[1].split(`-`).map(Number);return r>t||i>t||r>i?null:{kind:`step`,value:0,rangeStart:r,rangeEnd:i,step:e}}let r=e.match(/^(\d+)-(\d+)$/);if(r){let e=Number(r[1]),n=Number(r[2]);return e>t||n>t||e>n?null:{kind:`step`,value:0,rangeStart:e,rangeEnd:n,step:1}}if(/^\d+$/.test(e)){let n=Number(e);return n>t?null:{kind:`fixed`,value:n,rangeStart:null,rangeEnd:null,step:1}}return null}function A(e){return String(e).padStart(2,`0`)}function j(e){if(e===`*`)return null;let t=e.match(/^(\d+)-(\d+)$/);if(t){let e=Number(t[1]),n=Number(t[2]);return e>7||n>7||e>n?`invalid`:`${O[e%7]} to ${O[n%7]}`}let n=e.split(`,`);return n.length>0&&n.every(e=>/^\d+$/.test(e)&&Number(e)<=7)?n.map(e=>O[Number(e)%7]).join(`, `):`invalid`}function M(e){let t=e.trim().split(/\s+/);if(t.length!==5)return e;let[n,r,i,a,o]=t;if(a!==`*`||i!==`*`&&!/^\d+$/.test(i)||i!==`*`&&(Number(i)<1||Number(i)>31))return e;let s=k(n,59),c=k(r,23);if(!s||!c)return e;let l=j(o);if(l===`invalid`||s.kind===`step`&&s.rangeStart!==null||(s.kind===`any`&&(s={kind:`step`,value:0,rangeStart:null,rangeEnd:null,step:1}),c.kind===`step`&&c.step===1&&c.rangeStart===null&&(c={kind:`any`,value:0,rangeStart:null,rangeEnd:null,step:1}),i!==`*`&&!(s.kind===`fixed`&&c.kind===`fixed`&&o===`*`))||s.kind===`step`&&c.kind===`step`&&c.step>1)return e;let u=l?`, ${l}`:``,d=e=>e.rangeStart+Math.floor((e.rangeEnd-e.rangeStart)/e.step)*e.step;if(s.kind===`step`){let e=s.step===1?`Every minute`:`Every ${s.step} minutes`;return c.kind===`any`?`${e}${u}`:c.kind===`fixed`?`${e}, ${A(c.value)}:00 to ${A(c.value)}:59${u}`:`${e}, ${A(c.rangeStart)}:00 to ${A(d(c))}:00${u}`}if(c.kind===`step`){let e=A(s.value),t=s.value===0?``:` at :${e}`;return c.rangeStart===null?`Every ${c.step} hours${t}${u}`:c.step===1?`Hourly, ${A(c.rangeStart)}:${e} to ${A(c.rangeEnd)}:${e}${u}`:`Every ${c.step} hours, ${A(c.rangeStart)}:${e} to ${A(d(c))}:${e}${u}`}if(c.kind===`any`)return`${s.value===0?`Every hour`:`Every hour at :${A(s.value)}`}${u}`;let f=`${A(c.value)}:${A(s.value)}`;return i===`*`?l?`${l} at ${f}`:`Daily at ${f}`:`Monthly on day ${Number(i)} at ${f}`}var N={timeMode:`at`,minute:0,hour:9,interval:1,window:null,dayMode:`every`,weekdays:[],dayOfMonth:1};function P(e){let t=e.match(/^(\d+)-(\d+)$/);if(t){let e=Number(t[1]),n=Number(t[2]);if(e>7||n>7||e>n)return null;let r=[];for(let t=e;t<=n;t+=1)r.push(t%7);return[...new Set(r)].sort((e,t)=>e-t)}let n=e.split(`,`);return n.every(e=>/^\d+$/.test(e)&&Number(e)<=7)?[...new Set(n.map(e=>Number(e)%7))].sort((e,t)=>e-t):null}function F(e){let t=e.trim().split(/\s+/);if(t.length!==5)return null;let[n,r,i,a,o]=t;if(a!==`*`||i!==`*`&&!/^\d+$/.test(i))return null;let s=k(n,59),c=k(r,23);if(!s||!c||s.kind===`step`&&s.rangeStart!==null)return null;let l=`every`,u=[],d=1;if(i!==`*`){if(o!==`*`)return null;let e=Number(i);if(e<1||e>31||s.kind!==`fixed`||c.kind!==`fixed`)return null;l=`dayOfMonth`,d=e}else if(o!==`*`){let e=P(o);if(e===null)return null;l=`weekdays`,u=e}let f={dayMode:l,weekdays:u,dayOfMonth:d};if(s.kind===`any`||s.kind===`step`){if(c.kind===`step`&&c.step>1)return null;let e=s.kind===`any`?1:s.step,t=c.kind===`any`?null:c.kind===`fixed`?{start:c.value,end:c.value}:{start:c.rangeStart,end:c.rangeEnd};return{...N,...f,timeMode:`everyMinutes`,minute:0,interval:e,window:t}}return c.kind===`fixed`?{...N,...f,timeMode:`at`,minute:s.value,hour:c.value}:c.kind===`any`?{...N,...f,timeMode:`everyHours`,minute:s.value,interval:1,window:null}:{...N,...f,timeMode:`everyHours`,minute:s.value,interval:c.step,window:c.rangeStart===null?null:{start:c.rangeStart,end:c.rangeEnd}}}function I(e){return e.dayMode===`dayOfMonth`?[String(e.dayOfMonth),`*`]:e.dayMode===`weekdays`&&e.weekdays.length>0?[`*`,[...e.weekdays].sort((e,t)=>e-t).join(`,`)]:[`*`,`*`]}function L(e){let[t,n]=I(e);if(e.timeMode===`everyMinutes`){let r=e.window===null?`*`:e.window.start===e.window.end?String(e.window.start):`${e.window.start}-${e.window.end}`;return`*/${e.interval} ${r} ${t} * ${n}`}if(e.timeMode===`everyHours`){let r=e.window===null?e.interval===1?`*`:`*/${e.interval}`:e.interval===1?`${e.window.start}-${e.window.end}`:`${e.window.start}-${e.window.end}/${e.interval}`;return`${e.minute} ${r} ${t} * ${n}`}return`${e.minute} ${e.hour} ${t} * ${n}`}var R=g(),z=[{value:1,label:`Mon`},{value:2,label:`Tue`},{value:3,label:`Wed`},{value:4,label:`Thu`},{value:5,label:`Fri`},{value:6,label:`Sat`},{value:0,label:`Sun`}],B=Array.from({length:24},(e,t)=>t),V=e=>String(e).padStart(2,`0`),H={timeMode:`at`,minute:0,hour:9,interval:1,window:null,dayMode:`every`,weekdays:[],dayOfMonth:1};function ne({recurrence:e,onChange:t,disabled:n}){let r=e?F(e):H,[i,a]=(0,D.useState)(r??H),[o]=(0,D.useState)(e!=null&&r==null),[s,c]=(0,D.useState)(e??``);if((0,D.useEffect)(()=>{fetch(`/api/_client-error`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({kind:`event`,source:`routines`,op:`schedule-editor`,mode:o?`raw`:`builder`}),keepalive:!0}).catch(()=>{})},[o]),o)return(0,R.jsxs)(`label`,{className:`cal-modal-field`,children:[(0,R.jsx)(`span`,{children:`Schedule (advanced)`}),(0,R.jsx)(`input`,{type:`text`,className:`routine-raw-cron`,value:s,disabled:n,onChange:e=>{c(e.target.value),t(e.target.value)},"aria-label":`Cron expression`}),(0,R.jsx)(`span`,{className:`routine-raw-note`,children:`This routine uses an advanced schedule, edited as a raw cron expression.`})]});let l=e=>{a(e),t(L(e))},u=e=>{let t=e!==`at`&&i.dayMode===`dayOfMonth`?`every`:i.dayMode;l({...i,timeMode:e,dayMode:t})},d=e=>{let t=e===`weekdays`&&i.weekdays.length===0?[1]:i.weekdays;l({...i,dayMode:e,weekdays:t})},f=e=>{let[t,n]=e.split(`:`);l({...i,hour:Number(t)||0,minute:Number(n)||0})},p=e=>{let t=i.weekdays.includes(e);if(t&&i.weekdays.length===1)return;let n=t?i.weekdays.filter(t=>t!==e):[...i.weekdays,e];l({...i,weekdays:n})},m=e=>l({...i,window:e?{start:0,end:23}:null}),h=(e,t)=>{let n={...i.window??{start:0,end:23},[e]:Number(t)};n.start>n.end&&(e===`start`?n.end=n.start:n.start=n.end),l({...i,window:n})},g=(e,t,n)=>Math.min(n,Math.max(t,Number(e)||t));return(0,R.jsxs)(`div`,{className:`routine-sched`,children:[(0,R.jsxs)(`label`,{className:`cal-modal-field`,children:[(0,R.jsx)(`span`,{children:`How often`}),(0,R.jsxs)(`select`,{"aria-label":`How often`,value:i.timeMode,disabled:n,onChange:e=>u(e.target.value),children:[(0,R.jsx)(`option`,{value:`at`,children:`At a time of day`}),(0,R.jsx)(`option`,{value:`everyMinutes`,children:`Every few minutes`}),(0,R.jsx)(`option`,{value:`everyHours`,children:`Every few hours`})]})]}),i.timeMode===`at`&&(0,R.jsxs)(`label`,{className:`cal-modal-field`,children:[(0,R.jsx)(`span`,{children:`Time of day`}),(0,R.jsx)(`input`,{type:`time`,"aria-label":`Time of day`,value:`${V(i.hour)}:${V(i.minute)}`,disabled:n,onChange:e=>f(e.target.value)})]}),i.timeMode===`everyMinutes`&&(0,R.jsxs)(`label`,{className:`cal-modal-field`,children:[(0,R.jsx)(`span`,{children:`Minutes between runs`}),(0,R.jsx)(`input`,{type:`number`,min:1,max:59,"aria-label":`Minutes between runs`,value:i.interval,disabled:n,onChange:e=>l({...i,interval:g(e.target.value,1,59)})})]}),i.timeMode===`everyHours`&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`label`,{className:`cal-modal-field`,children:[(0,R.jsx)(`span`,{children:`Hours between runs`}),(0,R.jsx)(`input`,{type:`number`,min:1,max:23,"aria-label":`Hours between runs`,value:i.interval,disabled:n,onChange:e=>l({...i,interval:g(e.target.value,1,23)})})]}),(0,R.jsxs)(`label`,{className:`cal-modal-field`,children:[(0,R.jsx)(`span`,{children:`Minute of the hour`}),(0,R.jsx)(`input`,{type:`number`,min:0,max:59,"aria-label":`Minute of the hour`,value:i.minute,disabled:n,onChange:e=>l({...i,minute:g(e.target.value,0,59)})})]})]}),i.timeMode!==`at`&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`label`,{className:`cal-modal-field routine-sched-check`,children:[(0,R.jsx)(`input`,{type:`checkbox`,"aria-label":`Only between certain hours`,checked:i.window!==null,disabled:n,onChange:e=>m(e.target.checked)}),(0,R.jsx)(`span`,{children:`Only between certain hours`})]}),i.window!==null&&(0,R.jsxs)(`div`,{className:`routine-sched-row`,children:[(0,R.jsxs)(`label`,{className:`cal-modal-field`,children:[(0,R.jsx)(`span`,{children:`From hour`}),(0,R.jsx)(`select`,{"aria-label":`From hour`,value:i.window.start,disabled:n,onChange:e=>h(`start`,e.target.value),children:B.map(e=>(0,R.jsxs)(`option`,{value:e,children:[V(e),`:00`]},e))})]}),(0,R.jsxs)(`label`,{className:`cal-modal-field`,children:[(0,R.jsx)(`span`,{children:`To hour`}),(0,R.jsx)(`select`,{"aria-label":`To hour`,value:i.window.end,disabled:n,onChange:e=>h(`end`,e.target.value),children:B.map(e=>(0,R.jsxs)(`option`,{value:e,children:[V(e),`:00`]},e))})]})]})]}),(0,R.jsxs)(`label`,{className:`cal-modal-field`,children:[(0,R.jsx)(`span`,{children:`Which days`}),(0,R.jsxs)(`select`,{"aria-label":`Which days`,value:i.dayMode,disabled:n,onChange:e=>d(e.target.value),children:[(0,R.jsx)(`option`,{value:`every`,children:`Every day`}),(0,R.jsx)(`option`,{value:`weekdays`,children:`Specific days`}),i.timeMode===`at`&&(0,R.jsx)(`option`,{value:`dayOfMonth`,children:`A day of the month`})]})]}),i.dayMode===`weekdays`&&(0,R.jsxs)(`div`,{className:`cal-modal-field`,children:[(0,R.jsx)(`span`,{children:`Days`}),(0,R.jsx)(`div`,{className:`routine-weekdays`,children:z.map(e=>(0,R.jsx)(`button`,{type:`button`,className:`routine-weekday${i.weekdays.includes(e.value)?` routine-weekday-on`:``}`,"aria-pressed":i.weekdays.includes(e.value),disabled:n,onClick:()=>p(e.value),children:e.label},e.value))})]}),i.dayMode===`dayOfMonth`&&(0,R.jsxs)(`label`,{className:`cal-modal-field`,children:[(0,R.jsx)(`span`,{children:`Day of month`}),(0,R.jsx)(`select`,{"aria-label":`Day of month`,value:i.dayOfMonth,disabled:n,onChange:e=>l({...i,dayOfMonth:Number(e.target.value)||1}),children:Array.from({length:31},(e,t)=>t+1).map(e=>(0,R.jsx)(`option`,{value:e,children:e},e))})]})]})}function U(e){let t=e.trim().replace(/[\s\-().]/g,``).replace(/^\+/,``);return/^\d{11,15}$/.test(t)?`+${t.slice(0,2)} ${t.slice(2,6)} ${t.slice(6)}`:e}function re(e){if(e.name)return`${e.name} · ${e.label}`;let t=e.channel===`whatsapp`?U(e.destination):e.destination;return`${e.label} · ${t}`}var W={scheduled:`live`,due:`live`,suspended:`stood-down`,cancelled:`inert`,completed:`inert`};function G(e){return e==null||!Object.hasOwn(W,e)?`unknown`:W[e]}var K={finished:`live`,started:`in-flight`,accepted:`in-flight`,open:`in-flight`,failed:`error`,"no-destination":`warning`};function ie(e){return e==null||!Object.hasOwn(K,e)?`unknown`:K[e]}function ae({eventStatus:e}){let t=G(e);return(0,R.jsx)(`span`,{className:`routine-status-dot is-${t}`,"data-state":t,"aria-hidden":`true`})}function oe(e,t){if(!e)return`—`;let n=Date.parse(e);return Number.isFinite(n)?l(new Date(n).toISOString(),t):e}function se(e){return e?e.split(`
|
|
2
|
-
`).filter(e=>e.trim()!==``).reverse():[]}function ce({routine:e,adminFetch:t,onClose:n,onSaved:a,onDeleted:s,onViewRuns:c}){let{zone:l}=v(),[u,d]=(0,D.useState)(!1),[m,g]=(0,D.useState)(!1),[_,y]=(0,D.useState)(null),[x,w]=(0,D.useState)(e),[E,O]=(0,D.useState)(!1),k=x.agentChannel!=null,A=x.eventStatus===`suspended`,[j,N]=(0,D.useState)(!1),[P,F]=(0,D.useState)(e.agentPrompt??``),[I,L]=(0,D.useState)(e.description??``),[z,B]=(0,D.useState)(e.recurrence),[V,H]=(0,D.useState)(e.agentChannel??``),[U,W]=(0,D.useState)(e.agentDestination??``),[G,K]=(0,D.useState)(null),[ie,ce]=(0,D.useState)(null),q=k||x.actionPlugin==null,J=se(x.notes);(0,D.useEffect)(()=>{let e=e=>{e.key===`Escape`&&!m&&n()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[m,n]),(0,D.useEffect)(()=>{if(!u||!q||G!==null)return;let e=!1;return t(`/api/admin/dispatch-destinations`).then(async e=>{if(!e.ok)throw Error(`HTTP ${e.status}`);return await e.json()}).then(t=>{e||K(t.destinations)}).catch(t=>{e||(K([]),ce(t instanceof Error?t.message:`Could not load destinations`))}),()=>{e=!0}},[u,q,G,t]);let Y=(G??[]).filter(e=>e.channel===V),X=V.length>0&&U.length>0,Z=V.length>0&&U.length===0||X&&P.trim().length===0,Q=(0,D.useCallback)(()=>{let e={},t=V.length>0&&U.length>0;(k||t)&&P!==(x.agentPrompt??``)&&(e.agentPrompt=P);let n=I.trim().length>0?I:null;return n!==(x.description??null)&&(e.description=n),z!=null&&z!==(x.recurrence??null)&&(e.recurrence=z),t&&(V!==(x.agentChannel??``)||U!==(x.agentDestination??``))?(e.agentChannel=V,e.agentDestination=U):!t&&V===``&&(x.agentChannel??``)!==``&&(e.agentChannel=null,e.agentDestination=null),e},[k,P,I,z,V,U,x]),le=(0,D.useCallback)(async()=>{let n=Q();if(Object.keys(n).length===0){d(!1);return}g(!0),y(null);try{let r=await t(`/api/admin/routines/${encodeURIComponent(e.eventId)}`,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify(n)});if(!r.ok){let e=await r.json().catch(()=>({}));throw Error(e.error??`HTTP ${r.status}`)}let i=await r.json();w(i.routine),F(i.routine.agentPrompt??``),L(i.routine.description??``),B(i.routine.recurrence),H(i.routine.agentChannel??``),W(i.routine.agentDestination??``),a(i.routine),d(!1)}catch(e){y(e instanceof Error?e.message:`Save failed`)}finally{g(!1)}},[t,Q,e.eventId,a]),ue=(0,D.useCallback)(async()=>{if(m)return;if(!j){O(!1),N(!0);return}let n=A?`resume`:`suspend`;g(!0),y(null);try{let r=await t(`/api/admin/routines/${encodeURIComponent(e.eventId)}/${n}`,{method:`POST`});if(!r.ok){let e=await r.json().catch(()=>({}));throw Error(e.error??`HTTP ${r.status}`)}let i=await r.json();w(i.routine),a(i.routine),N(!1)}catch(e){y(e instanceof Error?e.message:`${n} failed`),N(!1)}finally{g(!1)}},[t,m,j,A,e.eventId,a]),de=(0,D.useCallback)(async()=>{if(!m){if(!E){N(!1),O(!0);return}g(!0),y(null);try{let n=await t(`/api/admin/routines/${encodeURIComponent(e.eventId)}`,{method:`DELETE`});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`HTTP ${n.status}`)}s(e.eventId)}catch(e){y(e instanceof Error?e.message:`Delete failed`),O(!1)}finally{g(!1)}}},[t,m,E,e.eventId,s]);return(0,R.jsx)(`div`,{className:`cal-modal-overlay`,onClick:()=>{m||n()},children:(0,R.jsxs)(`div`,{className:`cal-modal ${!u||k||X?`cal-modal-wide`:`cal-modal-dispatch`}`,role:`dialog`,"aria-modal":`true`,"aria-label":u?`Edit routine`:`Routine detail`,onClick:e=>e.stopPropagation(),children:[(0,R.jsxs)(`div`,{className:`cal-modal-header`,children:[(0,R.jsxs)(`span`,{className:`cal-modal-kind`,children:[(0,R.jsx)(b,{size:13}),` Routine`]}),(0,R.jsx)(`button`,{type:`button`,className:`cal-modal-close`,onClick:n,"aria-label":`Close`,autoFocus:!0,disabled:m,children:(0,R.jsx)(p,{size:16})})]}),!u&&(0,R.jsxs)(`div`,{className:`cal-modal-body`,children:[(0,R.jsx)(`div`,{className:`cal-modal-title`,children:x.name??`Untitled routine`}),(0,R.jsxs)(`div`,{className:`cal-modal-row`,children:[(0,R.jsx)(S,{size:14}),(0,R.jsx)(`span`,{children:x.recurrence?M(x.recurrence):`One-time`})]}),(0,R.jsxs)(`div`,{className:`cal-modal-row cal-modal-meta`,children:[(0,R.jsx)(ae,{eventStatus:x.eventStatus}),(0,R.jsxs)(`span`,{children:[`Status: `,x.eventStatus??`unknown`]})]}),(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-meta`,children:(0,R.jsxs)(`span`,{children:[`Next run: `,oe(x.nextRun,l)]})}),(0,R.jsxs)(`div`,{className:`cal-modal-row cal-modal-meta`,children:[(0,R.jsx)(T,{size:14}),(0,R.jsxs)(`span`,{children:[`Last run: `,oe(x.lastTriggered,l),x.lastDispatchResult?` (${x.lastDispatchResult})`:``]})]}),x.description&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-meta`,children:(0,R.jsx)(`span`,{children:`Description`})}),(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-row-top routine-prose`,children:(0,R.jsx)(`span`,{children:x.description})})]}),k?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`div`,{className:`cal-modal-row`,children:[(0,R.jsx)(h,{channel:x.agentChannel,size:14}),(0,R.jsxs)(`span`,{children:[f[x.agentChannel]??x.agentChannel,` to `,x.agentDestination??`—`]})]}),(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-meta`,children:(0,R.jsx)(`span`,{children:`Instruction sent to the agent`})}),(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-row-top routine-prose`,children:(0,R.jsx)(`span`,{children:x.agentPrompt??`No instruction sent to the agent.`})})]}):x.actionPlugin?(0,R.jsxs)(`div`,{className:`cal-modal-row`,children:[(0,R.jsx)(C,{size:14}),(0,R.jsxs)(`span`,{children:[x.actionPlugin,`.`,x.actionTool,x.actionArgs?` ${x.actionArgs}`:``]})]}):(0,R.jsxs)(`div`,{className:`cal-modal-row`,children:[(0,R.jsx)(S,{size:14}),(0,R.jsx)(`span`,{children:`Scheduled trigger (no dispatch)`})]}),J.length===0?(0,R.jsxs)(`div`,{className:`cal-modal-row cal-modal-meta`,children:[(0,R.jsx)(T,{size:14}),(0,R.jsx)(`span`,{children:`No history recorded.`})]}):(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`div`,{className:`cal-modal-row cal-modal-meta`,children:[(0,R.jsx)(T,{size:14}),(0,R.jsxs)(`span`,{children:[`History (`,J.length,` `,J.length===1?`entry`:`entries`,`)`]})]}),(0,R.jsx)(`div`,{className:`routine-history`,children:J.map((e,t)=>(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-meta`,children:e},t))})]})]}),u&&(0,R.jsxs)(`div`,{className:`cal-modal-body`,children:[q&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`label`,{className:`cal-modal-field`,children:[(0,R.jsx)(`span`,{children:`Send to`}),(0,R.jsxs)(`div`,{className:`cal-modal-field-inline`,children:[(0,R.jsxs)(`select`,{value:V,disabled:m,onChange:e=>{H(e.target.value),W(``)},children:[(0,R.jsx)(`option`,{value:``,children:`None (no dispatch)`}),(0,R.jsx)(`option`,{value:`whatsapp`,children:`WhatsApp`}),(0,R.jsx)(`option`,{value:`telegram`,children:`Telegram`})]}),V!==``&&(0,R.jsx)(h,{channel:V,size:16})]})]}),V!==``&&(0,R.jsxs)(`label`,{className:`cal-modal-field`,children:[(0,R.jsx)(`span`,{children:`Destination`}),(0,R.jsxs)(`select`,{value:U,disabled:m||G===null,onChange:e=>W(e.target.value),children:[(0,R.jsx)(`option`,{value:``,children:G===null?`Loading destinations`:Y.length===0?`No registered destinations`:`Choose a destination`}),U!==``&&!Y.some(e=>e.destination===U)&&(0,R.jsxs)(`option`,{value:U,children:[U,` (not in the current list)`]}),Y.map(e=>(0,R.jsx)(`option`,{value:e.destination,children:re(e)},e.destination))]})]}),ie&&(0,R.jsxs)(`div`,{className:`cal-modal-error`,children:[`Could not load destinations: `,ie]})]}),(0,R.jsxs)(`label`,{className:`cal-modal-field`,children:[(0,R.jsx)(`span`,{children:`Description`}),(0,R.jsx)(`input`,{type:`text`,value:I,onChange:e=>L(e.target.value),disabled:m,placeholder:`One line: what this routine is for`})]}),(k||X)&&(0,R.jsxs)(`label`,{className:`cal-modal-field`,children:[(0,R.jsx)(`span`,{children:`Instruction sent to the agent`}),(0,R.jsx)(`textarea`,{className:`cal-modal-textarea`,value:P,onChange:e=>F(e.target.value),disabled:m,rows:16,placeholder:`What should the agent do when this routine fires?`})]}),(0,R.jsx)(ne,{recurrence:x.recurrence,onChange:B,disabled:m})]}),_&&(0,R.jsx)(`div`,{className:`cal-modal-error`,children:_}),(0,R.jsxs)(`div`,{className:`cal-modal-actions`,children:[!u&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`button`,{type:`button`,className:`cal-modal-btn`,onClick:()=>{O(!1),N(!1),d(!0)},disabled:m,children:[(0,R.jsx)(r,{size:14}),` Edit`]}),(0,R.jsxs)(`button`,{type:`button`,className:`cal-modal-btn`,onClick:()=>c(x),disabled:m,children:[(0,R.jsx)(T,{size:14}),` Runs`]}),(0,R.jsxs)(`button`,{type:`button`,className:`cal-modal-btn`,onClick:ue,disabled:m,children:[m&&j?(0,R.jsx)(o,{size:14,className:`spin`}):A?(0,R.jsx)(te,{size:14}):(0,R.jsx)(ee,{size:14}),j?A?`Confirm resume`:`Confirm suspend`:A?`Resume`:`Suspend`]}),j&&(0,R.jsx)(`span`,{className:`cal-modal-confirm-text`,children:A?`This routine will run at its next scheduled time. It will not run for the times it missed.`:`This routine stops running until you resume it. Nothing is deleted.`}),(0,R.jsxs)(`button`,{type:`button`,className:`cal-modal-btn cal-modal-btn-danger`,onClick:de,disabled:m,children:[m&&E?(0,R.jsx)(o,{size:14,className:`spin`}):(0,R.jsx)(i,{size:14}),E?`Confirm delete`:`Delete`]})]}),u&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`button`,{type:`button`,className:`cal-modal-btn cal-modal-btn-primary`,onClick:le,disabled:m||Z,children:[m?(0,R.jsx)(o,{size:14,className:`spin`}):null,` Save`]}),(0,R.jsx)(`button`,{type:`button`,className:`cal-modal-btn`,onClick:()=>{d(!1),y(null)},disabled:m,children:`Cancel`})]})]})]})})}function q(e,t){if(!e)return`—`;let n=Date.parse(e);return Number.isFinite(n)?l(new Date(n).toISOString(),t):e}function J(e){return e===null?`—`:e<1e3?`${e} ms`:`${(e/1e3).toFixed(1)} s`}function Y({run:e,routineName:t,onClose:n}){let{zone:r}=v();return(0,D.useEffect)(()=>{let e=e=>{e.key===`Escape`&&n()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[n]),(0,R.jsx)(`div`,{className:`cal-modal-overlay`,onClick:n,children:(0,R.jsxs)(`div`,{className:`cal-modal cal-modal-wide`,role:`dialog`,"aria-modal":`true`,"aria-label":`Run detail`,onClick:e=>e.stopPropagation(),children:[(0,R.jsxs)(`div`,{className:`cal-modal-header`,children:[(0,R.jsx)(`span`,{className:`cal-modal-kind`,children:`Run`}),(0,R.jsx)(`button`,{type:`button`,className:`cal-modal-close`,onClick:n,"aria-label":`Close`,autoFocus:!0,children:(0,R.jsx)(p,{size:16})})]}),(0,R.jsxs)(`div`,{className:`cal-modal-body`,children:[(0,R.jsx)(`div`,{className:`cal-modal-title`,children:t??`Untitled routine`}),e.outputExcerpt!==null&&(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-row-top routine-prose`,"data-testid":`run-output`,children:(0,R.jsx)(`span`,{children:e.outputExcerpt})}),e.outputExcerpt===null&&e.status===`finished`&&(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-meta`,"data-testid":`run-output-none`,children:(0,R.jsx)(`span`,{children:`This run finished without sending anything.`})}),(0,R.jsx)(`div`,{className:`cal-modal-row`,children:(0,R.jsx)(`span`,{children:e.status})}),(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-meta`,children:(0,R.jsxs)(`span`,{children:[`Due: `,q(e.scheduledFor,r)]})}),(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-meta`,children:(0,R.jsxs)(`span`,{children:[`Started: `,q(e.startedAt,r)]})}),(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-meta`,children:(0,R.jsxs)(`span`,{children:[`Dispatch ended: `,q(e.endedAt,r),` (`,J(e.ranMs),`)`]})}),(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-meta`,children:(0,R.jsxs)(`span`,{children:[`Output seen: `,q(e.finishedAt,r)]})}),(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-meta`,children:(0,R.jsxs)(`span`,{children:[`Sent to: `,e.target,` · `,e.mode,` · `,e.kind]})}),(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-meta`,children:(0,R.jsxs)(`span`,{children:[`Transport: `,e.dispatchResult??`—`,e.httpStatus===null?``:` (HTTP ${e.httpStatus})`]})}),e.error&&(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-row-top routine-prose`,children:(0,R.jsx)(`span`,{children:e.error})}),(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-meta`,children:(0,R.jsxs)(`span`,{children:[`Conversation: `,e.sessionKey??`—`,e.transcriptOffset===null?``:` at byte ${e.transcriptOffset}`]})}),!e.bounded&&(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-meta`,children:(0,R.jsx)(`span`,{children:`This run shares its conversation with other traffic, so what it produced cannot be separated out. Its status stays at whatever the dispatch reported.`})}),(0,R.jsx)(`div`,{className:`cal-modal-row cal-modal-meta`,children:(0,R.jsxs)(`span`,{children:[`Run `,e.runId]})})]})]})})}function X({status:e}){let t=ie(e);return(0,R.jsx)(`span`,{className:`routine-status-dot is-${t}`,"data-state":t,"aria-hidden":`true`})}var Z=500;function Q(e,t){if(!e)return`—`;let n=Date.parse(e);return Number.isFinite(n)?l(new Date(n).toISOString(),t):e}function le(e){return e===null?`—`:e<1e3?`${e} ms`:`${(e/1e3).toFixed(1)} s`}var ue={channel:`a channel`,destination:`a destination`,prompt:`an instruction`};function de(e){if(e===`no-dispatch-configured`)return`This routine has no dispatch set up, so there was nothing to do.`;if(e===`no-action-plugin`)return`The tool action names no plugin, so nothing ran.`;if(e===`no-action-tool`)return`The tool action names no tool, so nothing ran.`;let t=e.startsWith(`no-`)?e.slice(3).split(`+`):[];if(t.length>0&&t.every(e=>e in ue)){let e=t.map(e=>ue[e]);return`This routine has no ${(e.length===1?e[0]:`${e.slice(0,-1).join(`, `)} and ${e[e.length-1]}`).replace(/^an? /,``)} set, so nothing was sent.`}return e}function fe(e){return e.status===`no-destination`?e.error?de(e.error):`Nothing was dispatched, and no reason was recorded.`:e.status===`failed`?e.error??e.dispatchResult??`The dispatch failed.`:e.status===`open`?`Opened and never closed. The dispatch did not report back.`:null}function pe(e){let t=e.indexOf(`:`);return t<=0?{channel:null,destination:e}:{channel:e.slice(0,t),destination:e.slice(t+1)}}function me(e){return e.outputExcerpt===null?e.status===`finished`?`Finished and sent nothing.`:null:e.outputExcerpt}function he({routine:e,adminFetch:r,cacheKey:i,from:a=`card`,onBack:c}){let{zone:l}=v(),[u,d]=(0,D.useState)([]),[p,m]=(0,D.useState)(!0),[g,_]=(0,D.useState)(null),[y,b]=(0,D.useState)(null),x=(0,D.useRef)(0),S=(0,D.useCallback)(()=>{let t=!1,n=++x.current,i=()=>t||n!==x.current;return m(!0),_(null),r(`/api/admin/routines/${encodeURIComponent(e.eventId)}/runs?limit=${Z}&from=${a}`).then(async e=>{if(i())return;if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();i()||d(Array.isArray(t.runs)?t.runs:[])}).catch(e=>{i()||(_(e instanceof Error?e.message:`Failed to load`),d([]))}).finally(()=>{i()||m(!1)}),()=>{t=!0}},[r,e.eventId,a]);(0,D.useEffect)(()=>S(),[S]);let C=(0,D.useCallback)(()=>{w(i,e.eventId)},[i,e.eventId]);return(0,R.jsxs)(`div`,{className:`cal-page`,children:[(0,R.jsx)(`header`,{className:`cal-header`,children:(0,R.jsxs)(`div`,{className:`cal-nav`,children:[(0,R.jsxs)(`button`,{type:`button`,className:`cal-modal-btn`,onClick:c,children:[(0,R.jsx)(s,{size:14}),` Routines`]}),(0,R.jsx)(`span`,{className:`cal-range-label runs-title`,"data-testid":`runs-title`,title:e.name??`Untitled routine`,children:e.name??`Untitled routine`}),(0,R.jsxs)(`button`,{type:`button`,className:`cal-modal-btn`,"data-testid":`runs-refresh`,onClick:S,disabled:p,title:`Refresh runs`,"aria-label":`Refresh runs`,children:[p?(0,R.jsx)(o,{size:14,className:`spin`}):(0,R.jsx)(t,{size:14}),` Refresh`]}),u.length>0&&(0,R.jsx)(`div`,{className:`routine-bulk-actions`,children:(0,R.jsxs)(`button`,{type:`button`,className:`cal-modal-btn`,onClick:C,children:[(0,R.jsx)(n,{size:14}),` Download all runs`]})})]})}),(0,R.jsxs)(`div`,{className:`cal-body`,children:[g&&(0,R.jsxs)(`div`,{className:`cal-error`,children:[`Could not load runs: `,g]}),!g&&!p&&u.length===0&&(0,R.jsxs)(`div`,{className:`cal-empty`,"data-testid":`runs-empty`,children:[(0,R.jsx)(`p`,{children:`Nothing to show for this routine.`}),(0,R.jsx)(`p`,{children:`That means one of three things, and this page cannot tell them apart: it has never run, it ran but no record was written, or every run it did have is older than the 30 days records are kept for.`}),(0,R.jsxs)(`p`,{children:[`For a repeating routine, the server log settles the middle one: a`,(0,R.jsx)(`code`,{children:` fires-without-records `}),` count above zero names a routine that fired and left no record. It does not distinguish the other two, and it does not cover a one-time routine.`]})]}),u.length>=Z&&(0,R.jsxs)(`div`,{className:`cal-modal-confirm-text`,"data-testid":`runs-capped`,children:[`Showing the most recent `,Z,` runs. There may be more; the download has everything still on record.`]}),(0,R.jsx)(`div`,{className:`routine-list`,children:u.map(e=>{let t=fe(e),n=me(e),{channel:r,destination:i}=pe(e.target);return(0,R.jsxs)(`button`,{type:`button`,className:`admin-card admin-card--padded routine-card`,"data-testid":`run-row-${e.runId}`,onClick:()=>b(e),children:[(0,R.jsxs)(`span`,{className:`admin-card-title routine-card-title run-card-title`,children:[(0,R.jsx)(X,{status:e.status}),` `,e.status]}),(0,R.jsx)(`span`,{className:`routine-card-sched`,children:le(e.ranMs)}),(0,R.jsx)(`span`,{className:`routine-card-target`,children:r?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(h,{channel:r,size:13}),` `,f[r]??r,` to `,r===`whatsapp`?U(i):i]}):i}),(0,R.jsxs)(`span`,{className:`routine-card-meta`,children:[`Due `,Q(e.scheduledFor,l)]}),n&&(0,R.jsx)(`span`,{className:`routine-card-meta run-card-output`,children:n}),t&&(0,R.jsx)(`span`,{className:`routine-card-meta run-card-detail`,children:t})]},e.runId)})})]}),y&&(0,R.jsx)(Y,{run:y,routineName:e.name,onClose:()=>b(null)})]})}var $=`maxy-admin-session-key`;function ge(e){return e?M(e):`One-time`}function _e(e,t){if(!e)return`—`;let n=Date.parse(e);return Number.isFinite(n)?l(new Date(n).toISOString(),t):e}function ve(){let[e,t]=(0,D.useState)(null),[n,r]=(0,D.useState)(!1),[i,o]=(0,D.useState)(void 0),[s,c]=(0,D.useState)(null),[l,u]=(0,D.useState)(void 0),[d,f]=(0,D.useState)(null),[p,h]=(0,D.useState)(null);(0,D.useEffect)(()=>{let e=!1,n=null;try{n=sessionStorage.getItem($)}catch{}if(!n){r(!0);return}return fetch(`/api/admin/session?session_key=${encodeURIComponent(n)}`).then(async i=>{if(!e){if(i.status===401){try{sessionStorage.removeItem($)}catch{}window.location.href=`/`;return}if(i.ok)try{let e=await i.json();typeof e.businessName==`string`&&o(e.businessName),e.sessionId!==void 0&&c(e.sessionId??null),h(e.role??null),u(e.userName===void 0?null:e.userName),f(e.avatar??null)}catch{}t(n),r(!0)}}).catch(()=>{e||(t(n),r(!0))}),()=>{e=!0}},[]);let g=(0,D.useCallback)(()=>{try{sessionStorage.removeItem($)}catch{}window.location.href=`/`},[]),[_,v]=(0,D.useState)(!1),b=(0,D.useCallback)(async()=>{v(!0);try{let e=await y();if(e){try{sessionStorage.removeItem($)}catch{}window.location.href=`/`}return e}finally{v(!1)}},[]);return n?e?(0,R.jsx)(m,{cacheKey:e,surface:`routines`,onSessionExpired:({code:e,path:t})=>{console.warn(`[admin-auth] outcome=session-expired-redirect code=${e} path=${t} surface=routines`);try{sessionStorage.removeItem($)}catch{}window.location.href=`/`},children:(0,R.jsx)(x,{cacheKey:e,businessName:i,sessionId:s,onLogout:g,onDisconnect:b,disconnecting:_,userName:l,userAvatar:d,role:p,children:(0,R.jsx)(ye,{cacheKey:e})})}):(0,R.jsx)(`div`,{className:`cal-page`,children:(0,R.jsxs)(`div`,{className:`cal-empty`,children:[(0,R.jsx)(`p`,{children:`You are not signed in.`}),(0,R.jsxs)(`p`,{children:[`Open the `,(0,R.jsx)(`a`,{href:`/`,className:`cal-link`,children:`main admin page`}),` and log in, then return here.`]})]})}):(0,R.jsx)(a,{surface:`gate`})}function ye({cacheKey:e}){let{zone:n}=v(),{adminFetch:r,cacheKey:i,sessionRefetchNonce:s}=u({initialCacheKey:e,surface:`routines`}),[c,l]=(0,D.useState)([]),[d,p]=(0,D.useState)(!1),[m,g]=(0,D.useState)(!1),[_,y]=(0,D.useState)(null),[x,w]=(0,D.useState)(null),[E,O]=(0,D.useState)(null),[k,A]=(0,D.useState)(`card`),j=(0,D.useCallback)(()=>{let e=!1;return p(!0),y(null),r(`/api/admin/routines`).then(async t=>{if(e)return;if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();l(Array.isArray(n.routines)?n.routines:[])}).catch(t=>{e||(y(t instanceof Error?t.message:`Failed to load`),l([]))}).finally(()=>{e||(p(!1),g(!0))}),()=>{e=!0}},[r]);(0,D.useEffect)(()=>j(),[j,s]);let M=(0,D.useCallback)(e=>{l(t=>t.map(t=>t.eventId===e.eventId?e:t)),w(e)},[]),N=(0,D.useCallback)(e=>{l(t=>t.filter(t=>t.eventId!==e)),w(null)},[]),[P,F]=(0,D.useState)(!1),[I,L]=(0,D.useState)(null),z=c.filter(e=>e.eventStatus===`scheduled`).length,B=c.filter(e=>e.suspendedInBulk).length,V=(0,D.useCallback)(async e=>{F(!0),L(null);try{let t=await r(`/api/admin/routines/${e}`,{method:`POST`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??`HTTP ${t.status}`)}let n=await t.json(),i=n.refused?.length??0;L(e===`suspend-all`?`Suspended ${n.suspended??0}. Nothing runs on its own until you resume it.`:`Resumed ${n.restored??0}${i>0?`. ${i} could not be resumed and stayed suspended`:``}. Routines you suspended one at a time are still suspended.`),j()}catch(e){L(e instanceof Error?e.message:`Failed`)}finally{F(!1)}},[r,j]);return m?E?(0,R.jsx)(he,{routine:E,adminFetch:r,cacheKey:i,from:k,onBack:()=>O(null)}):(0,R.jsxs)(`div`,{className:`cal-page`,children:[(0,R.jsx)(`header`,{className:`cal-header`,children:(0,R.jsxs)(`div`,{className:`cal-nav`,children:[(0,R.jsxs)(`span`,{className:`cal-range-label`,children:[(0,R.jsx)(b,{size:16}),` Routines`]}),(0,R.jsxs)(`div`,{className:`routine-bulk-actions`,children:[(0,R.jsxs)(`button`,{type:`button`,className:`cal-modal-btn`,"data-testid":`routines-refresh`,onClick:j,disabled:d,title:`Refresh routines`,"aria-label":`Refresh routines`,children:[d?(0,R.jsx)(o,{size:14,className:`spin`}):(0,R.jsx)(t,{size:14}),` Refresh`]}),(0,R.jsxs)(`button`,{type:`button`,className:`cal-modal-btn`,onClick:()=>V(`suspend-all`),disabled:P||z===0,children:[(0,R.jsx)(ee,{size:14}),` Suspend all (`,z,`)`]}),(0,R.jsxs)(`button`,{type:`button`,className:`cal-modal-btn`,onClick:()=>V(`resume-all`),disabled:P||B===0,children:[(0,R.jsx)(te,{size:14}),` Resume all (`,B,`)`]})]})]})}),(0,R.jsxs)(`div`,{className:`cal-body`,children:[I&&(0,R.jsx)(`div`,{className:`cal-modal-confirm-text`,children:I}),_&&(0,R.jsxs)(`div`,{className:`cal-error`,children:[`Could not load routines: `,_]}),!_&&!d&&c.length===0&&(0,R.jsx)(`div`,{className:`cal-empty`,children:(0,R.jsx)(`p`,{children:`No routines yet.`})}),(0,R.jsx)(`div`,{className:`routine-list`,children:c.map(e=>(0,R.jsxs)(`div`,{className:`admin-card admin-card--padded routine-card-shell`,children:[(0,R.jsxs)(`div`,{role:`button`,tabIndex:0,className:`routine-card`,"data-testid":`routine-card-${e.eventId}`,onClick:()=>w(e),onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),w(e))},children:[(0,R.jsx)(`span`,{className:`admin-card-title routine-card-title`,children:e.name??`Untitled routine`}),e.description&&(0,R.jsx)(`span`,{className:`routine-card-desc`,children:e.description}),(0,R.jsxs)(`span`,{className:`routine-card-sched`,children:[(0,R.jsx)(S,{size:13}),` `,ge(e.recurrence)]}),(0,R.jsx)(`span`,{className:`routine-card-target`,children:e.agentChannel?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(h,{channel:e.agentChannel,size:13}),` `,f[e.agentChannel]??e.agentChannel,` to `,e.agentDestination??`—`]}):e.actionPlugin?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(C,{size:13}),` `,e.actionPlugin,`.`,e.actionTool]}):(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(S,{size:13}),` Scheduled trigger`]})}),(0,R.jsxs)(`span`,{className:`routine-card-meta`,children:[(0,R.jsx)(ae,{eventStatus:e.eventStatus}),`Next: `,_e(e.nextRun,n),` · `,e.eventStatus??`unknown`]})]}),(0,R.jsx)(`button`,{type:`button`,className:`routine-card-runs`,"data-testid":`routine-runs-${e.eventId}`,title:`View runs`,"aria-label":`View runs for ${e.name??`this routine`}`,onClick:()=>{A(`card`),O(e)},children:(0,R.jsx)(T,{size:14})})]},e.eventId))})]}),x&&(0,R.jsx)(ce,{routine:x,adminFetch:r,onClose:()=>w(null),onSaved:M,onDeleted:N,onViewRuns:e=>{A(`modal`),w(null),O(e)}})]}):(0,R.jsx)(a,{surface:`gate`})}(0,E.createRoot)(document.getElementById(`root`)).render((0,R.jsx)(ve,{}));
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
/package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js → useMediaQuery-Baf4Huvv.js}
RENAMED
|
File without changes
|
/package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js.br → useMediaQuery-Baf4Huvv.js.br}
RENAMED
|
File without changes
|
/package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js.gz → useMediaQuery-Baf4Huvv.js.gz}
RENAMED
|
File without changes
|