@rubytech/create-maxy-code 0.1.471 → 0.1.473
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/google-client-id-env.test.js +70 -0
- package/dist/index.js +10 -25
- package/dist/port-resolution.js +7 -1
- package/package.json +1 -1
- package/payload/platform/config/brand.json +1 -0
- package/payload/platform/docs/superpowers/plans/2026-07-18-ledger-write-path-fix.md +109 -0
- package/payload/platform/lib/ledger-core/dist/reconcile.d.ts +7 -0
- package/payload/platform/lib/ledger-core/dist/reconcile.d.ts.map +1 -1
- package/payload/platform/lib/ledger-core/dist/reconcile.js +5 -2
- package/payload/platform/lib/ledger-core/dist/reconcile.js.map +1 -1
- package/payload/platform/lib/ledger-core/src/__tests__/reconcile.test.ts +20 -0
- package/payload/platform/lib/ledger-core/src/reconcile.ts +12 -2
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +24 -5
- package/payload/platform/plugins/docs/references/google-guide.md +10 -3
- package/payload/platform/plugins/docs/references/ledger.md +9 -1
- package/payload/platform/plugins/docs/references/troubleshooting.md +4 -0
- package/payload/platform/plugins/google/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/google/PLUGIN.md +4 -1
- package/payload/platform/plugins/google/mcp/dist/__tests__/account-register.test.js +95 -5
- package/payload/platform/plugins/google/mcp/dist/__tests__/account-register.test.js.map +1 -1
- package/payload/platform/plugins/google/mcp/dist/__tests__/boot.test.d.ts +2 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/boot.test.d.ts.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/boot.test.js +54 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/boot.test.js.map +1 -0
- package/payload/platform/plugins/google/mcp/dist/__tests__/google-client.test.js +26 -1
- package/payload/platform/plugins/google/mcp/dist/__tests__/google-client.test.js.map +1 -1
- package/payload/platform/plugins/google/mcp/dist/__tests__/index-registration.test.js +3 -2
- package/payload/platform/plugins/google/mcp/dist/__tests__/index-registration.test.js.map +1 -1
- package/payload/platform/plugins/google/mcp/dist/index.d.ts +9 -5
- package/payload/platform/plugins/google/mcp/dist/index.d.ts.map +1 -1
- package/payload/platform/plugins/google/mcp/dist/index.js +38 -37
- package/payload/platform/plugins/google/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/google/mcp/dist/lib/google-client.d.ts +10 -7
- package/payload/platform/plugins/google/mcp/dist/lib/google-client.d.ts.map +1 -1
- package/payload/platform/plugins/google/mcp/dist/lib/google-client.js +25 -13
- package/payload/platform/plugins/google/mcp/dist/lib/google-client.js.map +1 -1
- package/payload/platform/plugins/google/mcp/dist/tools/account-register.d.ts +60 -2
- package/payload/platform/plugins/google/mcp/dist/tools/account-register.d.ts.map +1 -1
- package/payload/platform/plugins/google/mcp/dist/tools/account-register.js +141 -11
- package/payload/platform/plugins/google/mcp/dist/tools/account-register.js.map +1 -1
- package/payload/platform/plugins/google/references/auth.md +91 -74
- package/payload/platform/plugins/ledger/PLUGIN.md +13 -1
- package/payload/platform/plugins/ledger/mcp/dist/index.js +23 -15
- package/payload/platform/plugins/ledger/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/ledger/mcp/dist/lib/read.d.ts +11 -1
- package/payload/platform/plugins/ledger/mcp/dist/lib/read.d.ts.map +1 -1
- package/payload/platform/plugins/ledger/mcp/dist/lib/read.js +20 -1
- package/payload/platform/plugins/ledger/mcp/dist/lib/read.js.map +1 -1
- package/payload/platform/plugins/ledger/mcp/dist/lib/types.d.ts +14 -11
- package/payload/platform/plugins/ledger/mcp/dist/lib/types.d.ts.map +1 -1
- package/payload/platform/plugins/ledger/mcp/dist/lib/types.js.map +1 -1
- package/payload/platform/plugins/ledger/mcp/dist/lib/write-rejects.d.ts +12 -0
- package/payload/platform/plugins/ledger/mcp/dist/lib/write-rejects.d.ts.map +1 -0
- package/payload/platform/plugins/ledger/mcp/dist/lib/write-rejects.js +50 -0
- package/payload/platform/plugins/ledger/mcp/dist/lib/write-rejects.js.map +1 -0
- package/payload/platform/plugins/ledger/mcp/dist/tools/cash-record.d.ts +5 -5
- package/payload/platform/plugins/ledger/mcp/dist/tools/cash-record.d.ts.map +1 -1
- package/payload/platform/plugins/ledger/mcp/dist/tools/cash-record.js +11 -11
- package/payload/platform/plugins/ledger/mcp/dist/tools/cash-record.js.map +1 -1
- package/payload/platform/plugins/ledger/mcp/dist/tools/invoice-record.d.ts +7 -2
- package/payload/platform/plugins/ledger/mcp/dist/tools/invoice-record.d.ts.map +1 -1
- package/payload/platform/plugins/ledger/mcp/dist/tools/invoice-record.js +9 -3
- package/payload/platform/plugins/ledger/mcp/dist/tools/invoice-record.js.map +1 -1
- package/payload/platform/plugins/ledger/mcp/dist/tools/payment-record.d.ts +7 -0
- package/payload/platform/plugins/ledger/mcp/dist/tools/payment-record.d.ts.map +1 -1
- package/payload/platform/plugins/ledger/mcp/dist/tools/payment-record.js +3 -4
- package/payload/platform/plugins/ledger/mcp/dist/tools/payment-record.js.map +1 -1
- package/payload/platform/plugins/ledger/mcp/dist/tools/reconcile.d.ts +1 -1
- package/payload/platform/plugins/ledger/mcp/dist/tools/reconcile.d.ts.map +1 -1
- package/payload/platform/plugins/ledger/mcp/dist/tools/reconcile.js +4 -1
- package/payload/platform/plugins/ledger/mcp/dist/tools/reconcile.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/activity-rows.d.ts +27 -2
- package/payload/platform/services/claude-session-manager/dist/activity-rows.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/activity-rows.js +33 -2
- package/payload/platform/services/claude-session-manager/dist/activity-rows.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/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +3 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
- package/payload/server/{chunk-BSTIQX52.js → chunk-Y6V45R6M.js} +1 -12
- package/payload/server/maxy-edge.js +1 -1
- package/payload/server/public/activity.html +6 -4
- package/payload/server/public/assets/AdminLoginScreens-B7TQZV8u.js +1 -0
- package/payload/server/public/assets/AdminShell-DAuri4Yh.js +2 -0
- package/payload/server/public/assets/Checkbox-B1XhnhPk.js +1 -0
- package/payload/server/public/assets/activity-kRwzxEKU.js +1 -0
- package/payload/server/public/assets/admin-BdcccSb5.js +1 -0
- package/payload/server/public/assets/{arc-CFMJyMm-.js → arc-BrHWN2Kr.js} +1 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-CZQzGRSM.js +1 -0
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-CmOpXLsH.js → architectureDiagram-Q4EWVU46-Clt9NOr0.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-CmS8f9YF.js → blockDiagram-DXYQGD6D-BOe_jmXi.js} +1 -1
- package/payload/server/public/assets/browser-B6woQ2qX.js +1 -0
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-BXIjMl6A.js → c4Diagram-AHTNJAMY-B64FaKMV.js} +1 -1
- package/payload/server/public/assets/calendar-CalCeg5T.js +1 -0
- package/payload/server/public/assets/channel-zDUAN9Ks.js +1 -0
- package/payload/server/public/assets/chat-9s2-L06v.js +1 -0
- package/payload/server/public/assets/chevron-left-C3ho8SnB.js +1 -0
- package/payload/server/public/assets/{chunk-2KRD3SAO-D4fktAwW.js → chunk-2KRD3SAO-BGAUfWvM.js} +1 -1
- package/payload/server/public/assets/{chunk-336JU56O-C2MKnRTj.js → chunk-336JU56O-PFi6uQZ0.js} +2 -2
- package/payload/server/public/assets/chunk-426QAEUC-iJnqNRug.js +1 -0
- package/payload/server/public/assets/{chunk-4BX2VUAB-C13Wz3zS.js → chunk-4BX2VUAB-CkxXXCiF.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-CalYahTR.js → chunk-4TB4RGXK-B-7tN4IA.js} +1 -1
- package/payload/server/public/assets/{chunk-55IACEB6-TmOKdy8a.js → chunk-55IACEB6-CBkNmqrt.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-C-i0BVag.js → chunk-5FUZZQ4R-wa9ujn7i.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-D6bJMLnf.js → chunk-5PVQY5BW-DIk-xBaE.js} +1 -1
- package/payload/server/public/assets/{chunk-67CJDMHE-Cif9Uu5C.js → chunk-67CJDMHE-BbMV1lgW.js} +1 -1
- package/payload/server/public/assets/{chunk-7N4EOEYR-WjTHCXnd.js → chunk-7N4EOEYR-C49Mv-nQ.js} +1 -1
- package/payload/server/public/assets/{chunk-AA7GKIK3-CwCfdQmb.js → chunk-AA7GKIK3-Dy_pJOp_.js} +1 -1
- package/payload/server/public/assets/{chunk-BSJP7CBP-9A67yXwT.js → chunk-BSJP7CBP-Ce-OmPqn.js} +1 -1
- package/payload/server/public/assets/{chunk-CIAEETIT-DPMiWSBi.js → chunk-CIAEETIT-tnjq-APC.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-B9PBdwiT.js → chunk-EDXVE4YY-Bvv_deZ2.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-CM5OqcQ5.js → chunk-ENJZ2VHE-CmxCPKyU.js} +1 -1
- package/payload/server/public/assets/{chunk-FMBD7UC4-Bmt_ZRlV.js → chunk-FMBD7UC4-Top6y08S.js} +1 -1
- package/payload/server/public/assets/{chunk-FOC6F5B3-DfGJGxpX.js → chunk-FOC6F5B3-B9LPNCUS.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-D6M89DA0.js → chunk-ICPOFSXX-Bi-_c351.js} +2 -2
- package/payload/server/public/assets/{chunk-K5T4RW27-DMpoaqw2.js → chunk-K5T4RW27-DAnRM04h.js} +1 -1
- package/payload/server/public/assets/{chunk-KGLVRYIC-DYUFgri2.js → chunk-KGLVRYIC-C0QYcbLe.js} +1 -1
- package/payload/server/public/assets/{chunk-LIHQZDEY-x3LmeKmx.js → chunk-LIHQZDEY-BjvA5ykt.js} +1 -1
- package/payload/server/public/assets/{chunk-ORNJ4GCN-BeuNAWkW.js → chunk-ORNJ4GCN-Cs46Gj7z.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-Bv6gisQ6.js → chunk-OYMX7WX6-BBpimab5.js} +1 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-Qlc2PFAj.js +1 -0
- package/payload/server/public/assets/{chunk-U2HBQHQK-C2iT9Av2.js → chunk-U2HBQHQK-CQUSBHoK.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-Bd6bv87A.js → chunk-X2U36JSP-Dm8TevG0.js} +1 -1
- package/payload/server/public/assets/{chunk-XPW4576I-ByFnN4JO.js → chunk-XPW4576I-B10QuxYb.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-Bt8I6ZDb.js → chunk-YZCP3GAM-vaGsu4Wk.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-DBMPgZ_A.js → chunk-ZZ45TVLE-D1Qi22bL.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-CFsKL52p.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BWBUUCiO.js +1 -0
- package/payload/server/public/assets/clone-h5XhkDUL.js +1 -0
- package/payload/server/public/assets/{cose-bilkent-S5V4N54A-DgLEaApT.js → cose-bilkent-S5V4N54A-CRDvLRXs.js} +1 -1
- package/payload/server/public/assets/{dagre-mSazqXgG.js → dagre-CEmqJTt3.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-kWVPgmmL.js → dagre-KV5264BT-LXMTo7Fp.js} +1 -1
- package/payload/server/public/assets/data-Cfr-7ERI.js +1 -0
- package/payload/server/public/assets/{diagram-5BDNPKRD-BHe_omJD.js → diagram-5BDNPKRD-zyis6nPt.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-fUFsmM3x.js → diagram-G4DWMVQ6-BiU0XAAD.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-DmujPLlM.js → diagram-MMDJMWI5-rGFiz1SX.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-B7Aoas89.js → diagram-TYMM5635-B0wak1ZJ.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-6hS1rGiO.js → erDiagram-SMLLAGMA-D8AUxLyX.js} +1 -1
- package/payload/server/public/assets/{flatten-BXzaHgtL.js → flatten-naJ5PJ4f.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-Bqhr_r5b.js → flowDiagram-DWJPFMVM-BtdUf68b.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-B8kjyN4o.js → ganttDiagram-T4ZO3ILL-C-lkzDmf.js} +1 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-CBZPQJLj.js +1 -0
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF--TTRq4ir.js → gitGraphDiagram-UUTBAWPF-DRUKumq2.js} +1 -1
- package/payload/server/public/assets/{graph-C252ZHjp.js → graph-HeZaatSQ.js} +3 -3
- package/payload/server/public/assets/graph-labels-4W7JuOgG.js +1 -0
- package/payload/server/public/assets/{graphlib-CWkjawc5.js → graphlib-zRsaoFEC.js} +1 -1
- package/payload/server/public/assets/info-OMHHGYJF-1vIoX-kP.js +1 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-KHcXRaan.js +2 -0
- package/payload/server/public/assets/{isEmpty-uB1dEu_Z.js → isEmpty-Bnpg7b8f.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-CR8B7VzM.js → ishikawaDiagram-UXIWVN3A-BguMgoR8.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-45lWAvtq.js → journeyDiagram-VCZTEJTY-CXhyK1n-.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DkrPXLVb.js → kanban-definition-6JOO6SKY-C0UCWVx-.js} +1 -1
- package/payload/server/public/assets/{line-Db0H446a.js → line--uhS9YDE.js} +1 -1
- package/payload/server/public/assets/{linear-X3O7lwK3.js → linear-CAOWPodQ.js} +1 -1
- package/payload/server/public/assets/maximize-2-DKx-aTPb.js +1 -0
- package/payload/server/public/assets/{mermaid-parser.core-CixBHOya.js → mermaid-parser.core-D6kPx7vc.js} +2 -2
- package/payload/server/public/assets/{mermaid.core-BGQq98L7.js → mermaid.core-CTd4DS6O.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-v9cJl1mj.js → mindmap-definition-QFDTVHPH-_AyvyG8C.js} +1 -1
- package/payload/server/public/assets/operator-DD9L2VJM.js +1 -0
- package/payload/server/public/assets/{ordinal-CZY9laxg.js → ordinal-Wx4m9zHk.js} +1 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-CTU0gCGb.js +1 -0
- package/payload/server/public/assets/page-Ceado9Kr.js +32 -0
- package/payload/server/public/assets/page-tJxw0zNO.js +1 -0
- package/payload/server/public/assets/{pdf-render-7HZBTZ0_.js → pdf-render-CeX6d2v7.js} +1 -1
- package/payload/server/public/assets/pie-ZZUOXDRM-D-EEHxhC.js +1 -0
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-DQ0b6edX.js → pieDiagram-DEJITSTG-6TsUDkkQ.js} +1 -1
- package/payload/server/public/assets/public-BYFWxyeC.js +1 -0
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-B64mj7Ei.js → quadrantDiagram-34T5L4WZ-CWw9gOI4.js} +1 -1
- package/payload/server/public/assets/radar-PYXPWWZC-DHXATZGB.js +1 -0
- package/payload/server/public/assets/{reduce-BGQzAenn.js → reduce-BUmc8RDR.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-CE2JIEWo.js → requirementDiagram-MS252O5E-DCOlxNvx.js} +1 -1
- package/payload/server/public/assets/rotate-ccw-DrzdV9h7.js +1 -0
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-Cmt5cfCz.js → sankeyDiagram-XADWPNL6-CW4Xbir3.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-B5vVn_sw.js → sequenceDiagram-FGHM5R23-vhb_pBLG.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-DiUEJ-RZ.js → stateDiagram-FHFEXIEX-Cb1WExEX.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-CxOIKvXh.js +1 -0
- package/payload/server/public/assets/tasks-DSwoxGzh.js +1 -0
- package/payload/server/public/assets/time-entry-format-Bn79w6tq.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-C9jprDVw.js → timeline-definition-GMOUNBTQ-BAHTf_AF.js} +1 -1
- package/payload/server/public/assets/treeView-SZITEDCU-CC7ouMFd.js +1 -0
- package/payload/server/public/assets/treemap-W4RFUUIX-CaCg27im.js +1 -0
- package/payload/server/public/assets/triangle-alert-CjDVh6r-.js +1 -0
- package/payload/server/public/assets/useCopyFeedback-DXHkkJw-.js +1 -0
- package/payload/server/public/assets/useSelectionMode-D2H8jAhE.js +1 -0
- package/payload/server/public/assets/{HeaderMenu-DtIEBHOU.css → useSubAccountSwitcher-Br7Z6Cpu.css} +1 -1
- package/payload/server/public/assets/useSubAccountSwitcher-CUJpgkKI.js +9 -0
- package/payload/server/public/assets/useVoiceRecorder-zUvPe55I.js +2 -0
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-DWqQJ9X0.js → vennDiagram-DHZGUBPP-DtEttvW4.js} +1 -1
- package/payload/server/public/assets/wardley-RL74JXVD-bMPsqQZ7.js +1 -0
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-Dg6c2Voh.js → wardleyDiagram-NUSXRM2D-K06y6CVJ.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-EhN-zeDj.js → xychartDiagram-5P7HB3ND-D66c40lp.js} +1 -1
- package/payload/server/public/browser.html +5 -6
- package/payload/server/public/calendar.html +6 -7
- package/payload/server/public/chat.html +13 -14
- package/payload/server/public/data.html +12 -13
- package/payload/server/public/graph.html +11 -12
- package/payload/server/public/index.html +15 -16
- package/payload/server/public/operator.html +15 -16
- package/payload/server/public/public.html +13 -14
- package/payload/server/public/tasks.html +5 -6
- package/payload/server/server.js +1419 -1312
- package/payload/server/public/assets/AdminLoginScreens-Rf94VD9w.js +0 -1
- package/payload/server/public/assets/AdminShell-CyGKg7MG.js +0 -2
- package/payload/server/public/assets/Checkbox-B0jmI2y2.js +0 -1
- package/payload/server/public/assets/HeaderMenu-BnTYGNaB.js +0 -9
- package/payload/server/public/assets/activity-BOBTWFr-.js +0 -1
- package/payload/server/public/assets/admin-HDLzwbLl.js +0 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-Cypt5qHL.js +0 -1
- package/payload/server/public/assets/browser-D4_XLSSm.js +0 -1
- package/payload/server/public/assets/calendar-s5V_gbI7.js +0 -1
- package/payload/server/public/assets/channel-DhrFAm7m.js +0 -1
- package/payload/server/public/assets/chat-40WyKzGb.js +0 -1
- package/payload/server/public/assets/chevron-left-C35qGP5f.js +0 -1
- package/payload/server/public/assets/chunk-426QAEUC-BhU7-TyS.js +0 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-7_kS3RBy.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-BrWqm88p.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-D0wzG5Fd.js +0 -1
- package/payload/server/public/assets/clone-DQA-nNrl.js +0 -1
- package/payload/server/public/assets/data-Bq0vU3qJ.js +0 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-C_-XjxLd.js +0 -1
- package/payload/server/public/assets/graph-labels-DzPbbhLc.js +0 -1
- package/payload/server/public/assets/info-OMHHGYJF-BH8yDCfL.js +0 -1
- package/payload/server/public/assets/infoDiagram-42DDH7IO-D8U4M0pK.js +0 -2
- package/payload/server/public/assets/maximize-2-CEbXFpQT.js +0 -1
- package/payload/server/public/assets/operator-zKk4HMdX.js +0 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-Bajcns4r.js +0 -1
- package/payload/server/public/assets/page-BrmN_vzV.js +0 -1
- package/payload/server/public/assets/page-Cts-ESBe.js +0 -32
- package/payload/server/public/assets/pie-ZZUOXDRM-D7hjM5w1.js +0 -1
- package/payload/server/public/assets/public-BItzHBc0.js +0 -1
- package/payload/server/public/assets/radar-PYXPWWZC-B46d5x7a.js +0 -1
- package/payload/server/public/assets/rotate-ccw-B0EYGhGx.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DIm3XuAD.js +0 -1
- package/payload/server/public/assets/tasks-ClE8-be8.js +0 -1
- package/payload/server/public/assets/time-entry-format-BwjGLnXu.js +0 -1
- package/payload/server/public/assets/treeView-SZITEDCU-3XQh5xQ1.js +0 -1
- package/payload/server/public/assets/treemap-W4RFUUIX-DwR-_l5z.js +0 -1
- package/payload/server/public/assets/triangle-alert-DejWYn1x.js +0 -1
- package/payload/server/public/assets/useCopyFeedback-CpSgOavK.js +0 -1
- package/payload/server/public/assets/useSelectionMode-ZQZQUgze.js +0 -1
- package/payload/server/public/assets/useSubAccountSwitcher-DuRLvCfO.js +0 -1
- package/payload/server/public/assets/useVoiceRecorder-BTYYeUJW.js +0 -2
- package/payload/server/public/assets/wardley-RL74JXVD-DZp9oCGv.js +0 -1
- /package/payload/server/public/assets/{_baseFor-CMWvz0uA.js → _baseFor-k8hYPe-U.js} +0 -0
- /package/payload/server/public/assets/{array-Cny_NT6T.js → array-BFDiaBgf.js} +0 -0
- /package/payload/server/public/assets/{cytoscape.esm-De0CCmB2.js → cytoscape.esm-Ch0xptA4.js} +0 -0
- /package/payload/server/public/assets/{defaultLocale-BahRht8U.js → defaultLocale-ZeknFqNe.js} +0 -0
- /package/payload/server/public/assets/{dist-C9D_xz81.js → dist-B2N0v8hZ.js} +0 -0
- /package/payload/server/public/assets/{init-DoIvjoJ_.js → init-0VJVrkRJ.js} +0 -0
- /package/payload/server/public/assets/{katex-Bfn1OZEl.js → katex-Br7bH10N.js} +0 -0
- /package/payload/server/public/assets/{path-CTezU8L5.js → path-INs8XTPH.js} +0 -0
- /package/payload/server/public/assets/{preload-helper-CT1Z6Pdu.js → preload-helper-D_sPnjeL.js} +0 -0
- /package/payload/server/public/assets/{rough.esm-BJo4pvXu.js → rough.esm-DU9bZLvZ.js} +0 -0
- /package/payload/server/public/assets/{src-BTKk8KAG.js → src-DHSQDYx-.js} +0 -0
|
@@ -4,8 +4,9 @@ import { createHash } from "node:crypto";
|
|
|
4
4
|
import { mkdtempSync } from "node:fs";
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
6
|
import { join } from "node:path";
|
|
7
|
-
import { newPkce, buildConsentUrl, runAccountRegisterStart, runAccountRegisterPoll, listConnected, CALENDAR_SCOPE, } from "../tools/account-register.js";
|
|
7
|
+
import { newPkce, buildConsentUrl, runAccountRegisterStart, runAccountRegisterPoll, listConnected, CALENDAR_SCOPE, LOOPBACK_REDIRECT_URI, normalisePastedCode, runAccountRegisterSubmit, } from "../tools/account-register.js";
|
|
8
8
|
import { TokenStore } from "../auth/token-store.js";
|
|
9
|
+
import { PendingStore } from "../auth/pending-store.js";
|
|
9
10
|
function newDir() {
|
|
10
11
|
return mkdtempSync(join(tmpdir(), "gcal-r-"));
|
|
11
12
|
}
|
|
@@ -17,7 +18,6 @@ test("PKCE challenge is the base64url SHA-256 of the verifier", () => {
|
|
|
17
18
|
test("consent URL carries offline access, forced consent, and the calendar scope", () => {
|
|
18
19
|
const url = new URL(buildConsentUrl({
|
|
19
20
|
clientId: "cid",
|
|
20
|
-
redirectUri: "https://h/api/google/oauth/callback",
|
|
21
21
|
state: "st",
|
|
22
22
|
challenge: "ch",
|
|
23
23
|
accountId: "acct1",
|
|
@@ -27,11 +27,33 @@ test("consent URL carries offline access, forced consent, and the calendar scope
|
|
|
27
27
|
assert.equal(url.searchParams.get("scope"), CALENDAR_SCOPE);
|
|
28
28
|
assert.equal(url.searchParams.get("code_challenge_method"), "S256");
|
|
29
29
|
assert.equal(url.searchParams.get("state"), "st");
|
|
30
|
-
|
|
30
|
+
// NO query string: Google matches redirect_uri exactly against the registered
|
|
31
|
+
// value, so a per-request parameter here fails every request with
|
|
32
|
+
// redirect_uri_mismatch. The account rides in `state` instead.
|
|
33
|
+
assert.equal(url.searchParams.get("redirect_uri"), LOOPBACK_REDIRECT_URI);
|
|
34
|
+
});
|
|
35
|
+
test("redirect_uri carries no query string at all", () => {
|
|
36
|
+
const url = new URL(buildConsentUrl({
|
|
37
|
+
clientId: "cid",
|
|
38
|
+
state: "nonce",
|
|
39
|
+
challenge: "ch",
|
|
40
|
+
accountId: "acct1",
|
|
41
|
+
}));
|
|
42
|
+
const redirect = url.searchParams.get("redirect_uri");
|
|
43
|
+
assert.ok(!redirect.includes("?"), `redirect_uri must have no query: ${redirect}`);
|
|
44
|
+
assert.ok(!redirect.includes("account="), "the account must not ride on redirect_uri");
|
|
45
|
+
});
|
|
46
|
+
test("register stores the same opaque state it sends, and no account id", async () => {
|
|
47
|
+
const dir = newDir();
|
|
48
|
+
const res = await runAccountRegisterStart({ accountId: "acct1", accountsDir: dir, clientId: "cid" });
|
|
49
|
+
const sent = new URL(res.consentUrl).searchParams.get("state");
|
|
50
|
+
const { PendingStore: PS } = await import("../auth/pending-store.js");
|
|
51
|
+
assert.equal(new PS("acct1", dir).read()?.state, sent, "pending must hold exactly what was sent");
|
|
52
|
+
assert.ok(!sent.includes("acct1"), "the account id must not ride in state");
|
|
31
53
|
});
|
|
32
54
|
test("a second register while one is live is refused as in-progress", async () => {
|
|
33
55
|
const dir = newDir();
|
|
34
|
-
const args = { accountId: "acct1", accountsDir: dir, clientId: "cid"
|
|
56
|
+
const args = { accountId: "acct1", accountsDir: dir, clientId: "cid" };
|
|
35
57
|
const first = await runAccountRegisterStart(args);
|
|
36
58
|
assert.equal(first.status, "pending");
|
|
37
59
|
assert.ok(first.consentUrl);
|
|
@@ -45,7 +67,7 @@ test("poll reports none with nothing connected and nothing pending", async () =>
|
|
|
45
67
|
});
|
|
46
68
|
test("poll reports pending while a fresh registration is live", async () => {
|
|
47
69
|
const dir = newDir();
|
|
48
|
-
await runAccountRegisterStart({ accountId: "a", accountsDir: dir, clientId: "c"
|
|
70
|
+
await runAccountRegisterStart({ accountId: "a", accountsDir: dir, clientId: "c" });
|
|
49
71
|
const res = await runAccountRegisterPoll({ accountId: "a", accountsDir: dir });
|
|
50
72
|
assert.equal(res.status, "pending");
|
|
51
73
|
});
|
|
@@ -57,4 +79,72 @@ test("listConnected reports a stored account by email", () => {
|
|
|
57
79
|
assert.equal(connected[0].email, "u@e.com");
|
|
58
80
|
assert.equal(connected[0].status, "ok");
|
|
59
81
|
});
|
|
82
|
+
test("consent redirect is the loopback IP literal, never localhost or https", () => {
|
|
83
|
+
const url = new URL(buildConsentUrl({ clientId: "cid", state: "nonce", challenge: "ch", accountId: "a" }));
|
|
84
|
+
const r = url.searchParams.get("redirect_uri");
|
|
85
|
+
assert.equal(r, LOOPBACK_REDIRECT_URI);
|
|
86
|
+
assert.equal(r, "http://127.0.0.1:8571");
|
|
87
|
+
// RFC 8252 s7.3 port-agnostic matching covers the IP literal only.
|
|
88
|
+
assert.ok(!r.includes("localhost"), "must not use the localhost hostname");
|
|
89
|
+
// Desktop clients reject https redirects outright.
|
|
90
|
+
assert.ok(!r.startsWith("https"), "must not be https");
|
|
91
|
+
assert.ok(!r.includes("?"), "no query string: Google matches redirect_uri exactly");
|
|
92
|
+
});
|
|
93
|
+
test("normalisePastedCode accepts every shape a user actually pastes", () => {
|
|
94
|
+
// Bare value.
|
|
95
|
+
assert.equal(normalisePastedCode("4/0AbCd"), "4/0AbCd");
|
|
96
|
+
assert.equal(normalisePastedCode(" 4/0AbCd "), "4/0AbCd");
|
|
97
|
+
// Google's loopback redirect ALWAYS appends scope, so the address bar shows a
|
|
98
|
+
// full URL. This is the shape the tool text actually asks the user to copy.
|
|
99
|
+
assert.equal(normalisePastedCode("http://127.0.0.1:8571/?code=4/0AbCd&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar"), "4/0AbCd");
|
|
100
|
+
// The query fragment alone, copied without the origin.
|
|
101
|
+
assert.equal(normalisePastedCode("code=4/0AbCd&scope=https%3A%2F%2Fx"), "4/0AbCd");
|
|
102
|
+
assert.equal(normalisePastedCode("?code=4/0AbCd&scope=x"), "4/0AbCd");
|
|
103
|
+
// A bare code=… with no other parameters.
|
|
104
|
+
assert.equal(normalisePastedCode("code=4/0AbCd"), "4/0AbCd");
|
|
105
|
+
// Percent-escaped bare value copied from a browser that escaped the slash.
|
|
106
|
+
assert.equal(normalisePastedCode("4%2F0AbCd"), "4/0AbCd");
|
|
107
|
+
});
|
|
108
|
+
test("normalisePastedCode never throws on a malformed percent escape", () => {
|
|
109
|
+
// decodeURIComponent throws URIError on a stray %, and it is all-or-nothing:
|
|
110
|
+
// a string with one bad escape cannot be partially decoded. The contract is
|
|
111
|
+
// therefore "return it untouched", so the user gets Google's legible
|
|
112
|
+
// invalid_grant rather than "URI malformed" from our own parser.
|
|
113
|
+
assert.doesNotThrow(() => normalisePastedCode("4%2F0Ab%zz"));
|
|
114
|
+
assert.equal(normalisePastedCode("4%2F0Ab%zz"), "4%2F0Ab%zz");
|
|
115
|
+
assert.doesNotThrow(() => normalisePastedCode("%"));
|
|
116
|
+
});
|
|
117
|
+
test("submit exchanges with the identical loopback redirect and stores the email", async () => {
|
|
118
|
+
const dir = newDir();
|
|
119
|
+
await runAccountRegisterStart({ accountId: "a", accountsDir: dir, clientId: "cid" });
|
|
120
|
+
const calls = [];
|
|
121
|
+
const fake = (async (url, init = {}) => {
|
|
122
|
+
calls.push({ url: String(url), body: String(init.body ?? "") });
|
|
123
|
+
if (String(url).includes("/token")) {
|
|
124
|
+
return new Response(JSON.stringify({ access_token: "AT", refresh_token: "RT", expires_in: 3600, scope: CALENDAR_SCOPE }), { status: 200 });
|
|
125
|
+
}
|
|
126
|
+
return new Response(JSON.stringify({ id: "user@example.com" }), { status: 200 });
|
|
127
|
+
});
|
|
128
|
+
const res = await runAccountRegisterSubmit({
|
|
129
|
+
accountId: "a", accountsDir: dir, clientId: "cid", clientSecret: "sec", code: "4/0AbCd", fetchImpl: fake,
|
|
130
|
+
});
|
|
131
|
+
assert.equal(res.email, "user@example.com");
|
|
132
|
+
// The exchange redirect must be byte-identical to the authorize one.
|
|
133
|
+
assert.ok(calls[0].body.includes(encodeURIComponent(LOOPBACK_REDIRECT_URI)));
|
|
134
|
+
assert.ok(calls[0].body.includes("client_secret=sec"));
|
|
135
|
+
assert.equal(new PendingStore("a", dir).read(), null, "pending must be cleared on success");
|
|
136
|
+
});
|
|
137
|
+
test("submit refuses when no registration is pending", async () => {
|
|
138
|
+
await assert.rejects(() => runAccountRegisterSubmit({
|
|
139
|
+
accountId: "a", accountsDir: newDir(), clientId: "c", clientSecret: "s", code: "4/0x",
|
|
140
|
+
}), /no registration in progress/i);
|
|
141
|
+
});
|
|
142
|
+
test("submit preserves the Google error body on a failed exchange", async () => {
|
|
143
|
+
const dir = newDir();
|
|
144
|
+
await runAccountRegisterStart({ accountId: "a", accountsDir: dir, clientId: "cid" });
|
|
145
|
+
const fake = (async () => new Response('{"error":"invalid_grant"}', { status: 400 }));
|
|
146
|
+
await assert.rejects(() => runAccountRegisterSubmit({
|
|
147
|
+
accountId: "a", accountsDir: dir, clientId: "c", clientSecret: "s", code: "4/0x", fetchImpl: fake,
|
|
148
|
+
}), /invalid_grant/);
|
|
149
|
+
});
|
|
60
150
|
//# sourceMappingURL=account-register.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-register.test.js","sourceRoot":"","sources":["../../src/__tests__/account-register.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,OAAO,EACP,eAAe,EACf,uBAAuB,EACvB,sBAAsB,EACtB,aAAa,EACb,cAAc,
|
|
1
|
+
{"version":3,"file":"account-register.test.js","sourceRoot":"","sources":["../../src/__tests__/account-register.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boot.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/boot.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { dirname, join } from "node:path";
|
|
6
|
+
const entry = join(dirname(fileURLToPath(import.meta.url)), "..", "index.js");
|
|
7
|
+
/** Boot the real server over stdio with an EMPTY environment.
|
|
8
|
+
*
|
|
9
|
+
* The registration test greps source text, which cannot catch a module-init
|
|
10
|
+
* throw. Plugin-system spawn enumerates tools with no per-account env, and a
|
|
11
|
+
* throw there empties the platform tool registry and breaks /agents
|
|
12
|
+
* resolution — a failure that only appears in production. This exercises the
|
|
13
|
+
* actual protocol instead. */
|
|
14
|
+
function probe() {
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
const child = spawn(process.execPath, [entry], {
|
|
17
|
+
env: { PATH: process.env.PATH ?? "" },
|
|
18
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
19
|
+
});
|
|
20
|
+
let out = "";
|
|
21
|
+
let err = "";
|
|
22
|
+
child.stdout.on("data", (d) => (out += String(d)));
|
|
23
|
+
child.stderr.on("data", (d) => (err += String(d)));
|
|
24
|
+
child.on("error", reject);
|
|
25
|
+
child.stdin.write(`${JSON.stringify({ jsonrpc: "2.0", id: 1, method: "initialize", params: { protocolVersion: "2024-11-05", capabilities: {}, clientInfo: { name: "probe", version: "0" } } })}\n`);
|
|
26
|
+
child.stdin.write(`${JSON.stringify({ jsonrpc: "2.0", id: 2, method: "tools/list", params: {} })}\n`);
|
|
27
|
+
setTimeout(() => {
|
|
28
|
+
child.kill();
|
|
29
|
+
const names = [];
|
|
30
|
+
for (const line of out.split("\n")) {
|
|
31
|
+
if (!line.trim())
|
|
32
|
+
continue;
|
|
33
|
+
try {
|
|
34
|
+
const msg = JSON.parse(line);
|
|
35
|
+
if (msg.id === 2)
|
|
36
|
+
for (const t of msg.result?.tools ?? [])
|
|
37
|
+
names.push(t.name);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
/* partial frame */
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
resolve({ tools: names, stderr: err });
|
|
44
|
+
}, 2500);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
test("boots with empty env and enumerates twelve tools over the real protocol", async () => {
|
|
48
|
+
const { tools, stderr } = await probe();
|
|
49
|
+
assert.equal(tools.length, 12, `expected 12 tools, got ${tools.length}`);
|
|
50
|
+
assert.ok(tools.includes("google-account-register-submit"));
|
|
51
|
+
assert.match(stderr, /\[google-mcp\] ready/, "must reach ready, not throw at init");
|
|
52
|
+
assert.match(stderr, /clientIdConfigured=false clientSecretConfigured=false/);
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=boot.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boot.test.js","sourceRoot":"","sources":["../../src/__tests__/boot.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { mkdtempSync } from "node:fs";
|
|
|
4
4
|
import { tmpdir } from "node:os";
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
import { TokenStore } from "../auth/token-store.js";
|
|
7
|
-
import { buildQuery, isExpiring } from "../lib/google-client.js";
|
|
7
|
+
import { buildQuery, isExpiring, accessTokenForTest } from "../lib/google-client.js";
|
|
8
8
|
function newDir() {
|
|
9
9
|
return mkdtempSync(join(tmpdir(), "gcal-c-"));
|
|
10
10
|
}
|
|
@@ -22,4 +22,29 @@ test("isExpiring is false outside the threshold", () => {
|
|
|
22
22
|
s.store("at", "rt", 3600, {});
|
|
23
23
|
assert.equal(isExpiring(s.read()), false);
|
|
24
24
|
});
|
|
25
|
+
test("refresh posts direct to Google with the client secret", async () => {
|
|
26
|
+
const dir = newDir();
|
|
27
|
+
const store = new TokenStore("a", dir, "u@e.com");
|
|
28
|
+
// Already expired, so accessToken must refresh.
|
|
29
|
+
store.store("old", "RT", -1, { email: "u@e.com" });
|
|
30
|
+
let seen = "";
|
|
31
|
+
const fake = (async (_u, init = {}) => {
|
|
32
|
+
seen = String(init.body ?? "");
|
|
33
|
+
return new Response(JSON.stringify({ access_token: "NEW", expires_in: 3600 }), { status: 200 });
|
|
34
|
+
});
|
|
35
|
+
const token = await accessTokenForTest({ accountId: "a", clientId: "cid", clientSecret: "sec", store }, fake);
|
|
36
|
+
assert.equal(token, "NEW");
|
|
37
|
+
assert.ok(seen.includes("grant_type=refresh_token"));
|
|
38
|
+
assert.ok(seen.includes("client_secret=sec"));
|
|
39
|
+
assert.ok(seen.includes("refresh_token=RT"));
|
|
40
|
+
});
|
|
41
|
+
test("a failed refresh throws and leaves held tokens intact", async () => {
|
|
42
|
+
const dir = newDir();
|
|
43
|
+
const store = new TokenStore("a", dir, "u@e.com");
|
|
44
|
+
store.store("old", "RT", -1, { email: "u@e.com" });
|
|
45
|
+
const fake = (async () => new Response('{"error":"invalid_grant"}', { status: 400 }));
|
|
46
|
+
await assert.rejects(() => accessTokenForTest({ accountId: "a", clientId: "c", clientSecret: "s", store }, fake), /invalid_grant/);
|
|
47
|
+
const after = new TokenStore("a", dir, "u@e.com").read();
|
|
48
|
+
assert.equal(after?.refreshToken, "RT", "a failed refresh must not clear credentials");
|
|
49
|
+
});
|
|
25
50
|
//# sourceMappingURL=google-client.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-client.test.js","sourceRoot":"","sources":["../../src/__tests__/google-client.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"google-client.test.js","sourceRoot":"","sources":["../../src/__tests__/google-client.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAErF,SAAS,MAAM;IACb,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;IACzD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;IAC3E,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACnD,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACrD,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;IACvE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAClD,gDAAgD;IAChD,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACnD,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,EAAW,EAAE,OAA2B,EAAE,EAAE,EAAE;QACjE,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC/B,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAClG,CAAC,CAA4B,CAAC;IAC9B,MAAM,KAAK,GAAG,MAAM,kBAAkB,CACpC,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,EAC/D,IAAI,CACL,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACrD,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC9C,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;IACvE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAClD,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAA4B,CAAC;IACjH,MAAM,MAAM,CAAC,OAAO,CAClB,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,EAC3F,eAAe,CAChB,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,6CAA6C,CAAC,CAAC;AACzF,CAAC,CAAC,CAAC"}
|
|
@@ -9,6 +9,7 @@ const mcpRoot = join(here, "..", "..");
|
|
|
9
9
|
const EXPECTED = [
|
|
10
10
|
"google-account-register",
|
|
11
11
|
"google-account-register-poll",
|
|
12
|
+
"google-account-register-submit",
|
|
12
13
|
"google-calendar-list",
|
|
13
14
|
"google-calendar-event",
|
|
14
15
|
"google-calendar-create",
|
|
@@ -19,12 +20,12 @@ const EXPECTED = [
|
|
|
19
20
|
"google-account-info",
|
|
20
21
|
"google-account-list",
|
|
21
22
|
];
|
|
22
|
-
test("index.ts registers exactly the
|
|
23
|
+
test("index.ts registers exactly the twelve planned tools", () => {
|
|
23
24
|
const src = readFileSync(join(mcpRoot, "src/index.ts"), "utf-8");
|
|
24
25
|
const found = [...src.matchAll(/"(google-[a-z-]+)"/g)].map((m) => m[1]);
|
|
25
26
|
assert.deepEqual([...new Set(found)].sort(), [...EXPECTED].sort());
|
|
26
27
|
});
|
|
27
|
-
test("PLUGIN.md declares the same
|
|
28
|
+
test("PLUGIN.md declares the same twelve tools as index.ts", () => {
|
|
28
29
|
const fm = readFileSync(join(mcpRoot, "..", "PLUGIN.md"), "utf-8");
|
|
29
30
|
const declared = [...fm.matchAll(/^\s+-\s+name:\s*(google-[a-z-]+)\s*$/gm)].map((m) => m[1]);
|
|
30
31
|
assert.deepEqual(declared.sort(), [...EXPECTED].sort());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-registration.test.js","sourceRoot":"","sources":["../../src/__tests__/index-registration.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,yBAAyB;AACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEvC,MAAM,QAAQ,GAAG;IACf,yBAAyB;IACzB,8BAA8B;IAC9B,sBAAsB;IACtB,uBAAuB;IACvB,wBAAwB;IACxB,wBAAwB;IACxB,wBAAwB;IACxB,yBAAyB;IACzB,0BAA0B;IAC1B,qBAAqB;IACrB,qBAAqB;CACtB,CAAC;AAEF,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAC/D,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACrE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;IAChE,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iEAAiE,EAAE,GAAG,EAAE;IAC3E,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;IAC1E,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5E,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1E,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index-registration.test.js","sourceRoot":"","sources":["../../src/__tests__/index-registration.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,yBAAyB;AACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEvC,MAAM,QAAQ,GAAG;IACf,yBAAyB;IACzB,8BAA8B;IAC9B,gCAAgC;IAChC,sBAAsB;IACtB,uBAAuB;IACvB,wBAAwB;IACxB,wBAAwB;IACxB,wBAAwB;IACxB,yBAAyB;IACzB,0BAA0B;IAC1B,qBAAqB;IACrB,qBAAqB;CACtB,CAAC;AAEF,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAC/D,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACrE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;IAChE,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iEAAiE,EAAE,GAAG,EAAE;IAC3E,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;IAC1E,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5E,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1E,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC"}
|
|
@@ -5,9 +5,11 @@
|
|
|
5
5
|
* Live Google Calendar for one account: read plus create, update, cancel,
|
|
6
6
|
* respond and free/busy. Admin agent only; no public surface.
|
|
7
7
|
*
|
|
8
|
-
* Auth: per-account OAuth authorization-code + PKCE
|
|
9
|
-
* here
|
|
10
|
-
* client secret.
|
|
8
|
+
* Auth: per-account OAuth authorization-code + PKCE against a Desktop client.
|
|
9
|
+
* The consent URL is minted here and the exchange happens here too, using the
|
|
10
|
+
* brand-config client secret. Google redirects to a loopback address nothing
|
|
11
|
+
* listens on, so the user copies the code from the failed page and passes it
|
|
12
|
+
* to google-account-register-submit. Tokens persist encrypted to
|
|
11
13
|
* {ACCOUNTS_DIR}/{accountId}/secrets/google/accounts/{email}/tokens.enc
|
|
12
14
|
*
|
|
13
15
|
* There is deliberately no Gmail surface — mail runs on the `email` plugin's
|
|
@@ -18,8 +20,10 @@
|
|
|
18
20
|
* ACCOUNT_ID — provided by getMcpServers when spawned per account.
|
|
19
21
|
* PLATFORM_ROOT — repo root; used to derive ACCOUNTS_DIR.
|
|
20
22
|
* GOOGLE_CLIENT_ID — brand.json#googleClientId. Operator-set per brand.
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
+
* GOOGLE_CLIENT_SECRET — brand.json#googleClientSecret. Ships in brand
|
|
24
|
+
* config: the vendor app is a Desktop client, whose
|
|
25
|
+
* secret Google sanctions embedding in distributed
|
|
26
|
+
* software. PKCE guards the code.
|
|
23
27
|
*/
|
|
24
28
|
export {};
|
|
25
29
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG"}
|
|
@@ -5,9 +5,11 @@
|
|
|
5
5
|
* Live Google Calendar for one account: read plus create, update, cancel,
|
|
6
6
|
* respond and free/busy. Admin agent only; no public surface.
|
|
7
7
|
*
|
|
8
|
-
* Auth: per-account OAuth authorization-code + PKCE
|
|
9
|
-
* here
|
|
10
|
-
* client secret.
|
|
8
|
+
* Auth: per-account OAuth authorization-code + PKCE against a Desktop client.
|
|
9
|
+
* The consent URL is minted here and the exchange happens here too, using the
|
|
10
|
+
* brand-config client secret. Google redirects to a loopback address nothing
|
|
11
|
+
* listens on, so the user copies the code from the failed page and passes it
|
|
12
|
+
* to google-account-register-submit. Tokens persist encrypted to
|
|
11
13
|
* {ACCOUNTS_DIR}/{accountId}/secrets/google/accounts/{email}/tokens.enc
|
|
12
14
|
*
|
|
13
15
|
* There is deliberately no Gmail surface — mail runs on the `email` plugin's
|
|
@@ -18,17 +20,18 @@
|
|
|
18
20
|
* ACCOUNT_ID — provided by getMcpServers when spawned per account.
|
|
19
21
|
* PLATFORM_ROOT — repo root; used to derive ACCOUNTS_DIR.
|
|
20
22
|
* GOOGLE_CLIENT_ID — brand.json#googleClientId. Operator-set per brand.
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
+
* GOOGLE_CLIENT_SECRET — brand.json#googleClientSecret. Ships in brand
|
|
24
|
+
* config: the vendor app is a Desktop client, whose
|
|
25
|
+
* secret Google sanctions embedding in distributed
|
|
26
|
+
* software. PKCE guards the code.
|
|
23
27
|
*/
|
|
24
28
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
25
29
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
26
|
-
import { resolve
|
|
27
|
-
import { existsSync } from "node:fs";
|
|
30
|
+
import { resolve } from "node:path";
|
|
28
31
|
import { z } from "zod";
|
|
29
32
|
import { TokenStore } from "./auth/token-store.js";
|
|
30
33
|
import { log } from "./lib/log.js";
|
|
31
|
-
import { runAccountRegisterStart, runAccountRegisterPoll, listConnected, } from "./tools/account-register.js";
|
|
34
|
+
import { runAccountRegisterStart, runAccountRegisterPoll, runAccountRegisterSubmit, listConnected, } from "./tools/account-register.js";
|
|
32
35
|
import { runCalendarList } from "./tools/calendar-list.js";
|
|
33
36
|
import { runCalendarEvent } from "./tools/calendar-event.js";
|
|
34
37
|
import { runCalendarCreate } from "./tools/calendar-create.js";
|
|
@@ -46,18 +49,11 @@ const ACCOUNT_ID = process.env.ACCOUNT_ID ?? null;
|
|
|
46
49
|
const PLATFORM_ROOT = process.env.PLATFORM_ROOT ?? process.cwd();
|
|
47
50
|
const ACCOUNTS_DIR = resolve(PLATFORM_ROOT, "..", "data/accounts");
|
|
48
51
|
const GOOGLE_CLIENT_ID = process.env.GOOGLE_CLIENT_ID ?? "";
|
|
49
|
-
const
|
|
50
|
-
// The loopback UI port is per-brand and already on the spawn env. A guessed
|
|
51
|
-
// default would be a brand-isolation hazard on a co-resident host: brand A
|
|
52
|
-
// would POST its refresh to brand B's server, which would service it with
|
|
53
|
-
// brand B's house client secret. Unset is refused per call, never defaulted.
|
|
54
|
-
const UI_INTERNAL_PORT = process.env.MAXY_UI_INTERNAL_PORT ?? "";
|
|
55
|
-
// Presence is checked before register; the contents are never read here.
|
|
56
|
-
const HOUSE_ENV_PATH = join(PLATFORM_ROOT, "config", "google-house.env");
|
|
52
|
+
const GOOGLE_CLIENT_SECRET = process.env.GOOGLE_CLIENT_SECRET ?? "";
|
|
57
53
|
// Standing per-boot reconciliation of expected (brand.json googleClientId,
|
|
58
54
|
// stamped onto the session-manager env) vs actual. clientIdConfigured=false on
|
|
59
55
|
// a brand that ships a value is the mis-stamp signature.
|
|
60
|
-
process.stderr.write(`[google-mcp] boot accountId=${ACCOUNT_ID ?? "null"} clientIdConfigured=${GOOGLE_CLIENT_ID ? "true" : "false"}
|
|
56
|
+
process.stderr.write(`[google-mcp] boot accountId=${ACCOUNT_ID ?? "null"} clientIdConfigured=${GOOGLE_CLIENT_ID ? "true" : "false"} clientSecretConfigured=${GOOGLE_CLIENT_SECRET ? "true" : "false"}\n`);
|
|
61
57
|
function refuseNoAccount(toolName) {
|
|
62
58
|
process.stderr.write(`[google-mcp] tool=${toolName} refuse reason=no-account-context\n`);
|
|
63
59
|
return {
|
|
@@ -98,8 +94,8 @@ const accountArg = z
|
|
|
98
94
|
function getConfig(account) {
|
|
99
95
|
if (!ACCOUNT_ID)
|
|
100
96
|
throw new Error("getConfig() called without ACCOUNT_ID — handler guard missing");
|
|
101
|
-
if (!GOOGLE_CLIENT_ID) {
|
|
102
|
-
throw new Error("
|
|
97
|
+
if (!GOOGLE_CLIENT_ID || !GOOGLE_CLIENT_SECRET) {
|
|
98
|
+
throw new Error("This brand ships no Google vendor app (client id and secret must both be present); google tools are inert until one is provisioned.");
|
|
103
99
|
}
|
|
104
100
|
const connected = listConnected(ACCOUNT_ID, ACCOUNTS_DIR);
|
|
105
101
|
let key;
|
|
@@ -122,39 +118,25 @@ function getConfig(account) {
|
|
|
122
118
|
target: key,
|
|
123
119
|
source: account ? "arg" : "sole",
|
|
124
120
|
});
|
|
125
|
-
if (!UI_INTERNAL_PORT) {
|
|
126
|
-
throw new Error("MAXY_UI_INTERNAL_PORT is not set; the token-refresh endpoint cannot be addressed without it. Refusing rather than guessing a port, which on a co-resident host would reach another brand's server.");
|
|
127
|
-
}
|
|
128
121
|
return {
|
|
129
122
|
accountId: ACCOUNT_ID,
|
|
130
123
|
clientId: GOOGLE_CLIENT_ID,
|
|
124
|
+
clientSecret: GOOGLE_CLIENT_SECRET,
|
|
131
125
|
store: new TokenStore(ACCOUNT_ID, ACCOUNTS_DIR, key),
|
|
132
|
-
refreshEndpoint: `http://127.0.0.1:${UI_INTERNAL_PORT}/api/google/oauth/refresh`,
|
|
133
126
|
};
|
|
134
127
|
}
|
|
135
128
|
const server = new McpServer({ name: "google", version: "0.1.0" });
|
|
136
|
-
lifelineTool(server, "google-account-register", "Start connecting a Google Calendar for this account. Returns a consent URL
|
|
129
|
+
lifelineTool(server, "google-account-register", "Start connecting a Google Calendar for this account. Returns a consent URL — relay it to the user, who opens it on any device, signs in and approves. Their browser then lands on a page that FAILS TO LOAD; that is expected. Ask them to copy the code from the address bar and pass it to google-account-register-submit. Does NOT block. Refuses while another registration is already live.", {}, async () => {
|
|
137
130
|
if (!ACCOUNT_ID)
|
|
138
131
|
return refuseNoAccount("google-account-register");
|
|
139
132
|
try {
|
|
140
|
-
if (!GOOGLE_CLIENT_ID) {
|
|
141
|
-
return fail("
|
|
142
|
-
}
|
|
143
|
-
if (!GOOGLE_PUBLIC_BASE) {
|
|
144
|
-
return fail("GOOGLE_PUBLIC_BASE is not configured; the consent redirect cannot be built without this install's public host.");
|
|
145
|
-
}
|
|
146
|
-
// Pre-flight the house secret by PRESENCE ONLY — never read, the secret
|
|
147
|
-
// must not enter this process. Without this the operator discovers the
|
|
148
|
-
// gap only at the callback, i.e. after they have already consented, and
|
|
149
|
-
// the failure looks like a broken flow rather than a missing file.
|
|
150
|
-
if (!existsSync(HOUSE_ENV_PATH)) {
|
|
151
|
-
return fail(`The Google client secret is not installed on this device. Create ${HOUSE_ENV_PATH} (mode 600) containing GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET from the brand's Google Cloud OAuth client, then try again. Without it the consent flow completes and then fails at the final step.`);
|
|
133
|
+
if (!GOOGLE_CLIENT_ID || !GOOGLE_CLIENT_SECRET) {
|
|
134
|
+
return fail("This brand ships no Google vendor app; google tools are inert until one is provisioned.");
|
|
152
135
|
}
|
|
153
136
|
const res = await runAccountRegisterStart({
|
|
154
137
|
accountId: ACCOUNT_ID,
|
|
155
138
|
accountsDir: ACCOUNTS_DIR,
|
|
156
139
|
clientId: GOOGLE_CLIENT_ID,
|
|
157
|
-
publicBase: GOOGLE_PUBLIC_BASE,
|
|
158
140
|
});
|
|
159
141
|
return ok(res);
|
|
160
142
|
}
|
|
@@ -294,6 +276,25 @@ lifelineTool(server, "google-account-list", "Every Google account connected to t
|
|
|
294
276
|
return fail(`google-account-list failed: ${err.message}`);
|
|
295
277
|
}
|
|
296
278
|
});
|
|
279
|
+
lifelineTool(server, "google-account-register-submit", "Finish connecting a Google Calendar. After the user approves consent their browser lands on a page that fails to load; the address bar carries the code. Pass that code here. Accepts the bare code, a `code=` prefix, or a %2F-escaped paste.", { code: z.string().min(1) }, async ({ code }) => {
|
|
280
|
+
if (!ACCOUNT_ID)
|
|
281
|
+
return refuseNoAccount("google-account-register-submit");
|
|
282
|
+
try {
|
|
283
|
+
if (!GOOGLE_CLIENT_ID || !GOOGLE_CLIENT_SECRET) {
|
|
284
|
+
return fail("This brand ships no Google vendor app; google tools are inert until one is provisioned.");
|
|
285
|
+
}
|
|
286
|
+
return ok(await runAccountRegisterSubmit({
|
|
287
|
+
accountId: ACCOUNT_ID,
|
|
288
|
+
accountsDir: ACCOUNTS_DIR,
|
|
289
|
+
clientId: GOOGLE_CLIENT_ID,
|
|
290
|
+
clientSecret: GOOGLE_CLIENT_SECRET,
|
|
291
|
+
code,
|
|
292
|
+
}));
|
|
293
|
+
}
|
|
294
|
+
catch (err) {
|
|
295
|
+
return fail(`google-account-register-submit failed: ${err.message}`);
|
|
296
|
+
}
|
|
297
|
+
});
|
|
297
298
|
const transport = new StdioServerTransport();
|
|
298
299
|
await server.connect(transport);
|
|
299
300
|
process.stderr.write(`[google-mcp] ready account=${ACCOUNT_ID ?? "null"}\n`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Authenticated access to Google Calendar API v3.
|
|
3
3
|
*
|
|
4
|
-
* Refresh
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* holds it and exposes POST /api/google/oauth/refresh for this purpose.
|
|
4
|
+
* Refresh happens HERE, direct to Google. The vendor app is a Desktop
|
|
5
|
+
* (installed app) client, whose secret ships in brand config — Google states an
|
|
6
|
+
* installed-app secret "is obviously not treated as a secret" — so there is no
|
|
7
|
+
* server-side holder to delegate to and no reason to route through one.
|
|
9
8
|
*/
|
|
10
9
|
import { TokenStore, type TokenBlob } from "../auth/token-store.js";
|
|
11
10
|
export interface GoogleConfig {
|
|
12
11
|
accountId: string;
|
|
13
12
|
clientId: string;
|
|
13
|
+
/** Ships in brand config alongside the client id. Sanctioned for installed
|
|
14
|
+
* apps; PKCE remains the protection against an intercepted code. */
|
|
15
|
+
clientSecret: string;
|
|
14
16
|
store: TokenStore;
|
|
15
|
-
/** Loopback URL of the platform/ui route that holds the client secret. */
|
|
16
|
-
refreshEndpoint: string;
|
|
17
17
|
}
|
|
18
18
|
export declare function buildQuery(q: Record<string, string | number | undefined>): string;
|
|
19
19
|
export declare function isExpiring(blob: TokenBlob): boolean;
|
|
20
|
+
/** Test seam. Production callers reach this through callCalendar. */
|
|
21
|
+
export declare function accessTokenForTest(config: GoogleConfig, doFetch: typeof fetch): Promise<string>;
|
|
20
22
|
export declare function callCalendar<T>(config: GoogleConfig, path: string, init?: {
|
|
21
23
|
method?: string;
|
|
22
24
|
body?: unknown;
|
|
23
25
|
query?: Record<string, string | number | undefined>;
|
|
26
|
+
fetchImpl?: typeof fetch;
|
|
24
27
|
}): Promise<T>;
|
|
25
28
|
/** The primary calendar's id IS the account's email address. Used instead of a
|
|
26
29
|
* userinfo call, because the identity scopes are deliberately not requested. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-client.d.ts","sourceRoot":"","sources":["../../src/lib/google-client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"google-client.d.ts","sourceRoot":"","sources":["../../src/lib/google-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,UAAU,EAAwB,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAM1F,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB;yEACqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAOjF;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAEnD;AAwDD,qEAAqE;AACrE,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,wBAAsB,YAAY,CAAC,CAAC,EAClC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IACJ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;IACpD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CACrB,GACL,OAAO,CAAC,CAAC,CAAC,CA+BZ;AAED;iFACiF;AACjF,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAG/E"}
|