@ansuman-shukla/whiteboard-mcp 0.0.0-stage → 0.1.0
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/LICENSE +21 -0
- package/README.md +76 -2
- package/dist/canvas/client.js +244 -0
- package/dist/canvas/daemon.js +952 -0
- package/dist/canvas/saved.js +140 -0
- package/dist/canvas/search.js +23 -0
- package/dist/canvas/store.js +482 -0
- package/dist/cli.js +209 -0
- package/dist/frontend/assets/Assistant-Bold-gm-uSS1B.woff2 +0 -0
- package/dist/frontend/assets/Assistant-Medium-DrcxCXg3.woff2 +0 -0
- package/dist/frontend/assets/Assistant-Regular-DVxZuzxb.woff2 +0 -0
- package/dist/frontend/assets/Assistant-SemiBold-SCI4bEL9.woff2 +0 -0
- package/dist/frontend/assets/abnfDiagram-VCTEODGH-BxMH5nUQ.js +1 -0
- package/dist/frontend/assets/ar-SA-G6X2FPQ2-C36O-H_9.js +10 -0
- package/dist/frontend/assets/arc-KX2Pfg3Z.js +1 -0
- package/dist/frontend/assets/architectureDiagram-5GKGNRK7-BHG0460A.js +36 -0
- package/dist/frontend/assets/az-AZ-76LH7QW2-DLRdj82-.js +1 -0
- package/dist/frontend/assets/bg-BG-XCXSNQG7-DwHBZbGh.js +5 -0
- package/dist/frontend/assets/blockDiagram-I7D4REHJ-4Im-keF2.js +129 -0
- package/dist/frontend/assets/bn-BD-2XOGV67Q-NKxBfpiH.js +5 -0
- package/dist/frontend/assets/c4Diagram-7LVT6UL2-DEj5I_0u.js +38 -0
- package/dist/frontend/assets/ca-ES-6MX7JW3Y-Df-0Ntil.js +8 -0
- package/dist/frontend/assets/channel-vJh0WhW1.js +1 -0
- package/dist/frontend/assets/chunk-2Q5K7J3B-C1ty76SZ.js +1 -0
- package/dist/frontend/assets/chunk-5VM5RSS4-c2-w2kdf.js +15 -0
- package/dist/frontend/assets/chunk-F27PBJKO-DzpHo7Ik.js +1 -0
- package/dist/frontend/assets/chunk-IMKFNOWR-D8rzP3gH.js +231 -0
- package/dist/frontend/assets/chunk-JWPE2WC7-7Pq7jJ1J.js +1 -0
- package/dist/frontend/assets/chunk-POPQ4Y6H-D_iqQlwU.js +1 -0
- package/dist/frontend/assets/chunk-SVP7TREG-mpQRweZv.js +88 -0
- package/dist/frontend/assets/chunk-TICWLB2K-rS8nOFdO.js +206 -0
- package/dist/frontend/assets/chunk-XXDRQBXY-Bgca6qkV.js +1 -0
- package/dist/frontend/assets/classDiagram-ZZMXUADV-pHTJxSmH.js +1 -0
- package/dist/frontend/assets/classDiagram-v2-VYDZK3BY-pHTJxSmH.js +1 -0
- package/dist/frontend/assets/cose-bilkent-JH36ORCC-MmIthuLA.js +1 -0
- package/dist/frontend/assets/cs-CZ-2BRQDIVT-l8MKZ6pw.js +11 -0
- package/dist/frontend/assets/cynefin-OW5HDTMX-BQKgYdPD.js +166 -0
- package/dist/frontend/assets/cynefinDiagram-5FMLGOSQ-Bbdj5Qix.js +62 -0
- package/dist/frontend/assets/cytoscape.esm-BDkkwuE4.js +321 -0
- package/dist/frontend/assets/da-DK-5WZEPLOC-BoTLO65S.js +5 -0
- package/dist/frontend/assets/dagre-GXQ25YYZ-MocBksnZ.js +4 -0
- package/dist/frontend/assets/de-DE-XR44H4JA-CYhALkKQ.js +8 -0
- package/dist/frontend/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/dist/frontend/assets/diagram-S7CK7UJ4-CSPIPgpo.js +30 -0
- package/dist/frontend/assets/diagram-UQ7AKVKN-Du1Em6DO.js +41 -0
- package/dist/frontend/assets/diagram-VSXAHHWV-9akjVOcd.js +3 -0
- package/dist/frontend/assets/diagram-VX7I27RA-DMZak4CR.js +24 -0
- package/dist/frontend/assets/diagram-Z3DM3KII-CaR15msp.js +24 -0
- package/dist/frontend/assets/directory-open-01563666-DWU9wJ6I.js +1 -0
- package/dist/frontend/assets/directory-open-4ed118d0-CunoC1EB.js +1 -0
- package/dist/frontend/assets/ebnfDiagram-PWID7BFC-Bi2N3bQu.js +1 -0
- package/dist/frontend/assets/el-GR-BZB4AONW-CLcBAkAQ.js +10 -0
- package/dist/frontend/assets/erDiagram-RLTQ6QDP-CSQeFRsF.js +99 -0
- package/dist/frontend/assets/es-ES-U4NZUMDT-3aklWK9t.js +9 -0
- package/dist/frontend/assets/eu-ES-A7QVB2H4-BtIGcFzG.js +11 -0
- package/dist/frontend/assets/fa-IR-HGAKTJCU-d7GoocBB.js +8 -0
- package/dist/frontend/assets/fi-FI-Z5N7JZ37-jPJL5iOD.js +6 -0
- package/dist/frontend/assets/file-open-002ab408-DIuFHtCF.js +1 -0
- package/dist/frontend/assets/file-open-7c801643-684qeFg4.js +1 -0
- package/dist/frontend/assets/file-save-3189631c-C1wFhQhH.js +1 -0
- package/dist/frontend/assets/file-save-745eba88-Bb9F9Kg7.js +1 -0
- package/dist/frontend/assets/flowDiagram-HODETNUW-uDFqb36j.js +168 -0
- package/dist/frontend/assets/fr-FR-RHASNOE6-h9HiRe-a.js +9 -0
- package/dist/frontend/assets/ganttDiagram-EL5Y4UJY-P8yT56Rg.js +292 -0
- package/dist/frontend/assets/gitGraphDiagram-WWUBYQGX-Bs1S0I4P.js +106 -0
- package/dist/frontend/assets/gl-ES-HMX3MZ6V-VfhNkRer.js +10 -0
- package/dist/frontend/assets/he-IL-6SHJWFNN-D9QmJ8pe.js +10 -0
- package/dist/frontend/assets/hi-IN-IWLTKZ5I-Ba6r7QOE.js +4 -0
- package/dist/frontend/assets/hu-HU-A5ZG7DT2-AM_Xa1Zo.js +7 -0
- package/dist/frontend/assets/id-ID-SAP4L64H-bT6IyTXi.js +10 -0
- package/dist/frontend/assets/image-blob-reduce.esm-BZtWH-rr.js +2 -0
- package/dist/frontend/assets/index-BDFEvJ3q.js +206 -0
- package/dist/frontend/assets/index-Df2Luesx.js +328 -0
- package/dist/frontend/assets/index-jPquz6Ud.css +1 -0
- package/dist/frontend/assets/infoDiagram-27XIBGKW-06Lm1dWG.js +2 -0
- package/dist/frontend/assets/init-Gi6I4Gst.js +1 -0
- package/dist/frontend/assets/ishikawaDiagram-5VMMS53U-C7vdCoDV.js +70 -0
- package/dist/frontend/assets/it-IT-JPQ66NNP-CvstPcAX.js +11 -0
- package/dist/frontend/assets/ja-JP-DBVTYXUO-DAG-iojM.js +8 -0
- package/dist/frontend/assets/journeyDiagram-3NMN7TZE-DvC2BW0H.js +139 -0
- package/dist/frontend/assets/kaa-6HZHGXH3-D0yv_CFf.js +1 -0
- package/dist/frontend/assets/kab-KAB-ZGHBKWFO-RPz2wE_p.js +8 -0
- package/dist/frontend/assets/kanban-definition-UXKFOSKX-BMKKQCtM.js +89 -0
- package/dist/frontend/assets/katex-HP8lGamR.js +257 -0
- package/dist/frontend/assets/kk-KZ-P5N5QNE5-CuHixCO8.js +1 -0
- package/dist/frontend/assets/km-KH-HSX4SM5Z-zlTo5LDV.js +11 -0
- package/dist/frontend/assets/ko-KR-MTYHY66A-CxZjlCW5.js +9 -0
- package/dist/frontend/assets/ku-TR-6OUDTVRD-D1yNiPwK.js +9 -0
- package/dist/frontend/assets/layout-DbvlZj8G.js +1 -0
- package/dist/frontend/assets/linear-DxrJXVAI.js +1 -0
- package/dist/frontend/assets/lt-LT-XHIRWOB4-CfrXycjC.js +3 -0
- package/dist/frontend/assets/lv-LV-5QDEKY6T-B1HW3C0g.js +7 -0
- package/dist/frontend/assets/mindmap-definition-YA3MSWOX-BTLJ0LvH.js +96 -0
- package/dist/frontend/assets/mr-IN-CRQNXWMA-C14Pfp-t.js +13 -0
- package/dist/frontend/assets/my-MM-5M5IBNSE-DzHC1HCi.js +1 -0
- package/dist/frontend/assets/nb-NO-T6EIAALU-CsqehHm6.js +10 -0
- package/dist/frontend/assets/nl-NL-IS3SIHDZ-CyyoCrrj.js +8 -0
- package/dist/frontend/assets/nn-NO-6E72VCQL-CUbYly9U.js +8 -0
- package/dist/frontend/assets/oc-FR-POXYY2M6-BgIsLHkg.js +8 -0
- package/dist/frontend/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/frontend/assets/pa-IN-N4M65BXN-BVdVX_gQ.js +4 -0
- package/dist/frontend/assets/pegDiagram-XKGWAZYB-DpvpUpAn.js +1 -0
- package/dist/frontend/assets/pica-BtX7lU0X.js +2 -0
- package/dist/frontend/assets/pieDiagram-E7YTZNPT-CvD6M6GB.js +39 -0
- package/dist/frontend/assets/pl-PL-T2D74RX3-D1l3OoaP.js +9 -0
- package/dist/frontend/assets/pt-BR-5N22H2LF-DK7vau2C.js +9 -0
- package/dist/frontend/assets/pt-PT-UZXXM6DQ-B4kavvZg.js +9 -0
- package/dist/frontend/assets/quadrantDiagram-AXDQQJYC-hV9EF2Vj.js +7 -0
- package/dist/frontend/assets/railroadDiagram-O6MQD6OU-Cvs7v3CR.js +1 -0
- package/dist/frontend/assets/requirementDiagram-BXWQKSXE-DYqXjX6a.js +84 -0
- package/dist/frontend/assets/ro-RO-JPDTUUEW-DLydQ0UX.js +11 -0
- package/dist/frontend/assets/roundRect-2e6Pdbcn.js +1 -0
- package/dist/frontend/assets/ru-RU-B4JR7IUQ-D9MTksML.js +9 -0
- package/dist/frontend/assets/sankeyDiagram-P5KCCOFB-EKnmu8ps.js +40 -0
- package/dist/frontend/assets/sequenceDiagram-WJ2MYXX4-CtdwdTBo.js +162 -0
- package/dist/frontend/assets/si-LK-N5RQ5JYF-CiIlF66D.js +1 -0
- package/dist/frontend/assets/sizeCapture-INFHLROL-BpusYNfP.js +1 -0
- package/dist/frontend/assets/sk-SK-C5VTKIMK-Bd3mFHOd.js +6 -0
- package/dist/frontend/assets/sl-SI-NN7IZMDC-BzOaJB82.js +6 -0
- package/dist/frontend/assets/stateDiagram-D77RDMKH-Cnrnl-7w.js +1 -0
- package/dist/frontend/assets/stateDiagram-v2-MP3YSRHH-BACuwAg6.js +1 -0
- package/dist/frontend/assets/subset-shared.chunk-04wTTSoh.js +22 -0
- package/dist/frontend/assets/subset-worker.chunk-CmDpHHTU.js +1 -0
- package/dist/frontend/assets/sv-SE-XGPEYMSR-1YOlZWHT.js +10 -0
- package/dist/frontend/assets/swimlanes-42K2YHIH-CVxk4wCy.js +1 -0
- package/dist/frontend/assets/swimlanesDiagram-VR7AAH4N-NVZpf_JZ.js +8 -0
- package/dist/frontend/assets/ta-IN-2NMHFXQM-DXzBOUQM.js +9 -0
- package/dist/frontend/assets/th-TH-HPSO5L25-CNtAqCz4.js +2 -0
- package/dist/frontend/assets/timeline-definition-24CTP7MA-QTuI6k1M.js +120 -0
- package/dist/frontend/assets/tr-TR-DEFEU3FU-DZfuanOj.js +7 -0
- package/dist/frontend/assets/uk-UA-QMV73CPH-DSEDw_F_.js +6 -0
- package/dist/frontend/assets/vennDiagram-4TSXK5OY-Cef9y57F.js +34 -0
- package/dist/frontend/assets/vi-VN-M7AON7JQ-D8uCgy7c.js +5 -0
- package/dist/frontend/assets/wardleyDiagram-VM6X3IG4-B-bKvEgu.js +78 -0
- package/dist/frontend/assets/xychartDiagram-S5SC5T6Z-dHunz4UA.js +7 -0
- package/dist/frontend/assets/zh-CN-LNUGB5OW-Bsu8p0Xn.js +10 -0
- package/dist/frontend/assets/zh-HK-E62DVLB3-BHnkb745.js +1 -0
- package/dist/frontend/assets/zh-TW-RAJ6MFWO-B7SX_SqG.js +9 -0
- package/dist/frontend/fonts/Assistant/Assistant-Bold.woff2 +0 -0
- package/dist/frontend/fonts/Assistant/Assistant-Medium.woff2 +0 -0
- package/dist/frontend/fonts/Assistant/Assistant-Regular.woff2 +0 -0
- package/dist/frontend/fonts/Assistant/Assistant-SemiBold.woff2 +0 -0
- package/dist/frontend/fonts/Cascadia/CascadiaCode-Regular.woff2 +0 -0
- package/dist/frontend/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2 +0 -0
- package/dist/frontend/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2 +0 -0
- package/dist/frontend/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2 +0 -0
- package/dist/frontend/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2 +0 -0
- package/dist/frontend/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 +0 -0
- package/dist/frontend/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 +0 -0
- package/dist/frontend/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 +0 -0
- package/dist/frontend/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 +0 -0
- package/dist/frontend/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 +0 -0
- package/dist/frontend/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 +0 -0
- package/dist/frontend/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 +0 -0
- package/dist/frontend/fonts/Liberation/LiberationSans-Regular.woff2 +0 -0
- package/dist/frontend/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 +0 -0
- package/dist/frontend/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 +0 -0
- package/dist/frontend/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 +0 -0
- package/dist/frontend/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 +0 -0
- package/dist/frontend/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 +0 -0
- package/dist/frontend/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 +0 -0
- package/dist/frontend/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 +0 -0
- package/dist/frontend/fonts/Virgil/Virgil-Regular.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-019d66dcad46dc156b162d267f981c20.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-04b718e5623574919c8b0dea5f301444.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-069e77aac84590e2e991d0a0176d34f2.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-06c77b8c66e51ed6c63ccb502dd8b8af.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-08e0dc436ad0ad61ba5558db0674d762.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-093b9ef39a46ceae95a1df18a0a3a326.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-095c169f3314805276f603a362766abd.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-09850c4077f3fffe707905872e0e2460.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-0986d134c05864f5025962eef9f994a0.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-0b5d723fdc4e249c140f0909e87d03b4.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-0f626226ba1272e832aea87bafd9720e.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-0f7fb1e0d5015bb1371343153ecf7ce3.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-0fa55a080fcd0f9dc2e0b0058b793df8.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-0facdf1ea213ba40261022f5d5ed4493.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-10a7ae9a371830a80c3d844acf1c02d7.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-112c051027b2d766c19a519f6ee1f4f7.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-11c345711937f0ba4b8f7b6b919c8440.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-12b52b58eb3df36804b9a654ec9ee194.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-13ae07ed2e272d26d59bc0691cd7117a.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-13d2887ec8ee73c43acdabc52a05af7b.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-145aa02cdd91946e67dc934e1acffe75.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-15dc6d811c9cd078f9086a740d5a1038.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-173945821411c09f70c95f98d590e697.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-1b611157cd46bb184d4fa4dae2d6a2b8.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-1e6fd68f1f3902ce48ce8c69df385622.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-1ee544f0f1dac422545c505baa788992.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-1fdc0c67ed57263a80fd108c1f6ccf24.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-203b0e569e3b14aac86a003dc3fa523e.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-20cc1bbf50e7efb442756cb605672c1f.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-20e7bf72fa05de9adf7dbcc7bf51dde6.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-21430ee05a1248901da8d0de08744d47.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-23686f7f29da6e8008c36dd3a80c83d6.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-23ad2d71b280f00b1363b95b7bea94eb.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-23f228f3999c01983860012330e4be08.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-24476a126f129212beb33f66853ea151.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-24a21c1e4449222e8d1898d69ff3a404.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-25b7f38e18f035f96cb5e547bd2bd08c.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-29cec36cd205b211da97acabaa62f055.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-2a26d20a23b00898ce82f09d2ee47c3f.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-2adbc89c11e65905393d3dfc468b9d5b.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-2b7441d46298788ac94e610ffcc709b6.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-2b77e8ebfb2367ab2662396a60e7d320.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-2cf96d082d35ea3d8106851223ad0d16.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-2d43040e86ff03ba677f6f9c04cd0805.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-2e33e8dc771ef5e1d9127d60a6b73679.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-33432927cd87d40cfe393c7482bf221f.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-353f33792a8f60dc69323ddf635a269e.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-36925dfe329a45086cbb7fc5c20d45ac.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-3717077e38f98d89eae729b6c14e56dc.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-3756e81d3e149cf6099163ee79944fec.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-395c35dd584b56b0789f58a0559beaf1.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-3c9de2ae0ea4bc91a510942dfa4be8d2.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-3cc70dbb64df5b21f1326cc24dee2195.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-3e1f8f654357353bf0e04ba5c34b5f7f.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-3e63ed8162808a9e425ed80a8bc79114.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-3eaa538115d76932653c21d8dc28f207.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-4095eb84ef3874e2600247bee0b04026.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-41521fade99856108931b4768b1b2648.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-450da755d5bcb70906e1295e559b9602.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-452225341522a7942f0f6aab1a5c91a3.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-4535823663ad81405188a528d8f2b1a2.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-4806e761d750087c2d734fc64596eaff.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-4a0fdb40036e87b40aa08dd30584cb85.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-4a38cc3e9cf104e69ba246d37f8cf135.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-4aca6a43e59aceee2166b0c7e4e85ef1.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-4bfaa8ffa64c5ee560aa2daba7c9cbd3.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-4dc6d5f188d5c96d44815cd1e81aa885.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-4ddc14ed3eb0c3e46364317dfc0144a3.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-4ee10ae43505e2e0bc62656ced49c0fa.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-4f50e5136e136527280bc902c5817561.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-51502f1206be09c565f1547c406e9558.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-51a0e808bbc8361236ac521a119758a3.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-52a84a22fd1369bffeaf21da2d6158dc.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-5330a2119a716e4e7224ed108b085dac.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-543fa46ace099a7099dad69123399400.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-544fc28abe2c5c30e62383fd4dac255f.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-54acdfc2166ad7fcbd074f75fd4a56ba.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-5572b3513ba8df57a3d5d7303ee6b11b.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-56467a5c8840c4d23a60b2f935114848.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-56a32a7689abd0326e57c10c6c069bb4.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-57862b464a55b18c7bf234ce22907d73.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-583d166e56ba0de4b77eabb47ef67839.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-5882ffa04f32584d26109137e2da4352.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-58fd02350d0bc52cf1ca3bb32ce9766e.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-5935a5775af3d5c6307ac667bd9ae74e.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-59e9ff77b0efaf684bc09274fb6908c9.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-5a1ce3117cfe90c48e8fb4a9a00f694d.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-5a45d991244d4c7140217e1e5f5ca4f4.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-5a7fac4b8b23a6e4e5ba0c9bf1756c91.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-5b0ed6971aaab9c8ad563230bd5471a7.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-5d2898fbc097a7e24c6f38d80587621e.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-603aefd23e350ba7eb124273e3c9bcf1.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-60a3089806700d379f11827ee9843b6b.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-60a41c7e1c68f22424e6d22df544bc82.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-642b26e2e5f5fb780b51b593dbc8c851.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-66493ba5a8367f2928812f446f47b56a.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-670ba603758d94268e8606f240a42e12.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-671a2c20b1eb9e4ef8a192833940e319.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-684d65f1793cac449dde5d59cb3c47fb.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-69c09cc5fa3e55c74fc4821f76909cc3.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-6ae5b42180ad70b971c91e7eefb8eba2.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-6e092f71c1e634059ada0e52abadce67.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-6f3256af8454371776bc46670d33cc65.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-6fe5c5973cc06f74b2387a631ea36b88.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-70c2eb8d64e71a42a834eb857ea9df51.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-70e811fd7994e61f408c923de6ddd078.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-7197d6fda6cba7c3874c53d6381ca239.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-72252d73220fa3cd856677888cee1635.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-72536a3d71b694a0d53dd90ddceae41e.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-726303e0774b4e678bff8c2deb6ca603.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-733171b4ffcd17ea1fe1c0ba627173bf.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-739bc1a567439c7cffcd1614644593d2.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-73e309718fd16cea44b4d54a33581811.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-7494dc504ae00ee9cd0505f990f88c5d.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-74e2263a91439c25b91d5132ce9f4d62.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-761d05e3cd968cf574166867998ef06a.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-7718fe60986d8b42b1be9c5ace5ccf25.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-774d4f764a1299da5d28ec2f2ffe0d69.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-79d494361ae093b69e74ee9dbe65bfd4.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-79f007c1c6d07557120982951ea67998.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-7a07ddc0f0c0f5f4a9bad6ee3dda66b5.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-7ab2bed91166a9dca83a5ebfbe2a7f38.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-7ccce86603f80a099ddb0cb21d4ae3e3.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-7e4bde7e9c7f84cd34d8a845e384c746.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-7e929f262f30c8ee78bf398150b1a7cd.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-7eb9fffd1aa890d07d0f88cc82e6cfe4.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-7f855356ab893b0d2b9c1c83b8116f0e.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-829615148e6357d826b9242eb7fbbd1e.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-866fa7613df6b3fd272bcfd4530c0bb9.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-87599f94b6cc129d505b375798d0d751.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-8c2f33cee3993174f7e87c28e4bf42ee.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-8d3bcabb847b56243b16afe62adaaf21.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-8de5b863cb50dfefdd07cb11c774d579.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-8e9f97f01034820170065b2921b4fb5e.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-8f476c4c99813d57cbe6eca4727388ad.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-903bb6865f3452e2fda42e3a25547bc5.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-91ddb2969bf2d31ba02ad82998d1314c.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-938d90c10ff8c20386af7f242c05d6b0.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-93fc8f28a33234bcadf1527cafabd502.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-95429962233afd82db1c27df1500a28c.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-9544732d2e62d1a429674f8ee41b5d3a.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-9592bfc861f07bcb8d75c196b370e548.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-95bfd249da4902577b4b7d76ebdd0b44.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-968cffdc8ee679da094e77ebf50f58ef.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-97f7f48ce90c9429bf32ae51469db74d.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-982b630266d87db93d2539affb1275c6.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-98f2ad84457de7f3740d9920b8fa8667.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-99a16ef6a64934d5781933dbd9c46b2e.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-9cfb2a77a4e45025105ad29a1748b90d.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-9d81066dd2b337c938df6e90380a00dc.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-9eb5a99df4e76ac3363453ac9ca288b1.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-a004ddfcb26e67bd6e678c8ed19e25ce.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-a0ca5df4258213d7fc9fce80f65ce760.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-a1f916d6039285c4ffb900cd654e418f.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-a203b91dad570bf05a58c3c3ddb529bf.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-a365e82ed54697a52f27adcea1315fe8.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-a4c34be6d42152e64b0df90bc4607f64.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-a7accba310e821da5505f71c03b76bdb.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-aa0d470430e6391eca720c7cfa44446f.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-aa5c9ca6cf4fba00433b7aa3fa10671a.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-ac9ceb44437becc3e9c4dbfebab7fc2d.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-b1220a3c61f85cc0408deedb4c5f57a2.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-b358f7a51ece39a3247942b1feabdb29.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-b57aaedfd8ebdf3931f25119dc6a5eb2.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-b5c1596551c256e0e9cf02028595b092.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-b6d128682ee29e471486354d486a1b90.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-b6fd38ca30869792244804b04bc058da.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-b7d203b051eff504ff59ddca7576b6a9.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-b96d9226ce77ec94ceca043d712182e6.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-ba3de316d63c7e339987b16f41a0b879.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-bafff7a14c27403dcc6cf1432e8ea836.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-bd77e3c7f9e0b072d96af37f73d1aa32.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-be549ab72f0719d606a5c01e2c0219b6.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-c16ed9740b85badf16e86ea782a3062f.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-c1f94158256bb1f3bf665b053d895af9.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-c40533fdf4cc57177b12803598af7e59.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-c4a687ac4f0c2766eefc9f77ed99cddf.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-c69f61a4ab18d0488c8d1fc12e7028e8.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-c8b71798409ccc126ee264a00aadcf21.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-c99eda15fc26a2941579560f76c3a5cf.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-cb17fc3db95f6d139afc9d31a8e93293.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-cbaaefaaf326668277aa24dfa93c4d28.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-cd145ce4a0ea18469358df53c207bc1b.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-cdbce89e82cc1ab53a2decbf5819278f.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-ce4884f96f11589608b76b726a755803.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-cf2cc71752631e579e35b0e423bf2638.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-cf6ff4e0f491ca0cf3038187a997b9b4.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-cfb211578629b7e8153b37240de6a9d5.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-d0cf73942fea1c74edbdf0b3011f4656.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-d2666cbed13462c5dc36fa2f15c202ca.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-d3716376641d615e2995605b29bca7b6.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-dac48066b5883d8b4551fc584f0c2a3e.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-dbea1af6dcd9860be40c3d18254338f5.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-e11567fd2accf9957cd0d3c2be937d87.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-e2ead7ea7da0437f085f42ffc05f8d13.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-e3fcf5180fd466c8915c4e8069491054.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-e480d9c614742d05f0e78f274f1e69e6.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-e4bca6cfa53e499cae0a6be4894a90e9.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-e51ef413167c6e14e0c0fdcc585f2fc9.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-e5f453bb04da18eed01675eeebd88bf8.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-e656f091b9dc4709722c9f4b84d3c797.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-ec181b795ac1fb5a50d700b6e996d745.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-ee8bae97908d5147b423f77ad0d3c1bb.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-f0f13b5c60e0af5553bd359f5513be1b.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-f2b54d4e7be0eaefe1c2c56836fa5368.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-f56414bf9bced67990def8660e306759.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-f5d079153c99a25b9be5b8583c4cc8a7.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-f6032fc06eb20480f096199713f70885.woff2 +0 -0
- package/dist/frontend/fonts/Xiaolai/Xiaolai-Regular-f8ee5d36068a42b51d0e4a1116cfcec1.woff2 +0 -0
- package/dist/frontend/index.html +16 -0
- package/dist/mcp/find.js +36 -0
- package/dist/mcp/guide.js +34 -0
- package/dist/mcp/jsonrpc.js +174 -0
- package/dist/mcp/open.js +93 -0
- package/dist/mcp/schema.js +43 -0
- package/dist/mcp/server.js +71 -0
- package/dist/mcp/session.js +155 -0
- package/dist/mcp/tools.js +562 -0
- package/dist/shared/config.js +19 -0
- package/dist/shared/describe.js +194 -0
- package/dist/shared/elements.js +712 -0
- package/dist/shared/ids.js +5 -0
- package/dist/shared/protocol.js +41 -0
- package/package.json +73 -4
- package/skills/whiteboard-explainer/SKILL.md +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ansuman Shukla
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,77 @@
|
|
|
1
|
-
#
|
|
1
|
+
<a href="#quick-start">
|
|
2
|
+
<picture>
|
|
3
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/media/readme/hero-dark.svg">
|
|
4
|
+
<img src="docs/media/readme/hero-light.svg" width="100%" alt="whiteboard-mcp: a live whiteboard your coding agent draws on. You draw back.">
|
|
5
|
+
</picture>
|
|
6
|
+
</a>
|
|
2
7
|
|
|
3
|
-
|
|
8
|
+
<br>
|
|
9
|
+
|
|
10
|
+
<img src="docs/media/dots-and-boxes.gif" width="100%" alt="Playing Dots and Boxes with a coding agent: the human draws a line on the board, the agent sees the move and plays back, until red wins 12 to 4">
|
|
11
|
+
|
|
12
|
+
<p align="center"><sub>Playing Dots and Boxes with an agent: you draw a line, it sees your move and plays back.</sub></p>
|
|
13
|
+
|
|
14
|
+
<br>
|
|
15
|
+
|
|
16
|
+
<picture>
|
|
17
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/media/readme/features-dark.svg">
|
|
18
|
+
<img src="docs/media/readme/features-light.svg" width="100%" alt="Why whiteboard-mcp: draws step by step, sees what you draw, right beside the chat, remembers boards, local and private, tiny (one runtime dependency, about 7 KB of tool schema per turn).">
|
|
19
|
+
</picture>
|
|
20
|
+
|
|
21
|
+
<br><br>
|
|
22
|
+
|
|
23
|
+
**Understand an architecture.** *"How does a typical checkout backend work? Draw it on the whiteboard."* The agent draws it piece by piece and highlights what it's explaining. You move a box, circle the part you're unsure about and leave a note. It reads exactly what you changed and answers on the board.
|
|
24
|
+
|
|
25
|
+
<img src="docs/media/architecture.gif" width="100%" alt="An agent chat beside a live whiteboard: the agent draws a checkout architecture step by step, the human drags Postgres, circles the queue and sends a note asking what happens if the email worker is down, and the agent reads the changes and adds a dead-letter queue">
|
|
26
|
+
|
|
27
|
+
**Explain a flow.** *"How does login work here?"* Arrows stay attached as things move, and the agent answers your notes on its next look.
|
|
28
|
+
|
|
29
|
+
<img src="docs/media/demo.gif" width="100%" alt="The agent draws a login flow step by step, highlights the parts it explains, then answers a note left by the human">
|
|
30
|
+
|
|
31
|
+
**Make something.** *"Paint the Mona Lisa, then refine it with the pencil."* Shapes, freehand strokes and frames, all editable.
|
|
32
|
+
|
|
33
|
+
<img src="docs/media/mona-lisa.gif" width="100%" alt="An agent paints the Mona Lisa on the board, then refines the sky, hair and dress with pencil strokes">
|
|
34
|
+
|
|
35
|
+
More to try:
|
|
36
|
+
|
|
37
|
+
- *"Explain how a request flows through this repo, on the whiteboard."*
|
|
38
|
+
- *"Teach me how a TCP handshake works, step by step."*
|
|
39
|
+
- *"Draw our deploy pipeline and mark the single points of failure."*
|
|
40
|
+
- *"Compare option A and option B side by side on the board."*
|
|
41
|
+
- *"I circled something on the board, take a look."*
|
|
42
|
+
|
|
43
|
+
<br>
|
|
44
|
+
|
|
45
|
+
<a name="quick-start"></a>
|
|
46
|
+
|
|
47
|
+
<picture>
|
|
48
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/media/readme/steps-dark.svg">
|
|
49
|
+
<img src="docs/media/readme/steps-light.svg" width="100%" alt="Get started in a minute: 1. Add it to your agent with one npx line. 2. Start a new chat. 3. Ask for a drawing.">
|
|
50
|
+
</picture>
|
|
51
|
+
|
|
52
|
+
Requires Node.js 20+.
|
|
53
|
+
|
|
54
|
+
```sh
|
|
55
|
+
claude mcp add whiteboard --scope user -- npx -y @ansuman-shukla/whiteboard-mcp
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Codex, Cursor, Gemini CLI, OpenCode, Devin, VS Code, Claude Desktop and agents without MCP: see [client setup](docs/clients.md). For boards in a tab beside the chat, install the [IDE panel](docs/ide-panel.md). The bundled [skill](docs/clients.md#the-skill-recommended-for-every-agent) teaches the agent when a drawing helps.
|
|
59
|
+
|
|
60
|
+
<br>
|
|
61
|
+
|
|
62
|
+
<a href="docs/comparison.md">
|
|
63
|
+
<picture>
|
|
64
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/media/readme/compare-dark.svg">
|
|
65
|
+
<img src="docs/media/readme/compare-light.svg" width="100%" alt="whiteboard-mcp vs Excalidraw MCP: whiteboard-mcp sees what you draw back as a short list of changes, screenshots its own board, edits one shape in place, keeps boards beyond the chat, works in any MCP client plus a CLI, and converts Mermaid. Excalidraw MCP has animated camera moves and zero install.">
|
|
66
|
+
</picture>
|
|
67
|
+
</a>
|
|
68
|
+
|
|
69
|
+
<p align="center"><sub>Want a quick one-off diagram inside Claude or ChatGPT on the web? Excalidraw MCP is great for that. <a href="docs/comparison.md">Full comparison →</a></sub></p>
|
|
70
|
+
|
|
71
|
+
<br>
|
|
72
|
+
|
|
73
|
+
<p align="center">
|
|
74
|
+
<a href="docs/clients.md">Client setup</a> · <a href="docs/boards.md">Boards</a> · <a href="docs/ide-panel.md">IDE panel</a> · <a href="docs/tools.md">Tools & how it works</a> · <a href="docs/configuration.md">Configuration</a> · <a href="docs/security.md">Security</a> · <a href="CONTRIBUTING.md">Contributing</a>
|
|
75
|
+
<br>
|
|
76
|
+
MIT License · built on <a href="https://github.com/excalidraw/excalidraw">Excalidraw</a>
|
|
77
|
+
</p>
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { APP_NAME, stateDir, statePath } from '../shared/config.js';
|
|
5
|
+
import { API, } from '../shared/protocol.js';
|
|
6
|
+
export class CanvasError extends Error {
|
|
7
|
+
status;
|
|
8
|
+
code;
|
|
9
|
+
constructor(message, status, code) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.status = status;
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.name = 'CanvasError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const HTTP_TIMEOUT_MS = 10_000;
|
|
17
|
+
const HEALTH_TIMEOUT_MS = 1000;
|
|
18
|
+
const DEFAULT_REQUEST_TIMEOUT_MS = 15_000;
|
|
19
|
+
const POLL_MS = 50;
|
|
20
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
21
|
+
const isObject = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
22
|
+
/** fetch() rejects with a TypeError ("fetch failed") when the daemon is gone; timeouts are DOMExceptions. */
|
|
23
|
+
const isConnectionError = (err) => err instanceof TypeError;
|
|
24
|
+
function readJsonFile(file) {
|
|
25
|
+
try {
|
|
26
|
+
return JSON.parse(readFileSync(file, 'utf8'));
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function fetchHealth(baseUrl) {
|
|
33
|
+
try {
|
|
34
|
+
const res = await fetch(`${baseUrl}${API.health}`, { signal: AbortSignal.timeout(HEALTH_TIMEOUT_MS) });
|
|
35
|
+
const body = await res.json();
|
|
36
|
+
return res.ok && isObject(body) && typeof body.pid === 'number' ? body : undefined;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** The daemon advertised in daemon.json, if it answers /health as whiteboard-mcp with the same pid. */
|
|
43
|
+
async function probe() {
|
|
44
|
+
const info = readJsonFile(statePath('daemon.json'));
|
|
45
|
+
if (!isObject(info) || typeof info.port !== 'number' || typeof info.pid !== 'number')
|
|
46
|
+
return undefined;
|
|
47
|
+
let token;
|
|
48
|
+
try {
|
|
49
|
+
token = readFileSync(statePath('token'), 'utf8').trim();
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
const baseUrl = `http://127.0.0.1:${info.port}`;
|
|
55
|
+
const health = await fetchHealth(baseUrl);
|
|
56
|
+
return token && health?.app === APP_NAME && health.pid === info.pid ? { baseUrl, token } : undefined;
|
|
57
|
+
}
|
|
58
|
+
/** Why a daemon we started gave up, from its own last line in daemon.log (it logs e.g. `listen failed: ...` before exiting). */
|
|
59
|
+
function startFailure(pid, code, signal) {
|
|
60
|
+
const logFile = statePath('daemon.log');
|
|
61
|
+
let log = '';
|
|
62
|
+
try {
|
|
63
|
+
log = readFileSync(logFile, 'utf8');
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// the daemon could not write its log either
|
|
67
|
+
}
|
|
68
|
+
const reason = pid === undefined ? undefined : log.split('\n').filter((line) => line.includes(` [${pid}] `)).pop()?.replace(/^\S+ \[\d+\] /, '');
|
|
69
|
+
const how = code === null ? `was stopped (${signal})` : `exited with code ${code}`;
|
|
70
|
+
const sandboxed = /\b(EPERM|EACCES)\b/.test(reason ?? '')
|
|
71
|
+
? ' Listening on 127.0.0.1 is not permitted here, probably a sandbox: run whiteboard-mcp outside it (e.g. as an MCP server rather than from a sandboxed shell) or allow local network access.'
|
|
72
|
+
: '';
|
|
73
|
+
return new CanvasError(`canvas daemon ${how} before it was ready${reason ? `: ${reason}` : ''} (see ${logFile}).${sandboxed}`, 503, 'daemon_start_failed');
|
|
74
|
+
}
|
|
75
|
+
async function discover(opts) {
|
|
76
|
+
const found = await probe();
|
|
77
|
+
if (found)
|
|
78
|
+
return found;
|
|
79
|
+
if (opts.autoStart === false)
|
|
80
|
+
throw new CanvasError('canvas daemon is not running', 503, 'daemon_not_running');
|
|
81
|
+
const entry = opts.entry ?? (process.env.WHITEBOARD_ENTRY || fileURLToPath(new URL('../cli.js', import.meta.url)));
|
|
82
|
+
let spawnError;
|
|
83
|
+
// cwd = state dir so the daemon never pins the caller's project directory. Concurrent spawns are
|
|
84
|
+
// safe: the daemon's lock lets exactly one of them run.
|
|
85
|
+
const child = spawn(process.execPath, [entry, 'serve'], { detached: true, stdio: 'ignore', env: process.env, cwd: stateDir() });
|
|
86
|
+
let exit;
|
|
87
|
+
child.once('error', (err) => (spawnError = err));
|
|
88
|
+
child.once('exit', (code, signal) => (exit = { code, signal }));
|
|
89
|
+
child.unref();
|
|
90
|
+
const timeoutMs = opts.startTimeoutMs ?? 8000;
|
|
91
|
+
const deadline = Date.now() + timeoutMs;
|
|
92
|
+
while (Date.now() < deadline) {
|
|
93
|
+
if (spawnError)
|
|
94
|
+
throw new CanvasError(`could not start the canvas daemon: ${spawnError.message}`, 503, 'daemon_start_failed');
|
|
95
|
+
await sleep(POLL_MS);
|
|
96
|
+
const endpoint = await probe();
|
|
97
|
+
if (endpoint)
|
|
98
|
+
return endpoint;
|
|
99
|
+
// Exit code 0 means another daemon holds the lock; keep probing for that one.
|
|
100
|
+
if (exit && exit.code !== 0)
|
|
101
|
+
throw startFailure(child.pid, exit.code, exit.signal);
|
|
102
|
+
}
|
|
103
|
+
throw new CanvasError(`canvas daemon did not start within ${timeoutMs}ms (see ${statePath('daemon.log')})`, 503, 'daemon_start_timeout');
|
|
104
|
+
}
|
|
105
|
+
export class CanvasClient {
|
|
106
|
+
opts;
|
|
107
|
+
endpoint;
|
|
108
|
+
rediscovering;
|
|
109
|
+
constructor(endpoint, opts) {
|
|
110
|
+
this.opts = opts;
|
|
111
|
+
this.endpoint = endpoint;
|
|
112
|
+
}
|
|
113
|
+
static async connect(opts = {}) {
|
|
114
|
+
return new CanvasClient(await discover(opts), opts);
|
|
115
|
+
}
|
|
116
|
+
get baseUrl() {
|
|
117
|
+
return this.endpoint.baseUrl;
|
|
118
|
+
}
|
|
119
|
+
get token() {
|
|
120
|
+
return this.endpoint.token;
|
|
121
|
+
}
|
|
122
|
+
async health() {
|
|
123
|
+
const { ok, version, pid } = await this.call('GET', API.health);
|
|
124
|
+
return { ok, version, pid };
|
|
125
|
+
}
|
|
126
|
+
list() {
|
|
127
|
+
return this.call('GET', API.canvases);
|
|
128
|
+
}
|
|
129
|
+
ensureCanvas(id, meta = {}) {
|
|
130
|
+
return this.call('PUT', API.canvas(id), meta);
|
|
131
|
+
}
|
|
132
|
+
/** Asks the IDE panel host of the chat's window (`host`) or workspace to show the board. False when none qualifies. */
|
|
133
|
+
async show(id, workspace, host) {
|
|
134
|
+
const request = { workspace, ...(host ? { host } : {}) };
|
|
135
|
+
try {
|
|
136
|
+
await this.call('POST', API.show(id), request, 8000);
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
if (err instanceof CanvasError && err.status === 409)
|
|
141
|
+
return false;
|
|
142
|
+
throw err;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
snapshot(id) {
|
|
146
|
+
return this.call('GET', API.canvas(id));
|
|
147
|
+
}
|
|
148
|
+
apply(id, elements, opts = {}) {
|
|
149
|
+
return this.call('POST', API.elements(id), { elements, ...opts });
|
|
150
|
+
}
|
|
151
|
+
clear(id) {
|
|
152
|
+
return this.call('POST', API.clear(id), {});
|
|
153
|
+
}
|
|
154
|
+
changes(id, since) {
|
|
155
|
+
return this.call('GET', API.changes(id, since));
|
|
156
|
+
}
|
|
157
|
+
addNote(id, text) {
|
|
158
|
+
return this.call('POST', API.notes(id), { text });
|
|
159
|
+
}
|
|
160
|
+
/** Relays a request to the canvas's browser viewer. Fails with code no_viewer, timeout or viewer_error. */
|
|
161
|
+
async request(id, type, payload, timeoutMs = DEFAULT_REQUEST_TIMEOUT_MS) {
|
|
162
|
+
try {
|
|
163
|
+
const body = await this.call('POST', API.request(id), { type, payload, timeoutMs }, timeoutMs + 2000);
|
|
164
|
+
return body.result;
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
if (!(err instanceof CanvasError))
|
|
168
|
+
throw err;
|
|
169
|
+
if (err.status === 409)
|
|
170
|
+
throw new CanvasError(`no browser viewer has canvas "${id}" open`, 409, 'no_viewer');
|
|
171
|
+
if (err.status === 504)
|
|
172
|
+
throw new CanvasError(`the viewer did not answer the ${type} request in time`, 504, 'timeout');
|
|
173
|
+
if (err.status === 502)
|
|
174
|
+
throw new CanvasError(`the viewer failed the ${type} request: ${err.code}`, 502, 'viewer_error');
|
|
175
|
+
throw err;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/** Saves a frozen copy of the canvas to the library, named after the board unless `name` is given. */
|
|
179
|
+
save(id, name) {
|
|
180
|
+
return this.call('POST', API.save(id), name === undefined ? {} : { name });
|
|
181
|
+
}
|
|
182
|
+
searchSaved(query = '', workspace = '', limit) {
|
|
183
|
+
return this.call('GET', API.saved(query, workspace, limit));
|
|
184
|
+
}
|
|
185
|
+
/** Live boards of every folder matching the query, this workspace's first. */
|
|
186
|
+
searchBoards(query = '', workspace = '', limit) {
|
|
187
|
+
return this.call('GET', API.search(query, workspace, limit));
|
|
188
|
+
}
|
|
189
|
+
/** Replaces the canvas's scene with a copy of a saved board. */
|
|
190
|
+
loadSaved(id, savedId) {
|
|
191
|
+
return this.call('POST', API.load(id), { saved: savedId });
|
|
192
|
+
}
|
|
193
|
+
async deleteSaved(savedId) {
|
|
194
|
+
await this.call('DELETE', API.savedBoard(savedId));
|
|
195
|
+
}
|
|
196
|
+
async deleteCanvas(id) {
|
|
197
|
+
await this.call('DELETE', API.canvas(id));
|
|
198
|
+
}
|
|
199
|
+
viewerUrl(id) {
|
|
200
|
+
return `${this.baseUrl}${API.viewer(id)}?token=${this.token}`;
|
|
201
|
+
}
|
|
202
|
+
async call(method, path, body, timeoutMs = HTTP_TIMEOUT_MS, retry = true) {
|
|
203
|
+
let res;
|
|
204
|
+
try {
|
|
205
|
+
res = await fetch(`${this.baseUrl}${path}`, {
|
|
206
|
+
method,
|
|
207
|
+
headers: { Authorization: `Bearer ${this.token}`, ...(body === undefined ? {} : { 'Content-Type': 'application/json' }) },
|
|
208
|
+
body: body === undefined ? undefined : JSON.stringify(body),
|
|
209
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
if (err instanceof DOMException && err.name === 'TimeoutError')
|
|
214
|
+
throw new CanvasError(`${method} ${path.split('?')[0]} timed out after ${timeoutMs}ms`, 504, 'timeout');
|
|
215
|
+
// The daemon idled out or restarted (maybe on another port): find or start it once, then retry once.
|
|
216
|
+
if (!retry || !isConnectionError(err))
|
|
217
|
+
throw err;
|
|
218
|
+
await this.rediscover();
|
|
219
|
+
return this.call(method, path, body, timeoutMs, false);
|
|
220
|
+
}
|
|
221
|
+
const text = await res.text();
|
|
222
|
+
let data;
|
|
223
|
+
try {
|
|
224
|
+
data = text ? JSON.parse(text) : undefined;
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
data = undefined;
|
|
228
|
+
}
|
|
229
|
+
if (res.ok)
|
|
230
|
+
return data;
|
|
231
|
+
const code = isObject(data) && typeof data.error === 'string' ? data.error : `http_${res.status}`;
|
|
232
|
+
throw new CanvasError(`${method} ${path.split('?')[0]} failed (${res.status}): ${code}`, res.status, code);
|
|
233
|
+
}
|
|
234
|
+
rediscover() {
|
|
235
|
+
this.rediscovering ??= discover(this.opts)
|
|
236
|
+
.then((endpoint) => {
|
|
237
|
+
this.endpoint = endpoint;
|
|
238
|
+
})
|
|
239
|
+
.finally(() => {
|
|
240
|
+
this.rediscovering = undefined;
|
|
241
|
+
});
|
|
242
|
+
return this.rediscovering;
|
|
243
|
+
}
|
|
244
|
+
}
|