@rubytech/create-maxy-code 0.1.552 → 0.1.554
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/platform-architecture/SKILL.md +22 -11
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +12 -0
- package/payload/platform/plugins/docs/references/admin-ui.md +21 -10
- 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-BDaJlf67.js} +1 -1
- package/payload/server/public/assets/AdminLoginScreens-BDaJlf67.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-BDaJlf67.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-DUUw6WNs.js +2 -0
- package/payload/server/public/assets/AdminShell-DUUw6WNs.js.br +0 -0
- package/payload/server/public/assets/AdminShell-DUUw6WNs.js.gz +0 -0
- package/payload/server/public/assets/{activity-C8E8-EwQ.js → activity-JpRW4yeS.js} +1 -1
- package/payload/server/public/assets/activity-JpRW4yeS.js.br +0 -0
- package/payload/server/public/assets/activity-JpRW4yeS.js.gz +0 -0
- package/payload/server/public/assets/admin-BH4gL0c2.js +1 -0
- package/payload/server/public/assets/admin-BH4gL0c2.js.br +0 -0
- package/payload/server/public/assets/admin-BH4gL0c2.js.gz +0 -0
- package/payload/server/public/assets/{agents-DuN92iFb.js → agents-EtIviAPH.js} +1 -1
- package/payload/server/public/assets/agents-EtIviAPH.js.br +0 -0
- package/payload/server/public/assets/agents-EtIviAPH.js.gz +0 -0
- package/payload/server/public/assets/{arc-DaudCnXg.js → arc-DaI5MLTq.js} +1 -1
- package/payload/server/public/assets/arc-DaI5MLTq.js.br +0 -0
- package/payload/server/public/assets/arc-DaI5MLTq.js.gz +0 -0
- package/payload/server/public/assets/architecture-YZFGNWBL-DWZIX5aV.js +1 -0
- package/payload/server/public/assets/architecture-YZFGNWBL-DWZIX5aV.js.br +0 -0
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-Dj9L_JR0.js → architectureDiagram-Q4EWVU46-xZ0gDnJQ.js} +1 -1
- package/payload/server/public/assets/architectureDiagram-Q4EWVU46-xZ0gDnJQ.js.br +0 -0
- package/payload/server/public/assets/architectureDiagram-Q4EWVU46-xZ0gDnJQ.js.gz +0 -0
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-BTXKYwrR.js → blockDiagram-DXYQGD6D-DwWtWBJp.js} +1 -1
- package/payload/server/public/assets/blockDiagram-DXYQGD6D-DwWtWBJp.js.br +0 -0
- package/payload/server/public/assets/blockDiagram-DXYQGD6D-DwWtWBJp.js.gz +0 -0
- package/payload/server/public/assets/{browser-BxebdKbh.js → browser-DntnPrfU.js} +1 -1
- package/payload/server/public/assets/browser-DntnPrfU.js.br +0 -0
- package/payload/server/public/assets/browser-DntnPrfU.js.gz +0 -0
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-BN7XeOWV.js → c4Diagram-AHTNJAMY-qRseEjtL.js} +1 -1
- package/payload/server/public/assets/c4Diagram-AHTNJAMY-qRseEjtL.js.br +0 -0
- package/payload/server/public/assets/c4Diagram-AHTNJAMY-qRseEjtL.js.gz +0 -0
- package/payload/server/public/assets/calendar-DnmkfQAe.js +1 -0
- package/payload/server/public/assets/calendar-DnmkfQAe.js.br +0 -0
- package/payload/server/public/assets/calendar-DnmkfQAe.js.gz +0 -0
- package/payload/server/public/assets/channel-DnchwXmx.js +1 -0
- package/payload/server/public/assets/chat-_Ok0sVx2.js +1 -0
- package/payload/server/public/assets/chat-_Ok0sVx2.js.br +2 -0
- package/payload/server/public/assets/chat-_Ok0sVx2.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-udrHmjzu.js +1 -0
- package/payload/server/public/assets/chevron-left-udrHmjzu.js.br +0 -0
- package/payload/server/public/assets/{chunk-2KRD3SAO-BwEVlnxo.js → chunk-2KRD3SAO-B6koUoB7.js} +1 -1
- package/payload/server/public/assets/chunk-2KRD3SAO-B6koUoB7.js.br +0 -0
- package/payload/server/public/assets/chunk-2KRD3SAO-B6koUoB7.js.gz +0 -0
- package/payload/server/public/assets/{chunk-336JU56O-DR5EUh9D.js → chunk-336JU56O-ByZrJI-3.js} +2 -2
- package/payload/server/public/assets/chunk-336JU56O-ByZrJI-3.js.br +0 -0
- package/payload/server/public/assets/chunk-336JU56O-ByZrJI-3.js.gz +0 -0
- package/payload/server/public/assets/chunk-426QAEUC-fNi5i3SA.js +1 -0
- package/payload/server/public/assets/chunk-426QAEUC-fNi5i3SA.js.br +0 -0
- package/payload/server/public/assets/chunk-426QAEUC-fNi5i3SA.js.gz +0 -0
- package/payload/server/public/assets/{chunk-4BX2VUAB-C5p3xTC6.js → chunk-4BX2VUAB-7sO95xR2.js} +1 -1
- package/payload/server/public/assets/chunk-4BX2VUAB-7sO95xR2.js.br +0 -0
- package/payload/server/public/assets/chunk-4BX2VUAB-7sO95xR2.js.gz +0 -0
- package/payload/server/public/assets/{chunk-4TB4RGXK-CqrBvvGI.js → chunk-4TB4RGXK-KqKMvkA_.js} +1 -1
- package/payload/server/public/assets/chunk-4TB4RGXK-KqKMvkA_.js.br +0 -0
- package/payload/server/public/assets/chunk-4TB4RGXK-KqKMvkA_.js.gz +0 -0
- package/payload/server/public/assets/{chunk-55IACEB6-DDU_m1ra.js → chunk-55IACEB6-ggIJf_TC.js} +1 -1
- package/payload/server/public/assets/chunk-55IACEB6-ggIJf_TC.js.br +0 -0
- package/payload/server/public/assets/chunk-55IACEB6-ggIJf_TC.js.gz +0 -0
- package/payload/server/public/assets/{chunk-5FUZZQ4R-B21kX6ld.js → chunk-5FUZZQ4R-CEIokxZS.js} +1 -1
- package/payload/server/public/assets/chunk-5FUZZQ4R-CEIokxZS.js.br +0 -0
- package/payload/server/public/assets/chunk-5FUZZQ4R-CEIokxZS.js.gz +0 -0
- package/payload/server/public/assets/{chunk-5PVQY5BW-CYusrVbq.js → chunk-5PVQY5BW-BEsb0aTb.js} +1 -1
- package/payload/server/public/assets/chunk-5PVQY5BW-BEsb0aTb.js.br +0 -0
- package/payload/server/public/assets/chunk-5PVQY5BW-BEsb0aTb.js.gz +0 -0
- package/payload/server/public/assets/{chunk-67CJDMHE-9W0Qv0jm.js → chunk-67CJDMHE-LS8rUbii.js} +1 -1
- package/payload/server/public/assets/chunk-67CJDMHE-LS8rUbii.js.br +2 -0
- package/payload/server/public/assets/chunk-67CJDMHE-LS8rUbii.js.gz +0 -0
- package/payload/server/public/assets/{chunk-7N4EOEYR-B3gqydR3.js → chunk-7N4EOEYR-JKOVngS0.js} +1 -1
- package/payload/server/public/assets/chunk-7N4EOEYR-JKOVngS0.js.br +2 -0
- package/payload/server/public/assets/chunk-7N4EOEYR-JKOVngS0.js.gz +0 -0
- package/payload/server/public/assets/{chunk-AA7GKIK3-DW8a-2NK.js → chunk-AA7GKIK3-CoXnTVK6.js} +1 -1
- package/payload/server/public/assets/chunk-AA7GKIK3-CoXnTVK6.js.br +0 -0
- package/payload/server/public/assets/chunk-AA7GKIK3-CoXnTVK6.js.gz +0 -0
- package/payload/server/public/assets/{chunk-BSJP7CBP-DqXIO_5R.js → chunk-BSJP7CBP-CcsqObFg.js} +1 -1
- package/payload/server/public/assets/chunk-BSJP7CBP-CcsqObFg.js.br +0 -0
- package/payload/server/public/assets/chunk-BSJP7CBP-CcsqObFg.js.gz +0 -0
- package/payload/server/public/assets/{chunk-CIAEETIT-BMJfgj2u.js → chunk-CIAEETIT-CpsybR7q.js} +1 -1
- package/payload/server/public/assets/chunk-CIAEETIT-CpsybR7q.js.br +0 -0
- package/payload/server/public/assets/chunk-CIAEETIT-CpsybR7q.js.gz +0 -0
- package/payload/server/public/assets/{chunk-EDXVE4YY-CyjTyMkv.js → chunk-EDXVE4YY-CCCHYEbG.js} +1 -1
- package/payload/server/public/assets/chunk-EDXVE4YY-CCCHYEbG.js.br +2 -0
- package/payload/server/public/assets/chunk-EDXVE4YY-CCCHYEbG.js.gz +0 -0
- package/payload/server/public/assets/{chunk-ENJZ2VHE-B-k8uOTF.js → chunk-ENJZ2VHE-yVekovt2.js} +1 -1
- package/payload/server/public/assets/chunk-ENJZ2VHE-yVekovt2.js.br +0 -0
- package/payload/server/public/assets/chunk-ENJZ2VHE-yVekovt2.js.gz +0 -0
- package/payload/server/public/assets/{chunk-FMBD7UC4-CdPjwbtf.js → chunk-FMBD7UC4-D27VnSCa.js} +1 -1
- package/payload/server/public/assets/chunk-FMBD7UC4-D27VnSCa.js.br +0 -0
- package/payload/server/public/assets/chunk-FMBD7UC4-D27VnSCa.js.gz +0 -0
- package/payload/server/public/assets/{chunk-FOC6F5B3-Dl6l1KAh.js → chunk-FOC6F5B3-C0tU2UFl.js} +1 -1
- package/payload/server/public/assets/chunk-FOC6F5B3-C0tU2UFl.js.br +0 -0
- package/payload/server/public/assets/chunk-FOC6F5B3-C0tU2UFl.js.gz +0 -0
- package/payload/server/public/assets/{chunk-ICPOFSXX-CKQWnR1l.js → chunk-ICPOFSXX-BmWvYe_5.js} +2 -2
- package/payload/server/public/assets/chunk-ICPOFSXX-BmWvYe_5.js.br +0 -0
- package/payload/server/public/assets/chunk-ICPOFSXX-BmWvYe_5.js.gz +0 -0
- package/payload/server/public/assets/{chunk-K5T4RW27--g29_wjW.js → chunk-K5T4RW27-DIKxqyYw.js} +1 -1
- package/payload/server/public/assets/chunk-K5T4RW27-DIKxqyYw.js.br +0 -0
- package/payload/server/public/assets/chunk-K5T4RW27-DIKxqyYw.js.gz +0 -0
- package/payload/server/public/assets/{chunk-KGLVRYIC-CI77ENeO.js → chunk-KGLVRYIC-CiL4YVLo.js} +1 -1
- package/payload/server/public/assets/chunk-KGLVRYIC-CiL4YVLo.js.br +0 -0
- package/payload/server/public/assets/chunk-KGLVRYIC-CiL4YVLo.js.gz +0 -0
- package/payload/server/public/assets/{chunk-LIHQZDEY-CE-XByg6.js → chunk-LIHQZDEY-ejKezVlD.js} +1 -1
- package/payload/server/public/assets/chunk-LIHQZDEY-ejKezVlD.js.br +0 -0
- package/payload/server/public/assets/chunk-LIHQZDEY-ejKezVlD.js.gz +0 -0
- package/payload/server/public/assets/{chunk-ORNJ4GCN-DkjJQQSm.js → chunk-ORNJ4GCN-Cc0vqc-D.js} +1 -1
- package/payload/server/public/assets/chunk-ORNJ4GCN-Cc0vqc-D.js.br +0 -0
- package/payload/server/public/assets/chunk-ORNJ4GCN-Cc0vqc-D.js.gz +0 -0
- package/payload/server/public/assets/{chunk-OYMX7WX6-Dis40FU5.js → chunk-OYMX7WX6-BE4b8qC9.js} +1 -1
- package/payload/server/public/assets/chunk-OYMX7WX6-BE4b8qC9.js.br +0 -0
- package/payload/server/public/assets/chunk-OYMX7WX6-BE4b8qC9.js.gz +0 -0
- package/payload/server/public/assets/chunk-QZHKN3VN-Dhlh7Pkk.js +1 -0
- package/payload/server/public/assets/chunk-QZHKN3VN-Dhlh7Pkk.js.br +0 -0
- package/payload/server/public/assets/chunk-QZHKN3VN-Dhlh7Pkk.js.gz +0 -0
- package/payload/server/public/assets/{chunk-U2HBQHQK-DT3NLMic.js → chunk-U2HBQHQK-DcEL3so-.js} +1 -1
- package/payload/server/public/assets/chunk-U2HBQHQK-DcEL3so-.js.br +0 -0
- package/payload/server/public/assets/chunk-U2HBQHQK-DcEL3so-.js.gz +0 -0
- package/payload/server/public/assets/{chunk-X2U36JSP-Dxaab1tD.js → chunk-X2U36JSP-D0X5qpg6.js} +1 -1
- package/payload/server/public/assets/chunk-X2U36JSP-D0X5qpg6.js.br +0 -0
- package/payload/server/public/assets/chunk-X2U36JSP-D0X5qpg6.js.gz +0 -0
- package/payload/server/public/assets/{chunk-XPW4576I-DtqJwn2x.js → chunk-XPW4576I-DZqqB9Zi.js} +1 -1
- package/payload/server/public/assets/chunk-XPW4576I-DZqqB9Zi.js.br +0 -0
- package/payload/server/public/assets/chunk-XPW4576I-DZqqB9Zi.js.gz +0 -0
- package/payload/server/public/assets/{chunk-YZCP3GAM-CEEcRrOH.js → chunk-YZCP3GAM-BTxWHFTx.js} +1 -1
- package/payload/server/public/assets/chunk-YZCP3GAM-BTxWHFTx.js.br +0 -0
- package/payload/server/public/assets/chunk-YZCP3GAM-BTxWHFTx.js.gz +0 -0
- package/payload/server/public/assets/{chunk-ZZ45TVLE-CVhqjM4L.js → chunk-ZZ45TVLE-D8nE76c5.js} +1 -1
- package/payload/server/public/assets/chunk-ZZ45TVLE-D8nE76c5.js.br +0 -0
- package/payload/server/public/assets/chunk-ZZ45TVLE-D8nE76c5.js.gz +0 -0
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-D9OvkaTQ.js +1 -0
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-D9OvkaTQ.js.br +0 -0
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-D9OvkaTQ.js.gz +0 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BEuoBAgN.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BEuoBAgN.js.br +0 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BEuoBAgN.js.gz +0 -0
- package/payload/server/public/assets/clock-BmdrE7vz.js +1 -0
- package/payload/server/public/assets/clock-BmdrE7vz.js.br +0 -0
- package/payload/server/public/assets/clock-BmdrE7vz.js.gz +0 -0
- package/payload/server/public/assets/clone-C-YfAPQ_.js +1 -0
- package/payload/server/public/assets/{copy-DCDHXq3O.js → copy-BiOI6GeQ.js} +1 -1
- package/payload/server/public/assets/copy-BiOI6GeQ.js.br +0 -0
- package/payload/server/public/assets/copy-BiOI6GeQ.js.gz +0 -0
- package/payload/server/public/assets/{cose-bilkent-S5V4N54A-kEHVkDNn.js → cose-bilkent-S5V4N54A-D-95BzXL.js} +1 -1
- package/payload/server/public/assets/cose-bilkent-S5V4N54A-D-95BzXL.js.br +0 -0
- package/payload/server/public/assets/cose-bilkent-S5V4N54A-D-95BzXL.js.gz +0 -0
- package/payload/server/public/assets/{dagre-BgQxtxH1.js → dagre-CrjQCEN9.js} +1 -1
- package/payload/server/public/assets/dagre-CrjQCEN9.js.br +0 -0
- package/payload/server/public/assets/dagre-CrjQCEN9.js.gz +0 -0
- package/payload/server/public/assets/{dagre-KV5264BT-CgxwoTcv.js → dagre-KV5264BT-mcGXOajA.js} +1 -1
- package/payload/server/public/assets/dagre-KV5264BT-mcGXOajA.js.br +0 -0
- package/payload/server/public/assets/dagre-KV5264BT-mcGXOajA.js.gz +0 -0
- package/payload/server/public/assets/data-Za62pAv5.js +1 -0
- package/payload/server/public/assets/data-Za62pAv5.js.br +2 -0
- package/payload/server/public/assets/data-Za62pAv5.js.gz +0 -0
- package/payload/server/public/assets/{diagram-5BDNPKRD-MEZ1cQGO.js → diagram-5BDNPKRD-Colq2XR9.js} +1 -1
- package/payload/server/public/assets/diagram-5BDNPKRD-Colq2XR9.js.br +0 -0
- package/payload/server/public/assets/diagram-5BDNPKRD-Colq2XR9.js.gz +0 -0
- package/payload/server/public/assets/{diagram-G4DWMVQ6-DbZg9hWP.js → diagram-G4DWMVQ6-DafrIgN8.js} +1 -1
- package/payload/server/public/assets/diagram-G4DWMVQ6-DafrIgN8.js.br +0 -0
- package/payload/server/public/assets/diagram-G4DWMVQ6-DafrIgN8.js.gz +0 -0
- package/payload/server/public/assets/{diagram-MMDJMWI5-Bb1y8DFy.js → diagram-MMDJMWI5-CD9pSd2z.js} +1 -1
- package/payload/server/public/assets/diagram-MMDJMWI5-CD9pSd2z.js.br +0 -0
- package/payload/server/public/assets/diagram-MMDJMWI5-CD9pSd2z.js.gz +0 -0
- package/payload/server/public/assets/{diagram-TYMM5635-tbStCw5U.js → diagram-TYMM5635-DqhsN-Il.js} +1 -1
- package/payload/server/public/assets/diagram-TYMM5635-DqhsN-Il.js.br +0 -0
- package/payload/server/public/assets/diagram-TYMM5635-DqhsN-Il.js.gz +0 -0
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-ClEFo_Bw.js → erDiagram-SMLLAGMA-mf9kQrIs.js} +1 -1
- package/payload/server/public/assets/erDiagram-SMLLAGMA-mf9kQrIs.js.br +0 -0
- package/payload/server/public/assets/erDiagram-SMLLAGMA-mf9kQrIs.js.gz +0 -0
- package/payload/server/public/assets/{file-text-zQgEQWCF.js → file-text-s2dqE-bu.js} +1 -1
- package/payload/server/public/assets/file-text-s2dqE-bu.js.br +0 -0
- package/payload/server/public/assets/file-text-s2dqE-bu.js.gz +0 -0
- package/payload/server/public/assets/{flatten-Bu-b1uTY.js → flatten-BtIc9jX7.js} +1 -1
- package/payload/server/public/assets/flatten-BtIc9jX7.js.br +0 -0
- package/payload/server/public/assets/flatten-BtIc9jX7.js.gz +0 -0
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-9yr262Ji.js → flowDiagram-DWJPFMVM-CJLkGmFm.js} +1 -1
- package/payload/server/public/assets/flowDiagram-DWJPFMVM-CJLkGmFm.js.br +0 -0
- package/payload/server/public/assets/flowDiagram-DWJPFMVM-CJLkGmFm.js.gz +0 -0
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-ZCSA0DtG.js → ganttDiagram-T4ZO3ILL-JV6PUFic.js} +1 -1
- package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-JV6PUFic.js.br +0 -0
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-ZCSA0DtG.js.gz → ganttDiagram-T4ZO3ILL-JV6PUFic.js.gz} +0 -0
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-C-FvNTHZ.js +1 -0
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-C-FvNTHZ.js.br +0 -0
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-0KvpzpaU.js → gitGraphDiagram-UUTBAWPF-JhiumTtl.js} +1 -1
- package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-JhiumTtl.js.br +0 -0
- package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-JhiumTtl.js.gz +0 -0
- package/payload/server/public/assets/{graph-CFCEh_YI.js → graph-ClX4Zn0s.js} +2 -2
- package/payload/server/public/assets/graph-ClX4Zn0s.js.br +0 -0
- package/payload/server/public/assets/graph-ClX4Zn0s.js.gz +0 -0
- package/payload/server/public/assets/{graph-labels-CA1UcDuS.js → graph-labels-BdLfJumr.js} +1 -1
- package/payload/server/public/assets/graph-labels-BdLfJumr.js.br +0 -0
- package/payload/server/public/assets/graph-labels-BdLfJumr.js.gz +0 -0
- package/payload/server/public/assets/{graphlib-B3SsCJOd.js → graphlib-Z7cApv13.js} +1 -1
- package/payload/server/public/assets/graphlib-Z7cApv13.js.br +0 -0
- package/payload/server/public/assets/graphlib-Z7cApv13.js.gz +0 -0
- package/payload/server/public/assets/info-OMHHGYJF-BjLPgHAC.js +1 -0
- package/payload/server/public/assets/info-OMHHGYJF-BjLPgHAC.js.br +0 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-B-6k2hmd.js +2 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-B-6k2hmd.js.br +0 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-B-6k2hmd.js.gz +0 -0
- package/payload/server/public/assets/{isEmpty-CjH0UASp.js → isEmpty-Bu4fZ8Kf.js} +1 -1
- package/payload/server/public/assets/isEmpty-Bu4fZ8Kf.js.br +0 -0
- package/payload/server/public/assets/isEmpty-Bu4fZ8Kf.js.gz +0 -0
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-DsDoNemz.js → ishikawaDiagram-UXIWVN3A-CQIGY8NI.js} +1 -1
- package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-CQIGY8NI.js.br +0 -0
- package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-CQIGY8NI.js.gz +0 -0
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-xyayGhw3.js → journeyDiagram-VCZTEJTY-O5rEHC1o.js} +1 -1
- package/payload/server/public/assets/journeyDiagram-VCZTEJTY-O5rEHC1o.js.br +0 -0
- package/payload/server/public/assets/journeyDiagram-VCZTEJTY-O5rEHC1o.js.gz +0 -0
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DuV3Go_1.js → kanban-definition-6JOO6SKY-BS7huuG7.js} +1 -1
- package/payload/server/public/assets/kanban-definition-6JOO6SKY-BS7huuG7.js.br +0 -0
- package/payload/server/public/assets/kanban-definition-6JOO6SKY-BS7huuG7.js.gz +0 -0
- package/payload/server/public/assets/{line-Cpb8GRkf.js → line-DjHTnO_W.js} +1 -1
- package/payload/server/public/assets/line-DjHTnO_W.js.br +0 -0
- package/payload/server/public/assets/line-DjHTnO_W.js.gz +0 -0
- package/payload/server/public/assets/{linear-l39GooQ5.js → linear-RvwZxFzh.js} +1 -1
- package/payload/server/public/assets/linear-RvwZxFzh.js.br +0 -0
- package/payload/server/public/assets/linear-RvwZxFzh.js.gz +0 -0
- package/payload/server/public/assets/{mermaid-parser.core-9hkxt3j1.js → mermaid-parser.core-CUoZE61Z.js} +2 -2
- package/payload/server/public/assets/mermaid-parser.core-CUoZE61Z.js.br +0 -0
- package/payload/server/public/assets/mermaid-parser.core-CUoZE61Z.js.gz +0 -0
- package/payload/server/public/assets/{mermaid.core-iR6TQesD.js → mermaid.core-CHquUUrw.js} +3 -3
- package/payload/server/public/assets/mermaid.core-CHquUUrw.js.br +0 -0
- package/payload/server/public/assets/mermaid.core-CHquUUrw.js.gz +0 -0
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-LCKhTYzs.js → mindmap-definition-QFDTVHPH-pHUJa3IP.js} +1 -1
- package/payload/server/public/assets/mindmap-definition-QFDTVHPH-pHUJa3IP.js.br +0 -0
- package/payload/server/public/assets/mindmap-definition-QFDTVHPH-pHUJa3IP.js.gz +0 -0
- package/payload/server/public/assets/{operator-hFXPDc2X.js → operator-BQtleyx3.js} +1 -1
- package/payload/server/public/assets/operator-BQtleyx3.js.br +0 -0
- package/payload/server/public/assets/operator-BQtleyx3.js.gz +0 -0
- package/payload/server/public/assets/{ordinal-D6D6WcTC.js → ordinal-C2TEWKNu.js} +1 -1
- package/payload/server/public/assets/ordinal-C2TEWKNu.js.br +0 -0
- package/payload/server/public/assets/ordinal-C2TEWKNu.js.gz +0 -0
- package/payload/server/public/assets/packet-4T2RLAQJ-BBAZASfb.js +1 -0
- package/payload/server/public/assets/packet-4T2RLAQJ-BBAZASfb.js.br +0 -0
- package/payload/server/public/assets/{page-C8jyPH_3.js → page-BkMbmVu6.js} +1 -1
- package/payload/server/public/assets/page-BkMbmVu6.js.br +0 -0
- package/payload/server/public/assets/page-BkMbmVu6.js.gz +0 -0
- package/payload/server/public/assets/{page-ne7I_r9L.js → page-C-jQaGZ4.js} +3 -3
- package/payload/server/public/assets/page-C-jQaGZ4.js.br +0 -0
- package/payload/server/public/assets/page-C-jQaGZ4.js.gz +0 -0
- package/payload/server/public/assets/{pdf-render-DanMu_cf.js → pdf-render-Bwg_xv1L.js} +1 -1
- package/payload/server/public/assets/pdf-render-Bwg_xv1L.js.br +0 -0
- package/payload/server/public/assets/{pdf-render-DanMu_cf.js.gz → pdf-render-Bwg_xv1L.js.gz} +0 -0
- package/payload/server/public/assets/pie-ZZUOXDRM-CCJUnMeG.js +1 -0
- package/payload/server/public/assets/pie-ZZUOXDRM-CCJUnMeG.js.br +0 -0
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-Oo7wgo0C.js → pieDiagram-DEJITSTG-DRIRqqhQ.js} +1 -1
- package/payload/server/public/assets/pieDiagram-DEJITSTG-DRIRqqhQ.js.br +0 -0
- package/payload/server/public/assets/pieDiagram-DEJITSTG-DRIRqqhQ.js.gz +0 -0
- package/payload/server/public/assets/play-Da69rmat.js +1 -0
- package/payload/server/public/assets/play-Da69rmat.js.br +0 -0
- package/payload/server/public/assets/play-Da69rmat.js.gz +0 -0
- package/payload/server/public/assets/{public-BgnqjAal.js → public-BPlCLx7p.js} +1 -1
- package/payload/server/public/assets/public-BPlCLx7p.js.br +0 -0
- package/payload/server/public/assets/public-BPlCLx7p.js.gz +0 -0
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-B2hs2ord.js → quadrantDiagram-34T5L4WZ-7WHBrI_9.js} +1 -1
- package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-7WHBrI_9.js.br +0 -0
- package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-7WHBrI_9.js.gz +0 -0
- package/payload/server/public/assets/radar-PYXPWWZC-BsRU8Aep.js +1 -0
- package/payload/server/public/assets/radar-PYXPWWZC-BsRU8Aep.js.br +0 -0
- package/payload/server/public/assets/{reduce-BtXXK8Ma.js → reduce-BGpN5lgn.js} +1 -1
- package/payload/server/public/assets/reduce-BGpN5lgn.js.br +0 -0
- package/payload/server/public/assets/reduce-BGpN5lgn.js.gz +0 -0
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-B8UkCUzW.js → requirementDiagram-MS252O5E-CatBEoHm.js} +1 -1
- package/payload/server/public/assets/requirementDiagram-MS252O5E-CatBEoHm.js.br +0 -0
- package/payload/server/public/assets/requirementDiagram-MS252O5E-CatBEoHm.js.gz +0 -0
- package/payload/server/public/assets/{rotate-ccw-DfJWjXAg.js → rotate-ccw-DpTlNy-M.js} +1 -1
- package/payload/server/public/assets/rotate-ccw-DpTlNy-M.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-DpTlNy-M.js.gz +0 -0
- package/payload/server/public/assets/routines-YlXtcZNz.js +2 -0
- package/payload/server/public/assets/routines-YlXtcZNz.js.br +0 -0
- package/payload/server/public/assets/routines-YlXtcZNz.js.gz +0 -0
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-Cojqqz7t.js → sankeyDiagram-XADWPNL6-DfefvhQ6.js} +1 -1
- package/payload/server/public/assets/sankeyDiagram-XADWPNL6-DfefvhQ6.js.br +0 -0
- package/payload/server/public/assets/sankeyDiagram-XADWPNL6-DfefvhQ6.js.gz +0 -0
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-C7ODsPjE.js → sequenceDiagram-FGHM5R23-51FmBwFt.js} +1 -1
- package/payload/server/public/assets/sequenceDiagram-FGHM5R23-51FmBwFt.js.br +0 -0
- package/payload/server/public/assets/sequenceDiagram-FGHM5R23-51FmBwFt.js.gz +0 -0
- package/payload/server/public/assets/{skills-D-6EbgfP.js → skills-CX4p0a2M.js} +1 -1
- package/payload/server/public/assets/skills-CX4p0a2M.js.br +0 -0
- package/payload/server/public/assets/skills-CX4p0a2M.js.gz +0 -0
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BC8a_P9c.js → stateDiagram-FHFEXIEX-CPgxX16e.js} +1 -1
- package/payload/server/public/assets/stateDiagram-FHFEXIEX-CPgxX16e.js.br +0 -0
- package/payload/server/public/assets/stateDiagram-FHFEXIEX-CPgxX16e.js.gz +0 -0
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DrQl9xC9.js +1 -0
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DrQl9xC9.js.br +0 -0
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DrQl9xC9.js.gz +0 -0
- package/payload/server/public/assets/{tasks-DnN5Fyds.js → tasks-B51N5DIO.js} +2 -2
- package/payload/server/public/assets/tasks-B51N5DIO.js.br +0 -0
- package/payload/server/public/assets/tasks-B51N5DIO.js.gz +0 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-BMxUC3ri.js → timeline-definition-GMOUNBTQ-DC4gTR2m.js} +1 -1
- package/payload/server/public/assets/timeline-definition-GMOUNBTQ-DC4gTR2m.js.br +0 -0
- package/payload/server/public/assets/timeline-definition-GMOUNBTQ-DC4gTR2m.js.gz +0 -0
- package/payload/server/public/assets/treeView-SZITEDCU-BDzhKA6v.js +1 -0
- package/payload/server/public/assets/treeView-SZITEDCU-BDzhKA6v.js.br +0 -0
- package/payload/server/public/assets/treemap-W4RFUUIX-epHpdeWa.js +1 -0
- package/payload/server/public/assets/treemap-W4RFUUIX-epHpdeWa.js.br +0 -0
- package/payload/server/public/assets/{triangle-alert-eh9UOKDT.js → triangle-alert-CkE_tzl3.js} +1 -1
- package/payload/server/public/assets/triangle-alert-CkE_tzl3.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-CkE_tzl3.js.gz +0 -0
- package/payload/server/public/assets/{useCopyFeedback-Bz9OJHBb.js → useCopyFeedback-3B_lN6ri.js} +1 -1
- package/payload/server/public/assets/useCopyFeedback-3B_lN6ri.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-3B_lN6ri.js.gz +0 -0
- package/payload/server/public/assets/{useMediaQuery-CNxsjKZp.css → useMediaQuery-AAUlD_Av.css} +1 -1
- package/payload/server/public/assets/useMediaQuery-AAUlD_Av.css.br +0 -0
- package/payload/server/public/assets/useMediaQuery-AAUlD_Av.css.gz +0 -0
- package/payload/server/public/assets/{useVoiceRecorder-BaDpMYxX.js → useVoiceRecorder-DtP2IN-j.js} +2 -2
- package/payload/server/public/assets/useVoiceRecorder-DtP2IN-j.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-DtP2IN-j.js.gz +0 -0
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BsRGBF0K.js → vennDiagram-DHZGUBPP-CADQLMv_.js} +1 -1
- package/payload/server/public/assets/vennDiagram-DHZGUBPP-CADQLMv_.js.br +0 -0
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BsRGBF0K.js.gz → vennDiagram-DHZGUBPP-CADQLMv_.js.gz} +0 -0
- package/payload/server/public/assets/wardley-RL74JXVD-DNSZCrxV.js +1 -0
- package/payload/server/public/assets/wardley-RL74JXVD-DNSZCrxV.js.br +0 -0
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-oQh9A-Mq.js → wardleyDiagram-NUSXRM2D-Cs5AyyGo.js} +1 -1
- package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-Cs5AyyGo.js.br +0 -0
- package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-Cs5AyyGo.js.gz +0 -0
- package/payload/server/public/assets/{wrench-BO-l46rF.js → wrench-B_4KM-f7.js} +1 -1
- package/payload/server/public/assets/wrench-B_4KM-f7.js.br +0 -0
- package/payload/server/public/assets/wrench-B_4KM-f7.js.gz +0 -0
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-0K87OmFI.js → xychartDiagram-5P7HB3ND-Bp_VDbBp.js} +1 -1
- package/payload/server/public/assets/xychartDiagram-5P7HB3ND-Bp_VDbBp.js.br +0 -0
- package/payload/server/public/assets/xychartDiagram-5P7HB3ND-Bp_VDbBp.js.gz +0 -0
- package/payload/server/public/browser.html +4 -4
- package/payload/server/public/calendar.html +7 -8
- package/payload/server/public/chat.html +14 -14
- package/payload/server/public/data.html +13 -13
- package/payload/server/public/graph.html +9 -9
- package/payload/server/public/index.html +15 -16
- package/payload/server/public/operator.html +15 -15
- package/payload/server/public/public.html +14 -14
- package/payload/server/public/routines.html +7 -7
- package/payload/server/public/skills.html +5 -5
- package/payload/server/public/tasks.html +6 -6
- package/payload/server/server.js +73 -16
- 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 +0 -2
- 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 +0 -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-DuN92iFb.js.br +0 -0
- package/payload/server/public/assets/agents-DuN92iFb.js.gz +0 -0
- package/payload/server/public/assets/arc-DaudCnXg.js.br +0 -0
- package/payload/server/public/assets/arc-DaudCnXg.js.gz +0 -0
- package/payload/server/public/assets/architecture-YZFGNWBL-DPFsm5jD.js +0 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-DPFsm5jD.js.br +0 -0
- package/payload/server/public/assets/architectureDiagram-Q4EWVU46-Dj9L_JR0.js.br +0 -0
- package/payload/server/public/assets/architectureDiagram-Q4EWVU46-Dj9L_JR0.js.gz +0 -0
- package/payload/server/public/assets/blockDiagram-DXYQGD6D-BTXKYwrR.js.br +0 -0
- package/payload/server/public/assets/blockDiagram-DXYQGD6D-BTXKYwrR.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/c4Diagram-AHTNJAMY-BN7XeOWV.js.br +0 -0
- package/payload/server/public/assets/c4Diagram-AHTNJAMY-BN7XeOWV.js.gz +0 -0
- package/payload/server/public/assets/calendar-BtFZQ5Np.js +0 -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/channel-D08XWP9e.js +0 -1
- 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/chunk-2KRD3SAO-BwEVlnxo.js.br +0 -0
- package/payload/server/public/assets/chunk-2KRD3SAO-BwEVlnxo.js.gz +0 -0
- package/payload/server/public/assets/chunk-336JU56O-DR5EUh9D.js.br +0 -0
- package/payload/server/public/assets/chunk-336JU56O-DR5EUh9D.js.gz +0 -0
- package/payload/server/public/assets/chunk-426QAEUC-YPE0DZOq.js +0 -1
- package/payload/server/public/assets/chunk-426QAEUC-YPE0DZOq.js.br +0 -0
- package/payload/server/public/assets/chunk-426QAEUC-YPE0DZOq.js.gz +0 -0
- package/payload/server/public/assets/chunk-4BX2VUAB-C5p3xTC6.js.br +0 -0
- package/payload/server/public/assets/chunk-4BX2VUAB-C5p3xTC6.js.gz +0 -0
- package/payload/server/public/assets/chunk-4TB4RGXK-CqrBvvGI.js.br +0 -0
- package/payload/server/public/assets/chunk-4TB4RGXK-CqrBvvGI.js.gz +0 -0
- package/payload/server/public/assets/chunk-55IACEB6-DDU_m1ra.js.br +0 -0
- package/payload/server/public/assets/chunk-55IACEB6-DDU_m1ra.js.gz +0 -0
- package/payload/server/public/assets/chunk-5FUZZQ4R-B21kX6ld.js.br +0 -0
- package/payload/server/public/assets/chunk-5FUZZQ4R-B21kX6ld.js.gz +0 -0
- package/payload/server/public/assets/chunk-5PVQY5BW-CYusrVbq.js.br +0 -0
- package/payload/server/public/assets/chunk-5PVQY5BW-CYusrVbq.js.gz +0 -0
- package/payload/server/public/assets/chunk-67CJDMHE-9W0Qv0jm.js.br +0 -0
- package/payload/server/public/assets/chunk-67CJDMHE-9W0Qv0jm.js.gz +0 -0
- package/payload/server/public/assets/chunk-7N4EOEYR-B3gqydR3.js.br +0 -0
- package/payload/server/public/assets/chunk-7N4EOEYR-B3gqydR3.js.gz +0 -0
- package/payload/server/public/assets/chunk-AA7GKIK3-DW8a-2NK.js.br +0 -4
- package/payload/server/public/assets/chunk-AA7GKIK3-DW8a-2NK.js.gz +0 -0
- package/payload/server/public/assets/chunk-BSJP7CBP-DqXIO_5R.js.br +0 -0
- package/payload/server/public/assets/chunk-BSJP7CBP-DqXIO_5R.js.gz +0 -0
- package/payload/server/public/assets/chunk-CIAEETIT-BMJfgj2u.js.br +0 -0
- package/payload/server/public/assets/chunk-CIAEETIT-BMJfgj2u.js.gz +0 -0
- package/payload/server/public/assets/chunk-EDXVE4YY-CyjTyMkv.js.br +0 -0
- package/payload/server/public/assets/chunk-EDXVE4YY-CyjTyMkv.js.gz +0 -0
- package/payload/server/public/assets/chunk-ENJZ2VHE-B-k8uOTF.js.br +0 -0
- package/payload/server/public/assets/chunk-ENJZ2VHE-B-k8uOTF.js.gz +0 -0
- package/payload/server/public/assets/chunk-FMBD7UC4-CdPjwbtf.js.br +0 -0
- package/payload/server/public/assets/chunk-FMBD7UC4-CdPjwbtf.js.gz +0 -0
- package/payload/server/public/assets/chunk-FOC6F5B3-Dl6l1KAh.js.br +0 -0
- package/payload/server/public/assets/chunk-FOC6F5B3-Dl6l1KAh.js.gz +0 -0
- package/payload/server/public/assets/chunk-ICPOFSXX-CKQWnR1l.js.br +0 -0
- package/payload/server/public/assets/chunk-ICPOFSXX-CKQWnR1l.js.gz +0 -0
- package/payload/server/public/assets/chunk-K5T4RW27--g29_wjW.js.br +0 -0
- package/payload/server/public/assets/chunk-K5T4RW27--g29_wjW.js.gz +0 -0
- package/payload/server/public/assets/chunk-KGLVRYIC-CI77ENeO.js.br +0 -3
- package/payload/server/public/assets/chunk-KGLVRYIC-CI77ENeO.js.gz +0 -0
- package/payload/server/public/assets/chunk-LIHQZDEY-CE-XByg6.js.br +0 -0
- package/payload/server/public/assets/chunk-LIHQZDEY-CE-XByg6.js.gz +0 -0
- package/payload/server/public/assets/chunk-ORNJ4GCN-DkjJQQSm.js.br +0 -0
- package/payload/server/public/assets/chunk-ORNJ4GCN-DkjJQQSm.js.gz +0 -0
- package/payload/server/public/assets/chunk-OYMX7WX6-Dis40FU5.js.br +0 -0
- package/payload/server/public/assets/chunk-OYMX7WX6-Dis40FU5.js.gz +0 -0
- package/payload/server/public/assets/chunk-QZHKN3VN-DnqqL1de.js +0 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-DnqqL1de.js.br +0 -0
- package/payload/server/public/assets/chunk-QZHKN3VN-DnqqL1de.js.gz +0 -0
- package/payload/server/public/assets/chunk-U2HBQHQK-DT3NLMic.js.br +0 -0
- package/payload/server/public/assets/chunk-U2HBQHQK-DT3NLMic.js.gz +0 -0
- package/payload/server/public/assets/chunk-X2U36JSP-Dxaab1tD.js.br +0 -0
- package/payload/server/public/assets/chunk-X2U36JSP-Dxaab1tD.js.gz +0 -0
- package/payload/server/public/assets/chunk-XPW4576I-DtqJwn2x.js.br +0 -0
- package/payload/server/public/assets/chunk-XPW4576I-DtqJwn2x.js.gz +0 -0
- package/payload/server/public/assets/chunk-YZCP3GAM-CEEcRrOH.js.br +0 -0
- package/payload/server/public/assets/chunk-YZCP3GAM-CEEcRrOH.js.gz +0 -0
- package/payload/server/public/assets/chunk-ZZ45TVLE-CVhqjM4L.js.br +0 -0
- package/payload/server/public/assets/chunk-ZZ45TVLE-CVhqjM4L.js.gz +0 -0
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-BPY9jtfT.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-BPY9jtfT.js.br +0 -0
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-BPY9jtfT.js.gz +0 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CLgDbwDp.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CLgDbwDp.js.br +0 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CLgDbwDp.js.gz +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/clone-B6yMH1PX.js +0 -1
- package/payload/server/public/assets/clone-B6yMH1PX.js.br +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/cose-bilkent-S5V4N54A-kEHVkDNn.js.br +0 -0
- package/payload/server/public/assets/cose-bilkent-S5V4N54A-kEHVkDNn.js.gz +0 -0
- package/payload/server/public/assets/dagre-BgQxtxH1.js.br +0 -0
- package/payload/server/public/assets/dagre-BgQxtxH1.js.gz +0 -0
- package/payload/server/public/assets/dagre-KV5264BT-CgxwoTcv.js.br +0 -0
- package/payload/server/public/assets/dagre-KV5264BT-CgxwoTcv.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/diagram-5BDNPKRD-MEZ1cQGO.js.br +0 -0
- package/payload/server/public/assets/diagram-5BDNPKRD-MEZ1cQGO.js.gz +0 -0
- package/payload/server/public/assets/diagram-G4DWMVQ6-DbZg9hWP.js.br +0 -0
- package/payload/server/public/assets/diagram-G4DWMVQ6-DbZg9hWP.js.gz +0 -0
- package/payload/server/public/assets/diagram-MMDJMWI5-Bb1y8DFy.js.br +0 -0
- package/payload/server/public/assets/diagram-MMDJMWI5-Bb1y8DFy.js.gz +0 -0
- package/payload/server/public/assets/diagram-TYMM5635-tbStCw5U.js.br +0 -0
- package/payload/server/public/assets/diagram-TYMM5635-tbStCw5U.js.gz +0 -0
- package/payload/server/public/assets/erDiagram-SMLLAGMA-ClEFo_Bw.js.br +0 -0
- package/payload/server/public/assets/erDiagram-SMLLAGMA-ClEFo_Bw.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/flatten-Bu-b1uTY.js.br +0 -0
- package/payload/server/public/assets/flatten-Bu-b1uTY.js.gz +0 -0
- package/payload/server/public/assets/flowDiagram-DWJPFMVM-9yr262Ji.js.br +0 -0
- package/payload/server/public/assets/flowDiagram-DWJPFMVM-9yr262Ji.js.gz +0 -0
- package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-ZCSA0DtG.js.br +0 -0
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-B0OUwOUx.js +0 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-B0OUwOUx.js.br +0 -0
- package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-0KvpzpaU.js.br +0 -0
- package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-0KvpzpaU.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/graphlib-B3SsCJOd.js.br +0 -0
- package/payload/server/public/assets/graphlib-B3SsCJOd.js.gz +0 -0
- package/payload/server/public/assets/info-OMHHGYJF-C_8TwPDe.js +0 -1
- package/payload/server/public/assets/info-OMHHGYJF-C_8TwPDe.js.br +0 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-B607bZBJ.js +0 -2
- package/payload/server/public/assets/infoDiagram-42DDH7IO-B607bZBJ.js.br +0 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-B607bZBJ.js.gz +0 -0
- package/payload/server/public/assets/isEmpty-CjH0UASp.js.br +0 -0
- package/payload/server/public/assets/isEmpty-CjH0UASp.js.gz +0 -0
- package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-DsDoNemz.js.br +0 -0
- package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-DsDoNemz.js.gz +0 -0
- package/payload/server/public/assets/journeyDiagram-VCZTEJTY-xyayGhw3.js.br +0 -0
- package/payload/server/public/assets/journeyDiagram-VCZTEJTY-xyayGhw3.js.gz +0 -0
- package/payload/server/public/assets/kanban-definition-6JOO6SKY-DuV3Go_1.js.br +0 -0
- package/payload/server/public/assets/kanban-definition-6JOO6SKY-DuV3Go_1.js.gz +0 -0
- package/payload/server/public/assets/line-Cpb8GRkf.js.br +0 -0
- package/payload/server/public/assets/line-Cpb8GRkf.js.gz +0 -0
- package/payload/server/public/assets/linear-l39GooQ5.js.br +0 -0
- package/payload/server/public/assets/linear-l39GooQ5.js.gz +0 -0
- package/payload/server/public/assets/mermaid-parser.core-9hkxt3j1.js.br +0 -0
- package/payload/server/public/assets/mermaid-parser.core-9hkxt3j1.js.gz +0 -0
- package/payload/server/public/assets/mermaid.core-iR6TQesD.js.br +0 -0
- package/payload/server/public/assets/mermaid.core-iR6TQesD.js.gz +0 -0
- package/payload/server/public/assets/mindmap-definition-QFDTVHPH-LCKhTYzs.js.br +0 -0
- package/payload/server/public/assets/mindmap-definition-QFDTVHPH-LCKhTYzs.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/ordinal-D6D6WcTC.js.br +0 -0
- package/payload/server/public/assets/ordinal-D6D6WcTC.js.gz +0 -0
- package/payload/server/public/assets/packet-4T2RLAQJ-CCQdbIqO.js +0 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-CCQdbIqO.js.br +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/pdf-render-DanMu_cf.js.br +0 -0
- package/payload/server/public/assets/pie-ZZUOXDRM-Bdw3Iqs7.js +0 -1
- package/payload/server/public/assets/pie-ZZUOXDRM-Bdw3Iqs7.js.br +0 -0
- package/payload/server/public/assets/pieDiagram-DEJITSTG-Oo7wgo0C.js.br +0 -0
- package/payload/server/public/assets/pieDiagram-DEJITSTG-Oo7wgo0C.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/quadrantDiagram-34T5L4WZ-B2hs2ord.js.br +0 -0
- package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-B2hs2ord.js.gz +0 -0
- package/payload/server/public/assets/radar-PYXPWWZC-D3FUdA3r.js +0 -1
- package/payload/server/public/assets/radar-PYXPWWZC-D3FUdA3r.js.br +0 -0
- package/payload/server/public/assets/reduce-BtXXK8Ma.js.br +0 -0
- package/payload/server/public/assets/reduce-BtXXK8Ma.js.gz +0 -0
- package/payload/server/public/assets/requirementDiagram-MS252O5E-B8UkCUzW.js.br +0 -0
- package/payload/server/public/assets/requirementDiagram-MS252O5E-B8UkCUzW.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/sankeyDiagram-XADWPNL6-Cojqqz7t.js.br +0 -0
- package/payload/server/public/assets/sankeyDiagram-XADWPNL6-Cojqqz7t.js.gz +0 -0
- package/payload/server/public/assets/sequenceDiagram-FGHM5R23-C7ODsPjE.js.br +0 -0
- package/payload/server/public/assets/sequenceDiagram-FGHM5R23-C7ODsPjE.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/stateDiagram-FHFEXIEX-BC8a_P9c.js.br +0 -0
- package/payload/server/public/assets/stateDiagram-FHFEXIEX-BC8a_P9c.js.gz +0 -0
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-C7KvMtT5.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-C7KvMtT5.js.br +0 -0
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-C7KvMtT5.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/timeline-definition-GMOUNBTQ-BMxUC3ri.js.br +0 -0
- package/payload/server/public/assets/timeline-definition-GMOUNBTQ-BMxUC3ri.js.gz +0 -0
- package/payload/server/public/assets/treeView-SZITEDCU-DetKw0D0.js +0 -1
- package/payload/server/public/assets/treeView-SZITEDCU-DetKw0D0.js.br +0 -0
- package/payload/server/public/assets/treemap-W4RFUUIX-zQkIANxW.js +0 -1
- package/payload/server/public/assets/treemap-W4RFUUIX-zQkIANxW.js.br +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/useMediaQuery-CNxsjKZp.css.gz +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/vennDiagram-DHZGUBPP-BsRGBF0K.js.br +0 -0
- package/payload/server/public/assets/wardley-RL74JXVD-DkQV3DvB.js +0 -1
- package/payload/server/public/assets/wardley-RL74JXVD-DkQV3DvB.js.br +0 -0
- package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-oQh9A-Mq.js.br +0 -0
- package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-oQh9A-Mq.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/xychartDiagram-5P7HB3ND-0K87OmFI.js.br +0 -0
- package/payload/server/public/assets/xychartDiagram-5P7HB3ND-0K87OmFI.js.gz +0 -0
- /package/payload/server/public/assets/{_baseFor-B12He5Rp.js → _baseFor-Be3EKK3K.js} +0 -0
- /package/payload/server/public/assets/{_baseFor-B12He5Rp.js.br → _baseFor-Be3EKK3K.js.br} +0 -0
- /package/payload/server/public/assets/{_baseFor-B12He5Rp.js.gz → _baseFor-Be3EKK3K.js.gz} +0 -0
- /package/payload/server/public/assets/{array-DO1uCttT.js → array-X0JlPOfd.js} +0 -0
- /package/payload/server/public/assets/{array-DO1uCttT.js.br → array-X0JlPOfd.js.br} +0 -0
- /package/payload/server/public/assets/{cytoscape.esm-DFn2foqy.js → cytoscape.esm-CI2IWMLB.js} +0 -0
- /package/payload/server/public/assets/{cytoscape.esm-DFn2foqy.js.br → cytoscape.esm-CI2IWMLB.js.br} +0 -0
- /package/payload/server/public/assets/{cytoscape.esm-DFn2foqy.js.gz → cytoscape.esm-CI2IWMLB.js.gz} +0 -0
- /package/payload/server/public/assets/{defaultLocale-ieI3yFoA.js → defaultLocale-B6RGN4id.js} +0 -0
- /package/payload/server/public/assets/{defaultLocale-ieI3yFoA.js.br → defaultLocale-B6RGN4id.js.br} +0 -0
- /package/payload/server/public/assets/{defaultLocale-ieI3yFoA.js.gz → defaultLocale-B6RGN4id.js.gz} +0 -0
- /package/payload/server/public/assets/{dist-DlU7AEeD.js → dist-QvbmK1IP.js} +0 -0
- /package/payload/server/public/assets/{dist-DlU7AEeD.js.br → dist-QvbmK1IP.js.br} +0 -0
- /package/payload/server/public/assets/{dist-DlU7AEeD.js.gz → dist-QvbmK1IP.js.gz} +0 -0
- /package/payload/server/public/assets/{file-download-DbNIjWiK.js → file-download-DiQesOd2.js} +0 -0
- /package/payload/server/public/assets/{file-download-DbNIjWiK.js.br → file-download-DiQesOd2.js.br} +0 -0
- /package/payload/server/public/assets/{file-download-DbNIjWiK.js.gz → file-download-DiQesOd2.js.gz} +0 -0
- /package/payload/server/public/assets/{init-BCRlEgNP.js → init-BmUWJJHz.js} +0 -0
- /package/payload/server/public/assets/{init-BCRlEgNP.js.br → init-BmUWJJHz.js.br} +0 -0
- /package/payload/server/public/assets/{init-BCRlEgNP.js.gz → init-BmUWJJHz.js.gz} +0 -0
- /package/payload/server/public/assets/{katex-gkTaZgi6.js → katex-BjZuzSQn.js} +0 -0
- /package/payload/server/public/assets/{katex-gkTaZgi6.js.br → katex-BjZuzSQn.js.br} +0 -0
- /package/payload/server/public/assets/{katex-gkTaZgi6.js.gz → katex-BjZuzSQn.js.gz} +0 -0
- /package/payload/server/public/assets/{path-DTmzQFjQ.js → path-CoPyR7c2.js} +0 -0
- /package/payload/server/public/assets/{path-DTmzQFjQ.js.br → path-CoPyR7c2.js.br} +0 -0
- /package/payload/server/public/assets/{path-DTmzQFjQ.js.gz → path-CoPyR7c2.js.gz} +0 -0
- /package/payload/server/public/assets/{preload-helper-BQrMkyGX.js → preload-helper-BJ2zoBc3.js} +0 -0
- /package/payload/server/public/assets/{preload-helper-BQrMkyGX.js.br → preload-helper-BJ2zoBc3.js.br} +0 -0
- /package/payload/server/public/assets/{preload-helper-BQrMkyGX.js.gz → preload-helper-BJ2zoBc3.js.gz} +0 -0
- /package/payload/server/public/assets/{rough.esm-BFJ-MgcB.js → rough.esm-jSt7UMyi.js} +0 -0
- /package/payload/server/public/assets/{rough.esm-BFJ-MgcB.js.br → rough.esm-jSt7UMyi.js.br} +0 -0
- /package/payload/server/public/assets/{rough.esm-BFJ-MgcB.js.gz → rough.esm-jSt7UMyi.js.gz} +0 -0
- /package/payload/server/public/assets/{src-9CNk4JU0.js → src-C2WwTWSY.js} +0 -0
- /package/payload/server/public/assets/{src-9CNk4JU0.js.br → src-C2WwTWSY.js.br} +0 -0
- /package/payload/server/public/assets/{src-9CNk4JU0.js.gz → src-C2WwTWSY.js.gz} +0 -0
- /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js → useMediaQuery-CLxecNeT.js} +0 -0
- /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js.br → useMediaQuery-CLxecNeT.js.br} +0 -0
- /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js.gz → useMediaQuery-CLxecNeT.js.gz} +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Task 2100. The audit exists because the failure it guards emitted nothing:
|
|
2
2
|
// the write logged ok, the read logged ok, and the two disagreed about which
|
|
3
3
|
// label the calendar lives on.
|
|
4
|
-
import { describe, it, expect, vi } from "vitest";
|
|
5
|
-
import { auditScheduleVisibility } from "../schedule-audit.js";
|
|
4
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
5
|
+
import { auditScheduleVisibility, auditFireRateCensus } from "../schedule-audit.js";
|
|
6
6
|
/** Counts :Meeting and :Event for the account; the list function is injected. */
|
|
7
7
|
function countingSession(meetings, events) {
|
|
8
8
|
return {
|
|
@@ -45,4 +45,212 @@ describe("auditScheduleVisibility (Task 2100)", () => {
|
|
|
45
45
|
expect(list).toHaveBeenCalledWith({ accountId: "acct-1", limit: 11 });
|
|
46
46
|
});
|
|
47
47
|
});
|
|
48
|
+
// Task 2381. The connector that silently resolves to `none`: a revoked
|
|
49
|
+
// authorisation makes every fire sync an empty busy list, the action succeeds,
|
|
50
|
+
// the RoutineRun closes clean, and the booking page offers slots the operator is
|
|
51
|
+
// not free for.
|
|
52
|
+
import { mkdtempSync, mkdirSync, writeFileSync, readFileSync, existsSync } from "node:fs";
|
|
53
|
+
import { tmpdir } from "node:os";
|
|
54
|
+
import { join } from "node:path";
|
|
55
|
+
import { auditConnectorResolution, nextConnectorState, noneForHours, } from "../schedule-audit.js";
|
|
56
|
+
const T0 = Date.parse("2026-08-02T00:00:00.000Z");
|
|
57
|
+
const HOUR = 3_600_000;
|
|
58
|
+
describe("nextConnectorState", () => {
|
|
59
|
+
it("starts the none clock on the first none observation", () => {
|
|
60
|
+
expect(nextConnectorState(undefined, "none", T0)).toEqual({ connector: "none", noneSinceMs: T0 });
|
|
61
|
+
});
|
|
62
|
+
it("keeps the original none instant across consecutive none observations", () => {
|
|
63
|
+
const first = nextConnectorState(undefined, "none", T0);
|
|
64
|
+
expect(nextConnectorState(first, "none", T0 + HOUR).noneSinceMs).toBe(T0);
|
|
65
|
+
});
|
|
66
|
+
it("clears the none clock when a connector comes back", () => {
|
|
67
|
+
const first = nextConnectorState(undefined, "none", T0);
|
|
68
|
+
expect(nextConnectorState(first, "google", T0 + HOUR)).toEqual({
|
|
69
|
+
connector: "google",
|
|
70
|
+
noneSinceMs: null,
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
it("restarts the clock after a recovery, so the run length is never cumulative", () => {
|
|
74
|
+
const none1 = nextConnectorState(undefined, "none", T0);
|
|
75
|
+
const back = nextConnectorState(none1, "google", T0 + HOUR);
|
|
76
|
+
expect(nextConnectorState(back, "none", T0 + 2 * HOUR).noneSinceMs).toBe(T0 + 2 * HOUR);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe("noneForHours", () => {
|
|
80
|
+
it("is 0 while a connector is resolved", () => {
|
|
81
|
+
expect(noneForHours({ connector: "google", noneSinceMs: null }, T0)).toBe(0);
|
|
82
|
+
});
|
|
83
|
+
it("counts whole hours since the none run began", () => {
|
|
84
|
+
expect(noneForHours({ connector: "none", noneSinceMs: T0 }, T0 + 25 * HOUR)).toBe(25);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
/** An accounts directory whose named accounts carry the given connectors. */
|
|
88
|
+
function accountsDir(spec) {
|
|
89
|
+
const dir = mkdtempSync(join(tmpdir(), "audit-accts-"));
|
|
90
|
+
for (const [accountId, connectors] of Object.entries(spec)) {
|
|
91
|
+
mkdirSync(join(dir, accountId), { recursive: true });
|
|
92
|
+
for (const c of connectors) {
|
|
93
|
+
const rel = c === "google" ? ["google", "accounts"] : ["outlook", "mailboxes"];
|
|
94
|
+
const idDir = join(dir, accountId, "secrets", ...rel, "id-1");
|
|
95
|
+
mkdirSync(idDir, { recursive: true });
|
|
96
|
+
writeFileSync(join(idDir, "tokens.enc"), "x");
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return dir;
|
|
100
|
+
}
|
|
101
|
+
/** A driver whose one query returns the accounts holding a scheduled busy-sync
|
|
102
|
+
* routine. */
|
|
103
|
+
function driverWithSyncRoutines(accountIds) {
|
|
104
|
+
const session = {
|
|
105
|
+
run: vi.fn(async () => ({
|
|
106
|
+
records: accountIds.map((id) => ({ get: () => id })),
|
|
107
|
+
})),
|
|
108
|
+
close: vi.fn(async () => { }),
|
|
109
|
+
};
|
|
110
|
+
return { driver: { session: () => session }, session };
|
|
111
|
+
}
|
|
112
|
+
describe("auditConnectorResolution", () => {
|
|
113
|
+
it("emits one line per local account per tick, including a healthy one", async () => {
|
|
114
|
+
const logs = [];
|
|
115
|
+
const spy = vi.spyOn(console, "error").mockImplementation((m) => void logs.push(String(m)));
|
|
116
|
+
const { driver } = driverWithSyncRoutines(["acct-1", "acct-2"]);
|
|
117
|
+
const statePath = join(mkdtempSync(join(tmpdir(), "audit-state-")), "s.json");
|
|
118
|
+
await auditConnectorResolution(driver, ["acct-1", "acct-2"], accountsDir({ "acct-1": ["google"], "acct-2": [] }), statePath, T0);
|
|
119
|
+
spy.mockRestore();
|
|
120
|
+
const lines = logs.filter((l) => l.includes("op=connector-resolution"));
|
|
121
|
+
expect(lines).toHaveLength(2);
|
|
122
|
+
expect(lines[0]).toContain("connector=google");
|
|
123
|
+
expect(lines[0]).toContain("noneForHours=0");
|
|
124
|
+
expect(lines[0]).toContain("ok=true");
|
|
125
|
+
// A fresh `none` is not yet an alarm — it is one tick old, not 24 hours.
|
|
126
|
+
expect(lines[1]).toContain("connector=none");
|
|
127
|
+
expect(lines[1]).toContain("ok=true");
|
|
128
|
+
});
|
|
129
|
+
it("reports ok=false once an account has resolved none for over 24 hours", async () => {
|
|
130
|
+
const dir = accountsDir({ "acct-1": [] });
|
|
131
|
+
const statePath = join(mkdtempSync(join(tmpdir(), "audit-state-")), "s.json");
|
|
132
|
+
const { driver } = driverWithSyncRoutines(["acct-1"]);
|
|
133
|
+
await auditConnectorResolution(driver, ["acct-1"], dir, statePath, T0);
|
|
134
|
+
const logs = [];
|
|
135
|
+
const spy = vi.spyOn(console, "error").mockImplementation((m) => void logs.push(String(m)));
|
|
136
|
+
await auditConnectorResolution(driver, ["acct-1"], dir, statePath, T0 + 25 * HOUR);
|
|
137
|
+
spy.mockRestore();
|
|
138
|
+
const line = logs.find((l) => l.includes("op=connector-resolution"));
|
|
139
|
+
expect(line).toContain("noneForHours=25");
|
|
140
|
+
expect(line).toContain("ok=false");
|
|
141
|
+
});
|
|
142
|
+
it("does not alarm on an account with no scheduled busy-sync routine", async () => {
|
|
143
|
+
const dir = accountsDir({ "acct-1": [] });
|
|
144
|
+
const statePath = join(mkdtempSync(join(tmpdir(), "audit-state-")), "s.json");
|
|
145
|
+
const { driver } = driverWithSyncRoutines([]);
|
|
146
|
+
await auditConnectorResolution(driver, ["acct-1"], dir, statePath, T0);
|
|
147
|
+
const logs = [];
|
|
148
|
+
const spy = vi.spyOn(console, "error").mockImplementation((m) => void logs.push(String(m)));
|
|
149
|
+
await auditConnectorResolution(driver, ["acct-1"], dir, statePath, T0 + 25 * HOUR);
|
|
150
|
+
spy.mockRestore();
|
|
151
|
+
const line = logs.find((l) => l.includes("op=connector-resolution"));
|
|
152
|
+
expect(line).toContain("noneForHours=25");
|
|
153
|
+
expect(line).toContain("ok=true");
|
|
154
|
+
});
|
|
155
|
+
it("persists state so the run length survives the next heartbeat process", async () => {
|
|
156
|
+
const dir = accountsDir({ "acct-1": [] });
|
|
157
|
+
const statePath = join(mkdtempSync(join(tmpdir(), "audit-state-")), "s.json");
|
|
158
|
+
const { driver } = driverWithSyncRoutines(["acct-1"]);
|
|
159
|
+
await auditConnectorResolution(driver, ["acct-1"], dir, statePath, T0);
|
|
160
|
+
expect(existsSync(statePath)).toBe(true);
|
|
161
|
+
expect(JSON.parse(readFileSync(statePath, "utf-8"))["acct-1"]).toEqual({
|
|
162
|
+
connector: "none",
|
|
163
|
+
noneSinceMs: T0,
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
it("never throws — a failed query costs one line, not the tick", async () => {
|
|
167
|
+
const session = {
|
|
168
|
+
run: vi.fn(async () => {
|
|
169
|
+
throw new Error("neo4j down");
|
|
170
|
+
}),
|
|
171
|
+
close: vi.fn(async () => { }),
|
|
172
|
+
};
|
|
173
|
+
const logs = [];
|
|
174
|
+
const spy = vi.spyOn(console, "error").mockImplementation((m) => void logs.push(String(m)));
|
|
175
|
+
await expect(auditConnectorResolution({ session: () => session }, ["acct-1"], accountsDir({ "acct-1": [] }), join(mkdtempSync(join(tmpdir(), "audit-state-")), "s.json"), T0)).resolves.toBeUndefined();
|
|
176
|
+
spy.mockRestore();
|
|
177
|
+
expect(logs.some((l) => l.includes("op=connector-resolution-error"))).toBe(true);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
function censusDriver(rows) {
|
|
181
|
+
return {
|
|
182
|
+
session: () => ({
|
|
183
|
+
run: vi.fn(async () => ({
|
|
184
|
+
records: rows.map((r) => ({
|
|
185
|
+
get: (k) => r[k] ?? null,
|
|
186
|
+
})),
|
|
187
|
+
})),
|
|
188
|
+
close: vi.fn(async () => { }),
|
|
189
|
+
}),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
const censusRow = (over = {}) => ({
|
|
193
|
+
accountId: "acct-1111-2222",
|
|
194
|
+
eventId: "evt-3333-4444",
|
|
195
|
+
recurrence: "0 * * * *",
|
|
196
|
+
timezone: "Europe/London",
|
|
197
|
+
eventStatus: "scheduled",
|
|
198
|
+
...over,
|
|
199
|
+
});
|
|
200
|
+
describe("auditFireRateCensus (Task 2380)", () => {
|
|
201
|
+
let censusLogs = [];
|
|
202
|
+
beforeEach(() => {
|
|
203
|
+
censusLogs = [];
|
|
204
|
+
// Only Date is faked: the per-day counts are real assertions, and on a live
|
|
205
|
+
// clock the two British clock-change days would produce different numbers.
|
|
206
|
+
vi.useFakeTimers({ toFake: ["Date"] });
|
|
207
|
+
vi.setSystemTime(new Date("2026-08-02T12:00:00Z"));
|
|
208
|
+
vi.spyOn(console, "error").mockImplementation((...args) => {
|
|
209
|
+
censusLogs.push(args.map(String).join(" "));
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
afterEach(() => {
|
|
213
|
+
vi.useRealTimers();
|
|
214
|
+
vi.restoreAllMocks();
|
|
215
|
+
});
|
|
216
|
+
const censusLine = () => censusLogs.find((l) => l.includes("op=fire-rate-census "));
|
|
217
|
+
it("totals the daily fires of every agent-bearing scheduled routine", async () => {
|
|
218
|
+
await auditFireRateCensus(censusDriver([censusRow(), censusRow({ recurrence: "*/15 * * * *" })]), ["acct-1111-2222"]);
|
|
219
|
+
expect(censusLine()).toContain("agentRoutines=2");
|
|
220
|
+
expect(censusLine()).toContain("agentFiresPerDay=120");
|
|
221
|
+
expect(censusLine()).toContain("ok=true");
|
|
222
|
+
});
|
|
223
|
+
it("counts a suspended routine in neither figure, because its rate is zero", async () => {
|
|
224
|
+
await auditFireRateCensus(censusDriver([censusRow(), censusRow({ eventStatus: "suspended", recurrence: "*/15 * * * *" })]), ["acct-1111-2222"]);
|
|
225
|
+
expect(censusLine()).toContain("agentRoutines=1");
|
|
226
|
+
expect(censusLine()).toContain("agentFiresPerDay=24");
|
|
227
|
+
});
|
|
228
|
+
it("emits a line for an account with no rows at all", async () => {
|
|
229
|
+
// A check that goes quiet when healthy cannot be told apart from one that
|
|
230
|
+
// stopped running.
|
|
231
|
+
await auditFireRateCensus(censusDriver([]), ["acct-1111-2222"]);
|
|
232
|
+
expect(censusLine()).toContain("agentRoutines=0");
|
|
233
|
+
expect(censusLine()).toContain("agentFiresPerDay=0");
|
|
234
|
+
expect(censusLine()).toContain("ok=true");
|
|
235
|
+
});
|
|
236
|
+
it("fails the vacuity guard when agent rows exist but none is counted", async () => {
|
|
237
|
+
// Task 2231's convention: a zero meaning "the enumeration found nothing"
|
|
238
|
+
// must not read the same as a zero meaning "there is nothing".
|
|
239
|
+
await auditFireRateCensus(censusDriver([censusRow({ eventStatus: "suspended" })]), [
|
|
240
|
+
"acct-1111-2222",
|
|
241
|
+
]);
|
|
242
|
+
expect(censusLine()).toContain("agentRoutines=0");
|
|
243
|
+
expect(censusLine()).toContain("ok=false");
|
|
244
|
+
});
|
|
245
|
+
it("names an unparsable row and keeps the rest of the total", async () => {
|
|
246
|
+
await auditFireRateCensus(censusDriver([censusRow(), censusRow({ eventId: "evt-bad", recurrence: "not a cron" })]), ["acct-1111-2222"]);
|
|
247
|
+
expect(censusLogs.find((l) => l.includes("op=fire-rate-census-unparsable"))).toContain("eventId=evt-bad");
|
|
248
|
+
expect(censusLine()).toContain("agentRoutines=1");
|
|
249
|
+
expect(censusLine()).toContain("agentFiresPerDay=24");
|
|
250
|
+
});
|
|
251
|
+
it("emits nothing when there are no local accounts", async () => {
|
|
252
|
+
await auditFireRateCensus(censusDriver([censusRow()]), []);
|
|
253
|
+
expect(censusLine()).toBeUndefined();
|
|
254
|
+
});
|
|
255
|
+
});
|
|
48
256
|
//# sourceMappingURL=schedule-audit.test.js.map
|
package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule-audit.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/schedule-audit.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schedule-audit.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/schedule-audit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,9 @@ describe("writtenFields", () => {
|
|
|
7
7
|
expect(writtenFields(["e.updatedAt = $now", "e.description = $description"]))
|
|
8
8
|
.toEqual(["description"]);
|
|
9
9
|
});
|
|
10
|
-
|
|
10
|
+
// Task 2380 took the set from four to six; the two it added are asserted
|
|
11
|
+
// separately below, so this name says which four it means.
|
|
12
|
+
it("drops the four bookkeeping properties a call writes for itself", () => {
|
|
11
13
|
const clauses = [
|
|
12
14
|
"e.updatedAt = $now",
|
|
13
15
|
"e.operatorEdited = $now",
|
|
@@ -24,6 +26,21 @@ describe("writtenFields", () => {
|
|
|
24
26
|
it("returns an empty list when only bookkeeping was written", () => {
|
|
25
27
|
expect(writtenFields(["e.updatedAt = $now"])).toEqual([]);
|
|
26
28
|
});
|
|
29
|
+
it("drops Task 2380's audit stamps, which no caller asked for", () => {
|
|
30
|
+
// `recurrencePrevious` and `recurrenceChangedAt` are written as a
|
|
31
|
+
// consequence of changing the cron, the same way `operatorEdited` is written
|
|
32
|
+
// as a consequence of setting a prompt. Naming them in the confirmation
|
|
33
|
+
// tells the agent it wrote properties it never mentioned, which is the
|
|
34
|
+
// confusion Task 2362 exists to remove.
|
|
35
|
+
const clauses = [
|
|
36
|
+
"e.updatedAt = $now",
|
|
37
|
+
"e.recurrence = $recurrence",
|
|
38
|
+
"e.nextRun = $newNextRun",
|
|
39
|
+
"e.recurrencePrevious = $recurrencePrevious",
|
|
40
|
+
"e.recurrenceChangedAt = $now",
|
|
41
|
+
];
|
|
42
|
+
expect(writtenFields(clauses)).toEqual(["recurrence", "nextRun"]);
|
|
43
|
+
});
|
|
27
44
|
});
|
|
28
45
|
describe("describeUpdate", () => {
|
|
29
46
|
it("names the fields and says the instruction did not change", () => {
|
package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-summary.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/update-summary.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,cAAc,EAA6B,MAAM,sBAAsB,CAAC;AAEhG,MAAM,EAAE,GAAG,CAAC,MAAgB,EAAE,YAAY,GAAG,KAAK,EAAwB,EAAE,CAC1E,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;AAE5C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,EAAE,8BAA8B,CAAC,CAAC,CAAC;aAC1E,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"update-summary.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/update-summary.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { type CalendarConnector } from "./connector-sync-provision.js";
|
|
2
|
+
export type ConnectorChoice = CalendarConnector | "none";
|
|
3
|
+
export interface ResolvedConnector {
|
|
4
|
+
connector: ConnectorChoice;
|
|
5
|
+
/** Named on the resolution log line when two connectors are authorised and one
|
|
6
|
+
* is unused. Null when there is nothing to skip. */
|
|
7
|
+
skipped: CalendarConnector | null;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The account's calendar connector, decided rather than chosen by a model.
|
|
11
|
+
*
|
|
12
|
+
* `detectCalendarConnectors` returns a sorted list, so google precedes m365 and
|
|
13
|
+
* the pick is deterministic. The stored `connector` is a single enum; an account
|
|
14
|
+
* holding both is real, and the skipped one is named on the resolution line so an
|
|
15
|
+
* ignored calendar is visible rather than silent.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveConnector(accountDir: string): ResolvedConnector;
|
|
18
|
+
/**
|
|
19
|
+
* The environment a provider MCP needs, assembled for the action rail.
|
|
20
|
+
*
|
|
21
|
+
* The heartbeat's cron line sets only `PLATFORM_ROOT`, `NEO4J_URI` and
|
|
22
|
+
* `MAXY_UI_INTERNAL_PORT` (create-maxy-code/src/cron-registration.ts), so a child
|
|
23
|
+
* spawned from it inherits none of the per-plugin credentials a session-manager
|
|
24
|
+
* spawn would stamp from the `PLUGIN.md` `mcp.env` block. They are read from
|
|
25
|
+
* `brand.json` instead, which is the same source those placeholders resolve from.
|
|
26
|
+
*
|
|
27
|
+
* A missing client id throws. Returning an env without one would let the provider
|
|
28
|
+
* boot, refuse the call for want of a vendor app, and be indistinguishable
|
|
29
|
+
* downstream from an account whose calendar is genuinely empty.
|
|
30
|
+
*/
|
|
31
|
+
export declare function providerEnv(platformRoot: string, accountId: string, connector: CalendarConnector): Record<string, string>;
|
|
32
|
+
export interface BusyInterval {
|
|
33
|
+
start: string;
|
|
34
|
+
end: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Calls one tool on one provider plugin and returns its parsed payload.
|
|
38
|
+
*
|
|
39
|
+
* Injected rather than imported so the read path is testable without spawning a
|
|
40
|
+
* child process; `spawnProviderCall` below is the real implementation.
|
|
41
|
+
*/
|
|
42
|
+
export type ProviderCall = (plugin: "google" | "outlook", tool: string, args: Record<string, unknown>) => Promise<unknown>;
|
|
43
|
+
export interface ReadBusyOptions {
|
|
44
|
+
connector: CalendarConnector;
|
|
45
|
+
platformRoot: string;
|
|
46
|
+
accountId: string;
|
|
47
|
+
/** Window start, canonical UTC ISO. */
|
|
48
|
+
from: string;
|
|
49
|
+
/** Window end, canonical UTC ISO. */
|
|
50
|
+
to: string;
|
|
51
|
+
call: ProviderCall;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Graph returns `scheduleItems[].start.dateTime` with a sibling `timeZone` field
|
|
55
|
+
* that the outlook plugin's tool drops, so what arrives here carries no zone
|
|
56
|
+
* designator. The window is requested in UTC, so a zone-less instant is UTC and
|
|
57
|
+
* is stamped as such. A string already carrying `Z` or an offset is left alone —
|
|
58
|
+
* re-stamping it would move the interval.
|
|
59
|
+
*/
|
|
60
|
+
export declare function normaliseGraphInstant(dateTime: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* The account's busy intervals over the window, read from its own connector.
|
|
63
|
+
*
|
|
64
|
+
* Every failure throws. Returning `[]` on a failed read would clear the stored
|
|
65
|
+
* busy set and publish the operator's booked time as free, and a booking page
|
|
66
|
+
* serving its last successful write looks correct either way — so an empty list
|
|
67
|
+
* must only ever mean the calendar is genuinely free.
|
|
68
|
+
*/
|
|
69
|
+
export declare function readConnectorBusy(opts: ReadBusyOptions): Promise<BusyInterval[]>;
|
|
70
|
+
/**
|
|
71
|
+
* A `ProviderCall` that reaches the provider plugin's own MCP server.
|
|
72
|
+
*
|
|
73
|
+
* The transport is `callPluginTool`, the one Task 2378 extracted from
|
|
74
|
+
* `dispatchAction`. Sharing it rather than writing a second one is the point:
|
|
75
|
+
* this call is spawned from the same heartbeat, so it needs the same timeout,
|
|
76
|
+
* the same `ACCOUNT_ID` scoping, the same captured child stderr, and above all
|
|
77
|
+
* the same `PLATFORM_PORT` bridge — the cron line does not export that name and
|
|
78
|
+
* every plugin resolves its loopback base URL from it, so a transport without it
|
|
79
|
+
* throws on port resolution before the tool runs.
|
|
80
|
+
*
|
|
81
|
+
* It is a spawn rather than an import because no plugin in this tree imports
|
|
82
|
+
* another plugin's source, and because the provider owns the decryption of its
|
|
83
|
+
* own tokens.
|
|
84
|
+
*/
|
|
85
|
+
export declare function spawnProviderCall(platformRoot: string, accountId: string, connector: CalendarConnector): ProviderCall;
|
|
86
|
+
//# sourceMappingURL=connector-freebusy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connector-freebusy.d.ts","sourceRoot":"","sources":["../../src/lib/connector-freebusy.ts"],"names":[],"mappings":"AAiBA,OAAO,EAA4B,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGjG,MAAM,MAAM,eAAe,GAAG,iBAAiB,GAAG,MAAM,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,eAAe,CAAC;IAC3B;yDACqD;IACrD,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,CAItE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CACzB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,iBAAiB,GAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA2BxB;AAMD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,MAAM,EAAE,QAAQ,GAAG,SAAS,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;CACpB;AAoCD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG9D;AAsED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAGtF;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,iBAAiB,GAC3B,YAAY,CA4Bd"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task 2381 — reading the account's calendar free/busy without a model turn.
|
|
3
|
+
*
|
|
4
|
+
* The "Booking calendar connector sync" routine spawned a model every 30 minutes
|
|
5
|
+
* to do two mechanical things: work out which connector the account had
|
|
6
|
+
* authorised, and read 15 days of free/busy from it. Neither is a decision. This
|
|
7
|
+
* module does both deterministically so the routine can run on the headless
|
|
8
|
+
* `action` rail.
|
|
9
|
+
*
|
|
10
|
+
* The provider is reached by SPAWNING its own MCP server, not by importing it. No
|
|
11
|
+
* plugin in this tree imports another plugin's source (the only cross-boundary
|
|
12
|
+
* imports are built artifacts under `platform/lib`), the provider owns the
|
|
13
|
+
* decryption of its own tokens, and `dispatchAction` in `check-due-events.ts`
|
|
14
|
+
* already reaches plugins exactly this way.
|
|
15
|
+
*/
|
|
16
|
+
import { readFileSync } from "node:fs";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { detectCalendarConnectors } from "./connector-sync-provision.js";
|
|
19
|
+
import { callPluginTool } from "./gate.js";
|
|
20
|
+
/**
|
|
21
|
+
* The account's calendar connector, decided rather than chosen by a model.
|
|
22
|
+
*
|
|
23
|
+
* `detectCalendarConnectors` returns a sorted list, so google precedes m365 and
|
|
24
|
+
* the pick is deterministic. The stored `connector` is a single enum; an account
|
|
25
|
+
* holding both is real, and the skipped one is named on the resolution line so an
|
|
26
|
+
* ignored calendar is visible rather than silent.
|
|
27
|
+
*/
|
|
28
|
+
export function resolveConnector(accountDir) {
|
|
29
|
+
const found = detectCalendarConnectors(accountDir);
|
|
30
|
+
if (found.length === 0)
|
|
31
|
+
return { connector: "none", skipped: null };
|
|
32
|
+
return { connector: found[0], skipped: found[1] ?? null };
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The environment a provider MCP needs, assembled for the action rail.
|
|
36
|
+
*
|
|
37
|
+
* The heartbeat's cron line sets only `PLATFORM_ROOT`, `NEO4J_URI` and
|
|
38
|
+
* `MAXY_UI_INTERNAL_PORT` (create-maxy-code/src/cron-registration.ts), so a child
|
|
39
|
+
* spawned from it inherits none of the per-plugin credentials a session-manager
|
|
40
|
+
* spawn would stamp from the `PLUGIN.md` `mcp.env` block. They are read from
|
|
41
|
+
* `brand.json` instead, which is the same source those placeholders resolve from.
|
|
42
|
+
*
|
|
43
|
+
* A missing client id throws. Returning an env without one would let the provider
|
|
44
|
+
* boot, refuse the call for want of a vendor app, and be indistinguishable
|
|
45
|
+
* downstream from an account whose calendar is genuinely empty.
|
|
46
|
+
*/
|
|
47
|
+
export function providerEnv(platformRoot, accountId, connector) {
|
|
48
|
+
const brandPath = join(platformRoot, "config", "brand.json");
|
|
49
|
+
let brand;
|
|
50
|
+
try {
|
|
51
|
+
brand = JSON.parse(readFileSync(brandPath, "utf-8"));
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
throw new Error(`cannot read ${brandPath}: ${err.message}`);
|
|
55
|
+
}
|
|
56
|
+
const str = (v) => (typeof v === "string" ? v : "");
|
|
57
|
+
const env = { PLATFORM_ROOT: platformRoot, ACCOUNT_ID: accountId };
|
|
58
|
+
if (connector === "google") {
|
|
59
|
+
const id = str(brand.googleClientId);
|
|
60
|
+
const secret = str(brand.googleClientSecret);
|
|
61
|
+
if (!id || !secret) {
|
|
62
|
+
throw new Error("this brand ships no Google vendor app (client id and secret must both be present)");
|
|
63
|
+
}
|
|
64
|
+
env.GOOGLE_CLIENT_ID = id;
|
|
65
|
+
env.GOOGLE_CLIENT_SECRET = secret;
|
|
66
|
+
return env;
|
|
67
|
+
}
|
|
68
|
+
const id = str(brand.outlookClientId);
|
|
69
|
+
if (!id)
|
|
70
|
+
throw new Error("this brand ships no Outlook vendor app (outlookClientId is empty)");
|
|
71
|
+
env.OUTLOOK_CLIENT_ID = id;
|
|
72
|
+
env.OUTLOOK_TENANT_ID = str(brand.outlookTenantId) || "common";
|
|
73
|
+
return env;
|
|
74
|
+
}
|
|
75
|
+
function isInterval(v) {
|
|
76
|
+
const o = v;
|
|
77
|
+
return !!o && typeof o.start === "string" && typeof o.end === "string";
|
|
78
|
+
}
|
|
79
|
+
/** Google returns one busy list per requested calendar; with no `calendars`
|
|
80
|
+
* argument that is the account's primary calendar alone. Every list is
|
|
81
|
+
* flattened: the booking page blocks on any busy time, whichever calendar it
|
|
82
|
+
* came from. */
|
|
83
|
+
async function readGoogleBusy(opts) {
|
|
84
|
+
const raw = await opts.call("google", "google-calendar-freebusy", {
|
|
85
|
+
start: opts.from,
|
|
86
|
+
end: opts.to,
|
|
87
|
+
});
|
|
88
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
89
|
+
throw new Error(`unexpected google-calendar-freebusy payload: ${JSON.stringify(raw).slice(0, 200)}`);
|
|
90
|
+
}
|
|
91
|
+
const out = [];
|
|
92
|
+
for (const slots of Object.values(raw)) {
|
|
93
|
+
if (!Array.isArray(slots)) {
|
|
94
|
+
throw new Error("unexpected google-calendar-freebusy payload: calendar value is not an array");
|
|
95
|
+
}
|
|
96
|
+
for (const s of slots) {
|
|
97
|
+
if (!isInterval(s)) {
|
|
98
|
+
throw new Error("unexpected google-calendar-freebusy payload: busy entry has no start/end");
|
|
99
|
+
}
|
|
100
|
+
out.push({ start: s.start, end: s.end });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return out;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Graph returns `scheduleItems[].start.dateTime` with a sibling `timeZone` field
|
|
107
|
+
* that the outlook plugin's tool drops, so what arrives here carries no zone
|
|
108
|
+
* designator. The window is requested in UTC, so a zone-less instant is UTC and
|
|
109
|
+
* is stamped as such. A string already carrying `Z` or an offset is left alone —
|
|
110
|
+
* re-stamping it would move the interval.
|
|
111
|
+
*/
|
|
112
|
+
export function normaliseGraphInstant(dateTime) {
|
|
113
|
+
if (/(Z|[+-]\d{2}:?\d{2})$/.test(dateTime))
|
|
114
|
+
return dateTime;
|
|
115
|
+
return `${dateTime}Z`;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* The one mailbox whose schedule this account's busy sync reads.
|
|
119
|
+
*
|
|
120
|
+
* The mailbox directory name under `secrets/outlook/mailboxes/` is a sanitised
|
|
121
|
+
* `graphUserId` and the address lives inside the encrypted token blob, so it
|
|
122
|
+
* cannot be read off disk by a process that is not the outlook plugin. Zero or
|
|
123
|
+
* two-or-more addressable mailboxes both throw, mirroring the outlook plugin's
|
|
124
|
+
* own sole-mailbox rule: guessing one would publish the wrong person's free time.
|
|
125
|
+
*/
|
|
126
|
+
async function resolveM365Address(opts) {
|
|
127
|
+
const raw = await opts.call("outlook", "outlook-mailbox-list", {});
|
|
128
|
+
const rows = raw?.mailboxes;
|
|
129
|
+
const addressable = (Array.isArray(rows) ? rows : [])
|
|
130
|
+
.filter((m) => m.status === "ok" && typeof m.mail === "string" && m.mail.length > 0)
|
|
131
|
+
.map((m) => m.mail);
|
|
132
|
+
if (addressable.length === 0) {
|
|
133
|
+
throw new Error("no addressable Outlook mailbox for this account; run outlook-account-register");
|
|
134
|
+
}
|
|
135
|
+
if (addressable.length > 1) {
|
|
136
|
+
throw new Error(`two or more Outlook mailboxes are addressable (${addressable.join(", ")}); the busy sync cannot choose between them`);
|
|
137
|
+
}
|
|
138
|
+
return addressable[0];
|
|
139
|
+
}
|
|
140
|
+
async function readM365Busy(opts) {
|
|
141
|
+
const address = await resolveM365Address(opts);
|
|
142
|
+
const raw = await opts.call("outlook", "outlook-calendar-freebusy", {
|
|
143
|
+
schedules: [address],
|
|
144
|
+
start: { dateTime: opts.from, timeZone: "UTC" },
|
|
145
|
+
end: { dateTime: opts.to, timeZone: "UTC" },
|
|
146
|
+
});
|
|
147
|
+
const availability = raw?.availability;
|
|
148
|
+
if (!Array.isArray(availability)) {
|
|
149
|
+
throw new Error(`unexpected outlook-calendar-freebusy payload: ${JSON.stringify(raw).slice(0, 200)}`);
|
|
150
|
+
}
|
|
151
|
+
const out = [];
|
|
152
|
+
let loggedRaw = false;
|
|
153
|
+
for (const entry of availability) {
|
|
154
|
+
// An address Graph could not resolve comes back with an error and an EMPTY
|
|
155
|
+
// busy list, which is byte-identical to a free calendar. Reading it as free
|
|
156
|
+
// would publish the operator's booked time as available.
|
|
157
|
+
if (entry.error) {
|
|
158
|
+
throw new Error(`Graph could not resolve the mailbox schedule: ${String(entry.error)}`);
|
|
159
|
+
}
|
|
160
|
+
for (const b of Array.isArray(entry.busy) ? entry.busy : []) {
|
|
161
|
+
if (!isInterval(b)) {
|
|
162
|
+
throw new Error("unexpected outlook-calendar-freebusy payload: busy entry has no start/end");
|
|
163
|
+
}
|
|
164
|
+
if (!loggedRaw) {
|
|
165
|
+
// One raw line per read. The UTC reading above is an assumption about a
|
|
166
|
+
// Graph response this tree holds no fixture for; the unparsed value makes
|
|
167
|
+
// a wrong assumption visible in the log rather than silently shifting
|
|
168
|
+
// every slot on the booking page by the account's offset.
|
|
169
|
+
console.error(`[connector-busy-sync] op=m365-raw-interval start=${JSON.stringify(b.start)} end=${JSON.stringify(b.end)}`);
|
|
170
|
+
loggedRaw = true;
|
|
171
|
+
}
|
|
172
|
+
out.push({ start: normaliseGraphInstant(b.start), end: normaliseGraphInstant(b.end) });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return out;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* The account's busy intervals over the window, read from its own connector.
|
|
179
|
+
*
|
|
180
|
+
* Every failure throws. Returning `[]` on a failed read would clear the stored
|
|
181
|
+
* busy set and publish the operator's booked time as free, and a booking page
|
|
182
|
+
* serving its last successful write looks correct either way — so an empty list
|
|
183
|
+
* must only ever mean the calendar is genuinely free.
|
|
184
|
+
*/
|
|
185
|
+
export async function readConnectorBusy(opts) {
|
|
186
|
+
if (opts.connector === "google")
|
|
187
|
+
return readGoogleBusy(opts);
|
|
188
|
+
return readM365Busy(opts);
|
|
189
|
+
}
|
|
190
|
+
// ---------------------------------------------------------------------------
|
|
191
|
+
// The provider spawn
|
|
192
|
+
// ---------------------------------------------------------------------------
|
|
193
|
+
/**
|
|
194
|
+
* A `ProviderCall` that reaches the provider plugin's own MCP server.
|
|
195
|
+
*
|
|
196
|
+
* The transport is `callPluginTool`, the one Task 2378 extracted from
|
|
197
|
+
* `dispatchAction`. Sharing it rather than writing a second one is the point:
|
|
198
|
+
* this call is spawned from the same heartbeat, so it needs the same timeout,
|
|
199
|
+
* the same `ACCOUNT_ID` scoping, the same captured child stderr, and above all
|
|
200
|
+
* the same `PLATFORM_PORT` bridge — the cron line does not export that name and
|
|
201
|
+
* every plugin resolves its loopback base URL from it, so a transport without it
|
|
202
|
+
* throws on port resolution before the tool runs.
|
|
203
|
+
*
|
|
204
|
+
* It is a spawn rather than an import because no plugin in this tree imports
|
|
205
|
+
* another plugin's source, and because the provider owns the decryption of its
|
|
206
|
+
* own tokens.
|
|
207
|
+
*/
|
|
208
|
+
export function spawnProviderCall(platformRoot, accountId, connector) {
|
|
209
|
+
// Resolved once, outside the returned closure: a brand shipping no vendor app
|
|
210
|
+
// for this connector must fail before any child is spawned.
|
|
211
|
+
const credentials = providerEnv(platformRoot, accountId, connector);
|
|
212
|
+
return async (plugin, tool, args) => {
|
|
213
|
+
let call;
|
|
214
|
+
try {
|
|
215
|
+
call = await callPluginTool(plugin, tool, JSON.stringify(args), accountId, credentials);
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
// A transport failure carries the child's stderr, which is where a
|
|
219
|
+
// provider's own refusal reason (an expired refresh token, a missing
|
|
220
|
+
// vendor app) is written. Dropping it would leave `op=read-failed`
|
|
221
|
+
// reporting only that something went wrong.
|
|
222
|
+
const e = err;
|
|
223
|
+
const detail = e.childStderr ? `${e.message} — child stderr: ${e.childStderr.trim()}` : String(e.message);
|
|
224
|
+
throw new Error(`${tool} failed: ${detail}`);
|
|
225
|
+
}
|
|
226
|
+
const text = (Array.isArray(call.result.content) ? call.result.content : [])
|
|
227
|
+
.filter((c) => c.type === "text")
|
|
228
|
+
.map((c) => String(c.text))
|
|
229
|
+
.join("\n");
|
|
230
|
+
if (call.result.isError === true)
|
|
231
|
+
throw new Error(`${tool} returned an error: ${text}`);
|
|
232
|
+
try {
|
|
233
|
+
return JSON.parse(text);
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
throw new Error(`${tool} returned a non-JSON payload: ${text.slice(0, 200)}`);
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=connector-freebusy.js.map
|