@rubytech/create-maxy-code 0.1.342 → 0.1.344
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/config/brand.json +4 -1
- package/payload/platform/neo4j/schema.cypher +9 -5
- package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/admin/PLUGIN.md +4 -1
- package/payload/platform/plugins/admin/mcp/dist/__tests__/admin-hostname.test.d.ts +2 -0
- package/payload/platform/plugins/admin/mcp/dist/__tests__/admin-hostname.test.d.ts.map +1 -0
- package/payload/platform/plugins/admin/mcp/dist/__tests__/admin-hostname.test.js +175 -0
- package/payload/platform/plugins/admin/mcp/dist/__tests__/admin-hostname.test.js.map +1 -0
- package/payload/platform/plugins/admin/mcp/dist/index.js +33 -0
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/lib/admin-hostname.d.ts +15 -0
- package/payload/platform/plugins/admin/mcp/dist/lib/admin-hostname.d.ts.map +1 -0
- package/payload/platform/plugins/admin/mcp/dist/lib/admin-hostname.js +86 -0
- package/payload/platform/plugins/admin/mcp/dist/lib/admin-hostname.js.map +1 -0
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +90 -1
- package/payload/platform/plugins/cloudflare/skills/calendar-site/SKILL.md +82 -0
- package/payload/platform/plugins/cloudflare/skills/calendar-site/template/functions/api/book.ts +112 -0
- package/payload/platform/plugins/cloudflare/skills/calendar-site/template/public/booking.css +100 -0
- package/payload/platform/plugins/cloudflare/skills/calendar-site/template/public/booking.js +155 -0
- package/payload/platform/plugins/cloudflare/skills/calendar-site/template/public/index.html +47 -0
- package/payload/platform/plugins/cloudflare/skills/calendar-site/template/schema.sql +18 -0
- package/payload/platform/plugins/cloudflare/skills/calendar-site/template/wrangler.toml +14 -0
- package/payload/platform/plugins/docs/PLUGIN.md +1 -0
- package/payload/platform/plugins/docs/references/admin-ui.md +26 -0
- package/payload/platform/plugins/docs/references/calendar-booking.md +56 -0
- package/payload/platform/plugins/docs/references/internals.md +2 -0
- package/payload/platform/plugins/scheduling/PLUGIN.md +23 -0
- package/payload/platform/plugins/scheduling/mcp/dist/index.js +19 -5
- package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-notify.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-notify.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-notify.test.js +45 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-notify.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-reconcile.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-reconcile.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-reconcile.test.js +89 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-reconcile.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/meeting-write.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/meeting-write.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/meeting-write.test.js +118 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/meeting-write.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-classify.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-classify.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-classify.test.js +59 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-classify.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-notify.d.ts +22 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-notify.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-notify.js +31 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-notify.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-reconcile.d.ts +28 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-reconcile.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-reconcile.js +70 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-reconcile.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/meeting-write.d.ts +35 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/meeting-write.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/meeting-write.js +123 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/meeting-write.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-classify.d.ts +23 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-classify.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-classify.js +38 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-classify.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.d.ts +21 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.js +280 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts +11 -1
- 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 +34 -2
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.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 +1 -0
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
- package/payload/platform/templates/specialists/agents/personal-assistant.md +2 -0
- package/payload/server/{chunk-5BG6CHGH.js → chunk-QAKVFSEJ.js} +15 -0
- package/payload/server/maxy-edge.js +1 -1
- package/payload/server/public/assets/{AdminLoginScreens-Brx8CmXN.js → AdminLoginScreens-CZqsFfP0.js} +1 -1
- package/payload/server/public/assets/AdminShell-DnhBRZv5.js +1 -0
- package/payload/server/public/assets/{Checkbox-aePjWzRH.js → Checkbox-D0FwyuVg.js} +1 -1
- package/payload/server/public/assets/{OperatorConversations-BMIZQR9t.css → OperatorConversations-BG9GrxQU.css} +1 -1
- package/payload/server/public/assets/OperatorConversations-dt0q8mjv.js +9 -0
- package/payload/server/public/assets/admin-CCzmqd1F.js +1 -0
- package/payload/server/public/assets/{arc-CxLB9WCE.js → arc-DpkSQNto.js} +1 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-Csj53u5T.js +1 -0
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-D-EdJPSY.js → architectureDiagram-Q4EWVU46-Bw7Yq8O9.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-CXx9RgCm.js → blockDiagram-DXYQGD6D-BBtJQFSz.js} +1 -1
- package/payload/server/public/assets/{browser-Bp5kGgyr.js → browser-kmrJq69n.js} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-RFBXEe0B.js → c4Diagram-AHTNJAMY-JAMgxzOr.js} +1 -1
- package/payload/server/public/assets/calendar-BWf5qrIH.js +1 -0
- package/payload/server/public/assets/channel-BUQUAUts.js +1 -0
- package/payload/server/public/assets/chat-C2e06_q0.js +1 -0
- package/payload/server/public/assets/{chunk-2KRD3SAO-DBqAFwK9.js → chunk-2KRD3SAO-eDugsc2L.js} +1 -1
- package/payload/server/public/assets/{chunk-336JU56O-DdnFEz6R.js → chunk-336JU56O-BXfECwdC.js} +2 -2
- package/payload/server/public/assets/chunk-426QAEUC-CdknReB2.js +1 -0
- package/payload/server/public/assets/{chunk-4BX2VUAB-cnw-3Gbs.js → chunk-4BX2VUAB-CByVeKCY.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-BnqJ0bDc.js → chunk-4TB4RGXK-CpY0DcUB.js} +1 -1
- package/payload/server/public/assets/{chunk-55IACEB6-BwyHvvzo.js → chunk-55IACEB6-C3YxgyIb.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-DXA9U02I.js → chunk-5FUZZQ4R-Bc0d7j8A.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-D78bZ_8D.js → chunk-5PVQY5BW-CTUGMRIa.js} +1 -1
- package/payload/server/public/assets/{chunk-67CJDMHE-CtE_Mgv7.js → chunk-67CJDMHE-CbdPnpLd.js} +1 -1
- package/payload/server/public/assets/{chunk-7N4EOEYR-CUZDaySl.js → chunk-7N4EOEYR-Cjl2kevz.js} +1 -1
- package/payload/server/public/assets/{chunk-AA7GKIK3-CYQ3jO4X.js → chunk-AA7GKIK3-BgozIh5p.js} +1 -1
- package/payload/server/public/assets/{chunk-BSJP7CBP-BbA_HyTR.js → chunk-BSJP7CBP-6Ufq45NW.js} +1 -1
- package/payload/server/public/assets/{chunk-CIAEETIT-D7_YqRhG.js → chunk-CIAEETIT-BhhYuMnA.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-B23LrtSw.js → chunk-EDXVE4YY-BfaJ3yDD.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-D3fTHYKN.js → chunk-ENJZ2VHE-C7-hIGVC.js} +1 -1
- package/payload/server/public/assets/{chunk-FMBD7UC4-DFAA2tyh.js → chunk-FMBD7UC4-BQvvyocF.js} +1 -1
- package/payload/server/public/assets/{chunk-FOC6F5B3-BF4IHvlI.js → chunk-FOC6F5B3-C6rBDOxH.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-DBUGemHy.js → chunk-ICPOFSXX-BjOJvkVa.js} +2 -2
- package/payload/server/public/assets/{chunk-K5T4RW27-rMMs08Eh.js → chunk-K5T4RW27-kKowRHhn.js} +1 -1
- package/payload/server/public/assets/{chunk-KGLVRYIC-BD2r8R2G.js → chunk-KGLVRYIC-bAEV_5eH.js} +1 -1
- package/payload/server/public/assets/{chunk-LIHQZDEY-D4sYTTwM.js → chunk-LIHQZDEY-BLvsQAfg.js} +1 -1
- package/payload/server/public/assets/{chunk-ORNJ4GCN-CAs_uFzb.js → chunk-ORNJ4GCN-BzYZfPZ7.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-Fkp-2ORc.js → chunk-OYMX7WX6-CL7WRw42.js} +1 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-8tHoEDE9.js +1 -0
- package/payload/server/public/assets/{chunk-U2HBQHQK-D_pxZh25.js → chunk-U2HBQHQK-BdcVGjau.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-CeVmvvRf.js → chunk-X2U36JSP-C0CL_Jin.js} +1 -1
- package/payload/server/public/assets/{chunk-XPW4576I-iWP54fKp.js → chunk-XPW4576I-CsV7CUxH.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-CNtbWJNN.js → chunk-YZCP3GAM-Cj0_fLkR.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-BmlFjU_9.js → chunk-ZZ45TVLE-DLuquyoY.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-BEGZ3DLg.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DsLxnm5U.js +1 -0
- package/payload/server/public/assets/clone-uiXbH_kh.js +1 -0
- package/payload/server/public/assets/{cose-bilkent-S5V4N54A-C7YmF1Pg.js → cose-bilkent-S5V4N54A-BU3EOLXX.js} +1 -1
- package/payload/server/public/assets/{dagre-BAmiDDtR.js → dagre-BRq8C9NU.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-Ca3ESJhc.js → dagre-KV5264BT-CoCAYhFc.js} +1 -1
- package/payload/server/public/assets/data-CZKWSjEH.js +1 -0
- package/payload/server/public/assets/{diagram-5BDNPKRD-BgT1ORf2.js → diagram-5BDNPKRD-DBy5GNaQ.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-BTaUIiem.js → diagram-G4DWMVQ6-l93MsBLv.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-Bdb2g6Uo.js → diagram-MMDJMWI5-BIfXkVlL.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-CkLGC0zZ.js → diagram-TYMM5635-BuTJLBny.js} +1 -1
- package/payload/server/public/assets/{dist-Bkbhs3jw.js → dist-CtUNt3w8.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-D_sj4DMg.js → erDiagram-SMLLAGMA-BwPxWDbP.js} +1 -1
- package/payload/server/public/assets/{flatten-E2Sr0FeD.js → flatten-DtM0XAMt.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-iLERoZTe.js → flowDiagram-DWJPFMVM-BhPtHXMR.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-D60hjMBy.js → ganttDiagram-T4ZO3ILL-BlXjprdD.js} +1 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-D_2KrZoP.js +1 -0
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-Di0XM6fi.js → gitGraphDiagram-UUTBAWPF-BW36BDiu.js} +1 -1
- package/payload/server/public/assets/{graph-Bnsvbnkf.js → graph-BxErrIf_.js} +3 -3
- package/payload/server/public/assets/{graph-labels-jduMtwXb.js → graph-labels-Ch5_g_JF.js} +1 -1
- package/payload/server/public/assets/{graphlib-C8fUP7uV.js → graphlib-Bjg3Tq-k.js} +1 -1
- package/payload/server/public/assets/info-OMHHGYJF-BP2TNwQ4.js +1 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-D1kDtBOY.js +2 -0
- package/payload/server/public/assets/{isEmpty-CLz-UprQ.js → isEmpty-D__iH1WQ.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-CwgI4B5Z.js → ishikawaDiagram-UXIWVN3A-CmB-bA_O.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-CxBu-tze.js → journeyDiagram-VCZTEJTY-Bt1fJKmc.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-D2qlheA5.js → kanban-definition-6JOO6SKY-DVbksz_J.js} +1 -1
- package/payload/server/public/assets/{line-Bdod7uzQ.js → line-BX2Ugx3B.js} +1 -1
- package/payload/server/public/assets/{linear-BiVe6QzC.js → linear-Bdc-QJWI.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-xZN7hC6M.js → mermaid-parser.core-qv1e-J5x.js} +2 -2
- package/payload/server/public/assets/{mermaid.core-D0IylAac.js → mermaid.core-C_d9YQX_.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-J_Szhwf1.js → mindmap-definition-QFDTVHPH-DwKGvF14.js} +1 -1
- package/payload/server/public/assets/operator-CdlBsCdn.js +1 -0
- package/payload/server/public/assets/{ordinal-5RtyPJVt.js → ordinal-BRQ5CzZY.js} +1 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-BDg8fde8.js +1 -0
- package/payload/server/public/assets/{page-BT9hkXHm.js → page-DzsVxvM6.js} +3 -3
- package/payload/server/public/assets/pie-ZZUOXDRM-CXDyYMkZ.js +1 -0
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-CV5DxUVx.js → pieDiagram-DEJITSTG-dUvQC_4S.js} +1 -1
- package/payload/server/public/assets/{public-DvL1Zov1.js → public-BzVhn2va.js} +1 -1
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-BsFMVizF.js → quadrantDiagram-34T5L4WZ-CebX_oPa.js} +1 -1
- package/payload/server/public/assets/radar-PYXPWWZC-xen_zv8F.js +1 -0
- package/payload/server/public/assets/{reduce-B3Mw_0s1.js → reduce-CkcXOmmJ.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-C5eRRvGc.js → requirementDiagram-MS252O5E-h2euIqGj.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-CJYv5gpw.js → sankeyDiagram-XADWPNL6-DCii3fkF.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-B25563_2.js → sequenceDiagram-FGHM5R23-CQSGYmlq.js} +1 -1
- package/payload/server/public/assets/{src-BKOAoFQc.js → src-48kCpScq.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BLyNJYOA.js → stateDiagram-FHFEXIEX-CVtU0iXH.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BywcXjtb.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-D-HgOM6Q.js → timeline-definition-GMOUNBTQ-ChvsBltI.js} +1 -1
- package/payload/server/public/assets/treeView-SZITEDCU-2FBf_1It.js +1 -0
- package/payload/server/public/assets/treemap-W4RFUUIX-BDdb30P-.js +1 -0
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-Cw1JElYp.js → vennDiagram-DHZGUBPP-e-EZiiba.js} +1 -1
- package/payload/server/public/assets/wardley-RL74JXVD-BLq5MxjR.js +1 -0
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BqMWzEko.js → wardleyDiagram-NUSXRM2D-4JaRn1s5.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-DBp71TLT.js → xychartDiagram-5P7HB3ND-kxwmCNuM.js} +1 -1
- package/payload/server/public/brand/maxy-app-icon-192.png +0 -0
- package/payload/server/public/brand/maxy-app-icon-512.png +0 -0
- package/payload/server/public/brand/maxy-app-icon-maskable-512.png +0 -0
- package/payload/server/public/browser.html +5 -5
- package/payload/server/public/calendar.html +17 -0
- package/payload/server/public/chat.html +8 -8
- package/payload/server/public/data.html +5 -5
- package/payload/server/public/graph.html +7 -7
- package/payload/server/public/index.html +8 -8
- package/payload/server/public/operator.html +10 -10
- package/payload/server/public/public.html +8 -8
- package/payload/server/server.js +623 -190
- package/payload/server/public/assets/AdminShell-CHZMDX2u.js +0 -1
- package/payload/server/public/assets/OperatorConversations-DpjPPIOp.js +0 -9
- package/payload/server/public/assets/admin-DIDvfti6.js +0 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-DN-MYxff.js +0 -1
- package/payload/server/public/assets/channel-y27xl53N.js +0 -1
- package/payload/server/public/assets/chat-C0IWx7FL.js +0 -1
- package/payload/server/public/assets/chunk-426QAEUC-D8Iwaegm.js +0 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-qHqDpwz3.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-DgVoYWhO.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-C0WNP3uN.js +0 -1
- package/payload/server/public/assets/clone-D50F_pvg.js +0 -1
- package/payload/server/public/assets/data-RsMye_06.js +0 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-D-L2yzYf.js +0 -1
- package/payload/server/public/assets/info-OMHHGYJF-BQn6jndO.js +0 -1
- package/payload/server/public/assets/infoDiagram-42DDH7IO-BwMdbiXg.js +0 -2
- package/payload/server/public/assets/operator-9K-TElDd.js +0 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-DmkQBx4h.js +0 -1
- package/payload/server/public/assets/pie-ZZUOXDRM-DDnxYUBm.js +0 -1
- package/payload/server/public/assets/radar-PYXPWWZC-7H4k0ChM.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BSVuxZxz.js +0 -1
- package/payload/server/public/assets/treeView-SZITEDCU-BLXWTQtW.js +0 -1
- package/payload/server/public/assets/treemap-W4RFUUIX-DiePDF5d.js +0 -1
- package/payload/server/public/assets/wardley-RL74JXVD-OSUWK5LN.js +0 -1
- /package/payload/server/public/assets/{_baseFor-DVaNaTfF.js → _baseFor-SRtUHe7G.js} +0 -0
- /package/payload/server/public/assets/{admin-types-CJrGd46U.js → admin-types-Dg11L4MQ.js} +0 -0
- /package/payload/server/public/assets/{array-8_H1156C.js → array-BpsnM-Py.js} +0 -0
- /package/payload/server/public/assets/{chunk-Pqm5yXtL.js → chunk-CAM3fms7.js} +0 -0
- /package/payload/server/public/assets/{cytoscape.esm-h10p_6j-.js → cytoscape.esm-D4Rl1H5h.js} +0 -0
- /package/payload/server/public/assets/{defaultLocale-pD7tFa1r.js → defaultLocale-C7sQPl-O.js} +0 -0
- /package/payload/server/public/assets/{init-CwJ4b81e.js → init-BydxaDEV.js} +0 -0
- /package/payload/server/public/assets/{katex-DJPjIBAI.js → katex-B0fVeDx4.js} +0 -0
- /package/payload/server/public/assets/{path-CK8wrAxY.js → path-jlWYQ2i9.js} +0 -0
- /package/payload/server/public/assets/{preload-helper-Bf_JiD2A.js → preload-helper-uTix4PVD.js} +0 -0
- /package/payload/server/public/assets/{rough.esm-Dwml_la6.js → rough.esm-c4PR5shF.js} +0 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// Task 1023. Writes a conversationally-booked :Meeting the same shape ICS-import
|
|
2
|
+
// and booking-reconcile write, so the same real meeting never produces both an
|
|
3
|
+
// :Event and a :Meeting. Idempotent: the MERGE is keyed on (accountId, uid)
|
|
4
|
+
// where uid is a deterministic content hash of (accountId, title, startDate), so
|
|
5
|
+
// re-running the identical request writes no duplicate.
|
|
6
|
+
//
|
|
7
|
+
// Attendee linkage follows the same care as ics-graph-ingest / booking-reconcile:
|
|
8
|
+
// Person.email is globally unique, so a counterparty is matched/created in one
|
|
9
|
+
// atomic MERGE on email and the ATTENDED edge is written only when the resolved
|
|
10
|
+
// Person belongs to this account — a foreign-account person is never relabelled.
|
|
11
|
+
// A counterparty already resolved to a nodeId is linked directly (same-account
|
|
12
|
+
// guard); a name-only attendee carries no link.
|
|
13
|
+
import { createHash } from "node:crypto";
|
|
14
|
+
/**
|
|
15
|
+
* Deterministic uid for a conversationally-booked meeting. ICS uses the VEVENT
|
|
16
|
+
* UID and booking uses 'booking-<id>'; a conversational meeting has no external
|
|
17
|
+
* id, so the natural key is a content hash of the account, the normalized title,
|
|
18
|
+
* and the start. Re-running the identical request yields the same uid and the
|
|
19
|
+
* MERGE matches the existing node.
|
|
20
|
+
*/
|
|
21
|
+
export function meetingUid(accountId, name, startDate) {
|
|
22
|
+
const basis = `${accountId}|${name.trim().toLowerCase()}|${startDate}`;
|
|
23
|
+
return "sched-" + createHash("sha256").update(basis).digest("hex").slice(0, 32);
|
|
24
|
+
}
|
|
25
|
+
export async function writeMeeting(session, params) {
|
|
26
|
+
const { accountId, name, startDate, endDate, location, description, timezone, sessionKey, createdBy } = params;
|
|
27
|
+
const uid = meetingUid(accountId, name, startDate);
|
|
28
|
+
const meetingRes = await session.run(`MERGE (m:Meeting {accountId: $accountId, uid: $uid})
|
|
29
|
+
ON CREATE SET m.title = $title,
|
|
30
|
+
m.startsAt = datetime($startsAt),
|
|
31
|
+
m.endsAt = CASE WHEN $endsAt IS NULL THEN null ELSE datetime($endsAt) END,
|
|
32
|
+
m.location = $location,
|
|
33
|
+
m.description = $description,
|
|
34
|
+
m.timezone = $timezone,
|
|
35
|
+
m.isAllDay = false,
|
|
36
|
+
m.scope = 'admin',
|
|
37
|
+
m.source = 'schedule-event',
|
|
38
|
+
m.createdAt = datetime(),
|
|
39
|
+
m.updatedAt = datetime(),
|
|
40
|
+
m.createdByAgent = $createdByAgent,
|
|
41
|
+
m.createdBySession = $createdBySession,
|
|
42
|
+
m.createdByTool = $createdByTool,
|
|
43
|
+
m.createdBySource = 'schedule-event',
|
|
44
|
+
m._created = true
|
|
45
|
+
ON MATCH SET m.title = $title,
|
|
46
|
+
m.startsAt = datetime($startsAt),
|
|
47
|
+
m.endsAt = CASE WHEN $endsAt IS NULL THEN null ELSE datetime($endsAt) END,
|
|
48
|
+
m.location = $location,
|
|
49
|
+
m.description = $description,
|
|
50
|
+
m.timezone = $timezone,
|
|
51
|
+
m.updatedAt = datetime(),
|
|
52
|
+
m._created = false
|
|
53
|
+
WITH m, m._created AS created
|
|
54
|
+
REMOVE m._created
|
|
55
|
+
RETURN created, elementId(m) AS meetingId`, {
|
|
56
|
+
accountId,
|
|
57
|
+
uid,
|
|
58
|
+
title: name,
|
|
59
|
+
startsAt: startDate,
|
|
60
|
+
endsAt: endDate ?? null,
|
|
61
|
+
location: location ?? null,
|
|
62
|
+
description: description ?? null,
|
|
63
|
+
timezone: timezone ?? null,
|
|
64
|
+
createdByAgent: createdBy.agent,
|
|
65
|
+
createdBySession: createdBy.session,
|
|
66
|
+
createdByTool: createdBy.tool,
|
|
67
|
+
});
|
|
68
|
+
const created = meetingRes.records[0].get("created");
|
|
69
|
+
const meetingId = meetingRes.records[0].get("meetingId");
|
|
70
|
+
// Provenance: a conversationally-created meeting traces to the session that
|
|
71
|
+
// booked it. PART_OF is written only when the session's Conversation exists.
|
|
72
|
+
if (sessionKey) {
|
|
73
|
+
await session.run(`MATCH (m:Meeting) WHERE elementId(m) = $meetingId
|
|
74
|
+
MATCH (c:Conversation {sessionId: $sessionKey})
|
|
75
|
+
MERGE (m)-[r:PART_OF]->(c)
|
|
76
|
+
ON CREATE SET r.createdAt = datetime()`, { meetingId, sessionKey });
|
|
77
|
+
}
|
|
78
|
+
let attendeesLinked = 0;
|
|
79
|
+
let crossAccountSkipped = 0;
|
|
80
|
+
for (const attendee of params.attendees ?? []) {
|
|
81
|
+
const email = attendee.email?.trim();
|
|
82
|
+
const nodeId = attendee.nodeId?.trim();
|
|
83
|
+
if (nodeId) {
|
|
84
|
+
// The same-account guard lives in the MATCH: a foreign-account or missing
|
|
85
|
+
// Person yields zero rows, so RETURN true is reached only when the link
|
|
86
|
+
// was made. (Reading an aggregate `count(r)` would hand back a driver
|
|
87
|
+
// Integer whose truthiness is unreliable in JS.)
|
|
88
|
+
const res = await session.run(`MATCH (m:Meeting) WHERE elementId(m) = $meetingId
|
|
89
|
+
MATCH (p:Person) WHERE elementId(p) = $nodeId AND p.accountId = $accountId
|
|
90
|
+
MERGE (p)-[r:ATTENDED]->(m)
|
|
91
|
+
ON CREATE SET r.role = 'attendee', r.createdAt = datetime(), r.createdBySource = 'schedule-event'
|
|
92
|
+
RETURN true AS linked`, { meetingId, nodeId, accountId });
|
|
93
|
+
const linked = res.records[0]?.get("linked") === true;
|
|
94
|
+
if (linked)
|
|
95
|
+
attendeesLinked++;
|
|
96
|
+
else
|
|
97
|
+
crossAccountSkipped++;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (email) {
|
|
101
|
+
const res = await session.run(`MATCH (m:Meeting) WHERE elementId(m) = $meetingId
|
|
102
|
+
MERGE (p:Person {email: $email})
|
|
103
|
+
ON CREATE SET p.accountId = $accountId,
|
|
104
|
+
p.displayName = $name,
|
|
105
|
+
p.scope = 'admin',
|
|
106
|
+
p.source = 'schedule-event',
|
|
107
|
+
p.createdAt = datetime()
|
|
108
|
+
FOREACH (_ IN CASE WHEN p.accountId = $accountId THEN [1] ELSE [] END |
|
|
109
|
+
MERGE (p)-[r:ATTENDED]->(m)
|
|
110
|
+
ON CREATE SET r.role = 'attendee', r.createdAt = datetime(), r.createdBySource = 'schedule-event')
|
|
111
|
+
RETURN p.accountId = $accountId AS linked`, { meetingId, email: email.toLowerCase(), accountId, name: attendee.name ?? email });
|
|
112
|
+
const linked = res.records[0]?.get("linked") === true;
|
|
113
|
+
if (linked)
|
|
114
|
+
attendeesLinked++;
|
|
115
|
+
else
|
|
116
|
+
crossAccountSkipped++;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
// name-only attendee: informational, no link.
|
|
120
|
+
}
|
|
121
|
+
return { meetingId, uid, created, attendeesLinked, crossAccountSkipped };
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=meeting-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting-write.js","sourceRoot":"","sources":["../../src/lib/meeting-write.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface ScheduleAttendee {
|
|
2
|
+
email?: string;
|
|
3
|
+
name?: string;
|
|
4
|
+
nodeId?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ClassifyInput {
|
|
7
|
+
recurrence?: string;
|
|
8
|
+
action?: {
|
|
9
|
+
plugin: string;
|
|
10
|
+
tool: string;
|
|
11
|
+
args?: Record<string, unknown>;
|
|
12
|
+
};
|
|
13
|
+
/** startDate is always present (required); endDate present means a bounded slot. */
|
|
14
|
+
endDate?: string;
|
|
15
|
+
attendees?: ScheduleAttendee[];
|
|
16
|
+
}
|
|
17
|
+
export type ScheduleLabel = "Event" | "Meeting";
|
|
18
|
+
export interface Classification {
|
|
19
|
+
label: ScheduleLabel;
|
|
20
|
+
reason: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function classifyScheduleWrite(input: ClassifyInput): Classification;
|
|
23
|
+
//# sourceMappingURL=schedule-classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-classify.d.ts","sourceRoot":"","sources":["../../src/lib/schedule-classify.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAC1E,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAChC;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAeD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAM1E"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Task 1023. schedule-event historically wrote a :Event for everything. The
|
|
2
|
+
// canonical schema splits :Event (scheduler/automation primitive — cron
|
|
3
|
+
// recurrence, action auto-dispatch, eventStatus) from :Meeting (a real calendar
|
|
4
|
+
// appointment with attendees, (accountId, uid)-idempotent, (:Person)-[:ATTENDED]).
|
|
5
|
+
// This pure discriminator decides which label a schedule-event write lands as,
|
|
6
|
+
// reading the intent structurally from the tool params — never by keyword-
|
|
7
|
+
// sniffing the title. Branches are evaluated top-down; the first match wins.
|
|
8
|
+
//
|
|
9
|
+
// 1. recurrence present -> Event (recurring trigger)
|
|
10
|
+
// 2. action present -> Event (action dispatcher)
|
|
11
|
+
// 3. a resolvable counterparty -> Meeting (call/appointment with someone)
|
|
12
|
+
// 4. bounded slot (endDate present) -> Meeting (a time-blocked appointment)
|
|
13
|
+
// 5. otherwise -> Event (one-time reminder)
|
|
14
|
+
//
|
|
15
|
+
// The `reason` is emitted in the observability line so a mis-bucketed write is
|
|
16
|
+
// greppable without reading the graph.
|
|
17
|
+
/**
|
|
18
|
+
* A counterparty is "resolvable" only when it carries a key we can link a
|
|
19
|
+
* :Person on — an email (the global unique key) or an already-resolved nodeId.
|
|
20
|
+
* A name-only attendee is informational and does not, by itself, make the write
|
|
21
|
+
* a meeting: the agent is expected to resolve a real counterparty to a Person
|
|
22
|
+
* before booking, the same way every other wrapped writer requires resolved ids.
|
|
23
|
+
*/
|
|
24
|
+
function hasResolvableCounterparty(attendees) {
|
|
25
|
+
return (attendees ?? []).some((a) => (a.email && a.email.trim().length > 0) || (a.nodeId && a.nodeId.trim().length > 0));
|
|
26
|
+
}
|
|
27
|
+
export function classifyScheduleWrite(input) {
|
|
28
|
+
if (input.recurrence)
|
|
29
|
+
return { label: "Event", reason: "recurrence" };
|
|
30
|
+
if (input.action)
|
|
31
|
+
return { label: "Event", reason: "action" };
|
|
32
|
+
if (hasResolvableCounterparty(input.attendees))
|
|
33
|
+
return { label: "Meeting", reason: "counterparty" };
|
|
34
|
+
if (input.endDate)
|
|
35
|
+
return { label: "Meeting", reason: "bounded" };
|
|
36
|
+
return { label: "Event", reason: "reminder" };
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=schedule-classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-classify.js","sourceRoot":"","sources":["../../src/lib/schedule-classify.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,wEAAwE;AACxE,gFAAgF;AAChF,mFAAmF;AACnF,+EAA+E;AAC/E,2EAA2E;AAC3E,6EAA6E;AAC7E,EAAE;AACF,oEAAoE;AACpE,oEAAoE;AACpE,iFAAiF;AACjF,8EAA8E;AAC9E,qEAAqE;AACrE,EAAE;AACF,+EAA+E;AAC/E,uCAAuC;AAuBvC;;;;;;GAMG;AACH,SAAS,yBAAyB,CAAC,SAAyC;IAC1E,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAC1F,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAoB;IACxD,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IACtE,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9D,IAAI,yBAAyB,CAAC,KAAK,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACpG,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAClE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dispatcher script: reconcile-bookings
|
|
3
|
+
*
|
|
4
|
+
* Self-contained, like check-due-events. Pulls accepted booking rows from each
|
|
5
|
+
* account's Cloudflare D1 `bookings` table (written by the booking site's Pages
|
|
6
|
+
* Function), writes each into Neo4j as a :Meeting so it appears on the admin
|
|
7
|
+
* calendar, links the booker as a :Person, and notifies the admin. Marks each
|
|
8
|
+
* row swept so it reconciles exactly once. Ends with the standing audit.
|
|
9
|
+
*
|
|
10
|
+
* The Pi has no running periodic surface today (the legacy cron was removed and
|
|
11
|
+
* the desktop-scheduled-task replacement is not wired), so this binary is armed
|
|
12
|
+
* by the always-running platform/ui server on an interval. A PID lock prevents
|
|
13
|
+
* overlapping runs.
|
|
14
|
+
*
|
|
15
|
+
* Observability — one [calendar-booking] line per step keyed by bookingId, plus
|
|
16
|
+
* one [calendar-reconcile] audit line per account per run.
|
|
17
|
+
*
|
|
18
|
+
* PLATFORM_ROOT=... NEO4J_URI=... node dist/scripts/reconcile-bookings.js
|
|
19
|
+
*/
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=reconcile-bookings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile-bookings.d.ts","sourceRoot":"","sources":["../../src/scripts/reconcile-bookings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dispatcher script: reconcile-bookings
|
|
3
|
+
*
|
|
4
|
+
* Self-contained, like check-due-events. Pulls accepted booking rows from each
|
|
5
|
+
* account's Cloudflare D1 `bookings` table (written by the booking site's Pages
|
|
6
|
+
* Function), writes each into Neo4j as a :Meeting so it appears on the admin
|
|
7
|
+
* calendar, links the booker as a :Person, and notifies the admin. Marks each
|
|
8
|
+
* row swept so it reconciles exactly once. Ends with the standing audit.
|
|
9
|
+
*
|
|
10
|
+
* The Pi has no running periodic surface today (the legacy cron was removed and
|
|
11
|
+
* the desktop-scheduled-task replacement is not wired), so this binary is armed
|
|
12
|
+
* by the always-running platform/ui server on an interval. A PID lock prevents
|
|
13
|
+
* overlapping runs.
|
|
14
|
+
*
|
|
15
|
+
* Observability — one [calendar-booking] line per step keyed by bookingId, plus
|
|
16
|
+
* one [calendar-reconcile] audit line per account per run.
|
|
17
|
+
*
|
|
18
|
+
* PLATFORM_ROOT=... NEO4J_URI=... node dist/scripts/reconcile-bookings.js
|
|
19
|
+
*/
|
|
20
|
+
import neo4j from "neo4j-driver";
|
|
21
|
+
import { spawnSync } from "node:child_process";
|
|
22
|
+
import { readFileSync, writeFileSync, existsSync, unlinkSync, mkdirSync, readdirSync } from "node:fs";
|
|
23
|
+
import { resolve, join } from "node:path";
|
|
24
|
+
import { homedir } from "node:os";
|
|
25
|
+
import { reconcileOne, auditCounts } from "../lib/booking-reconcile.js";
|
|
26
|
+
import { notifyBooking } from "../lib/booking-notify.js";
|
|
27
|
+
function resolveConfigDir() {
|
|
28
|
+
const platformRoot = process.env.PLATFORM_ROOT;
|
|
29
|
+
if (!platformRoot)
|
|
30
|
+
throw new Error("PLATFORM_ROOT environment variable is required");
|
|
31
|
+
const brandPath = resolve(platformRoot, "config", "brand.json");
|
|
32
|
+
if (!existsSync(brandPath))
|
|
33
|
+
throw new Error(`brand.json not found at ${brandPath}`);
|
|
34
|
+
const brand = JSON.parse(readFileSync(brandPath, "utf-8"));
|
|
35
|
+
if (!brand.configDir)
|
|
36
|
+
throw new Error(`brand.json at ${brandPath} is missing configDir`);
|
|
37
|
+
return brand.configDir;
|
|
38
|
+
}
|
|
39
|
+
const CONFIG_DIR = resolve(homedir(), resolveConfigDir());
|
|
40
|
+
const LOCK_FILE = resolve(CONFIG_DIR, "reconcile-bookings.lock");
|
|
41
|
+
function acquireLock() {
|
|
42
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
43
|
+
if (existsSync(LOCK_FILE)) {
|
|
44
|
+
const storedPid = readFileSync(LOCK_FILE, "utf-8").trim();
|
|
45
|
+
try {
|
|
46
|
+
process.kill(Number(storedPid), 0);
|
|
47
|
+
return false; // a run is in progress
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
unlinkSync(LOCK_FILE); // stale
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
writeFileSync(LOCK_FILE, String(process.pid));
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
function releaseLock() {
|
|
57
|
+
try {
|
|
58
|
+
if (existsSync(LOCK_FILE) && readFileSync(LOCK_FILE, "utf-8").trim() === String(process.pid)) {
|
|
59
|
+
unlinkSync(LOCK_FILE);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
/* best effort */
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function connectNeo4j() {
|
|
67
|
+
const platformRoot = process.env.PLATFORM_ROOT;
|
|
68
|
+
let password;
|
|
69
|
+
if (process.env.NEO4J_PASSWORD) {
|
|
70
|
+
password = process.env.NEO4J_PASSWORD;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
const passwordFile = resolve(platformRoot, "config/.neo4j-password");
|
|
74
|
+
try {
|
|
75
|
+
password = readFileSync(passwordFile, "utf-8").trim();
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
throw new Error(`Neo4j password not found at ${passwordFile}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const uri = process.env.NEO4J_URI;
|
|
82
|
+
if (!uri)
|
|
83
|
+
throw new Error("[calendar-reconcile] NEO4J_URI unset — refusing to default");
|
|
84
|
+
const user = process.env.NEO4J_USER ?? "neo4j";
|
|
85
|
+
return neo4j.driver(uri, neo4j.auth.basic(user, password));
|
|
86
|
+
}
|
|
87
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
88
|
+
/** Read `KEY=value` pairs from a secrets env file without polluting process.env. */
|
|
89
|
+
function readEnvFile(path) {
|
|
90
|
+
const out = {};
|
|
91
|
+
if (!existsSync(path))
|
|
92
|
+
return out;
|
|
93
|
+
for (const line of readFileSync(path, "utf-8").split("\n")) {
|
|
94
|
+
const m = line.match(/^([A-Z0-9_]+)=(.*)$/);
|
|
95
|
+
if (m)
|
|
96
|
+
out[m[1]] = m[2];
|
|
97
|
+
}
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
/** Run a D1 SQL statement via wrangler with the per-scope token. Returns parsed rows. */
|
|
101
|
+
function d1Query(dbName, sql, env) {
|
|
102
|
+
const res = spawnSync("wrangler", ["d1", "execute", dbName, "--remote", "--json", "--command", sql], {
|
|
103
|
+
env: { ...process.env, ...env },
|
|
104
|
+
encoding: "utf-8",
|
|
105
|
+
maxBuffer: 16 * 1024 * 1024,
|
|
106
|
+
// Bound each call so a stalled wrangler/network cannot wedge the whole
|
|
107
|
+
// run (which would hold the PID lock and silently stall reconcile).
|
|
108
|
+
timeout: 60_000,
|
|
109
|
+
});
|
|
110
|
+
if (res.status !== 0) {
|
|
111
|
+
throw new Error(`wrangler d1 execute failed (status ${res.status}${res.signal ? `, signal ${res.signal}` : ""})`);
|
|
112
|
+
}
|
|
113
|
+
// wrangler --json prints an array of result objects, each with a `results` array.
|
|
114
|
+
const parsed = JSON.parse(res.stdout || "[]");
|
|
115
|
+
const first = Array.isArray(parsed) ? parsed[0] : parsed;
|
|
116
|
+
return (first && Array.isArray(first.results) ? first.results : []);
|
|
117
|
+
}
|
|
118
|
+
/** Resolve an email sender from the sibling email plugin, defensively. */
|
|
119
|
+
async function resolveEmailNotify(accountId) {
|
|
120
|
+
const platformRoot = process.env.PLATFORM_ROOT;
|
|
121
|
+
const smtpPath = resolve(platformRoot, "plugins/email/mcp/dist/lib/smtp.js");
|
|
122
|
+
const credPath = resolve(platformRoot, "plugins/email/mcp/dist/lib/credentials.js");
|
|
123
|
+
if (!existsSync(smtpPath) || !existsSync(credPath))
|
|
124
|
+
return {};
|
|
125
|
+
try {
|
|
126
|
+
const smtp = await import(smtpPath);
|
|
127
|
+
const cred = await import(credPath);
|
|
128
|
+
const config = await cred.readConfig(accountId);
|
|
129
|
+
if (!config)
|
|
130
|
+
return {};
|
|
131
|
+
const password = cred.readPassword();
|
|
132
|
+
return {
|
|
133
|
+
adminEmail: config.address,
|
|
134
|
+
sendEmail: async ({ to, subject, body }) => {
|
|
135
|
+
await smtp.sendEmail(config, password, { to: [to], subject, text: body });
|
|
136
|
+
},
|
|
137
|
+
// WhatsApp notify is intentionally not wired: the platform forbids
|
|
138
|
+
// agent-initiated cold first contact, and there is no known-thread
|
|
139
|
+
// resolution in scope. Email is the reliable channel.
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
console.error(`[calendar-booking] op=notify channel=email dispatched=false reason=dispatcher-unavailable err="${err.message}"`);
|
|
144
|
+
return {};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async function reconcileAccount(driver, accountId, accountDir) {
|
|
148
|
+
const availPath = join(accountDir, "calendar-availability.json");
|
|
149
|
+
if (!existsSync(availPath))
|
|
150
|
+
return; // no booking site for this account
|
|
151
|
+
let avail;
|
|
152
|
+
try {
|
|
153
|
+
avail = JSON.parse(readFileSync(availPath, "utf-8"));
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
console.error(`[calendar-reconcile] account=${accountId} skip reason=bad-availability-json`);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const dbName = avail.bookingDbName;
|
|
160
|
+
if (!dbName) {
|
|
161
|
+
console.error(`[calendar-reconcile] account=${accountId} skip reason=no-booking-db`);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const secrets = readEnvFile(join(accountDir, "secrets", "cloudflare.env"));
|
|
165
|
+
const token = secrets.CF_PAGES_D1_TOKEN;
|
|
166
|
+
if (!token) {
|
|
167
|
+
console.error(`[calendar-reconcile] account=${accountId} skip reason=no-pages-d1-token`);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const wranglerEnv = {
|
|
171
|
+
CLOUDFLARE_API_TOKEN: token,
|
|
172
|
+
...(secrets.CLOUDFLARE_ACCOUNT_ID ? { CLOUDFLARE_ACCOUNT_ID: secrets.CLOUDFLARE_ACCOUNT_ID } : {}),
|
|
173
|
+
};
|
|
174
|
+
let pending;
|
|
175
|
+
try {
|
|
176
|
+
pending = d1Query(dbName, "SELECT bookingId, slotStart, slotEnd, name, email, note FROM bookings WHERE status='accepted' AND swept=0 ORDER BY id", wranglerEnv);
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
console.error(`[calendar-reconcile] account=${accountId} d1-read-failed err="${err.message}"`);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const notifyDeps = pending.length > 0 ? await resolveEmailNotify(accountId) : {};
|
|
183
|
+
for (const row of pending) {
|
|
184
|
+
const bookingId = String(row.bookingId);
|
|
185
|
+
// bookingId is written by the Pages Function as crypto.randomUUID(); a row
|
|
186
|
+
// whose id is not a UUID was not written by us, so refuse to interpolate it
|
|
187
|
+
// into the sweep statement (defence in depth against a non-parameterized id).
|
|
188
|
+
if (!UUID_RE.test(bookingId)) {
|
|
189
|
+
console.error(`[calendar-reconcile] account=${accountId} skip-row reason=non-uuid-bookingId`);
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
const booking = {
|
|
193
|
+
bookingId,
|
|
194
|
+
slotStart: String(row.slotStart),
|
|
195
|
+
slotEnd: String(row.slotEnd),
|
|
196
|
+
name: String(row.name),
|
|
197
|
+
email: String(row.email),
|
|
198
|
+
note: row.note == null ? undefined : String(row.note),
|
|
199
|
+
};
|
|
200
|
+
const started = Date.now();
|
|
201
|
+
console.error(`[calendar-booking] op=reconcile-claim bookingId=${booking.bookingId} accountId=${accountId}`);
|
|
202
|
+
const session = driver.session();
|
|
203
|
+
try {
|
|
204
|
+
const result = await reconcileOne(session, accountId, booking);
|
|
205
|
+
console.error(`[calendar-booking] op=meeting-write bookingId=${booking.bookingId} meetingId=${result.meetingId} created=${result.created}`);
|
|
206
|
+
// Notify only when the meeting was freshly created. An idempotent re-run
|
|
207
|
+
// (created=false, e.g. a prior pass wrote the meeting but the sweep
|
|
208
|
+
// failed) must not re-email the admin.
|
|
209
|
+
if (result.created) {
|
|
210
|
+
const notes = await notifyBooking(notifyDeps, booking);
|
|
211
|
+
for (const n of notes) {
|
|
212
|
+
console.error(`[calendar-booking] op=notify bookingId=${booking.bookingId} channel=${n.channel} dispatched=${n.dispatched}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Mark swept only after a successful meeting write, so a reconcile crash
|
|
216
|
+
// leaves the row for the next run rather than dropping it silently.
|
|
217
|
+
d1Query(dbName, `UPDATE bookings SET swept=1 WHERE bookingId='${booking.bookingId}'`, wranglerEnv);
|
|
218
|
+
console.error(`[calendar-booking] op=booked bookingId=${booking.bookingId} ms=${Date.now() - started}`);
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
console.error(`[calendar-booking] op=reconcile-failed bookingId=${booking.bookingId} err="${err.message}"`);
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
await session.close();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Standing audit — covers the no-event failure no per-request line can reveal.
|
|
228
|
+
const auditSession = driver.session();
|
|
229
|
+
try {
|
|
230
|
+
let acceptedIds = [];
|
|
231
|
+
try {
|
|
232
|
+
const accepted = d1Query(dbName, "SELECT bookingId FROM bookings WHERE status='accepted'", wranglerEnv);
|
|
233
|
+
acceptedIds = accepted.map((r) => String(r.bookingId));
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
/* audit degrades to graph-only when D1 is unreachable */
|
|
237
|
+
}
|
|
238
|
+
const counts = await auditCounts(auditSession, accountId, acceptedIds);
|
|
239
|
+
console.error(`[calendar-reconcile] account=${accountId} pendingUnreconciled=${counts.pendingUnreconciled} orphanMeetings=${counts.orphanMeetings}`);
|
|
240
|
+
}
|
|
241
|
+
finally {
|
|
242
|
+
await auditSession.close();
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
async function main() {
|
|
246
|
+
if (!acquireLock()) {
|
|
247
|
+
console.error("[calendar-reconcile] another run holds the lock — exiting");
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
let driver = null;
|
|
251
|
+
try {
|
|
252
|
+
const platformRoot = process.env.PLATFORM_ROOT;
|
|
253
|
+
const accountsDir = resolve(platformRoot, "..", "data/accounts");
|
|
254
|
+
if (!existsSync(accountsDir))
|
|
255
|
+
return;
|
|
256
|
+
const accountIds = readdirSync(accountsDir).filter((d) => existsSync(join(accountsDir, d, "account.json")));
|
|
257
|
+
if (accountIds.length === 0)
|
|
258
|
+
return;
|
|
259
|
+
driver = connectNeo4j();
|
|
260
|
+
for (const accountId of accountIds) {
|
|
261
|
+
try {
|
|
262
|
+
await reconcileAccount(driver, accountId, join(accountsDir, accountId));
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
console.error(`[calendar-reconcile] account=${accountId} run-failed err="${err.message}"`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
if (driver)
|
|
271
|
+
await driver.close();
|
|
272
|
+
releaseLock();
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
main().catch((err) => {
|
|
276
|
+
console.error(`[calendar-reconcile] fatal err="${err instanceof Error ? err.message : String(err)}"`);
|
|
277
|
+
releaseLock();
|
|
278
|
+
process.exit(1);
|
|
279
|
+
});
|
|
280
|
+
//# sourceMappingURL=reconcile-bookings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile-bookings.js","sourceRoot":"","sources":["../../src/scripts/reconcile-bookings.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type CreatedBy } from "../../../../../lib/graph-write/dist/index.js";
|
|
2
|
+
import { type ScheduleAttendee, type ScheduleLabel } from "../lib/schedule-classify.js";
|
|
2
3
|
export interface EventAction {
|
|
3
4
|
plugin: string;
|
|
4
5
|
tool: string;
|
|
@@ -15,11 +16,20 @@ export interface ScheduleEventParams {
|
|
|
15
16
|
timezone?: string;
|
|
16
17
|
sessionKey?: string;
|
|
17
18
|
action?: EventAction;
|
|
19
|
+
attendees?: ScheduleAttendee[];
|
|
18
20
|
createdBy: CreatedBy;
|
|
19
21
|
}
|
|
20
22
|
export interface ScheduleEventResult {
|
|
21
|
-
|
|
23
|
+
label: ScheduleLabel;
|
|
24
|
+
/** Set when the write landed as an :Event. */
|
|
25
|
+
eventId?: string;
|
|
26
|
+
/** Set when the write landed as a :Meeting (the node elementId). */
|
|
27
|
+
meetingId?: string;
|
|
28
|
+
/** The (accountId, uid) idempotency key, set on a :Meeting write. */
|
|
29
|
+
uid?: string;
|
|
22
30
|
nextRun?: string;
|
|
31
|
+
/** Counterparties linked via (:Person)-[:ATTENDED]->(:Meeting). */
|
|
32
|
+
attendeesLinked?: number;
|
|
23
33
|
}
|
|
24
34
|
export declare function scheduleEvent(params: ScheduleEventParams): Promise<ScheduleEventResult>;
|
|
25
35
|
//# sourceMappingURL=schedule-event.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule-event.d.ts","sourceRoot":"","sources":["../../src/tools/schedule-event.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,8CAA8C,CAAC;
|
|
1
|
+
{"version":3,"file":"schedule-event.d.ts","sourceRoot":"","sources":["../../src/tools/schedule-event.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,8CAA8C,CAAC;AAGtD,OAAO,EAAyB,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAG/G,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,aAAa,CAAC;IACrB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgK7F"}
|
|
@@ -6,8 +6,40 @@ import { computeEmbedding } from "../lib/embedding.js";
|
|
|
6
6
|
import { writeNodeWithEdges, } from "../../../../../lib/graph-write/dist/index.js";
|
|
7
7
|
import cronParser from "cron-parser";
|
|
8
8
|
const { parseExpression } = cronParser;
|
|
9
|
+
import { classifyScheduleWrite } from "../lib/schedule-classify.js";
|
|
10
|
+
import { writeMeeting } from "../lib/meeting-write.js";
|
|
9
11
|
export async function scheduleEvent(params) {
|
|
10
|
-
const { accountId, name, description, startDate, endDate, location, recurrence, timezone, sessionKey, action, createdBy, } = params;
|
|
12
|
+
const { accountId, name, description, startDate, endDate, location, recurrence, timezone, sessionKey, action, attendees, createdBy, } = params;
|
|
13
|
+
// Decide the bucket up front. A genuine meeting (a resolvable counterparty, or
|
|
14
|
+
// a bounded start+end with no trigger) lands as a :Meeting; a recurrence/action
|
|
15
|
+
// or a bare one-time reminder lands as an :Event.
|
|
16
|
+
const { label, reason } = classifyScheduleWrite({ recurrence, action, endDate, attendees });
|
|
17
|
+
console.error(`[schedule-event] op=write label=${label} reason=${reason}`);
|
|
18
|
+
if (label === "Meeting") {
|
|
19
|
+
const meetingSession = getSession();
|
|
20
|
+
try {
|
|
21
|
+
const m = await writeMeeting(meetingSession, {
|
|
22
|
+
accountId,
|
|
23
|
+
name,
|
|
24
|
+
startDate,
|
|
25
|
+
endDate,
|
|
26
|
+
location,
|
|
27
|
+
description,
|
|
28
|
+
timezone,
|
|
29
|
+
attendees,
|
|
30
|
+
sessionKey,
|
|
31
|
+
createdBy: {
|
|
32
|
+
agent: createdBy.agent ?? "",
|
|
33
|
+
session: createdBy.session ?? "",
|
|
34
|
+
tool: createdBy.tool ?? "schedule-event",
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
return { label, meetingId: m.meetingId, uid: m.uid, attendeesLinked: m.attendeesLinked };
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
await meetingSession.close();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
11
43
|
if (action) {
|
|
12
44
|
if (!action.plugin || !action.tool) {
|
|
13
45
|
throw new Error("Action requires both 'plugin' and 'tool' fields");
|
|
@@ -116,6 +148,6 @@ export async function scheduleEvent(params) {
|
|
|
116
148
|
finally {
|
|
117
149
|
await neo4jSession.close();
|
|
118
150
|
}
|
|
119
|
-
return { eventId, nextRun };
|
|
151
|
+
return { label, eventId, nextRun };
|
|
120
152
|
}
|
|
121
153
|
//# sourceMappingURL=schedule-event.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule-event.js","sourceRoot":"","sources":["../../src/tools/schedule-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACL,kBAAkB,GAGnB,MAAM,8CAA8C,CAAC;AACtD,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,MAAM,EAAE,eAAe,EAAE,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"schedule-event.js","sourceRoot":"","sources":["../../src/tools/schedule-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACL,kBAAkB,GAGnB,MAAM,8CAA8C,CAAC;AACtD,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,MAAM,EAAE,eAAe,EAAE,GAAG,UAAU,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAA6C,MAAM,6BAA6B,CAAC;AAC/G,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAoCvD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAA2B;IAC7D,MAAM,EACJ,SAAS,EACT,IAAI,EACJ,WAAW,EACX,SAAS,EACT,OAAO,EACP,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,UAAU,EACV,MAAM,EACN,SAAS,EACT,SAAS,GACV,GAAG,MAAM,CAAC;IAEX,+EAA+E;IAC/E,gFAAgF;IAChF,kDAAkD;IAClD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,qBAAqB,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5F,OAAO,CAAC,KAAK,CAAC,mCAAmC,KAAK,WAAW,MAAM,EAAE,CAAC,CAAC;IAE3E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,cAAc,GAAG,UAAU,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,cAAc,EAAE;gBAC3C,SAAS;gBACT,IAAI;gBACJ,SAAS;gBACT,OAAO;gBACP,QAAQ;gBACR,WAAW;gBACX,QAAQ;gBACR,SAAS;gBACT,UAAU;gBACV,SAAS,EAAE;oBACT,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,EAAE;oBAC5B,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,EAAE;oBAChC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,gBAAgB;iBACzC;aACF,CAAC,CAAC;YACH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC;QAC3F,CAAC;gBAAS,CAAC;YACT,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QAC/C,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,GAAG,GAAG,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,IAAI,OAA2B,CAAC;IAChC,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,EAAE;gBAC3C,WAAW,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC;gBAChC,EAAE,EAAE,QAAQ;aACb,CAAC,CAAC;YACH,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,mCAAmC,UAAU,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACvG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,MAAM,KAAK,GAA4B;QACrC,OAAO;QACP,SAAS;QACT,IAAI;QACJ,SAAS;QACT,WAAW,EAAE,WAAW;QACxB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf,CAAC;IAEF,IAAI,WAAW;QAAE,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IACjD,IAAI,OAAO;QAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IACrC,IAAI,QAAQ;QAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACxC,IAAI,UAAU;QAAE,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;IAC9C,IAAI,QAAQ;QAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACxC,IAAI,OAAO;QAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IACrC,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;QACnC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;QAC/B,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvD,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IACjC,IAAI,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC;IACnC,IAAI,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;IACpD,IAAI,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC;IAC5C,IAAI,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAElE,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IAEtD,gEAAgE;IAChE,0EAA0E;IAC1E,4EAA4E;IAC5E,oCAAoC;IACpC,MAAM,aAAa,GAAwB,EAAE,CAAC;IAC9C,MAAM,YAAY,GAAG,UAAU,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,GAAG,CAC9B,mFAAmF,EACnF,EAAE,UAAU,EAAE,CACf,CAAC;YACF,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,aAAa,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,SAAS;oBACf,SAAS,EAAE,UAAU;oBACrB,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAW;iBAC/C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,4JAA4J,CAC7J,CAAC;QACJ,CAAC;QAED,MAAM,kBAAkB,CAAC;YACvB,OAAO,EAAE,YAAY;YACrB,MAAM,EAAE,CAAC,OAAO,CAAC;YACjB,KAAK;YACL,aAAa;YACb,SAAS;SACV,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical-tool-names.generated.d.ts","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAkB7C,CAAA;AAED,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,
|
|
1
|
+
{"version":3,"file":"canonical-tool-names.generated.d.ts","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAkB7C,CAAA;AAED,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAqMtD,CAAA"}
|