@rubytech/create-maxy-code 0.1.546 → 0.1.548
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/dist/index.js +14 -0
- package/package.json +1 -1
- package/payload/platform/lib/routine-templates/dist/index.d.ts +22 -16
- package/payload/platform/lib/routine-templates/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/routine-templates/dist/index.js +15 -10
- package/payload/platform/lib/routine-templates/dist/index.js.map +1 -1
- package/payload/platform/lib/routine-templates/dist/roster.d.ts +3 -3
- package/payload/platform/lib/routine-templates/dist/roster.d.ts.map +1 -1
- package/payload/platform/lib/routine-templates/src/__tests__/seed.test.ts +15 -11
- package/payload/platform/lib/routine-templates/src/index.ts +23 -17
- package/payload/platform/lib/routine-templates/src/roster.ts +3 -3
- package/payload/platform/plugins/admin/mcp/dist/index.js +32 -16
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/tools/account-default-agent.d.ts +16 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/account-default-agent.d.ts.map +1 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/account-default-agent.js +21 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/account-default-agent.js.map +1 -0
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +78 -33
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +11 -0
- package/payload/platform/plugins/docs/references/admin-ui.md +63 -8
- package/payload/platform/plugins/docs/references/channel-wake-and-prompt.md +14 -24
- package/payload/platform/plugins/scheduling/PLUGIN.md +6 -0
- package/payload/platform/plugins/scheduling/mcp/dist/index.js +6 -2
- package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/routine-run.test.js +109 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/routine-run.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js +54 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.d.ts +31 -0
- 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 +116 -2
- package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.d.ts +17 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.js +43 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-routine-description.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-routine-description.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-routine-description.test.js +87 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-routine-description.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/description-coverage.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/description-coverage.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/description-coverage.test.js +123 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/description-coverage.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts +36 -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 +89 -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 +13 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-routine-description.d.ts +35 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-routine-description.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-routine-description.js +56 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-routine-description.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.js +3 -2
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-summary.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-summary.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-summary.test.js +80 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-summary.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts +2 -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 +19 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
- package/payload/platform/plugins/telegram/PLUGIN.md +2 -0
- package/payload/platform/plugins/telegram/mcp/dist/index.js +47 -47
- package/payload/platform/plugins/telegram/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/lib/secret-path.d.ts +16 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/secret-path.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/secret-path.js +50 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/secret-path.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/webhook-url.d.ts +8 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/webhook-url.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/webhook-url.js +12 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/webhook-url.js.map +1 -0
- package/payload/platform/plugins/telegram/references/setup-guide.md +2 -0
- package/payload/platform/plugins/telegram/skills/configure/SKILL.md +6 -1
- package/payload/platform/plugins/whatsapp/PLUGIN.md +0 -6
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js +2 -34
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
- 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 +0 -1
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
- package/payload/platform/services/telegram-channel/dist/notification.d.ts +8 -3
- package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
- package/payload/platform/services/telegram-channel/dist/notification.js +10 -3
- package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
- package/payload/platform/services/telegram-channel/dist/server.js +1 -1
- package/payload/platform/services/telegram-channel/dist/server.js.map +1 -1
- package/payload/platform/services/telegram-channel/dist/turn-follow.d.ts +28 -0
- package/payload/platform/services/telegram-channel/dist/turn-follow.d.ts.map +1 -1
- package/payload/platform/services/telegram-channel/dist/turn-follow.js +33 -1
- package/payload/platform/services/telegram-channel/dist/turn-follow.js.map +1 -1
- package/payload/platform/services/webchat-channel/dist/notification.d.ts +8 -3
- package/payload/platform/services/webchat-channel/dist/notification.d.ts.map +1 -1
- package/payload/platform/services/webchat-channel/dist/notification.js +10 -3
- package/payload/platform/services/webchat-channel/dist/notification.js.map +1 -1
- package/payload/platform/services/webchat-channel/dist/server.js +1 -1
- package/payload/platform/services/webchat-channel/dist/server.js.map +1 -1
- package/payload/platform/services/webchat-channel/dist/turn-follow.d.ts +28 -0
- package/payload/platform/services/webchat-channel/dist/turn-follow.d.ts.map +1 -1
- package/payload/platform/services/webchat-channel/dist/turn-follow.js +33 -1
- package/payload/platform/services/webchat-channel/dist/turn-follow.js.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +42 -20
- package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/notification.js +44 -27
- package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/server.js +13 -5
- package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/targets.d.ts +6 -4
- package/payload/platform/services/whatsapp-channel/dist/targets.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/targets.js +17 -6
- package/payload/platform/services/whatsapp-channel/dist/targets.js.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/turn-follow.d.ts +28 -0
- package/payload/platform/services/whatsapp-channel/dist/turn-follow.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/turn-follow.js +34 -1
- package/payload/platform/services/whatsapp-channel/dist/turn-follow.js.map +1 -1
- package/payload/server/{chunk-CVUSUNXM.js → chunk-G6ULACHG.js} +2 -4
- package/payload/server/{chunk-X2RRMHVV.js → chunk-JOVREC6E.js} +117 -1
- package/payload/server/{chunk-DU7GPDJJ.js → chunk-SKYZG6OT.js} +15 -0
- package/payload/server/{manager-TI2YJQVZ.js → manager-2VEJKVEO.js} +2 -2
- package/payload/server/maxy-edge.js +2 -2
- package/payload/server/public/activity.html +5 -5
- package/payload/server/public/agents.html +4 -4
- package/payload/server/public/assets/{AdminLoginScreens-BGKtDqAk.js → AdminLoginScreens-Bjcs9ta9.js} +1 -1
- 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-DnfgsAQl.js → AdminShell-DVBAMUCy.js} +1 -1
- package/payload/server/public/assets/AdminShell-DVBAMUCy.js.br +0 -0
- package/payload/server/public/assets/{AdminShell-DnfgsAQl.js.gz → AdminShell-DVBAMUCy.js.gz} +0 -0
- package/payload/server/public/assets/{activity-ByJSut0Q.js → activity-C8E8-EwQ.js} +1 -1
- 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-CkeJO6kA.js → admin-CeWAlpRS.js} +1 -1
- 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-D8phtRX5.js → agents-DuN92iFb.js} +1 -1
- 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-DQSTjdom.js → browser-BxebdKbh.js} +1 -1
- 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-DFJu1XjP.js → calendar-BtFZQ5Np.js} +1 -1
- 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 +1 -0
- package/payload/server/public/assets/chat-CGIwynaH.js.br +3 -0
- package/payload/server/public/assets/chat-CGIwynaH.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-DaNP1zDb.js +1 -0
- package/payload/server/public/assets/chevron-left-DaNP1zDb.js.br +0 -0
- package/payload/server/public/assets/chevron-right-BbbuTUnt.js +1 -0
- package/payload/server/public/assets/chevron-right-BbbuTUnt.js.br +0 -0
- package/payload/server/public/assets/clock-CfDdatjp.js +1 -0
- 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-lFFhXRGk.js → copy-DCDHXq3O.js} +1 -1
- 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 +1 -0
- package/payload/server/public/assets/data-BchSWOju.js.br +1 -0
- package/payload/server/public/assets/data-BchSWOju.js.gz +0 -0
- package/payload/server/public/assets/{file-text-D2Y-bkNy.js → file-text-zQgEQWCF.js} +1 -1
- 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-C-3yN6JD.js → graph-CFCEh_YI.js} +1 -1
- 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-DiaPLP27.js → graph-labels-CA1UcDuS.js} +1 -1
- 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-KuGPvSa9.js → operator-hFXPDc2X.js} +1 -1
- 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-BhGeFXWA.js → page-C8jyPH_3.js} +1 -1
- 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-EnbVC-yM.js → page-ne7I_r9L.js} +1 -1
- 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 +1 -0
- 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-CdSgMNC7.js → public-BgnqjAal.js} +1 -1
- 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-rTRuTqei.js → rotate-ccw-DfJWjXAg.js} +1 -1
- 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 +2 -0
- 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-DFWtZNkW.js → skills-D-6EbgfP.js} +1 -1
- 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-B94AuKSy.js → tasks-DnN5Fyds.js} +1 -1
- 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-DtWUg6jR.js → triangle-alert-eh9UOKDT.js} +1 -1
- 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-CjKYO-Qf.js → useCopyFeedback-Bz9OJHBb.js} +1 -1
- 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-DlOWP56H.css → useMediaQuery-CNxsjKZp.css} +1 -1
- package/payload/server/public/assets/useMediaQuery-CNxsjKZp.css.br +0 -0
- package/payload/server/public/assets/{useMediaQuery-DlOWP56H.css.gz → useMediaQuery-CNxsjKZp.css.gz} +0 -0
- package/payload/server/public/assets/{useVoiceRecorder-BKFAYuzz.js → useVoiceRecorder-BaDpMYxX.js} +1 -1
- 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-Ct4kf-uv.js → wrench-BO-l46rF.js} +1 -1
- 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/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 +330 -520
- package/payload/server/public/assets/AdminLoginScreens-BGKtDqAk.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-BGKtDqAk.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-DnfgsAQl.js.br +0 -0
- package/payload/server/public/assets/activity-ByJSut0Q.js.br +0 -0
- package/payload/server/public/assets/activity-ByJSut0Q.js.gz +0 -0
- package/payload/server/public/assets/admin-CkeJO6kA.js.br +0 -0
- package/payload/server/public/assets/admin-CkeJO6kA.js.gz +0 -0
- package/payload/server/public/assets/agents-D8phtRX5.js.br +0 -0
- package/payload/server/public/assets/agents-D8phtRX5.js.gz +0 -0
- package/payload/server/public/assets/browser-DQSTjdom.js.br +0 -0
- package/payload/server/public/assets/browser-DQSTjdom.js.gz +0 -0
- package/payload/server/public/assets/calendar-DFJu1XjP.js.br +0 -0
- package/payload/server/public/assets/calendar-DFJu1XjP.js.gz +0 -0
- package/payload/server/public/assets/chat-DUqtIsOt.js +0 -1
- package/payload/server/public/assets/chat-DUqtIsOt.js.br +0 -0
- package/payload/server/public/assets/chat-DUqtIsOt.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-DFK18xVX.js +0 -1
- package/payload/server/public/assets/chevron-left-DFK18xVX.js.br +0 -0
- package/payload/server/public/assets/chevron-right-DJ4oaHoN.js +0 -1
- package/payload/server/public/assets/chevron-right-DJ4oaHoN.js.br +0 -0
- package/payload/server/public/assets/clock-wHIan2DW.js +0 -1
- package/payload/server/public/assets/clock-wHIan2DW.js.br +0 -0
- package/payload/server/public/assets/copy-lFFhXRGk.js.br +0 -0
- package/payload/server/public/assets/copy-lFFhXRGk.js.gz +0 -0
- package/payload/server/public/assets/data-Cxv97ARy.js +0 -1
- package/payload/server/public/assets/data-Cxv97ARy.js.br +0 -0
- package/payload/server/public/assets/data-Cxv97ARy.js.gz +0 -0
- package/payload/server/public/assets/file-text-D2Y-bkNy.js.br +0 -0
- package/payload/server/public/assets/file-text-D2Y-bkNy.js.gz +0 -0
- package/payload/server/public/assets/graph-C-3yN6JD.js.br +0 -0
- package/payload/server/public/assets/graph-C-3yN6JD.js.gz +0 -0
- package/payload/server/public/assets/graph-labels-DiaPLP27.js.br +0 -0
- package/payload/server/public/assets/graph-labels-DiaPLP27.js.gz +0 -0
- package/payload/server/public/assets/operator-KuGPvSa9.js.br +0 -0
- package/payload/server/public/assets/operator-KuGPvSa9.js.gz +0 -0
- package/payload/server/public/assets/page-BhGeFXWA.js.br +0 -0
- package/payload/server/public/assets/page-BhGeFXWA.js.gz +0 -0
- package/payload/server/public/assets/page-EnbVC-yM.js.br +0 -0
- package/payload/server/public/assets/page-EnbVC-yM.js.gz +0 -0
- package/payload/server/public/assets/play-jZFZAG-t.js +0 -1
- package/payload/server/public/assets/play-jZFZAG-t.js.br +0 -0
- package/payload/server/public/assets/play-jZFZAG-t.js.gz +0 -0
- package/payload/server/public/assets/public-CdSgMNC7.js.br +0 -0
- package/payload/server/public/assets/public-CdSgMNC7.js.gz +0 -0
- package/payload/server/public/assets/rotate-ccw-rTRuTqei.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-rTRuTqei.js.gz +0 -0
- package/payload/server/public/assets/routines-DNRxNRSQ.js +0 -2
- package/payload/server/public/assets/routines-DNRxNRSQ.js.br +0 -0
- package/payload/server/public/assets/routines-DNRxNRSQ.js.gz +0 -0
- package/payload/server/public/assets/skills-DFWtZNkW.js.br +0 -0
- package/payload/server/public/assets/skills-DFWtZNkW.js.gz +0 -0
- package/payload/server/public/assets/tasks-B94AuKSy.js.br +0 -0
- package/payload/server/public/assets/tasks-B94AuKSy.js.gz +0 -0
- package/payload/server/public/assets/triangle-alert-DtWUg6jR.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-DtWUg6jR.js.gz +0 -0
- package/payload/server/public/assets/useCopyFeedback-CjKYO-Qf.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-CjKYO-Qf.js.gz +0 -0
- package/payload/server/public/assets/useMediaQuery-DlOWP56H.css.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BKFAYuzz.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BKFAYuzz.js.gz +0 -0
- package/payload/server/public/assets/wrench-Ct4kf-uv.js.br +0 -0
- package/payload/server/public/assets/wrench-Ct4kf-uv.js.gz +0 -0
- /package/payload/server/public/assets/{useMediaQuery-BYIHo-xL.js → useMediaQuery-_mMln3Fu.js} +0 -0
- /package/payload/server/public/assets/{useMediaQuery-BYIHo-xL.js.br → useMediaQuery-_mMln3Fu.js.br} +0 -0
- /package/payload/server/public/assets/{useMediaQuery-BYIHo-xL.js.gz → useMediaQuery-_mMln3Fu.js.gz} +0 -0
package/dist/index.js
CHANGED
|
@@ -3405,6 +3405,20 @@ function setupAccount() {
|
|
|
3405
3405
|
env: { ...neo4jEnv, PLATFORM_ROOT: join(INSTALL_DIR, "platform") },
|
|
3406
3406
|
});
|
|
3407
3407
|
}
|
|
3408
|
+
// Task 2361 — collapse the two routine description properties onto
|
|
3409
|
+
// `:Event.description`, preferring whichever value the operator or the agent
|
|
3410
|
+
// wrote. Runs after the seed for the same reasons the convergence above does:
|
|
3411
|
+
// the schema exists by then, and the same Neo4j env is already built. Scoped to
|
|
3412
|
+
// this install's accounts via PLATFORM_ROOT, so a co-resident brand sharing one
|
|
3413
|
+
// Neo4j is untouched. Idempotent: a converged install matches nothing and
|
|
3414
|
+
// prints converged=0.
|
|
3415
|
+
const convergeRoutineDescription = join(INSTALL_DIR, "platform/plugins/scheduling/mcp/dist/scripts/converge-routine-description.js");
|
|
3416
|
+
if (existsSync(convergeRoutineDescription)) {
|
|
3417
|
+
shell("node", [convergeRoutineDescription], {
|
|
3418
|
+
cwd: INSTALL_DIR,
|
|
3419
|
+
env: { ...neo4jEnv, PLATFORM_ROOT: join(INSTALL_DIR, "platform") },
|
|
3420
|
+
});
|
|
3421
|
+
}
|
|
3408
3422
|
// Task 165 — register every bundled specialist subagent at
|
|
3409
3423
|
// $CLAUDE_CONFIG_DIR/agents/<name>.md. Claude Code's `--agent <name>`
|
|
3410
3424
|
// discovery only resolves under this path; without these symlinks,
|
package/package.json
CHANGED
|
@@ -70,13 +70,14 @@ export interface RoutineVerifyCounts {
|
|
|
70
70
|
actual: number;
|
|
71
71
|
suspended: number;
|
|
72
72
|
nextRunNull: number;
|
|
73
|
-
/**
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
73
|
+
/** Roster rows holding no description. Zero is the healthy value on every
|
|
74
|
+
* account, not only a fresh one: `VERIFY_CYPHER` matches `routineTemplate IS
|
|
75
|
+
* NOT NULL`, so operator-created routines are outside its scope and cannot
|
|
76
|
+
* contribute. Anything above zero while `expected === actual` is a MERGE that
|
|
77
|
+
* wrote no description on create, or a row whose key left the roster before
|
|
78
|
+
* the convergence ran — the one failure here that emits no error and does not
|
|
79
|
+
* reproduce. `[schedule-audit] op=description-coverage` is the wider twin,
|
|
80
|
+
* over every automation row rather than the roster alone. */
|
|
80
81
|
descNull: number;
|
|
81
82
|
}
|
|
82
83
|
export interface RoutineSeedReport {
|
|
@@ -124,17 +125,22 @@ export declare function resolveOwnerTimezone(session: SeedSessionLike, accountId
|
|
|
124
125
|
* destination, or reset a retimed cron. Only the prompt, the name and the
|
|
125
126
|
* version move, and only when the row is behind and unedited.
|
|
126
127
|
*
|
|
127
|
-
* `
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
|
|
128
|
+
* `description` (Task 2361) is guarded exactly as the prompt and the name are,
|
|
129
|
+
* and that is a change of shape from Task 2214, which introduced it. It used to
|
|
130
|
+
* be written on every match, on the grounds that it was roster-owned and the
|
|
131
|
+
* routines PATCH refused it, so no operator edit existed for the seed to
|
|
132
|
+
* clobber, and that gating it would leave every operator-edited row
|
|
133
|
+
* description-less permanently because `skip-operator-edited` takes neither
|
|
134
|
+
* branch. Both halves of that argument are gone. The routines PATCH now accepts
|
|
135
|
+
* `description` and stamps `operatorEdited`, so an unconditional write would
|
|
136
|
+
* destroy the operator's own caption on the next version bump; and the
|
|
137
|
+
* scheduling plugin's one-shot `converge-routine-description` has already given
|
|
138
|
+
* every pre-existing row a description, so no row is left holding only a
|
|
139
|
+
* title. */
|
|
140
|
+
export declare const MERGE_CYPHER = "\nUNWIND $rows AS row\nOPTIONAL MATCH (pre:Event {accountId: $accountId, routineTemplate: row.key})\nWITH row,\n pre IS NOT NULL AS existed,\n coalesce(pre.routineTemplateVersion, 0) AS priorVersion,\n pre.operatorEdited IS NOT NULL AS edited\nWITH row, existed, priorVersion, edited,\n (existed AND NOT edited AND priorVersion < $version) AS refreshing\nMERGE (e:Event {accountId: $accountId, routineTemplate: row.key})\n ON CREATE SET e.eventId = randomUUID(),\n e.name = row.name,\n e.description = row.description,\n e.agentPrompt = row.prompt,\n e.recurrence = row.recurrence,\n e.routineTemplateVersion = $version,\n e.eventStatus = 'suspended',\n e.nextRun = null,\n e.agentChannel = null,\n e.agentDestination = null,\n e.actionPlugin = null,\n e.actionTool = null,\n e.actionArgs = null,\n e.sourcePlugin = null,\n e.timezone = $timezone,\n e.createdBySource = 'installer',\n e.createdByAgent = 'system',\n e.createdByTool = 'routine-roster-seed',\n e.createdAt = $now,\n e.updatedAt = $now\n ON MATCH SET e.agentPrompt = CASE WHEN refreshing THEN row.prompt ELSE e.agentPrompt END,\n e.name = CASE WHEN refreshing THEN row.name ELSE e.name END,\n e.description = CASE WHEN refreshing THEN row.description ELSE e.description END,\n e.routineTemplateVersion = CASE WHEN refreshing THEN $version ELSE e.routineTemplateVersion END,\n e.updatedAt = CASE WHEN refreshing THEN $now ELSE e.updatedAt END\nRETURN row.key AS key,\n e.eventId AS eventId,\n CASE WHEN NOT existed THEN 'create'\n WHEN priorVersion >= $version THEN 'unchanged'\n WHEN edited THEN 'skip-operator-edited'\n ELSE 'refresh-version' END AS action";
|
|
135
141
|
/** The post-condition read. Counts every roster row the account actually holds,
|
|
136
142
|
* independently of what the MERGE above believes it wrote. */
|
|
137
|
-
export declare const VERIFY_CYPHER = "\nMATCH (e:Event {accountId: $accountId})\nWHERE e.routineTemplate IS NOT NULL\nRETURN count(e) AS actual,\n sum(CASE WHEN e.eventStatus = 'suspended' THEN 1 ELSE 0 END) AS suspended,\n sum(CASE WHEN e.nextRun IS NULL THEN 1 ELSE 0 END) AS nextRunNull,\n sum(CASE WHEN e.
|
|
143
|
+
export declare const VERIFY_CYPHER = "\nMATCH (e:Event {accountId: $accountId})\nWHERE e.routineTemplate IS NOT NULL\nRETURN count(e) AS actual,\n sum(CASE WHEN e.eventStatus = 'suspended' THEN 1 ELSE 0 END) AS suspended,\n sum(CASE WHEN e.nextRun IS NULL THEN 1 ELSE 0 END) AS nextRunNull,\n sum(CASE WHEN e.description IS NULL THEN 1 ELSE 0 END) AS descNull";
|
|
138
144
|
export interface SeedRoutineRosterArgs {
|
|
139
145
|
session: SeedSessionLike;
|
|
140
146
|
accountId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7F,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5F,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;2EAG2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CAClH;AAED;;;;;;;4EAO4E;AAC5E,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,iBAAiB,GAAG,sBAAsB,GAAG,WAAW,CAAC;AAErG,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;;;;;0EAM0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7F,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5F,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;2EAG2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CAClH;AAED;;;;;;;4EAO4E;AAC5E,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,iBAAiB,GAAG,sBAAsB,GAAG,WAAW,CAAC;AAErG,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;;;;;0EAM0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;kEAO8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,eAAe,GAAG,QAAQ,CAAC;IAC3C,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAYD;4DAC4D;AAC5D,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,eAAe,GAAG,QAAQ,CAAA;CAAE,CAAC,CAa1E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;aAyBa;AACb,eAAO,MAAM,YAAY,8+DAwCwB,CAAC;AAElD;+DAC+D;AAC/D,eAAO,MAAM,aAAa,wVAMgD,CAAC;AAE3E,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACpC,+DAA+D;IAC/D,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B;sEACkE;IAClE,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgF/F"}
|
|
@@ -92,13 +92,18 @@ async function resolveOwnerTimezone(session, accountId) {
|
|
|
92
92
|
* destination, or reset a retimed cron. Only the prompt, the name and the
|
|
93
93
|
* version move, and only when the row is behind and unedited.
|
|
94
94
|
*
|
|
95
|
-
* `
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
95
|
+
* `description` (Task 2361) is guarded exactly as the prompt and the name are,
|
|
96
|
+
* and that is a change of shape from Task 2214, which introduced it. It used to
|
|
97
|
+
* be written on every match, on the grounds that it was roster-owned and the
|
|
98
|
+
* routines PATCH refused it, so no operator edit existed for the seed to
|
|
99
|
+
* clobber, and that gating it would leave every operator-edited row
|
|
100
|
+
* description-less permanently because `skip-operator-edited` takes neither
|
|
101
|
+
* branch. Both halves of that argument are gone. The routines PATCH now accepts
|
|
102
|
+
* `description` and stamps `operatorEdited`, so an unconditional write would
|
|
103
|
+
* destroy the operator's own caption on the next version bump; and the
|
|
104
|
+
* scheduling plugin's one-shot `converge-routine-description` has already given
|
|
105
|
+
* every pre-existing row a description, so no row is left holding only a
|
|
106
|
+
* title. */
|
|
102
107
|
exports.MERGE_CYPHER = `
|
|
103
108
|
UNWIND $rows AS row
|
|
104
109
|
OPTIONAL MATCH (pre:Event {accountId: $accountId, routineTemplate: row.key})
|
|
@@ -111,7 +116,7 @@ WITH row, existed, priorVersion, edited,
|
|
|
111
116
|
MERGE (e:Event {accountId: $accountId, routineTemplate: row.key})
|
|
112
117
|
ON CREATE SET e.eventId = randomUUID(),
|
|
113
118
|
e.name = row.name,
|
|
114
|
-
e.
|
|
119
|
+
e.description = row.description,
|
|
115
120
|
e.agentPrompt = row.prompt,
|
|
116
121
|
e.recurrence = row.recurrence,
|
|
117
122
|
e.routineTemplateVersion = $version,
|
|
@@ -131,7 +136,7 @@ MERGE (e:Event {accountId: $accountId, routineTemplate: row.key})
|
|
|
131
136
|
e.updatedAt = $now
|
|
132
137
|
ON MATCH SET e.agentPrompt = CASE WHEN refreshing THEN row.prompt ELSE e.agentPrompt END,
|
|
133
138
|
e.name = CASE WHEN refreshing THEN row.name ELSE e.name END,
|
|
134
|
-
e.
|
|
139
|
+
e.description = CASE WHEN refreshing THEN row.description ELSE e.description END,
|
|
135
140
|
e.routineTemplateVersion = CASE WHEN refreshing THEN $version ELSE e.routineTemplateVersion END,
|
|
136
141
|
e.updatedAt = CASE WHEN refreshing THEN $now ELSE e.updatedAt END
|
|
137
142
|
RETURN row.key AS key,
|
|
@@ -148,7 +153,7 @@ WHERE e.routineTemplate IS NOT NULL
|
|
|
148
153
|
RETURN count(e) AS actual,
|
|
149
154
|
sum(CASE WHEN e.eventStatus = 'suspended' THEN 1 ELSE 0 END) AS suspended,
|
|
150
155
|
sum(CASE WHEN e.nextRun IS NULL THEN 1 ELSE 0 END) AS nextRunNull,
|
|
151
|
-
sum(CASE WHEN e.
|
|
156
|
+
sum(CASE WHEN e.description IS NULL THEN 1 ELSE 0 END) AS descNull`;
|
|
152
157
|
/**
|
|
153
158
|
* Seed (or re-seed) the roster for one account and report what happened.
|
|
154
159
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,9 +43,9 @@ export interface RoutineTemplate {
|
|
|
43
43
|
/** The title shown on `/routines`. */
|
|
44
44
|
readonly name: string;
|
|
45
45
|
/** One sentence under the title on the card: what this does and what it will
|
|
46
|
-
* not do.
|
|
47
|
-
*
|
|
48
|
-
*
|
|
46
|
+
* not do. Seeded onto `e.description`, which the operator can then edit from
|
|
47
|
+
* the routines page. The seed rewrites it only on a version refresh of an
|
|
48
|
+
* unedited row, so an operator's own wording survives every upgrade. */
|
|
49
49
|
readonly description: string;
|
|
50
50
|
/** The proposed cron. Written ON CREATE only, never refreshed, so an operator
|
|
51
51
|
* who retimes a routine keeps their expression across upgrades. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../src/roster.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH;;;gFAGgF;AAChF,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B;;mEAE+D;IAC/D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;
|
|
1
|
+
{"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../src/roster.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH;;;gFAGgF;AAChF,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B;;mEAE+D;IAC/D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;6EAGyE;IACzE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;wEACoE;IACpE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAgKD;;;;;;;;iFAQiF;AACjF,eAAO,MAAM,cAAc,EAAE,SAAS,eAAe,EAyGpD,CAAC;AAEF;;6DAE6D;AAC7D,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAqC,CAAC"}
|
|
@@ -84,7 +84,7 @@ describe("MERGE statement shape", () => {
|
|
|
84
84
|
for (const required of [
|
|
85
85
|
"eventId",
|
|
86
86
|
"name",
|
|
87
|
-
"
|
|
87
|
+
"description",
|
|
88
88
|
"agentPrompt",
|
|
89
89
|
"recurrence",
|
|
90
90
|
"routineTemplateVersion",
|
|
@@ -121,20 +121,24 @@ describe("MERGE statement shape", () => {
|
|
|
121
121
|
|
|
122
122
|
it("ON MATCH touches ONLY the prompt, name, description, version and updatedAt", () => {
|
|
123
123
|
expect(new Set(propertiesSetIn("ON MATCH SET"))).toEqual(
|
|
124
|
-
new Set(["agentPrompt", "name", "
|
|
124
|
+
new Set(["agentPrompt", "name", "description", "routineTemplateVersion", "updatedAt"]),
|
|
125
125
|
);
|
|
126
126
|
});
|
|
127
127
|
|
|
128
|
-
it("ON MATCH writes the description
|
|
129
|
-
//
|
|
130
|
-
//
|
|
131
|
-
//
|
|
132
|
-
//
|
|
133
|
-
//
|
|
128
|
+
it("ON MATCH writes the description only when refreshing, exactly as the prompt and name are", () => {
|
|
129
|
+
// The 2214 shape wrote it on every match, because gating it would have left
|
|
130
|
+
// every operator-edited row description-less for ever: skip-operator-edited
|
|
131
|
+
// takes neither branch. Task 2361's one-shot convergence removes that
|
|
132
|
+
// argument by giving every pre-existing row a description before the first
|
|
133
|
+
// guarded MERGE runs, and from here the description is operator-writable, so
|
|
134
|
+
// an unconditional write would clobber the operator's own text on every
|
|
135
|
+
// upgrade.
|
|
134
136
|
const start = MERGE_CYPHER.indexOf("ON MATCH SET");
|
|
135
137
|
const body = MERGE_CYPHER.slice(start, MERGE_CYPHER.indexOf("RETURN"));
|
|
136
|
-
expect(body).toContain(
|
|
137
|
-
|
|
138
|
+
expect(body).toContain(
|
|
139
|
+
"e.description = CASE WHEN refreshing THEN row.description ELSE e.description END",
|
|
140
|
+
);
|
|
141
|
+
expect(body).not.toContain("e.routineDescription");
|
|
138
142
|
});
|
|
139
143
|
|
|
140
144
|
it("verify counts the descriptions the graph actually holds", () => {
|
|
@@ -142,7 +146,7 @@ describe("MERGE statement shape", () => {
|
|
|
142
146
|
// MERGE succeeds, every action reads `refresh-version`, and the property
|
|
143
147
|
// is simply absent. `expected` and `actual` agree in that state.
|
|
144
148
|
expect(VERIFY_CYPHER).toContain(
|
|
145
|
-
"sum(CASE WHEN e.
|
|
149
|
+
"sum(CASE WHEN e.description IS NULL THEN 1 ELSE 0 END) AS descNull",
|
|
146
150
|
);
|
|
147
151
|
});
|
|
148
152
|
|
|
@@ -71,13 +71,14 @@ export interface RoutineVerifyCounts {
|
|
|
71
71
|
actual: number;
|
|
72
72
|
suspended: number;
|
|
73
73
|
nextRunNull: number;
|
|
74
|
-
/**
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
74
|
+
/** Roster rows holding no description. Zero is the healthy value on every
|
|
75
|
+
* account, not only a fresh one: `VERIFY_CYPHER` matches `routineTemplate IS
|
|
76
|
+
* NOT NULL`, so operator-created routines are outside its scope and cannot
|
|
77
|
+
* contribute. Anything above zero while `expected === actual` is a MERGE that
|
|
78
|
+
* wrote no description on create, or a row whose key left the roster before
|
|
79
|
+
* the convergence ran — the one failure here that emits no error and does not
|
|
80
|
+
* reproduce. `[schedule-audit] op=description-coverage` is the wider twin,
|
|
81
|
+
* over every automation row rather than the roster alone. */
|
|
81
82
|
descNull: number;
|
|
82
83
|
}
|
|
83
84
|
|
|
@@ -154,13 +155,18 @@ export async function resolveOwnerTimezone(
|
|
|
154
155
|
* destination, or reset a retimed cron. Only the prompt, the name and the
|
|
155
156
|
* version move, and only when the row is behind and unedited.
|
|
156
157
|
*
|
|
157
|
-
* `
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
158
|
+
* `description` (Task 2361) is guarded exactly as the prompt and the name are,
|
|
159
|
+
* and that is a change of shape from Task 2214, which introduced it. It used to
|
|
160
|
+
* be written on every match, on the grounds that it was roster-owned and the
|
|
161
|
+
* routines PATCH refused it, so no operator edit existed for the seed to
|
|
162
|
+
* clobber, and that gating it would leave every operator-edited row
|
|
163
|
+
* description-less permanently because `skip-operator-edited` takes neither
|
|
164
|
+
* branch. Both halves of that argument are gone. The routines PATCH now accepts
|
|
165
|
+
* `description` and stamps `operatorEdited`, so an unconditional write would
|
|
166
|
+
* destroy the operator's own caption on the next version bump; and the
|
|
167
|
+
* scheduling plugin's one-shot `converge-routine-description` has already given
|
|
168
|
+
* every pre-existing row a description, so no row is left holding only a
|
|
169
|
+
* title. */
|
|
164
170
|
export const MERGE_CYPHER = `
|
|
165
171
|
UNWIND $rows AS row
|
|
166
172
|
OPTIONAL MATCH (pre:Event {accountId: $accountId, routineTemplate: row.key})
|
|
@@ -173,7 +179,7 @@ WITH row, existed, priorVersion, edited,
|
|
|
173
179
|
MERGE (e:Event {accountId: $accountId, routineTemplate: row.key})
|
|
174
180
|
ON CREATE SET e.eventId = randomUUID(),
|
|
175
181
|
e.name = row.name,
|
|
176
|
-
e.
|
|
182
|
+
e.description = row.description,
|
|
177
183
|
e.agentPrompt = row.prompt,
|
|
178
184
|
e.recurrence = row.recurrence,
|
|
179
185
|
e.routineTemplateVersion = $version,
|
|
@@ -193,7 +199,7 @@ MERGE (e:Event {accountId: $accountId, routineTemplate: row.key})
|
|
|
193
199
|
e.updatedAt = $now
|
|
194
200
|
ON MATCH SET e.agentPrompt = CASE WHEN refreshing THEN row.prompt ELSE e.agentPrompt END,
|
|
195
201
|
e.name = CASE WHEN refreshing THEN row.name ELSE e.name END,
|
|
196
|
-
e.
|
|
202
|
+
e.description = CASE WHEN refreshing THEN row.description ELSE e.description END,
|
|
197
203
|
e.routineTemplateVersion = CASE WHEN refreshing THEN $version ELSE e.routineTemplateVersion END,
|
|
198
204
|
e.updatedAt = CASE WHEN refreshing THEN $now ELSE e.updatedAt END
|
|
199
205
|
RETURN row.key AS key,
|
|
@@ -211,7 +217,7 @@ WHERE e.routineTemplate IS NOT NULL
|
|
|
211
217
|
RETURN count(e) AS actual,
|
|
212
218
|
sum(CASE WHEN e.eventStatus = 'suspended' THEN 1 ELSE 0 END) AS suspended,
|
|
213
219
|
sum(CASE WHEN e.nextRun IS NULL THEN 1 ELSE 0 END) AS nextRunNull,
|
|
214
|
-
sum(CASE WHEN e.
|
|
220
|
+
sum(CASE WHEN e.description IS NULL THEN 1 ELSE 0 END) AS descNull`;
|
|
215
221
|
|
|
216
222
|
export interface SeedRoutineRosterArgs {
|
|
217
223
|
session: SeedSessionLike;
|
|
@@ -45,9 +45,9 @@ export interface RoutineTemplate {
|
|
|
45
45
|
/** The title shown on `/routines`. */
|
|
46
46
|
readonly name: string;
|
|
47
47
|
/** One sentence under the title on the card: what this does and what it will
|
|
48
|
-
* not do.
|
|
49
|
-
*
|
|
50
|
-
*
|
|
48
|
+
* not do. Seeded onto `e.description`, which the operator can then edit from
|
|
49
|
+
* the routines page. The seed rewrites it only on a version refresh of an
|
|
50
|
+
* unedited row, so an operator's own wording survives every upgrade. */
|
|
51
51
|
readonly description: string;
|
|
52
52
|
/** The proposed cron. Written ON CREATE only, never refreshed, so an operator
|
|
53
53
|
* who retimes a routine keeps their expression across upgrades. */
|
|
@@ -26,6 +26,7 @@ import { resolvePublicHostname } from "./lib/public-hostname.js";
|
|
|
26
26
|
import { resolveAdminHostname } from "./lib/admin-hostname.js";
|
|
27
27
|
import { publishSite } from "./tools/publish-site.js";
|
|
28
28
|
import { createAgent, updateAgent, projectAgentViaPlatform } from "./tools/agent-write.js";
|
|
29
|
+
import { checkDefaultAgent } from "./tools/account-default-agent.js";
|
|
29
30
|
import { resolveCapabilitiesHere } from "./tools/capabilities-here.js";
|
|
30
31
|
import { resolveIngestToken } from "./tools/linkedin-ingest-token.js";
|
|
31
32
|
import { startCpuTriage, readCpuTriage } from "./tools/cpu-triage.js";
|
|
@@ -787,19 +788,30 @@ eagerTool(server, "account-update", "Update a user-configurable setting in accou
|
|
|
787
788
|
thinkingView: ["default", "expanded", "collapsed"],
|
|
788
789
|
effort: ["low", "medium", "high", "max", "auto"],
|
|
789
790
|
};
|
|
790
|
-
// defaultAgent: non-empty slug must reference an existing
|
|
791
|
+
// defaultAgent: non-empty slug must be slug-shaped AND reference an existing
|
|
792
|
+
// agent; empty string clears the field.
|
|
793
|
+
//
|
|
794
|
+
// Task 2347 — shape before existence. The stored value is read back by
|
|
795
|
+
// resolveDefaultAgentSlug and handed to readAgentFile, which interpolates
|
|
796
|
+
// it into a path; a traversal value's config.json exists on any
|
|
797
|
+
// multi-account install, so existence alone stored a path that led out of
|
|
798
|
+
// the account directory.
|
|
799
|
+
// `defaultAgentSlug` is the canonical value to store: the verdict's trimmed
|
|
800
|
+
// slug, empty for the clear operation. Storing the raw `value` instead
|
|
801
|
+
// would let `" sales "` be accepted here and then refused by the read
|
|
802
|
+
// door's shape rule, which sees the untrimmed string.
|
|
803
|
+
let defaultAgentSlug = "";
|
|
791
804
|
if (field === "defaultAgent") {
|
|
792
|
-
const
|
|
793
|
-
if (
|
|
794
|
-
const
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
}
|
|
805
|
+
const verdict = checkDefaultAgent(getAccountDir(), value);
|
|
806
|
+
if (!verdict.ok) {
|
|
807
|
+
const slug = value.trim();
|
|
808
|
+
console.error(`[admin:account-update] rejected field=defaultAgent value="${value}" reason=${verdict.reason}`);
|
|
809
|
+
const text = verdict.reason === "shape"
|
|
810
|
+
? `Invalid agent slug "${slug}" — must be lowercase, start with a letter, and be 3 to 50 characters with no path separators.`
|
|
811
|
+
: `Agent '${slug}' not found — no config.json in agents/${slug}/`;
|
|
812
|
+
return { content: [{ type: "text", text }], isError: true };
|
|
801
813
|
}
|
|
802
|
-
|
|
814
|
+
defaultAgentSlug = verdict.slug;
|
|
803
815
|
}
|
|
804
816
|
// Model fields accept any non-empty string (model IDs change frequently)
|
|
805
817
|
const FREE_FORM_FIELDS = ["adminModel", "publicModel"];
|
|
@@ -822,22 +834,26 @@ eagerTool(server, "account-update", "Update a user-configurable setting in accou
|
|
|
822
834
|
const configPath = join(getAccountDir(), "account.json");
|
|
823
835
|
const config = await readAccountConfig();
|
|
824
836
|
const oldDefault = field === "defaultAgent" ? config.defaultAgent ?? "(none)" : undefined;
|
|
825
|
-
if (field === "defaultAgent"
|
|
826
|
-
|
|
837
|
+
if (field === "defaultAgent") {
|
|
838
|
+
if (defaultAgentSlug)
|
|
839
|
+
config.defaultAgent = defaultAgentSlug;
|
|
840
|
+
else
|
|
841
|
+
delete config.defaultAgent;
|
|
827
842
|
}
|
|
828
843
|
else {
|
|
829
844
|
config[field] = value;
|
|
830
845
|
}
|
|
846
|
+
const writtenValue = field === "defaultAgent" ? defaultAgentSlug : value;
|
|
831
847
|
await writeFile(configPath, JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
832
|
-
console.error(`[admin:account-update] wrote field=${field} value="${
|
|
848
|
+
console.error(`[admin:account-update] wrote field=${field} value="${writtenValue}" path=${configPath}`);
|
|
833
849
|
if (field === "defaultAgent") {
|
|
834
|
-
if (!
|
|
850
|
+
if (!defaultAgentSlug) {
|
|
835
851
|
return {
|
|
836
852
|
content: [{ type: "text", text: `Default agent cleared (was "${oldDefault}"). Visitors to the root URL will see the first available agent, or a "no agents" message if none exist. Takes effect on next page load.` }],
|
|
837
853
|
};
|
|
838
854
|
}
|
|
839
855
|
return {
|
|
840
|
-
content: [{ type: "text", text: `Default agent changed from "${oldDefault}" to "${
|
|
856
|
+
content: [{ type: "text", text: `Default agent changed from "${oldDefault}" to "${defaultAgentSlug}". Takes effect on next page load.` }],
|
|
841
857
|
};
|
|
842
858
|
}
|
|
843
859
|
return {
|