excalidrop 0.1.2 → 0.1.4
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/cli.d.ts +0 -21
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1 -46
- package/dist/cli.js.map +1 -1
- package/dist/frontend/assets/{advancedFormat-bKUmsig-.js → advancedFormat-tiBAHNGo.js} +1 -1
- package/dist/frontend/assets/{ar-SA-G6X2FPQ2-C7K_UR3P.js → ar-SA-G6X2FPQ2-DVxiWV5Z.js} +1 -1
- package/dist/frontend/assets/{arc-BI_FJWE7.js → arc-Cc3ncJ1n.js} +1 -1
- package/dist/frontend/assets/{az-AZ-76LH7QW2-PkhuRuSr.js → az-AZ-76LH7QW2-Z_2BqDo-.js} +1 -1
- package/dist/frontend/assets/{bg-BG-XCXSNQG7-CgLRSYTl.js → bg-BG-XCXSNQG7-DrxGJZOG.js} +1 -1
- package/dist/frontend/assets/{blockDiagram-38ab4fdb-BFdBRYSn.js → blockDiagram-38ab4fdb-CDnkTFfP.js} +1 -1
- package/dist/frontend/assets/{blockDiagram-68f4deed-Ynbqr7bQ.js → blockDiagram-68f4deed-Bb0W6mxN.js} +1 -1
- package/dist/frontend/assets/{bn-BD-2XOGV67Q-CEvkU0mz.js → bn-BD-2XOGV67Q-BkGJ-w8k.js} +1 -1
- package/dist/frontend/assets/{c4Diagram-15b5d702-Dm7F1Pn_.js → c4Diagram-15b5d702-ByRV0tka.js} +1 -1
- package/dist/frontend/assets/{c4Diagram-3d4e48cf-COkK-e67.js → c4Diagram-3d4e48cf-QSVnzYYK.js} +1 -1
- package/dist/frontend/assets/{ca-ES-6MX7JW3Y-DzP6q9bE.js → ca-ES-6MX7JW3Y-BBJvOPE1.js} +1 -1
- package/dist/frontend/assets/channel-BQSIb3i3.js +1 -0
- package/dist/frontend/assets/{classDiagram-70f12bd4-CRzulwvH.js → classDiagram-70f12bd4-DDFBNGUt.js} +1 -1
- package/dist/frontend/assets/{classDiagram-d40c83e7-DNbA-n-a.js → classDiagram-d40c83e7-cgC3s7Nz.js} +1 -1
- package/dist/frontend/assets/{classDiagram-v2-d5a6b087-l-GglywH.js → classDiagram-v2-d5a6b087-BgB8AG2e.js} +1 -1
- package/dist/frontend/assets/{classDiagram-v2-f2320105-B_TY1zoc.js → classDiagram-v2-f2320105-Dtywkpeg.js} +1 -1
- package/dist/frontend/assets/clone-BoZziNL9.js +1 -0
- package/dist/frontend/assets/{createText-2e5e7dd3-DB_k52Pn.js → createText-2e5e7dd3-CqY00v-4.js} +1 -1
- package/dist/frontend/assets/{createText-d213de94-D-G49giw.js → createText-d213de94-D59sBfqq.js} +1 -1
- package/dist/frontend/assets/{cs-CZ-2BRQDIVT-Bf4TOzpR.js → cs-CZ-2BRQDIVT-CK09MAsg.js} +1 -1
- package/dist/frontend/assets/{cytoscape-cose-bilkent-DQYypj0P.js → cytoscape-cose-bilkent-CKy_tuGZ.js} +1 -1
- package/dist/frontend/assets/{da-DK-5WZEPLOC-jO-5kyXb.js → da-DK-5WZEPLOC-V4hdLKuT.js} +1 -1
- package/dist/frontend/assets/{de-DE-XR44H4JA-BkNXWOVh.js → de-DE-XR44H4JA-Dw8qkP9g.js} +1 -1
- package/dist/frontend/assets/drop-BFhuMYSw.png +0 -0
- package/dist/frontend/assets/{edges-332bd1c7-CVvMtkTa.js → edges-332bd1c7-D-u0KMZB.js} +1 -1
- package/dist/frontend/assets/{edges-e0da2a9e-DQBAvC8-.js → edges-e0da2a9e-B3UFqLqY.js} +1 -1
- package/dist/frontend/assets/{el-GR-BZB4AONW-Dv7Y9hMk.js → el-GR-BZB4AONW-BUdBQbYg.js} +1 -1
- package/dist/frontend/assets/{elk.bundled-YVS3PsMH.js → elk.bundled-BZA3Xcoo.js} +1 -1
- package/dist/frontend/assets/{erDiagram-880f2ed8-BjBeR38f.js → erDiagram-880f2ed8-CNxm7e1x.js} +1 -1
- package/dist/frontend/assets/{erDiagram-9861fffd-B2Bi3R45.js → erDiagram-9861fffd-C2u_ziAM.js} +1 -1
- package/dist/frontend/assets/{es-ES-U4NZUMDT-CWhs0SQY.js → es-ES-U4NZUMDT-DS0FAZqX.js} +1 -1
- package/dist/frontend/assets/{eu-ES-A7QVB2H4-BfkFwc3e.js → eu-ES-A7QVB2H4-D-D5uidc.js} +1 -1
- package/dist/frontend/assets/{fa-IR-HGAKTJCU-BgWzSj46.js → fa-IR-HGAKTJCU-mAW_2-jg.js} +1 -1
- package/dist/frontend/assets/{fi-FI-Z5N7JZ37-CUyvkum-.js → fi-FI-Z5N7JZ37-B9mW6nxS.js} +1 -1
- package/dist/frontend/assets/{flowDb-7c981674-BSZyyVBf.js → flowDb-7c981674-6JB2gd0I.js} +1 -1
- package/dist/frontend/assets/{flowDb-956e92f1-BC3-CLkF.js → flowDb-956e92f1-BbpkWRi7.js} +1 -1
- package/dist/frontend/assets/{flowDiagram-66a62f08-H57DAvmM.js → flowDiagram-66a62f08-DrhrQuXc.js} +1 -1
- package/dist/frontend/assets/{flowDiagram-cbd28bf7-Bw4Z2nBD.js → flowDiagram-cbd28bf7-BmNY7bvJ.js} +1 -1
- package/dist/frontend/assets/flowDiagram-v2-96b9c2cf-Z3H2d3Wj.js +1 -0
- package/dist/frontend/assets/flowDiagram-v2-ffc7f31a-CIQOMghC.js +1 -0
- package/dist/frontend/assets/{flowchart-elk-definition-36e2d292-1kZNdf3X.js → flowchart-elk-definition-36e2d292-4G1YiIlk.js} +1 -1
- package/dist/frontend/assets/{flowchart-elk-definition-4a651766-DDhG2Esi.js → flowchart-elk-definition-4a651766-Cm94SrrQ.js} +1 -1
- package/dist/frontend/assets/{fr-FR-RHASNOE6-7xzoRwbd.js → fr-FR-RHASNOE6-BXnmUxTA.js} +1 -1
- package/dist/frontend/assets/{ganttDiagram-04f9e578-CtUSsXCz.js → ganttDiagram-04f9e578-X0BweAnG.js} +1 -1
- package/dist/frontend/assets/{ganttDiagram-c361ad54-K42AklFY.js → ganttDiagram-c361ad54-D3vxZ5MQ.js} +1 -1
- package/dist/frontend/assets/{gitGraphDiagram-21fc4d3e-uW6XA6Y6.js → gitGraphDiagram-21fc4d3e-wznrpRWn.js} +1 -1
- package/dist/frontend/assets/{gitGraphDiagram-72cf32ee-CCNbhnBg.js → gitGraphDiagram-72cf32ee-B9zCS3Pw.js} +1 -1
- package/dist/frontend/assets/{gl-ES-HMX3MZ6V-CXuDDwNP.js → gl-ES-HMX3MZ6V-CrUx-ab6.js} +1 -1
- package/dist/frontend/assets/{graph-CYOmcSYN.js → graph-BQZ6SIVr.js} +1 -1
- package/dist/frontend/assets/{graph-o42dOfI7.js → graph-Cda8xSTx.js} +1 -1
- package/dist/frontend/assets/{he-IL-6SHJWFNN-O9dzh9EM.js → he-IL-6SHJWFNN-D33eaw6-.js} +1 -1
- package/dist/frontend/assets/{hi-IN-IWLTKZ5I-DlrOXhWs.js → hi-IN-IWLTKZ5I-DEnStF-g.js} +1 -1
- package/dist/frontend/assets/{hu-HU-A5ZG7DT2-C3eNg-uI.js → hu-HU-A5ZG7DT2-BjH2w8Sn.js} +1 -1
- package/dist/frontend/assets/{id-ID-SAP4L64H-6iM4pI5c.js → id-ID-SAP4L64H-Bc6R-JEz.js} +1 -1
- package/dist/frontend/assets/{index-3862675e-DrvLhypC.js → index-3862675e-CpYfS3Db.js} +1 -1
- package/dist/frontend/assets/{index-6079d271-BgVTRqg2.js → index-6079d271-Y2bgyRpa.js} +1 -1
- package/dist/frontend/assets/{index-HkUXslJy.js → index-D7eYnAQp.js} +4 -4
- package/dist/frontend/assets/{index-D-cr7jpJ.js → index-DIz4WrSB.js} +72 -72
- package/dist/frontend/assets/{infoDiagram-4a4f5b27-ZxmAcaW1.js → infoDiagram-4a4f5b27-Bm3Oq-Rq.js} +1 -1
- package/dist/frontend/assets/{infoDiagram-f8f76790-Bn-PhiFG.js → infoDiagram-f8f76790-oNVitBKM.js} +1 -1
- package/dist/frontend/assets/{it-IT-JPQ66NNP-B26NQzGp.js → it-IT-JPQ66NNP-BcxQABF2.js} +1 -1
- package/dist/frontend/assets/{ja-JP-DBVTYXUO-CB0fvnYJ.js → ja-JP-DBVTYXUO-D1zIM-nt.js} +1 -1
- package/dist/frontend/assets/{journeyDiagram-29694f62-ggDKs06f.js → journeyDiagram-29694f62-CamPk_3P.js} +1 -1
- package/dist/frontend/assets/{journeyDiagram-49397b02-pdDS-n-z.js → journeyDiagram-49397b02-D6w3tLtf.js} +1 -1
- package/dist/frontend/assets/{kaa-6HZHGXH3-YNdBdcwJ.js → kaa-6HZHGXH3-CoILysVg.js} +1 -1
- package/dist/frontend/assets/{kab-KAB-ZGHBKWFO-D86pwZO0.js → kab-KAB-ZGHBKWFO-B9ZbybBt.js} +1 -1
- package/dist/frontend/assets/{kk-KZ-P5N5QNE5-CpG5oheM.js → kk-KZ-P5N5QNE5-Dxi4GIQ7.js} +1 -1
- package/dist/frontend/assets/{km-KH-HSX4SM5Z-DYOZ3Azw.js → km-KH-HSX4SM5Z-DaJ7EtO2.js} +1 -1
- package/dist/frontend/assets/{ko-KR-MTYHY66A-BHorm6lC.js → ko-KR-MTYHY66A-DG57Ah12.js} +1 -1
- package/dist/frontend/assets/{ku-TR-6OUDTVRD-CM9RgEHv.js → ku-TR-6OUDTVRD-DnDf9E8a.js} +1 -1
- package/dist/frontend/assets/{layout-DW9Qf-At.js → layout-BsWfhUAF.js} +1 -1
- package/dist/frontend/assets/{layout-CCtkxrAf.js → layout-Drr-66M9.js} +1 -1
- package/dist/frontend/assets/{line-DvZfgg9P.js → line-DwQObOhP.js} +1 -1
- package/dist/frontend/assets/{linear-FwFrGRfa.js → linear-C36MjJps.js} +1 -1
- package/dist/frontend/assets/{lt-LT-XHIRWOB4-DvriKXBj.js → lt-LT-XHIRWOB4-D_zqS0yg.js} +1 -1
- package/dist/frontend/assets/{lv-LV-5QDEKY6T-DzQpwk87.js → lv-LV-5QDEKY6T-owIsIh1b.js} +1 -1
- package/dist/frontend/assets/{mindmap-definition-ac74a2e8-DsRo8f2w.js → mindmap-definition-ac74a2e8-Cf9JbrBJ.js} +1 -1
- package/dist/frontend/assets/{mindmap-definition-fc14e90a-dQ9reluI.js → mindmap-definition-fc14e90a-BpsNCNCp.js} +1 -1
- package/dist/frontend/assets/{mr-IN-CRQNXWMA-C7RzxxP5.js → mr-IN-CRQNXWMA-CS9XUj74.js} +1 -1
- package/dist/frontend/assets/{my-MM-5M5IBNSE-B-RRuy29.js → my-MM-5M5IBNSE-BKB060k9.js} +1 -1
- package/dist/frontend/assets/{nb-NO-T6EIAALU-B47x16Ik.js → nb-NO-T6EIAALU-CkmLUrvm.js} +1 -1
- package/dist/frontend/assets/{nl-NL-IS3SIHDZ-BxAKoQne.js → nl-NL-IS3SIHDZ-DdiLyJoz.js} +1 -1
- package/dist/frontend/assets/{nn-NO-6E72VCQL-dfpbEDSZ.js → nn-NO-6E72VCQL-Yevp6f_Y.js} +1 -1
- package/dist/frontend/assets/{oc-FR-POXYY2M6-gv6geBjV.js → oc-FR-POXYY2M6-D_M6GHup.js} +1 -1
- package/dist/frontend/assets/{pa-IN-N4M65BXN-CY30-qH7.js → pa-IN-N4M65BXN-1vuACN9n.js} +1 -1
- package/dist/frontend/assets/{pica-DWYGHLQV.js → pica-DDDx0iqx.js} +1 -1
- package/dist/frontend/assets/{pie-CDiWh1rj.js → pie-CFIpuQMO.js} +1 -1
- package/dist/frontend/assets/{pieDiagram-421022e6-Bgy-duyf.js → pieDiagram-421022e6-DO7e_Qgw.js} +1 -1
- package/dist/frontend/assets/{pieDiagram-8a3498a8-DH7FsbPK.js → pieDiagram-8a3498a8-BEoqChXo.js} +1 -1
- package/dist/frontend/assets/{pl-PL-T2D74RX3-TrHugsIA.js → pl-PL-T2D74RX3-Cc6Q5nSh.js} +1 -1
- package/dist/frontend/assets/{pt-BR-5N22H2LF-CJxdFp9c.js → pt-BR-5N22H2LF-3eEiAax3.js} +1 -1
- package/dist/frontend/assets/{pt-PT-UZXXM6DQ-CB-1q6YJ.js → pt-PT-UZXXM6DQ-CgnF0Le7.js} +1 -1
- package/dist/frontend/assets/{quadrantDiagram-0957ecba-DcwYI1oi.js → quadrantDiagram-0957ecba-C1Eo-ZUY.js} +1 -1
- package/dist/frontend/assets/{quadrantDiagram-120e2f19-CvHU5a9v.js → quadrantDiagram-120e2f19-Bdfsl_O7.js} +1 -1
- package/dist/frontend/assets/{requirementDiagram-23d650b8-tdagN8HP.js → requirementDiagram-23d650b8-DiOK6QW3.js} +1 -1
- package/dist/frontend/assets/{requirementDiagram-deff3bca-BMGM-fSI.js → requirementDiagram-deff3bca-BDJ-7T4h.js} +1 -1
- package/dist/frontend/assets/{ro-RO-JPDTUUEW-DQq9DBOd.js → ro-RO-JPDTUUEW-CbJ3IB7a.js} +1 -1
- package/dist/frontend/assets/{ru-RU-B4JR7IUQ-CWX32rfh.js → ru-RU-B4JR7IUQ-PQGmeGG4.js} +1 -1
- package/dist/frontend/assets/{sankeyDiagram-04a897e0-3i6zWpY2.js → sankeyDiagram-04a897e0-DV25bgN2.js} +1 -1
- package/dist/frontend/assets/{sankeyDiagram-23345273-ncj1Ol7S.js → sankeyDiagram-23345273-szSb_Sei.js} +1 -1
- package/dist/frontend/assets/{selectAll-DJwesbwT.js → selectAll-DsrPvhqV.js} +1 -1
- package/dist/frontend/assets/{sequenceDiagram-17ac3bff-ChyKKRZA.js → sequenceDiagram-17ac3bff-Dg88bSlc.js} +1 -1
- package/dist/frontend/assets/{sequenceDiagram-704730f1-D57_wP9k.js → sequenceDiagram-704730f1-DRIjLCxx.js} +1 -1
- package/dist/frontend/assets/{si-LK-N5RQ5JYF-Lkc5ZxyG.js → si-LK-N5RQ5JYF-BtIIudm3.js} +1 -1
- package/dist/frontend/assets/{sk-SK-C5VTKIMK-DyvYXjqZ.js → sk-SK-C5VTKIMK-CIwXticU.js} +1 -1
- package/dist/frontend/assets/{sl-SI-NN7IZMDC-D_MvP9Rh.js → sl-SI-NN7IZMDC-CXEdg57y.js} +1 -1
- package/dist/frontend/assets/{stateDiagram-587899a1-OjFTnFLS.js → stateDiagram-587899a1-BwRwgRo6.js} +1 -1
- package/dist/frontend/assets/{stateDiagram-9c5f0230-BzU36S5C.js → stateDiagram-9c5f0230-C8n96rER.js} +1 -1
- package/dist/frontend/assets/{stateDiagram-v2-51a3dcff-CfX1qo7U.js → stateDiagram-v2-51a3dcff-B7e5E4J7.js} +1 -1
- package/dist/frontend/assets/{stateDiagram-v2-d93cdb3a-BH7Ud4sU.js → stateDiagram-v2-d93cdb3a-B18iZQLw.js} +1 -1
- package/dist/frontend/assets/{styles-2ab5d517-CA8x9Nh5.js → styles-2ab5d517-CfWubwio.js} +1 -1
- package/dist/frontend/assets/{styles-5f03d8d2-BnO2pLhV.js → styles-5f03d8d2-C-_n19AB.js} +1 -1
- package/dist/frontend/assets/{styles-6aaf32cf-COnot1ea.js → styles-6aaf32cf-Dh-DHkVP.js} +1 -1
- package/dist/frontend/assets/{styles-9a916d00-C3QkBgTF.js → styles-9a916d00-Boy0hUEG.js} +1 -1
- package/dist/frontend/assets/{styles-c10674c1-CPAG2_rr.js → styles-c10674c1-BfxiK3Ns.js} +1 -1
- package/dist/frontend/assets/{styles-edf9a4b0-B8Q9fyu0.js → styles-edf9a4b0-T7mKViRF.js} +1 -1
- package/dist/frontend/assets/subset-shared.chunk.js +1 -1
- package/dist/frontend/assets/subset-worker.chunk.js +1 -1
- package/dist/frontend/assets/{sv-SE-XGPEYMSR-t6voGQSI.js → sv-SE-XGPEYMSR-dVrUAqld.js} +1 -1
- package/dist/frontend/assets/{svgDrawCommon-08f97a94-CdT21LWf.js → svgDrawCommon-08f97a94-fsWk6SQc.js} +1 -1
- package/dist/frontend/assets/{svgDrawCommon-3ba9043b-D1MU7jAE.js → svgDrawCommon-3ba9043b-BJ8X3qS-.js} +1 -1
- package/dist/frontend/assets/{ta-IN-2NMHFXQM-7VmfDDyV.js → ta-IN-2NMHFXQM-CtVVZfIT.js} +1 -1
- package/dist/frontend/assets/{th-TH-HPSO5L25-B5rLEY9P.js → th-TH-HPSO5L25-Do90CyDN.js} +1 -1
- package/dist/frontend/assets/{timeline-definition-7e6b55e7-BIcL44O_.js → timeline-definition-7e6b55e7-D_iHA485.js} +1 -1
- package/dist/frontend/assets/{timeline-definition-85554ec2-TgrYYwpU.js → timeline-definition-85554ec2-nhT8QMsO.js} +1 -1
- package/dist/frontend/assets/{tr-TR-DEFEU3FU-0CgOHXTn.js → tr-TR-DEFEU3FU-MfR-IQke.js} +1 -1
- package/dist/frontend/assets/{uk-UA-QMV73CPH-CzSFsIsx.js → uk-UA-QMV73CPH-CPet8B1O.js} +1 -1
- package/dist/frontend/assets/{union-CnQAJu0l.js → union-BgYwhB7T.js} +1 -1
- package/dist/frontend/assets/{vi-VN-M7AON7JQ-Bhx3rYU9.js → vi-VN-M7AON7JQ-3HD06T_8.js} +1 -1
- package/dist/frontend/assets/{xychartDiagram-b6496bcd-BMKDop6v.js → xychartDiagram-b6496bcd-D5vSaFT2.js} +1 -1
- package/dist/frontend/assets/{xychartDiagram-e933f94c-DAWithrN.js → xychartDiagram-e933f94c-DLIHXsUi.js} +1 -1
- package/dist/frontend/assets/{zh-CN-LNUGB5OW-Br52_wH4.js → zh-CN-LNUGB5OW-t2RyWPw2.js} +1 -1
- package/dist/frontend/assets/{zh-HK-E62DVLB3-Cj6mnIQ9.js → zh-HK-E62DVLB3-Bj22hc7e.js} +1 -1
- package/dist/frontend/assets/{zh-TW-RAJ6MFWO-yLEsVBbC.js → zh-TW-RAJ6MFWO-CBRhqhU1.js} +1 -1
- package/dist/frontend/assets/{zipObject-BeXj5PVd.js → zipObject-DMfHW2o8.js} +1 -1
- package/dist/frontend/index.html +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -28
- package/dist/index.js.map +1 -1
- package/dist/server.js +0 -9
- package/dist/server.js.map +1 -1
- package/dist/target.d.ts +0 -3
- package/dist/target.d.ts.map +1 -1
- package/dist/target.js +1 -20
- package/dist/target.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -8
- package/dist/types.js.map +1 -1
- package/dist/utils/auth.d.ts +0 -1
- package/dist/utils/auth.d.ts.map +1 -1
- package/dist/utils/auth.js +0 -1
- package/dist/utils/auth.js.map +1 -1
- package/dist/utils/github.d.ts +7 -9
- package/dist/utils/github.d.ts.map +1 -1
- package/dist/utils/github.js +57 -36
- package/dist/utils/github.js.map +1 -1
- package/dist/utils/logger.js +2 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/r2store.d.ts +0 -7
- package/dist/utils/r2store.d.ts.map +1 -1
- package/dist/utils/r2store.js.map +1 -1
- package/frontend/drop.png +0 -0
- package/frontend/index.html +1 -0
- package/frontend/src/utils/ghSync.ts +99 -36
- package/frontend/src/utils/mermaidConverter.ts +2 -8
- package/frontend/src/utils/webmcp.ts +7 -27
- package/package.json +2 -1
- package/src/cli.ts +16 -47
- package/src/index.ts +11 -30
- package/src/server.ts +9 -9
- package/src/target.ts +10 -20
- package/src/types.ts +16 -18
- package/src/utils/auth.ts +1 -1
- package/src/utils/github.ts +61 -33
- package/src/utils/logger.ts +2 -2
- package/src/utils/r2store.ts +1 -7
- package/vite.config.js +0 -2
- package/dist/frontend/assets/channel-BqCiG5n3.js +0 -1
- package/dist/frontend/assets/clone-B6Jqcrku.js +0 -1
- package/dist/frontend/assets/flowDiagram-v2-96b9c2cf-CBjbm_oB.js +0 -1
- package/dist/frontend/assets/flowDiagram-v2-ffc7f31a-CoQufPp2.js +0 -1
package/dist/utils/github.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
/** GitHub as source of truth. Scene = canvas.excalidraw on main; viewer copy on gh-pages. No Actions. */
|
|
2
1
|
import logger from './logger.js';
|
|
3
2
|
import { execSync } from 'node:child_process';
|
|
4
3
|
const API = 'https://api.github.com';
|
|
5
|
-
/** Zero-config: GITHUB_TOKEN env, else `gh auth token`, else '' (public reads still work). */
|
|
6
4
|
export function token() {
|
|
7
5
|
if (process.env.GITHUB_TOKEN)
|
|
8
6
|
return process.env.GITHUB_TOKEN;
|
|
@@ -13,7 +11,6 @@ export function token() {
|
|
|
13
11
|
return '';
|
|
14
12
|
}
|
|
15
13
|
}
|
|
16
|
-
/** Zero-config: current repo from git remote. Empty allowlist = current repo only. */
|
|
17
14
|
export function currentRepo() {
|
|
18
15
|
try {
|
|
19
16
|
const url = execSync('git config --get remote.origin.url', { encoding: 'utf8' }).trim();
|
|
@@ -25,6 +22,7 @@ export function currentRepo() {
|
|
|
25
22
|
}
|
|
26
23
|
}
|
|
27
24
|
export const SCENE_PATH = process.env.SCENE_PATH || 'canvas.excalidraw';
|
|
25
|
+
export const CANVAS_BRANCH = process.env.CANVAS_BRANCH || 'excalidrop';
|
|
28
26
|
export function allowedRepos() {
|
|
29
27
|
const list = (process.env.ALLOWED_REPOS || '').split(',').map(s => s.trim().toLowerCase()).filter(Boolean);
|
|
30
28
|
if (list.length)
|
|
@@ -32,16 +30,12 @@ export function allowedRepos() {
|
|
|
32
30
|
const cur = currentRepo();
|
|
33
31
|
return cur ? [cur] : [];
|
|
34
32
|
}
|
|
35
|
-
/** Legacy allowlist hook (hosted multi-tenant remote only). Local MCP paths do not
|
|
36
|
-
* gate on it: the user's own token + GitHub's API enforcement is the real
|
|
37
|
-
* gate, and any user must be able to work on any repo they can access. */
|
|
38
33
|
export function assertRepo(_repo) {
|
|
39
|
-
// intentionally no-op — see above
|
|
40
34
|
}
|
|
41
35
|
function headers() {
|
|
42
36
|
return { Authorization: `Bearer ${token()}`, Accept: 'application/vnd.github+json', 'User-Agent': 'excalidrop', 'Content-Type': 'application/json' };
|
|
43
37
|
}
|
|
44
|
-
export async function getFile(repo, path, ref =
|
|
38
|
+
export async function getFile(repo, path, ref = CANVAS_BRANCH) {
|
|
45
39
|
assertRepo(repo);
|
|
46
40
|
const r = await fetch(`${API}/repos/${repo}/contents/${path}?ref=${ref}`, { headers: headers() });
|
|
47
41
|
if (r.status === 404)
|
|
@@ -52,7 +46,20 @@ export async function getFile(repo, path, ref = 'main') {
|
|
|
52
46
|
const text = Buffer.from(j.content, 'base64').toString('utf8');
|
|
53
47
|
return { sha: j.sha, content: JSON.parse(text) };
|
|
54
48
|
}
|
|
55
|
-
|
|
49
|
+
async function ensureBranch(repo, branch) {
|
|
50
|
+
const has = await fetch(`${API}/repos/${repo}/git/ref/heads/${branch}`, { headers: headers() });
|
|
51
|
+
if (has.ok)
|
|
52
|
+
return;
|
|
53
|
+
const repoInfo = await (await fetch(`${API}/repos/${repo}`, { headers: headers() })).json();
|
|
54
|
+
const from = repoInfo.default_branch || 'main';
|
|
55
|
+
const ref = await (await fetch(`${API}/repos/${repo}/git/ref/heads/${from}`, { headers: headers() })).json();
|
|
56
|
+
if (!ref.object?.sha)
|
|
57
|
+
throw new Error(`cannot create ${branch}: no ${from} branch`);
|
|
58
|
+
const mkRef = await fetch(`${API}/repos/${repo}/git/refs`, { method: 'POST', headers: headers(), body: JSON.stringify({ ref: `refs/heads/${branch}`, sha: ref.object.sha }) });
|
|
59
|
+
if (!mkRef.ok)
|
|
60
|
+
throw new Error(`cannot create ${branch}: ${(await mkRef.text()).slice(0, 200)}`);
|
|
61
|
+
}
|
|
62
|
+
export async function putFile(repo, path, data, message, branch = CANVAS_BRANCH, sha) {
|
|
56
63
|
assertRepo(repo);
|
|
57
64
|
if (!token())
|
|
58
65
|
throw new Error('GITHUB_TOKEN missing');
|
|
@@ -60,52 +67,66 @@ export async function putFile(repo, path, data, message, branch = 'main', sha) {
|
|
|
60
67
|
if (sha)
|
|
61
68
|
body.sha = sha;
|
|
62
69
|
let r = await fetch(`${API}/repos/${repo}/contents/${path}`, { method: 'PUT', headers: headers(), body: JSON.stringify(body) });
|
|
63
|
-
if (r.status === 404
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const branchExists = await fetch(`${API}/repos/${repo}/git/ref/heads/main`, { headers: headers() });
|
|
68
|
-
if (branchExists.ok)
|
|
69
|
-
throw new Error(`GitHub put 404: ${await r.text()}`.slice(0, 200));
|
|
70
|
-
const repoInfo = await (await fetch(`${API}/repos/${repo}`, { headers: headers() })).json();
|
|
71
|
-
const from = repoInfo.default_branch && repoInfo.default_branch !== 'main' ? repoInfo.default_branch : 'gh-pages';
|
|
72
|
-
const ref = await (await fetch(`${API}/repos/${repo}/git/ref/heads/${from}`, { headers: headers() })).json();
|
|
73
|
-
if (!ref.object?.sha)
|
|
74
|
-
throw new Error(`cannot bootstrap main: no ${from} branch`);
|
|
75
|
-
const mkRef = await fetch(`${API}/repos/${repo}/git/refs`, { method: 'POST', headers: headers(), body: JSON.stringify({ ref: 'refs/heads/main', sha: ref.object.sha }) });
|
|
76
|
-
if (!mkRef.ok)
|
|
77
|
-
throw new Error(`cannot bootstrap main: ${(await mkRef.text()).slice(0, 200)}`);
|
|
78
|
-
// main bootstrapped from another branch may already contain the file — attach its sha
|
|
79
|
-
const existing = await (await fetch(`${API}/repos/${repo}/contents/${path}?ref=main`, { headers: headers() })).json();
|
|
80
|
-
if (existing.sha)
|
|
70
|
+
if (r.status === 404) {
|
|
71
|
+
await ensureBranch(repo, branch);
|
|
72
|
+
const existing = await getFile(repo, path, branch).catch(() => null);
|
|
73
|
+
if (existing?.sha)
|
|
81
74
|
body.sha = existing.sha;
|
|
75
|
+
else
|
|
76
|
+
delete body.sha;
|
|
82
77
|
r = await fetch(`${API}/repos/${repo}/contents/${path}`, { method: 'PUT', headers: headers(), body: JSON.stringify(body) });
|
|
83
78
|
}
|
|
84
79
|
if (r.status === 409)
|
|
85
80
|
throw new Error('CONFLICT: file changed upstream, refetch sha and retry');
|
|
81
|
+
if (r.status === 422 && !sha) {
|
|
82
|
+
const existing = await getFile(repo, path, branch).catch(() => null);
|
|
83
|
+
if (!existing?.sha)
|
|
84
|
+
throw new Error(`GitHub put 422: ${(await r.text()).slice(0, 200)}`);
|
|
85
|
+
body.sha = existing.sha;
|
|
86
|
+
r = await fetch(`${API}/repos/${repo}/contents/${path}`, { method: 'PUT', headers: headers(), body: JSON.stringify(body) });
|
|
87
|
+
if (r.status === 409)
|
|
88
|
+
throw new Error('CONFLICT: file changed upstream, refetch sha and retry');
|
|
89
|
+
}
|
|
86
90
|
if (!r.ok)
|
|
87
91
|
throw new Error(`GitHub put ${r.status}: ${await r.text()}`);
|
|
88
92
|
const j = await r.json();
|
|
89
93
|
logger.info(`Committed ${path}@${branch} in ${repo}`);
|
|
90
94
|
return j.content.sha;
|
|
91
95
|
}
|
|
92
|
-
/** Load scene with sha for optimistic concurrency. */
|
|
93
96
|
export async function loadScene(repo) {
|
|
94
97
|
assertRepo(repo);
|
|
95
|
-
const f = await getFile(repo, SCENE_PATH,
|
|
98
|
+
const f = await getFile(repo, SCENE_PATH, CANVAS_BRANCH).catch(() => null);
|
|
96
99
|
if (!f)
|
|
97
100
|
return { elements: [], files: [], sha: null };
|
|
98
101
|
return { elements: f.content.elements || [], files: f.content.files || [], sha: f.sha };
|
|
99
102
|
}
|
|
100
|
-
/** Save scene to main (1 commit per batch). Returns new sha. */
|
|
101
103
|
export async function saveScene(repo, elements, files, sha, msg) {
|
|
102
|
-
return putFile(repo, SCENE_PATH, { type: 'excalidraw', version: 2, source: 'excalidrop', elements, files: {}
|
|
104
|
+
return putFile(repo, SCENE_PATH, { type: 'excalidraw', version: 2, source: 'excalidrop', elements, files: files || {} }, msg, CANVAS_BRANCH, sha || undefined);
|
|
105
|
+
}
|
|
106
|
+
export async function syncPages(_repo, _scene) {
|
|
107
|
+
}
|
|
108
|
+
export async function updateRepoMetadata(repo, updates) {
|
|
109
|
+
assertRepo(repo);
|
|
110
|
+
if (!token())
|
|
111
|
+
throw new Error('GITHUB_TOKEN missing');
|
|
112
|
+
const r = await fetch(`${API}/repos/${repo}`, { method: 'PATCH', headers: headers(), body: JSON.stringify(updates) });
|
|
113
|
+
if (!r.ok)
|
|
114
|
+
throw new Error(`GitHub PATCH ${r.status}: ${await r.text()}`);
|
|
115
|
+
logger.info(`Updated metadata for ${repo}`);
|
|
103
116
|
}
|
|
104
|
-
|
|
105
|
-
export async function syncPages(repo, scene) {
|
|
117
|
+
export async function ensureRepoMetadata(repo, homepage) {
|
|
106
118
|
assertRepo(repo);
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
await
|
|
119
|
+
if (!token())
|
|
120
|
+
throw new Error('GITHUB_TOKEN missing');
|
|
121
|
+
const r = await fetch(`${API}/repos/${repo}`, { headers: headers() });
|
|
122
|
+
if (!r.ok)
|
|
123
|
+
throw new Error(`GitHub GET ${r.status}: ${await r.text()}`);
|
|
124
|
+
const data = await r.json();
|
|
125
|
+
if (!data.description || data.description.trim() === '') {
|
|
126
|
+
await updateRepoMetadata(repo, { description: homepage, homepage });
|
|
127
|
+
}
|
|
128
|
+
else if (!data.homepage || data.homepage.trim() === '') {
|
|
129
|
+
await updateRepoMetadata(repo, { homepage });
|
|
130
|
+
}
|
|
110
131
|
}
|
|
111
132
|
//# sourceMappingURL=github.js.map
|
package/dist/utils/github.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/utils/github.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/utils/github.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/logger.js
CHANGED
|
@@ -12,11 +12,11 @@ const logger = winston.createLogger({
|
|
|
12
12
|
})),
|
|
13
13
|
transports: [
|
|
14
14
|
new winston.transports.Console({
|
|
15
|
-
level: 'warn',
|
|
15
|
+
level: 'warn',
|
|
16
16
|
stderrLevels: ['warn', 'error']
|
|
17
17
|
}),
|
|
18
18
|
new winston.transports.File({
|
|
19
|
-
filename: LOG_FILE_PATH,
|
|
19
|
+
filename: LOG_FILE_PATH,
|
|
20
20
|
level: 'debug'
|
|
21
21
|
})
|
|
22
22
|
]
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAEpF,MAAM,MAAM,GAAmB,OAAO,CAAC,YAAY,CAAC;IAClD,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;IAEtC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAC5B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,EAC/D,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,EAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC,EAC1E,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM;YAC9D,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACrC,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE,CAAA;IACpE,CAAC,CAAC,CACH;IAED,UAAU,EAAE;QACV,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;YAC7B,KAAK,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAEpF,MAAM,MAAM,GAAmB,OAAO,CAAC,YAAY,CAAC;IAClD,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;IAEtC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAC5B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,EAC/D,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,EAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC,EAC1E,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM;YAC9D,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACrC,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE,CAAA;IACpE,CAAC,CAAC,CACH;IAED,UAAU,EAAE;QACV,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;YAC7B,KAAK,EAAE,MAAM;YACb,YAAY,EAAE,CAAC,MAAM,EAAC,OAAO,CAAC;SAC/B,CAAC;QAEF,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YAC1B,QAAQ,EAAE,aAAa;YACvB,KAAK,EAAE,OAAO;SACf,CAAC;KACH;CACF,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
package/dist/utils/r2store.d.ts
CHANGED
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Minimal S3-compatible R2 client over fetch with AWS SigV4.
|
|
3
|
-
* Reads creds from env (GH Actions secrets):
|
|
4
|
-
* R2_ACCOUNT_ID, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, R2_BUCKET, R2_KEY_PREFIX
|
|
5
|
-
* CLOUDFLARER2TOKEN supported as "accountId:keyId:secret" or "keyId:secret" or raw secret
|
|
6
|
-
* (with R2_ACCOUNT_ID also set) for seamless setup.
|
|
7
|
-
*/
|
|
8
1
|
export interface R2Config {
|
|
9
2
|
accountId: string;
|
|
10
3
|
keyId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"r2store.d.ts","sourceRoot":"","sources":["../../src/utils/r2store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"r2store.d.ts","sourceRoot":"","sources":["../../src/utils/r2store.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;CACpG;AAED,wBAAgB,WAAW,IAAI,QAAQ,GAAG,IAAI,CAe7C;AA8BD,wBAAsB,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAQ3E;AAED,wBAAsB,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"r2store.js","sourceRoot":"","sources":["../../src/utils/r2store.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"r2store.js","sourceRoot":"","sources":["../../src/utils/r2store.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
package/frontend/index.html
CHANGED
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* Static-viewer GitHub sync. Zero config on *.github.io:
|
|
3
|
-
* owner/repo are derived from the URL, token comes from
|
|
4
|
-
* localStorage (pasted PAT or agent handoff via #token=...).
|
|
5
|
-
* Device-flow login needs VITE_GITHUB_CLIENT_ID (one-time OAuth App setup).
|
|
6
|
-
*/
|
|
1
|
+
|
|
7
2
|
|
|
8
3
|
export interface RepoRef { owner: string; repo: string; branch: string }
|
|
9
4
|
|
|
@@ -24,7 +19,7 @@ export function detectRepo(): RepoRef | null {
|
|
|
24
19
|
const TOKEN_KEY = 'excalidrop_gh_token';
|
|
25
20
|
|
|
26
21
|
export function getToken(): string | null {
|
|
27
|
-
|
|
22
|
+
|
|
28
23
|
if (window.location.hash.startsWith('#token=')) {
|
|
29
24
|
const t = decodeURIComponent(window.location.hash.slice('#token='.length));
|
|
30
25
|
if (t) {
|
|
@@ -55,7 +50,7 @@ async function gh(path: string, token: string, init?: RequestInit): Promise<any>
|
|
|
55
50
|
return r.json();
|
|
56
51
|
}
|
|
57
52
|
|
|
58
|
-
|
|
53
|
+
|
|
59
54
|
export async function pushScene(
|
|
60
55
|
ref: RepoRef, token: string, scene: { elements: unknown[]; files?: Record<string, unknown> },
|
|
61
56
|
): Promise<string> {
|
|
@@ -64,7 +59,7 @@ export async function pushScene(
|
|
|
64
59
|
try {
|
|
65
60
|
const cur = await gh(`/repos/${ref.owner}/${ref.repo}/contents/${path}?ref=${ref.branch}`, token);
|
|
66
61
|
sha = cur.sha;
|
|
67
|
-
} catch {
|
|
62
|
+
} catch {}
|
|
68
63
|
const body: any = {
|
|
69
64
|
message: `excalidrop: autosync ${scene.elements.length} elements`,
|
|
70
65
|
content: btoa(unescape(encodeURIComponent(JSON.stringify(
|
|
@@ -81,7 +76,7 @@ export async function pushScene(
|
|
|
81
76
|
return out.content.sha as string;
|
|
82
77
|
}
|
|
83
78
|
|
|
84
|
-
|
|
79
|
+
|
|
85
80
|
export async function loadStaticScene(): Promise<{ elements: any[]; files?: Record<string, unknown> }> {
|
|
86
81
|
const r = await fetch('./canvas.excalidraw', { cache: 'no-cache' });
|
|
87
82
|
if (!r.ok) throw new Error(`scene fetch ${r.status}`);
|
|
@@ -89,11 +84,7 @@ export async function loadStaticScene(): Promise<{ elements: any[]; files?: Reco
|
|
|
89
84
|
return { elements: j.elements || [], files: j.files || {} };
|
|
90
85
|
}
|
|
91
86
|
|
|
92
|
-
|
|
93
|
-
* polling step may be CORS-blocked on static hosting, so the agent can
|
|
94
|
-
* complete it instead (github_login tool) and hand back a #token= link.
|
|
95
|
-
* NOTE: no `scope` — GitHub App user-tokens use fine-grained permissions
|
|
96
|
-
* (user ∩ app), never scopes. */
|
|
87
|
+
|
|
97
88
|
export async function startDeviceFlow(clientId: string): Promise<{ user_code: string; verification_uri: string }> {
|
|
98
89
|
const r = await fetch('https://github.com/login/device/code', {
|
|
99
90
|
method: 'POST',
|
|
@@ -105,6 +96,92 @@ export async function startDeviceFlow(clientId: string): Promise<{ user_code: st
|
|
|
105
96
|
return { user_code: j.user_code, verification_uri: j.verification_uri };
|
|
106
97
|
}
|
|
107
98
|
|
|
99
|
+
export interface DeviceFlowSession {
|
|
100
|
+
device_code: string;
|
|
101
|
+
user_code: string;
|
|
102
|
+
verification_uri: string;
|
|
103
|
+
interval: number;
|
|
104
|
+
|
|
105
|
+
expires_at: number;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const FLOW_KEY = 'excalidrop_device_flow';
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
export async function startDeviceFlowFull(clientId: string): Promise<DeviceFlowSession> {
|
|
112
|
+
const r = await fetch('https://github.com/login/device/code', {
|
|
113
|
+
method: 'POST',
|
|
114
|
+
headers: { Accept: 'application/json', 'Content-Type': 'application/json' },
|
|
115
|
+
body: JSON.stringify({ client_id: clientId }),
|
|
116
|
+
});
|
|
117
|
+
if (!r.ok) throw new Error('device flow start failed');
|
|
118
|
+
const j = await r.json();
|
|
119
|
+
return {
|
|
120
|
+
device_code: j.device_code as string,
|
|
121
|
+
user_code: j.user_code as string,
|
|
122
|
+
verification_uri: (j.verification_uri as string) || 'https://github.com/login/device',
|
|
123
|
+
interval: Number(j.interval) || 5,
|
|
124
|
+
expires_at: Date.now() + (Number(j.expires_in) || 900) * 1000,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
export async function pollDeviceToken(
|
|
130
|
+
clientId: string,
|
|
131
|
+
session: Pick<DeviceFlowSession, 'device_code' | 'interval' | 'expires_at'>,
|
|
132
|
+
signal?: AbortSignal,
|
|
133
|
+
): Promise<string> {
|
|
134
|
+
let interval = session.interval;
|
|
135
|
+
for (;;) {
|
|
136
|
+
if (signal?.aborted) throw new DOMException('Login cancelled', 'AbortError');
|
|
137
|
+
if (Date.now() >= session.expires_at) throw new Error('Login code expired — please try again.');
|
|
138
|
+
await new Promise((r) => setTimeout(r, interval * 1000));
|
|
139
|
+
if (signal?.aborted) throw new DOMException('Login cancelled', 'AbortError');
|
|
140
|
+
const r = await fetch('https://github.com/login/oauth/access_token', {
|
|
141
|
+
method: 'POST',
|
|
142
|
+
headers: { Accept: 'application/json', 'Content-Type': 'application/json' },
|
|
143
|
+
body: JSON.stringify({
|
|
144
|
+
client_id: clientId,
|
|
145
|
+
device_code: session.device_code,
|
|
146
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
|
|
147
|
+
}),
|
|
148
|
+
});
|
|
149
|
+
if (!r.ok) throw new Error('Login polling failed');
|
|
150
|
+
const j = await r.json();
|
|
151
|
+
if (j.access_token) return j.access_token as string;
|
|
152
|
+
if (j.error === 'authorization_pending') continue;
|
|
153
|
+
if (j.error === 'slow_down') {
|
|
154
|
+
interval += 5;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (j.error) throw new Error(j.error_description || j.error);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export function saveFlowSession(s: DeviceFlowSession | null): void {
|
|
162
|
+
try {
|
|
163
|
+
if (s) sessionStorage.setItem(FLOW_KEY, JSON.stringify(s));
|
|
164
|
+
else sessionStorage.removeItem(FLOW_KEY);
|
|
165
|
+
} catch {
|
|
166
|
+
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function loadFlowSession(): DeviceFlowSession | null {
|
|
171
|
+
try {
|
|
172
|
+
const raw = sessionStorage.getItem(FLOW_KEY);
|
|
173
|
+
if (!raw) return null;
|
|
174
|
+
const s = JSON.parse(raw) as DeviceFlowSession;
|
|
175
|
+
if (!s.device_code || Date.now() >= s.expires_at) {
|
|
176
|
+
sessionStorage.removeItem(FLOW_KEY);
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
return s;
|
|
180
|
+
} catch {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
108
185
|
export type Access = 'editor' | 'viewer' | 'denied';
|
|
109
186
|
|
|
110
187
|
export type AccessDetail =
|
|
@@ -113,19 +190,12 @@ export type AccessDetail =
|
|
|
113
190
|
| 'no-token-permissions' // classic token with no read access to the repo
|
|
114
191
|
| null; // editor/viewer — no problem to report
|
|
115
192
|
|
|
116
|
-
|
|
117
|
-
* the token only reaches repos both the user AND the app can access, so this
|
|
118
|
-
* mirrors GitHub's own enforcement (repo access == canvas access).
|
|
119
|
-
* `detail` tells the UI *why* access was denied so the login modal can
|
|
120
|
-
* point at the right fix (install the app vs. add this repo to the install). */
|
|
193
|
+
|
|
121
194
|
export async function checkAccess(ref: RepoRef, token: string): Promise<{ access: Access; login: string; detail: AccessDetail }> {
|
|
122
195
|
const me = await gh('/user', token);
|
|
123
196
|
const login = (me.login || '') as string;
|
|
124
197
|
const wanted = `${ref.owner}/${ref.repo}`.toLowerCase();
|
|
125
|
-
|
|
126
|
-
// Classic PATs/OAuth tokens get 403 here ("must authenticate with an access
|
|
127
|
-
// token authorized to a GitHub App") and fall through to Path 2.
|
|
128
|
-
// per_page=100: without it a user with many repos can miss the hit (p.30 default).
|
|
198
|
+
|
|
129
199
|
const inst = await gh('/user/installations?per_page=100', token).catch(() => null);
|
|
130
200
|
if (inst?.installations) {
|
|
131
201
|
if ((inst.installations as unknown[]).length === 0) {
|
|
@@ -135,10 +205,7 @@ export async function checkAccess(ref: RepoRef, token: string): Promise<{ access
|
|
|
135
205
|
const repos = await gh(`/user/installations/${(i as any).id}/repositories?per_page=100`, token).catch(() => null);
|
|
136
206
|
const hit = (repos?.repositories || []).find((r: any) => r.full_name.toLowerCase() === wanted);
|
|
137
207
|
if (hit) {
|
|
138
|
-
|
|
139
|
-
// permission endpoint; if that probe fails, start optimistic-editor —
|
|
140
|
-
// the Contents API is the real enforcement and a 403 push demotes to
|
|
141
|
-
// viewer (fail-open UI, fail-closed API).
|
|
208
|
+
|
|
142
209
|
const perms = await gh(`/repos/${ref.owner}/${ref.repo}/collaborators/${login}/permission`, token).catch(() => null);
|
|
143
210
|
const p = (perms?.permission || '') as string;
|
|
144
211
|
if (p === 'read' || p === 'triage') return { access: 'viewer', login, detail: null };
|
|
@@ -147,7 +214,7 @@ export async function checkAccess(ref: RepoRef, token: string): Promise<{ access
|
|
|
147
214
|
}
|
|
148
215
|
return { access: 'denied', login, detail: 'repo-not-covered' };
|
|
149
216
|
}
|
|
150
|
-
|
|
217
|
+
|
|
151
218
|
const repo = await gh(`/repos/${ref.owner}/${ref.repo}`, token).catch(() => null);
|
|
152
219
|
if (!repo?.permissions) return { access: 'denied', login, detail: 'no-token-permissions' };
|
|
153
220
|
if (repo.permissions.push || repo.permissions.admin || repo.permissions.maintain) {
|
|
@@ -156,16 +223,12 @@ export async function checkAccess(ref: RepoRef, token: string): Promise<{ access
|
|
|
156
223
|
return { access: 'viewer', login, detail: null };
|
|
157
224
|
}
|
|
158
225
|
|
|
159
|
-
|
|
160
|
-
* Shared GitHub App (one app, many installs — any user installs it on their
|
|
161
|
-
* own repo; the Client ID is public, not a secret). Overridable at publish
|
|
162
|
-
* time via VITE_GITHUB_CLIENT_ID / VITE_GITHUB_APP_SLUG.
|
|
163
|
-
*/
|
|
226
|
+
|
|
164
227
|
export const CLIENT_ID =
|
|
165
228
|
((import.meta as any).env?.VITE_GITHUB_CLIENT_ID as string | undefined) ||
|
|
166
|
-
'Iv23liuS2fx3QOEIoDmx';
|
|
229
|
+
'Iv23liuS2fx3QOEIoDmx';
|
|
167
230
|
export const APP_SLUG =
|
|
168
231
|
((import.meta as any).env?.VITE_GITHUB_APP_SLUG as string | undefined) || 'excalidrop';
|
|
169
232
|
export const APP_INSTALL_URL = `https://github.com/apps/${APP_SLUG}/installations/new`;
|
|
170
|
-
|
|
233
|
+
|
|
171
234
|
export const HAS_CLIENT_ID = !!CLIENT_ID && !CLIENT_ID.includes('EXCALIDROP_APP');
|
|
@@ -8,16 +8,12 @@ export interface MermaidConversionResult {
|
|
|
8
8
|
error?: string;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
* Converts a Mermaid diagram definition to Excalidraw elements
|
|
13
|
-
* This function needs to run in the browser context as it requires DOM access
|
|
14
|
-
*/
|
|
11
|
+
|
|
15
12
|
export const convertMermaidToExcalidraw = async (
|
|
16
13
|
mermaidDefinition: string,
|
|
17
14
|
config?: MermaidConfig
|
|
18
15
|
): Promise<MermaidConversionResult> => {
|
|
19
16
|
try {
|
|
20
|
-
// Parse the Mermaid diagram to Excalidraw elements
|
|
21
17
|
const result = await parseMermaidToExcalidraw(mermaidDefinition, config);
|
|
22
18
|
|
|
23
19
|
return {
|
|
@@ -33,9 +29,7 @@ export const convertMermaidToExcalidraw = async (
|
|
|
33
29
|
}
|
|
34
30
|
};
|
|
35
31
|
|
|
36
|
-
|
|
37
|
-
* Default Mermaid configuration for Excalidraw conversion
|
|
38
|
-
*/
|
|
32
|
+
|
|
39
33
|
export const DEFAULT_MERMAID_CONFIG: MermaidConfig = {
|
|
40
34
|
startOnLoad: false,
|
|
41
35
|
flowchart: {
|
|
@@ -1,20 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* Thin WebMCP layer for the Excalidrop canvas.
|
|
3
|
-
*
|
|
4
|
-
* Exposes the live in-tab Excalidraw scene as browser-native tools via
|
|
5
|
-
* `document.modelContext.registerTool()` (W3C WebML CG draft, Chromium 146+
|
|
6
|
-
* behind `#enable-webmcp-testing`). No-ops where the API is absent.
|
|
7
|
-
*
|
|
8
|
-
* Tools mirror the local MCP names so agents recognise them:
|
|
9
|
-
* - describe_scene (read-only)
|
|
10
|
-
* - create_elements (write)
|
|
11
|
-
* - update_element (write)
|
|
12
|
-
* - delete_element (write)
|
|
13
|
-
* - clear_canvas (consequential)
|
|
14
|
-
*
|
|
15
|
-
* The page itself is the tool registry — no HTTP/SSE/stdio involved.
|
|
16
|
-
* Auth/session comes for free: tools run inside the user's tab.
|
|
17
|
-
*/
|
|
1
|
+
|
|
18
2
|
|
|
19
3
|
interface MinimalCanvasApi {
|
|
20
4
|
getSceneElements(): Array<Record<string, any>>;
|
|
@@ -53,7 +37,7 @@ function getModelContext(): ModelContextLike | null {
|
|
|
53
37
|
(nav['modelContext'] as ModelContextLike | undefined);
|
|
54
38
|
if (mc && typeof mc.registerTool === 'function') return mc;
|
|
55
39
|
} catch {
|
|
56
|
-
|
|
40
|
+
|
|
57
41
|
}
|
|
58
42
|
return null;
|
|
59
43
|
}
|
|
@@ -64,7 +48,7 @@ function newId(): string {
|
|
|
64
48
|
return (crypto as Crypto).randomUUID().slice(0, 12);
|
|
65
49
|
}
|
|
66
50
|
} catch {
|
|
67
|
-
|
|
51
|
+
|
|
68
52
|
}
|
|
69
53
|
return `el_${Math.random().toString(36).slice(2, 10)}`;
|
|
70
54
|
}
|
|
@@ -107,11 +91,7 @@ const ELEMENT_SCHEMA: Record<string, unknown> = {
|
|
|
107
91
|
additionalProperties: true,
|
|
108
92
|
};
|
|
109
93
|
|
|
110
|
-
|
|
111
|
-
* Register the thin WebMCP toolset against the live canvas.
|
|
112
|
-
* Safe to call anywhere: feature-detects `document.modelContext` first.
|
|
113
|
-
* Returns a handle whose `cleanup()` unregisters all tools (AbortSignal).
|
|
114
|
-
*/
|
|
94
|
+
|
|
115
95
|
export function registerCanvasWebMCP(getApi: CanvasApiGetter): WebMCPHandle {
|
|
116
96
|
const noop = () => {};
|
|
117
97
|
const mc = getModelContext();
|
|
@@ -132,12 +112,12 @@ export function registerCanvasWebMCP(getApi: CanvasApiGetter): WebMCPHandle {
|
|
|
132
112
|
const p = mc.registerTool(tool, { signal });
|
|
133
113
|
if (p && typeof (p as Promise<void>).catch === 'function') {
|
|
134
114
|
(p as Promise<void>).catch(() => {
|
|
135
|
-
|
|
115
|
+
|
|
136
116
|
});
|
|
137
117
|
}
|
|
138
118
|
count += 1;
|
|
139
119
|
} catch {
|
|
140
|
-
|
|
120
|
+
|
|
141
121
|
}
|
|
142
122
|
};
|
|
143
123
|
|
|
@@ -278,7 +258,7 @@ export function registerCanvasWebMCP(getApi: CanvasApiGetter): WebMCPHandle {
|
|
|
278
258
|
try {
|
|
279
259
|
controller.abort();
|
|
280
260
|
} catch {
|
|
281
|
-
|
|
261
|
+
|
|
282
262
|
}
|
|
283
263
|
},
|
|
284
264
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "excalidrop",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Drop an Excalidraw canvas + MCP server into any project — per-project ports, one-command AI agent setup",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"dev:server": "npx tsc --watch",
|
|
20
20
|
"production": "npm run build && npm run canvas",
|
|
21
21
|
"postinstall": "node scripts/postinstall.mjs",
|
|
22
|
+
"prepare": "npm run build",
|
|
22
23
|
"excalidrop": "node dist/cli.js",
|
|
23
24
|
"prepublishOnly": "npm run build",
|
|
24
25
|
"test:bind": "npm run build:server && node scripts/check-local-bind.mjs",
|