@trohde/agentic-canvas 0.1.0 → 0.2.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.
Files changed (147) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/README.md +10 -7
  3. package/dist/cli/index.js +660 -52
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/web/assets/{ar-SA-G6X2FPQ2-Bx_JGCzc.js → ar-SA-G6X2FPQ2-Cm_aowk8.js} +1 -1
  6. package/dist/web/assets/{arc-CZEYm-X2.js → arc-BfEOcH9b.js} +1 -1
  7. package/dist/web/assets/architecture-7EHR7CIX-D9uaHVVA.js +1 -0
  8. package/dist/web/assets/{architectureDiagram-3BPJPVTR-BX4UqKAe.js → architectureDiagram-3BPJPVTR-D6EV9nh8.js} +1 -1
  9. package/dist/web/assets/{az-AZ-76LH7QW2-CQnzCEm_.js → az-AZ-76LH7QW2-BKDm9AO9.js} +1 -1
  10. package/dist/web/assets/{bg-BG-XCXSNQG7-B6OhJNg1.js → bg-BG-XCXSNQG7-Bhj2ixUd.js} +1 -1
  11. package/dist/web/assets/{blockDiagram-GPEHLZMM-DOaLZNH2.js → blockDiagram-GPEHLZMM-uuVOs3ER.js} +1 -1
  12. package/dist/web/assets/{bn-BD-2XOGV67Q-CL8DmeD-.js → bn-BD-2XOGV67Q-CnDq7W6e.js} +1 -1
  13. package/dist/web/assets/{c4Diagram-AAUBKEIU-BOYbD4o9.js → c4Diagram-AAUBKEIU-CyjNcZVo.js} +1 -1
  14. package/dist/web/assets/{ca-ES-6MX7JW3Y-DqXuGb3N.js → ca-ES-6MX7JW3Y-CzFlQ5Bd.js} +1 -1
  15. package/dist/web/assets/channel-DcqTbL2I.js +1 -0
  16. package/dist/web/assets/{chunk-2J33WTMH-9pRDhFmL.js → chunk-2J33WTMH-DJms322I.js} +1 -1
  17. package/dist/web/assets/{chunk-3OPIFGDE-Cxtej-eZ.js → chunk-3OPIFGDE-DDQRiaw9.js} +1 -1
  18. package/dist/web/assets/{chunk-4BX2VUAB-WGnRPgB4.js → chunk-4BX2VUAB-8fkcN1qh.js} +1 -1
  19. package/dist/web/assets/{chunk-55IACEB6-By23tM0L.js → chunk-55IACEB6-C_yQ14T3.js} +1 -1
  20. package/dist/web/assets/{chunk-5ZQYHXKU-BbvpmZDT.js → chunk-5ZQYHXKU-ZNEPgpb3.js} +1 -1
  21. package/dist/web/assets/{chunk-727SXJPM-DeN-6nx2.js → chunk-727SXJPM-DH8nxAzX.js} +1 -1
  22. package/dist/web/assets/{chunk-AQP2D5EJ-3vlT2osY.js → chunk-AQP2D5EJ-DfLHvN4q.js} +1 -1
  23. package/dist/web/assets/{chunk-BSJP7CBP-ggZwEsYs.js → chunk-BSJP7CBP-Cf2UEop4.js} +1 -1
  24. package/dist/web/assets/{chunk-CSCIHK7Q-CkCt7BGB.js → chunk-CSCIHK7Q-Bt5Wp92e.js} +1 -1
  25. package/dist/web/assets/{chunk-EIO257PC-DhAXVvAc.js → chunk-EIO257PC-CzqCX7ih.js} +1 -1
  26. package/dist/web/assets/{chunk-FMBD7UC4-BWW1dpup.js → chunk-FMBD7UC4-Dn7yJ4Og.js} +1 -1
  27. package/dist/web/assets/{chunk-KSCS5N6A-ByGpruIk.js → chunk-KSCS5N6A-Ckb-EIkQ.js} +1 -1
  28. package/dist/web/assets/{chunk-L5ZTLDWV-Brj903IS.js → chunk-L5ZTLDWV-DMOYXaNY.js} +1 -1
  29. package/dist/web/assets/{chunk-LZXEDZCA-B0E6SbHa.js → chunk-LZXEDZCA-BZJbFie6.js} +2 -2
  30. package/dist/web/assets/{chunk-ND2GUHAM-cgO1vAyy.js → chunk-ND2GUHAM-CH3bRn4I.js} +1 -1
  31. package/dist/web/assets/{chunk-NZK2D7GU-rJf6zpwf.js → chunk-NZK2D7GU-I17AXEJG.js} +1 -1
  32. package/dist/web/assets/{chunk-O5CBEL6O-DZpUP7B-.js → chunk-O5CBEL6O-hgdRiomR.js} +1 -1
  33. package/dist/web/assets/chunk-QZHKN3VN-DsIBQWIa.js +1 -0
  34. package/dist/web/assets/chunk-WU5MYG2G-CvtGRUhe.js +1 -0
  35. package/dist/web/assets/{chunk-XPW4576I-DRG_5uRX.js → chunk-XPW4576I-9ec1XdXl.js} +1 -1
  36. package/dist/web/assets/classDiagram-4FO5ZUOK-BnjqOVph.js +1 -0
  37. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-BnjqOVph.js +1 -0
  38. package/dist/web/assets/{cose-bilkent-S5V4N54A-Dzdtq3ax.js → cose-bilkent-S5V4N54A-CTAH7-Na.js} +1 -1
  39. package/dist/web/assets/{cs-CZ-2BRQDIVT-C9Hi60ft.js → cs-CZ-2BRQDIVT-BqCGlckY.js} +1 -1
  40. package/dist/web/assets/{da-DK-5WZEPLOC-DuscK2dU.js → da-DK-5WZEPLOC-CQW71ILY.js} +1 -1
  41. package/dist/web/assets/{dagre-BM42HDAG-DG-1WRTH.js → dagre-BM42HDAG-jBLuWLOm.js} +1 -1
  42. package/dist/web/assets/{de-DE-XR44H4JA-BUknVi9m.js → de-DE-XR44H4JA-BGJ_QF0p.js} +1 -1
  43. package/dist/web/assets/{diagram-2AECGRRQ-C01yy19V.js → diagram-2AECGRRQ-Bdk2bzIQ.js} +1 -1
  44. package/dist/web/assets/{diagram-5GNKFQAL-9Ly54gPf.js → diagram-5GNKFQAL-BtXDpnfX.js} +1 -1
  45. package/dist/web/assets/{diagram-KO2AKTUF-Bnzn_Fk2.js → diagram-KO2AKTUF-Dzpy-rDd.js} +1 -1
  46. package/dist/web/assets/{diagram-LMA3HP47-CkQJH7qS.js → diagram-LMA3HP47-DpyU3oY9.js} +1 -1
  47. package/dist/web/assets/{diagram-OG6HWLK6-sYTSt9S6.js → diagram-OG6HWLK6-D_vZYBEy.js} +1 -1
  48. package/dist/web/assets/{dist-CHteZrRU.js → dist-D2xqQQPY.js} +1 -1
  49. package/dist/web/assets/{dist--k9jX8ko.js → dist-DbhSHjHs.js} +4 -4
  50. package/dist/web/assets/{el-GR-BZB4AONW-CBx8IJCe.js → el-GR-BZB4AONW-CtK8iWZk.js} +1 -1
  51. package/dist/web/assets/{en-B4ZKOASM-D04FpeSQ.js → en-B4ZKOASM-QIuF9S_L.js} +1 -1
  52. package/dist/web/assets/{erDiagram-TEJ5UH35-kBTcPhaQ.js → erDiagram-TEJ5UH35-CPSP5rtu.js} +1 -1
  53. package/dist/web/assets/{es-ES-U4NZUMDT-nQPOkQIb.js → es-ES-U4NZUMDT-BGRuwoLW.js} +1 -1
  54. package/dist/web/assets/{eu-ES-A7QVB2H4-OVL5j0Bz.js → eu-ES-A7QVB2H4-BffwZaTm.js} +1 -1
  55. package/dist/web/assets/eventmodeling-FCH6USID-DsUO1N_d.js +1 -0
  56. package/dist/web/assets/{fa-IR-HGAKTJCU-BXJbxYFk.js → fa-IR-HGAKTJCU-DPSCuyoW.js} +1 -1
  57. package/dist/web/assets/{fi-FI-Z5N7JZ37-DoZfr4yv.js → fi-FI-Z5N7JZ37-8dRu4kif.js} +1 -1
  58. package/dist/web/assets/{flowDiagram-I6XJVG4X-CwQyslgb.js → flowDiagram-I6XJVG4X-pB7KUsSZ.js} +1 -1
  59. package/dist/web/assets/{fr-FR-RHASNOE6-CXLv0m_p.js → fr-FR-RHASNOE6-C8e_ndFO.js} +1 -1
  60. package/dist/web/assets/{ganttDiagram-6RSMTGT7-B-1gME9q.js → ganttDiagram-6RSMTGT7-DEwygfiX.js} +1 -1
  61. package/dist/web/assets/{gitGraph-WXDBUCRP-BC3bsb5A.js → gitGraph-WXDBUCRP-DyH-gphX.js} +1 -1
  62. package/dist/web/assets/{gitGraphDiagram-PVQCEYII-DUh_E2g-.js → gitGraphDiagram-PVQCEYII-C580aOqP.js} +1 -1
  63. package/dist/web/assets/{gl-ES-HMX3MZ6V-DMYtQjyy.js → gl-ES-HMX3MZ6V-DZvyfyMN.js} +1 -1
  64. package/dist/web/assets/{he-IL-6SHJWFNN-BXviMgxV.js → he-IL-6SHJWFNN-DdcdKhtV.js} +1 -1
  65. package/dist/web/assets/{hi-IN-IWLTKZ5I-B6s0F0bv.js → hi-IN-IWLTKZ5I-BluyCJ3K.js} +1 -1
  66. package/dist/web/assets/{hu-HU-A5ZG7DT2-DZY88thP.js → hu-HU-A5ZG7DT2-Dg3oGdTy.js} +1 -1
  67. package/dist/web/assets/{id-ID-SAP4L64H-CsRPE_UY.js → id-ID-SAP4L64H-BLUaAQdX.js} +1 -1
  68. package/dist/web/assets/image-GAAHSSAO-Du_312iO.js +1 -0
  69. package/dist/web/assets/{index-Do_WCY2x.js → index-CaeNa0Nd.js} +8 -8
  70. package/dist/web/assets/{info-J43DQDTF-DgcAwO7L.js → info-J43DQDTF-CT6GvwIw.js} +1 -1
  71. package/dist/web/assets/{infoDiagram-5YYISTIA-BVoRZtf6.js → infoDiagram-5YYISTIA-DajsEaol.js} +1 -1
  72. package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-Pc0lSZjn.js → ishikawaDiagram-YF4QCWOH-B4l6Aaj1.js} +1 -1
  73. package/dist/web/assets/{it-IT-JPQ66NNP-D6QIIUKx.js → it-IT-JPQ66NNP-CjKMpPiP.js} +1 -1
  74. package/dist/web/assets/{ja-JP-DBVTYXUO-BKIOpiiN.js → ja-JP-DBVTYXUO-7hTYylEN.js} +1 -1
  75. package/dist/web/assets/{journeyDiagram-JHISSGLW-CUTIkP_3.js → journeyDiagram-JHISSGLW-BYZtl1Hi.js} +1 -1
  76. package/dist/web/assets/{kaa-6HZHGXH3-Ck2PqClI.js → kaa-6HZHGXH3-DZbKTMJH.js} +1 -1
  77. package/dist/web/assets/{kab-KAB-ZGHBKWFO-9067fQ1h.js → kab-KAB-ZGHBKWFO-CfiL0AkF.js} +1 -1
  78. package/dist/web/assets/{kanban-definition-UN3LZRKU-f9h-Kl6S.js → kanban-definition-UN3LZRKU-3KTfHyGo.js} +1 -1
  79. package/dist/web/assets/{kk-KZ-P5N5QNE5-Ds5pD5Rs.js → kk-KZ-P5N5QNE5-CL1X8K-V.js} +1 -1
  80. package/dist/web/assets/{km-KH-HSX4SM5Z-BvgABkMn.js → km-KH-HSX4SM5Z-DkiDM0om.js} +1 -1
  81. package/dist/web/assets/{ko-KR-MTYHY66A-BI-VJ_qS.js → ko-KR-MTYHY66A-DeAZ7jFA.js} +1 -1
  82. package/dist/web/assets/{ku-TR-6OUDTVRD-CzO0QxpT.js → ku-TR-6OUDTVRD-BOybWoIi.js} +1 -1
  83. package/dist/web/assets/{line-BM7n-WSY.js → line-BVaj9bp2.js} +1 -1
  84. package/dist/web/assets/{linear-CoV0e-iv.js → linear-BbEWsyY4.js} +1 -1
  85. package/dist/web/assets/{lt-LT-XHIRWOB4-Wdr8437y.js → lt-LT-XHIRWOB4-C5H7N0uM.js} +1 -1
  86. package/dist/web/assets/{lv-LV-5QDEKY6T-Baqs6ETz.js → lv-LV-5QDEKY6T-T9e_HCTF.js} +1 -1
  87. package/dist/web/assets/{mermaid-parser.core-BxU7L1C-.js → mermaid-parser.core-CBlXvD0u.js} +2 -2
  88. package/dist/web/assets/{mindmap-definition-RKZ34NQL-e2CkjxCV.js → mindmap-definition-RKZ34NQL-DQbTUk5-.js} +1 -1
  89. package/dist/web/assets/{mr-IN-CRQNXWMA-_P3j2iZu.js → mr-IN-CRQNXWMA-B-PthEKF.js} +1 -1
  90. package/dist/web/assets/{my-MM-5M5IBNSE-u-YXjqOx.js → my-MM-5M5IBNSE-BvaKSQfh.js} +1 -1
  91. package/dist/web/assets/{nb-NO-T6EIAALU-BVTkGOfM.js → nb-NO-T6EIAALU-AVukMlbc.js} +1 -1
  92. package/dist/web/assets/{nl-NL-IS3SIHDZ-Dz45KRHt.js → nl-NL-IS3SIHDZ-1Ais5hls.js} +1 -1
  93. package/dist/web/assets/{nn-NO-6E72VCQL-Bv1T99Os.js → nn-NO-6E72VCQL-CMMf615t.js} +1 -1
  94. package/dist/web/assets/{oc-FR-POXYY2M6-CWPx0BPy.js → oc-FR-POXYY2M6-COfJfqJD.js} +1 -1
  95. package/dist/web/assets/{pa-IN-N4M65BXN-CUAufnLD.js → pa-IN-N4M65BXN-BMA3pTXK.js} +1 -1
  96. package/dist/web/assets/{packet-YPE3B663-DSUdqwD6.js → packet-YPE3B663-BBkze78i.js} +1 -1
  97. package/dist/web/assets/percentages-BXMCSKIN-D6JI391u.js +1 -0
  98. package/dist/web/assets/{pica-lghYzniR.js → pica-0kffCCbc.js} +1 -1
  99. package/dist/web/assets/{pie-LRSECV5Y-CtaLKxkL.js → pie-LRSECV5Y-CKSNEbTP.js} +1 -1
  100. package/dist/web/assets/{pieDiagram-4H26LBE5-KQxiMI7y.js → pieDiagram-4H26LBE5-BBbcOiMW.js} +1 -1
  101. package/dist/web/assets/{pl-PL-T2D74RX3-BYDGKTrw.js → pl-PL-T2D74RX3-BynL7lcx.js} +1 -1
  102. package/dist/web/assets/{pt-BR-5N22H2LF-DiLHA1Fv.js → pt-BR-5N22H2LF-C4hPdgZm.js} +1 -1
  103. package/dist/web/assets/{pt-PT-UZXXM6DQ-DO4nqrjh.js → pt-PT-UZXXM6DQ-CohDul9s.js} +1 -1
  104. package/dist/web/assets/{quadrantDiagram-W4KKPZXB-DYnhMBii.js → quadrantDiagram-W4KKPZXB-DbFZ4mVF.js} +1 -1
  105. package/dist/web/assets/{radar-GUYGQ44K-BWVL_5jd.js → radar-GUYGQ44K-nUUcbbyf.js} +1 -1
  106. package/dist/web/assets/{requirementDiagram-4Y6WPE33-CLSyCDmb.js → requirementDiagram-4Y6WPE33-BE4DIJ6B.js} +1 -1
  107. package/dist/web/assets/{ro-RO-JPDTUUEW-CkArAo01.js → ro-RO-JPDTUUEW-NPZ6H5_k.js} +1 -1
  108. package/dist/web/assets/{ru-RU-B4JR7IUQ-CF7qZR2L.js → ru-RU-B4JR7IUQ-DUYJexox.js} +1 -1
  109. package/dist/web/assets/{sankeyDiagram-5OEKKPKP-fCrXqVCu.js → sankeyDiagram-5OEKKPKP-BBgQr7tO.js} +1 -1
  110. package/dist/web/assets/{sequenceDiagram-3UESZ5HK-Ibg1UsPm.js → sequenceDiagram-3UESZ5HK-Bve3KCrM.js} +1 -1
  111. package/dist/web/assets/{si-LK-N5RQ5JYF-SlyZ_B_5.js → si-LK-N5RQ5JYF-YQIyxfwu.js} +1 -1
  112. package/dist/web/assets/{sk-SK-C5VTKIMK-B59JZXsV.js → sk-SK-C5VTKIMK-naC01XZT.js} +1 -1
  113. package/dist/web/assets/{sl-SI-NN7IZMDC-CkVIpRnH.js → sl-SI-NN7IZMDC-c8M-xB_J.js} +1 -1
  114. package/dist/web/assets/{src-Dc-yDLup.js → src-5GYS8Ljo.js} +1 -1
  115. package/dist/web/assets/{stateDiagram-AJRCARHV-Cg6ervwo.js → stateDiagram-AJRCARHV-ooB93unN.js} +1 -1
  116. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-CQKTJr2T.js +1 -0
  117. package/dist/web/assets/subset-shared.chunk-Lb-_zEfd.js +1 -0
  118. package/dist/web/assets/{subset-worker.chunk-DN4FBbFb.js → subset-worker.chunk-Cm3Hfued.js} +1 -1
  119. package/dist/web/assets/{sv-SE-XGPEYMSR-BwnaFVSC.js → sv-SE-XGPEYMSR-BxQJQlZm.js} +1 -1
  120. package/dist/web/assets/{ta-IN-2NMHFXQM-Digwj7d-.js → ta-IN-2NMHFXQM-CLstIlbu.js} +1 -1
  121. package/dist/web/assets/{th-TH-HPSO5L25-Ck3FgDpQ.js → th-TH-HPSO5L25-C1Fw6Lrv.js} +1 -1
  122. package/dist/web/assets/{timeline-definition-PNZ67QCA-Sxfm8qnw.js → timeline-definition-PNZ67QCA-DSwgdcbw.js} +1 -1
  123. package/dist/web/assets/{tr-TR-DEFEU3FU-CZntbglt.js → tr-TR-DEFEU3FU-yIjSKsYZ.js} +1 -1
  124. package/dist/web/assets/{treeView-BLDUP644-Cx8t5kj4.js → treeView-BLDUP644-qRIad0RL.js} +1 -1
  125. package/dist/web/assets/{treemap-LRROVOQU-Dfh_IQDp.js → treemap-LRROVOQU-DkzmeI5b.js} +1 -1
  126. package/dist/web/assets/{uk-UA-QMV73CPH-B0wjKowt.js → uk-UA-QMV73CPH-Cxu2wJjR.js} +1 -1
  127. package/dist/web/assets/{vennDiagram-CIIHVFJN-BMEOJ0gl.js → vennDiagram-CIIHVFJN-C9IbTAeZ.js} +1 -1
  128. package/dist/web/assets/{vi-VN-M7AON7JQ-Dj0BUYxm.js → vi-VN-M7AON7JQ-CVlx5WSz.js} +1 -1
  129. package/dist/web/assets/{wardley-L42UT6IY-EJTnFNq7.js → wardley-L42UT6IY-BoetX5iL.js} +1 -1
  130. package/dist/web/assets/{wardleyDiagram-YWT4CUSO-BJjdV56L.js → wardleyDiagram-YWT4CUSO-BnSF5czb.js} +1 -1
  131. package/dist/web/assets/{xychartDiagram-2RQKCTM6-CBQ88pV0.js → xychartDiagram-2RQKCTM6-CnGeJixh.js} +1 -1
  132. package/dist/web/assets/{zh-CN-LNUGB5OW-K1_YaWy1.js → zh-CN-LNUGB5OW-Cnl39PI9.js} +1 -1
  133. package/dist/web/assets/{zh-HK-E62DVLB3-DCU_gXiJ.js → zh-HK-E62DVLB3-D0hO_t0Q.js} +1 -1
  134. package/dist/web/assets/{zh-TW-RAJ6MFWO-1ApXhCfP.js → zh-TW-RAJ6MFWO-Cq71LAZa.js} +1 -1
  135. package/dist/web/index.html +1 -1
  136. package/package.json +1 -1
  137. package/dist/web/assets/architecture-7EHR7CIX-BW08P3jh.js +0 -1
  138. package/dist/web/assets/channel-jlcmNkDM.js +0 -1
  139. package/dist/web/assets/chunk-QZHKN3VN-B2hsWqvV.js +0 -1
  140. package/dist/web/assets/chunk-WU5MYG2G-ad-_f9bA.js +0 -1
  141. package/dist/web/assets/classDiagram-4FO5ZUOK-pgvxJ5K2.js +0 -1
  142. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-pgvxJ5K2.js +0 -1
  143. package/dist/web/assets/eventmodeling-FCH6USID-3Z5bJ280.js +0 -1
  144. package/dist/web/assets/image-GAAHSSAO-Ufj_572K.js +0 -1
  145. package/dist/web/assets/percentages-BXMCSKIN-BRi-lUYV.js +0 -1
  146. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-Z9e_4KHc.js +0 -1
  147. package/dist/web/assets/subset-shared.chunk-CnjPFGnW.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/server/httpServer.ts","../../src/plugins/excalidraw/index.ts","../../src/core/scene.ts","../../src/plugins/excalidraw/adapter.ts","../../src/plugins/excalidraw/elements.ts","../../src/plugins/excalidraw/format.ts","../../src/plugins/excalidraw/geometry.ts","../../src/plugins/excalidraw/tools.ts","../../src/mcp/schemas.ts","../../src/plugins/excalidraw/flowchart.ts","../../src/server/app.ts","../../src/mcp/buildServer.ts","../../src/shared/packageInfo.ts","../../src/mcp/baselineTools.ts","../../src/server/mcpHttp.ts","../../src/server/canvasController.ts","../../src/server/workspace.ts","../../src/server/wsBridge.ts","../../src/shared/protocol.ts","../../src/shared/logger.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { parseArgs } from \"node:util\";\nimport open from \"open\";\nimport { startHttpServer } from \"../server/httpServer.js\";\nimport { createLogger } from \"../shared/logger.js\";\nimport { CLI_NAME, PACKAGE_NAME, readPackageInfo } from \"../shared/packageInfo.js\";\n\nconst logger = createLogger(\"info\");\n\nasync function main(): Promise<void> {\n const packageInfo = readPackageInfo();\n const args = parseArgs({\n allowPositionals: false,\n allowNegative: true,\n options: {\n canvas: { type: \"string\", default: \"excalidraw\" },\n port: { type: \"string\", default: process.env.AGENTIC_CANVAS_PORT ?? \"3333\" },\n host: { type: \"string\", default: process.env.AGENTIC_CANVAS_HOST ?? \"127.0.0.1\" },\n workspace: { type: \"string\", default: process.env.AGENTIC_CANVAS_WORKSPACE ?? process.cwd() },\n open: { type: \"boolean\", default: true },\n help: { type: \"boolean\", short: \"h\" },\n version: { type: \"boolean\", short: \"v\" },\n },\n });\n\n if (args.values.help) {\n printHelp();\n return;\n }\n\n if (args.values.version) {\n console.log(packageInfo.version);\n return;\n }\n\n if (args.values.canvas !== \"excalidraw\") {\n throw new Error(`Unknown canvas \"${args.values.canvas}\". Available canvases: excalidraw`);\n }\n\n const requestedPort = Number(args.values.port);\n if (!Number.isInteger(requestedPort) || requestedPort < 1 || requestedPort > 65535) {\n throw new Error(`Invalid port: ${args.values.port}`);\n }\n\n const running = await startHttpServer({\n canvas: \"excalidraw\",\n host: String(args.values.host),\n port: requestedPort,\n workspace: String(args.values.workspace),\n });\n\n console.log(`Canvas: ${running.canvasUrl}`);\n console.log(`MCP: ${running.mcpUrl}`);\n\n if (args.values.open) {\n await open(running.canvasUrl);\n }\n}\n\nfunction printHelp(): void {\n console.log(`${CLI_NAME}\n\nStart a local Excalidraw canvas with an MCP Streamable HTTP endpoint.\n\nUsage:\n npx ${PACKAGE_NAME} --canvas excalidraw\n ${CLI_NAME} --canvas excalidraw\n\nOptions:\n --canvas <name> Canvas plugin, currently excalidraw (default: excalidraw)\n --port <n> Port (default: 3333 or AGENTIC_CANVAS_PORT)\n --host <host> Bind host (default: 127.0.0.1 or AGENTIC_CANVAS_HOST)\n --workspace <dir> Save/open/screenshot workspace (default: cwd)\n --open, --no-open Open browser on startup (default: open)\n -h, --help Show help\n -v, --version Show version`);\n}\n\nmain().catch((error) => {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n});\n","import { existsSync } from \"node:fs\";\nimport { type Server, createServer } from \"node:http\";\nimport net from \"node:net\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createExcalidrawPlugin } from \"../plugins/excalidraw/index.js\";\nimport { createApp } from \"./app.js\";\nimport { CanvasController } from \"./canvasController.js\";\nimport { Workspace } from \"./workspace.js\";\nimport { WsBridge } from \"./wsBridge.js\";\n\nexport interface StartServerOptions {\n host: string;\n port: number;\n workspace: string;\n canvas: \"excalidraw\";\n}\n\nexport interface RunningServer {\n host: string;\n port: number;\n canvasUrl: string;\n mcpUrl: string;\n server: Server;\n controller: CanvasController;\n bridge: WsBridge;\n close(): Promise<void>;\n}\n\nexport async function startHttpServer(options: StartServerOptions): Promise<RunningServer> {\n const port = await findFreePort(options.host, options.port);\n const workspace = new Workspace(options.workspace);\n await workspace.ensure();\n\n const plugin = createExcalidrawPlugin();\n const controller = new CanvasController(plugin);\n const bridge = new WsBridge(controller);\n controller.setChangeListener((snapshot, origin) => bridge.broadcastScene(snapshot, origin));\n\n const app = createApp({\n plugin,\n controller,\n workspace,\n webDistDir: findWebDistDir(),\n allowedHosts: allowedHostsFor(options.host, port),\n clientsConnected: () => bridge.connectedClientCount(),\n requestExport: (exportOptions) => bridge.requestExport(exportOptions),\n requestSelection: (selectionOptions) => bridge.requestSelection(selectionOptions),\n });\n\n const server = createServer(app);\n bridge.attach(server);\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, options.host, () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n\n return {\n host: options.host,\n port,\n canvasUrl: `http://${options.host}:${port}`,\n mcpUrl: `http://${options.host}:${port}/mcp`,\n server,\n controller,\n bridge,\n close: () =>\n new Promise((resolve, reject) => {\n bridge.close();\n server.close((error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n }),\n };\n}\n\nexport async function findFreePort(host: string, requestedPort: number): Promise<number> {\n for (let port = requestedPort; port < requestedPort + 20; port += 1) {\n if (await canListen(host, port)) {\n return port;\n }\n }\n\n throw new Error(`No free port found starting at ${requestedPort}`);\n}\n\nfunction canListen(host: string, port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const probe = net.createServer();\n probe.once(\"error\", () => resolve(false));\n probe.listen(port, host, () => {\n probe.close(() => resolve(true));\n });\n });\n}\n\nfunction allowedHostsFor(host: string, port: number): string[] {\n const hosts = new Set([\"127.0.0.1\", \"localhost\", host]);\n for (const hostname of [...hosts]) {\n hosts.add(`${hostname}:${port}`);\n }\n return [...hosts];\n}\n\nfunction findWebDistDir(): string {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, \"../web\"),\n path.resolve(here, \"../../dist/web\"),\n path.resolve(process.cwd(), \"dist/web\"),\n ];\n return (\n candidates.find((candidate) => existsSync(path.join(candidate, \"index.html\"))) ?? candidates[2]\n );\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { CanvasPlugin, PluginToolContext } from \"../../core/plugin.js\";\nimport type {\n CanvasMetadata,\n CanvasObject,\n CanvasObjectSummary,\n CanvasObjectType,\n CanvasStyle,\n CreateObjectSpec,\n ExcalidrawElement,\n Scene,\n SerializedScene,\n UpdateObjectPatch,\n} from \"../../core/scene.js\";\nimport { isElementEndpoint } from \"../../core/scene.js\";\nimport { toCanvasObject, toCanvasObjectSummary } from \"./adapter.js\";\nimport { addBoundElement, buildElement, makeBinding, touchElement } from \"./elements.js\";\nimport { deserializeScene, serializeScene } from \"./format.js\";\nimport { type Point, centerPoint, edgePoint } from \"./geometry.js\";\nimport { registerExcalidrawTools } from \"./tools.js\";\n\nexport function createExcalidrawPlugin(): CanvasPlugin {\n return {\n name: \"excalidraw\",\n createInitialScene,\n getMetadata,\n listObjects,\n getObject,\n createObject,\n updateObject,\n deleteObjects,\n clear,\n serialize,\n deserialize,\n registerTools,\n };\n}\n\nfunction createInitialScene(): Scene {\n return {\n elements: [],\n appState: {\n viewBackgroundColor: \"#ffffff\",\n },\n files: {},\n version: 0,\n };\n}\n\nfunction getMetadata(scene: Scene): CanvasMetadata {\n return {\n canvas: \"excalidraw\",\n version: scene.version,\n objectCount: listObjects(scene).length,\n viewBackgroundColor: scene.appState.viewBackgroundColor,\n };\n}\n\nfunction listObjects(scene: Scene, type?: CanvasObjectType): CanvasObjectSummary[] {\n return scene.elements\n .map(toCanvasObjectSummary)\n .filter((object): object is CanvasObjectSummary => Boolean(object))\n .filter((object) => !type || object.type === type);\n}\n\nfunction getObject(scene: Scene, id: string): CanvasObject | undefined {\n const element = findElement(scene, id);\n return element ? toCanvasObject(element) : undefined;\n}\n\nfunction createObject(scene: Scene, spec: CreateObjectSpec): CanvasObject {\n const element = buildElementWithBindings(scene, spec);\n scene.elements.push(element);\n\n if (spec.text && canCreateBoundLabel(spec.type)) {\n const label = createBoundLabel(element, spec.text, spec.style);\n scene.elements.push(label);\n }\n\n const object = toCanvasObject(element);\n if (!object) {\n throw new Error(`Unsupported object type: ${spec.type}`);\n }\n\n return object;\n}\n\nfunction updateObject(\n scene: Scene,\n id: string,\n patch: UpdateObjectPatch,\n): CanvasObject | undefined {\n const element = findElement(scene, id);\n if (!element) {\n return undefined;\n }\n\n if (patch.x !== undefined) {\n element.x = patch.x;\n }\n if (patch.y !== undefined) {\n element.y = patch.y;\n }\n if (patch.width !== undefined) {\n element.width = patch.width;\n }\n if (patch.height !== undefined) {\n element.height = patch.height;\n }\n if (patch.points !== undefined) {\n element.points = patch.points;\n element.width = linearWidth(patch.points);\n element.height = linearHeight(patch.points);\n }\n if (patch.groupIds !== undefined) {\n element.groupIds = patch.groupIds;\n }\n if (patch.containerId !== undefined) {\n element.containerId = patch.containerId;\n }\n if (patch.style) {\n applyStyle(element, patch.style);\n }\n if (patch.text !== undefined) {\n if (element.type === \"text\") {\n element.text = patch.text;\n element.originalText = patch.text;\n } else {\n upsertContainerLabel(scene, element, patch.text, patch.style);\n }\n }\n\n touchElement(element);\n return toCanvasObject(element);\n}\n\nfunction deleteObjects(scene: Scene, ids: string[]): string[] {\n const idSet = new Set(ids);\n const before = scene.elements.length;\n scene.elements = scene.elements.filter(\n (element) => !idSet.has(element.id) && !idSet.has(element.containerId ?? \"\"),\n );\n return before === scene.elements.length ? [] : ids.filter((id) => !findElement(scene, id));\n}\n\nfunction clear(scene: Scene): void {\n scene.elements = [];\n scene.files = {};\n}\n\nfunction serialize(scene: Scene): SerializedScene {\n return serializeScene(scene);\n}\n\nfunction deserialize(raw: string): Scene {\n return deserializeScene(raw);\n}\n\nfunction registerTools(\n server: Parameters<CanvasPlugin[\"registerTools\"]>[0],\n context: PluginToolContext,\n): void {\n registerExcalidrawTools(server, context);\n}\n\nfunction buildElementWithBindings(scene: Scene, spec: CreateObjectSpec): ExcalidrawElement {\n if (spec.type !== \"arrow\" && spec.type !== \"line\") {\n return buildElement(spec);\n }\n\n const start = spec.start ? resolveEndpoint(scene, spec.start) : undefined;\n const end = spec.end ? resolveEndpoint(scene, spec.end) : undefined;\n const defaultStart = { x: spec.x, y: spec.y };\n const defaultEnd = {\n x: spec.x + (spec.width ?? 160),\n y: spec.y + (spec.height ?? 80),\n };\n const startCenter = start?.point ?? defaultStart;\n const endCenter = end?.point ?? defaultEnd;\n const startPoint = start?.element\n ? edgePoint(start.element, endCenter.x, endCenter.y)\n : startCenter;\n const endPoint = end?.element ? edgePoint(end.element, startCenter.x, startCenter.y) : endCenter;\n const points = spec.points ?? [\n [0, 0],\n [endPoint.x - startPoint.x, endPoint.y - startPoint.y],\n ];\n\n const element = buildElement(\n {\n ...spec,\n x: startPoint.x,\n y: startPoint.y,\n points,\n },\n {\n startBinding: start?.element ? makeBinding(start.element.id) : null,\n endBinding: end?.element ? makeBinding(end.element.id) : null,\n },\n );\n\n if (spec.type === \"arrow\") {\n if (start?.element) {\n addBoundElementById(scene, start.element.id, { id: element.id, type: \"arrow\" });\n }\n if (end?.element) {\n addBoundElementById(scene, end.element.id, { id: element.id, type: \"arrow\" });\n }\n }\n\n return element;\n}\n\nfunction resolveEndpoint(\n scene: Scene,\n endpoint: NonNullable<CreateObjectSpec[\"start\"]>,\n): { point: Point; element?: ExcalidrawElement } {\n if (isElementEndpoint(endpoint)) {\n const element = findElement(scene, endpoint.elementId);\n if (!element) {\n throw new Error(`Object not found: ${endpoint.elementId}`);\n }\n\n return {\n point: centerPoint(element),\n element,\n };\n }\n\n return { point: endpoint };\n}\n\nfunction upsertContainerLabel(\n scene: Scene,\n container: ExcalidrawElement,\n text: string,\n style?: CreateObjectSpec[\"style\"],\n): void {\n const existing = scene.elements.find(\n (element) => element.type === \"text\" && element.containerId === container.id,\n );\n if (existing) {\n existing.text = text;\n existing.originalText = text;\n if (style) {\n applyStyle(existing, style);\n }\n touchElement(existing);\n return;\n }\n\n scene.elements.push(createBoundLabel(container, text, style));\n}\n\nfunction createBoundLabel(\n container: ExcalidrawElement,\n text: string,\n style?: CreateObjectSpec[\"style\"],\n): ExcalidrawElement {\n const labelStyle: CanvasStyle = { ...style, textAlign: style?.textAlign ?? \"center\" };\n const position = labelPosition(container, text, labelStyle);\n const label = buildElement(\n {\n type: \"text\",\n x: position.x,\n y: position.y,\n width: position.width,\n height: position.height,\n text,\n style: labelStyle,\n },\n {\n containerId: container.id,\n },\n );\n label.autoResize = false;\n addBoundElement(container, { id: label.id, type: \"text\" });\n return label;\n}\n\nfunction labelPosition(\n container: ExcalidrawElement,\n text: string,\n style: CanvasStyle,\n): { x: number; y: number; width: number; height: number } {\n const fontSize = style.fontSize ?? 20;\n const lineHeight = fontSize * 1.25;\n if (isLinearElement(container)) {\n const midpoint = linearMidpoint(container);\n const width = Math.max(40, text.length * fontSize * 0.6);\n const height = lineHeight;\n return {\n x: midpoint.x - width / 2,\n y: midpoint.y - height / 2,\n width,\n height,\n };\n }\n\n return {\n x: container.x,\n y: container.y + container.height / 2 - lineHeight / 2,\n width: Math.max(40, container.width),\n height: lineHeight,\n };\n}\n\nfunction isLinearElement(element: ExcalidrawElement): boolean {\n return element.type === \"line\" || element.type === \"arrow\";\n}\n\nfunction canCreateBoundLabel(type: CanvasObjectType): boolean {\n return type !== \"text\" && type !== \"frame\" && type !== \"line\";\n}\n\nfunction linearMidpoint(element: ExcalidrawElement): Point {\n const points = element.points ?? [\n [0, 0],\n [element.width, element.height],\n ];\n const first = points[0] ?? [0, 0];\n const last = points[points.length - 1] ?? first;\n return {\n x: element.x + (first[0] + last[0]) / 2,\n y: element.y + (first[1] + last[1]) / 2,\n };\n}\n\nfunction addBoundElementById(\n scene: Scene,\n elementId: string,\n bound: { id: string; type: \"arrow\" | \"text\" },\n): void {\n const element = findElement(scene, elementId);\n if (element) {\n addBoundElement(element, bound);\n }\n}\n\nexport function findElement(scene: Scene, id: string): ExcalidrawElement | undefined {\n return scene.elements.find((element) => element.id === id && !element.isDeleted);\n}\n\nexport function setFrameOnChildren(scene: Scene, childIds: string[], frameId: string): string[] {\n const updated: string[] = [];\n for (const childId of childIds) {\n const child = findElement(scene, childId);\n if (child) {\n child.frameId = frameId;\n touchElement(child);\n updated.push(child.id);\n }\n }\n return updated;\n}\n\nexport function groupElements(scene: Scene, ids: string[]): string {\n const groupId = randomUUID();\n for (const id of ids) {\n const element = findElement(scene, id);\n if (element && !element.groupIds.includes(groupId)) {\n element.groupIds = [...element.groupIds, groupId];\n touchElement(element);\n }\n }\n return groupId;\n}\n\nfunction applyStyle(\n element: ExcalidrawElement,\n style: NonNullable<CreateObjectSpec[\"style\"]>,\n): void {\n if (style.strokeColor !== undefined) {\n element.strokeColor = style.strokeColor;\n }\n if (style.backgroundColor !== undefined) {\n element.backgroundColor = style.backgroundColor;\n }\n if (style.fillStyle !== undefined) {\n element.fillStyle = style.fillStyle;\n }\n if (style.strokeWidth !== undefined) {\n element.strokeWidth = style.strokeWidth;\n }\n if (style.strokeStyle !== undefined) {\n element.strokeStyle = style.strokeStyle;\n }\n if (style.roughness !== undefined) {\n element.roughness = style.roughness;\n }\n if (style.opacity !== undefined) {\n element.opacity = style.opacity;\n }\n if (style.fontSize !== undefined) {\n element.fontSize = style.fontSize;\n element.height = style.fontSize * 1.25;\n }\n if (style.textAlign !== undefined) {\n element.textAlign = style.textAlign;\n }\n}\n\nfunction linearWidth(points: [number, number][]): number {\n const xs = points.map(([x]) => x);\n return Math.max(...xs) - Math.min(...xs);\n}\n\nfunction linearHeight(points: [number, number][]): number {\n const ys = points.map(([, y]) => y);\n return Math.max(...ys) - Math.min(...ys);\n}\n","export type CanvasObjectType =\n | \"rectangle\"\n | \"ellipse\"\n | \"diamond\"\n | \"line\"\n | \"arrow\"\n | \"text\"\n | \"frame\";\n\nexport type FillStyle = \"hachure\" | \"cross-hatch\" | \"solid\";\nexport type StrokeStyle = \"solid\" | \"dashed\" | \"dotted\";\nexport type StrokeWidth = 1 | 2 | 4;\nexport type Roughness = 0 | 1 | 2;\nexport type TextAlign = \"left\" | \"center\" | \"right\";\n\nexport interface CanvasStyle {\n strokeColor?: string;\n backgroundColor?: string;\n fillStyle?: FillStyle;\n strokeWidth?: StrokeWidth;\n strokeStyle?: StrokeStyle;\n roughness?: Roughness;\n opacity?: number;\n fontSize?: number;\n textAlign?: TextAlign;\n}\n\nexport interface ElementEndpoint {\n elementId: string;\n}\n\nexport interface PointEndpoint {\n x: number;\n y: number;\n}\n\nexport type ArrowEndpoint = ElementEndpoint | PointEndpoint;\n\nexport interface CreateObjectSpec {\n type: CanvasObjectType;\n x: number;\n y: number;\n width?: number;\n height?: number;\n text?: string;\n points?: [number, number][];\n style?: CanvasStyle;\n start?: ArrowEndpoint;\n end?: ArrowEndpoint;\n containerId?: string;\n groupIds?: string[];\n}\n\nexport type UpdateObjectPatch = Partial<Omit<CreateObjectSpec, \"type\">>;\n\nexport interface CanvasObjectSummary {\n id: string;\n type: CanvasObjectType;\n x: number;\n y: number;\n width: number;\n height: number;\n text?: string;\n}\n\nexport interface CanvasObject extends CanvasObjectSummary {\n points?: [number, number][];\n style: CanvasStyle;\n containerId?: string;\n groupIds: string[];\n frameId?: string | null;\n raw: ExcalidrawElement;\n}\n\nexport interface BoundElement {\n id: string;\n type: \"arrow\" | \"text\";\n}\n\nexport interface ElementBinding {\n elementId: string;\n focus: number;\n gap: number;\n}\n\nexport interface ExcalidrawElement {\n id: string;\n index: string;\n type: string;\n x: number;\n y: number;\n width: number;\n height: number;\n angle: number;\n strokeColor: string;\n backgroundColor: string;\n fillStyle: string;\n strokeWidth: number;\n strokeStyle: StrokeStyle;\n roughness: number;\n opacity: number;\n groupIds: string[];\n frameId: string | null;\n roundness: { type: number; value?: number } | null;\n seed: number;\n version: number;\n versionNonce: number;\n isDeleted: boolean;\n boundElements: BoundElement[] | null;\n updated: number;\n link: string | null;\n locked: boolean;\n text?: string;\n originalText?: string;\n fontSize?: number;\n fontFamily?: number;\n textAlign?: TextAlign;\n verticalAlign?: \"top\" | \"middle\" | \"bottom\";\n containerId?: string | null;\n lineHeight?: number;\n autoResize?: boolean;\n points?: [number, number][];\n lastCommittedPoint?: [number, number] | null;\n startBinding?: ElementBinding | null;\n endBinding?: ElementBinding | null;\n startArrowhead?: string | null;\n endArrowhead?: string | null;\n name?: string | null;\n customData?: Record<string, unknown>;\n}\n\nexport interface AppState {\n viewBackgroundColor: string;\n [key: string]: unknown;\n}\n\nexport type BinaryFiles = Record<string, unknown>;\n\nexport interface Scene {\n elements: ExcalidrawElement[];\n appState: AppState;\n files: BinaryFiles;\n version: number;\n}\n\nexport interface CanvasMetadata {\n canvas: string;\n version: number;\n objectCount: number;\n viewBackgroundColor: string;\n}\n\nexport interface SerializedScene {\n type: \"excalidraw\";\n version: 2;\n source: \"agentic-canvas\";\n elements: ExcalidrawElement[];\n appState: AppState;\n files: BinaryFiles;\n}\n\nexport function isElementEndpoint(endpoint: ArrowEndpoint): endpoint is ElementEndpoint {\n return \"elementId\" in endpoint;\n}\n\nexport function cloneScene(scene: Scene): Scene {\n return {\n elements: scene.elements.map((element) => ({ ...element })),\n appState: { ...scene.appState },\n files: { ...scene.files },\n version: scene.version,\n };\n}\n","import type {\n CanvasObject,\n CanvasObjectSummary,\n CanvasObjectType,\n ExcalidrawElement,\n} from \"../../core/scene.js\";\n\nconst SUPPORTED_TYPES = new Set<CanvasObjectType>([\n \"rectangle\",\n \"ellipse\",\n \"diamond\",\n \"line\",\n \"arrow\",\n \"text\",\n \"frame\",\n]);\n\nexport function isSupportedElement(element: ExcalidrawElement): element is ExcalidrawElement & {\n type: CanvasObjectType;\n} {\n return SUPPORTED_TYPES.has(element.type as CanvasObjectType) && !element.isDeleted;\n}\n\nexport function toCanvasObject(element: ExcalidrawElement): CanvasObject | undefined {\n if (!isSupportedElement(element)) {\n return undefined;\n }\n\n return {\n id: element.id,\n type: element.type,\n x: element.x,\n y: element.y,\n width: element.width,\n height: element.height,\n text: element.text,\n points: element.points,\n style: {\n strokeColor: element.strokeColor,\n backgroundColor: element.backgroundColor,\n fillStyle: normalizeFillStyle(element.fillStyle),\n strokeWidth: normalizeStrokeWidth(element.strokeWidth),\n strokeStyle: element.strokeStyle,\n roughness: normalizeRoughness(element.roughness),\n opacity: element.opacity,\n fontSize: element.fontSize,\n textAlign: element.textAlign,\n },\n containerId: element.containerId ?? undefined,\n groupIds: element.groupIds,\n frameId: element.frameId,\n raw: element,\n };\n}\n\nexport function toCanvasObjectSummary(element: ExcalidrawElement): CanvasObjectSummary | undefined {\n const object = toCanvasObject(element);\n if (!object) {\n return undefined;\n }\n\n return {\n id: object.id,\n type: object.type,\n x: object.x,\n y: object.y,\n width: object.width,\n height: object.height,\n text: object.text,\n };\n}\n\nfunction normalizeStrokeWidth(width: number): 1 | 2 | 4 {\n if (width === 1 || width === 4) {\n return width;\n }\n\n return 2;\n}\n\nfunction normalizeFillStyle(fillStyle: string): \"hachure\" | \"cross-hatch\" | \"solid\" {\n if (fillStyle === \"hachure\" || fillStyle === \"cross-hatch\") {\n return fillStyle;\n }\n\n return \"solid\";\n}\n\nfunction normalizeRoughness(roughness: number): 0 | 1 | 2 {\n if (roughness === 0 || roughness === 2) {\n return roughness;\n }\n\n return 1;\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n BoundElement,\n CanvasObjectType,\n CanvasStyle,\n CreateObjectSpec,\n ElementBinding,\n ExcalidrawElement,\n} from \"../../core/scene.js\";\n\nconst DEFAULT_WIDTH = 160;\nconst DEFAULT_HEIGHT = 80;\nconst ORDER_KEY_DIGITS = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nlet elementIndexCounter = 0;\n\nexport interface BuildElementOptions {\n id?: string;\n text?: string;\n containerId?: string | null;\n startBinding?: ElementBinding | null;\n endBinding?: ElementBinding | null;\n boundElements?: BoundElement[] | null;\n frameId?: string | null;\n groupIds?: string[];\n name?: string | null;\n}\n\nexport function buildElement(\n spec: CreateObjectSpec,\n options: BuildElementOptions = {},\n): ExcalidrawElement {\n const type = spec.type;\n const width = spec.width ?? defaultWidth(type);\n const height = spec.height ?? defaultHeight(type);\n const points = spec.points ?? defaultPoints(type, width, height);\n const base: ExcalidrawElement = {\n id: options.id ?? randomUUID(),\n index: nextElementIndex(),\n type,\n x: spec.x,\n y: spec.y,\n width,\n height,\n angle: 0,\n strokeColor: spec.style?.strokeColor ?? \"#1e1e1e\",\n backgroundColor: spec.style?.backgroundColor ?? \"transparent\",\n fillStyle: spec.style?.fillStyle ?? \"solid\",\n strokeWidth: spec.style?.strokeWidth ?? 2,\n strokeStyle: spec.style?.strokeStyle ?? \"solid\",\n roughness: spec.style?.roughness ?? 1,\n opacity: spec.style?.opacity ?? 100,\n groupIds: options.groupIds ?? spec.groupIds ?? [],\n frameId: options.frameId ?? null,\n roundness: roundnessFor(type),\n seed: randomInt31(),\n version: 1,\n versionNonce: randomInt31(),\n isDeleted: false,\n boundElements: options.boundElements ?? null,\n updated: Date.now(),\n link: null,\n locked: false,\n };\n\n if (type === \"text\") {\n return {\n ...base,\n width: spec.width ?? Math.max(40, (options.text ?? spec.text ?? \"\").length * 10),\n height: spec.height ?? spec.style?.fontSize ?? 24,\n text: options.text ?? spec.text ?? \"\",\n originalText: options.text ?? spec.text ?? \"\",\n fontSize: spec.style?.fontSize ?? 20,\n fontFamily: 1,\n textAlign: spec.style?.textAlign ?? \"center\",\n verticalAlign: \"middle\",\n containerId: options.containerId ?? spec.containerId ?? null,\n lineHeight: 1.25,\n autoResize: true,\n };\n }\n\n if (type === \"line\" || type === \"arrow\") {\n return {\n ...base,\n points,\n width: linearWidth(points),\n height: linearHeight(points),\n lastCommittedPoint: null,\n startBinding: options.startBinding ?? null,\n endBinding: options.endBinding ?? null,\n startArrowhead: null,\n endArrowhead: type === \"arrow\" ? \"arrow\" : null,\n };\n }\n\n if (type === \"frame\") {\n return {\n ...base,\n backgroundColor: spec.style?.backgroundColor ?? \"transparent\",\n name: options.name ?? spec.text ?? null,\n };\n }\n\n return base;\n}\n\nexport function makeBinding(elementId: string): ElementBinding {\n return { elementId, focus: 0, gap: 0 };\n}\n\nexport function addBoundElement(target: ExcalidrawElement, bound: BoundElement): void {\n const current = target.boundElements ?? [];\n if (!current.some((entry) => entry.id === bound.id)) {\n target.boundElements = [...current, bound];\n touchElement(target);\n }\n}\n\nexport function touchElement(element: ExcalidrawElement): void {\n element.version += 1;\n element.versionNonce = randomInt31();\n element.updated = Date.now();\n}\n\nfunction defaultWidth(type: CanvasObjectType): number {\n return type === \"text\" ? 80 : DEFAULT_WIDTH;\n}\n\nfunction defaultHeight(type: CanvasObjectType): number {\n return type === \"text\" ? 24 : DEFAULT_HEIGHT;\n}\n\nfunction defaultPoints(type: CanvasObjectType, width: number, height: number): [number, number][] {\n if (type === \"line\" || type === \"arrow\") {\n return [\n [0, 0],\n [width, height],\n ];\n }\n\n return [];\n}\n\nfunction linearWidth(points: [number, number][]): number {\n const xs = points.map(([x]) => x);\n return Math.max(...xs) - Math.min(...xs);\n}\n\nfunction linearHeight(points: [number, number][]): number {\n const ys = points.map(([, y]) => y);\n return Math.max(...ys) - Math.min(...ys);\n}\n\nfunction roundnessFor(type: CanvasObjectType): ExcalidrawElement[\"roundness\"] {\n if (type === \"rectangle\" || type === \"diamond\") {\n return { type: 3 };\n }\n\n return null;\n}\n\nfunction randomInt31(): number {\n return Math.floor(Math.random() * 2_147_483_647);\n}\n\nfunction nextElementIndex(): string {\n return orderKeyForInteger(elementIndexCounter++);\n}\n\nfunction orderKeyForInteger(value: number): string {\n let remaining = value;\n for (let width = 1; width <= 26; width += 1) {\n const capacity = ORDER_KEY_DIGITS.length ** width;\n if (remaining < capacity) {\n return `${String.fromCharCode(\"a\".charCodeAt(0) + width - 1)}${encodeOrderDigits(\n remaining,\n width,\n )}`;\n }\n\n remaining -= capacity;\n }\n\n throw new Error(\"Element order key range exhausted\");\n}\n\nfunction encodeOrderDigits(value: number, width: number): string {\n let encoded = \"\";\n let remaining = value;\n for (let index = 0; index < width; index += 1) {\n encoded = ORDER_KEY_DIGITS[remaining % ORDER_KEY_DIGITS.length] + encoded;\n remaining = Math.floor(remaining / ORDER_KEY_DIGITS.length);\n }\n return encoded;\n}\n","import type { Scene, SerializedScene } from \"../../core/scene.js\";\n\nexport function serializeScene(scene: Scene): SerializedScene {\n return {\n type: \"excalidraw\",\n version: 2,\n source: \"agentic-canvas\",\n elements: scene.elements,\n appState: {\n viewBackgroundColor: scene.appState.viewBackgroundColor,\n },\n files: scene.files,\n };\n}\n\nexport function deserializeScene(raw: string): Scene {\n const parsed = JSON.parse(raw) as Partial<SerializedScene>;\n if (parsed.type !== \"excalidraw\" || !Array.isArray(parsed.elements)) {\n throw new Error(\"Invalid .excalidraw file\");\n }\n\n return {\n elements: parsed.elements,\n appState: {\n viewBackgroundColor: parsed.appState?.viewBackgroundColor ?? \"#ffffff\",\n },\n files: parsed.files ?? {},\n version: 0,\n };\n}\n","import type { ExcalidrawElement } from \"../../core/scene.js\";\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport function centerPoint(\n element: Pick<ExcalidrawElement, \"x\" | \"y\" | \"width\" | \"height\">,\n): Point {\n return {\n x: element.x + element.width / 2,\n y: element.y + element.height / 2,\n };\n}\n\nexport function edgePoint(\n element: Pick<ExcalidrawElement, \"x\" | \"y\" | \"width\" | \"height\" | \"type\">,\n towardX: number,\n towardY: number,\n): Point {\n const center = centerPoint(element);\n const dx = towardX - center.x;\n const dy = towardY - center.y;\n if (dx === 0 && dy === 0) {\n return center;\n }\n\n const halfWidth = element.width / 2;\n const halfHeight = element.height / 2;\n if (halfWidth <= 0 || halfHeight <= 0) {\n return center;\n }\n\n if (element.type === \"ellipse\") {\n const scale =\n 1 / Math.sqrt((dx * dx) / (halfWidth * halfWidth) + (dy * dy) / (halfHeight * halfHeight));\n return {\n x: center.x + dx * scale,\n y: center.y + dy * scale,\n };\n }\n\n if (element.type === \"diamond\") {\n const scale = 1 / (Math.abs(dx) / halfWidth + Math.abs(dy) / halfHeight);\n return {\n x: center.x + dx * scale,\n y: center.y + dy * scale,\n };\n }\n\n const xScale = dx === 0 ? Number.POSITIVE_INFINITY : halfWidth / Math.abs(dx);\n const yScale = dy === 0 ? Number.POSITIVE_INFINITY : halfHeight / Math.abs(dy);\n const scale = Math.min(xScale, yScale);\n return {\n x: center.x + dx * scale,\n y: center.y + dy * scale,\n };\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { PluginToolContext } from \"../../core/plugin.js\";\nimport type { CreateObjectSpec } from \"../../core/scene.js\";\nimport { endpointSchema, pointsSchema, styleSchema } from \"../../mcp/schemas.js\";\nimport { planFlowchart } from \"./flowchart.js\";\nimport { groupElements, setFrameOnChildren } from \"./index.js\";\n\nconst shapeInput = {\n x: z.number(),\n y: z.number(),\n width: z.number(),\n height: z.number(),\n text: z.string().optional(),\n style: styleSchema.optional(),\n};\n\nexport function registerExcalidrawTools(server: McpServer, context: PluginToolContext): void {\n registerShapeTool(server, context, \"draw_rectangle\", \"rectangle\");\n registerShapeTool(server, context, \"draw_ellipse\", \"ellipse\");\n registerShapeTool(server, context, \"draw_diamond\", \"diamond\");\n\n server.registerTool(\n \"draw_line\",\n {\n description: \"Draw an Excalidraw polyline.\",\n inputSchema: {\n x: z.number(),\n y: z.number(),\n points: pointsSchema.min(2),\n style: styleSchema.optional(),\n },\n },\n async ({ x, y, points, style }) => {\n const object = context.controller.createObject({\n type: \"line\",\n x,\n y,\n points: points as CreateObjectSpec[\"points\"],\n style,\n });\n return textResult({ id: object.id });\n },\n );\n\n server.registerTool(\n \"draw_arrow\",\n {\n description: \"Draw an Excalidraw arrow, optionally bound to existing elements.\",\n inputSchema: {\n start: endpointSchema,\n end: endpointSchema,\n text: z.string().optional(),\n style: styleSchema.optional(),\n },\n },\n async ({ start, end, text, style }) => {\n try {\n const id = context.controller.transaction(\n () =>\n context.controller.createObject({\n type: \"arrow\",\n x: \"x\" in start ? start.x : 0,\n y: \"y\" in start ? start.y : 0,\n start,\n end,\n text,\n style,\n }).id,\n );\n return textResult({ id });\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n\n server.registerTool(\n \"add_text\",\n {\n description: \"Add standalone text or a label bound to a container element.\",\n inputSchema: {\n x: z.number().optional(),\n y: z.number().optional(),\n text: z.string(),\n containerId: z.string().optional(),\n style: styleSchema.optional(),\n },\n },\n async ({ x, y, text, containerId, style }) => {\n const container = containerId ? context.controller.getObject(containerId) : undefined;\n if (containerId && !container) {\n return errorResult(`Object not found: ${containerId}`);\n }\n\n const object = context.controller.createObject({\n type: \"text\",\n x: x ?? (container ? container.x + 12 : 0),\n y: y ?? (container ? container.y + container.height / 2 - 12 : 0),\n width: container ? Math.max(40, container.width - 24) : undefined,\n text,\n containerId,\n style,\n });\n return textResult({ id: object.id });\n },\n );\n\n server.registerTool(\n \"create_frame\",\n {\n description: \"Create a frame and optionally assign existing elements to it.\",\n inputSchema: {\n x: z.number(),\n y: z.number(),\n width: z.number(),\n height: z.number(),\n name: z.string().optional(),\n childIds: z.array(z.string()).optional(),\n },\n },\n async ({ x, y, width, height, name, childIds }) => {\n const result = context.controller.transaction(() => {\n const frame = context.controller.createObject({\n type: \"frame\",\n x,\n y,\n width,\n height,\n text: name,\n });\n const updated = context.controller.mutateScene((scene) =>\n setFrameOnChildren(scene, childIds ?? [], frame.id),\n );\n return { id: frame.id, childIds: updated };\n });\n return textResult(result);\n },\n );\n\n server.registerTool(\n \"group_objects\",\n {\n description: \"Group existing Excalidraw elements.\",\n inputSchema: {\n ids: z.array(z.string()).min(1),\n },\n },\n async ({ ids }) => {\n const groupId = context.controller.mutateScene((scene) => groupElements(scene, ids));\n return textResult({ groupId });\n },\n );\n\n server.registerTool(\n \"create_flowchart\",\n {\n description: \"Create a simple deterministic flowchart.\",\n inputSchema: {\n nodes: z\n .array(\n z.object({\n id: z.string(),\n label: z.string(),\n shape: z.enum([\"rectangle\", \"ellipse\", \"diamond\"]).optional(),\n x: z.number().optional(),\n y: z.number().optional(),\n }),\n )\n .min(1),\n edges: z.array(\n z.object({ from: z.string(), to: z.string(), label: z.string().optional() }),\n ),\n direction: z.enum([\"TB\", \"LR\"]).optional(),\n spacingX: z.number().positive().optional(),\n spacingY: z.number().positive().optional(),\n },\n },\n async (input) => {\n try {\n const plan = planFlowchart(input);\n const result = context.controller.transaction(() => {\n const nodeIds: Record<string, string> = {};\n for (const node of plan.nodes) {\n const object = context.controller.createObject(node.spec);\n nodeIds[node.key] = object.id;\n }\n\n const arrowIds: string[] = [];\n for (const edge of plan.edges) {\n const from = nodeIds[edge.from];\n const to = nodeIds[edge.to];\n if (!from || !to) {\n throw new Error(`Flowchart edge references missing node: ${edge.from} -> ${edge.to}`);\n }\n const arrow = context.controller.createObject({\n type: \"arrow\",\n x: 0,\n y: 0,\n start: { elementId: from },\n end: { elementId: to },\n text: edge.label,\n });\n arrowIds.push(arrow.id);\n }\n\n return { nodeIds, arrowIds };\n });\n\n return textResult(result);\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n\nfunction registerShapeTool(\n server: McpServer,\n context: PluginToolContext,\n name: \"draw_rectangle\" | \"draw_ellipse\" | \"draw_diamond\",\n type: CreateObjectSpec[\"type\"],\n): void {\n server.registerTool(\n name,\n {\n description: `Draw an Excalidraw ${type}.`,\n inputSchema: shapeInput,\n },\n async ({ x, y, width, height, text, style }) => {\n const object = context.controller.createObject({ type, x, y, width, height, text, style });\n return textResult({ id: object.id });\n },\n );\n}\n\nfunction textResult(value: unknown) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(value) }],\n };\n}\n\nfunction errorResult(error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n isError: true,\n content: [{ type: \"text\" as const, text: message }],\n };\n}\n","import { z } from \"zod\";\n\nexport const canvasObjectTypeSchema = z.enum([\n \"rectangle\",\n \"ellipse\",\n \"diamond\",\n \"line\",\n \"arrow\",\n \"text\",\n \"frame\",\n]);\n\nexport const styleSchema = z.object({\n strokeColor: z.string().optional(),\n backgroundColor: z.string().optional(),\n fillStyle: z.enum([\"hachure\", \"cross-hatch\", \"solid\"]).optional(),\n strokeWidth: z.union([z.literal(1), z.literal(2), z.literal(4)]).optional(),\n strokeStyle: z.enum([\"solid\", \"dashed\", \"dotted\"]).optional(),\n roughness: z.union([z.literal(0), z.literal(1), z.literal(2)]).optional(),\n opacity: z.number().min(0).max(100).optional(),\n fontSize: z.number().positive().optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n});\n\nexport const endpointSchema = z.union([\n z.object({ elementId: z.string() }),\n z.object({ x: z.number(), y: z.number() }),\n]);\n\nexport const pointSchema = z.array(z.number()).length(2);\nexport const pointsSchema = z.array(pointSchema);\n\nexport const createObjectShape = {\n type: canvasObjectTypeSchema,\n x: z.number(),\n y: z.number(),\n width: z.number().optional(),\n height: z.number().optional(),\n text: z.string().optional(),\n points: pointsSchema.optional(),\n style: styleSchema.optional(),\n start: endpointSchema.optional(),\n end: endpointSchema.optional(),\n containerId: z.string().optional(),\n groupIds: z.array(z.string()).optional(),\n};\n\nexport const updateObjectShape = {\n id: z.string(),\n x: z.number().optional(),\n y: z.number().optional(),\n width: z.number().optional(),\n height: z.number().optional(),\n text: z.string().optional(),\n points: pointsSchema.optional(),\n style: styleSchema.optional(),\n start: endpointSchema.optional(),\n end: endpointSchema.optional(),\n containerId: z.string().optional(),\n groupIds: z.array(z.string()).optional(),\n};\n","import type { CreateObjectSpec } from \"../../core/scene.js\";\n\nexport interface FlowchartNodeInput {\n id: string;\n label: string;\n shape?: \"rectangle\" | \"ellipse\" | \"diamond\";\n x?: number;\n y?: number;\n}\n\nexport interface FlowchartEdgeInput {\n from: string;\n to: string;\n label?: string;\n}\n\nexport interface FlowchartInput {\n nodes: FlowchartNodeInput[];\n edges: FlowchartEdgeInput[];\n direction?: \"TB\" | \"LR\";\n spacingX?: number;\n spacingY?: number;\n}\n\nexport interface FlowchartPlan {\n nodes: Array<{ key: string; spec: CreateObjectSpec }>;\n edges: Array<{ from: string; to: string; label?: string }>;\n}\n\nexport function planFlowchart(input: FlowchartInput): FlowchartPlan {\n const direction = input.direction ?? \"LR\";\n const spacingX = input.spacingX ?? 220;\n const spacingY = input.spacingY ?? 140;\n const levels = assignLevels(input);\n const levelGroups = groupLevels(input.nodes, levels);\n\n return {\n nodes: input.nodes.map((node, index) => {\n const level = levels.get(node.id) ?? index;\n const peers = levelGroups.get(level) ?? [node.id];\n const peerIndex = Math.max(0, peers.indexOf(node.id));\n const crossAxisOffset = peerOffset(\n peerIndex,\n peers.length,\n direction === \"LR\" ? spacingY : spacingX,\n );\n return {\n key: node.id,\n spec: {\n type: node.shape ?? \"rectangle\",\n x: node.x ?? (direction === \"LR\" ? level * spacingX : crossAxisOffset),\n y: node.y ?? (direction === \"TB\" ? level * spacingY : crossAxisOffset),\n width: 160,\n height: 60,\n text: node.label,\n },\n };\n }),\n edges: input.edges,\n };\n}\n\nfunction assignLevels(input: FlowchartInput): Map<string, number> {\n const nodeIds = new Set(input.nodes.map((node) => node.id));\n const indegrees = new Map(input.nodes.map((node) => [node.id, 0]));\n for (const edge of input.edges) {\n if (nodeIds.has(edge.to)) {\n indegrees.set(edge.to, (indegrees.get(edge.to) ?? 0) + 1);\n }\n }\n\n const roots = input.nodes.filter((node) => (indegrees.get(node.id) ?? 0) === 0);\n const levels = new Map<string, number>();\n for (const root of roots.length > 0 ? roots : input.nodes.slice(0, 1)) {\n levels.set(root.id, 0);\n }\n\n for (let pass = 0; pass < input.nodes.length; pass += 1) {\n let changed = false;\n for (const edge of input.edges) {\n const fromLevel = levels.get(edge.from);\n if (fromLevel === undefined || !nodeIds.has(edge.to)) {\n continue;\n }\n\n const nextLevel = fromLevel + 1;\n if ((levels.get(edge.to) ?? -1) < nextLevel) {\n levels.set(edge.to, nextLevel);\n changed = true;\n }\n }\n\n if (!changed) {\n break;\n }\n }\n\n for (const [index, node] of input.nodes.entries()) {\n if (!levels.has(node.id)) {\n levels.set(node.id, index);\n }\n }\n\n return levels;\n}\n\nfunction groupLevels(\n nodes: FlowchartNodeInput[],\n levels: Map<string, number>,\n): Map<number, string[]> {\n const groups = new Map<number, string[]>();\n for (const node of nodes) {\n const level = levels.get(node.id) ?? 0;\n groups.set(level, [...(groups.get(level) ?? []), node.id]);\n }\n return groups;\n}\n\nfunction peerOffset(index: number, count: number, spacing: number): number {\n return (index - (count - 1) / 2) * spacing;\n}\n","import path from \"node:path\";\nimport express from \"express\";\nimport type { BuildMcpServerOptions } from \"../mcp/buildServer.js\";\nimport { buildMcpServer } from \"../mcp/buildServer.js\";\nimport { mountMcpHttp } from \"./mcpHttp.js\";\n\nexport interface CreateAppOptions extends BuildMcpServerOptions {\n webDistDir: string;\n allowedHosts: string[];\n}\n\nexport function createApp(options: CreateAppOptions): express.Express {\n const app = express();\n\n app.use(express.json({ limit: \"10mb\" }));\n\n app.get(\"/healthz\", (_req, res) => {\n res.json({\n status: \"ok\",\n canvas: options.plugin.name,\n version: options.controller.getSnapshot().version,\n });\n });\n\n mountMcpHttp(app, () => buildMcpServer(options), options.allowedHosts);\n\n app.use(express.static(options.webDistDir));\n app.get(\"*\", (_req, res) => {\n res.sendFile(path.join(options.webDistDir, \"index.html\"), (error) => {\n if (error) {\n res.status(404).send(\"Agentic Canvas web build not found. Run npm run build first.\");\n }\n });\n });\n\n return app;\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { CanvasPlugin } from \"../core/plugin.js\";\nimport type { CanvasController } from \"../server/canvasController.js\";\nimport type { Workspace } from \"../server/workspace.js\";\nimport { MCP_SERVER_NAME, readPackageInfo } from \"../shared/packageInfo.js\";\nimport type { ExportResult, SelectionResult } from \"./baselineTools.js\";\nimport { registerBaselineTools } from \"./baselineTools.js\";\n\nexport interface BuildMcpServerOptions {\n plugin: CanvasPlugin;\n controller: CanvasController;\n workspace: Workspace;\n clientsConnected(): number;\n requestExport(options: { exportPadding?: number }): Promise<ExportResult>;\n requestSelection(options?: { timeoutMs?: number }): Promise<SelectionResult>;\n}\n\nexport function buildMcpServer(options: BuildMcpServerOptions): McpServer {\n const packageInfo = readPackageInfo();\n const server = new McpServer({\n name: MCP_SERVER_NAME,\n version: packageInfo.version,\n });\n\n registerBaselineTools(server, {\n controller: options.controller,\n workspace: options.workspace,\n clientsConnected: options.clientsConnected,\n requestExport: options.requestExport,\n requestSelection: options.requestSelection,\n });\n\n options.plugin.registerTools(server, {\n controller: options.controller,\n });\n\n return server;\n}\n","import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport const CLI_NAME = \"agentic-canvas\";\nexport const MCP_SERVER_NAME = \"agentic-canvas\";\nexport const PACKAGE_NAME = \"@trohde/agentic-canvas\";\n\nexport interface PackageInfo {\n name: string;\n version: string;\n}\n\nexport function readPackageInfo(): PackageInfo {\n const packageJsonPath = path.resolve(\n path.dirname(fileURLToPath(import.meta.url)),\n \"../../package.json\",\n );\n const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as Partial<PackageInfo>;\n\n return {\n name: typeof parsed.name === \"string\" ? parsed.name : PACKAGE_NAME,\n version: typeof parsed.version === \"string\" ? parsed.version : \"0.0.0\",\n };\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type {\n CanvasObject,\n CanvasObjectType,\n CreateObjectSpec,\n UpdateObjectPatch,\n} from \"../core/scene.js\";\nimport type { CanvasController } from \"../server/canvasController.js\";\nimport type { Workspace } from \"../server/workspace.js\";\nimport { canvasObjectTypeSchema, createObjectShape, updateObjectShape } from \"./schemas.js\";\n\nexport interface ExportResult {\n mimeType: string;\n base64: string;\n}\n\nexport interface SelectionResult {\n selectedIds: string[];\n}\n\nexport interface BaselineToolContext {\n controller: CanvasController;\n workspace: Workspace;\n clientsConnected(): number;\n requestExport(options: { exportPadding?: number }): Promise<ExportResult>;\n requestSelection(options?: { timeoutMs?: number }): Promise<SelectionResult>;\n}\n\nexport function registerBaselineTools(server: McpServer, context: BaselineToolContext): void {\n server.registerTool(\n \"get_canvas_state\",\n {\n description: \"Get canvas metadata and current scene state summary.\",\n inputSchema: {},\n },\n async () => textResult(context.controller.getMetadata(context.clientsConnected())),\n );\n\n server.registerTool(\n \"list_objects\",\n {\n description: \"List normalized canvas objects.\",\n inputSchema: {\n type: canvasObjectTypeSchema.optional(),\n },\n },\n async ({ type }) =>\n textResult(context.controller.listObjects(type as CanvasObjectType | undefined)),\n );\n\n server.registerTool(\n \"get_object\",\n {\n description: \"Get one normalized canvas object by id.\",\n inputSchema: {\n id: z.string(),\n },\n },\n async ({ id }) => {\n const object = context.controller.getObject(id);\n return object ? textResult(object) : errorResult(`Object not found: ${id}`);\n },\n );\n\n server.registerTool(\n \"create_object\",\n {\n description: \"Create a normalized canvas object.\",\n inputSchema: createObjectShape,\n },\n async (input) => {\n try {\n const object = context.controller.createObject(input as CreateObjectSpec);\n return textResult({ id: object.id });\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n\n server.registerTool(\n \"update_object\",\n {\n description: \"Patch a normalized canvas object.\",\n inputSchema: updateObjectShape,\n },\n async ({ id, ...patch }) => {\n const object = context.controller.updateObject(id, patch as UpdateObjectPatch);\n return object ? textResult({ id: object.id }) : errorResult(`Object not found: ${id}`);\n },\n );\n\n server.registerTool(\n \"delete_object\",\n {\n description: \"Delete one or more canvas objects.\",\n inputSchema: {\n ids: z.array(z.string()).min(1),\n },\n },\n async ({ ids }) => textResult({ deleted: context.controller.deleteObjects(ids) }),\n );\n\n server.registerTool(\n \"clear_canvas\",\n {\n description: \"Clear all canvas objects.\",\n inputSchema: {},\n },\n async () => {\n context.controller.clear();\n return textResult({ cleared: true });\n },\n );\n\n server.registerTool(\n \"save_canvas\",\n {\n description: \"Save the current canvas to a .excalidraw file inside the workspace.\",\n inputSchema: {\n path: z.string().optional(),\n },\n },\n async ({ path }) => {\n try {\n const written = await context.workspace.writeText(\n path ?? \"canvas.excalidraw\",\n context.controller.serialize(),\n );\n return textResult({ path: written });\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n\n server.registerTool(\n \"open_canvas\",\n {\n description: \"Open a .excalidraw file from inside the workspace.\",\n inputSchema: {\n path: z.string(),\n },\n },\n async ({ path }) => {\n try {\n const file = await context.workspace.readText(path);\n context.controller.deserialize(file.text);\n return textResult({\n path: file.path,\n objectCount: context.controller.listObjects().length,\n });\n } catch (error) {\n return errorResult(friendlyOpenError(error, path));\n }\n },\n );\n\n server.registerTool(\n \"screenshot\",\n {\n description: \"Export a PNG screenshot through a connected browser.\",\n inputSchema: {\n path: z.string().optional(),\n exportPadding: z.number().min(0).max(200).optional(),\n },\n },\n async ({ path, exportPadding }) => {\n try {\n const exported = await context.requestExport({ exportPadding });\n const content: Array<\n { type: \"image\"; data: string; mimeType: string } | { type: \"text\"; text: string }\n > = [{ type: \"image\", data: exported.base64, mimeType: exported.mimeType }];\n if (path) {\n const written = await context.workspace.writeBinary(\n path,\n Buffer.from(exported.base64, \"base64\"),\n );\n content.push({ type: \"text\", text: JSON.stringify({ path: written }) });\n }\n return { content };\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n\n server.registerTool(\n \"get_selected_objects\",\n {\n description: \"Return normalized objects currently selected in the connected browser.\",\n inputSchema: {},\n },\n async () => {\n try {\n const selection = await context.requestSelection();\n const objects: CanvasObject[] = [];\n const missingIds: string[] = [];\n for (const id of selection.selectedIds) {\n const object = context.controller.getObject(id);\n if (object) {\n objects.push(object);\n } else {\n missingIds.push(id);\n }\n }\n\n return textResult({\n version: context.controller.currentVersion(),\n selectedIds: selection.selectedIds,\n objects,\n missingIds,\n });\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n\nfunction textResult(value: unknown) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(value) }],\n };\n}\n\nfunction errorResult(error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n isError: true,\n content: [{ type: \"text\" as const, text: message }],\n };\n}\n\nfunction friendlyOpenError(error: unknown, requestedPath: string): unknown {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"ENOENT\"\n ) {\n return `No such canvas file: ${requestedPath}`;\n }\n\n return error;\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { isInitializeRequest } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { Request, Response, Router } from \"express\";\n\ntype Transport = StreamableHTTPServerTransport;\n\nexport function mountMcpHttp(\n router: Router,\n createServer: () => McpServer,\n allowedHosts: string[],\n): void {\n const transports = new Map<string, Transport>();\n\n router.post(\"/mcp\", async (req, res) => {\n try {\n const sessionId = headerValue(req, \"mcp-session-id\");\n let transport = sessionId ? transports.get(sessionId) : undefined;\n\n if (!transport) {\n if (!isInitialize(req.body)) {\n res.status(400).json({ error: \"Missing or invalid MCP session\" });\n return;\n }\n\n transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n enableDnsRebindingProtection: true,\n allowedHosts,\n onsessioninitialized: (newSessionId) => {\n transports.set(newSessionId, transport as Transport);\n },\n });\n transport.onclose = () => {\n const currentSessionId = transport?.sessionId;\n if (currentSessionId) {\n transports.delete(currentSessionId);\n }\n };\n\n await createServer().connect(transport);\n }\n\n await transport.handleRequest(req, res, req.body);\n } catch (error) {\n sendTransportError(res, error);\n }\n });\n\n router.get(\"/mcp\", async (req, res) => {\n await handleSessionRequest(req, res, transports);\n });\n\n router.delete(\"/mcp\", async (req, res) => {\n await handleSessionRequest(req, res, transports);\n });\n}\n\nasync function handleSessionRequest(\n req: Request,\n res: Response,\n transports: Map<string, Transport>,\n): Promise<void> {\n const sessionId = headerValue(req, \"mcp-session-id\");\n const transport = sessionId ? transports.get(sessionId) : undefined;\n if (!transport) {\n res.status(400).json({ error: \"Missing or invalid MCP session\" });\n return;\n }\n\n try {\n await transport.handleRequest(req, res);\n } catch (error) {\n sendTransportError(res, error);\n }\n}\n\nfunction isInitialize(body: unknown): boolean {\n const messages = Array.isArray(body) ? body : [body];\n return messages.some((message) => isInitializeRequest(message));\n}\n\nfunction headerValue(req: Request, name: string): string | undefined {\n const value = req.headers[name];\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction sendTransportError(res: Response, error: unknown): void {\n if (res.headersSent) {\n return;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n res.status(500).json({ error: message });\n}\n","import type { CanvasPlugin } from \"../core/plugin.js\";\nimport type {\n AppState,\n BinaryFiles,\n CanvasMetadata,\n CanvasObject,\n CanvasObjectSummary,\n CanvasObjectType,\n CreateObjectSpec,\n ExcalidrawElement,\n Scene,\n UpdateObjectPatch,\n} from \"../core/scene.js\";\nimport { cloneScene } from \"../core/scene.js\";\n\nexport type SceneChangeOrigin = unknown;\n\nexport interface SceneSnapshot {\n version: number;\n elements: ExcalidrawElement[];\n appState: AppState;\n files: BinaryFiles;\n}\n\nexport type SceneChangeListener = (snapshot: SceneSnapshot, origin?: SceneChangeOrigin) => void;\n\nexport class CanvasController {\n private scene: Scene;\n private listener?: SceneChangeListener;\n private txDepth = 0;\n private txDirty = false;\n private txOrigin?: SceneChangeOrigin;\n\n constructor(private readonly plugin: CanvasPlugin) {\n this.scene = plugin.createInitialScene();\n }\n\n get canvasName(): string {\n return this.plugin.name;\n }\n\n setChangeListener(listener: SceneChangeListener): void {\n this.listener = listener;\n }\n\n getScene(): Scene {\n return cloneScene(this.scene);\n }\n\n getSnapshot(): SceneSnapshot {\n return {\n version: this.scene.version,\n elements: this.scene.elements,\n appState: this.scene.appState,\n files: this.scene.files,\n };\n }\n\n currentVersion(): number {\n return this.scene.version;\n }\n\n getMetadata(clientsConnected = 0): CanvasMetadata & { clientsConnected: number } {\n return {\n ...this.plugin.getMetadata(this.scene),\n clientsConnected,\n };\n }\n\n listObjects(type?: CanvasObjectType): CanvasObjectSummary[] {\n return this.plugin.listObjects(this.scene, type);\n }\n\n getObject(id: string): CanvasObject | undefined {\n return this.plugin.getObject(this.scene, id);\n }\n\n createObject(spec: CreateObjectSpec): CanvasObject {\n return this.mutateScene((scene) => this.plugin.createObject(scene, spec));\n }\n\n updateObject(id: string, patch: UpdateObjectPatch): CanvasObject | undefined {\n return this.mutateScene((scene) => this.plugin.updateObject(scene, id, patch));\n }\n\n deleteObjects(ids: string[]): string[] {\n return this.mutateScene((scene) => this.plugin.deleteObjects(scene, ids));\n }\n\n clear(): void {\n this.mutateScene((scene) => this.plugin.clear(scene));\n }\n\n serialize(): string {\n return JSON.stringify(this.plugin.serialize(this.scene), null, 2);\n }\n\n deserialize(raw: string): void {\n const currentVersion = this.scene.version;\n this.scene = this.plugin.deserialize(raw);\n this.scene.version = currentVersion;\n this.bumpAndNotify();\n }\n\n replaceFromBrowser(\n elements: ExcalidrawElement[],\n appState?: Partial<AppState>,\n files?: BinaryFiles,\n origin?: SceneChangeOrigin,\n ): void {\n this.scene.elements = elements;\n this.scene.appState = {\n viewBackgroundColor: appState?.viewBackgroundColor ?? this.scene.appState.viewBackgroundColor,\n };\n this.scene.files = files ?? this.scene.files;\n this.bumpAndNotify(origin);\n }\n\n mutateScene<T>(mutator: (scene: Scene) => T, origin?: SceneChangeOrigin): T {\n const result = mutator(this.scene);\n this.bumpAndNotify(origin);\n return result;\n }\n\n transaction<T>(fn: () => T, origin?: SceneChangeOrigin): T {\n this.txDepth += 1;\n try {\n return fn();\n } finally {\n this.txDepth -= 1;\n if (this.txDepth === 0 && this.txDirty) {\n const txOrigin = this.txOrigin;\n this.txDirty = false;\n this.txOrigin = undefined;\n this.commit(txOrigin ?? origin);\n }\n }\n }\n\n private bumpAndNotify(origin?: SceneChangeOrigin): void {\n if (this.txDepth > 0) {\n this.txDirty = true;\n this.txOrigin = origin ?? this.txOrigin;\n return;\n }\n\n this.commit(origin);\n }\n\n private commit(origin?: SceneChangeOrigin): void {\n this.scene.version += 1;\n this.listener?.(this.getSnapshot(), origin);\n }\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport class Workspace {\n readonly root: string;\n\n constructor(root: string) {\n this.root = path.resolve(root);\n }\n\n async ensure(): Promise<void> {\n await mkdir(this.root, { recursive: true });\n }\n\n resolveInWorkspace(userPath: string): string {\n if (!userPath || userPath.trim().length === 0) {\n throw new Error(\"Path is required\");\n }\n\n const resolved = path.isAbsolute(userPath)\n ? path.resolve(userPath)\n : path.resolve(this.root, userPath);\n const relative = path.relative(this.root, resolved);\n const staysInside =\n relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n\n if (!staysInside) {\n throw new Error(`Path is outside workspace: ${userPath}`);\n }\n\n return resolved;\n }\n\n async readText(userPath: string): Promise<{ path: string; text: string }> {\n const resolved = this.resolveInWorkspace(userPath);\n return {\n path: resolved,\n text: await readFile(resolved, \"utf8\"),\n };\n }\n\n async writeText(userPath: string, text: string): Promise<string> {\n const resolved = this.resolveInWorkspace(userPath);\n await mkdir(path.dirname(resolved), { recursive: true });\n await writeFile(resolved, text, \"utf8\");\n return resolved;\n }\n\n async writeBinary(userPath: string, data: Buffer): Promise<string> {\n const resolved = this.resolveInWorkspace(userPath);\n await mkdir(path.dirname(resolved), { recursive: true });\n await writeFile(resolved, data);\n return resolved;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { Server } from \"node:http\";\nimport { WebSocket, WebSocketServer } from \"ws\";\nimport type { ExcalidrawElement } from \"../core/scene.js\";\nimport {\n type ExportRequestMessage,\n type SelectionRequestMessage,\n type ServerToBrowserMessage,\n parseBrowserMessage,\n} from \"../shared/protocol.js\";\nimport type { CanvasController, SceneSnapshot } from \"./canvasController.js\";\n\nexport interface ExportOptions {\n exportPadding?: number;\n timeoutMs?: number;\n}\n\nexport interface BrowserExport {\n mimeType: string;\n base64: string;\n}\n\nexport interface SelectionOptions {\n timeoutMs?: number;\n}\n\nexport interface BrowserSelection {\n selectedIds: string[];\n}\n\ninterface PendingExport {\n resolve(value: BrowserExport): void;\n reject(error: Error): void;\n timer: NodeJS.Timeout;\n}\n\ninterface PendingSelection {\n resolve(value: BrowserSelection): void;\n reject(error: Error): void;\n timer: NodeJS.Timeout;\n}\n\ninterface ClientState {\n socket: WebSocket;\n lastSyncedOrder: number;\n lastSyncedVersion: number;\n}\n\nexport class WsBridge {\n private readonly clients = new Map<WebSocket, ClientState>();\n private readonly pendingExports = new Map<string, PendingExport>();\n private readonly pendingSelections = new Map<string, PendingSelection>();\n private syncOrder = 0;\n private wss?: WebSocketServer;\n\n constructor(private readonly controller: CanvasController) {}\n\n attach(server: Server, path = \"/ws\"): void {\n this.wss = new WebSocketServer({ noServer: true });\n this.wss.on(\"connection\", (socket) => this.handleConnection(socket));\n\n server.on(\"upgrade\", (request, socket, head) => {\n const url = new URL(request.url ?? \"/\", \"http://127.0.0.1\");\n if (url.pathname !== path || !this.wss) {\n return;\n }\n\n this.wss.handleUpgrade(request, socket, head, (ws) => {\n this.wss?.emit(\"connection\", ws, request);\n });\n });\n }\n\n connectedClientCount(): number {\n return this.clients.size;\n }\n\n broadcastScene(snapshot: SceneSnapshot, origin?: unknown): void {\n for (const { socket } of this.clients.values()) {\n if (socket !== origin) {\n this.sendScene(socket, snapshot);\n }\n }\n\n if (origin instanceof WebSocket) {\n this.markClientSynced(origin, snapshot.version);\n }\n }\n\n requestExport(options: ExportOptions = {}): Promise<BrowserExport> {\n const client = this.mostRecentlySyncedClient();\n if (!client) {\n return Promise.reject(new Error(\"No browser canvas client is connected\"));\n }\n\n const id = randomUUID();\n const request: ExportRequestMessage = {\n type: \"export:request\",\n id,\n mimeType: \"image/png\",\n exportPadding: options.exportPadding,\n };\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingExports.delete(id);\n reject(new Error(\"Screenshot export timed out\"));\n }, options.timeoutMs ?? 5000);\n\n this.pendingExports.set(id, { resolve, reject, timer });\n client.socket.send(JSON.stringify(request));\n });\n }\n\n requestSelection(options: SelectionOptions = {}): Promise<BrowserSelection> {\n const client = this.mostRecentlySyncedClient();\n if (!client) {\n return Promise.reject(new Error(\"No browser canvas client is connected\"));\n }\n\n const id = randomUUID();\n const request: SelectionRequestMessage = {\n type: \"selection:request\",\n id,\n };\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingSelections.delete(id);\n reject(new Error(\"Selection request timed out\"));\n }, options.timeoutMs ?? 5000);\n\n this.pendingSelections.set(id, { resolve, reject, timer });\n client.socket.send(JSON.stringify(request));\n });\n }\n\n close(): void {\n for (const { socket } of this.clients.values()) {\n socket.close();\n }\n this.wss?.close();\n }\n\n private handleConnection(socket: WebSocket): void {\n this.clients.set(socket, {\n socket,\n lastSyncedOrder: 0,\n lastSyncedVersion: -1,\n });\n socket.on(\"message\", (data) => this.handleMessage(socket, data.toString()));\n socket.on(\"close\", () => {\n this.clients.delete(socket);\n });\n this.sendScene(socket, this.controller.getSnapshot());\n }\n\n private handleMessage(socket: WebSocket, data: string): void {\n const message = parseBrowserMessage(data);\n if (!message) {\n return;\n }\n\n if (message.type === \"hello\") {\n this.sendScene(socket, this.controller.getSnapshot());\n return;\n }\n\n if (message.type === \"scene:changed\") {\n if (message.baseVersion < this.controller.currentVersion()) {\n this.sendScene(socket, this.controller.getSnapshot());\n return;\n }\n\n this.controller.replaceFromBrowser(\n message.elements as ExcalidrawElement[],\n message.appState,\n message.files,\n socket,\n );\n this.markClientSynced(socket, this.controller.currentVersion());\n return;\n }\n\n if (message.type === \"export:result\" || message.type === \"export:error\") {\n const pending = this.pendingExports.get(message.id);\n if (!pending) {\n return;\n }\n\n clearTimeout(pending.timer);\n this.pendingExports.delete(message.id);\n if (message.type === \"export:result\") {\n pending.resolve({ mimeType: message.mimeType, base64: message.base64 });\n } else {\n pending.reject(new Error(message.message));\n }\n return;\n }\n\n if (message.type === \"selection:result\" || message.type === \"selection:error\") {\n const pending = this.pendingSelections.get(message.id);\n if (!pending) {\n return;\n }\n\n clearTimeout(pending.timer);\n this.pendingSelections.delete(message.id);\n if (message.type === \"selection:result\") {\n pending.resolve({ selectedIds: message.selectedIds });\n } else {\n pending.reject(new Error(message.message));\n }\n }\n }\n\n private sendScene(socket: WebSocket, snapshot: SceneSnapshot): void {\n if (socket.readyState !== WebSocket.OPEN) {\n return;\n }\n\n socket.send(\n JSON.stringify({\n type: \"scene:set\",\n version: snapshot.version,\n elements: snapshot.elements,\n appState: snapshot.appState,\n files: snapshot.files,\n } satisfies ServerToBrowserMessage),\n );\n this.markClientSynced(socket, snapshot.version);\n }\n\n private markClientSynced(socket: WebSocket, version: number): void {\n const client = this.clients.get(socket);\n if (!client) {\n return;\n }\n\n client.lastSyncedOrder = ++this.syncOrder;\n client.lastSyncedVersion = version;\n }\n\n private mostRecentlySyncedClient(): ClientState | undefined {\n return [...this.clients.values()]\n .filter((candidate) => candidate.socket.readyState === WebSocket.OPEN)\n .sort((left, right) => right.lastSyncedOrder - left.lastSyncedOrder)[0];\n }\n}\n","import type { AppState, BinaryFiles, ExcalidrawElement } from \"../core/scene.js\";\n\nexport type BrowserToServerMessage =\n | HelloMessage\n | SceneChangedMessage\n | ExportResultMessage\n | ExportErrorMessage\n | SelectionResultMessage\n | SelectionErrorMessage;\n\nexport type ServerToBrowserMessage =\n | SceneSetMessage\n | ExportRequestMessage\n | SelectionRequestMessage;\n\nexport interface HelloMessage {\n type: \"hello\";\n}\n\nexport interface SceneChangedMessage {\n type: \"scene:changed\";\n baseVersion: number;\n elements: ExcalidrawElement[];\n appState?: Partial<AppState>;\n files?: BinaryFiles;\n}\n\nexport interface ExportResultMessage {\n type: \"export:result\";\n id: string;\n mimeType: string;\n base64: string;\n}\n\nexport interface ExportErrorMessage {\n type: \"export:error\";\n id: string;\n message: string;\n}\n\nexport interface SelectionResultMessage {\n type: \"selection:result\";\n id: string;\n selectedIds: string[];\n}\n\nexport interface SelectionErrorMessage {\n type: \"selection:error\";\n id: string;\n message: string;\n}\n\nexport interface SceneSetMessage {\n type: \"scene:set\";\n version: number;\n elements: ExcalidrawElement[];\n appState?: Partial<AppState>;\n files?: BinaryFiles;\n}\n\nexport interface ExportRequestMessage {\n type: \"export:request\";\n id: string;\n mimeType?: \"image/png\";\n exportPadding?: number;\n}\n\nexport interface SelectionRequestMessage {\n type: \"selection:request\";\n id: string;\n}\n\nexport function parseBrowserMessage(data: string): BrowserToServerMessage | undefined {\n try {\n const parsed = JSON.parse(data) as BrowserToServerMessage;\n if (typeof parsed === \"object\" && parsed !== null && \"type\" in parsed) {\n return parsed;\n }\n } catch {\n return undefined;\n }\n\n return undefined;\n}\n","export type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nconst levelOrder: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n};\n\nexport interface Logger {\n debug(message: string, details?: unknown): void;\n info(message: string, details?: unknown): void;\n warn(message: string, details?: unknown): void;\n error(message: string, details?: unknown): void;\n}\n\nexport function createLogger(minLevel: LogLevel = \"info\"): Logger {\n const min = levelOrder[minLevel];\n\n const write = (level: LogLevel, message: string, details?: unknown) => {\n if (levelOrder[level] < min) {\n return;\n }\n\n const suffix = details === undefined ? \"\" : ` ${formatDetails(details)}`;\n console.error(`[agentic-canvas] ${level}: ${message}${suffix}`);\n };\n\n return {\n debug: (message, details) => write(\"debug\", message, details),\n info: (message, details) => write(\"info\", message, details),\n warn: (message, details) => write(\"warn\", message, details),\n error: (message, details) => write(\"error\", message, details),\n };\n}\n\nfunction formatDetails(details: unknown): string {\n if (details instanceof Error) {\n return details.stack ?? details.message;\n }\n\n if (typeof details === \"string\") {\n return details;\n }\n\n try {\n return JSON.stringify(details);\n } catch {\n return String(details);\n }\n}\n"],"mappings":"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","names":["path","fileURLToPath","randomUUID","scale","z","z","linearWidth","linearHeight","randomUUID","path","z","textResult","z","errorResult","path","randomUUID","createServer","path","path","randomUUID","path","randomUUID","path","fileURLToPath"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/server/httpServer.ts","../../src/plugins/excalidraw/index.ts","../../src/core/scene.ts","../../src/shared/colors.ts","../../src/plugins/excalidraw/adapter.ts","../../src/plugins/excalidraw/elements.ts","../../src/plugins/excalidraw/textMetrics.ts","../../src/plugins/excalidraw/format.ts","../../src/plugins/excalidraw/geometry.ts","../../src/plugins/excalidraw/tools.ts","../../src/mcp/schemas.ts","../../src/plugins/excalidraw/flowchart.ts","../../src/server/app.ts","../../src/mcp/buildServer.ts","../../src/shared/packageInfo.ts","../../src/mcp/baselineTools.ts","../../src/server/mcpHttp.ts","../../src/server/canvasController.ts","../../src/server/workspace.ts","../../src/server/wsBridge.ts","../../src/shared/protocol.ts","../../src/shared/logger.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { parseArgs } from \"node:util\";\nimport open from \"open\";\nimport { startHttpServer } from \"../server/httpServer.js\";\nimport { createLogger } from \"../shared/logger.js\";\nimport { CLI_NAME, PACKAGE_NAME, readPackageInfo } from \"../shared/packageInfo.js\";\n\nconst logger = createLogger(\"info\");\n\nasync function main(): Promise<void> {\n const packageInfo = readPackageInfo();\n const args = parseArgs({\n allowPositionals: false,\n allowNegative: true,\n options: {\n canvas: { type: \"string\", default: \"excalidraw\" },\n port: { type: \"string\", default: process.env.AGENTIC_CANVAS_PORT ?? \"3333\" },\n host: { type: \"string\", default: process.env.AGENTIC_CANVAS_HOST ?? \"127.0.0.1\" },\n workspace: { type: \"string\", default: process.env.AGENTIC_CANVAS_WORKSPACE ?? process.cwd() },\n open: { type: \"boolean\", default: true },\n help: { type: \"boolean\", short: \"h\" },\n version: { type: \"boolean\", short: \"v\" },\n },\n });\n\n if (args.values.help) {\n printHelp();\n return;\n }\n\n if (args.values.version) {\n console.log(packageInfo.version);\n return;\n }\n\n if (args.values.canvas !== \"excalidraw\") {\n throw new Error(`Unknown canvas \"${args.values.canvas}\". Available canvases: excalidraw`);\n }\n\n const requestedPort = Number(args.values.port);\n if (!Number.isInteger(requestedPort) || requestedPort < 1 || requestedPort > 65535) {\n throw new Error(`Invalid port: ${args.values.port}`);\n }\n\n const running = await startHttpServer({\n canvas: \"excalidraw\",\n host: String(args.values.host),\n port: requestedPort,\n workspace: String(args.values.workspace),\n });\n\n console.log(`Canvas: ${running.canvasUrl}`);\n console.log(`MCP: ${running.mcpUrl}`);\n\n if (args.values.open) {\n await open(running.canvasUrl);\n }\n}\n\nfunction printHelp(): void {\n console.log(`${CLI_NAME}\n\nStart a local Excalidraw canvas with an MCP Streamable HTTP endpoint.\n\nUsage:\n npx ${PACKAGE_NAME} --canvas excalidraw\n ${CLI_NAME} --canvas excalidraw\n\nOptions:\n --canvas <name> Canvas plugin, currently excalidraw (default: excalidraw)\n --port <n> Port (default: 3333 or AGENTIC_CANVAS_PORT)\n --host <host> Bind host (default: 127.0.0.1 or AGENTIC_CANVAS_HOST)\n --workspace <dir> Save/open/screenshot workspace (default: cwd)\n --open, --no-open Open browser on startup (default: open)\n -h, --help Show help\n -v, --version Show version`);\n}\n\nmain().catch((error) => {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n});\n","import { existsSync } from \"node:fs\";\nimport { type Server, createServer } from \"node:http\";\nimport net from \"node:net\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createExcalidrawPlugin } from \"../plugins/excalidraw/index.js\";\nimport { createApp } from \"./app.js\";\nimport { CanvasController } from \"./canvasController.js\";\nimport { Workspace } from \"./workspace.js\";\nimport { WsBridge } from \"./wsBridge.js\";\n\nexport interface StartServerOptions {\n host: string;\n port: number;\n workspace: string;\n canvas: \"excalidraw\";\n}\n\nexport interface RunningServer {\n host: string;\n port: number;\n canvasUrl: string;\n mcpUrl: string;\n server: Server;\n controller: CanvasController;\n bridge: WsBridge;\n close(): Promise<void>;\n}\n\nexport async function startHttpServer(options: StartServerOptions): Promise<RunningServer> {\n const port = await findFreePort(options.host, options.port);\n const workspace = new Workspace(options.workspace);\n await workspace.ensure();\n\n const plugin = createExcalidrawPlugin();\n const controller = new CanvasController(plugin);\n const bridge = new WsBridge(controller);\n controller.setChangeListener((snapshot, origin) => bridge.broadcastScene(snapshot, origin));\n\n const app = createApp({\n plugin,\n controller,\n workspace,\n webDistDir: findWebDistDir(),\n allowedHosts: allowedHostsFor(options.host, port),\n clientsConnected: () => bridge.connectedClientCount(),\n requestExport: (exportOptions) => bridge.requestExport(exportOptions),\n requestSelection: (selectionOptions) => bridge.requestSelection(selectionOptions),\n requestSetSelection: (selectedIds, selectionOptions) =>\n bridge.requestSetSelection(selectedIds, selectionOptions),\n });\n\n const server = createServer(app);\n bridge.attach(server);\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, options.host, () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n\n return {\n host: options.host,\n port,\n canvasUrl: `http://${options.host}:${port}`,\n mcpUrl: `http://${options.host}:${port}/mcp`,\n server,\n controller,\n bridge,\n close: () =>\n new Promise((resolve, reject) => {\n bridge.close();\n server.close((error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n }),\n };\n}\n\nexport async function findFreePort(host: string, requestedPort: number): Promise<number> {\n for (let port = requestedPort; port < requestedPort + 20; port += 1) {\n if (await canListen(host, port)) {\n return port;\n }\n }\n\n throw new Error(`No free port found starting at ${requestedPort}`);\n}\n\nfunction canListen(host: string, port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const probe = net.createServer();\n probe.once(\"error\", () => resolve(false));\n probe.listen(port, host, () => {\n probe.close(() => resolve(true));\n });\n });\n}\n\nfunction allowedHostsFor(host: string, port: number): string[] {\n const hosts = new Set([\"127.0.0.1\", \"localhost\", host]);\n for (const hostname of [...hosts]) {\n hosts.add(`${hostname}:${port}`);\n }\n return [...hosts];\n}\n\nfunction findWebDistDir(): string {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, \"../web\"),\n path.resolve(here, \"../../dist/web\"),\n path.resolve(process.cwd(), \"dist/web\"),\n ];\n return (\n candidates.find((candidate) => existsSync(path.join(candidate, \"index.html\"))) ?? candidates[2]\n );\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { CanvasPlugin, PluginToolContext } from \"../../core/plugin.js\";\nimport type {\n CanvasMetadata,\n CanvasObject,\n CanvasObjectSummary,\n CanvasObjectType,\n CanvasStyle,\n CreateObjectSpec,\n ExcalidrawElement,\n Scene,\n SerializedScene,\n UpdateObjectPatch,\n} from \"../../core/scene.js\";\nimport { isElementEndpoint } from \"../../core/scene.js\";\nimport { isCanvasColor } from \"../../shared/colors.js\";\nimport { toCanvasObject, toCanvasObjectSummary } from \"./adapter.js\";\nimport { addBoundElement, buildElement, makeBinding, touchElement } from \"./elements.js\";\nimport { deserializeScene, serializeScene } from \"./format.js\";\nimport { type Point, centerPoint, edgePoint } from \"./geometry.js\";\nimport { measureTextBounds } from \"./textMetrics.js\";\nimport { registerExcalidrawTools } from \"./tools.js\";\n\nexport function createExcalidrawPlugin(): CanvasPlugin {\n return {\n name: \"excalidraw\",\n createInitialScene,\n getMetadata,\n listObjects,\n getObject,\n createObject,\n updateObject,\n deleteObjects,\n clear,\n serialize,\n deserialize,\n registerTools,\n };\n}\n\nfunction createInitialScene(): Scene {\n return {\n elements: [],\n appState: {\n viewBackgroundColor: \"#ffffff\",\n },\n files: {},\n version: 0,\n };\n}\n\nfunction getMetadata(scene: Scene): CanvasMetadata {\n return {\n canvas: \"excalidraw\",\n version: scene.version,\n objectCount: listObjects(scene).length,\n viewBackgroundColor: scene.appState.viewBackgroundColor,\n };\n}\n\nfunction listObjects(scene: Scene, type?: CanvasObjectType): CanvasObjectSummary[] {\n return scene.elements\n .map(toCanvasObjectSummary)\n .filter((object): object is CanvasObjectSummary => Boolean(object))\n .filter((object) => !type || object.type === type);\n}\n\nfunction getObject(scene: Scene, id: string): CanvasObject | undefined {\n const element = findElement(scene, id);\n return element ? toCanvasObject(element) : undefined;\n}\n\nfunction createObject(scene: Scene, spec: CreateObjectSpec): CanvasObject {\n validateCreateSpec(spec);\n if (spec.containerId && !findElement(scene, spec.containerId)) {\n throw new Error(`Object not found: ${spec.containerId}`);\n }\n\n const element = buildElementWithBindings(scene, spec);\n scene.elements.push(element);\n\n if (spec.type === \"text\" && spec.containerId) {\n addBoundElementById(scene, spec.containerId, { id: element.id, type: \"text\" });\n }\n\n if (spec.text && canCreateBoundLabel(spec.type)) {\n const label = createBoundLabel(element, spec.text, spec.style);\n scene.elements.push(label);\n }\n\n const object = toCanvasObject(element);\n if (!object) {\n throw new Error(`Unsupported object type: ${spec.type}`);\n }\n\n return object;\n}\n\nfunction updateObject(\n scene: Scene,\n id: string,\n patch: UpdateObjectPatch,\n): CanvasObject | undefined {\n const element = findElement(scene, id);\n if (!element) {\n return undefined;\n }\n\n validateUpdatePatch(element, patch);\n\n if (patch.x !== undefined) {\n element.x = patch.x;\n }\n if (patch.y !== undefined) {\n element.y = patch.y;\n }\n if (patch.width !== undefined) {\n element.width = patch.width;\n }\n if (patch.height !== undefined) {\n element.height = patch.height;\n }\n if (patch.points !== undefined) {\n element.points = patch.points;\n element.width = linearWidth(patch.points);\n element.height = linearHeight(patch.points);\n }\n if (patch.groupIds !== undefined) {\n element.groupIds = patch.groupIds;\n }\n if (patch.containerId !== undefined) {\n element.containerId = patch.containerId;\n }\n if (patch.style) {\n applyStyle(element, patch.style);\n if (element.type === \"text\") {\n resizeTextElement(element);\n } else {\n applyTextStyleToBoundLabels(scene, element, patch.style);\n }\n }\n if (patch.text !== undefined) {\n if (element.type === \"text\") {\n element.text = patch.text;\n element.originalText = patch.text;\n resizeTextElement(element);\n if (element.containerId) {\n const container = findElement(scene, element.containerId);\n if (container) {\n relayoutBoundLabels(scene, container);\n }\n }\n } else {\n upsertContainerLabel(scene, element, patch.text, patch.style);\n }\n }\n\n touchElement(element);\n syncBoundElements(scene, element);\n return toCanvasObject(element);\n}\n\nfunction deleteObjects(scene: Scene, ids: string[]): string[] {\n const idSet = new Set(ids);\n const deleted = new Set<string>();\n for (const element of scene.elements) {\n if (idSet.has(element.id) || idSet.has(element.containerId ?? \"\")) {\n deleted.add(element.id);\n }\n }\n\n if (deleted.size === 0) {\n return [];\n }\n\n scene.elements = scene.elements.filter((element) => !deleted.has(element.id));\n for (const element of scene.elements) {\n if (!element.boundElements) {\n continue;\n }\n\n const kept = element.boundElements.filter((bound) => !deleted.has(bound.id));\n if (kept.length !== element.boundElements.length) {\n element.boundElements = kept.length > 0 ? kept : null;\n touchElement(element);\n }\n }\n\n return [...deleted];\n}\n\nfunction clear(scene: Scene): void {\n scene.elements = [];\n scene.files = {};\n}\n\nfunction serialize(scene: Scene): SerializedScene {\n return serializeScene(scene);\n}\n\nfunction deserialize(raw: string): Scene {\n return deserializeScene(raw);\n}\n\nfunction registerTools(\n server: Parameters<CanvasPlugin[\"registerTools\"]>[0],\n context: PluginToolContext,\n): void {\n registerExcalidrawTools(server, context);\n}\n\nfunction buildElementWithBindings(scene: Scene, spec: CreateObjectSpec): ExcalidrawElement {\n if (spec.type !== \"arrow\" && spec.type !== \"line\") {\n return buildElement(spec);\n }\n\n const start = spec.start ? resolveEndpoint(scene, spec.start) : undefined;\n const end = spec.end ? resolveEndpoint(scene, spec.end) : undefined;\n const defaultStart = { x: spec.x, y: spec.y };\n const defaultEnd = {\n x: spec.x + (spec.width ?? 160),\n y: spec.y + (spec.height ?? 80),\n };\n const startCenter = start?.point ?? defaultStart;\n const endCenter = end?.point ?? defaultEnd;\n const startPoint = start?.element\n ? edgePoint(start.element, endCenter.x, endCenter.y)\n : startCenter;\n const endPoint = end?.element ? edgePoint(end.element, startCenter.x, startCenter.y) : endCenter;\n const points = spec.points ?? [\n [0, 0],\n [endPoint.x - startPoint.x, endPoint.y - startPoint.y],\n ];\n\n const element = buildElement(\n {\n ...spec,\n x: startPoint.x,\n y: startPoint.y,\n points,\n },\n {\n startBinding: start?.element ? makeBinding(start.element.id) : null,\n endBinding: end?.element ? makeBinding(end.element.id) : null,\n },\n );\n\n if (spec.type === \"arrow\") {\n if (start?.element) {\n addBoundElementById(scene, start.element.id, { id: element.id, type: \"arrow\" });\n }\n if (end?.element) {\n addBoundElementById(scene, end.element.id, { id: element.id, type: \"arrow\" });\n }\n }\n\n return element;\n}\n\nfunction resolveEndpoint(\n scene: Scene,\n endpoint: NonNullable<CreateObjectSpec[\"start\"]>,\n): { point: Point; element?: ExcalidrawElement } {\n if (isElementEndpoint(endpoint)) {\n const element = findElement(scene, endpoint.elementId);\n if (!element) {\n throw new Error(`Object not found: ${endpoint.elementId}`);\n }\n\n return {\n point: centerPoint(element),\n element,\n };\n }\n\n return { point: endpoint };\n}\n\nfunction upsertContainerLabel(\n scene: Scene,\n container: ExcalidrawElement,\n text: string,\n style?: CreateObjectSpec[\"style\"],\n): void {\n const existing = scene.elements.find(\n (element) => element.type === \"text\" && element.containerId === container.id,\n );\n if (existing) {\n existing.text = text;\n existing.originalText = text;\n if (style) {\n applyStyle(existing, style);\n }\n positionBoundLabel(existing, container);\n touchElement(existing);\n return;\n }\n\n scene.elements.push(createBoundLabel(container, text, style));\n}\n\nfunction createBoundLabel(\n container: ExcalidrawElement,\n text: string,\n style?: CreateObjectSpec[\"style\"],\n): ExcalidrawElement {\n const labelStyle: CanvasStyle = { ...style, textAlign: style?.textAlign ?? \"center\" };\n const position = labelPosition(container, text, labelStyle);\n const label = buildElement(\n {\n type: \"text\",\n x: position.x,\n y: position.y,\n width: position.width,\n height: position.height,\n text,\n style: labelStyle,\n },\n {\n containerId: container.id,\n },\n );\n label.autoResize = false;\n addBoundElement(container, { id: label.id, type: \"text\" });\n return label;\n}\n\nfunction labelPosition(\n container: ExcalidrawElement,\n text: string,\n style: CanvasStyle,\n): { x: number; y: number; width: number; height: number } {\n const measured = measureTextBounds(text, style);\n if (isLinearElement(container)) {\n const midpoint = linearMidpoint(container);\n return {\n x: midpoint.x - measured.width / 2,\n y: midpoint.y - measured.height / 2,\n width: measured.width,\n height: measured.height,\n };\n }\n\n return {\n x: container.x,\n y: container.y + container.height / 2 - measured.height / 2,\n width: Math.max(40, container.width),\n height: measured.height,\n };\n}\n\nfunction isLinearElement(element: ExcalidrawElement): boolean {\n return element.type === \"line\" || element.type === \"arrow\";\n}\n\nfunction canCreateBoundLabel(type: CanvasObjectType): boolean {\n return type !== \"text\" && type !== \"frame\" && type !== \"line\";\n}\n\nfunction linearMidpoint(element: ExcalidrawElement): Point {\n const points = element.points ?? [\n [0, 0],\n [element.width, element.height],\n ];\n const first = points[0] ?? [0, 0];\n const last = points[points.length - 1] ?? first;\n return {\n x: element.x + (first[0] + last[0]) / 2,\n y: element.y + (first[1] + last[1]) / 2,\n };\n}\n\nfunction addBoundElementById(\n scene: Scene,\n elementId: string,\n bound: { id: string; type: \"arrow\" | \"text\" },\n): void {\n const element = findElement(scene, elementId);\n if (element) {\n addBoundElement(element, bound);\n }\n}\n\nexport function findElement(scene: Scene, id: string): ExcalidrawElement | undefined {\n return scene.elements.find((element) => element.id === id && !element.isDeleted);\n}\n\nexport function setFrameOnChildren(scene: Scene, childIds: string[], frameId: string): string[] {\n const updated: string[] = [];\n for (const childId of childIds) {\n const child = findElement(scene, childId);\n if (child) {\n child.frameId = frameId;\n touchElement(child);\n updated.push(child.id);\n }\n }\n return updated;\n}\n\nexport function groupElements(scene: Scene, ids: string[]): { groupId: string; ids: string[] } {\n const elements = resolveElements(scene, ids);\n if (elements.length < 2) {\n throw new Error(\"At least two existing objects are required to create a group\");\n }\n\n const groupId = randomUUID();\n for (const element of elements) {\n if (!element.groupIds.includes(groupId)) {\n element.groupIds = [...element.groupIds, groupId];\n touchElement(element);\n }\n }\n return { groupId, ids: elements.map((element) => element.id) };\n}\n\nexport function ungroupElements(\n scene: Scene,\n ids: string[],\n groupId?: string,\n): { ids: string[]; groupId?: string } {\n const elements = resolveElements(scene, ids);\n for (const element of elements) {\n const nextGroupIds = groupId\n ? element.groupIds.filter((candidate) => candidate !== groupId)\n : [];\n if (nextGroupIds.length !== element.groupIds.length) {\n element.groupIds = nextGroupIds;\n touchElement(element);\n }\n }\n return { ids: elements.map((element) => element.id), groupId };\n}\n\nexport function removeFromFrame(scene: Scene, ids: string[]): { ids: string[] } {\n const elements = resolveElements(scene, ids);\n for (const element of elements) {\n if (element.frameId !== null) {\n element.frameId = null;\n touchElement(element);\n }\n }\n return { ids: elements.map((element) => element.id) };\n}\n\nfunction applyStyle(\n element: ExcalidrawElement,\n style: NonNullable<CreateObjectSpec[\"style\"]>,\n): void {\n if (style.strokeColor !== undefined) {\n element.strokeColor = style.strokeColor;\n }\n if (style.backgroundColor !== undefined) {\n element.backgroundColor = style.backgroundColor;\n }\n if (style.fillStyle !== undefined) {\n element.fillStyle = style.fillStyle;\n }\n if (style.strokeWidth !== undefined) {\n element.strokeWidth = style.strokeWidth;\n }\n if (style.strokeStyle !== undefined) {\n element.strokeStyle = style.strokeStyle;\n }\n if (style.roughness !== undefined) {\n element.roughness = style.roughness;\n }\n if (style.opacity !== undefined) {\n element.opacity = style.opacity;\n }\n if (style.fontSize !== undefined) {\n if (element.type !== \"text\") {\n return;\n }\n element.fontSize = style.fontSize;\n }\n if (style.textAlign !== undefined) {\n if (element.type !== \"text\") {\n return;\n }\n element.textAlign = style.textAlign;\n }\n}\n\nfunction validateCreateSpec(spec: CreateObjectSpec): void {\n validateStyle(spec.style);\n validateText(spec.type, spec.text);\n validateDimensions(spec.type, spec.width, spec.height);\n if ((spec.type === \"line\" || spec.type === \"arrow\") && spec.points) {\n validateLinearPoints(spec.points);\n }\n}\n\nfunction validateUpdatePatch(element: ExcalidrawElement, patch: UpdateObjectPatch): void {\n validateStyle(patch.style);\n validateText(element.type as CanvasObjectType, patch.text);\n validateDimensions(element.type as CanvasObjectType, patch.width, patch.height);\n if (patch.points) {\n validateLinearPoints(patch.points);\n }\n}\n\nfunction validateStyle(style?: CanvasStyle): void {\n for (const [field, value] of [\n [\"strokeColor\", style?.strokeColor],\n [\"backgroundColor\", style?.backgroundColor],\n ] as const) {\n if (value !== undefined && !isCanvasColor(value)) {\n throw new Error(`Invalid ${field}: ${value}`);\n }\n }\n}\n\nfunction validateText(type: CanvasObjectType, text?: string): void {\n if (text !== undefined && text.trim().length === 0 && type !== \"frame\") {\n throw new Error(\"Text must not be empty\");\n }\n}\n\nfunction validateDimensions(type: CanvasObjectType, width?: number, height?: number): void {\n if (type === \"line\" || type === \"arrow\" || type === \"text\") {\n if (width !== undefined && height !== undefined && width === 0 && height === 0) {\n throw new Error(\"Linear geometry must not be zero length\");\n }\n return;\n }\n\n if (width !== undefined && width <= 0) {\n throw new Error(\"Width must be greater than zero\");\n }\n if (height !== undefined && height <= 0) {\n throw new Error(\"Height must be greater than zero\");\n }\n}\n\nfunction validateLinearPoints(points: [number, number][]): void {\n if (points.length < 2) {\n throw new Error(\"Line and arrow points must contain at least two points\");\n }\n const [firstX, firstY] = points[0] ?? [0, 0];\n if (points.every(([x, y]) => x === firstX && y === firstY)) {\n throw new Error(\"Line and arrow points must not be zero length\");\n }\n}\n\nfunction resizeTextElement(element: ExcalidrawElement): void {\n const bounds = measureTextBounds(element.text ?? \"\", styleFromElement(element));\n element.width = bounds.width;\n element.height = bounds.height;\n element.fontSize = bounds.fontSize;\n element.lineHeight = bounds.lineHeight;\n}\n\nfunction syncBoundElements(scene: Scene, element: ExcalidrawElement): void {\n relayoutBoundLabels(scene, element);\n rerouteBoundArrows(scene, element);\n}\n\nfunction relayoutBoundLabels(scene: Scene, container: ExcalidrawElement): void {\n for (const label of scene.elements.filter(\n (candidate) => candidate.type === \"text\" && candidate.containerId === container.id,\n )) {\n positionBoundLabel(label, container);\n touchElement(label);\n }\n}\n\nfunction applyTextStyleToBoundLabels(\n scene: Scene,\n container: ExcalidrawElement,\n style: CanvasStyle,\n): void {\n if (style.fontSize === undefined && style.textAlign === undefined) {\n return;\n }\n\n for (const label of scene.elements.filter(\n (candidate) => candidate.type === \"text\" && candidate.containerId === container.id,\n )) {\n applyStyle(label, {\n fontSize: style.fontSize,\n textAlign: style.textAlign,\n });\n resizeTextElement(label);\n positionBoundLabel(label, container);\n touchElement(label);\n }\n}\n\nfunction positionBoundLabel(label: ExcalidrawElement, container: ExcalidrawElement): void {\n const position = labelPosition(container, label.text ?? \"\", styleFromElement(label));\n label.x = position.x;\n label.y = position.y;\n label.width = position.width;\n label.height = position.height;\n label.autoResize = false;\n}\n\nfunction rerouteBoundArrows(scene: Scene, changedElement: ExcalidrawElement): void {\n const arrowIds = new Set<string>(\n (changedElement.boundElements ?? [])\n .filter((bound) => bound.type === \"arrow\")\n .map((bound) => bound.id),\n );\n\n for (const candidate of scene.elements) {\n if (\n isLinearElement(candidate) &&\n (candidate.startBinding?.elementId === changedElement.id ||\n candidate.endBinding?.elementId === changedElement.id)\n ) {\n arrowIds.add(candidate.id);\n }\n }\n\n for (const arrowId of arrowIds) {\n const arrow = findElement(scene, arrowId);\n if (!arrow || !isLinearElement(arrow)) {\n continue;\n }\n\n rerouteArrow(scene, arrow);\n relayoutBoundLabels(scene, arrow);\n }\n}\n\nfunction rerouteArrow(scene: Scene, arrow: ExcalidrawElement): void {\n const startTarget = arrow.startBinding\n ? findElement(scene, arrow.startBinding.elementId)\n : undefined;\n const endTarget = arrow.endBinding ? findElement(scene, arrow.endBinding.elementId) : undefined;\n if (!startTarget && !endTarget) {\n return;\n }\n\n const currentStart = absoluteStartPoint(arrow);\n const currentEnd = absoluteEndPoint(arrow);\n const startReference = endTarget ? centerPoint(endTarget) : currentEnd;\n const endReference = startTarget ? centerPoint(startTarget) : currentStart;\n const startPoint = startTarget\n ? edgePoint(startTarget, startReference.x, startReference.y)\n : currentStart;\n const endPoint = endTarget ? edgePoint(endTarget, endReference.x, endReference.y) : currentEnd;\n\n arrow.x = startPoint.x;\n arrow.y = startPoint.y;\n arrow.points = [\n [0, 0],\n [endPoint.x - startPoint.x, endPoint.y - startPoint.y],\n ];\n arrow.width = linearWidth(arrow.points);\n arrow.height = linearHeight(arrow.points);\n touchElement(arrow);\n}\n\nfunction absoluteStartPoint(element: ExcalidrawElement): Point {\n const first = element.points?.[0] ?? [0, 0];\n return { x: element.x + first[0], y: element.y + first[1] };\n}\n\nfunction absoluteEndPoint(element: ExcalidrawElement): Point {\n const points = element.points ?? [[0, 0]];\n const last = points[points.length - 1] ?? [0, 0];\n return { x: element.x + last[0], y: element.y + last[1] };\n}\n\nfunction styleFromElement(element: ExcalidrawElement): CanvasStyle {\n return {\n strokeColor: element.strokeColor,\n backgroundColor: element.backgroundColor,\n fillStyle: element.fillStyle as CanvasStyle[\"fillStyle\"],\n strokeWidth: element.strokeWidth as CanvasStyle[\"strokeWidth\"],\n strokeStyle: element.strokeStyle,\n roughness: element.roughness as CanvasStyle[\"roughness\"],\n opacity: element.opacity,\n fontSize: element.fontSize,\n textAlign: element.textAlign,\n };\n}\n\nfunction resolveElements(scene: Scene, ids: string[]): ExcalidrawElement[] {\n const missingIds = ids.filter((id) => !findElement(scene, id));\n if (missingIds.length > 0) {\n throw new Error(`Object not found: ${missingIds.join(\", \")}`);\n }\n return ids\n .map((id) => findElement(scene, id))\n .filter((element): element is ExcalidrawElement => Boolean(element));\n}\n\nfunction linearWidth(points: [number, number][]): number {\n const xs = points.map(([x]) => x);\n return Math.max(...xs) - Math.min(...xs);\n}\n\nfunction linearHeight(points: [number, number][]): number {\n const ys = points.map(([, y]) => y);\n return Math.max(...ys) - Math.min(...ys);\n}\n","export type CanvasObjectType =\n | \"rectangle\"\n | \"ellipse\"\n | \"diamond\"\n | \"line\"\n | \"arrow\"\n | \"text\"\n | \"frame\";\n\nexport type FillStyle = \"hachure\" | \"cross-hatch\" | \"solid\";\nexport type StrokeStyle = \"solid\" | \"dashed\" | \"dotted\";\nexport type StrokeWidth = 1 | 2 | 4;\nexport type Roughness = 0 | 1 | 2;\nexport type TextAlign = \"left\" | \"center\" | \"right\";\n\nexport interface CanvasStyle {\n strokeColor?: string;\n backgroundColor?: string;\n fillStyle?: FillStyle;\n strokeWidth?: StrokeWidth;\n strokeStyle?: StrokeStyle;\n roughness?: Roughness;\n opacity?: number;\n fontSize?: number;\n textAlign?: TextAlign;\n}\n\nexport interface ElementEndpoint {\n elementId: string;\n}\n\nexport interface PointEndpoint {\n x: number;\n y: number;\n}\n\nexport type ArrowEndpoint = ElementEndpoint | PointEndpoint;\n\nexport interface CreateObjectSpec {\n type: CanvasObjectType;\n x: number;\n y: number;\n width?: number;\n height?: number;\n text?: string;\n points?: [number, number][];\n style?: CanvasStyle;\n start?: ArrowEndpoint;\n end?: ArrowEndpoint;\n containerId?: string;\n groupIds?: string[];\n}\n\nexport type UpdateObjectPatch = Partial<Omit<CreateObjectSpec, \"type\">>;\n\nexport interface CanvasObjectSummary {\n id: string;\n type: CanvasObjectType;\n x: number;\n y: number;\n width: number;\n height: number;\n text?: string;\n}\n\nexport interface CanvasObject extends CanvasObjectSummary {\n points?: [number, number][];\n style: CanvasStyle;\n containerId?: string;\n groupIds: string[];\n frameId?: string | null;\n raw: ExcalidrawElement;\n}\n\nexport interface BoundElement {\n id: string;\n type: \"arrow\" | \"text\";\n}\n\nexport interface ElementBinding {\n elementId: string;\n focus: number;\n gap: number;\n}\n\nexport interface ExcalidrawElement {\n id: string;\n index: string;\n type: string;\n x: number;\n y: number;\n width: number;\n height: number;\n angle: number;\n strokeColor: string;\n backgroundColor: string;\n fillStyle: string;\n strokeWidth: number;\n strokeStyle: StrokeStyle;\n roughness: number;\n opacity: number;\n groupIds: string[];\n frameId: string | null;\n roundness: { type: number; value?: number } | null;\n seed: number;\n version: number;\n versionNonce: number;\n isDeleted: boolean;\n boundElements: BoundElement[] | null;\n updated: number;\n link: string | null;\n locked: boolean;\n text?: string;\n originalText?: string;\n fontSize?: number;\n fontFamily?: number;\n textAlign?: TextAlign;\n verticalAlign?: \"top\" | \"middle\" | \"bottom\";\n containerId?: string | null;\n lineHeight?: number;\n autoResize?: boolean;\n points?: [number, number][];\n lastCommittedPoint?: [number, number] | null;\n startBinding?: ElementBinding | null;\n endBinding?: ElementBinding | null;\n startArrowhead?: string | null;\n endArrowhead?: string | null;\n name?: string | null;\n customData?: Record<string, unknown>;\n}\n\nexport interface AppState {\n viewBackgroundColor: string;\n [key: string]: unknown;\n}\n\nexport type BinaryFiles = Record<string, unknown>;\n\nexport interface Scene {\n elements: ExcalidrawElement[];\n appState: AppState;\n files: BinaryFiles;\n version: number;\n}\n\nexport interface CanvasMetadata {\n canvas: string;\n version: number;\n objectCount: number;\n viewBackgroundColor: string;\n}\n\nexport interface SerializedScene {\n type: \"excalidraw\";\n version: 2;\n source: \"agentic-canvas\";\n elements: ExcalidrawElement[];\n appState: AppState;\n files: BinaryFiles;\n}\n\nexport function isElementEndpoint(endpoint: ArrowEndpoint): endpoint is ElementEndpoint {\n return \"elementId\" in endpoint;\n}\n\nexport function cloneScene(scene: Scene): Scene {\n return {\n elements: scene.elements.map(cloneElement),\n appState: { ...scene.appState },\n files: { ...scene.files },\n version: scene.version,\n };\n}\n\nexport function cloneElement(element: ExcalidrawElement): ExcalidrawElement {\n return {\n ...element,\n groupIds: [...element.groupIds],\n roundness: element.roundness ? { ...element.roundness } : null,\n boundElements: element.boundElements\n ? element.boundElements.map((bound) => ({ ...bound }))\n : null,\n points: element.points ? element.points.map(([x, y]) => [x, y]) : undefined,\n startBinding: element.startBinding ? { ...element.startBinding } : element.startBinding,\n endBinding: element.endBinding ? { ...element.endBinding } : element.endBinding,\n lastCommittedPoint: element.lastCommittedPoint\n ? [element.lastCommittedPoint[0], element.lastCommittedPoint[1]]\n : element.lastCommittedPoint,\n customData: element.customData ? { ...element.customData } : element.customData,\n };\n}\n","const NAMED_COLORS = new Set([\n \"black\",\n \"white\",\n \"red\",\n \"green\",\n \"blue\",\n \"yellow\",\n \"orange\",\n \"purple\",\n \"pink\",\n \"brown\",\n \"gray\",\n \"grey\",\n \"cyan\",\n \"magenta\",\n \"lime\",\n \"navy\",\n \"teal\",\n \"transparent\",\n]);\n\nexport function isCanvasColor(value: string): boolean {\n const color = value.trim().toLowerCase();\n if (NAMED_COLORS.has(color)) {\n return true;\n }\n if (/^#(?:[0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(color)) {\n return true;\n }\n if (\n /^rgba?\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}(?:\\s*,\\s*(?:0|1|0?\\.\\d+))?\\s*\\)$/i.test(color)\n ) {\n return true;\n }\n if (\n /^hsla?\\(\\s*-?\\d+(?:deg)?\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%(?:\\s*,\\s*(?:0|1|0?\\.\\d+))?\\s*\\)$/i.test(\n color,\n )\n ) {\n return true;\n }\n return false;\n}\n","import type {\n CanvasObject,\n CanvasObjectSummary,\n CanvasObjectType,\n ExcalidrawElement,\n} from \"../../core/scene.js\";\n\nconst SUPPORTED_TYPES = new Set<CanvasObjectType>([\n \"rectangle\",\n \"ellipse\",\n \"diamond\",\n \"line\",\n \"arrow\",\n \"text\",\n \"frame\",\n]);\n\nexport function isSupportedElement(element: ExcalidrawElement): element is ExcalidrawElement & {\n type: CanvasObjectType;\n} {\n return SUPPORTED_TYPES.has(element.type as CanvasObjectType) && !element.isDeleted;\n}\n\nexport function toCanvasObject(element: ExcalidrawElement): CanvasObject | undefined {\n if (!isSupportedElement(element)) {\n return undefined;\n }\n\n return {\n id: element.id,\n type: element.type,\n x: element.x,\n y: element.y,\n width: element.width,\n height: element.height,\n text: element.text,\n points: element.points,\n style: {\n strokeColor: element.strokeColor,\n backgroundColor: element.backgroundColor,\n fillStyle: normalizeFillStyle(element.fillStyle),\n strokeWidth: normalizeStrokeWidth(element.strokeWidth),\n strokeStyle: element.strokeStyle,\n roughness: normalizeRoughness(element.roughness),\n opacity: element.opacity,\n fontSize: element.fontSize,\n textAlign: element.textAlign,\n },\n containerId: element.containerId ?? undefined,\n groupIds: element.groupIds,\n frameId: element.frameId,\n raw: element,\n };\n}\n\nexport function toCanvasObjectSummary(element: ExcalidrawElement): CanvasObjectSummary | undefined {\n const object = toCanvasObject(element);\n if (!object) {\n return undefined;\n }\n\n return {\n id: object.id,\n type: object.type,\n x: object.x,\n y: object.y,\n width: object.width,\n height: object.height,\n text: object.text,\n };\n}\n\nfunction normalizeStrokeWidth(width: number): 1 | 2 | 4 {\n if (width === 1 || width === 4) {\n return width;\n }\n\n return 2;\n}\n\nfunction normalizeFillStyle(fillStyle: string): \"hachure\" | \"cross-hatch\" | \"solid\" {\n if (fillStyle === \"hachure\" || fillStyle === \"cross-hatch\") {\n return fillStyle;\n }\n\n return \"solid\";\n}\n\nfunction normalizeRoughness(roughness: number): 0 | 1 | 2 {\n if (roughness === 0 || roughness === 2) {\n return roughness;\n }\n\n return 1;\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n BoundElement,\n CanvasObjectType,\n CreateObjectSpec,\n ElementBinding,\n ExcalidrawElement,\n} from \"../../core/scene.js\";\nimport { measureTextBounds } from \"./textMetrics.js\";\n\nconst DEFAULT_WIDTH = 160;\nconst DEFAULT_HEIGHT = 80;\nconst ORDER_KEY_DIGITS = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nlet elementIndexCounter = 0;\n\nexport interface BuildElementOptions {\n id?: string;\n text?: string;\n containerId?: string | null;\n startBinding?: ElementBinding | null;\n endBinding?: ElementBinding | null;\n boundElements?: BoundElement[] | null;\n frameId?: string | null;\n groupIds?: string[];\n name?: string | null;\n}\n\nexport function buildElement(\n spec: CreateObjectSpec,\n options: BuildElementOptions = {},\n): ExcalidrawElement {\n const type = spec.type;\n const width = spec.width ?? defaultWidth(type);\n const height = spec.height ?? defaultHeight(type);\n const points = spec.points ?? defaultPoints(type, width, height);\n const base: ExcalidrawElement = {\n id: options.id ?? randomUUID(),\n index: nextElementIndex(),\n type,\n x: spec.x,\n y: spec.y,\n width,\n height,\n angle: 0,\n strokeColor: spec.style?.strokeColor ?? \"#1e1e1e\",\n backgroundColor: spec.style?.backgroundColor ?? \"transparent\",\n fillStyle: spec.style?.fillStyle ?? \"solid\",\n strokeWidth: spec.style?.strokeWidth ?? 2,\n strokeStyle: spec.style?.strokeStyle ?? \"solid\",\n roughness: spec.style?.roughness ?? 1,\n opacity: spec.style?.opacity ?? 100,\n groupIds: options.groupIds ?? spec.groupIds ?? [],\n frameId: options.frameId ?? null,\n roundness: roundnessFor(type),\n seed: randomInt31(),\n version: 1,\n versionNonce: randomInt31(),\n isDeleted: false,\n boundElements: options.boundElements ?? null,\n updated: Date.now(),\n link: null,\n locked: false,\n };\n\n if (type === \"text\") {\n const text = options.text ?? spec.text ?? \"\";\n const bounds = measureTextBounds(text, spec.style);\n return {\n ...base,\n width: spec.width ?? bounds.width,\n height: spec.height ?? bounds.height,\n text,\n originalText: text,\n fontSize: bounds.fontSize,\n fontFamily: 1,\n textAlign: spec.style?.textAlign ?? \"center\",\n verticalAlign: \"middle\",\n containerId: options.containerId ?? spec.containerId ?? null,\n lineHeight: bounds.lineHeight,\n autoResize: true,\n };\n }\n\n if (type === \"line\" || type === \"arrow\") {\n return {\n ...base,\n points,\n width: linearWidth(points),\n height: linearHeight(points),\n lastCommittedPoint: null,\n startBinding: options.startBinding ?? null,\n endBinding: options.endBinding ?? null,\n startArrowhead: null,\n endArrowhead: type === \"arrow\" ? \"arrow\" : null,\n };\n }\n\n if (type === \"frame\") {\n return {\n ...base,\n backgroundColor: spec.style?.backgroundColor ?? \"transparent\",\n name: options.name ?? spec.text ?? null,\n };\n }\n\n return base;\n}\n\nexport function makeBinding(elementId: string): ElementBinding {\n return { elementId, focus: 0, gap: 0 };\n}\n\nexport function addBoundElement(target: ExcalidrawElement, bound: BoundElement): void {\n const current = target.boundElements ?? [];\n if (!current.some((entry) => entry.id === bound.id)) {\n target.boundElements = [...current, bound];\n touchElement(target);\n }\n}\n\nexport function touchElement(element: ExcalidrawElement): void {\n element.version += 1;\n element.versionNonce = randomInt31();\n element.updated = Date.now();\n}\n\nfunction defaultWidth(type: CanvasObjectType): number {\n return type === \"text\" ? 80 : DEFAULT_WIDTH;\n}\n\nfunction defaultHeight(type: CanvasObjectType): number {\n return type === \"text\" ? 24 : DEFAULT_HEIGHT;\n}\n\nfunction defaultPoints(type: CanvasObjectType, width: number, height: number): [number, number][] {\n if (type === \"line\" || type === \"arrow\") {\n return [\n [0, 0],\n [width, height],\n ];\n }\n\n return [];\n}\n\nfunction linearWidth(points: [number, number][]): number {\n const xs = points.map(([x]) => x);\n return Math.max(...xs) - Math.min(...xs);\n}\n\nfunction linearHeight(points: [number, number][]): number {\n const ys = points.map(([, y]) => y);\n return Math.max(...ys) - Math.min(...ys);\n}\n\nfunction roundnessFor(type: CanvasObjectType): ExcalidrawElement[\"roundness\"] {\n if (type === \"rectangle\" || type === \"diamond\") {\n return { type: 3 };\n }\n\n return null;\n}\n\nfunction randomInt31(): number {\n return Math.floor(Math.random() * 2_147_483_647);\n}\n\nfunction nextElementIndex(): string {\n return orderKeyForInteger(elementIndexCounter++);\n}\n\nfunction orderKeyForInteger(value: number): string {\n let remaining = value;\n for (let width = 1; width <= 26; width += 1) {\n const capacity = ORDER_KEY_DIGITS.length ** width;\n if (remaining < capacity) {\n return `${String.fromCharCode(\"a\".charCodeAt(0) + width - 1)}${encodeOrderDigits(\n remaining,\n width,\n )}`;\n }\n\n remaining -= capacity;\n }\n\n throw new Error(\"Element order key range exhausted\");\n}\n\nfunction encodeOrderDigits(value: number, width: number): string {\n let encoded = \"\";\n let remaining = value;\n for (let index = 0; index < width; index += 1) {\n encoded = ORDER_KEY_DIGITS[remaining % ORDER_KEY_DIGITS.length] + encoded;\n remaining = Math.floor(remaining / ORDER_KEY_DIGITS.length);\n }\n return encoded;\n}\n","import type { CanvasStyle } from \"../../core/scene.js\";\n\nexport const DEFAULT_FONT_SIZE = 20;\nexport const EXCALIDRAW_LINE_HEIGHT = 1.25;\n\nexport interface TextBounds {\n width: number;\n height: number;\n fontSize: number;\n lineHeight: number;\n}\n\nexport function measureTextBounds(text: string, style?: CanvasStyle): TextBounds {\n const fontSize = style?.fontSize ?? DEFAULT_FONT_SIZE;\n const lineHeight = fontSize * EXCALIDRAW_LINE_HEIGHT;\n const lines = splitLines(text);\n const widestLine = Math.max(...lines.map((line) => measureLineWidth(line, fontSize)), 0);\n\n return {\n width: Math.max(40, Math.ceil(widestLine)),\n height: Math.max(lineHeight, Math.ceil(lines.length * lineHeight)),\n fontSize,\n lineHeight: EXCALIDRAW_LINE_HEIGHT,\n };\n}\n\nfunction splitLines(text: string): string[] {\n return text.split(/\\r\\n|\\r|\\n/);\n}\n\nfunction measureLineWidth(line: string, fontSize: number): number {\n let width = 0;\n for (const character of line) {\n width += fontSize * characterWeight(character);\n }\n return width;\n}\n\nfunction characterWeight(character: string): number {\n if (character === \" \" || character === \"\\t\") {\n return 0.35;\n }\n if (/^[ilI.,:;|!']$/.test(character)) {\n return 0.32;\n }\n if (/^[mwMW@#%&]$/.test(character)) {\n return 0.9;\n }\n if (/^[A-Z0-9]$/.test(character)) {\n return 0.68;\n }\n if ((character.codePointAt(0) ?? 0) > 0x2e80) {\n return 1;\n }\n return 0.58;\n}\n","import type { Scene, SerializedScene } from \"../../core/scene.js\";\n\nexport function serializeScene(scene: Scene): SerializedScene {\n return {\n type: \"excalidraw\",\n version: 2,\n source: \"agentic-canvas\",\n elements: scene.elements,\n appState: {\n viewBackgroundColor: scene.appState.viewBackgroundColor,\n },\n files: scene.files,\n };\n}\n\nexport function deserializeScene(raw: string): Scene {\n const parsed = JSON.parse(raw) as Partial<SerializedScene>;\n if (parsed.type !== \"excalidraw\" || !Array.isArray(parsed.elements)) {\n throw new Error(\"Invalid .excalidraw file\");\n }\n\n return {\n elements: parsed.elements,\n appState: {\n viewBackgroundColor: parsed.appState?.viewBackgroundColor ?? \"#ffffff\",\n },\n files: parsed.files ?? {},\n version: 0,\n };\n}\n","import type { ExcalidrawElement } from \"../../core/scene.js\";\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport function centerPoint(\n element: Pick<ExcalidrawElement, \"x\" | \"y\" | \"width\" | \"height\">,\n): Point {\n return {\n x: element.x + element.width / 2,\n y: element.y + element.height / 2,\n };\n}\n\nexport function edgePoint(\n element: Pick<ExcalidrawElement, \"x\" | \"y\" | \"width\" | \"height\" | \"type\">,\n towardX: number,\n towardY: number,\n): Point {\n const center = centerPoint(element);\n const dx = towardX - center.x;\n const dy = towardY - center.y;\n if (dx === 0 && dy === 0) {\n return center;\n }\n\n const halfWidth = element.width / 2;\n const halfHeight = element.height / 2;\n if (halfWidth <= 0 || halfHeight <= 0) {\n return center;\n }\n\n if (element.type === \"ellipse\") {\n const scale =\n 1 / Math.sqrt((dx * dx) / (halfWidth * halfWidth) + (dy * dy) / (halfHeight * halfHeight));\n return {\n x: center.x + dx * scale,\n y: center.y + dy * scale,\n };\n }\n\n if (element.type === \"diamond\") {\n const scale = 1 / (Math.abs(dx) / halfWidth + Math.abs(dy) / halfHeight);\n return {\n x: center.x + dx * scale,\n y: center.y + dy * scale,\n };\n }\n\n const xScale = dx === 0 ? Number.POSITIVE_INFINITY : halfWidth / Math.abs(dx);\n const yScale = dy === 0 ? Number.POSITIVE_INFINITY : halfHeight / Math.abs(dy);\n const scale = Math.min(xScale, yScale);\n return {\n x: center.x + dx * scale,\n y: center.y + dy * scale,\n };\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { PluginToolContext } from \"../../core/plugin.js\";\nimport type { CreateObjectSpec } from \"../../core/scene.js\";\nimport { endpointSchema, pointsSchema, styleSchema } from \"../../mcp/schemas.js\";\nimport { planFlowchart } from \"./flowchart.js\";\nimport { groupElements, removeFromFrame, setFrameOnChildren, ungroupElements } from \"./index.js\";\n\nconst shapeInput = {\n x: z.number(),\n y: z.number(),\n width: z.number().positive(),\n height: z.number().positive(),\n text: z.string().min(1).optional(),\n style: styleSchema.optional(),\n};\n\nexport function registerExcalidrawTools(server: McpServer, context: PluginToolContext): void {\n registerShapeTool(server, context, \"draw_rectangle\", \"rectangle\");\n registerShapeTool(server, context, \"draw_ellipse\", \"ellipse\");\n registerShapeTool(server, context, \"draw_diamond\", \"diamond\");\n\n server.registerTool(\n \"draw_line\",\n {\n description: \"Draw an Excalidraw polyline.\",\n inputSchema: {\n x: z.number(),\n y: z.number(),\n points: pointsSchema.min(2),\n style: styleSchema.optional(),\n },\n },\n async ({ x, y, points, style }) => {\n const object = context.controller.createObject({\n type: \"line\",\n x,\n y,\n points: points as CreateObjectSpec[\"points\"],\n style,\n });\n return textResult({ id: object.id });\n },\n );\n\n server.registerTool(\n \"draw_arrow\",\n {\n description: \"Draw an Excalidraw arrow, optionally bound to existing elements.\",\n inputSchema: {\n start: endpointSchema,\n end: endpointSchema,\n text: z.string().optional(),\n style: styleSchema.optional(),\n },\n },\n async ({ start, end, text, style }) => {\n try {\n const id = context.controller.transaction(\n () =>\n context.controller.createObject({\n type: \"arrow\",\n x: \"x\" in start ? start.x : 0,\n y: \"y\" in start ? start.y : 0,\n start,\n end,\n text,\n style,\n }).id,\n );\n return textResult({ id });\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n\n server.registerTool(\n \"add_text\",\n {\n description: \"Add standalone text or a label bound to a container element.\",\n inputSchema: {\n x: z.number().optional(),\n y: z.number().optional(),\n text: z.string().min(1),\n containerId: z.string().optional(),\n style: styleSchema.optional(),\n },\n },\n async ({ x, y, text, containerId, style }) => {\n const container = containerId ? context.controller.getObject(containerId) : undefined;\n if (containerId && !container) {\n return errorResult(`Object not found: ${containerId}`);\n }\n\n const object = context.controller.createObject({\n type: \"text\",\n x: x ?? (container ? container.x + 12 : 0),\n y: y ?? (container ? container.y + container.height / 2 - 12 : 0),\n width: container ? Math.max(40, container.width - 24) : undefined,\n text,\n containerId,\n style,\n });\n return textResult({ id: object.id });\n },\n );\n\n server.registerTool(\n \"create_frame\",\n {\n description: \"Create a frame and optionally assign existing elements to it.\",\n inputSchema: {\n x: z.number(),\n y: z.number(),\n width: z.number().positive(),\n height: z.number().positive(),\n name: z.string().min(1).optional(),\n childIds: z.array(z.string()).optional(),\n },\n },\n async ({ x, y, width, height, name, childIds }) => {\n const result = context.controller.transaction(() => {\n const frame = context.controller.createObject({\n type: \"frame\",\n x,\n y,\n width,\n height,\n text: name,\n });\n const updated = context.controller.mutateScene((scene) =>\n setFrameOnChildren(scene, childIds ?? [], frame.id),\n );\n return { id: frame.id, childIds: updated };\n });\n return textResult(result);\n },\n );\n\n server.registerTool(\n \"group_objects\",\n {\n description: \"Group existing Excalidraw elements.\",\n inputSchema: {\n ids: z.array(z.string()).min(2),\n },\n },\n async ({ ids }) => {\n try {\n return textResult(context.controller.mutateScene((scene) => groupElements(scene, ids)));\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n\n server.registerTool(\n \"ungroup_objects\",\n {\n description: \"Remove one group, or all groups, from existing Excalidraw elements.\",\n inputSchema: {\n ids: z.array(z.string()).min(1),\n groupId: z.string().optional(),\n },\n },\n async ({ ids, groupId }) => {\n try {\n return textResult(\n context.controller.mutateScene((scene) => ungroupElements(scene, ids, groupId)),\n );\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n\n server.registerTool(\n \"remove_from_frame\",\n {\n description: \"Clear the frame assignment from existing Excalidraw elements.\",\n inputSchema: {\n ids: z.array(z.string()).min(1),\n },\n },\n async ({ ids }) => {\n try {\n return textResult(context.controller.mutateScene((scene) => removeFromFrame(scene, ids)));\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n\n server.registerTool(\n \"create_flowchart\",\n {\n description: \"Create a simple deterministic flowchart.\",\n inputSchema: {\n nodes: z\n .array(\n z.object({\n id: z.string(),\n label: z.string().min(1),\n shape: z.enum([\"rectangle\", \"ellipse\", \"diamond\"]).optional(),\n x: z.number().optional(),\n y: z.number().optional(),\n }),\n )\n .min(1),\n edges: z.array(\n z.object({ from: z.string(), to: z.string(), label: z.string().min(1).optional() }),\n ),\n direction: z.enum([\"TB\", \"LR\"]).optional(),\n spacingX: z.number().positive().optional(),\n spacingY: z.number().positive().optional(),\n },\n },\n async (input) => {\n try {\n const plan = planFlowchart(input);\n const result = context.controller.transaction(() => {\n const nodeIds: Record<string, string> = {};\n for (const node of plan.nodes) {\n const object = context.controller.createObject(node.spec);\n nodeIds[node.key] = object.id;\n }\n\n const arrowIds: string[] = [];\n for (const edge of plan.edges) {\n const from = nodeIds[edge.from];\n const to = nodeIds[edge.to];\n if (!from || !to) {\n throw new Error(`Flowchart edge references missing node: ${edge.from} -> ${edge.to}`);\n }\n const arrow = context.controller.createObject({\n type: \"arrow\",\n x: 0,\n y: 0,\n start: { elementId: from },\n end: { elementId: to },\n text: edge.label,\n });\n arrowIds.push(arrow.id);\n }\n\n return { nodeIds, arrowIds };\n });\n\n return textResult(result);\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n\nfunction registerShapeTool(\n server: McpServer,\n context: PluginToolContext,\n name: \"draw_rectangle\" | \"draw_ellipse\" | \"draw_diamond\",\n type: CreateObjectSpec[\"type\"],\n): void {\n server.registerTool(\n name,\n {\n description: `Draw an Excalidraw ${type}.`,\n inputSchema: shapeInput,\n },\n async ({ x, y, width, height, text, style }) => {\n const object = context.controller.createObject({ type, x, y, width, height, text, style });\n return textResult({ id: object.id });\n },\n );\n}\n\nfunction textResult(value: unknown) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(value) }],\n };\n}\n\nfunction errorResult(error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n isError: true,\n content: [{ type: \"text\" as const, text: message }],\n };\n}\n","import { z } from \"zod\";\nimport { isCanvasColor } from \"../shared/colors.js\";\n\nexport const canvasObjectTypeSchema = z.enum([\n \"rectangle\",\n \"ellipse\",\n \"diamond\",\n \"line\",\n \"arrow\",\n \"text\",\n \"frame\",\n]);\n\nexport const colorSchema = z.string().refine(isCanvasColor, {\n message: \"Invalid canvas color\",\n});\n\nexport const styleSchema = z.object({\n strokeColor: colorSchema.optional(),\n backgroundColor: colorSchema.optional(),\n fillStyle: z.enum([\"hachure\", \"cross-hatch\", \"solid\"]).optional(),\n strokeWidth: z.union([z.literal(1), z.literal(2), z.literal(4)]).optional(),\n strokeStyle: z.enum([\"solid\", \"dashed\", \"dotted\"]).optional(),\n roughness: z.union([z.literal(0), z.literal(1), z.literal(2)]).optional(),\n opacity: z.number().min(0).max(100).optional(),\n fontSize: z.number().positive().optional(),\n textAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n});\n\nexport const endpointSchema = z.union([\n z.object({ elementId: z.string() }),\n z.object({ x: z.number(), y: z.number() }),\n]);\n\nexport const pointSchema = z.array(z.number()).length(2);\nexport const pointsSchema = z.array(pointSchema).min(2);\n\nexport const createObjectShape = {\n type: canvasObjectTypeSchema,\n x: z.number(),\n y: z.number(),\n width: z.number().positive().optional(),\n height: z.number().positive().optional(),\n text: z.string().optional(),\n points: pointsSchema.optional(),\n style: styleSchema.optional(),\n start: endpointSchema.optional(),\n end: endpointSchema.optional(),\n containerId: z.string().optional(),\n groupIds: z.array(z.string()).optional(),\n};\n\nexport const updateObjectShape = {\n id: z.string(),\n x: z.number().optional(),\n y: z.number().optional(),\n width: z.number().positive().optional(),\n height: z.number().positive().optional(),\n text: z.string().optional(),\n points: pointsSchema.optional(),\n style: styleSchema.optional(),\n start: endpointSchema.optional(),\n end: endpointSchema.optional(),\n containerId: z.string().optional(),\n groupIds: z.array(z.string()).optional(),\n};\n","import type { CreateObjectSpec } from \"../../core/scene.js\";\n\nexport interface FlowchartNodeInput {\n id: string;\n label: string;\n shape?: \"rectangle\" | \"ellipse\" | \"diamond\";\n x?: number;\n y?: number;\n}\n\nexport interface FlowchartEdgeInput {\n from: string;\n to: string;\n label?: string;\n}\n\nexport interface FlowchartInput {\n nodes: FlowchartNodeInput[];\n edges: FlowchartEdgeInput[];\n direction?: \"TB\" | \"LR\";\n spacingX?: number;\n spacingY?: number;\n}\n\nexport interface FlowchartPlan {\n nodes: Array<{ key: string; spec: CreateObjectSpec }>;\n edges: Array<{ from: string; to: string; label?: string }>;\n}\n\nexport function planFlowchart(input: FlowchartInput): FlowchartPlan {\n validateFlowchart(input);\n const direction = input.direction ?? \"LR\";\n const spacingX = input.spacingX ?? 220;\n const spacingY = input.spacingY ?? 140;\n const levels = assignLevels(input);\n const levelGroups = groupLevels(input.nodes, levels);\n\n return {\n nodes: input.nodes.map((node, index) => {\n const level = levels.get(node.id) ?? index;\n const peers = levelGroups.get(level) ?? [node.id];\n const peerIndex = Math.max(0, peers.indexOf(node.id));\n const crossAxisOffset = peerOffset(\n peerIndex,\n peers.length,\n direction === \"LR\" ? spacingY : spacingX,\n );\n return {\n key: node.id,\n spec: {\n type: node.shape ?? \"rectangle\",\n x: node.x ?? (direction === \"LR\" ? level * spacingX : crossAxisOffset),\n y: node.y ?? (direction === \"TB\" ? level * spacingY : crossAxisOffset),\n width: 160,\n height: 60,\n text: node.label,\n },\n };\n }),\n edges: input.edges,\n };\n}\n\nfunction assignLevels(input: FlowchartInput): Map<string, number> {\n const nodeIds = new Set(input.nodes.map((node) => node.id));\n const backEdges = findBackEdges(input);\n const indegrees = new Map(input.nodes.map((node) => [node.id, 0]));\n for (const edge of input.edges) {\n if (nodeIds.has(edge.to) && !backEdges.has(edgeKey(edge))) {\n indegrees.set(edge.to, (indegrees.get(edge.to) ?? 0) + 1);\n }\n }\n\n const roots = input.nodes.filter((node) => (indegrees.get(node.id) ?? 0) === 0);\n const levels = new Map<string, number>();\n for (const root of roots.length > 0 ? roots : input.nodes.slice(0, 1)) {\n levels.set(root.id, 0);\n }\n\n for (let pass = 0; pass < input.nodes.length; pass += 1) {\n let changed = false;\n for (const edge of input.edges) {\n if (backEdges.has(edgeKey(edge))) {\n continue;\n }\n\n const fromLevel = levels.get(edge.from);\n if (fromLevel === undefined || !nodeIds.has(edge.to)) {\n continue;\n }\n\n const nextLevel = fromLevel + 1;\n if ((levels.get(edge.to) ?? -1) < nextLevel) {\n levels.set(edge.to, nextLevel);\n changed = true;\n }\n }\n\n if (!changed) {\n break;\n }\n }\n\n for (const [index, node] of input.nodes.entries()) {\n if (!levels.has(node.id)) {\n levels.set(node.id, index);\n }\n }\n\n return levels;\n}\n\nfunction groupLevels(\n nodes: FlowchartNodeInput[],\n levels: Map<string, number>,\n): Map<number, string[]> {\n const groups = new Map<number, string[]>();\n for (const node of nodes) {\n const level = levels.get(node.id) ?? 0;\n groups.set(level, [...(groups.get(level) ?? []), node.id]);\n }\n return groups;\n}\n\nfunction peerOffset(index: number, count: number, spacing: number): number {\n return (index - (count - 1) / 2) * spacing;\n}\n\nfunction validateFlowchart(input: FlowchartInput): void {\n const nodeIds = new Set<string>();\n for (const node of input.nodes) {\n if (nodeIds.has(node.id)) {\n throw new Error(`Duplicate flowchart node id: ${node.id}`);\n }\n nodeIds.add(node.id);\n }\n\n for (const edge of input.edges) {\n if (!nodeIds.has(edge.from) || !nodeIds.has(edge.to)) {\n throw new Error(`Flowchart edge references missing node: ${edge.from} -> ${edge.to}`);\n }\n }\n}\n\nfunction findBackEdges(input: FlowchartInput): Set<string> {\n const adjacency = new Map<string, FlowchartEdgeInput[]>();\n for (const edge of input.edges) {\n adjacency.set(edge.from, [...(adjacency.get(edge.from) ?? []), edge]);\n }\n\n const visited = new Set<string>();\n const visiting = new Set<string>();\n const backEdges = new Set<string>();\n\n const visit = (nodeId: string) => {\n if (visiting.has(nodeId)) {\n return;\n }\n if (visited.has(nodeId)) {\n return;\n }\n\n visiting.add(nodeId);\n for (const edge of adjacency.get(nodeId) ?? []) {\n if (visiting.has(edge.to)) {\n backEdges.add(edgeKey(edge));\n continue;\n }\n visit(edge.to);\n }\n visiting.delete(nodeId);\n visited.add(nodeId);\n };\n\n for (const node of input.nodes) {\n visit(node.id);\n }\n\n return backEdges;\n}\n\nfunction edgeKey(edge: Pick<FlowchartEdgeInput, \"from\" | \"to\">): string {\n return `${edge.from}\\u0000${edge.to}`;\n}\n","import path from \"node:path\";\nimport express from \"express\";\nimport type { BuildMcpServerOptions } from \"../mcp/buildServer.js\";\nimport { buildMcpServer } from \"../mcp/buildServer.js\";\nimport { mountMcpHttp } from \"./mcpHttp.js\";\n\nexport interface CreateAppOptions extends BuildMcpServerOptions {\n webDistDir: string;\n allowedHosts: string[];\n}\n\nexport function createApp(options: CreateAppOptions): express.Express {\n const app = express();\n\n app.use(express.json({ limit: \"10mb\" }));\n\n app.get(\"/healthz\", (_req, res) => {\n res.json({\n status: \"ok\",\n canvas: options.plugin.name,\n version: options.controller.getSnapshot().version,\n });\n });\n\n mountMcpHttp(app, () => buildMcpServer(options), options.allowedHosts);\n\n app.use(express.static(options.webDistDir));\n app.get(\"*\", (_req, res) => {\n res.sendFile(path.join(options.webDistDir, \"index.html\"), (error) => {\n if (error) {\n res.status(404).send(\"Agentic Canvas web build not found. Run npm run build first.\");\n }\n });\n });\n\n return app;\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { CanvasPlugin } from \"../core/plugin.js\";\nimport type { CanvasController } from \"../server/canvasController.js\";\nimport type { Workspace } from \"../server/workspace.js\";\nimport { MCP_SERVER_NAME, readPackageInfo } from \"../shared/packageInfo.js\";\nimport type { ExportResult, SelectionResult, SelectionSetResult } from \"./baselineTools.js\";\nimport { registerBaselineTools } from \"./baselineTools.js\";\n\nexport interface BuildMcpServerOptions {\n plugin: CanvasPlugin;\n controller: CanvasController;\n workspace: Workspace;\n clientsConnected(): number;\n requestExport(options: { exportPadding?: number }): Promise<ExportResult>;\n requestSelection(options?: { timeoutMs?: number }): Promise<SelectionResult>;\n requestSetSelection(\n selectedIds: string[],\n options?: { timeoutMs?: number },\n ): Promise<SelectionSetResult>;\n}\n\nexport function buildMcpServer(options: BuildMcpServerOptions): McpServer {\n const packageInfo = readPackageInfo();\n const server = new McpServer({\n name: MCP_SERVER_NAME,\n version: packageInfo.version,\n });\n\n registerBaselineTools(server, {\n controller: options.controller,\n workspace: options.workspace,\n clientsConnected: options.clientsConnected,\n requestExport: options.requestExport,\n requestSelection: options.requestSelection,\n requestSetSelection: options.requestSetSelection,\n });\n\n options.plugin.registerTools(server, {\n controller: options.controller,\n });\n\n return server;\n}\n","import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport const CLI_NAME = \"agentic-canvas\";\nexport const MCP_SERVER_NAME = \"agentic-canvas\";\nexport const PACKAGE_NAME = \"@trohde/agentic-canvas\";\n\nexport interface PackageInfo {\n name: string;\n version: string;\n}\n\nexport function readPackageInfo(): PackageInfo {\n const packageJsonPath = path.resolve(\n path.dirname(fileURLToPath(import.meta.url)),\n \"../../package.json\",\n );\n const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as Partial<PackageInfo>;\n\n return {\n name: typeof parsed.name === \"string\" ? parsed.name : PACKAGE_NAME,\n version: typeof parsed.version === \"string\" ? parsed.version : \"0.0.0\",\n };\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type {\n CanvasObject,\n CanvasObjectType,\n CreateObjectSpec,\n UpdateObjectPatch,\n} from \"../core/scene.js\";\nimport type { CanvasController } from \"../server/canvasController.js\";\nimport type { Workspace } from \"../server/workspace.js\";\nimport {\n canvasObjectTypeSchema,\n colorSchema,\n createObjectShape,\n updateObjectShape,\n} from \"./schemas.js\";\n\nexport interface ExportResult {\n mimeType: string;\n base64: string;\n}\n\nexport interface SelectionResult {\n selectedIds: string[];\n}\n\nexport interface SelectionSetResult {\n selectedIds: string[];\n}\n\nexport interface BaselineToolContext {\n controller: CanvasController;\n workspace: Workspace;\n clientsConnected(): number;\n requestExport(options: { exportPadding?: number }): Promise<ExportResult>;\n requestSelection(options?: { timeoutMs?: number }): Promise<SelectionResult>;\n requestSetSelection(\n selectedIds: string[],\n options?: { timeoutMs?: number },\n ): Promise<SelectionSetResult>;\n}\n\nexport function registerBaselineTools(server: McpServer, context: BaselineToolContext): void {\n server.registerTool(\n \"get_canvas_state\",\n {\n description: \"Get canvas metadata and current scene state summary.\",\n inputSchema: {},\n },\n async () => textResult(context.controller.getMetadata(context.clientsConnected())),\n );\n\n server.registerTool(\n \"list_objects\",\n {\n description: \"List normalized canvas objects.\",\n inputSchema: {\n type: canvasObjectTypeSchema.optional(),\n },\n },\n async ({ type }) =>\n textResult(context.controller.listObjects(type as CanvasObjectType | undefined)),\n );\n\n server.registerTool(\n \"get_object\",\n {\n description: \"Get one normalized canvas object by id.\",\n inputSchema: {\n id: z.string(),\n },\n },\n async ({ id }) => {\n const object = context.controller.getObject(id);\n return object ? textResult(object) : errorResult(`Object not found: ${id}`);\n },\n );\n\n server.registerTool(\n \"create_object\",\n {\n description: \"Create a normalized canvas object.\",\n inputSchema: createObjectShape,\n },\n async (input) => {\n try {\n const object = context.controller.createObject(input as CreateObjectSpec);\n return textResult({ id: object.id });\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n\n server.registerTool(\n \"update_object\",\n {\n description: \"Patch a normalized canvas object.\",\n inputSchema: updateObjectShape,\n },\n async ({ id, ...patch }) => {\n const object = context.controller.updateObject(id, patch as UpdateObjectPatch);\n return object ? textResult({ id: object.id }) : errorResult(`Object not found: ${id}`);\n },\n );\n\n server.registerTool(\n \"delete_object\",\n {\n description: \"Delete one or more canvas objects.\",\n inputSchema: {\n ids: z.array(z.string()).min(1),\n },\n },\n async ({ ids }) => textResult({ deleted: context.controller.deleteObjects(ids) }),\n );\n\n server.registerTool(\n \"clear_canvas\",\n {\n description: \"Clear all canvas objects.\",\n inputSchema: {},\n },\n async () => {\n context.controller.clear();\n return textResult({ cleared: true });\n },\n );\n\n server.registerTool(\n \"save_canvas\",\n {\n description: \"Save the current canvas to a .excalidraw file inside the workspace.\",\n inputSchema: {\n path: z.string().optional(),\n },\n },\n async ({ path }) => {\n try {\n const written = await context.workspace.writeText(\n path ?? \"canvas.excalidraw\",\n context.controller.serialize(),\n );\n return textResult({ path: written });\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n\n server.registerTool(\n \"set_canvas_background\",\n {\n description: \"Set the canvas background color.\",\n inputSchema: {\n color: colorSchema,\n },\n },\n async ({ color }) => {\n context.controller.mutateScene((scene) => {\n scene.appState.viewBackgroundColor = color;\n });\n return textResult({ viewBackgroundColor: color });\n },\n );\n\n server.registerTool(\n \"open_canvas\",\n {\n description: \"Open a .excalidraw file from inside the workspace.\",\n inputSchema: {\n path: z.string(),\n },\n },\n async ({ path }) => {\n try {\n const file = await context.workspace.readText(path);\n context.controller.deserialize(file.text);\n return textResult({\n path: file.path,\n objectCount: context.controller.listObjects().length,\n });\n } catch (error) {\n return errorResult(friendlyOpenError(error, path));\n }\n },\n );\n\n server.registerTool(\n \"screenshot\",\n {\n description: \"Export a PNG screenshot through a connected browser.\",\n inputSchema: {\n path: z.string().optional(),\n exportPadding: z.number().min(0).max(200).optional(),\n },\n },\n async ({ path, exportPadding }) => {\n try {\n const exported = await context.requestExport({ exportPadding });\n const content: Array<\n { type: \"image\"; data: string; mimeType: string } | { type: \"text\"; text: string }\n > = [{ type: \"image\", data: exported.base64, mimeType: exported.mimeType }];\n if (path) {\n const written = await context.workspace.writeBinary(\n path,\n Buffer.from(exported.base64, \"base64\"),\n );\n content.push({ type: \"text\", text: JSON.stringify({ path: written }) });\n }\n return { content };\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n\n server.registerTool(\n \"get_selected_objects\",\n {\n description: \"Return normalized objects currently selected in the connected browser.\",\n inputSchema: {},\n },\n async () => {\n try {\n const selection = await context.requestSelection();\n const objects: CanvasObject[] = [];\n const missingIds: string[] = [];\n for (const id of selection.selectedIds) {\n const object = context.controller.getObject(id);\n if (object) {\n objects.push(object);\n } else {\n missingIds.push(id);\n }\n }\n\n return textResult({\n version: context.controller.currentVersion(),\n selectedIds: selection.selectedIds,\n objects,\n missingIds,\n });\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n\n server.registerTool(\n \"select_objects\",\n {\n description: \"Select existing objects in the connected browser.\",\n inputSchema: {\n ids: z.array(z.string()),\n },\n },\n async ({ ids }) => {\n try {\n const selectedIds: string[] = [];\n const missingIds: string[] = [];\n for (const id of ids) {\n if (context.controller.getObject(id)) {\n selectedIds.push(id);\n } else {\n missingIds.push(id);\n }\n }\n\n const result = await context.requestSetSelection(selectedIds);\n return textResult({\n selectedIds: result.selectedIds,\n missingIds,\n });\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n\n server.registerTool(\n \"undo\",\n {\n description: \"Undo the most recent authoritative scene change.\",\n inputSchema: {},\n },\n async () => {\n const undone = context.controller.undo();\n return textResult({ version: context.controller.currentVersion(), undone });\n },\n );\n\n server.registerTool(\n \"redo\",\n {\n description: \"Redo the most recently undone authoritative scene change.\",\n inputSchema: {},\n },\n async () => {\n const redone = context.controller.redo();\n return textResult({ version: context.controller.currentVersion(), redone });\n },\n );\n}\n\nfunction textResult(value: unknown) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(value) }],\n };\n}\n\nfunction errorResult(error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n isError: true,\n content: [{ type: \"text\" as const, text: message }],\n };\n}\n\nfunction friendlyOpenError(error: unknown, requestedPath: string): unknown {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"ENOENT\"\n ) {\n return `No such canvas file: ${requestedPath}`;\n }\n\n return error;\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { isInitializeRequest } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { Request, Response, Router } from \"express\";\n\ntype Transport = StreamableHTTPServerTransport;\n\nexport function mountMcpHttp(\n router: Router,\n createServer: () => McpServer,\n allowedHosts: string[],\n): void {\n const transports = new Map<string, Transport>();\n\n router.post(\"/mcp\", async (req, res) => {\n try {\n const sessionId = headerValue(req, \"mcp-session-id\");\n let transport = sessionId ? transports.get(sessionId) : undefined;\n\n if (!transport) {\n if (!isInitialize(req.body)) {\n res.status(400).json({ error: \"Missing or invalid MCP session\" });\n return;\n }\n\n transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n enableDnsRebindingProtection: true,\n allowedHosts,\n onsessioninitialized: (newSessionId) => {\n transports.set(newSessionId, transport as Transport);\n },\n });\n transport.onclose = () => {\n const currentSessionId = transport?.sessionId;\n if (currentSessionId) {\n transports.delete(currentSessionId);\n }\n };\n\n await createServer().connect(transport);\n }\n\n await transport.handleRequest(req, res, req.body);\n } catch (error) {\n sendTransportError(res, error);\n }\n });\n\n router.get(\"/mcp\", async (req, res) => {\n await handleSessionRequest(req, res, transports);\n });\n\n router.delete(\"/mcp\", async (req, res) => {\n await handleSessionRequest(req, res, transports);\n });\n}\n\nasync function handleSessionRequest(\n req: Request,\n res: Response,\n transports: Map<string, Transport>,\n): Promise<void> {\n const sessionId = headerValue(req, \"mcp-session-id\");\n const transport = sessionId ? transports.get(sessionId) : undefined;\n if (!transport) {\n res.status(400).json({ error: \"Missing or invalid MCP session\" });\n return;\n }\n\n try {\n await transport.handleRequest(req, res);\n } catch (error) {\n sendTransportError(res, error);\n }\n}\n\nfunction isInitialize(body: unknown): boolean {\n const messages = Array.isArray(body) ? body : [body];\n return messages.some((message) => isInitializeRequest(message));\n}\n\nfunction headerValue(req: Request, name: string): string | undefined {\n const value = req.headers[name];\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction sendTransportError(res: Response, error: unknown): void {\n if (res.headersSent) {\n return;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n res.status(500).json({ error: message });\n}\n","import type { CanvasPlugin } from \"../core/plugin.js\";\nimport type {\n AppState,\n BinaryFiles,\n CanvasMetadata,\n CanvasObject,\n CanvasObjectSummary,\n CanvasObjectType,\n CreateObjectSpec,\n ExcalidrawElement,\n Scene,\n UpdateObjectPatch,\n} from \"../core/scene.js\";\nimport { cloneScene } from \"../core/scene.js\";\n\nexport type SceneChangeOrigin = unknown;\n\nexport interface SceneSnapshot {\n version: number;\n elements: ExcalidrawElement[];\n appState: AppState;\n files: BinaryFiles;\n}\n\nexport type SceneChangeListener = (snapshot: SceneSnapshot, origin?: SceneChangeOrigin) => void;\n\nexport class CanvasController {\n private scene: Scene;\n private listener?: SceneChangeListener;\n private txDepth = 0;\n private txDirty = false;\n private txOrigin?: SceneChangeOrigin;\n private txSnapshot?: Scene;\n private readonly undoStack: Scene[] = [];\n private readonly redoStack: Scene[] = [];\n private readonly maxHistory = 50;\n\n constructor(private readonly plugin: CanvasPlugin) {\n this.scene = plugin.createInitialScene();\n }\n\n get canvasName(): string {\n return this.plugin.name;\n }\n\n setChangeListener(listener: SceneChangeListener): void {\n this.listener = listener;\n }\n\n getScene(): Scene {\n return cloneScene(this.scene);\n }\n\n getSnapshot(): SceneSnapshot {\n return {\n version: this.scene.version,\n elements: this.scene.elements,\n appState: this.scene.appState,\n files: this.scene.files,\n };\n }\n\n currentVersion(): number {\n return this.scene.version;\n }\n\n getMetadata(clientsConnected = 0): CanvasMetadata & { clientsConnected: number } {\n return {\n ...this.plugin.getMetadata(this.scene),\n clientsConnected,\n };\n }\n\n listObjects(type?: CanvasObjectType): CanvasObjectSummary[] {\n return this.plugin.listObjects(this.scene, type);\n }\n\n getObject(id: string): CanvasObject | undefined {\n return this.plugin.getObject(this.scene, id);\n }\n\n createObject(spec: CreateObjectSpec): CanvasObject {\n return this.mutateScene((scene) => this.plugin.createObject(scene, spec));\n }\n\n updateObject(id: string, patch: UpdateObjectPatch): CanvasObject | undefined {\n return this.mutateScene((scene) => this.plugin.updateObject(scene, id, patch));\n }\n\n deleteObjects(ids: string[]): string[] {\n return this.mutateScene((scene) => this.plugin.deleteObjects(scene, ids));\n }\n\n clear(): void {\n this.mutateScene((scene) => this.plugin.clear(scene));\n }\n\n serialize(): string {\n return JSON.stringify(this.plugin.serialize(this.scene), null, 2);\n }\n\n deserialize(raw: string): void {\n const before = cloneScene(this.scene);\n const currentVersion = this.scene.version;\n this.scene = this.plugin.deserialize(raw);\n this.scene.version = currentVersion;\n this.pushUndo(before);\n this.redoStack.length = 0;\n this.bumpAndNotify();\n }\n\n replaceFromBrowser(\n elements: ExcalidrawElement[],\n appState?: Partial<AppState>,\n files?: BinaryFiles,\n origin?: SceneChangeOrigin,\n ): void {\n this.pushUndo(cloneScene(this.scene));\n this.redoStack.length = 0;\n this.scene.elements = elements;\n this.scene.appState = {\n viewBackgroundColor: appState?.viewBackgroundColor ?? this.scene.appState.viewBackgroundColor,\n };\n this.scene.files = files ?? this.scene.files;\n this.bumpAndNotify(origin);\n }\n\n mutateScene<T>(mutator: (scene: Scene) => T, origin?: SceneChangeOrigin): T {\n if (this.txDepth > 0) {\n const result = mutator(this.scene);\n this.bumpAndNotify(origin);\n return result;\n }\n\n const before = cloneScene(this.scene);\n const result = mutator(this.scene);\n this.pushUndo(before);\n this.redoStack.length = 0;\n this.bumpAndNotify(origin);\n return result;\n }\n\n transaction<T>(fn: () => T, origin?: SceneChangeOrigin): T {\n const isOuterTransaction = this.txDepth === 0;\n if (isOuterTransaction) {\n this.txSnapshot = cloneScene(this.scene);\n }\n\n this.txDepth += 1;\n let failed = false;\n try {\n return fn();\n } catch (error) {\n failed = true;\n if (isOuterTransaction && this.txSnapshot) {\n this.scene = this.txSnapshot;\n this.txDirty = false;\n this.txOrigin = undefined;\n }\n throw error;\n } finally {\n this.txDepth -= 1;\n if (this.txDepth === 0 && failed) {\n this.txSnapshot = undefined;\n } else if (this.txDepth === 0 && this.txDirty) {\n const txOrigin = this.txOrigin;\n const snapshot = this.txSnapshot;\n this.txDirty = false;\n this.txOrigin = undefined;\n this.txSnapshot = undefined;\n if (snapshot) {\n this.pushUndo(snapshot);\n this.redoStack.length = 0;\n }\n this.commit(txOrigin ?? origin);\n } else if (this.txDepth === 0) {\n this.txSnapshot = undefined;\n }\n }\n }\n\n undo(): boolean {\n const previous = this.undoStack.pop();\n if (!previous) {\n return false;\n }\n\n this.redoStack.push(cloneScene(this.scene));\n this.restoreScene(previous);\n return true;\n }\n\n redo(): boolean {\n const next = this.redoStack.pop();\n if (!next) {\n return false;\n }\n\n this.undoStack.push(cloneScene(this.scene));\n this.restoreScene(next);\n return true;\n }\n\n private bumpAndNotify(origin?: SceneChangeOrigin): void {\n if (this.txDepth > 0) {\n this.txDirty = true;\n this.txOrigin = origin ?? this.txOrigin;\n return;\n }\n\n this.commit(origin);\n }\n\n private commit(origin?: SceneChangeOrigin): void {\n this.scene.version += 1;\n this.listener?.(this.getSnapshot(), origin);\n }\n\n private pushUndo(scene: Scene): void {\n this.undoStack.push(cloneScene(scene));\n if (this.undoStack.length > this.maxHistory) {\n this.undoStack.shift();\n }\n }\n\n private restoreScene(scene: Scene): void {\n const currentVersion = this.scene.version;\n this.scene = cloneScene(scene);\n this.scene.version = currentVersion;\n this.commit();\n }\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport class Workspace {\n readonly root: string;\n\n constructor(root: string) {\n this.root = path.resolve(root);\n }\n\n async ensure(): Promise<void> {\n await mkdir(this.root, { recursive: true });\n }\n\n resolveInWorkspace(userPath: string): string {\n if (!userPath || userPath.trim().length === 0) {\n throw new Error(\"Path is required\");\n }\n\n const resolved = path.isAbsolute(userPath)\n ? path.resolve(userPath)\n : path.resolve(this.root, userPath);\n const relative = path.relative(this.root, resolved);\n const staysInside =\n relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n\n if (!staysInside) {\n throw new Error(`Path is outside workspace: ${userPath}`);\n }\n\n return resolved;\n }\n\n async readText(userPath: string): Promise<{ path: string; text: string }> {\n const resolved = this.resolveInWorkspace(userPath);\n return {\n path: resolved,\n text: await readFile(resolved, \"utf8\"),\n };\n }\n\n async writeText(userPath: string, text: string): Promise<string> {\n const resolved = this.resolveInWorkspace(userPath);\n await mkdir(path.dirname(resolved), { recursive: true });\n await writeFile(resolved, text, \"utf8\");\n return resolved;\n }\n\n async writeBinary(userPath: string, data: Buffer): Promise<string> {\n const resolved = this.resolveInWorkspace(userPath);\n await mkdir(path.dirname(resolved), { recursive: true });\n await writeFile(resolved, data);\n return resolved;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { Server } from \"node:http\";\nimport { WebSocket, WebSocketServer } from \"ws\";\nimport type { ExcalidrawElement } from \"../core/scene.js\";\nimport {\n type ExportRequestMessage,\n type SelectionRequestMessage,\n type SelectionSetRequestMessage,\n type ServerToBrowserMessage,\n parseBrowserMessage,\n} from \"../shared/protocol.js\";\nimport type { CanvasController, SceneSnapshot } from \"./canvasController.js\";\n\nexport interface ExportOptions {\n exportPadding?: number;\n timeoutMs?: number;\n}\n\nexport interface BrowserExport {\n mimeType: string;\n base64: string;\n}\n\nexport interface SelectionOptions {\n timeoutMs?: number;\n}\n\nexport interface BrowserSelection {\n selectedIds: string[];\n}\n\nexport interface BrowserSelectionSet {\n selectedIds: string[];\n}\n\ninterface PendingExport {\n resolve(value: BrowserExport): void;\n reject(error: Error): void;\n timer: NodeJS.Timeout;\n}\n\ninterface PendingSelection {\n resolve(value: BrowserSelection): void;\n reject(error: Error): void;\n timer: NodeJS.Timeout;\n}\n\ninterface PendingSelectionSet {\n resolve(value: BrowserSelectionSet): void;\n reject(error: Error): void;\n timer: NodeJS.Timeout;\n}\n\ninterface ClientState {\n socket: WebSocket;\n lastSyncedOrder: number;\n lastSyncedVersion: number;\n supportsSelectionSet: boolean;\n}\n\nexport class WsBridge {\n private readonly clients = new Map<WebSocket, ClientState>();\n private readonly pendingExports = new Map<string, PendingExport>();\n private readonly pendingSelections = new Map<string, PendingSelection>();\n private readonly pendingSelectionSets = new Map<string, PendingSelectionSet>();\n private syncOrder = 0;\n private wss?: WebSocketServer;\n\n constructor(private readonly controller: CanvasController) {}\n\n attach(server: Server, path = \"/ws\"): void {\n this.wss = new WebSocketServer({ noServer: true });\n this.wss.on(\"connection\", (socket) => this.handleConnection(socket));\n\n server.on(\"upgrade\", (request, socket, head) => {\n const url = new URL(request.url ?? \"/\", \"http://127.0.0.1\");\n if (url.pathname !== path || !this.wss) {\n return;\n }\n\n this.wss.handleUpgrade(request, socket, head, (ws) => {\n this.wss?.emit(\"connection\", ws, request);\n });\n });\n }\n\n connectedClientCount(): number {\n return this.clients.size;\n }\n\n broadcastScene(snapshot: SceneSnapshot, origin?: unknown): void {\n for (const { socket } of this.clients.values()) {\n if (socket !== origin) {\n this.sendScene(socket, snapshot);\n }\n }\n\n if (origin instanceof WebSocket) {\n this.markClientSynced(origin, snapshot.version);\n }\n }\n\n requestExport(options: ExportOptions = {}): Promise<BrowserExport> {\n const client = this.mostRecentlySyncedClient();\n if (!client) {\n return Promise.reject(new Error(\"No browser canvas client is connected\"));\n }\n\n const id = randomUUID();\n const request: ExportRequestMessage = {\n type: \"export:request\",\n id,\n mimeType: \"image/png\",\n exportPadding: options.exportPadding,\n };\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingExports.delete(id);\n reject(new Error(\"Screenshot export timed out\"));\n }, options.timeoutMs ?? 5000);\n\n this.pendingExports.set(id, { resolve, reject, timer });\n client.socket.send(JSON.stringify(request));\n });\n }\n\n requestSelection(options: SelectionOptions = {}): Promise<BrowserSelection> {\n const client = this.mostRecentlySyncedClient();\n if (!client) {\n return Promise.reject(new Error(\"No browser canvas client is connected\"));\n }\n\n const id = randomUUID();\n const request: SelectionRequestMessage = {\n type: \"selection:request\",\n id,\n };\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingSelections.delete(id);\n reject(new Error(\"Selection request timed out\"));\n }, options.timeoutMs ?? 5000);\n\n this.pendingSelections.set(id, { resolve, reject, timer });\n client.socket.send(JSON.stringify(request));\n });\n }\n\n requestSetSelection(\n selectedIds: string[],\n options: SelectionOptions = {},\n ): Promise<BrowserSelectionSet> {\n const client = this.mostRecentlySyncedClient((candidate) => candidate.supportsSelectionSet);\n if (!client) {\n if (this.connectedClientCount() > 0) {\n return Promise.reject(\n new Error(\"No browser canvas client supports programmatic selection\"),\n );\n }\n return Promise.reject(new Error(\"No browser canvas client is connected\"));\n }\n\n const id = randomUUID();\n const request: SelectionSetRequestMessage = {\n type: \"selection:set\",\n id,\n selectedIds,\n };\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingSelectionSets.delete(id);\n reject(new Error(\"Selection set timed out\"));\n }, options.timeoutMs ?? 5000);\n\n this.pendingSelectionSets.set(id, { resolve, reject, timer });\n client.socket.send(JSON.stringify(request));\n });\n }\n\n close(): void {\n for (const { socket } of this.clients.values()) {\n socket.close();\n }\n this.wss?.close();\n }\n\n private handleConnection(socket: WebSocket): void {\n this.clients.set(socket, {\n socket,\n lastSyncedOrder: 0,\n lastSyncedVersion: -1,\n supportsSelectionSet: false,\n });\n socket.on(\"message\", (data) => this.handleMessage(socket, data.toString()));\n socket.on(\"close\", () => {\n this.clients.delete(socket);\n });\n this.sendScene(socket, this.controller.getSnapshot());\n }\n\n private handleMessage(socket: WebSocket, data: string): void {\n const message = parseBrowserMessage(data);\n if (!message) {\n return;\n }\n\n if (message.type === \"hello\") {\n const client = this.clients.get(socket);\n if (client) {\n client.supportsSelectionSet = Boolean(message.capabilities?.selectionSet);\n }\n this.sendScene(socket, this.controller.getSnapshot());\n return;\n }\n\n if (message.type === \"scene:changed\") {\n if (message.baseVersion < this.controller.currentVersion()) {\n this.sendScene(socket, this.controller.getSnapshot());\n return;\n }\n\n this.controller.replaceFromBrowser(\n message.elements as ExcalidrawElement[],\n message.appState,\n message.files,\n socket,\n );\n this.markClientSynced(socket, this.controller.currentVersion());\n return;\n }\n\n if (message.type === \"export:result\" || message.type === \"export:error\") {\n const pending = this.pendingExports.get(message.id);\n if (!pending) {\n return;\n }\n\n clearTimeout(pending.timer);\n this.pendingExports.delete(message.id);\n if (message.type === \"export:result\") {\n pending.resolve({ mimeType: message.mimeType, base64: message.base64 });\n } else {\n pending.reject(new Error(message.message));\n }\n return;\n }\n\n if (message.type === \"selection:result\" || message.type === \"selection:error\") {\n const pending = this.pendingSelections.get(message.id);\n if (!pending) {\n return;\n }\n\n clearTimeout(pending.timer);\n this.pendingSelections.delete(message.id);\n if (message.type === \"selection:result\") {\n pending.resolve({ selectedIds: message.selectedIds });\n } else {\n pending.reject(new Error(message.message));\n }\n return;\n }\n\n if (message.type === \"selection:set:result\" || message.type === \"selection:set:error\") {\n const pending = this.pendingSelectionSets.get(message.id);\n if (!pending) {\n return;\n }\n\n clearTimeout(pending.timer);\n this.pendingSelectionSets.delete(message.id);\n if (message.type === \"selection:set:result\") {\n pending.resolve({ selectedIds: message.selectedIds });\n } else {\n pending.reject(new Error(message.message));\n }\n }\n }\n\n private sendScene(socket: WebSocket, snapshot: SceneSnapshot): void {\n if (socket.readyState !== WebSocket.OPEN) {\n return;\n }\n\n socket.send(\n JSON.stringify({\n type: \"scene:set\",\n version: snapshot.version,\n elements: snapshot.elements,\n appState: snapshot.appState,\n files: snapshot.files,\n } satisfies ServerToBrowserMessage),\n );\n this.markClientSynced(socket, snapshot.version);\n }\n\n private markClientSynced(socket: WebSocket, version: number): void {\n const client = this.clients.get(socket);\n if (!client) {\n return;\n }\n\n client.lastSyncedOrder = ++this.syncOrder;\n client.lastSyncedVersion = version;\n }\n\n private mostRecentlySyncedClient(\n predicate: (client: ClientState) => boolean = () => true,\n ): ClientState | undefined {\n return [...this.clients.values()]\n .filter((candidate) => candidate.socket.readyState === WebSocket.OPEN && predicate(candidate))\n .sort((left, right) => right.lastSyncedOrder - left.lastSyncedOrder)[0];\n }\n}\n","import type { AppState, BinaryFiles, ExcalidrawElement } from \"../core/scene.js\";\n\nexport type BrowserToServerMessage =\n | HelloMessage\n | SceneChangedMessage\n | ExportResultMessage\n | ExportErrorMessage\n | SelectionResultMessage\n | SelectionErrorMessage\n | SelectionSetResultMessage\n | SelectionSetErrorMessage;\n\nexport type ServerToBrowserMessage =\n | SceneSetMessage\n | ExportRequestMessage\n | SelectionRequestMessage\n | SelectionSetRequestMessage;\n\nexport interface HelloMessage {\n type: \"hello\";\n capabilities?: {\n selectionSet?: boolean;\n };\n}\n\nexport interface SceneChangedMessage {\n type: \"scene:changed\";\n baseVersion: number;\n elements: ExcalidrawElement[];\n appState?: Partial<AppState>;\n files?: BinaryFiles;\n}\n\nexport interface ExportResultMessage {\n type: \"export:result\";\n id: string;\n mimeType: string;\n base64: string;\n}\n\nexport interface ExportErrorMessage {\n type: \"export:error\";\n id: string;\n message: string;\n}\n\nexport interface SelectionResultMessage {\n type: \"selection:result\";\n id: string;\n selectedIds: string[];\n}\n\nexport interface SelectionErrorMessage {\n type: \"selection:error\";\n id: string;\n message: string;\n}\n\nexport interface SelectionSetResultMessage {\n type: \"selection:set:result\";\n id: string;\n selectedIds: string[];\n}\n\nexport interface SelectionSetErrorMessage {\n type: \"selection:set:error\";\n id: string;\n message: string;\n}\n\nexport interface SceneSetMessage {\n type: \"scene:set\";\n version: number;\n elements: ExcalidrawElement[];\n appState?: Partial<AppState>;\n files?: BinaryFiles;\n}\n\nexport interface ExportRequestMessage {\n type: \"export:request\";\n id: string;\n mimeType?: \"image/png\";\n exportPadding?: number;\n}\n\nexport interface SelectionRequestMessage {\n type: \"selection:request\";\n id: string;\n}\n\nexport interface SelectionSetRequestMessage {\n type: \"selection:set\";\n id: string;\n selectedIds: string[];\n}\n\nexport function parseBrowserMessage(data: string): BrowserToServerMessage | undefined {\n try {\n const parsed = JSON.parse(data) as BrowserToServerMessage;\n if (typeof parsed === \"object\" && parsed !== null && \"type\" in parsed) {\n return parsed;\n }\n } catch {\n return undefined;\n }\n\n return undefined;\n}\n","export type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nconst levelOrder: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n};\n\nexport interface Logger {\n debug(message: string, details?: unknown): void;\n info(message: string, details?: unknown): void;\n warn(message: string, details?: unknown): void;\n error(message: string, details?: unknown): void;\n}\n\nexport function createLogger(minLevel: LogLevel = \"info\"): Logger {\n const min = levelOrder[minLevel];\n\n const write = (level: LogLevel, message: string, details?: unknown) => {\n if (levelOrder[level] < min) {\n return;\n }\n\n const suffix = details === undefined ? \"\" : ` ${formatDetails(details)}`;\n console.error(`[agentic-canvas] ${level}: ${message}${suffix}`);\n };\n\n return {\n debug: (message, details) => write(\"debug\", message, details),\n info: (message, details) => write(\"info\", message, details),\n warn: (message, details) => write(\"warn\", message, details),\n error: (message, details) => write(\"error\", message, details),\n };\n}\n\nfunction formatDetails(details: unknown): string {\n if (details instanceof Error) {\n return details.stack ?? details.message;\n }\n\n if (typeof details === \"string\") {\n return details;\n }\n\n try {\n return JSON.stringify(details);\n } catch {\n return String(details);\n }\n}\n"],"mappings":"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","names":["path","fileURLToPath","randomUUID","scale","z","z","linearWidth","linearHeight","randomUUID","path","z","textResult","z","errorResult","path","randomUUID","createServer","path","result","path","randomUUID","path","randomUUID","path","fileURLToPath"]}