@trohde/agentic-canvas 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/LICENSE +21 -0
- package/README.md +160 -0
- package/SECURITY.md +19 -0
- package/dist/cli/index.js +1873 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/web/assets/Assistant-Bold-gm-uSS1B.woff2 +0 -0
- package/dist/web/assets/Assistant-Medium-DrcxCXg3.woff2 +0 -0
- package/dist/web/assets/Assistant-Regular-DVxZuzxb.woff2 +0 -0
- package/dist/web/assets/Assistant-SemiBold-SCI4bEL9.woff2 +0 -0
- package/dist/web/assets/ar-SA-G6X2FPQ2-Bx_JGCzc.js +10 -0
- package/dist/web/assets/arc-CZEYm-X2.js +1 -0
- package/dist/web/assets/architecture-7EHR7CIX-BW08P3jh.js +1 -0
- package/dist/web/assets/architectureDiagram-3BPJPVTR-BX4UqKAe.js +36 -0
- package/dist/web/assets/array-BifhSqXX.js +1 -0
- package/dist/web/assets/az-AZ-76LH7QW2-CQnzCEm_.js +1 -0
- package/dist/web/assets/bg-BG-XCXSNQG7-B6OhJNg1.js +5 -0
- package/dist/web/assets/blockDiagram-GPEHLZMM-DOaLZNH2.js +132 -0
- package/dist/web/assets/bn-BD-2XOGV67Q-CL8DmeD-.js +5 -0
- package/dist/web/assets/c4Diagram-AAUBKEIU-BOYbD4o9.js +10 -0
- package/dist/web/assets/ca-ES-6MX7JW3Y-DqXuGb3N.js +8 -0
- package/dist/web/assets/channel-jlcmNkDM.js +1 -0
- package/dist/web/assets/chunk-2J33WTMH-9pRDhFmL.js +1 -0
- package/dist/web/assets/chunk-3OPIFGDE-Cxtej-eZ.js +62 -0
- package/dist/web/assets/chunk-4BX2VUAB-WGnRPgB4.js +1 -0
- package/dist/web/assets/chunk-55IACEB6-By23tM0L.js +1 -0
- package/dist/web/assets/chunk-5ZQYHXKU-BbvpmZDT.js +2 -0
- package/dist/web/assets/chunk-727SXJPM-DeN-6nx2.js +206 -0
- package/dist/web/assets/chunk-AQP2D5EJ-3vlT2osY.js +231 -0
- package/dist/web/assets/chunk-BSJP7CBP-ggZwEsYs.js +1 -0
- package/dist/web/assets/chunk-CSCIHK7Q-CkCt7BGB.js +124 -0
- package/dist/web/assets/chunk-EIO257PC-DhAXVvAc.js +22 -0
- package/dist/web/assets/chunk-FMBD7UC4-BWW1dpup.js +15 -0
- package/dist/web/assets/chunk-KSCS5N6A-ByGpruIk.js +10 -0
- package/dist/web/assets/chunk-L5ZTLDWV-Brj903IS.js +1 -0
- package/dist/web/assets/chunk-LZXEDZCA-B0E6SbHa.js +2 -0
- package/dist/web/assets/chunk-ND2GUHAM-cgO1vAyy.js +1 -0
- package/dist/web/assets/chunk-NNHCCRGN-DlpIbxXb.js +159 -0
- package/dist/web/assets/chunk-NZK2D7GU-rJf6zpwf.js +1 -0
- package/dist/web/assets/chunk-O5CBEL6O-DZpUP7B-.js +70 -0
- package/dist/web/assets/chunk-QZHKN3VN-B2hsWqvV.js +1 -0
- package/dist/web/assets/chunk-WU5MYG2G-ad-_f9bA.js +1 -0
- package/dist/web/assets/chunk-XPW4576I-DRG_5uRX.js +32 -0
- package/dist/web/assets/classDiagram-4FO5ZUOK-pgvxJ5K2.js +1 -0
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-pgvxJ5K2.js +1 -0
- package/dist/web/assets/cose-bilkent-S5V4N54A-Dzdtq3ax.js +1 -0
- package/dist/web/assets/cs-CZ-2BRQDIVT-C9Hi60ft.js +11 -0
- package/dist/web/assets/cytoscape.esm-h6BdjjI9.js +321 -0
- package/dist/web/assets/da-DK-5WZEPLOC-DuscK2dU.js +5 -0
- package/dist/web/assets/dagre-BM42HDAG-DG-1WRTH.js +4 -0
- package/dist/web/assets/dagre-Bx709z4p.js +1 -0
- package/dist/web/assets/de-DE-XR44H4JA-BUknVi9m.js +8 -0
- package/dist/web/assets/defaultLocale-C8Fc0cco.js +1 -0
- package/dist/web/assets/diagram-2AECGRRQ-C01yy19V.js +43 -0
- package/dist/web/assets/diagram-5GNKFQAL-9Ly54gPf.js +10 -0
- package/dist/web/assets/diagram-KO2AKTUF-Bnzn_Fk2.js +3 -0
- package/dist/web/assets/diagram-LMA3HP47-CkQJH7qS.js +24 -0
- package/dist/web/assets/diagram-OG6HWLK6-sYTSt9S6.js +24 -0
- package/dist/web/assets/directory-open-01563666-D4xXyWb_.js +1 -0
- package/dist/web/assets/directory-open-4ed118d0-1i309Asm.js +1 -0
- package/dist/web/assets/dist--k9jX8ko.js +27 -0
- package/dist/web/assets/dist-CHteZrRU.js +1 -0
- package/dist/web/assets/el-GR-BZB4AONW-CBx8IJCe.js +10 -0
- package/dist/web/assets/en-B4ZKOASM-D04FpeSQ.js +1 -0
- package/dist/web/assets/erDiagram-TEJ5UH35-kBTcPhaQ.js +85 -0
- package/dist/web/assets/es-ES-U4NZUMDT-nQPOkQIb.js +9 -0
- package/dist/web/assets/eu-ES-A7QVB2H4-OVL5j0Bz.js +11 -0
- package/dist/web/assets/eventmodeling-FCH6USID-3Z5bJ280.js +1 -0
- package/dist/web/assets/fa-IR-HGAKTJCU-BXJbxYFk.js +8 -0
- package/dist/web/assets/fi-FI-Z5N7JZ37-DoZfr4yv.js +6 -0
- package/dist/web/assets/file-open-002ab408-BHUWm0Sh.js +1 -0
- package/dist/web/assets/file-open-7c801643-DZtJT5zp.js +1 -0
- package/dist/web/assets/file-save-3189631c-CO9S4HFW.js +1 -0
- package/dist/web/assets/file-save-745eba88-Bwdfz6OZ.js +1 -0
- package/dist/web/assets/flowDiagram-I6XJVG4X-CwQyslgb.js +162 -0
- package/dist/web/assets/fr-FR-RHASNOE6-CXLv0m_p.js +9 -0
- package/dist/web/assets/ganttDiagram-6RSMTGT7-B-1gME9q.js +292 -0
- package/dist/web/assets/gitGraph-WXDBUCRP-BC3bsb5A.js +1 -0
- package/dist/web/assets/gitGraphDiagram-PVQCEYII-DUh_E2g-.js +106 -0
- package/dist/web/assets/gl-ES-HMX3MZ6V-DMYtQjyy.js +10 -0
- package/dist/web/assets/graphlib-B8gBHxth.js +1 -0
- package/dist/web/assets/he-IL-6SHJWFNN-BXviMgxV.js +10 -0
- package/dist/web/assets/hi-IN-IWLTKZ5I-B6s0F0bv.js +4 -0
- package/dist/web/assets/hu-HU-A5ZG7DT2-DZY88thP.js +7 -0
- package/dist/web/assets/id-ID-SAP4L64H-CsRPE_UY.js +10 -0
- package/dist/web/assets/image-GAAHSSAO-Ufj_572K.js +1 -0
- package/dist/web/assets/image-blob-reduce.esm-NzmDxm1v.js +2 -0
- package/dist/web/assets/index-DedR31Vl.css +1 -0
- package/dist/web/assets/index-Do_WCY2x.js +207 -0
- package/dist/web/assets/info-J43DQDTF-DgcAwO7L.js +1 -0
- package/dist/web/assets/infoDiagram-5YYISTIA-BVoRZtf6.js +2 -0
- package/dist/web/assets/init-D6jRqBbL.js +1 -0
- package/dist/web/assets/ishikawaDiagram-YF4QCWOH-Pc0lSZjn.js +70 -0
- package/dist/web/assets/it-IT-JPQ66NNP-D6QIIUKx.js +11 -0
- package/dist/web/assets/ja-JP-DBVTYXUO-BKIOpiiN.js +8 -0
- package/dist/web/assets/journeyDiagram-JHISSGLW-CUTIkP_3.js +139 -0
- package/dist/web/assets/kaa-6HZHGXH3-Ck2PqClI.js +1 -0
- package/dist/web/assets/kab-KAB-ZGHBKWFO-9067fQ1h.js +8 -0
- package/dist/web/assets/kanban-definition-UN3LZRKU-f9h-Kl6S.js +89 -0
- package/dist/web/assets/katex-Vhh-h91d.js +257 -0
- package/dist/web/assets/kk-KZ-P5N5QNE5-Ds5pD5Rs.js +1 -0
- package/dist/web/assets/km-KH-HSX4SM5Z-BvgABkMn.js +11 -0
- package/dist/web/assets/ko-KR-MTYHY66A-BI-VJ_qS.js +9 -0
- package/dist/web/assets/ku-TR-6OUDTVRD-CzO0QxpT.js +9 -0
- package/dist/web/assets/line-BM7n-WSY.js +1 -0
- package/dist/web/assets/linear-CoV0e-iv.js +1 -0
- package/dist/web/assets/lt-LT-XHIRWOB4-Wdr8437y.js +3 -0
- package/dist/web/assets/lv-LV-5QDEKY6T-Baqs6ETz.js +7 -0
- package/dist/web/assets/mermaid-parser.core-BxU7L1C-.js +4 -0
- package/dist/web/assets/mindmap-definition-RKZ34NQL-e2CkjxCV.js +96 -0
- package/dist/web/assets/mr-IN-CRQNXWMA-_P3j2iZu.js +13 -0
- package/dist/web/assets/my-MM-5M5IBNSE-u-YXjqOx.js +1 -0
- package/dist/web/assets/nb-NO-T6EIAALU-BVTkGOfM.js +10 -0
- package/dist/web/assets/nl-NL-IS3SIHDZ-Dz45KRHt.js +8 -0
- package/dist/web/assets/nn-NO-6E72VCQL-Bv1T99Os.js +8 -0
- package/dist/web/assets/oc-FR-POXYY2M6-CWPx0BPy.js +8 -0
- package/dist/web/assets/ordinal-hYBb2elL.js +1 -0
- package/dist/web/assets/pa-IN-N4M65BXN-CUAufnLD.js +4 -0
- package/dist/web/assets/packet-YPE3B663-DSUdqwD6.js +1 -0
- package/dist/web/assets/path-BWPyau1x.js +1 -0
- package/dist/web/assets/percentages-BXMCSKIN-BRi-lUYV.js +1 -0
- package/dist/web/assets/pica-lghYzniR.js +2 -0
- package/dist/web/assets/pie-LRSECV5Y-CtaLKxkL.js +1 -0
- package/dist/web/assets/pieDiagram-4H26LBE5-KQxiMI7y.js +30 -0
- package/dist/web/assets/pl-PL-T2D74RX3-BYDGKTrw.js +9 -0
- package/dist/web/assets/pt-BR-5N22H2LF-DiLHA1Fv.js +9 -0
- package/dist/web/assets/pt-PT-UZXXM6DQ-DO4nqrjh.js +9 -0
- package/dist/web/assets/quadrantDiagram-W4KKPZXB-DYnhMBii.js +7 -0
- package/dist/web/assets/radar-GUYGQ44K-BWVL_5jd.js +1 -0
- package/dist/web/assets/requirementDiagram-4Y6WPE33-CLSyCDmb.js +84 -0
- package/dist/web/assets/ro-RO-JPDTUUEW-CkArAo01.js +11 -0
- package/dist/web/assets/rough.esm-CSKSodPl.js +1 -0
- package/dist/web/assets/roundRect-D01gJrlt.js +1 -0
- package/dist/web/assets/ru-RU-B4JR7IUQ-CF7qZR2L.js +9 -0
- package/dist/web/assets/sankeyDiagram-5OEKKPKP-fCrXqVCu.js +40 -0
- package/dist/web/assets/sequenceDiagram-3UESZ5HK-Ibg1UsPm.js +162 -0
- package/dist/web/assets/si-LK-N5RQ5JYF-SlyZ_B_5.js +1 -0
- package/dist/web/assets/sk-SK-C5VTKIMK-B59JZXsV.js +6 -0
- package/dist/web/assets/sl-SI-NN7IZMDC-CkVIpRnH.js +6 -0
- package/dist/web/assets/src-Dc-yDLup.js +1 -0
- package/dist/web/assets/stateDiagram-AJRCARHV-Cg6ervwo.js +1 -0
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-Z9e_4KHc.js +1 -0
- package/dist/web/assets/subset-shared.chunk-CnjPFGnW.js +1 -0
- package/dist/web/assets/subset-worker.chunk-DN4FBbFb.js +1 -0
- package/dist/web/assets/sv-SE-XGPEYMSR-BwnaFVSC.js +10 -0
- package/dist/web/assets/ta-IN-2NMHFXQM-Digwj7d-.js +9 -0
- package/dist/web/assets/th-TH-HPSO5L25-Ck3FgDpQ.js +2 -0
- package/dist/web/assets/timeline-definition-PNZ67QCA-Sxfm8qnw.js +120 -0
- package/dist/web/assets/tr-TR-DEFEU3FU-CZntbglt.js +7 -0
- package/dist/web/assets/treeView-BLDUP644-Cx8t5kj4.js +1 -0
- package/dist/web/assets/treemap-LRROVOQU-Dfh_IQDp.js +1 -0
- package/dist/web/assets/uk-UA-QMV73CPH-B0wjKowt.js +6 -0
- package/dist/web/assets/vennDiagram-CIIHVFJN-BMEOJ0gl.js +34 -0
- package/dist/web/assets/vi-VN-M7AON7JQ-Dj0BUYxm.js +5 -0
- package/dist/web/assets/wardley-L42UT6IY-EJTnFNq7.js +1 -0
- package/dist/web/assets/wardleyDiagram-YWT4CUSO-BJjdV56L.js +78 -0
- package/dist/web/assets/xychartDiagram-2RQKCTM6-CBQ88pV0.js +7 -0
- package/dist/web/assets/zh-CN-LNUGB5OW-K1_YaWy1.js +10 -0
- package/dist/web/assets/zh-HK-E62DVLB3-DCU_gXiJ.js +1 -0
- package/dist/web/assets/zh-TW-RAJ6MFWO-1ApXhCfP.js +9 -0
- package/dist/web/index.html +13 -0
- package/package.json +96 -0
|
@@ -0,0 +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"]}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import"./index-Do_WCY2x.js";var e={paste:`لصق`,pasteAsPlaintext:`اللصق كنص عادي`,pasteCharts:`لصق الرسوم البيانية`,selectAll:`تحديد الكل`,multiSelect:`إضافة عنصر للتحديد`,moveCanvas:`نقل لوح الرسم`,cut:`قص`,copy:`نسخ`,copyAsPng:`نسخ إلى الحافظة بصيغة PNG`,copyAsSvg:`نسخ إلى الحافظة بصيغة SVG`,copyText:`نسخ إلى الحافظة كنص`,copySource:``,convertToCode:``,bringForward:`جلب للأمام`,sendToBack:`أرسل للخلف`,bringToFront:`أحضر للأمام`,sendBackward:`أرسل للخلف`,delete:`حذف`,copyStyles:`نسخ الأنماط`,pasteStyles:`لصق الأنماط`,stroke:`الخط`,background:`الخلفية`,fill:`التعبئة`,strokeWidth:`سُمك الخط`,strokeStyle:`نمط الخط`,strokeStyle_solid:`متصل`,strokeStyle_dashed:`متقطع`,strokeStyle_dotted:`منقط`,sloppiness:`الإمالة`,opacity:`الشفافية`,textAlign:`محاذاة النص`,edges:`الحواف`,sharp:`حادة`,round:`دائرية`,arrowheads:`رؤوس الأسهم`,arrowhead_none:`لا شيء`,arrowhead_arrow:`سهم`,arrowhead_bar:`شريط`,arrowhead_circle:``,arrowhead_circle_outline:``,arrowhead_triangle:`مثلث`,arrowhead_triangle_outline:``,arrowhead_diamond:``,arrowhead_diamond_outline:``,fontSize:`حجم الخط`,fontFamily:`نوع الخط`,addWatermark:`إضافة "مصنوعة بواسطة Excalidraw"`,handDrawn:`رسم باليد`,normal:`عادي`,code:`رمز`,small:`صغير`,medium:`متوسط`,large:`كبير`,veryLarge:`كبير جدا`,solid:`كامل`,hachure:`خطوط`,zigzag:`متعرج`,crossHatch:`خطوط متقطعة`,thin:`نحيف`,bold:`داكن`,left:`الـيسار`,center:`وسط`,right:`يمين`,extraBold:`عريض`,architect:`معماري`,artist:`رسام`,cartoonist:`كرتوني`,fileTitle:`إسم الملف`,colorPicker:`منتقي اللون`,canvasColors:`تستخدم على القماش`,canvasBackground:`خلفية اللوحة`,drawingCanvas:`لوحة الرسم`,layers:`الطبقات`,actions:`الإجراءات`,language:`اللغة`,liveCollaboration:`التعاون المباشر...`,duplicateSelection:`تكرار`,untitled:`غير معنون`,name:`الاسم`,yourName:`اسمك`,madeWithExcalidraw:`مصنوعة بواسطة Excalidraw`,group:`تحديد مجموعة`,ungroup:`إلغاء تحديد مجموعة`,collaborators:`المتعاونون`,showGrid:`إظهار الشبكة`,addToLibrary:`أضف إلى المكتبة`,removeFromLibrary:`حذف من المكتبة`,libraryLoadingMessage:`جارٍ تحميل المكتبة…`,libraries:`تصفح المكتبات`,loadingScene:`جاري تحميل المشهد…`,align:`محاذاة`,alignTop:`محاذاة إلى اﻷعلى`,alignBottom:`محاذاة إلى اﻷسفل`,alignLeft:`محاذاة إلى اليسار`,alignRight:`محاذاة إلى اليمين`,centerVertically:`توسيط عمودي`,centerHorizontally:`توسيط أفقي`,distributeHorizontally:`التوزيع الأفقي`,distributeVertically:`التوزيع عمودياً`,flipHorizontal:`قلب عامودي`,flipVertical:`قلب أفقي`,viewMode:`نمط العرض`,share:`مشاركة`,showStroke:`إظهار منتقي لون الخط`,showBackground:`إظهار منتقي لون الخلفية`,toggleTheme:`غير النمط`,personalLib:`المكتبة الشخصية`,excalidrawLib:`مكتبتنا`,decreaseFontSize:`تصغير حجم الخط`,increaseFontSize:`تكبير حجم الخط`,unbindText:`فك ربط النص`,bindText:`ربط النص بالحاوية`,createContainerFromText:`نص مغلف في حاوية`,link:{edit:`تعديل الرابط`,editEmbed:`تحرير الرابط وإدراجه`,create:`إنشاء رابط`,createEmbed:`إنشاء رابط و إدراجه`,label:`رابط`,labelEmbed:`رابط و إدراج`,empty:`لم يتم تعيين رابط`},lineEditor:{edit:`تحرير السطر`,exit:`الخروج من المُحرر`},elementLock:{lock:`قفل`,unlock:`فتح`,lockAll:`قفل الكل`,unlockAll:`فتح الكل`},statusPublished:`نُشر`,sidebarLock:`إبقاء الشريط الجانبي مفتوح`,selectAllElementsInFrame:`تحديد جميع العناصر في الإطار`,removeAllElementsFromFrame:`إزالة جميع العناصر من الإطار`,eyeDropper:`اختيار اللون من القماش`,textToDiagram:``,prompt:``},t={noItems:`لا توجد عناصر أضيفت بعد...`,hint_emptyLibrary:`حدد عنصر على القماش لإضافته هنا، أو تثبيت مكتبة من المستودع العام أدناه.`,hint_emptyPrivateLibrary:`حدد عنصر على القماش لإضافته هنا.`},n={clearReset:`إعادة تعيين اللوحة`,exportJSON:`صدر الملف`,exportImage:`تصدير الصورة...`,export:`حفظ إلى...`,copyToClipboard:`نسخ إلى الحافظة`,save:`احفظ للملف الحالي`,saveAs:`حفظ كـ`,load:`فتح`,getShareableLink:`احصل على رابط المشاركة`,close:`غلق`,selectLanguage:`اختر اللغة`,scrollBackToContent:`الرجوع إلى المحتوى`,zoomIn:`تكبير`,zoomOut:`تصغير`,resetZoom:`إعادة تعيين الشاشة`,menu:`القائمة`,done:`تم`,edit:`تعديل`,undo:`تراجع`,redo:`إعادة تنفيذ`,resetLibrary:`إعادة ضبط المكتبة`,createNewRoom:`إنشاء غرفة جديدة`,fullScreen:`شاشة كاملة`,darkMode:`الوضع المظلم`,lightMode:`الوضع المضيء`,zenMode:`وضع التأمل`,objectsSnapMode:`التقط إلى العناصر`,exitZenMode:`إلغاء الوضع الليلى`,cancel:`إلغاء`,clear:`مسح`,remove:`إزالة`,embed:`تبديل الإدراج`,publishLibrary:`انشر`,submit:`أرسل`,confirm:`تأكيد`,embeddableInteractionButton:`اضغط للتفاعل`},r={clearReset:`هذا سيُزيل كامل اللوحة. هل أنت متأكد؟`,couldNotCreateShareableLink:`تعذر إنشاء رابطة المشاركة.`,couldNotCreateShareableLinkTooBig:`تعذر إنشاء رابط قابل للمشاركة: المشهد كبير جدًا`,couldNotLoadInvalidFile:`تعذر التحميل، الملف غير صالح`,importBackendFailed:`فشل الاستيراد من الخادوم.`,cannotExportEmptyCanvas:`لا يمكن تصدير لوحة فارغة.`,couldNotCopyToClipboard:`تعذر النسخ إلى الحافظة.`,decryptFailed:`تعذر فك تشفير البيانات.`,uploadedSecurly:`تم تأمين التحميل بتشفير النهاية إلى النهاية، مما يعني أن خادوم Excalidraw والأطراف الثالثة لا يمكنها قراءة المحتوى.`,loadSceneOverridePrompt:`تحميل الرسم الخارجي سيحل محل المحتوى الموجود لديك. هل ترغب في المتابعة؟`,collabStopOverridePrompt:`إيقاف الجلسة سيؤدي إلى الكتابة فوق رسومك السابقة المخزنة داخليا. هل أنت متأكد؟
|
|
2
|
+
|
|
3
|
+
(إذا كنت ترغب في الاحتفاظ برسمك المخزن داخليا، ببساطة أغلق علامة تبويب المتصفح بدلاً من ذلك.)`,errorAddingToLibrary:`تعذر إضافة العنصر للمكتبة`,errorRemovingFromLibrary:`تعذر إزالة العنصر من المكتبة`,confirmAddLibrary:`هذا سيضيف {{numShapes}} شكل إلى مكتبتك. هل أنت متأكد؟`,imageDoesNotContainScene:`يبدو أن هذه الصورة لا تحتوي على أي بيانات مشهد. هل قمت بتمكين تضمين المشهد أثناء التصدير؟`,cannotRestoreFromImage:`تعذر استعادة المشهد من ملف الصورة`,invalidSceneUrl:`تعذر استيراد المشهد من عنوان URL المتوفر. إما أنها مشوهة، أو لا تحتوي على بيانات Excalidraw JSON صالحة.`,resetLibrary:`هذا سوف يمسح مكتبتك. هل أنت متأكد؟`,removeItemsFromsLibrary:`حذف {{count}} عنصر (عناصر) من المكتبة؟`,invalidEncryptionKey:`مفتاح التشفير يجب أن يكون من 22 حرفاً. التعاون المباشر معطل.`,collabOfflineWarning:`لا يوجد اتصال بالانترنت.
|
|
4
|
+
لن يتم حفظ التغييرات التي قمت بها!`},i={unsupportedFileType:`نوع الملف غير مدعوم.`,imageInsertError:`تعذر إدراج الصورة. حاول مرة أخرى لاحقاً...`,fileTooBig:`الملف كبير جداً. الحد الأقصى المسموح به للحجم هو {{maxSize}}.`,svgImageInsertError:`تعذر إدراج صورة SVG. يبدو أن ترميز SVG غير صحيح.`,failedToFetchImage:``,invalidSVGString:`SVG غير صالح.`,cannotResolveCollabServer:`تعذر الاتصال بخادم التعاون. الرجاء إعادة تحميل الصفحة والمحاولة مرة أخرى.`,importLibraryError:`تعذر تحميل المكتبة`,collabSaveFailed:`تعذر الحفظ في قاعدة البيانات. إذا استمرت المشاكل، يفضل أن تحفظ ملفك محليا كي لا تفقد عملك.`,collabSaveFailed_sizeExceeded:`تعذر الحفظ في قاعدة البيانات، يبدو أن القماش كبير للغاية، يفضّل حفظ الملف محليا كي لا تفقد عملك.`,imageToolNotSupported:``,brave_measure_text_error:{line1:`يبدو أنك تستخدم متصفح Brave مع إعداد <bold>حظر صارم لتتبع البصمة</bold>.`,line2:`قد يؤدي هذا إلى كسر <bold>عناصر النص</bold> في الرسومات الخاصة بك.`,line3:`من المستحسن إلغاء تفعيل هذا الإعداد. يمكنك اتباع <link>هذه الخطوات</link> لفعل ذلك.`,line4:`إذا لم يصلح تعطيل هذا الإعداد طريقة عرض النصوص، الرجاء كتابة <issueLink>بلاغ</issueLink> على حسابنا في GitHub، أو راسلنا على <discordLink>Discord</discordLink>`},libraryElementTypeError:{embeddable:`لا يمكن إضافة العناصر القابلة للتضمين في المكتبة.`,iframe:``,image:`سوف يتم دعم إضافة صور إلى المكتبة قريباً!`},asyncPasteFailedOnRead:``,asyncPasteFailedOnParse:``,copyToSystemClipboardFailed:``},a={selection:`تحديد`,image:`إدراج صورة`,rectangle:`مستطيل`,diamond:`مضلع`,ellipse:`دائرة`,arrow:`سهم`,line:`خط`,freedraw:`رسم`,text:`نص`,library:`مكتبة`,lock:`الحفاظ على أداة التحديد نشطة بعد الرسم`,penMode:`وضع القلم - امنع اللمس`,link:`إضافة/تحديث الرابط للشكل المحدد`,eraser:`ممحاة`,frame:`أداة الإطار`,magicframe:``,embeddable:`تضمين ويب`,laser:`مؤشر ليزر`,hand:`يد (أداة الإزاحة)`,extraTools:`المزيد من أﻷدوات`,mermaidToExcalidraw:``,magicSettings:``},o={canvasActions:`إجراءات اللوحة`,selectedShapeActions:`إجراءات الشكل المحدد`,shapes:`الأشكال`},s={canvasPanning:`لتحريك القماش، اضغط على عجلة الفأرة أو مفتاح المسافة أثناء السحب، أو استخدم أداة اليد`,linearElement:`انقر لبدء نقاط متعددة، اسحب لخط واحد`,freeDraw:`انقر واسحب، افرج عند الانتهاء`,text:`نصيحة: يمكنك أيضًا إضافة نص بالنقر المزدوج في أي مكان بأداة الاختيار`,embeddable:`اضغط مع السحب لإنشاء موقع ويب مضمّن`,text_selected:`انقر نقراً مزدوجاً أو اضغط ادخال لتعديل النص`,text_editing:`اضغط على Esc أو (Ctrl أو Cmd) + Enter لإنهاء التعديل`,linearElementMulti:`انقر فوق النقطة الأخيرة أو اضغط على Esc أو Enter للإنهاء`,lockAngle:`يمكنك تقييد الزاوية بالضغط على SHIFT`,resize:`يمكنك تقييد النسب بالضغط على SHIFT أثناء تغيير الحجم،
|
|
5
|
+
اضغط على ALT لتغيير الحجم من المركز`,resizeImage:`يمكنك تغيير الحجم بحرية بالضغط بأستمرار على SHIFT،
|
|
6
|
+
اضغط بأستمرار على ALT أيضا لتغيير الحجم من المركز`,rotate:`يمكنك تقييد الزوايا من خلال الضغط على SHIFT أثناء الدوران`,lineEditor_info:`اضغط على مفتاح (Ctrl أو Cmd) و انقر بشكل مزدوج، أو اضغط على مفتاحي (Ctrl أو Cmd) و (Enter) لتعديل النقاط`,lineEditor_pointSelected:`اضغط على حذف لإزالة النقطة (النِّقَاط)، Ctrl/Cmd+D للتكرار، أو اسحب للانتقال`,lineEditor_nothingSelected:`اختر نقطة لتعديلها (اضغط على SHIFT لتحديد عدة نِقَاط),
|
|
7
|
+
أو اضغط على ALT و انقر بالفأرة لإضافة نِقَاط جديدة`,placeImage:`انقر لوضع الصورة، أو انقر واسحب لتعيين حجمها يدوياً`,publishLibrary:`نشر مكتبتك`,bindTextToElement:`اضغط على إدخال لإضافة نص`,deepBoxSelect:`اضغط على Ctrl\\Cmd للاختيار العميق، ولمنع السحب`,eraserRevert:`اضغط على Alt لاستعادة العناصر المعلَّمة للحذف`,firefox_clipboard_write:`يمكن على الأرجح تمكين هذه الميزة عن طريق تعيين علم "dom.events.asyncClipboard.clipboardItem" إلى "true". لتغيير أعلام المتصفح في Firefox، قم بزيارة صفحة "about:config".`,disableSnapping:`اضغط على Ctrl أو Cmd لتعطيل الالتقاط`},c={cannotShowPreview:`تعذر عرض المعاينة`,canvasTooBig:`قد تكون اللوحة كبيرة جداً.`,canvasTooBigTip:`نصيحة: حاول تحريك العناصر البعيدة بشكل أقرب قليلاً.`},l={headingMain:`حدث خطأ. حاول <button>تحديث الصفحة</button>.`,clearCanvasMessage:`إذا لم تعمل إعادة التحميل، حاول مرة أخرى `,clearCanvasCaveat:` هذا سيؤدي إلى فقدان العمل `,trackedToSentry:`تم تتبع الخطأ في المعرف {{eventId}} على نظامنا.`,openIssueMessage:`حرصنا على عدم إضافة معلومات المشهد في بلاغ الخطأ. في حال كون مشهدك لا يحمل أي معلومات خاصة نرجو المتابعة على <button>نظام تتبع الأخطاء</button>. نرجو إضافة المعلومات أدناه بنسخها ولصقها في محتوى البلاغ على GitHub.`,sceneContent:`محتوى المشهد:`},u={desc_intro:`يمكنك دعوة الآخرين لمشاركتك نفس الجلسة التي تعمل عليها.`,desc_privacy:`لا تقلق، الجلسة تستخدم التشفير من النهاية إلى النهاية، لذلك فإن أي شيء ترسمه سيبقى خاصاً. لن يتمكن حتى الخادوم الخاص بنا من رؤية ما توصلت إليه.`,button_startSession:`بدء الجلسة`,button_stopSession:`إيقاف الجلسة`,desc_inProgressIntro:`تجري الآن المشاركة الحية.`,desc_shareLink:`شارك هذا الرابط مع أي شخص تريده أن يشاركك الجلسة:`,desc_exitSession:`إيقاف الجلسة سيؤدي إلى قطع الاتصال الخاص بك من الغرفة، ولكن ستتمكن من مواصلة العمل مع المشهد، محليا. لاحظ أن هذا لن يؤثر على الأشخاص الآخرين، و سيظلون قادرين على التعاون في إصدارهم.`,shareTitle:`الانضمام إلى جلسة تعاون حية على Excalidraw`},d={title:`خطأ`},f={disk_title:`حفظ الملف للجهاز`,disk_details:`تصدير بيانات المشهد إلى ملف يمكنك الاستيراد منه لاحقاً.`,disk_button:`إحفظ لملف`,link_title:`رابط قابل للمشاركة`,link_details:`صدر الملف للمشاهدة فقط.`,link_button:`التصدير كرابط`,excalidrawplus_description:`حفظ المشهد إلى مساحة العمل +Excalidraw الخاصة بك.`,excalidrawplus_button:`تصدير`,excalidrawplus_exportError:`تعذر التصدير إلى +Excalidraw في الوقت الحالي...`},p={blog:`اقرأ مدونتنا`,click:`انقر`,deepSelect:`تحديد عميق`,deepBoxSelect:`تحديد عميق داخل المربع، ومنع السحب`,curvedArrow:`سهم مائل`,curvedLine:`خط مائل`,documentation:`دليل الاستخدام`,doubleClick:`انقر مرتين`,drag:`اسحب`,editor:`المحرر`,editLineArrowPoints:`تحرير سطر/نقاط سهم`,editText:`تعديل النص / إضافة تسمية`,github:`عثرت على مشكلة؟ إرسال`,howto:`اتبع التعليمات`,or:`أو`,preventBinding:`منع ارتبط السهم`,tools:`الأدوات`,shortcuts:`اختصارات لوحة المفاتيح`,textFinish:`إنهاء التعديل (محرر النص)`,textNewLine:`أضف سطر جديد (محرر نص)`,title:`المساعدة`,view:`عرض`,zoomToFit:`تكبير للملائمة`,zoomToSelection:`تكبير للعنصر المحدد`,toggleElementLock:`إغلاق/فتح المحدد`,movePageUpDown:`نقل الصفحة أعلى/أسفل`,movePageLeftRight:`نقل الصفحة يسار/يمين`},m={title:`مسح اللوحة`},h={title:`نشر المكتبة`,itemName:`إسم العنصر`,authorName:`إسم المؤلف`,githubUsername:`اسم المستخدم في جيت هب`,twitterUsername:`اسم المستخدم في تويتر`,libraryName:`اسم المكتبة`,libraryDesc:`وصف المكتبة`,website:`الموقع`,placeholder:{authorName:`اسمك أو اسم المستخدم`,libraryName:`اسم مكتبتك`,libraryDesc:`وصف مكتبتك لمساعدة الناس على فهم استخدامها`,githubHandle:`معالج GitHub (اختياري)، حتى تتمكن من تحرير المكتبة عند إرسالها للمراجعة`,twitterHandle:`اسم مستخدم تويتر (اختياري)، حتى نعرف من الذي سيتم الإشارة إليه عند الترويج عبر تويتر`,website:`رابط إلى موقعك الشخصي أو في مكان آخر (اختياري)`},errors:{required:`مطلوب`,website:`أدخل عنوان URL صالح`},noteDescription:`تقديم مكتبتك لتضمينها في مستودع المكتبة العامة <link></link> لأشخاص آخرين لاستخدامها في رسومهم.`,noteGuidelines:`تحتاج المكتبة إلى الموافقة أولا. يرجى قراءة <link>المعايير</link> قبل تقديمها. سوف تحتاج إلى حساب GitHub للتواصل وإجراء التغييرات عند الطلب، ولكن ليس مطلوبا بشكل صارم.`,noteLicense:`تقديمك يعني موافقتك على نشر المكتبة المقدمة تحت <link>MIT ترخيص</link>، ما يعني أن لأي أحد الحق في استخدامها دون قيود.`,noteItems:`يجب أن يكون لكل عنصر مكتبة اسمه الخاص حتى يكون قابلاً للتصفية. سيتم تضمين عناصر المكتبة التالية:`,atleastOneLibItem:`يرجى تحديد عنصر مكتبة واحد على الأقل للبدء`,republishWarning:`ملاحظة: بعض العناصر المحددة معينة على أنه نشرها أو تقديمها من قبل. يجب عليك فقط إعادة إرسال العناصر عند تحديث مكتبة موجودة أو إرسالها.`},g={title:`تم إرسال المكتبة`,content:`شكرا لك {{authorName}}. لقد تم إرسال مكتبتك للمراجعة. يمكنك تتبع الحالة`},_={resetLibrary:`إعادة ضبط المكتبة`,removeItemsFromLib:`إزالة العناصر المحددة من المكتبة`},v={header:`تصدير الصورة`,label:{withBackground:`الخلفية`,onlySelected:`المحدد فقط`,darkMode:`الوضع الداكن`,embedScene:`تضمين المشهد`,scale:`الحجم`,padding:`الهوامش`},tooltip:{embedScene:`سيتم حفظ بيانات المشهد في ملف PNG/SVG المصدّر بحيث يمكن استعادة المشهد منه.
|
|
8
|
+
سيزيد حجم الملف المصدر.`},title:{exportToPng:`تصدير بصيغة PNG`,exportToSvg:`تصدير بصيغة SVG`,copyPngToClipboard:`نسخ الـ PNG إلى الحافظة`},button:{exportToPng:`PNG`,exportToSvg:`SVG`,copyPngToClipboard:`نسخ إلى الحافظة`}},y={tooltip:`رسوماتك مشفرة من النهاية إلى النهاية حتى أن خوادم Excalidraw لن تراها أبدا.`,link:`مشاركة المدونة في التشفير من النهاية إلى النهاية في Excalidraw`},b={angle:`الزاوية`,element:`عنصر`,elements:`العناصر`,height:`الارتفاع`,scene:`المشهد`,selected:`المحدد`,storage:`التخزين`,title:`إحصائيات للمهووسين`,total:`المجموع`,version:`الإصدار`,versionCopy:`انقر للنسخ`,versionNotAvailable:`الإصدار غير متوفر`,width:`العرض`},x={addedToLibrary:`تمت الاضافة الى المكتبة!`,copyStyles:`نسخت الانماط.`,copyToClipboard:`نسخ إلى الحافظة.`,copyToClipboardAsPng:`تم نسخ {{exportSelection}} إلى الحافظة بصيغة PNG
|
|
9
|
+
({{exportColorScheme}})`,fileSaved:`تم حفظ الملف.`,fileSavedToFilename:`حفظ باسم {filename}`,canvas:`لوحة الرسم`,selection:`العنصر المحدد`,pasteAsSingleElement:`استخدم {{shortcut}} للصق كعنصر واحد،
|
|
10
|
+
أو لصق في محرر نص موجود`,unableToEmbed:`تضمين هذا الرابط غير مسموح حاليًا. افتح بلاغاً على GitHub لطلب عنوان Url القائمة البيضاء`,unrecognizedLinkFormat:`الرابط الذي ضمنته لا يتطابق مع التنسيق المتوقع. الرجاء محاولة لصق النص 'المضمن' المُزوَد من موقع المصدر`},S={transparent:`شفاف`,black:`أسود`,white:`أبيض`,red:`أحمر`,pink:`وردي`,grape:`عنبي`,violet:`بنفسجي`,gray:`رمادي`,blue:`أزرق`,cyan:`سماوي`,teal:`أزرق مخضر`,green:`أخضر`,yellow:`أصفر`,orange:`برتقالي`,bronze:`برونزي`},C={app:{center_heading:`جميع بياناتك محفوظة محليا في المتصفح الخاص بك.`,center_heading_plus:`هل تريد الذهاب إلى Excalidraw+ بدلاً من ذلك؟`,menuHint:`التصدير والتفضيلات واللغات ...`},defaults:{menuHint:`التصدير والتفضيلات وغيرها...`,center_heading:`الرسم البياني التصويري. بشكل مبسط.`,toolbarHint:`اختر أداة و ابدأ الرسم!`,helpHint:`الاختصارات و المساعدة`}},w={mostUsedCustomColors:`الألوان المخصصة الأكثر استخداما`,colors:`الألوان`,shades:`الدرجات`,hexCode:`رمز Hex`,noShades:`لا تتوفر درجات لهذا اللون`},T={action:{exportToImage:{title:`تصدير كصورة`,button:`تصدير كصورة`,description:`تصدير بيانات المشهد إلى ملف يمكنك الاستيراد منه لاحقاً.`},saveToDisk:{title:`حفظ الملف للجهاز`,button:`حفظ الملف للجهاز`,description:`تصدير بيانات المشهد إلى ملف يمكنك الاستيراد منه لاحقاً.`},excalidrawPlus:{title:`Excalidraw+`,button:`تصدير إلى Excalidraw+`,description:`حفظ المشهد إلى مساحة العمل +Excalidraw الخاصة بك.`}},modal:{loadFromFile:{title:`تحميل من ملف`,button:`تحميل من ملف`,description:`سيتم التحميل من الملف <bold>استبدال المحتوى الموجود</bold>.<br></br>يمكنك النسخ الاحتياطي لرسمك أولاً باستخدام أحد الخيارات أدناه.`},shareableLink:{title:`تحميل من رابط`,button:`استبدال محتواي`,description:`سيتسبب تحميل رسمة خارجية <bold>باستبدال محتواك الموجود حالياً</bold>.<br></br>بإمكانك إجراء النسخ الاحتياطي لرسمتك الحالية باستخدام أحد الخيارات أدناه.`}}},E={title:``,button:``,description:``,syntax:``,preview:``},D={labels:e,library:t,buttons:n,alerts:r,errors:i,toolBar:a,headings:o,hints:s,canvasError:c,errorSplash:l,roomDialog:u,errorDialog:d,exportDialog:f,helpDialog:p,clearCanvasDialog:m,publishDialog:h,publishSuccessDialog:g,confirmDialog:_,imageExportDialog:v,encrypted:y,stats:b,toast:x,colors:S,welcomeScreen:C,colorPicker:w,overwriteConfirm:T,mermaid:E};export{r as alerts,n as buttons,c as canvasError,m as clearCanvasDialog,w as colorPicker,S as colors,_ as confirmDialog,D as default,y as encrypted,d as errorDialog,l as errorSplash,i as errors,f as exportDialog,o as headings,p as helpDialog,s as hints,v as imageExportDialog,e as labels,t as library,E as mermaid,T as overwriteConfirm,h as publishDialog,g as publishSuccessDialog,u as roomDialog,b as stats,x as toast,a as toolBar,C as welcomeScreen};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e,t}from"./path-BWPyau1x.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-CHteZrRU.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i)if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./chunk-NNHCCRGN-DlpIbxXb.js";import{x as e}from"./mermaid-parser.core-BxU7L1C-.js";export{e as createArchitectureServices};
|