@rubytech/create-maxy-code 0.1.343 → 0.1.345
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/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 +12 -8
- package/payload/platform/plugins/cloudflare/skills/calendar-site/SKILL.md +5 -5
- package/payload/platform/plugins/docs/references/calendar-booking.md +9 -7
- package/payload/platform/plugins/docs/references/internals.md +2 -0
- package/payload/platform/plugins/scheduling/PLUGIN.md +13 -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__/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/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/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/public/assets/AdminLoginScreens-CpE_Nf5z.js +1 -0
- package/payload/server/public/assets/AdminShell-D3N3Aq04.js +1 -0
- package/payload/server/public/assets/Checkbox-DQGuYIRH.js +1 -0
- package/payload/server/public/assets/{admin-auth-fetch-9JCQ2FFm.css → OperatorConversations-DLfQEw1r.css} +1 -1
- package/payload/server/public/assets/OperatorConversations-g7aAQCDn.js +9 -0
- package/payload/server/public/assets/admin-BU0dY3_T.js +1 -0
- package/payload/server/public/assets/{arc-Crkz45LN.js → arc-DpkSQNto.js} +1 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-Csj53u5T.js +1 -0
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-C9JThHgP.js → architectureDiagram-Q4EWVU46-Bw7Yq8O9.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-DpsV_HXT.js → blockDiagram-DXYQGD6D-BBtJQFSz.js} +1 -1
- package/payload/server/public/assets/browser-B5ytGJAE.js +1 -0
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-CTm_6aKi.js → c4Diagram-AHTNJAMY-JAMgxzOr.js} +1 -1
- package/payload/server/public/assets/calendar-DFywoZ75.js +1 -0
- package/payload/server/public/assets/channel-BUQUAUts.js +1 -0
- package/payload/server/public/assets/chat-cxTK--65.js +1 -0
- package/payload/server/public/assets/{chunk-2KRD3SAO-1KSJW1q6.js → chunk-2KRD3SAO-eDugsc2L.js} +1 -1
- package/payload/server/public/assets/{chunk-336JU56O-C3t08Ip-.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-kl1ze33n.js → chunk-4BX2VUAB-CByVeKCY.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-DxpoDoHg.js → chunk-4TB4RGXK-CpY0DcUB.js} +1 -1
- package/payload/server/public/assets/{chunk-55IACEB6-WM9VJzha.js → chunk-55IACEB6-C3YxgyIb.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-CLH63ZH3.js → chunk-5FUZZQ4R-Bc0d7j8A.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-DCTb8IAT.js → chunk-5PVQY5BW-CTUGMRIa.js} +1 -1
- package/payload/server/public/assets/{chunk-67CJDMHE-BSYzyaoH.js → chunk-67CJDMHE-CbdPnpLd.js} +1 -1
- package/payload/server/public/assets/{chunk-7N4EOEYR-CarJ7O2P.js → chunk-7N4EOEYR-Cjl2kevz.js} +1 -1
- package/payload/server/public/assets/{chunk-AA7GKIK3-DTNLyBpH.js → chunk-AA7GKIK3-BgozIh5p.js} +1 -1
- package/payload/server/public/assets/{chunk-BSJP7CBP-BFmHflHY.js → chunk-BSJP7CBP-6Ufq45NW.js} +1 -1
- package/payload/server/public/assets/{chunk-CIAEETIT-BpjG0IzU.js → chunk-CIAEETIT-BhhYuMnA.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-2fSowhlW.js → chunk-EDXVE4YY-BfaJ3yDD.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-ClcranGV.js → chunk-ENJZ2VHE-C7-hIGVC.js} +1 -1
- package/payload/server/public/assets/{chunk-FMBD7UC4-DLq4BItQ.js → chunk-FMBD7UC4-BQvvyocF.js} +1 -1
- package/payload/server/public/assets/{chunk-FOC6F5B3-B9QI3Guz.js → chunk-FOC6F5B3-C6rBDOxH.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-BAr-Mv1Z.js → chunk-ICPOFSXX-BjOJvkVa.js} +2 -2
- package/payload/server/public/assets/{chunk-K5T4RW27-8PvAHasY.js → chunk-K5T4RW27-kKowRHhn.js} +1 -1
- package/payload/server/public/assets/{chunk-KGLVRYIC--aGaDRH5.js → chunk-KGLVRYIC-bAEV_5eH.js} +1 -1
- package/payload/server/public/assets/{chunk-LIHQZDEY-BrWj7mw2.js → chunk-LIHQZDEY-BLvsQAfg.js} +1 -1
- package/payload/server/public/assets/{chunk-ORNJ4GCN-kYQmkMTi.js → chunk-ORNJ4GCN-BzYZfPZ7.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-CIsryCWH.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-68X653e3.js → chunk-U2HBQHQK-BdcVGjau.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-v3v9soX3.js → chunk-X2U36JSP-C0CL_Jin.js} +1 -1
- package/payload/server/public/assets/{chunk-XPW4576I-CW5DPpop.js → chunk-XPW4576I-CsV7CUxH.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-B1VP7Rl2.js → chunk-YZCP3GAM-Cj0_fLkR.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-DiJrujNY.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-BscXxLMc.js → cose-bilkent-S5V4N54A-BU3EOLXX.js} +1 -1
- package/payload/server/public/assets/{dagre-MBv6WlCS.js → dagre-BRq8C9NU.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-DVgGlTQ1.js → dagre-KV5264BT-CoCAYhFc.js} +1 -1
- package/payload/server/public/assets/data-BVPOzSZ7.js +1 -0
- package/payload/server/public/assets/{diagram-5BDNPKRD-BmhCaO0a.js → diagram-5BDNPKRD-DBy5GNaQ.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-ChU9L8vz.js → diagram-G4DWMVQ6-l93MsBLv.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-Oy409Zc_.js → diagram-MMDJMWI5-BIfXkVlL.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-Cn1YByqk.js → diagram-TYMM5635-BuTJLBny.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-e17yfLvr.js → erDiagram-SMLLAGMA-BwPxWDbP.js} +1 -1
- package/payload/server/public/assets/{flatten-Cl1Bc3dR.js → flatten-DtM0XAMt.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-Dqt7sCVZ.js → flowDiagram-DWJPFMVM-BhPtHXMR.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-B4IhwS2r.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-BDw-PKcI.js → gitGraphDiagram-UUTBAWPF-BW36BDiu.js} +1 -1
- package/payload/server/public/assets/{graph-B8h8YAJu.js → graph-D0fPx1nX.js} +3 -3
- package/payload/server/public/assets/graph-labels-C4dkheQ8.js +1 -0
- package/payload/server/public/assets/{graphlib-DPIYk_sg.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-D1pGOD1J.js → isEmpty-D__iH1WQ.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-BRIHsB3G.js → ishikawaDiagram-UXIWVN3A-CmB-bA_O.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-aKNgmoHd.js → journeyDiagram-VCZTEJTY-Bt1fJKmc.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-cwBwT-nm.js → kanban-definition-6JOO6SKY-DVbksz_J.js} +1 -1
- package/payload/server/public/assets/{line-DVtVRzUA.js → line-BX2Ugx3B.js} +1 -1
- package/payload/server/public/assets/{linear-DtoOFPO2.js → linear-Bdc-QJWI.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-G7YD_zO3.js → mermaid-parser.core-qv1e-J5x.js} +2 -2
- package/payload/server/public/assets/{mermaid.core-DpFyndHm.js → mermaid.core-C_d9YQX_.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-CYXK_Pvz.js → mindmap-definition-QFDTVHPH-DwKGvF14.js} +1 -1
- package/payload/server/public/assets/operator-DyrF6PQi.js +1 -0
- package/payload/server/public/assets/{ordinal-CBZeH4Yp.js → ordinal-BRQ5CzZY.js} +1 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-BDg8fde8.js +1 -0
- package/payload/server/public/assets/page-BPIaNNW1.js +30 -0
- package/payload/server/public/assets/pie-ZZUOXDRM-CXDyYMkZ.js +1 -0
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-DFo4N6WH.js → pieDiagram-DEJITSTG-dUvQC_4S.js} +1 -1
- package/payload/server/public/assets/public-BrIaS6m3.js +1 -0
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-BlH5iIhl.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-PuPlFPRX.js → reduce-CkcXOmmJ.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-D5WLty8A.js → requirementDiagram-MS252O5E-h2euIqGj.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-vB85IxHG.js → sankeyDiagram-XADWPNL6-DCii3fkF.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-Cxraa0Ee.js → sequenceDiagram-FGHM5R23-CQSGYmlq.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BBPssYBx.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-Bgk6PT62.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-B-APTs3L.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-CkXJSs_i.js → wardleyDiagram-NUSXRM2D-4JaRn1s5.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-BkyshPMV.js → xychartDiagram-5P7HB3ND-kxwmCNuM.js} +1 -1
- package/payload/server/public/browser.html +4 -5
- package/payload/server/public/calendar.html +4 -3
- package/payload/server/public/chat.html +6 -7
- package/payload/server/public/data.html +4 -5
- package/payload/server/public/graph.html +6 -7
- package/payload/server/public/index.html +6 -7
- package/payload/server/public/operator.html +8 -9
- package/payload/server/public/public.html +6 -7
- package/payload/server/server.js +135 -6
- package/payload/server/public/assets/AdminLoginScreens-KVvngpT2.js +0 -1
- package/payload/server/public/assets/AdminShell-DDKZhJRo.js +0 -1
- package/payload/server/public/assets/Checkbox-BJlS0tR2.js +0 -1
- package/payload/server/public/assets/OperatorConversations-_P3_KmAW.js +0 -1
- package/payload/server/public/assets/admin-BTQWgciK.js +0 -1
- package/payload/server/public/assets/admin-auth-fetch-BMOxrEnl.js +0 -9
- package/payload/server/public/assets/architecture-YZFGNWBL-Dma4Bgha.js +0 -1
- package/payload/server/public/assets/browser-CpOL9dN0.js +0 -1
- package/payload/server/public/assets/calendar-dRLyhghx.js +0 -1
- package/payload/server/public/assets/channel-B_-5bau1.js +0 -1
- package/payload/server/public/assets/chat-prZCVWvK.js +0 -1
- package/payload/server/public/assets/chunk-426QAEUC-Dirxdwjh.js +0 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-Duipo1kI.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-B3kX5SuB.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-D761c7Lr.js +0 -1
- package/payload/server/public/assets/clone-BrhFv6Tb.js +0 -1
- package/payload/server/public/assets/data-CeUT45cU.js +0 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-BCQAqtLy.js +0 -1
- package/payload/server/public/assets/graph-labels-BFrQ5kyH.js +0 -1
- package/payload/server/public/assets/info-OMHHGYJF-qU7hK50T.js +0 -1
- package/payload/server/public/assets/infoDiagram-42DDH7IO-KGdcJeTs.js +0 -2
- package/payload/server/public/assets/operator-D3fRwMfE.js +0 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-DiU2yS9m.js +0 -1
- package/payload/server/public/assets/page-D0hQWIIV.js +0 -30
- package/payload/server/public/assets/pie-ZZUOXDRM-zHUKKlVv.js +0 -1
- package/payload/server/public/assets/public-DX4z0sCJ.js +0 -1
- package/payload/server/public/assets/radar-PYXPWWZC-BUnVoaPg.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BWmmUwDt.js +0 -1
- package/payload/server/public/assets/treeView-SZITEDCU-C3Y-Q52h.js +0 -1
- package/payload/server/public/assets/treemap-W4RFUUIX-Dk0qZpAg.js +0 -1
- package/payload/server/public/assets/wardley-RL74JXVD-BAWI02OA.js +0 -1
- /package/payload/server/public/assets/{_baseFor-brRjpUOX.js → _baseFor-SRtUHe7G.js} +0 -0
- /package/payload/server/public/assets/{array-BGFCBI0e.js → array-BpsnM-Py.js} +0 -0
- /package/payload/server/public/assets/{cytoscape.esm-TvRJ2tGX.js → cytoscape.esm-D4Rl1H5h.js} +0 -0
- /package/payload/server/public/assets/{defaultLocale-CRZydyG6.js → defaultLocale-C7sQPl-O.js} +0 -0
- /package/payload/server/public/assets/{dist-B0CkUodR.js → dist-CtUNt3w8.js} +0 -0
- /package/payload/server/public/assets/{init-B8gtcn7T.js → init-BydxaDEV.js} +0 -0
- /package/payload/server/public/assets/{katex-RxgSu_dy.js → katex-B0fVeDx4.js} +0 -0
- /package/payload/server/public/assets/{path-DZF-JdEe.js → path-jlWYQ2i9.js} +0 -0
- /package/payload/server/public/assets/{preload-helper-CQ36nxok.js → preload-helper-uTix4PVD.js} +0 -0
- /package/payload/server/public/assets/{rough.esm-6CnTHTkH.js → rough.esm-c4PR5shF.js} +0 -0
- /package/payload/server/public/assets/{src-CR_MU8uy.js → src-48kCpScq.js} +0 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Task 1023. The discriminator is the load-bearing decision: it picks :Meeting
|
|
2
|
+
// vs :Event from the schedule-event params. These pins lock each branch and the
|
|
3
|
+
// top-down precedence (a trigger always wins, a name-only attendee never does).
|
|
4
|
+
import { describe, it, expect } from "vitest";
|
|
5
|
+
import { classifyScheduleWrite } from "../schedule-classify.js";
|
|
6
|
+
describe("classifyScheduleWrite", () => {
|
|
7
|
+
it("recurrence makes it an Event (recurring trigger), even with an attendee + endDate", () => {
|
|
8
|
+
expect(classifyScheduleWrite({
|
|
9
|
+
recurrence: "0 8 * * 1-5",
|
|
10
|
+
endDate: "2026-06-22T09:00:00Z",
|
|
11
|
+
attendees: [{ email: "a@b.com" }],
|
|
12
|
+
})).toEqual({ label: "Event", reason: "recurrence" });
|
|
13
|
+
});
|
|
14
|
+
it("an action makes it an Event (dispatcher), even with an attendee", () => {
|
|
15
|
+
expect(classifyScheduleWrite({
|
|
16
|
+
action: { plugin: "memory", tool: "memory-search" },
|
|
17
|
+
attendees: [{ email: "a@b.com" }],
|
|
18
|
+
})).toEqual({ label: "Event", reason: "action" });
|
|
19
|
+
});
|
|
20
|
+
it("a counterparty with an email makes it a Meeting", () => {
|
|
21
|
+
expect(classifyScheduleWrite({ attendees: [{ email: "josh@goff.com", name: "Josh" }] })).toEqual({
|
|
22
|
+
label: "Meeting",
|
|
23
|
+
reason: "counterparty",
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
it("a counterparty with a resolved nodeId makes it a Meeting", () => {
|
|
27
|
+
expect(classifyScheduleWrite({ attendees: [{ nodeId: "el-person-1" }] })).toEqual({
|
|
28
|
+
label: "Meeting",
|
|
29
|
+
reason: "counterparty",
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
it("a bounded slot (endDate) with no counterparty is a Meeting", () => {
|
|
33
|
+
expect(classifyScheduleWrite({ endDate: "2026-06-22T10:00:00Z" })).toEqual({
|
|
34
|
+
label: "Meeting",
|
|
35
|
+
reason: "bounded",
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
it("a one-time reminder (no end, no counterparty) stays an Event", () => {
|
|
39
|
+
expect(classifyScheduleWrite({})).toEqual({ label: "Event", reason: "reminder" });
|
|
40
|
+
});
|
|
41
|
+
it("a name-only attendee does not, by itself, make it a Meeting", () => {
|
|
42
|
+
// No email and no nodeId — not resolvable to a :Person, so it falls through
|
|
43
|
+
// to the reminder branch rather than the counterparty branch.
|
|
44
|
+
expect(classifyScheduleWrite({ attendees: [{ name: "Some Person" }] })).toEqual({
|
|
45
|
+
label: "Event",
|
|
46
|
+
reason: "reminder",
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
it("a name-only attendee on a bounded slot is a Meeting via the bounded branch", () => {
|
|
50
|
+
expect(classifyScheduleWrite({ endDate: "2026-06-22T10:00:00Z", attendees: [{ name: "Some Person" }] })).toEqual({ label: "Meeting", reason: "bounded" });
|
|
51
|
+
});
|
|
52
|
+
it("treats whitespace-only attendee keys as absent", () => {
|
|
53
|
+
expect(classifyScheduleWrite({ attendees: [{ email: " ", nodeId: " " }] })).toEqual({
|
|
54
|
+
label: "Event",
|
|
55
|
+
reason: "reminder",
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=schedule-classify.test.js.map
|
package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-classify.test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-classify.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/schedule-classify.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Session } from "neo4j-driver";
|
|
2
|
+
import type { ScheduleAttendee } from "./schedule-classify.js";
|
|
3
|
+
export interface WriteMeetingParams {
|
|
4
|
+
accountId: string;
|
|
5
|
+
name: string;
|
|
6
|
+
startDate: string;
|
|
7
|
+
endDate?: string;
|
|
8
|
+
location?: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
timezone?: string;
|
|
11
|
+
attendees?: ScheduleAttendee[];
|
|
12
|
+
sessionKey?: string;
|
|
13
|
+
createdBy: {
|
|
14
|
+
agent: string;
|
|
15
|
+
session: string;
|
|
16
|
+
tool: string;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface WriteMeetingResult {
|
|
20
|
+
meetingId: string;
|
|
21
|
+
uid: string;
|
|
22
|
+
created: boolean;
|
|
23
|
+
attendeesLinked: number;
|
|
24
|
+
crossAccountSkipped: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Deterministic uid for a conversationally-booked meeting. ICS uses the VEVENT
|
|
28
|
+
* UID and booking uses 'booking-<id>'; a conversational meeting has no external
|
|
29
|
+
* id, so the natural key is a content hash of the account, the normalized title,
|
|
30
|
+
* and the start. Re-running the identical request yields the same uid and the
|
|
31
|
+
* MERGE matches the existing node.
|
|
32
|
+
*/
|
|
33
|
+
export declare function meetingUid(accountId: string, name: string, startDate: string): string;
|
|
34
|
+
export declare function writeMeeting(session: Session, params: WriteMeetingParams): Promise<WriteMeetingResult>;
|
|
35
|
+
//# sourceMappingURL=meeting-write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting-write.d.ts","sourceRoot":"","sources":["../../src/lib/meeting-write.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGrF;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAgH7B"}
|
|
@@ -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":"AAAA,iFAAiF;AACjF,+EAA+E;AAC/E,4EAA4E;AAC5E,iFAAiF;AACjF,wDAAwD;AACxD,EAAE;AACF,kFAAkF;AAClF,+EAA+E;AAC/E,gFAAgF;AAChF,iFAAiF;AACjF,+EAA+E;AAC/E,gDAAgD;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAyBzC;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,IAAY,EAAE,SAAiB;IAC3E,MAAM,KAAK,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,SAAS,EAAE,CAAC;IACvE,OAAO,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAgB,EAChB,MAA0B;IAE1B,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,GACnG,MAAM,CAAC;IACT,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAEnD,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC;;;;;;;;;;;;;;;;;;;;;;;;;;;+CA2B2C,EAC3C;QACE,SAAS;QACT,GAAG;QACH,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,OAAO,IAAI,IAAI;QACvB,QAAQ,EAAE,QAAQ,IAAI,IAAI;QAC1B,WAAW,EAAE,WAAW,IAAI,IAAI;QAChC,QAAQ,EAAE,QAAQ,IAAI,IAAI;QAC1B,cAAc,EAAE,SAAS,CAAC,KAAK;QAC/B,gBAAgB,EAAE,SAAS,CAAC,OAAO;QACnC,aAAa,EAAE,SAAS,CAAC,IAAI;KAC9B,CACF,CAAC;IACF,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAY,CAAC;IAChE,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAW,CAAC;IAEnE,4EAA4E;IAC5E,6EAA6E;IAC7E,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,OAAO,CAAC,GAAG,CACf;;;gDAG0C,EAC1C,EAAE,SAAS,EAAE,UAAU,EAAE,CAC1B,CAAC;IACJ,CAAC;IAED,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAC5B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QAEvC,IAAI,MAAM,EAAE,CAAC;YACX,0EAA0E;YAC1E,wEAAwE;YACxE,sEAAsE;YACtE,iDAAiD;YACjD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3B;;;;+BAIuB,EACvB,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CACjC,CAAC;YACF,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;YACtD,IAAI,MAAM;gBAAE,eAAe,EAAE,CAAC;;gBACzB,mBAAmB,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3B;;;;;;;;;;mDAU2C,EAC3C,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,KAAK,EAAE,CACnF,CAAC;YACF,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;YACtD,IAAI,MAAM;gBAAE,eAAe,EAAE,CAAC;;gBACzB,mBAAmB,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,8CAA8C;IAChD,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC;AAC3E,CAAC"}
|
|
@@ -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"}
|
|
@@ -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":"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"}
|
|
@@ -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"}
|
package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js
CHANGED
|
@@ -38,6 +38,7 @@ export const CANONICAL_MAXY_TOOL_NAMES = [
|
|
|
38
38
|
"mcp__plugin_admin_admin__action-pending",
|
|
39
39
|
"mcp__plugin_admin_admin__action-reject",
|
|
40
40
|
"mcp__plugin_admin_admin__admin-add",
|
|
41
|
+
"mcp__plugin_admin_admin__admin-hostname",
|
|
41
42
|
"mcp__plugin_admin_admin__admin-list",
|
|
42
43
|
"mcp__plugin_admin_admin__admin-remove",
|
|
43
44
|
"mcp__plugin_admin_admin__admin-update-pin",
|
package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical-tool-names.generated.js","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"canonical-tool-names.generated.js","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,8 @@ Cloudflare and custom-domain setup (tunnel, DNS, Pages, D1) is **not** your work
|
|
|
35
35
|
|
|
36
36
|
**Timezones are not optional.** Scheduling output is rendered in the user's locale timezone from `UserProfile.timezone` (IANA). Storage is UTC. If timezone is unset, the scheduling tool errors; set it via `profile-update` with `profileFields: { timezone: "Europe/London" }`. There is no UTC fallback.
|
|
37
37
|
|
|
38
|
+
**Booking a meeting vs setting a reminder.** `schedule-event` records a real appointment as a calendar meeting and a trigger/reminder as an event. When you book a call or meeting with someone, resolve the counterparty to a `:Person` via `memory-search` and pass their `elementId` (or an `email`) in `attendees`, and give the slot an `endDate`; that records it as a meeting with the person attached. Pass a `recurrence` or `action` only for recurring triggers and auto-dispatch, which stay events.
|
|
39
|
+
|
|
38
40
|
**Graph adjacency at write time.** Wrapped writers (`schedule-event`, `contact-create`, `work-create`) reject zero-edge calls. Resolve target elementIds via `memory-search` and pass them in the create call. The current admin session's Conversation satisfies the rule automatically when you are inside a session.
|
|
39
41
|
|
|
40
42
|
**WhatsApp ToS.** Automated broadcast is forbidden. The platform blocks broadcast for WhatsApp regardless of channel config; do not try to design around it.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{o as e}from"./chunk-CAM3fms7.js";import{A as t,C as n,U as r,b as i,x as a,z as o}from"./OperatorConversations-g7aAQCDn.js";import{i as s}from"./admin-types-Dg11L4MQ.js";import{g as c,u as l}from"./AdminShell-D3N3Aq04.js";import{t as u}from"./Checkbox-DQGuYIRH.js";var d=`admin-landing-redirected`,f=`/graph`;function p(e){return e.variant===`operator`?!1:e.appState===`chat`&&!e.alreadyRedirected}var m=e(r(),1);function h(e=`admin`){let[t,n]=(0,m.useState)(`loading`),[r,i]=(0,m.useState)(``),[a,l]=(0,m.useState)(``),[u,h]=(0,m.useState)(``),[g,_]=(0,m.useState)(!1),[v,y]=(0,m.useState)(!1),[b,x]=(0,m.useState)(!1),[S,C]=(0,m.useState)(!1),[w,T]=(0,m.useState)(!1),[E,D]=(0,m.useState)(null),[O,k]=(0,m.useState)(null),[A,j]=(0,m.useState)(void 0),[M,N]=(0,m.useState)(null),[P,F]=(0,m.useState)(void 0),[I,L]=(0,m.useState)(null),[ee,R]=(0,m.useState)(null),[z,B]=(0,m.useState)([]),[V,H]=(0,m.useState)(!1),[U,W]=(0,m.useState)(void 0),G=(0,m.useRef)(void 0),[K,q]=(0,m.useState)(!1);(0,m.useEffect)(()=>{typeof window>`u`||fetch(`/api/remote-auth/status`).then(e=>e.ok?e.json():null).then(e=>{e?.configured&&q(!0)}).catch(()=>{})},[]);let J=(0,m.useRef)(null),Y=(0,m.useRef)(null);(0,m.useEffect)(()=>{async function e(){let e=null;try{e=sessionStorage.getItem(`maxy-admin-session-key`)}catch{}if(!e)return!1;try{let t=await fetch(`/api/admin/session?session_key=${encodeURIComponent(e)}`);if(t.status===401){try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}return!1}if(!t.ok)return!1;let r=await t.json();D(r.session_key),R(r.sessionId??null),j(r.businessName),N(r.role??null),F(r.userName===void 0?null:r.userName),L(r.avatar??null);let i=s(r.thinkingView);return G.current=i,W(i),n(`chat`),!0}catch(e){return console.error(`[admin] session restore failed:`,e),!1}}async function t(r=2){try{let i=await fetch(`/api/health`);if(!i.ok){if(r>0)return await new Promise(e=>setTimeout(e,1500)),t(r-1);console.error(`[admin] health check returned ${i.status} after retries`),n(`set-pin`);return}let a=await i.json();if(!a.pin_configured){n(`set-pin`);return}if(!a.claude_authenticated){n(`connect-claude`);return}if(await e())return;n(`enter-pin`)}catch(e){if(r>0)return await new Promise(e=>setTimeout(e,1500)),t(r-1);console.error(`[admin] health check failed:`,e),n(`set-pin`)}}t()},[]),(0,m.useEffect)(()=>{t===`chat`&&fetch(`/api/admin/claude-info`).then(e=>{if(e.ok)return e.json()}).then(e=>{e&&k(e)}).catch(()=>{})},[t]),(0,m.useEffect)(()=>{if(typeof window>`u`)return;let n=!1;try{n=sessionStorage.getItem(d)===`1`}catch{}if(p({appState:t,alreadyRedirected:n,variant:e})){try{sessionStorage.setItem(d,`1`)}catch{}console.info(`[admin-ui] landing-redirect target=${f}`),window.location.replace(f)}},[t,e]);let X=(0,m.useRef)(null);(0,m.useEffect)(()=>{if(t!==`chat`)return;let e=setInterval(async()=>{try{let e=await fetch(`/api/health`);if(e.ok){let t=await e.json();if(t.auth_status===`dead`||t.auth_status===`missing`){n(`connect-claude`);return}}}catch{}if(E)try{let e=await fetch(`/api/admin/session?session_key=${encodeURIComponent(E)}`);if(e.status!==401)return;let t=(await e.clone().json().catch(()=>null))?.code??`unknown-401`;if(t===`remote-auth-required`){o(`heartbeat`,`/api/admin/session`);return}console.warn(`[admin-auth] outcome=heartbeat-detected-expiry code=${t}`),X.current?.()}catch{}},300*1e3);return()=>clearInterval(e)},[t,E]),(0,m.useEffect)(()=>{t===`connect-claude`&&fetch(`/api/health`).then(e=>e.ok?e.json():null).then(e=>{e?.claude_authenticated&&n(`enter-pin`)}).catch(()=>{})},[t]);async function Z(e,t){y(!0);try{let r=await fetch(`/api/admin/session`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({pin:e,...t?{accountId:t}:{}})});if(!r.ok){h((await r.json().catch(()=>({}))).error||`Invalid PIN`);return}let a=await r.json();if(a.accounts&&!a.session_key){console.log(`[admin] account picker shown: userId=${a.userId} accountCount=${a.accounts.length}`),B(a.accounts),n(`account-picker`);return}D(a.session_key),R(a.sessionId??null),j(a.businessName),N(a.role??null),F(a.userName===void 0?null:a.userName),L(a.avatar??null);let o=s(a.thinkingView);if(G.current=o,W(o),t)try{sessionStorage.setItem(`maxy-account-id`,t)}catch{}try{sessionStorage.setItem(`maxy-admin-session-key`,a.session_key)}catch{}i(``),n(`chat`)}catch(e){console.error(`[admin] connection error:`,e),h(`Could not connect.`)}finally{y(!1),H(!1)}}let Q=(0,m.useCallback)(async e=>{if(e.preventDefault(),v)return;h(``);let t=a.trim();if(!t){h(`Please enter your name.`);return}if(r.length<4){h(`PIN must be at least 4 characters.`);return}let o=r;y(!0);try{let e=await fetch(`/api/onboarding/set-pin`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({pin:o,name:t})});if(!e.ok){let t=await e.json().catch(()=>({}));if(e.status===409){console.log(`[admin] PIN already configured — re-checking health`);try{let e=await fetch(`/api/health`);if(e.ok){let r=await e.json();r.pin_configured&&r.claude_authenticated?n(`enter-pin`):r.pin_configured?n(`connect-claude`):h(t.error||`Failed to set PIN.`)}else n(`enter-pin`)}catch{n(`enter-pin`)}return}h(t.error||`Failed to set PIN.`);return}let r=await fetch(`/api/health`);if((r.ok?await r.json():null)?.claude_authenticated){await Z(o);return}i(``),n(`connect-claude`)}catch(e){console.error(`[admin] connection error:`,e),h(`Could not connect.`)}finally{y(!1)}},[r,v,a]),te=(0,m.useCallback)(async e=>{e.preventDefault(),h(``),await Z(r)},[r]),ne=(0,m.useCallback)(async()=>{T(!0);try{if(!await c())return console.warn(`[admin-ui] claude-disconnect not verified — credentials may persist; staying put`),!1;D(null),N(null),F(void 0),L(null);try{sessionStorage.removeItem(`maxy-admin-session-key`),sessionStorage.removeItem(`maxy-account-id`),sessionStorage.removeItem(d)}catch{}return n(`connect-claude`),!0}finally{T(!1)}},[]),$=(0,m.useCallback)(()=>{D(null),N(null),F(void 0),L(null);try{sessionStorage.removeItem(`maxy-admin-session-key`),sessionStorage.removeItem(`maxy-account-id`),sessionStorage.removeItem(d)}catch{}i(``),h(``),n(`enter-pin`)},[]);return(0,m.useEffect)(()=>{X.current=$},[$]),{appState:t,setAppState:n,pin:r,setPin:i,operatorName:a,setOperatorName:l,pinError:u,setPinError:h,showPin:g,setShowPin:_,pinLoading:v,authPolling:b,setAuthPolling:x,authLoading:S,setAuthLoading:C,disconnecting:w,cacheKey:E,setCacheKey:D,claudeInfo:O,setClaudeInfo:k,businessName:A,role:M,userName:P,userAvatar:I,sessionId:ee,setSessionId:R,accounts:z,accountPickerLoading:V,expandAll:U,setExpandAll:W,expandAllDefaultRef:G,remoteAuthEnabled:K,pinInputRef:J,setPinFormRef:Y,handleSetPin:Q,handleLogin:te,handleAccountSelect:(0,m.useCallback)(async e=>{H(!0),h(``),await Z(r,e)},[r]),handleDisconnect:ne,handleLogout:$,handleChangePin:(0,m.useCallback)(async()=>{if(!r){h(`Enter your current PIN first.`);return}y(!0),h(``);try{let e=await fetch(`/api/onboarding/set-pin`,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify({currentPin:r})});if(!e.ok){h((await e.json().catch(()=>({error:`Incorrect PIN.`}))).error||`Incorrect PIN.`);return}i(``),h(``),n(`set-pin`)}catch(e){console.error(`[admin-auth] change pin failed:`,e),h(e instanceof Error?e.message:String(e))}finally{y(!1)}},[r])}}var g=n();function _({inputRef:e,value:t,onChange:n,onComplete:r,showPin:i,autoFocus:a}){let o=(0,m.useRef)([]);function s(e,r){r.key===`Backspace`?(r.preventDefault(),t[e]?n(t.slice(0,e)+t.slice(e+1)):e>0&&(n(t.slice(0,e-1)+t.slice(e)),o.current[e-1]?.focus())):r.key===`ArrowLeft`&&e>0?o.current[e-1]?.focus():r.key===`ArrowRight`&&e<5?o.current[e+1]?.focus():r.key===`Enter`&&(r.preventDefault(),r.currentTarget.form?.requestSubmit())}function c(e,i){let a=i.nativeEvent.data;if(!a||!/^\d$/.test(a))return;let s=t.split(``);for(s[e]=a;s.length<e;)s.push(``);let c=s.join(``).replace(/\D/g,``).slice(0,6);n(c),c.length===6?r?.(c):e<5&&o.current[e+1]?.focus()}function l(e){e.preventDefault();let t=e.clipboardData.getData(`text`).replace(/\D/g,``).slice(0,6);t&&(n(t),t.length===6?r?.(t):o.current[t.length]?.focus())}return(0,g.jsx)(`div`,{className:`pin-field`,children:Array.from({length:6}).map((n,r)=>(0,g.jsx)(`input`,{ref:t=>{o.current[r]=t,r===0&&e&&(e.current=t)},type:`text`,inputMode:`numeric`,className:`pin-box${t[r]?` pin-box-filled`:``}`,value:t[r]?i?t[r]:`•`:``,onKeyDown:e=>s(r,e),onInput:e=>c(r,e),onPaste:l,onFocus:e=>e.target.select(),autoFocus:a&&r===0,autoComplete:`off`,maxLength:1,"aria-label":`PIN digit ${r+1}`},r))})}function v(e){let{pin:t,setPin:n,showPin:r,setShowPin:o,pinLoading:s,pinError:c,pinInputRef:d,setPinFormRef:f,onSubmit:p,operatorName:m,setOperatorName:h}=e;return(0,g.jsx)(`div`,{className:`connect-page`,children:(0,g.jsxs)(`div`,{className:`connect-content`,children:[(0,g.jsx)(`img`,{src:a,alt:i.productName,className:`connect-logo connect-logo--maxy`}),!i.logoContainsName&&(0,g.jsxs)(`h1`,{className:`connect-title`,children:[`Welcome to `,i.productName]}),(0,g.jsxs)(`p`,{className:`connect-subtitle`,children:[`Tell `,i.productName,` who you are, then choose a PIN.`]}),(0,g.jsxs)(`form`,{ref:f,onSubmit:p,className:`connect-pin-form`,children:[(0,g.jsxs)(`div`,{className:`pin-input-row`,children:[(0,g.jsx)(`input`,{type:`text`,className:`connect-name-input`,placeholder:`Your full name`,value:m,onChange:e=>h(e.target.value),autoComplete:`name`,autoFocus:!0,required:!0,"aria-label":`Your full name`}),(0,g.jsx)(`div`,{style:{width:38,flexShrink:0},"aria-hidden":`true`})]}),(0,g.jsxs)(`div`,{className:`pin-input-row`,children:[(0,g.jsx)(_,{inputRef:d,value:t,onChange:n,onComplete:()=>{},showPin:r}),(0,g.jsx)(l,{variant:`send`,type:`submit`,disabled:!t||!m.trim(),loading:s,"aria-label":`Set PIN`,children:(0,g.jsxs)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,g.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`}),(0,g.jsx)(`polyline`,{points:`12 5 19 12 12 19`})]})})]}),(0,g.jsx)(u,{checked:r,onChange:()=>o(e=>!e),label:`Show PIN`})]}),c&&(0,g.jsx)(`p`,{className:`admin-pin-error`,children:c})]})})}function y(e){let{pin:t,setPin:n,showPin:r,setShowPin:o,pinLoading:s,pinError:c,pinInputRef:d,onSubmit:f,onChangePin:p,remoteAuthEnabled:m,onSignOutRemote:h}=e;return(0,g.jsxs)(`div`,{className:`connect-page`,children:[m&&h&&(0,g.jsx)(`button`,{type:`button`,className:`connect-signout`,onClick:h,children:`Sign out`}),(0,g.jsxs)(`div`,{className:`connect-content`,children:[(0,g.jsx)(`img`,{src:a,alt:i.productName,className:`connect-logo connect-logo--maxy`}),!i.logoContainsName&&(0,g.jsx)(`h1`,{className:`connect-title`,children:i.productName}),(0,g.jsxs)(`form`,{onSubmit:f,className:`connect-pin-form`,children:[(0,g.jsxs)(`div`,{className:`pin-input-row`,children:[(0,g.jsx)(_,{inputRef:d,value:t,onChange:n,onComplete:()=>{},showPin:r,autoFocus:!0}),(0,g.jsx)(l,{variant:`send`,type:`submit`,disabled:!t,loading:s,children:(0,g.jsxs)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,g.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`}),(0,g.jsx)(`polyline`,{points:`12 5 19 12 12 19`})]})})]}),(0,g.jsxs)(`div`,{className:`pin-options`,children:[(0,g.jsx)(u,{checked:r,onChange:()=>o(e=>!e),label:`Show PIN`}),(0,g.jsx)(l,{type:`button`,variant:`ghost`,onClick:p,children:`Change PIN`})]})]}),c&&(0,g.jsx)(`p`,{className:`admin-pin-error`,children:c})]})]})}function b(e){let{accounts:n,loading:r,error:o,onSelect:s}=e;return(0,g.jsx)(`div`,{className:`connect-page`,children:(0,g.jsxs)(`div`,{className:`connect-content`,children:[(0,g.jsx)(`img`,{src:a,alt:i.productName,className:`connect-logo connect-logo--maxy`}),!i.logoContainsName&&(0,g.jsx)(`h1`,{className:`connect-title`,children:i.productName}),(0,g.jsx)(`p`,{className:`connect-subtitle`,children:`Select an account`}),(0,g.jsx)(`div`,{className:`account-picker-list`,children:n.map(e=>(0,g.jsxs)(`button`,{className:`account-picker-card`,onClick:()=>s(e.accountId),disabled:r,type:`button`,children:[(0,g.jsx)(`span`,{className:`account-picker-name`,children:e.businessName||e.accountId}),(0,g.jsx)(`span`,{className:`account-picker-role`,children:e.role}),r&&(0,g.jsx)(t,{className:`account-picker-spinner`,size:16})]},e.accountId))}),o&&(0,g.jsx)(`p`,{className:`admin-pin-error`,children:o})]})})}function x(e){let{authPolling:t,setAuthPolling:n,authLoading:r,setAuthLoading:o,pinError:s,setPinError:c,setAppState:u}=e,[d,f]=(0,m.useState)(!1),[p,h]=(0,m.useState)(!1);async function _(){h(!0),c(``);try{let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`launch-browser`})})).json();e.launched?f(!0):e.error&&c(e.error)}catch(e){console.error(`[admin] browser launch error:`,e),c(`Could not launch browser.`)}h(!1)}async function v(){o(!0),c(``);try{let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`})).json();if(e.started){n(!0),f(!0),o(!1);for(let e=0;e<120;e++)if(await new Promise(e=>setTimeout(e,2e3)),(await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`wait`})})).json()).authenticated){await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`stop`})}),u(`enter-pin`);return}c(`Timed out waiting for sign-in. Try again.`),n(!1)}else e.error&&c(e.error)}catch(e){console.error(`[admin] auth flow error:`,e),c(`Could not start auth flow.`)}o(!1)}async function y(){await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`stop`})}),n(!1),c(``)}return t||d?(0,g.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100dvh`,overflow:`auto`},children:[(0,g.jsxs)(`header`,{className:`chat-header`,style:{paddingBottom:`12px`,flexShrink:0,position:`relative`,maxWidth:`680px`,width:`100%`,margin:`0 auto`,padding:`24px 20px 12px`},children:[t?(0,g.jsx)(`button`,{onClick:y,style:{position:`absolute`,top:`12px`,right:`12px`,background:`none`,border:`none`,color:`#999`,fontSize:`13px`,cursor:`pointer`,padding:`4px 8px`},"aria-label":`Cancel`,children:`✕`}):(0,g.jsx)(`button`,{onClick:()=>f(!1),style:{position:`absolute`,top:`12px`,right:`12px`,background:`none`,border:`none`,color:`#999`,fontSize:`13px`,cursor:`pointer`,padding:`4px 8px`},"aria-label":`Close browser`,children:`✕`}),(0,g.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`chat-logo`}),(0,g.jsx)(`h1`,{className:`chat-tagline`,children:`Connect Claude`}),(0,g.jsx)(`p`,{className:`chat-intro`,children:t?`Sign in and authorize in the browser below.`:`Open your email or prepare your accounts, then sign in.`}),!t&&(0,g.jsx)(`div`,{style:{marginTop:`12px`},children:(0,g.jsx)(l,{variant:`primary`,onClick:v,disabled:r,children:r?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(`span`,{className:`spin`,style:{display:`inline-block`},children:`✱`}),` Connecting…`]}):`Sign in to Claude`})})]}),(0,g.jsx)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,minHeight:0,gap:`10px`,padding:`0 0 16px`},children:(0,g.jsx)(`iframe`,{src:`/vnc-viewer.html`,style:{flex:1,width:`100%`,minHeight:0,border:`none`,background:`#111`,display:`block`},title:`Claude Sign-in`})}),s&&(0,g.jsx)(`p`,{className:`admin-pin-error`,style:{textAlign:`center`,padding:`0 20px 16px`},children:s})]}):(0,g.jsx)(`div`,{className:`connect-page`,children:(0,g.jsxs)(`div`,{className:`connect-content`,children:[(0,g.jsxs)(`div`,{className:`connect-logos`,children:[(0,g.jsx)(`div`,{className:`connect-logo-wrap`,children:(0,g.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`connect-logo`})}),(0,g.jsx)(`svg`,{className:`connect-arrow`,viewBox:`0 0 48 24`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,children:(0,g.jsx)(`path`,{d:`M0 12h44m0 0l-8-8m8 8l-8 8`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`})}),(0,g.jsxs)(`div`,{className:`connect-logo-wrap`,children:[(0,g.jsx)(`img`,{src:a,alt:i.productName,className:`connect-logo connect-logo--maxy`}),!i.logoContainsName&&(0,g.jsx)(`span`,{className:`connect-logo-label`,children:i.productName})]})]}),(0,g.jsxs)(`h1`,{className:`connect-title`,children:[`Connect Claude to power `,i.productName]}),(0,g.jsx)(`p`,{className:`connect-subtitle`,children:`Sign in with your Anthropic account to get started.`}),(0,g.jsx)(l,{variant:`primary`,onClick:v,disabled:r,children:r?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(`span`,{className:`spin`,style:{display:`inline-block`},children:`✱`}),` Connecting…`]}):`Sign in to Claude`}),(0,g.jsx)(`p`,{style:{marginTop:`6px`,fontSize:`11px`,color:`#999`,maxWidth:`300px`,textAlign:`center`,lineHeight:`1.4`},children:`First time? You may need to sign into your email and Anthropic account in the browser before connecting.`}),(0,g.jsx)(`button`,{onClick:_,disabled:p,style:{marginTop:`12px`,background:`none`,border:`none`,color:`var(--color-primary, #666)`,fontSize:`13px`,cursor:`pointer`,textDecoration:`underline`,textUnderlineOffset:`3px`},children:p?`Launching…`:`Open browser first`}),s&&(0,g.jsx)(`p`,{className:`admin-pin-error`,children:s})]})})}function S({auth:e}){return e.appState===`loading`?(0,g.jsx)(`div`,{className:`connect-page`}):e.appState===`set-pin`?(0,g.jsx)(v,{pin:e.pin,setPin:e.setPin,showPin:e.showPin,setShowPin:e.setShowPin,pinLoading:e.pinLoading,pinError:e.pinError,pinInputRef:e.pinInputRef,setPinFormRef:e.setPinFormRef,onSubmit:e.handleSetPin,operatorName:e.operatorName,setOperatorName:e.setOperatorName}):e.appState===`connect-claude`?(0,g.jsx)(x,{authPolling:e.authPolling,setAuthPolling:e.setAuthPolling,authLoading:e.authLoading,setAuthLoading:e.setAuthLoading,pinError:e.pinError,setPinError:e.setPinError,setAppState:e.setAppState}):e.appState===`enter-pin`?(0,g.jsx)(y,{pin:e.pin,setPin:e.setPin,showPin:e.showPin,setShowPin:e.setShowPin,pinLoading:e.pinLoading,pinError:e.pinError,pinInputRef:e.pinInputRef,onSubmit:e.handleLogin,onChangePin:e.handleChangePin,remoteAuthEnabled:e.remoteAuthEnabled,onSignOutRemote:()=>{console.info(`[admin-ui] remote-auth sign-out → /__remote-auth/logout`),window.location.href=`/__remote-auth/logout`}}):e.appState===`account-picker`?(0,g.jsx)(b,{accounts:e.accounts,loading:e.accountPickerLoading,error:e.pinError,onSelect:e.handleAccountSelect}):null}export{h as n,S as t};
|