excalidrop 0.1.4 → 0.2.2

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.
Files changed (223) hide show
  1. package/README.md +70 -125
  2. package/dist/cli.d.ts +7 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +936 -389
  5. package/dist/cli.js.map +1 -1
  6. package/dist/frontend/assets/{advancedFormat-tiBAHNGo.js → advancedFormat-Be4KR5mp.js} +1 -1
  7. package/dist/frontend/assets/{ar-SA-G6X2FPQ2-DVxiWV5Z.js → ar-SA-G6X2FPQ2-B6ekz3Ba.js} +1 -1
  8. package/dist/frontend/assets/arc-DlgXyGPj.js +1 -0
  9. package/dist/frontend/assets/{az-AZ-76LH7QW2-Z_2BqDo-.js → az-AZ-76LH7QW2-01MDUsF0.js} +1 -1
  10. package/dist/frontend/assets/{bg-BG-XCXSNQG7-DrxGJZOG.js → bg-BG-XCXSNQG7--fArB8Ao.js} +1 -1
  11. package/dist/frontend/assets/{blockDiagram-38ab4fdb-CDnkTFfP.js → blockDiagram-38ab4fdb-CmsVhOwi.js} +1 -1
  12. package/dist/frontend/assets/{blockDiagram-68f4deed-Bb0W6mxN.js → blockDiagram-68f4deed-DU_wNYlO.js} +6 -6
  13. package/dist/frontend/assets/{bn-BD-2XOGV67Q-BkGJ-w8k.js → bn-BD-2XOGV67Q-h8juqzfQ.js} +1 -1
  14. package/dist/frontend/assets/{c4Diagram-15b5d702-ByRV0tka.js → c4Diagram-15b5d702-ClZalz0L.js} +1 -1
  15. package/dist/frontend/assets/{c4Diagram-3d4e48cf-QSVnzYYK.js → c4Diagram-3d4e48cf-BkFVM0tP.js} +1 -1
  16. package/dist/frontend/assets/{ca-ES-6MX7JW3Y-BBJvOPE1.js → ca-ES-6MX7JW3Y-DMBR3qVX.js} +1 -1
  17. package/dist/frontend/assets/channel-BxFR7168.js +1 -0
  18. package/dist/frontend/assets/{classDiagram-70f12bd4-DDFBNGUt.js → classDiagram-70f12bd4-BXAJnakg.js} +1 -1
  19. package/dist/frontend/assets/{classDiagram-d40c83e7-cgC3s7Nz.js → classDiagram-d40c83e7-DVhipa45.js} +1 -1
  20. package/dist/frontend/assets/classDiagram-v2-d5a6b087-CiHMsbhj.js +2 -0
  21. package/dist/frontend/assets/{classDiagram-v2-f2320105-Dtywkpeg.js → classDiagram-v2-f2320105-1CqIxWOB.js} +2 -2
  22. package/dist/frontend/assets/clone-CMl85WSi.js +1 -0
  23. package/dist/frontend/assets/{createText-2e5e7dd3-CqY00v-4.js → createText-2e5e7dd3-D3kSz3YE.js} +1 -1
  24. package/dist/frontend/assets/{createText-d213de94-D59sBfqq.js → createText-d213de94-DvJeLlQX.js} +4 -4
  25. package/dist/frontend/assets/{cs-CZ-2BRQDIVT-CK09MAsg.js → cs-CZ-2BRQDIVT-BUcdPrAr.js} +1 -1
  26. package/dist/frontend/assets/{cytoscape-cose-bilkent-CKy_tuGZ.js → cytoscape-cose-bilkent-CKoSm_2z.js} +1 -1
  27. package/dist/frontend/assets/{da-DK-5WZEPLOC-V4hdLKuT.js → da-DK-5WZEPLOC-C1nkchuC.js} +1 -1
  28. package/dist/frontend/assets/{de-DE-XR44H4JA-Dw8qkP9g.js → de-DE-XR44H4JA-DO2_bO1X.js} +1 -1
  29. package/dist/frontend/assets/{edges-332bd1c7-D-u0KMZB.js → edges-332bd1c7-C5qM1sDU.js} +1 -1
  30. package/dist/frontend/assets/{edges-e0da2a9e-B3UFqLqY.js → edges-e0da2a9e-BRt7qomS.js} +1 -1
  31. package/dist/frontend/assets/{el-GR-BZB4AONW-BUdBQbYg.js → el-GR-BZB4AONW-CrjSdaU2.js} +1 -1
  32. package/dist/frontend/assets/{elk.bundled-BZA3Xcoo.js → elk.bundled-Dmec6Rq6.js} +1 -1
  33. package/dist/frontend/assets/{erDiagram-880f2ed8-CNxm7e1x.js → erDiagram-880f2ed8-BI7kP523.js} +4 -4
  34. package/dist/frontend/assets/{erDiagram-9861fffd-C2u_ziAM.js → erDiagram-9861fffd-DMyCDrgI.js} +1 -1
  35. package/dist/frontend/assets/{es-ES-U4NZUMDT-DS0FAZqX.js → es-ES-U4NZUMDT-rrdjPi-M.js} +1 -1
  36. package/dist/frontend/assets/{eu-ES-A7QVB2H4-D-D5uidc.js → eu-ES-A7QVB2H4-uYn3S3D5.js} +1 -1
  37. package/dist/frontend/assets/{fa-IR-HGAKTJCU-mAW_2-jg.js → fa-IR-HGAKTJCU-DWW_BVFR.js} +1 -1
  38. package/dist/frontend/assets/{fi-FI-Z5N7JZ37-B9mW6nxS.js → fi-FI-Z5N7JZ37-CMXxeZ4W.js} +1 -1
  39. package/dist/frontend/assets/{flowDb-7c981674-6JB2gd0I.js → flowDb-7c981674-Dsj6xMzr.js} +1 -1
  40. package/dist/frontend/assets/{flowDb-956e92f1-BbpkWRi7.js → flowDb-956e92f1-26g7kJju.js} +1 -1
  41. package/dist/frontend/assets/{flowDiagram-66a62f08-DrhrQuXc.js → flowDiagram-66a62f08-C9eQZtdf.js} +1 -1
  42. package/dist/frontend/assets/{flowDiagram-cbd28bf7-BmNY7bvJ.js → flowDiagram-cbd28bf7-D051xFrI.js} +3 -3
  43. package/dist/frontend/assets/flowDiagram-v2-96b9c2cf-DIa4RdMh.js +1 -0
  44. package/dist/frontend/assets/flowDiagram-v2-ffc7f31a-CnvFT8HV.js +1 -0
  45. package/dist/frontend/assets/{flowchart-elk-definition-36e2d292-4G1YiIlk.js → flowchart-elk-definition-36e2d292-C9fsvhV-.js} +2 -2
  46. package/dist/frontend/assets/{flowchart-elk-definition-4a651766-Cm94SrrQ.js → flowchart-elk-definition-4a651766-BkVNuJOw.js} +1 -1
  47. package/dist/frontend/assets/{fr-FR-RHASNOE6-BXnmUxTA.js → fr-FR-RHASNOE6-DIfK_rjW.js} +1 -1
  48. package/dist/frontend/assets/{ganttDiagram-04f9e578-X0BweAnG.js → ganttDiagram-04f9e578-CZeF2a4Y.js} +1 -1
  49. package/dist/frontend/assets/{ganttDiagram-c361ad54-D3vxZ5MQ.js → ganttDiagram-c361ad54-DbkIZ-wU.js} +1 -1
  50. package/dist/frontend/assets/{gitGraphDiagram-21fc4d3e-wznrpRWn.js → gitGraphDiagram-21fc4d3e-CLqlSEuE.js} +6 -6
  51. package/dist/frontend/assets/{gitGraphDiagram-72cf32ee-B9zCS3Pw.js → gitGraphDiagram-72cf32ee-Cvf9uYWB.js} +1 -1
  52. package/dist/frontend/assets/{gl-ES-HMX3MZ6V-CrUx-ab6.js → gl-ES-HMX3MZ6V-CCxCH2oK.js} +1 -1
  53. package/dist/frontend/assets/{graph-BQZ6SIVr.js → graph-MptL1QoF.js} +1 -1
  54. package/dist/frontend/assets/{graph-Cda8xSTx.js → graph-Mzuu2QFH.js} +1 -1
  55. package/dist/frontend/assets/{he-IL-6SHJWFNN-D33eaw6-.js → he-IL-6SHJWFNN-CJuJutJZ.js} +1 -1
  56. package/dist/frontend/assets/{hi-IN-IWLTKZ5I-DEnStF-g.js → hi-IN-IWLTKZ5I-BORPH6vU.js} +1 -1
  57. package/dist/frontend/assets/{hu-HU-A5ZG7DT2-BjH2w8Sn.js → hu-HU-A5ZG7DT2-Dr7UDbjo.js} +1 -1
  58. package/dist/frontend/assets/{id-ID-SAP4L64H-Bc6R-JEz.js → id-ID-SAP4L64H-D0Widkq7.js} +1 -1
  59. package/dist/frontend/assets/{index-3862675e-CpYfS3Db.js → index-3862675e-DVT5-vN2.js} +1 -1
  60. package/dist/frontend/assets/{index-6079d271-Y2bgyRpa.js → index-6079d271-R4KRnW5Z.js} +1 -1
  61. package/dist/frontend/assets/{index-D7eYnAQp.js → index-B45XzZiR.js} +4 -4
  62. package/dist/frontend/assets/index-Bd-8869C.js +349 -0
  63. package/dist/frontend/assets/{infoDiagram-4a4f5b27-Bm3Oq-Rq.js → infoDiagram-4a4f5b27-BvY1qS17.js} +3 -3
  64. package/dist/frontend/assets/{infoDiagram-f8f76790-oNVitBKM.js → infoDiagram-f8f76790-D60YvG33.js} +1 -1
  65. package/dist/frontend/assets/{it-IT-JPQ66NNP-BcxQABF2.js → it-IT-JPQ66NNP-C08Vu0BG.js} +1 -1
  66. package/dist/frontend/assets/{ja-JP-DBVTYXUO-D1zIM-nt.js → ja-JP-DBVTYXUO-Ciu7LaRi.js} +1 -1
  67. package/dist/frontend/assets/{journeyDiagram-29694f62-CamPk_3P.js → journeyDiagram-29694f62-DvrnJXsd.js} +5 -5
  68. package/dist/frontend/assets/{journeyDiagram-49397b02-D6w3tLtf.js → journeyDiagram-49397b02-Dy9LU86E.js} +1 -1
  69. package/dist/frontend/assets/{kaa-6HZHGXH3-CoILysVg.js → kaa-6HZHGXH3-GhGTIjpu.js} +1 -1
  70. package/dist/frontend/assets/{kab-KAB-ZGHBKWFO-B9ZbybBt.js → kab-KAB-ZGHBKWFO-B3q4BqYw.js} +1 -1
  71. package/dist/frontend/assets/{kk-KZ-P5N5QNE5-Dxi4GIQ7.js → kk-KZ-P5N5QNE5-GWoLZvco.js} +1 -1
  72. package/dist/frontend/assets/{km-KH-HSX4SM5Z-DaJ7EtO2.js → km-KH-HSX4SM5Z-CnAQJCYr.js} +1 -1
  73. package/dist/frontend/assets/{ko-KR-MTYHY66A-DG57Ah12.js → ko-KR-MTYHY66A-B2Rh9krp.js} +1 -1
  74. package/dist/frontend/assets/{ku-TR-6OUDTVRD-DnDf9E8a.js → ku-TR-6OUDTVRD-C27elmON.js} +1 -1
  75. package/dist/frontend/assets/{layout-Drr-66M9.js → layout-D1hl6oKi.js} +1 -1
  76. package/dist/frontend/assets/{layout-BsWfhUAF.js → layout-c-hOA8zE.js} +1 -1
  77. package/dist/frontend/assets/{line-DwQObOhP.js → line-DtMz1ssZ.js} +1 -1
  78. package/dist/frontend/assets/{linear-C36MjJps.js → linear-D-Y4WtO_.js} +1 -1
  79. package/dist/frontend/assets/{lt-LT-XHIRWOB4-D_zqS0yg.js → lt-LT-XHIRWOB4-B6jd693w.js} +1 -1
  80. package/dist/frontend/assets/{lv-LV-5QDEKY6T-owIsIh1b.js → lv-LV-5QDEKY6T-sXB-8i6R.js} +1 -1
  81. package/dist/frontend/assets/{mindmap-definition-ac74a2e8-Cf9JbrBJ.js → mindmap-definition-ac74a2e8-CawO9I_f.js} +6 -6
  82. package/dist/frontend/assets/{mindmap-definition-fc14e90a-BpsNCNCp.js → mindmap-definition-fc14e90a-CXMNA68v.js} +4 -4
  83. package/dist/frontend/assets/{mr-IN-CRQNXWMA-CS9XUj74.js → mr-IN-CRQNXWMA-BJ6QSiPi.js} +1 -1
  84. package/dist/frontend/assets/{my-MM-5M5IBNSE-BKB060k9.js → my-MM-5M5IBNSE-BMdOIRP5.js} +1 -1
  85. package/dist/frontend/assets/{nb-NO-T6EIAALU-CkmLUrvm.js → nb-NO-T6EIAALU-BVG6JUMN.js} +1 -1
  86. package/dist/frontend/assets/{nl-NL-IS3SIHDZ-DdiLyJoz.js → nl-NL-IS3SIHDZ-ZprCvTYR.js} +1 -1
  87. package/dist/frontend/assets/{nn-NO-6E72VCQL-Yevp6f_Y.js → nn-NO-6E72VCQL-CcljFAGy.js} +1 -1
  88. package/dist/frontend/assets/{oc-FR-POXYY2M6-D_M6GHup.js → oc-FR-POXYY2M6-zCuu6Ns2.js} +1 -1
  89. package/dist/frontend/assets/{pa-IN-N4M65BXN-1vuACN9n.js → pa-IN-N4M65BXN-D_iftL9v.js} +1 -1
  90. package/dist/frontend/assets/{pica-DDDx0iqx.js → pica-DsW4eP6T.js} +1 -1
  91. package/dist/frontend/assets/{pie-CFIpuQMO.js → pie-U_uHwWsL.js} +1 -1
  92. package/dist/frontend/assets/{pieDiagram-421022e6-DO7e_Qgw.js → pieDiagram-421022e6-naaI7HiE.js} +5 -5
  93. package/dist/frontend/assets/{pieDiagram-8a3498a8-BEoqChXo.js → pieDiagram-8a3498a8-m6nTf1O_.js} +1 -1
  94. package/dist/frontend/assets/{pl-PL-T2D74RX3-Cc6Q5nSh.js → pl-PL-T2D74RX3-CRQQfZUe.js} +1 -1
  95. package/dist/frontend/assets/{pt-BR-5N22H2LF-3eEiAax3.js → pt-BR-5N22H2LF-DLvfG7RR.js} +1 -1
  96. package/dist/frontend/assets/{pt-PT-UZXXM6DQ-CgnF0Le7.js → pt-PT-UZXXM6DQ-Chkg6-JC.js} +1 -1
  97. package/dist/frontend/assets/{quadrantDiagram-0957ecba-C1Eo-ZUY.js → quadrantDiagram-0957ecba-BJR82kAx.js} +3 -3
  98. package/dist/frontend/assets/{quadrantDiagram-120e2f19-Bdfsl_O7.js → quadrantDiagram-120e2f19-CsWgLp5e.js} +1 -1
  99. package/dist/frontend/assets/relay-BSVGqyIy.js +2 -0
  100. package/dist/frontend/assets/{requirementDiagram-23d650b8-DiOK6QW3.js → requirementDiagram-23d650b8-CHmg-ycX.js} +1 -1
  101. package/dist/frontend/assets/{requirementDiagram-deff3bca-BDJ-7T4h.js → requirementDiagram-deff3bca-LIsyxsZZ.js} +1 -1
  102. package/dist/frontend/assets/{ro-RO-JPDTUUEW-CbJ3IB7a.js → ro-RO-JPDTUUEW-B_a5A5-x.js} +1 -1
  103. package/dist/frontend/assets/{ru-RU-B4JR7IUQ-PQGmeGG4.js → ru-RU-B4JR7IUQ-CY5sI1Ru.js} +1 -1
  104. package/dist/frontend/assets/{sankeyDiagram-04a897e0-DV25bgN2.js → sankeyDiagram-04a897e0-DN5e16d0.js} +1 -1
  105. package/dist/frontend/assets/{sankeyDiagram-23345273-szSb_Sei.js → sankeyDiagram-23345273-BBjQCtHz.js} +1 -1
  106. package/dist/frontend/assets/{selectAll-DsrPvhqV.js → selectAll-Dcq-dC_E.js} +1 -1
  107. package/dist/frontend/assets/{sequenceDiagram-17ac3bff-Dg88bSlc.js → sequenceDiagram-17ac3bff-CIXyQiN6.js} +1 -1
  108. package/dist/frontend/assets/{sequenceDiagram-704730f1-DRIjLCxx.js → sequenceDiagram-704730f1-BmDwBhsF.js} +1 -1
  109. package/dist/frontend/assets/{si-LK-N5RQ5JYF-BtIIudm3.js → si-LK-N5RQ5JYF-DEPKL_1i.js} +1 -1
  110. package/dist/frontend/assets/{sk-SK-C5VTKIMK-CIwXticU.js → sk-SK-C5VTKIMK-XqrGDM2K.js} +1 -1
  111. package/dist/frontend/assets/{sl-SI-NN7IZMDC-CXEdg57y.js → sl-SI-NN7IZMDC-Dia3d1Yy.js} +1 -1
  112. package/dist/frontend/assets/{stateDiagram-587899a1-BwRwgRo6.js → stateDiagram-587899a1-CY1BCaUa.js} +1 -1
  113. package/dist/frontend/assets/{stateDiagram-9c5f0230-C8n96rER.js → stateDiagram-9c5f0230-gyjWQtSe.js} +1 -1
  114. package/dist/frontend/assets/{stateDiagram-v2-51a3dcff-B7e5E4J7.js → stateDiagram-v2-51a3dcff-CAIiXqRE.js} +1 -1
  115. package/dist/frontend/assets/{stateDiagram-v2-d93cdb3a-B18iZQLw.js → stateDiagram-v2-d93cdb3a-DvUpzRiQ.js} +1 -1
  116. package/dist/frontend/assets/{styles-2ab5d517-CfWubwio.js → styles-2ab5d517-BE3yBf4Z.js} +3 -3
  117. package/dist/frontend/assets/{styles-5f03d8d2-C-_n19AB.js → styles-5f03d8d2-CGBEZiW_.js} +3 -3
  118. package/dist/frontend/assets/{styles-6aaf32cf-Dh-DHkVP.js → styles-6aaf32cf-JdIhb4_Y.js} +1 -1
  119. package/dist/frontend/assets/{styles-9a916d00-Boy0hUEG.js → styles-9a916d00-DRmxoyEF.js} +1 -1
  120. package/dist/frontend/assets/{styles-c10674c1-BfxiK3Ns.js → styles-c10674c1-C3TEvIjw.js} +1 -1
  121. package/dist/frontend/assets/{styles-edf9a4b0-T7mKViRF.js → styles-edf9a4b0-B_FeyXdP.js} +1 -1
  122. package/dist/frontend/assets/subset-shared.chunk.js +9 -9
  123. package/dist/frontend/assets/subset-worker.chunk.js +1 -1
  124. package/dist/frontend/assets/{sv-SE-XGPEYMSR-dVrUAqld.js → sv-SE-XGPEYMSR-CBrvnOWh.js} +1 -1
  125. package/dist/frontend/assets/{svgDrawCommon-08f97a94-fsWk6SQc.js → svgDrawCommon-08f97a94-DI4ZG6xI.js} +1 -1
  126. package/dist/frontend/assets/{svgDrawCommon-3ba9043b-BJ8X3qS-.js → svgDrawCommon-3ba9043b-Dl5HsA0X.js} +1 -1
  127. package/dist/frontend/assets/{ta-IN-2NMHFXQM-CtVVZfIT.js → ta-IN-2NMHFXQM-DGYl9sGK.js} +1 -1
  128. package/dist/frontend/assets/{th-TH-HPSO5L25-Do90CyDN.js → th-TH-HPSO5L25-Bq3K3L0F.js} +1 -1
  129. package/dist/frontend/assets/{timeline-definition-7e6b55e7-D_iHA485.js → timeline-definition-7e6b55e7-DWL-fZtL.js} +3 -3
  130. package/dist/frontend/assets/{timeline-definition-85554ec2-nhT8QMsO.js → timeline-definition-85554ec2-C14kwDFd.js} +1 -1
  131. package/dist/frontend/assets/{tr-TR-DEFEU3FU-MfR-IQke.js → tr-TR-DEFEU3FU-CSwI35xw.js} +1 -1
  132. package/dist/frontend/assets/{uk-UA-QMV73CPH-CPet8B1O.js → uk-UA-QMV73CPH-Dxy7prmb.js} +1 -1
  133. package/dist/frontend/assets/{union-BgYwhB7T.js → union-DQ7m6Pel.js} +1 -1
  134. package/dist/frontend/assets/{vi-VN-M7AON7JQ-3HD06T_8.js → vi-VN-M7AON7JQ-BNyYTgjT.js} +1 -1
  135. package/dist/frontend/assets/{xychartDiagram-b6496bcd-D5vSaFT2.js → xychartDiagram-b6496bcd-DWKYL0ZD.js} +4 -4
  136. package/dist/frontend/assets/{xychartDiagram-e933f94c-DLIHXsUi.js → xychartDiagram-e933f94c-Bw4brW9l.js} +1 -1
  137. package/dist/frontend/assets/youtubeResume-DPG81gOQ.js +1 -0
  138. package/dist/frontend/assets/{zh-CN-LNUGB5OW-t2RyWPw2.js → zh-CN-LNUGB5OW-BNhZCPEt.js} +1 -1
  139. package/dist/frontend/assets/{zh-HK-E62DVLB3-Bj22hc7e.js → zh-HK-E62DVLB3-D_rDALSq.js} +1 -1
  140. package/dist/frontend/assets/{zh-TW-RAJ6MFWO-CBRhqhU1.js → zh-TW-RAJ6MFWO-rUlbmCTA.js} +1 -1
  141. package/dist/frontend/assets/zipObject-Db5-6vIz.js +1 -0
  142. package/dist/frontend/index.html +172 -236
  143. package/dist/{index.d.ts → mcp.d.ts} +1 -1
  144. package/dist/mcp.d.ts.map +1 -0
  145. package/dist/mcp.js +1183 -0
  146. package/dist/mcp.js.map +1 -0
  147. package/package.json +19 -34
  148. package/skills/excalidraw-skill/SKILL.md +42 -55
  149. package/skills/excalidraw-skill/references/cheatsheet.md +23 -56
  150. package/skills/excalidraw-skill/scripts/clear-canvas.cjs +9 -32
  151. package/skills/excalidraw-skill/scripts/create-element.cjs +18 -61
  152. package/skills/excalidraw-skill/scripts/delete-element.cjs +12 -42
  153. package/skills/excalidraw-skill/scripts/export-elements.cjs +17 -44
  154. package/skills/excalidraw-skill/scripts/gh-helper.cjs +58 -0
  155. package/skills/excalidraw-skill/scripts/healthcheck.cjs +8 -29
  156. package/skills/excalidraw-skill/scripts/import-elements.cjs +20 -70
  157. package/skills/excalidraw-skill/scripts/update-element.cjs +19 -63
  158. package/tsconfig.json +3 -2
  159. package/vite.config.js +3 -10
  160. package/dist/frontend/assets/arc-Cc3ncJ1n.js +0 -1
  161. package/dist/frontend/assets/channel-BQSIb3i3.js +0 -1
  162. package/dist/frontend/assets/classDiagram-v2-d5a6b087-BgB8AG2e.js +0 -2
  163. package/dist/frontend/assets/clone-BoZziNL9.js +0 -1
  164. package/dist/frontend/assets/flowDiagram-v2-96b9c2cf-Z3H2d3Wj.js +0 -1
  165. package/dist/frontend/assets/flowDiagram-v2-ffc7f31a-CIQOMghC.js +0 -1
  166. package/dist/frontend/assets/index-DIz4WrSB.js +0 -349
  167. package/dist/frontend/assets/zipObject-DMfHW2o8.js +0 -1
  168. package/dist/index.d.ts.map +0 -1
  169. package/dist/index.js +0 -2279
  170. package/dist/index.js.map +0 -1
  171. package/dist/remote.d.ts +0 -5
  172. package/dist/remote.d.ts.map +0 -1
  173. package/dist/remote.js +0 -129
  174. package/dist/remote.js.map +0 -1
  175. package/dist/server.d.ts +0 -4
  176. package/dist/server.d.ts.map +0 -1
  177. package/dist/server.js +0 -1208
  178. package/dist/server.js.map +0 -1
  179. package/dist/target.d.ts +0 -38
  180. package/dist/target.d.ts.map +0 -1
  181. package/dist/target.js +0 -225
  182. package/dist/target.js.map +0 -1
  183. package/dist/types.d.ts +0 -228
  184. package/dist/types.d.ts.map +0 -1
  185. package/dist/types.js +0 -45
  186. package/dist/types.js.map +0 -1
  187. package/dist/utils/auth.d.ts +0 -14
  188. package/dist/utils/auth.d.ts.map +0 -1
  189. package/dist/utils/auth.js +0 -67
  190. package/dist/utils/auth.js.map +0 -1
  191. package/dist/utils/github.d.ts +0 -24
  192. package/dist/utils/github.d.ts.map +0 -1
  193. package/dist/utils/github.js +0 -132
  194. package/dist/utils/github.js.map +0 -1
  195. package/dist/utils/logger.d.ts +0 -4
  196. package/dist/utils/logger.d.ts.map +0 -1
  197. package/dist/utils/logger.js +0 -25
  198. package/dist/utils/logger.js.map +0 -1
  199. package/dist/utils/r2store.d.ts +0 -12
  200. package/dist/utils/r2store.d.ts.map +0 -1
  201. package/dist/utils/r2store.js +0 -75
  202. package/dist/utils/r2store.js.map +0 -1
  203. package/frontend/drop.png +0 -0
  204. package/frontend/index.html +0 -339
  205. package/frontend/src/App.tsx +0 -1091
  206. package/frontend/src/main.tsx +0 -15
  207. package/frontend/src/utils/ghSync.ts +0 -234
  208. package/frontend/src/utils/mermaidConverter.ts +0 -43
  209. package/frontend/src/utils/webmcp.ts +0 -265
  210. package/scripts/check-local-bind.mjs +0 -164
  211. package/scripts/postinstall.mjs +0 -23
  212. package/scripts/publish-pages.sh +0 -39
  213. package/scripts/seed-r2.mjs +0 -9
  214. package/src/cli.ts +0 -528
  215. package/src/index.ts +0 -2538
  216. package/src/remote.ts +0 -92
  217. package/src/server.ts +0 -1349
  218. package/src/target.ts +0 -198
  219. package/src/types.ts +0 -336
  220. package/src/utils/auth.ts +0 -61
  221. package/src/utils/github.ts +0 -121
  222. package/src/utils/logger.ts +0 -35
  223. package/src/utils/r2store.ts +0 -70
@@ -1,15 +0,0 @@
1
- import React from 'react'
2
- import ReactDOM from 'react-dom/client'
3
- import App from './App.tsx'
4
- import '@excalidraw/excalidraw/index.css'
5
-
6
- const rootElement = document.getElementById('root');
7
- if (!rootElement) {
8
- throw new Error('Root element not found');
9
- }
10
-
11
- ReactDOM.createRoot(rootElement).render(
12
- <React.StrictMode>
13
- <App />
14
- </React.StrictMode>,
15
- )
@@ -1,234 +0,0 @@
1
-
2
-
3
- export interface RepoRef { owner: string; repo: string; branch: string }
4
-
5
- export function detectRepo(): RepoRef | null {
6
- const explicit = (import.meta as any).env?.VITE_REPO_SLUG as string | undefined;
7
- if (explicit?.includes('/')) {
8
- const [owner, repo] = explicit.split('/');
9
- return { owner, repo, branch: 'gh-pages' };
10
- }
11
- const host = window.location.hostname; // <owner>.github.io
12
- const parts = window.location.pathname.split('/').filter(Boolean);
13
- if (host.endsWith('.github.io') && parts.length > 0) {
14
- return { owner: host.slice(0, -'.github.io'.length), repo: parts[0], branch: 'gh-pages' };
15
- }
16
- return null;
17
- }
18
-
19
- const TOKEN_KEY = 'excalidrop_gh_token';
20
-
21
- export function getToken(): string | null {
22
-
23
- if (window.location.hash.startsWith('#token=')) {
24
- const t = decodeURIComponent(window.location.hash.slice('#token='.length));
25
- if (t) {
26
- localStorage.setItem(TOKEN_KEY, t);
27
- history.replaceState(null, '', window.location.pathname + window.location.search);
28
- return t;
29
- }
30
- }
31
- return localStorage.getItem(TOKEN_KEY);
32
- }
33
-
34
- export function setToken(t: string | null): void {
35
- if (t) localStorage.setItem(TOKEN_KEY, t);
36
- else localStorage.removeItem(TOKEN_KEY);
37
- }
38
-
39
- async function gh(path: string, token: string, init?: RequestInit): Promise<any> {
40
- const r = await fetch(`https://api.github.com${path}`, {
41
- ...init,
42
- headers: {
43
- Authorization: `Bearer ${token}`,
44
- Accept: 'application/vnd.github+json',
45
- 'Content-Type': 'application/json',
46
- ...(init?.headers || {}),
47
- },
48
- });
49
- if (!r.ok) throw new Error(`GitHub ${r.status}: ${(await r.text()).slice(0, 200)}`);
50
- return r.json();
51
- }
52
-
53
-
54
- export async function pushScene(
55
- ref: RepoRef, token: string, scene: { elements: unknown[]; files?: Record<string, unknown> },
56
- ): Promise<string> {
57
- const path = 'canvas.excalidraw';
58
- let sha: string | undefined;
59
- try {
60
- const cur = await gh(`/repos/${ref.owner}/${ref.repo}/contents/${path}?ref=${ref.branch}`, token);
61
- sha = cur.sha;
62
- } catch {}
63
- const body: any = {
64
- message: `excalidrop: autosync ${scene.elements.length} elements`,
65
- content: btoa(unescape(encodeURIComponent(JSON.stringify(
66
- { type: 'excalidraw', version: 2, source: 'excalidrop', elements: scene.elements },
67
- null, 2,
68
- )))),
69
- branch: ref.branch,
70
- };
71
- if (sha) body.sha = sha;
72
- const out = await gh(`/repos/${ref.owner}/${ref.repo}/contents/${path}`, token, {
73
- method: 'PUT',
74
- body: JSON.stringify(body),
75
- });
76
- return out.content.sha as string;
77
- }
78
-
79
-
80
- export async function loadStaticScene(): Promise<{ elements: any[]; files?: Record<string, unknown> }> {
81
- const r = await fetch('./canvas.excalidraw', { cache: 'no-cache' });
82
- if (!r.ok) throw new Error(`scene fetch ${r.status}`);
83
- const j = await r.json();
84
- return { elements: j.elements || [], files: j.files || {} };
85
- }
86
-
87
-
88
- export async function startDeviceFlow(clientId: string): Promise<{ user_code: string; verification_uri: string }> {
89
- const r = await fetch('https://github.com/login/device/code', {
90
- method: 'POST',
91
- headers: { Accept: 'application/json', 'Content-Type': 'application/json' },
92
- body: JSON.stringify({ client_id: clientId }),
93
- });
94
- if (!r.ok) throw new Error('device flow start failed');
95
- const j = await r.json();
96
- return { user_code: j.user_code, verification_uri: j.verification_uri };
97
- }
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
-
185
- export type Access = 'editor' | 'viewer' | 'denied';
186
-
187
- export type AccessDetail =
188
- | 'app-not-installed' // ghu_ token, but the user has no app installation reaching this repo
189
- | 'repo-not-covered' // installation(s) exist, but none of them include this repo
190
- | 'no-token-permissions' // classic token with no read access to the repo
191
- | null; // editor/viewer — no problem to report
192
-
193
-
194
- export async function checkAccess(ref: RepoRef, token: string): Promise<{ access: Access; login: string; detail: AccessDetail }> {
195
- const me = await gh('/user', token);
196
- const login = (me.login || '') as string;
197
- const wanted = `${ref.owner}/${ref.repo}`.toLowerCase();
198
-
199
- const inst = await gh('/user/installations?per_page=100', token).catch(() => null);
200
- if (inst?.installations) {
201
- if ((inst.installations as unknown[]).length === 0) {
202
- return { access: 'denied', login, detail: 'app-not-installed' };
203
- }
204
- for (const i of inst.installations || []) {
205
- const repos = await gh(`/user/installations/${(i as any).id}/repositories?per_page=100`, token).catch(() => null);
206
- const hit = (repos?.repositories || []).find((r: any) => r.full_name.toLowerCase() === wanted);
207
- if (hit) {
208
-
209
- const perms = await gh(`/repos/${ref.owner}/${ref.repo}/collaborators/${login}/permission`, token).catch(() => null);
210
- const p = (perms?.permission || '') as string;
211
- if (p === 'read' || p === 'triage') return { access: 'viewer', login, detail: null };
212
- return { access: 'editor', login, detail: null };
213
- }
214
- }
215
- return { access: 'denied', login, detail: 'repo-not-covered' };
216
- }
217
-
218
- const repo = await gh(`/repos/${ref.owner}/${ref.repo}`, token).catch(() => null);
219
- if (!repo?.permissions) return { access: 'denied', login, detail: 'no-token-permissions' };
220
- if (repo.permissions.push || repo.permissions.admin || repo.permissions.maintain) {
221
- return { access: 'editor', login, detail: null };
222
- }
223
- return { access: 'viewer', login, detail: null };
224
- }
225
-
226
-
227
- export const CLIENT_ID =
228
- ((import.meta as any).env?.VITE_GITHUB_CLIENT_ID as string | undefined) ||
229
- 'Iv23liuS2fx3QOEIoDmx';
230
- export const APP_SLUG =
231
- ((import.meta as any).env?.VITE_GITHUB_APP_SLUG as string | undefined) || 'excalidrop';
232
- export const APP_INSTALL_URL = `https://github.com/apps/${APP_SLUG}/installations/new`;
233
-
234
- export const HAS_CLIENT_ID = !!CLIENT_ID && !CLIENT_ID.includes('EXCALIDROP_APP');
@@ -1,43 +0,0 @@
1
- import { parseMermaidToExcalidraw, MermaidConfig } from '@excalidraw/mermaid-to-excalidraw';
2
- import type { ExcalidrawElement } from '@excalidraw/excalidraw/types/element/types';
3
- import type { BinaryFiles } from '@excalidraw/excalidraw/types/types';
4
-
5
- export interface MermaidConversionResult {
6
- elements: readonly ExcalidrawElement[];
7
- files?: BinaryFiles;
8
- error?: string;
9
- }
10
-
11
-
12
- export const convertMermaidToExcalidraw = async (
13
- mermaidDefinition: string,
14
- config?: MermaidConfig
15
- ): Promise<MermaidConversionResult> => {
16
- try {
17
- const result = await parseMermaidToExcalidraw(mermaidDefinition, config);
18
-
19
- return {
20
- elements: result.elements,
21
- files: result.files,
22
- };
23
- } catch (error) {
24
- console.error('Error converting Mermaid to Excalidraw:', error);
25
- return {
26
- elements: [],
27
- error: error instanceof Error ? error.message : String(error),
28
- };
29
- }
30
- };
31
-
32
-
33
- export const DEFAULT_MERMAID_CONFIG: MermaidConfig = {
34
- startOnLoad: false,
35
- flowchart: {
36
- curve: 'linear',
37
- },
38
- themeVariables: {
39
- fontSize: '20px',
40
- },
41
- maxEdges: 500,
42
- maxTextSize: 50000,
43
- };
@@ -1,265 +0,0 @@
1
-
2
-
3
- interface MinimalCanvasApi {
4
- getSceneElements(): Array<Record<string, any>>;
5
- updateScene(scene: { elements: Array<Record<string, any>> }): void;
6
- resetScene(): void;
7
- }
8
-
9
- export type CanvasApiGetter = () => MinimalCanvasApi | null | undefined;
10
-
11
- export interface WebMCPHandle {
12
- available: boolean;
13
- count: number;
14
- cleanup: () => void;
15
- }
16
-
17
- interface ModelContextLike {
18
- registerTool(
19
- tool: {
20
- name: string;
21
- title?: string;
22
- description: string;
23
- inputSchema: Record<string, unknown>;
24
- annotations?: Record<string, unknown>;
25
- execute: (args: any, opts?: { signal?: AbortSignal }) => unknown | Promise<unknown>;
26
- },
27
- options?: { signal?: AbortSignal },
28
- ): Promise<void>;
29
- }
30
-
31
- function getModelContext(): ModelContextLike | null {
32
- try {
33
- const doc = document as unknown as Record<string, unknown>;
34
- const nav = navigator as unknown as Record<string, unknown>;
35
- const mc =
36
- (doc['modelContext'] as ModelContextLike | undefined) ??
37
- (nav['modelContext'] as ModelContextLike | undefined);
38
- if (mc && typeof mc.registerTool === 'function') return mc;
39
- } catch {
40
-
41
- }
42
- return null;
43
- }
44
-
45
- function newId(): string {
46
- try {
47
- if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {
48
- return (crypto as Crypto).randomUUID().slice(0, 12);
49
- }
50
- } catch {
51
-
52
- }
53
- return `el_${Math.random().toString(36).slice(2, 10)}`;
54
- }
55
-
56
- function summarize(el: Record<string, any>): Record<string, unknown> {
57
- const out: Record<string, unknown> = {
58
- id: el['id'],
59
- type: el['type'],
60
- x: Math.round(Number(el['x'] ?? 0)),
61
- y: Math.round(Number(el['y'] ?? 0)),
62
- };
63
- if (el['width'] !== undefined) out['width'] = el['width'];
64
- if (el['height'] !== undefined) out['height'] = el['height'];
65
- const text =
66
- (typeof el['text'] === 'string' && el['text']) ||
67
- (el['label'] as { text?: string } | undefined)?.text;
68
- if (text) out['text'] = String(text).slice(0, 120);
69
- if (el['locked']) out['locked'] = true;
70
- return out;
71
- }
72
-
73
- const ELEMENT_SCHEMA: Record<string, unknown> = {
74
- type: 'object',
75
- properties: {
76
- id: { type: 'string', description: 'Custom element ID (auto-generated if omitted)' },
77
- type: { type: 'string', description: 'Excalidraw element type: rectangle, ellipse, diamond, text, arrow, line, freedraw, image' },
78
- x: { type: 'number' },
79
- y: { type: 'number' },
80
- width: { type: 'number' },
81
- height: { type: 'number' },
82
- text: { type: 'string', description: 'Label text for shapes / content for text elements' },
83
- backgroundColor: { type: 'string' },
84
- strokeColor: { type: 'string' },
85
- strokeWidth: { type: 'number' },
86
- fontSize: { type: 'number' },
87
- startElementId: { type: 'string', description: 'For arrows: bind start to this element ID' },
88
- endElementId: { type: 'string', description: 'For arrows: bind end to this element ID' },
89
- },
90
- required: ['type', 'x', 'y'],
91
- additionalProperties: true,
92
- };
93
-
94
-
95
- export function registerCanvasWebMCP(getApi: CanvasApiGetter): WebMCPHandle {
96
- const noop = () => {};
97
- const mc = getModelContext();
98
- if (!mc) return { available: false, count: 0, cleanup: noop };
99
-
100
- const controller = new AbortController();
101
- const signal = controller.signal;
102
- let count = 0;
103
-
104
- const requireApi = (): MinimalCanvasApi => {
105
- const api = getApi();
106
- if (!api) throw new Error('Canvas not ready yet');
107
- return api;
108
- };
109
-
110
- const safeRegister = (tool: Parameters<ModelContextLike['registerTool']>[0]): void => {
111
- try {
112
- const p = mc.registerTool(tool, { signal });
113
- if (p && typeof (p as Promise<void>).catch === 'function') {
114
- (p as Promise<void>).catch(() => {
115
-
116
- });
117
- }
118
- count += 1;
119
- } catch {
120
-
121
- }
122
- };
123
-
124
- safeRegister({
125
- name: 'describe_scene',
126
- title: 'Describe canvas scene',
127
- description:
128
- 'Read-only summary of the live Excalidraw canvas: element counts by type plus id/type/position/label per element (capped at 200). Call before editing.',
129
- inputSchema: { type: 'object', properties: {}, additionalProperties: false },
130
- annotations: { readOnlyHint: true },
131
- execute: () => {
132
- const api = requireApi();
133
- const els = api.getSceneElements().filter((e) => !e['isDeleted']);
134
- const byType: Record<string, number> = {};
135
- for (const e of els) {
136
- const t = String(e['type'] ?? 'unknown');
137
- byType[t] = (byType[t] ?? 0) + 1;
138
- }
139
- return {
140
- count: els.length,
141
- byType,
142
- elements: els.slice(0, 200).map(summarize),
143
- };
144
- },
145
- });
146
-
147
- safeRegister({
148
- name: 'create_elements',
149
- title: 'Create canvas elements',
150
- description:
151
- 'Add new elements to the live canvas in one batch. Assign custom ids to shapes so arrows can reference them via startElementId/endElementId.',
152
- inputSchema: {
153
- type: 'object',
154
- properties: { elements: { type: 'array', items: ELEMENT_SCHEMA, minItems: 1 } },
155
- required: ['elements'],
156
- additionalProperties: false,
157
- },
158
- annotations: { destructiveHint: false },
159
- execute: (args: { elements?: Array<Record<string, any>> }) => {
160
- const api = requireApi();
161
- const input = Array.isArray(args?.elements) ? args.elements : [];
162
- if (input.length === 0) throw new Error('elements must be a non-empty array');
163
- if (input.length > 200) throw new Error('max 200 elements per call');
164
- const created = input.map((raw) => {
165
- if (!raw || typeof raw !== 'object') throw new Error('each element must be an object');
166
- if (typeof raw['type'] !== 'string') throw new Error('each element needs a type');
167
- if (typeof raw['x'] !== 'number' || typeof raw['y'] !== 'number') {
168
- throw new Error('each element needs numeric x and y');
169
- }
170
- const { startElementId, endElementId, ...rest } = raw;
171
- const el: Record<string, any> = { id: newId(), ...rest };
172
- if (typeof startElementId === 'string') el['start'] = { id: startElementId };
173
- if (typeof endElementId === 'string') el['end'] = { id: endElementId };
174
- if ((el['type'] === 'arrow' || el['type'] === 'line') && !Array.isArray(el['points'])) {
175
- el['points'] = [
176
- [0, 0],
177
- [100, 0],
178
- ];
179
- }
180
- return el;
181
- });
182
- const current = api.getSceneElements();
183
- api.updateScene({ elements: [...current, ...created] });
184
- return { ok: true, count: created.length, ids: created.map((e) => e['id']) };
185
- },
186
- });
187
-
188
- safeRegister({
189
- name: 'update_element',
190
- title: 'Update canvas element',
191
- description: 'Patch position, size, colors, or text of one element by id on the live canvas.',
192
- inputSchema: {
193
- type: 'object',
194
- properties: {
195
- id: { type: 'string', description: 'Element ID from describe_scene' },
196
- patch: {
197
- type: 'object',
198
- description: 'Fields to merge (x, y, width, height, backgroundColor, strokeColor, text, ...)',
199
- },
200
- },
201
- required: ['id', 'patch'],
202
- additionalProperties: false,
203
- },
204
- annotations: { destructiveHint: false },
205
- execute: (args: { id?: string; patch?: Record<string, unknown> }) => {
206
- const api = requireApi();
207
- if (!args?.id) throw new Error('id is required');
208
- if (!args?.patch || typeof args.patch !== 'object') throw new Error('patch must be an object');
209
- const current = api.getSceneElements();
210
- const idx = current.findIndex((e) => e['id'] === args.id);
211
- if (idx === -1) throw new Error(`Element ${args.id} not found`);
212
- const next = current.slice();
213
- next[idx] = { ...current[idx], ...args.patch, id: args.id };
214
- api.updateScene({ elements: next });
215
- return { ok: true, id: args.id };
216
- },
217
- });
218
-
219
- safeRegister({
220
- name: 'delete_element',
221
- title: 'Delete canvas element',
222
- description: 'Remove one element by id from the live canvas.',
223
- inputSchema: {
224
- type: 'object',
225
- properties: { id: { type: 'string' } },
226
- required: ['id'],
227
- additionalProperties: false,
228
- },
229
- annotations: { destructiveHint: true },
230
- execute: (args: { id?: string }) => {
231
- const api = requireApi();
232
- if (!args?.id) throw new Error('id is required');
233
- const current = api.getSceneElements();
234
- if (!current.some((e) => e['id'] === args.id)) throw new Error(`Element ${args.id} not found`);
235
- api.updateScene({ elements: current.filter((e) => e['id'] !== args.id) });
236
- return { ok: true, deleted: args.id };
237
- },
238
- });
239
-
240
- safeRegister({
241
- name: 'clear_canvas',
242
- title: 'Clear canvas',
243
- description: 'Remove ALL elements from the live canvas. Ask the user to confirm first.',
244
- inputSchema: { type: 'object', properties: {}, additionalProperties: false },
245
- annotations: { destructiveHint: true, consequentialHint: true },
246
- execute: () => {
247
- const api = requireApi();
248
- const n = api.getSceneElements().length;
249
- api.resetScene();
250
- return { ok: true, cleared: n };
251
- },
252
- });
253
-
254
- return {
255
- available: true,
256
- count,
257
- cleanup: () => {
258
- try {
259
- controller.abort();
260
- } catch {
261
-
262
- }
263
- },
264
- };
265
- }