From de1b1f1fce81da4bbf5ef30e1f2bf37285914326 Mon Sep 17 00:00:00 2001 From: Varun Date: Sat, 6 Jun 2026 09:27:11 +0530 Subject: [PATCH 1/6] chore(mcp): rename package to @vrun-design/openflowkit-mcp, publish to npm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Renamed the MCP server from the unpublished @openflowkit/mcp-server scope to @vrun-design/openflowkit-mcp, matching the already-published @vrun-design/openflowkit-core. Published 0.1.0 to npm so MCP clients can install via `npx -y @vrun-design/openflowkit-mcp`. Updated all install references: root README, docs-site MCP page, mcp-server README, and in-app MCPSettings.tsx. Local .mcp.json keeps the dist path for dev. No code/behavior change — string rename only. Co-Authored-By: Claude Opus 4.8 --- README.md | 8 ++++---- docs-site/src/content/docs/mcp-server.md | 8 ++++---- mcp-server/README.md | 10 +++++----- mcp-server/package.json | 2 +- src/components/SettingsModal/MCPSettings.tsx | 4 ++-- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index a76acc9..9e79848 100644 --- a/README.md +++ b/README.md @@ -271,14 +271,14 @@ On modern browsers (Chrome / Edge / Safari 16.4+ / Firefox 130+) OpenFlowKit enc ## 🪄 MCP Server — drive OpenFlowKit from Claude Desktop, Cursor, Windsurf -Point any MCP client at the [`@openflowkit/mcp-server`](mcp-server/) package and your AI assistant gains provider-free diagramming tools. The client already has an LLM, so OpenFlowKit MCP supplies local validation, codebase analysis, templates, icon lookup, and viewer links instead of asking for another provider key. +Point any MCP client at the [`@vrun-design/openflowkit-mcp`](mcp-server/) package and your AI assistant gains provider-free diagramming tools. The client already has an LLM, so OpenFlowKit MCP supplies local validation, codebase analysis, templates, icon lookup, and viewer links instead of asking for another provider key. ```json { "mcpServers": { "openflowkit": { "command": "npx", - "args": ["-y", "@openflowkit/mcp-server"] + "args": ["-y", "@vrun-design/openflowkit-mcp"] } } } @@ -338,7 +338,7 @@ Plus: smart alignment guides, snap-to-grid, multi-select, pages, layers, section Recently shipped (latest milestone): - ✅ **WebCodecs H.264 MP4 export** — faster-than-realtime, hardware-accelerated, deterministic -- ✅ **MCP server** — `@openflowkit/mcp-server` for Claude Desktop, Cursor, Windsurf, any MCP client +- ✅ **MCP server** — `@vrun-design/openflowkit-mcp` for Claude Desktop, Cursor, Windsurf, any MCP client - ✅ **Anchored layout** — pin nodes so auto-layout arranges around them - ✅ **Ollama provider** — fully offline diagramming, no API key, no cost - ✅ **AI self-correction loop** — bad DSL → AI sees its own output + parser error → returns corrected DSL @@ -408,7 +408,7 @@ No database. No secrets. No infrastructure. One folder, or one container. | State | Zustand | | Storage | IndexedDB — local-first, no backend | | Styling | Tailwind CSS | -| Agent surface | `@openflowkit/mcp-server` — Model Context Protocol stdio | +| Agent surface | `@vrun-design/openflowkit-mcp` — Model Context Protocol stdio | | Collaboration | WebRTC P2P (opt-in, off by default) | | i18n | react-i18next — 7 languages | | Testing | Vitest + Playwright | diff --git a/docs-site/src/content/docs/mcp-server.md b/docs-site/src/content/docs/mcp-server.md index 857d544..7593b55 100644 --- a/docs-site/src/content/docs/mcp-server.md +++ b/docs-site/src/content/docs/mcp-server.md @@ -6,20 +6,20 @@ description: Use the OpenFlowKit MCP server with Claude Desktop, Cursor, Windsur The OpenFlowKit MCP server gives AI clients diagramming skills without adding another AI provider. Claude Desktop, Cursor, Windsurf, and other MCP clients already have an LLM; OpenFlowKit supplies the local tools that make that model good at diagrams. -The package is `@openflowkit/mcp-server`. It runs locally over the standard MCP stdio transport. +The package is `@vrun-design/openflowkit-mcp`. It runs locally over the standard MCP stdio transport. ## Install and run Use it directly with `npx`: ```bash -npx -y @openflowkit/mcp-server +npx -y @vrun-design/openflowkit-mcp ``` Or install it globally: ```bash -npm install -g @openflowkit/mcp-server +npm install -g @vrun-design/openflowkit-mcp openflowkit-mcp ``` @@ -34,7 +34,7 @@ Add the server to your Claude Desktop config: "mcpServers": { "openflowkit": { "command": "npx", - "args": ["-y", "@openflowkit/mcp-server"] + "args": ["-y", "@vrun-design/openflowkit-mcp"] } } } diff --git a/mcp-server/README.md b/mcp-server/README.md index 451cac2..4b7f758 100644 --- a/mcp-server/README.md +++ b/mcp-server/README.md @@ -4,7 +4,7 @@ **Give Claude Desktop, Cursor, Windsurf, or any MCP client first-class diagramming tools.** -[![npm](https://img.shields.io/npm/v/@openflowkit/mcp-server?style=flat-square&color=f97316)](https://www.npmjs.com/package/@openflowkit/mcp-server) +[![npm](https://img.shields.io/npm/v/@vrun-design/openflowkit-mcp?style=flat-square&color=f97316)](https://www.npmjs.com/package/@vrun-design/openflowkit-mcp) [![MIT License](https://img.shields.io/badge/License-MIT-f97316.svg?style=flat-square)](https://github.com/Vrun-design/openflowkit/blob/main/LICENSE) [![Node 18+](https://img.shields.io/badge/Node-18%2B-339933.svg?style=flat-square)](https://nodejs.org/) @@ -41,10 +41,10 @@ Claude: reads openflowkit://docs/dsl-cheatsheet ```bash # No install required; npx fetches the latest published version -npx -y @openflowkit/mcp-server +npx -y @vrun-design/openflowkit-mcp # Or install globally -npm install -g @openflowkit/mcp-server +npm install -g @vrun-design/openflowkit-mcp openflowkit-mcp ``` @@ -64,7 +64,7 @@ Edit your Claude Desktop config: "mcpServers": { "openflowkit": { "command": "npx", - "args": ["-y", "@openflowkit/mcp-server"] + "args": ["-y", "@vrun-design/openflowkit-mcp"] } } } @@ -77,7 +77,7 @@ Restart Claude Desktop. You should see **openflowkit** in the tool picker. Point the client at the same command: - command: `npx` -- args: `["-y", "@openflowkit/mcp-server"]` +- args: `["-y", "@vrun-design/openflowkit-mcp"]` The server speaks the standard MCP stdio protocol. Client UIs differ, but the command shape is the same. diff --git a/mcp-server/package.json b/mcp-server/package.json index d9db00f..d3c80f8 100644 --- a/mcp-server/package.json +++ b/mcp-server/package.json @@ -1,5 +1,5 @@ { - "name": "@openflowkit/mcp-server", + "name": "@vrun-design/openflowkit-mcp", "version": "0.1.0", "description": "Provider-free Model Context Protocol server for OpenFlowKit — give Claude Desktop, Cursor, Windsurf, and other MCP clients first-class diagramming tools.", "keywords": [ diff --git a/src/components/SettingsModal/MCPSettings.tsx b/src/components/SettingsModal/MCPSettings.tsx index b71d51d..28787c5 100644 --- a/src/components/SettingsModal/MCPSettings.tsx +++ b/src/components/SettingsModal/MCPSettings.tsx @@ -71,7 +71,7 @@ function buildConfig(): string { mcpServers: { openflowkit: { command: 'npx', - args: ['-y', '@openflowkit/mcp-server'], + args: ['-y', '@vrun-design/openflowkit-mcp'], }, }, }, @@ -176,7 +176,7 @@ function StepRail({ export function MCPSettings(): React.ReactElement { const { t } = useTranslation(); const [client, setClient] = useState('claude'); - const installCmd = 'npx -y @openflowkit/mcp-server'; + const installCmd = 'npx -y @vrun-design/openflowkit-mcp'; const config = buildConfig(); const activeClient = CLIENTS.find((c) => c.id === client) ?? CLIENTS[0]; From 97323d2d33558ce05ccc115230a751bd5b4b4e0a Mon Sep 17 00:00:00 2001 From: Varun Date: Sat, 6 Jun 2026 09:31:57 +0530 Subject: [PATCH 2/6] chore(mcp): refresh lockfile for @vrun-design/openflowkit-mcp rename Co-Authored-By: Claude Opus 4.8 --- package-lock.json | 70 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 65 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 09120d3..9c2e1c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -94,7 +94,7 @@ } }, "mcp-server": { - "name": "@openflowkit/mcp-server", + "name": "@vrun-design/openflowkit-mcp", "version": "0.1.0", "license": "MIT", "dependencies": { @@ -2561,10 +2561,6 @@ "node": ">= 8" } }, - "node_modules/@openflowkit/mcp-server": { - "resolved": "mcp-server", - "link": true - }, "node_modules/@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", @@ -3881,6 +3877,66 @@ "node": ">=14.0.0" } }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.7.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.7.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { "version": "4.1.18", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", @@ -5503,6 +5559,10 @@ "path-browserify": "^1.0.1" } }, + "node_modules/@vrun-design/openflowkit-mcp": { + "resolved": "mcp-server", + "link": true + }, "node_modules/@vue/compiler-core": { "version": "3.5.28", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.28.tgz", From 4c6a27bfb98d19243bafb47091287d42583492de Mon Sep 17 00:00:00 2001 From: Varun Date: Sat, 6 Jun 2026 09:37:51 +0530 Subject: [PATCH 3/6] docs(mcp): reframe positioning from 'provider-free' to local-first 'Provider-free' described the MCP baseline (every server is), not a benefit. Reframe around the real value: local-first, no API key, no cloud round-trip, deterministic. Updated root README, docs-site MCP page, mcp-server README + package.json description. Co-Authored-By: Claude Opus 4.8 --- README.md | 4 ++-- docs-site/src/content/docs/mcp-server.md | 4 ++-- mcp-server/README.md | 2 +- mcp-server/package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 9e79848..beba84a 100644 --- a/README.md +++ b/README.md @@ -271,7 +271,7 @@ On modern browsers (Chrome / Edge / Safari 16.4+ / Firefox 130+) OpenFlowKit enc ## 🪄 MCP Server — drive OpenFlowKit from Claude Desktop, Cursor, Windsurf -Point any MCP client at the [`@vrun-design/openflowkit-mcp`](mcp-server/) package and your AI assistant gains provider-free diagramming tools. The client already has an LLM, so OpenFlowKit MCP supplies local validation, codebase analysis, templates, icon lookup, and viewer links instead of asking for another provider key. +Point any MCP client at the [`@vrun-design/openflowkit-mcp`](mcp-server/) package and your AI assistant gains local-first diagramming tools — no API key, no cloud round-trip. Your client already has an LLM, so OpenFlowKit MCP supplies deterministic local validation, codebase analysis, templates, icon lookup, and viewer links. ```json { @@ -286,7 +286,7 @@ Point any MCP client at the [`@vrun-design/openflowkit-mcp`](mcp-server/) packag Then ask Claude: *"Read the OpenFlowKit DSL cheatsheet, create a checkout flow with a promo-code branch and a Stripe webhook step, validate it, and create a viewer URL."* The DSL comes back in seconds and stays editable in OpenFlowKit. -- **8 provider-free tools** — validate DSL, create viewer URLs, analyze codebases, find icon slugs, fetch starter templates, and inspect capabilities +- **8 local-first tools** — validate DSL, create viewer URLs, analyze codebases, find icon slugs, fetch starter templates, and inspect capabilities (no API key, runs on your machine) - **5 resources** — DSL cheatsheet, template catalog, template bodies, full icon catalog, and per-provider icon catalogs - **3 prompts** — flowchart creation, Mermaid conversion, and codebase architecture, all using the client model - **Pure Node, zero infra cost** — runs on the user's machine, ships via npm diff --git a/docs-site/src/content/docs/mcp-server.md b/docs-site/src/content/docs/mcp-server.md index 7593b55..be5afae 100644 --- a/docs-site/src/content/docs/mcp-server.md +++ b/docs-site/src/content/docs/mcp-server.md @@ -4,7 +4,7 @@ title: MCP Server description: Use the OpenFlowKit MCP server with Claude Desktop, Cursor, Windsurf, and other MCP clients. --- -The OpenFlowKit MCP server gives AI clients diagramming skills without adding another AI provider. Claude Desktop, Cursor, Windsurf, and other MCP clients already have an LLM; OpenFlowKit supplies the local tools that make that model good at diagrams. +The OpenFlowKit MCP server gives AI clients diagramming skills that run local-first — on your machine, no API key, no cloud round-trip, deterministic output. Claude Desktop, Cursor, Windsurf, and other MCP clients already have an LLM; OpenFlowKit supplies the local tools that make that model good at diagrams. The package is `@vrun-design/openflowkit-mcp`. It runs locally over the standard MCP stdio transport. @@ -58,7 +58,7 @@ No API keys are required for MCP diagram generation. ## Tools -The current server exposes 8 provider-free tools: +The current server exposes 8 local-first tools (no API key, deterministic, run on your machine): | Tool | What it does | | --- | --- | diff --git a/mcp-server/README.md b/mcp-server/README.md index 4b7f758..74f25ea 100644 --- a/mcp-server/README.md +++ b/mcp-server/README.md @@ -12,7 +12,7 @@ --- -OpenFlowKit MCP is **provider-free by design**. Your MCP client already has an LLM; the server does not rent or proxy another one. +OpenFlowKit MCP is **local-first by design** — it runs on your machine over stdio with no API key and no cloud round-trip, and its tools return deterministic output. Your MCP client already has an LLM; this server just gives it diagram-specific tools. Instead, it gives the agent diagram-specific powers: diff --git a/mcp-server/package.json b/mcp-server/package.json index d3c80f8..ef83fa2 100644 --- a/mcp-server/package.json +++ b/mcp-server/package.json @@ -1,7 +1,7 @@ { "name": "@vrun-design/openflowkit-mcp", "version": "0.1.0", - "description": "Provider-free Model Context Protocol server for OpenFlowKit — give Claude Desktop, Cursor, Windsurf, and other MCP clients first-class diagramming tools.", + "description": "Local-first Model Context Protocol server for OpenFlowKit — deterministic diagramming tools (validate DSL, templates, icons, viewer links) for Claude Desktop, Cursor, Windsurf, and other MCP clients. No API key, no cloud round-trip.", "keywords": [ "mcp", "model-context-protocol", From fc917008b1b256f41c1f02b8dbd781273e152fdf Mon Sep 17 00:00:00 2001 From: Varun Date: Sat, 6 Jun 2026 09:40:36 +0530 Subject: [PATCH 4/6] feat(mcp): prep 0.1.1 for official MCP registry Add mcpName (io.github.vrun-design/openflowkit-mcp) + server.json for registry.modelcontextprotocol.io publishing. Bump to 0.1.1, sync version.ts. Replace server_info 'providerFree' flag with 'localFirst' to match the repositioning. Co-Authored-By: Claude Opus 4.8 --- mcp-server/package.json | 3 ++- mcp-server/server.json | 20 ++++++++++++++++++++ mcp-server/src/lib/version.ts | 2 +- mcp-server/src/tools/discovery.ts | 2 +- package-lock.json | 2 +- 5 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 mcp-server/server.json diff --git a/mcp-server/package.json b/mcp-server/package.json index ef83fa2..7617fd8 100644 --- a/mcp-server/package.json +++ b/mcp-server/package.json @@ -1,6 +1,7 @@ { "name": "@vrun-design/openflowkit-mcp", - "version": "0.1.0", + "version": "0.1.1", + "mcpName": "io.github.vrun-design/openflowkit-mcp", "description": "Local-first Model Context Protocol server for OpenFlowKit — deterministic diagramming tools (validate DSL, templates, icons, viewer links) for Claude Desktop, Cursor, Windsurf, and other MCP clients. No API key, no cloud round-trip.", "keywords": [ "mcp", diff --git a/mcp-server/server.json b/mcp-server/server.json new file mode 100644 index 0000000..eb4c114 --- /dev/null +++ b/mcp-server/server.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json", + "name": "io.github.vrun-design/openflowkit-mcp", + "description": "Local-first MCP server for OpenFlowKit — deterministic diagramming tools (validate DSL, templates, icons, viewer links) for Claude Desktop, Cursor, Windsurf, and other MCP clients. No API key, no cloud round-trip.", + "repository": { + "url": "https://github.com/Vrun-design/openflowkit", + "source": "github" + }, + "version": "0.1.1", + "packages": [ + { + "registryType": "npm", + "identifier": "@vrun-design/openflowkit-mcp", + "version": "0.1.1", + "transport": { + "type": "stdio" + } + } + ] +} diff --git a/mcp-server/src/lib/version.ts b/mcp-server/src/lib/version.ts index f5d5392..29251cb 100644 --- a/mcp-server/src/lib/version.ts +++ b/mcp-server/src/lib/version.ts @@ -1,4 +1,4 @@ // Single source of truth for the version reported during MCP initialization. // Bump together with package.json. -export const MCP_SERVER_VERSION = '0.1.0'; +export const MCP_SERVER_VERSION = '0.1.1'; export const MCP_SERVER_NAME = 'openflowkit'; diff --git a/mcp-server/src/tools/discovery.ts b/mcp-server/src/tools/discovery.ts index 1d78c83..1f293cf 100644 --- a/mcp-server/src/tools/discovery.ts +++ b/mcp-server/src/tools/discovery.ts @@ -56,7 +56,7 @@ export function registerDiscoveryTools(server: McpServer): void { { name: MCP_SERVER_NAME, version: MCP_SERVER_VERSION, - providerFree: true, + localFirst: true, tools: [ 'validate_openflow_dsl', 'analyze_codebase', diff --git a/package-lock.json b/package-lock.json index 9c2e1c7..8bfe55d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -95,7 +95,7 @@ }, "mcp-server": { "name": "@vrun-design/openflowkit-mcp", - "version": "0.1.0", + "version": "0.1.1", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.29.0", From a71056f57a7caf0685fcb82bd6c1ed0982aa46db Mon Sep 17 00:00:00 2001 From: Varun Date: Sat, 6 Jun 2026 09:49:31 +0530 Subject: [PATCH 5/6] =?UTF-8?q?fix(mcp):=200.1.2=20=E2=80=94=20capital-V?= =?UTF-8?q?=20namespace=20for=20registry=20ownership=20match?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GitHub identity is Vrun-design (capital V); registry grants io.github.Vrun-design/* and validates case-sensitively. Align server.json name + package.json mcpName to io.github.Vrun-design/openflowkit-mcp, bump to 0.1.2 so the published npm package carries the matching mcpName. Co-Authored-By: Claude Opus 4.8 --- mcp-server/package.json | 4 ++-- mcp-server/server.json | 8 ++++---- mcp-server/src/lib/version.ts | 2 +- package-lock.json | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/mcp-server/package.json b/mcp-server/package.json index 7617fd8..cdc230d 100644 --- a/mcp-server/package.json +++ b/mcp-server/package.json @@ -1,7 +1,7 @@ { "name": "@vrun-design/openflowkit-mcp", - "version": "0.1.1", - "mcpName": "io.github.vrun-design/openflowkit-mcp", + "version": "0.1.2", + "mcpName": "io.github.Vrun-design/openflowkit-mcp", "description": "Local-first Model Context Protocol server for OpenFlowKit — deterministic diagramming tools (validate DSL, templates, icons, viewer links) for Claude Desktop, Cursor, Windsurf, and other MCP clients. No API key, no cloud round-trip.", "keywords": [ "mcp", diff --git a/mcp-server/server.json b/mcp-server/server.json index eb4c114..100fb01 100644 --- a/mcp-server/server.json +++ b/mcp-server/server.json @@ -1,17 +1,17 @@ { "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json", - "name": "io.github.vrun-design/openflowkit-mcp", - "description": "Local-first MCP server for OpenFlowKit — deterministic diagramming tools (validate DSL, templates, icons, viewer links) for Claude Desktop, Cursor, Windsurf, and other MCP clients. No API key, no cloud round-trip.", + "name": "io.github.Vrun-design/openflowkit-mcp", + "description": "Local-first OpenFlowKit diagramming tools for Claude, Cursor, Windsurf & other MCP clients.", "repository": { "url": "https://github.com/Vrun-design/openflowkit", "source": "github" }, - "version": "0.1.1", + "version": "0.1.2", "packages": [ { "registryType": "npm", "identifier": "@vrun-design/openflowkit-mcp", - "version": "0.1.1", + "version": "0.1.2", "transport": { "type": "stdio" } diff --git a/mcp-server/src/lib/version.ts b/mcp-server/src/lib/version.ts index 29251cb..0b66c63 100644 --- a/mcp-server/src/lib/version.ts +++ b/mcp-server/src/lib/version.ts @@ -1,4 +1,4 @@ // Single source of truth for the version reported during MCP initialization. // Bump together with package.json. -export const MCP_SERVER_VERSION = '0.1.1'; +export const MCP_SERVER_VERSION = '0.1.2'; export const MCP_SERVER_NAME = 'openflowkit'; diff --git a/package-lock.json b/package-lock.json index 8bfe55d..1f5b7d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -95,7 +95,7 @@ }, "mcp-server": { "name": "@vrun-design/openflowkit-mcp", - "version": "0.1.1", + "version": "0.1.2", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.29.0", From f601bb89293b474cae6a84bba400e1a2531007a4 Mon Sep 17 00:00:00 2001 From: Varun Date: Sat, 6 Jun 2026 10:32:34 +0530 Subject: [PATCH 6/6] fix mcp viewer links and editor import --- .mcp.json | 8 + docs-site/src/content/docs/github-embed.md | 28 +-- mcp-server/src/lib/viewerUrl.ts | 7 +- mcp-server/tests/viewerUrl.test.ts | 2 +- public/locales/de/translation.json | 10 +- public/locales/en/translation.json | 10 +- public/locales/es/translation.json | 10 +- public/locales/fr/translation.json | 10 +- public/locales/ja/translation.json | 10 +- public/locales/tr/translation.json | 10 +- public/locales/zh/translation.json | 10 +- src/App.tsx | 27 ++- src/app/routeState.ts | 12 + src/components/DiagramViewer.tsx | 223 ++++++++++++------ src/components/HomePage.tsx | 5 +- src/components/SettingsModal/MCPSettings.tsx | 53 ++--- .../flow-editor/useFlowEditorScreenModel.ts | 30 ++- src/components/home/HomeMCPView.tsx | 30 +++ src/components/home/HomeSidebar.tsx | 10 +- src/components/home/MCPFlowVisual.tsx | 162 +++++++++++++ src/hooks/useFlowEditorActions.ts | 4 +- src/i18n/locales/de/translation.json | 10 +- src/i18n/locales/en/translation.json | 10 +- src/i18n/locales/es/translation.json | 10 +- src/i18n/locales/fr/translation.json | 10 +- src/i18n/locales/ja/translation.json | 10 +- src/i18n/locales/tr/translation.json | 10 +- src/i18n/locales/zh/translation.json | 10 +- src/services/viewerUrlCodec.test.ts | 12 + src/services/viewerUrlCodec.ts | 40 ++++ tsconfig.tsbuildinfo | 2 +- 31 files changed, 651 insertions(+), 144 deletions(-) create mode 100644 .mcp.json create mode 100644 src/components/home/HomeMCPView.tsx create mode 100644 src/components/home/MCPFlowVisual.tsx create mode 100644 src/services/viewerUrlCodec.test.ts create mode 100644 src/services/viewerUrlCodec.ts diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 0000000..ed6c5f9 --- /dev/null +++ b/.mcp.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "openflowkit": { + "command": "node", + "args": ["./mcp-server/dist/index.js"] + } + } +} diff --git a/docs-site/src/content/docs/github-embed.md b/docs-site/src/content/docs/github-embed.md index 4a9621c..3d02f6a 100644 --- a/docs-site/src/content/docs/github-embed.md +++ b/docs-site/src/content/docs/github-embed.md @@ -11,7 +11,7 @@ OpenFlowKit diagrams can be embedded in any GitHub README or Markdown file as in The `/view` route renders any OpenFlow DSL passed as a URL parameter. You encode your diagram as a URL-safe string and link to it from your README. ``` -https://openflowkit.dev/#/view?flow=BASE64_ENCODED_DSL +https://app.openflowkit.com/#/view?flow=~COMPRESSED_DSL ``` When someone clicks the link, they see the fully rendered, interactive diagram and can pan, zoom, and click **Open in Editor** to load it into the canvas for editing. @@ -40,30 +40,18 @@ client -> api |HTTP| api -> db |SQL| ``` -### 2. Encode it +### 2. Create a viewer URL -In the browser console, or any JavaScript environment: +The easiest path is to use the OpenFlowKit MCP server's `create_viewer_url` tool or the editor's **Share / Embed** action. Both create a compressed, URL-safe viewer link that opens on the app domain: -```js -const dsl = `flow: "My Architecture" -direction: LR - -[browser] client: Web App -[system] api: API Server -[system] db: PostgreSQL - -client -> api |HTTP| -api -> db |SQL|`; - -const encoded = btoa(encodeURIComponent(dsl)); -console.log(encoded); -// → paste this into the URL below +```text +https://app.openflowkit.com/#/view?flow=~... ``` ### 3. Embed in your README ```markdown -[![Architecture Diagram](https://openflowkit.dev/og-diagram.png)](https://openflowkit.dev/#/view?flow=PASTE_ENCODED_VALUE_HERE) +[![Architecture Diagram](https://openflowkit.com/og-diagram.png)](https://app.openflowkit.com/#/view?flow=PASTE_ENCODED_VALUE_HERE) ``` The outer image link makes GitHub show a clickable preview image. Replace `og-diagram.png` with a screenshot of your diagram for the best preview. @@ -71,7 +59,7 @@ The outer image link makes GitHub show a clickable preview image. Replace `og-di Or link directly without an image: ```markdown -[View Architecture Diagram →](https://openflowkit.dev/#/view?flow=PASTE_ENCODED_VALUE_HERE) +[View Architecture Diagram →](https://app.openflowkit.com/#/view?flow=PASTE_ENCODED_VALUE_HERE) ``` ## Updating diagrams @@ -82,7 +70,7 @@ For diagrams you want to iterate on frequently, store the raw DSL in a `.flow` f ```markdown -[View Architecture →](https://openflowkit.dev/#/view?flow=...) +[View Architecture →](https://app.openflowkit.com/#/view?flow=...) ``` ## Encoding helper diff --git a/mcp-server/src/lib/viewerUrl.ts b/mcp-server/src/lib/viewerUrl.ts index 0245f9f..7b38423 100644 --- a/mcp-server/src/lib/viewerUrl.ts +++ b/mcp-server/src/lib/viewerUrl.ts @@ -7,11 +7,12 @@ * when the prefix is absent, so old links keep working. * * Override the base origin with OPENFLOWKIT_APP_URL (e.g. http://localhost:5173 - * for local dev). Defaults to https://openflowkit.com. + * for local dev). Defaults to https://app.openflowkit.com. The app currently + * uses hash routing, so the viewer path must live after `#/`. */ import { deflate } from 'pako'; -const DEFAULT_APP_URL = 'https://openflowkit.com'; +const DEFAULT_APP_URL = 'https://app.openflowkit.com'; const PAKO_PREFIX = '~'; function getAppBaseUrl(): string { @@ -37,5 +38,5 @@ export function encodeDslForViewer(dsl: string): string { /** URL that opens the DSL in OpenFlowKit's read-only viewer. */ export function buildViewerUrl(dsl: string): string { - return `${getAppBaseUrl()}/view?flow=${encodeDslForViewer(dsl)}`; + return `${getAppBaseUrl()}/#/view?flow=${encodeDslForViewer(dsl)}`; } diff --git a/mcp-server/tests/viewerUrl.test.ts b/mcp-server/tests/viewerUrl.test.ts index 15ea1b5..580f4c1 100644 --- a/mcp-server/tests/viewerUrl.test.ts +++ b/mcp-server/tests/viewerUrl.test.ts @@ -6,7 +6,7 @@ describe('buildViewerUrl', () => { it('encodes DSL into the OpenFlowKit viewer URL with pako compression', () => { const dsl = 'flow: Hello\n[start] s\n[end] e\ns -> e'; const url = buildViewerUrl(dsl); - expect(url).toMatch(/^https:\/\/openflowkit\.com\/view\?flow=~/); + expect(url).toMatch(/^https:\/\/app\.openflowkit\.com\/#\/view\?flow=~/); const encoded = url.split('flow=')[1]!; expect(encoded.startsWith('~')).toBe(true); diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index 29ad49e..dd3b611 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -95,7 +95,8 @@ "loadJSON": "JSON laden", "playbackMode": "Wiedergabemodus", "privacyMessage": "Ihre Diagramme bleiben bei Ihnen und erreichen unsere Server nicht.", - "templates": "Vorlagen" + "templates": "Vorlagen", + "mcp": "MCP" }, "menu": { "file": "Datei", @@ -1482,5 +1483,12 @@ "testPromptHint": "In jeden verbundenen Client einfügen", "copyInstallPrompt": "Installations-Prompt kopieren", "copyTestPrompt": "Test-Prompt kopieren" + }, + "mcp": { + "pageTitle": "Connect AI tools", + "pageSubtitle": "Give any MCP client first-class diagramming tools. Local-first, no API key.", + "visualAlt": "Your AI client connects to the OpenFlowKit MCP server over stdio, which provides local diagramming tools.", + "visualClient": "Your AI client", + "visualCaption": "Local · stdio · no API key" } } diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 3d8da78..b0b7559 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -95,7 +95,8 @@ "loadJSON": "Load JSON", "playbackMode": "Playback Mode", "templates": "Templates", - "privacyMessage": "Your diagrams stay with you and do not reach our servers." + "privacyMessage": "Your diagrams stay with you and do not reach our servers.", + "mcp": "MCP" }, "menu": { "file": "File", @@ -1477,5 +1478,12 @@ "testPromptHint": "Paste into any connected client", "copyInstallPrompt": "Copy install prompt", "copyTestPrompt": "Copy test prompt" + }, + "mcp": { + "pageTitle": "Connect AI tools", + "pageSubtitle": "Give any MCP client first-class diagramming tools. Local-first, no API key.", + "visualAlt": "Your AI client connects to the OpenFlowKit MCP server over stdio, which provides local diagramming tools.", + "visualClient": "Your AI client", + "visualCaption": "Local · stdio · no API key" } } diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index 1aac052..160d573 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -95,7 +95,8 @@ "loadJSON": "Cargar JSON", "playbackMode": "Modo reproducción", "privacyMessage": "Sus diagramas permanecen con usted y no llegan a nuestros servidores.", - "templates": "Plantillas" + "templates": "Plantillas", + "mcp": "MCP" }, "menu": { "file": "Archivo", @@ -1482,5 +1483,12 @@ "testPromptHint": "Pega en cualquier cliente conectado", "copyInstallPrompt": "Copiar prompt de instalación", "copyTestPrompt": "Copiar prompt de prueba" + }, + "mcp": { + "pageTitle": "Connect AI tools", + "pageSubtitle": "Give any MCP client first-class diagramming tools. Local-first, no API key.", + "visualAlt": "Your AI client connects to the OpenFlowKit MCP server over stdio, which provides local diagramming tools.", + "visualClient": "Your AI client", + "visualCaption": "Local · stdio · no API key" } } diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index 1b7bdf3..2b2b240 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -95,7 +95,8 @@ "loadJSON": "Charger JSON", "playbackMode": "Mode lecture", "privacyMessage": "Vos diagrammes restent avec vous et n’atteignent pas nos serveurs.", - "templates": "Modèles" + "templates": "Modèles", + "mcp": "MCP" }, "menu": { "file": "Fichier", @@ -1482,5 +1483,12 @@ "testPromptHint": "Collez dans n’importe quel client connecté", "copyInstallPrompt": "Copier le prompt d’installation", "copyTestPrompt": "Copier le prompt de test" + }, + "mcp": { + "pageTitle": "Connect AI tools", + "pageSubtitle": "Give any MCP client first-class diagramming tools. Local-first, no API key.", + "visualAlt": "Your AI client connects to the OpenFlowKit MCP server over stdio, which provides local diagramming tools.", + "visualClient": "Your AI client", + "visualCaption": "Local · stdio · no API key" } } diff --git a/public/locales/ja/translation.json b/public/locales/ja/translation.json index 4ac576c..23d2622 100644 --- a/public/locales/ja/translation.json +++ b/public/locales/ja/translation.json @@ -95,7 +95,8 @@ "loadJSON": "JSONを読む", "playbackMode": "再生モード", "privacyMessage": "図はあなたの手元に残り、当社のサーバーには届きません。", - "templates": "テンプレート" + "templates": "テンプレート", + "mcp": "MCP" }, "menu": { "file": "ファイル", @@ -1482,5 +1483,12 @@ "testPromptHint": "接続済みの任意のクライアントに貼り付け", "copyInstallPrompt": "インストールプロンプトをコピー", "copyTestPrompt": "テストプロンプトをコピー" + }, + "mcp": { + "pageTitle": "Connect AI tools", + "pageSubtitle": "Give any MCP client first-class diagramming tools. Local-first, no API key.", + "visualAlt": "Your AI client connects to the OpenFlowKit MCP server over stdio, which provides local diagramming tools.", + "visualClient": "Your AI client", + "visualCaption": "Local · stdio · no API key" } } diff --git a/public/locales/tr/translation.json b/public/locales/tr/translation.json index 6a66307..8155085 100644 --- a/public/locales/tr/translation.json +++ b/public/locales/tr/translation.json @@ -95,7 +95,8 @@ "loadJSON": "JSON Yükle", "playbackMode": "Oynatma Modu", "privacyMessage": "Diyagramlarınız sizinle kalır ve sunucularımıza ulaşmaz.", - "templates": "Şablonlar" + "templates": "Şablonlar", + "mcp": "MCP" }, "menu": { "file": "Dosya", @@ -1482,5 +1483,12 @@ "testPromptHint": "Bağlı herhangi bir istemciye yapıştır", "copyInstallPrompt": "Kurulum promptunu kopyala", "copyTestPrompt": "Test promptunu kopyala" + }, + "mcp": { + "pageTitle": "Connect AI tools", + "pageSubtitle": "Give any MCP client first-class diagramming tools. Local-first, no API key.", + "visualAlt": "Your AI client connects to the OpenFlowKit MCP server over stdio, which provides local diagramming tools.", + "visualClient": "Your AI client", + "visualCaption": "Local · stdio · no API key" } } diff --git a/public/locales/zh/translation.json b/public/locales/zh/translation.json index de7c7ac..cd9e2c7 100644 --- a/public/locales/zh/translation.json +++ b/public/locales/zh/translation.json @@ -95,7 +95,8 @@ "loadJSON": "加载 JSON", "playbackMode": "回放模式", "privacyMessage": "您的图表只留在您这里,不会发送到我们的服务器。", - "templates": "模板" + "templates": "模板", + "mcp": "MCP" }, "menu": { "file": "文件", @@ -1482,5 +1483,12 @@ "testPromptHint": "粘贴到任何已连接的客户端", "copyInstallPrompt": "复制安装提示语", "copyTestPrompt": "复制测试提示语" + }, + "mcp": { + "pageTitle": "Connect AI tools", + "pageSubtitle": "Give any MCP client first-class diagramming tools. Local-first, no API key.", + "visualAlt": "Your AI client connects to the OpenFlowKit MCP server over stdio, which provides local diagramming tools.", + "visualClient": "Your AI client", + "visualCaption": "Local · stdio · no API key" } } diff --git a/src/App.tsx b/src/App.tsx index c38cf02..7bf6234 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -54,6 +54,21 @@ function navigateHome(navigate: ReturnType): void { navigate('/home', { replace: true }); } +function normalizeLegacyViewerUrl(): void { + if (typeof window === 'undefined') { + return; + } + + const { pathname, search, hash } = window.location; + if (hash || !pathname.endsWith('/view') || !new URLSearchParams(search).has('flow')) { + return; + } + + const basePathPrefix = pathname.slice(0, -'/view'.length); + const basePath = basePathPrefix ? `${basePathPrefix}/` : '/'; + window.history.replaceState(null, '', `${basePath}#/view${search}`); +} + function FlowCanvasRoute(): React.JSX.Element { const { flowId } = useParams(); const navigate = useNavigate(); @@ -159,6 +174,9 @@ function EditorRouteGate({ children }: { children: React.ReactNode }): React.JSX function App(): React.JSX.Element { const { setShortcutsHelpOpen } = useFlowStore(); const isShortcutsHelpOpen = useShortcutHelpOpen(); + + normalizeLegacyViewerUrl(); + useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { // Don't trigger if user is typing in an input @@ -205,6 +223,7 @@ function App(): React.JSX.Element { /> } /> } /> + } /> } /> ; type ViewerSize = 'badge' | 'card' | 'full'; type LayoutState = @@ -33,25 +28,28 @@ type LayoutState = | { status: 'error'; error: string } | { status: 'ready'; nodes: FlowNode[]; edges: FlowEdge[] }; -function decodeDsl(encoded: string): string { - if (encoded.startsWith(PAKO_PREFIX)) { - const bytes = fromBase64Url(encoded.slice(PAKO_PREFIX.length)); - return new TextDecoder().decode(inflate(bytes)); - } - return decodeURIComponent(atob(encoded)); -} +type ParsedViewerGraph = ParsedGraph & { dsl: string }; + +const VIEWER_NODE_WIDTH = 184; +const VIEWER_NODE_HEIGHT = 76; +const VIEWER_DECISION_SIZE = 150; + +const VIEWER_NODE_TYPES = { + viewer: ViewerNode, +}; -function parseGraphFromSearch(search: string): ParsedGraph | { parseError: string } { +function parseGraphFromSearch(search: string): ParsedViewerGraph | { parseError: string } { const encoded = new URLSearchParams(search).get('flow'); if (!encoded) return { parseError: 'No diagram data in URL. Add ?flow=BASE64_DSL to the URL.' }; let dsl: string; try { - dsl = decodeDsl(encoded); - } catch { - return { parseError: 'Could not decode diagram data. The URL may be malformed.' }; + dsl = decodeDslFromViewerParam(encoded); + } catch (err) { + const message = err instanceof Error ? err.message : 'Unknown decode error'; + return { parseError: `Could not decode diagram data. ${message}` }; } try { - return parseDslOrThrow(dsl); + return { ...parseDslOrThrow(dsl), dsl }; } catch (err) { return { parseError: `DSL parse error: ${err instanceof Error ? err.message : String(err)}` }; } @@ -63,6 +61,85 @@ function parseViewerSize(search: string): ViewerSize { return 'full'; } +function getViewerNodeDimensions(node: FlowNode): { width: number; height: number } { + return node.data?.shape === 'diamond' + ? { width: VIEWER_DECISION_SIZE, height: VIEWER_DECISION_SIZE } + : { width: VIEWER_NODE_WIDTH, height: VIEWER_NODE_HEIGHT }; +} + +function prepareViewerNodes(nodes: FlowNode[]): FlowNode[] { + return nodes.map((node) => { + const dimensions = getViewerNodeDimensions(node); + return { + ...node, + type: 'viewer', + width: dimensions.width, + height: dimensions.height, + style: { + ...node.style, + width: dimensions.width, + height: dimensions.height, + }, + data: { + ...node.data, + viewerShape: node.data?.shape, + }, + }; + }); +} + +function prepareViewerEdges(edges: FlowEdge[]): FlowEdge[] { + return edges.map((edge) => ({ + ...edge, + type: 'smoothstep', + markerEnd: edge.markerEnd ?? { type: MarkerType.ArrowClosed }, + style: { + stroke: '#64748b', + strokeWidth: 1.8, + ...edge.style, + }, + })); +} + +function ViewerNode({ data }: NodeProps): React.ReactElement { + const label = typeof data.label === 'string' ? data.label : 'Untitled'; + const subLabel = typeof data.subLabel === 'string' ? data.subLabel : ''; + const shape = data.viewerShape === 'diamond' ? 'diamond' : 'rounded'; + const isDecision = shape === 'diamond'; + + return ( +
+ + + + + + + + +
+
+
+ {label} +
+ {subLabel ? ( +
+ {subLabel} +
+ ) : null} +
+
+
+ ); +} + function ViewerCanvas({ nodes, edges, @@ -74,21 +151,22 @@ function ViewerCanvas({ }): React.ReactElement { return ( - + {size === 'full' ? : null} ); @@ -97,10 +175,11 @@ function ViewerCanvas({ function DiagramViewerInner(): React.ReactElement { const location = useLocation(); const navigate = useNavigate(); + const { createDocument } = useWorkspaceDocumentActions(); const viewerSize = parseViewerSize(location.search); // Parse synchronously once on mount via lazy initializer — no effect needed. - const [parsed] = useState(() => + const [parsed] = useState(() => parseGraphFromSearch(location.search) ); @@ -113,7 +192,11 @@ function DiagramViewerInner(): React.ReactElement { // Run layout asynchronously — only when parse succeeded. useEffect(() => { if ('parseError' in parsed) return; - getElkLayout(parsed.nodes, parsed.edges) + getElkLayout(prepareViewerNodes(parsed.nodes), prepareViewerEdges(parsed.edges), { + source: 'import', + direction: 'LR', + spacing: 'normal', + }) .then(({ nodes, edges }) => { setLayoutState({ status: 'ready', nodes, edges }); }) @@ -122,27 +205,41 @@ function DiagramViewerInner(): React.ReactElement { }); }, [parsed]); + function handleOpenInEditor(): void { + if ('parseError' in parsed) { + return; + } + + const documentId = createDocument(); + navigate(`/flow/${documentId}`, { + state: createFlowEditorOpenFlowDslRouteState(parsed.dsl), + }); + } + return ( -
+
{viewerSize !== 'badge' ? ( -
-
- - {viewerSize === 'card' ? 'OpenFlowKit Viewer' : 'OpenFlowKit'} +
+
+ + + {viewerSize === 'card' ? 'OpenFlowKit Viewer' : 'OpenFlowKit'} + +
+
- -
) : ( -
- OpenFlowKit - Badge Viewer -
+
+ OpenFlowKit + Badge Viewer +
)}
@@ -175,9 +272,3 @@ export function DiagramViewer(): React.ReactElement { ); } - -/** Encode a DSL string to a viewer URL param (deflate + base64url, `~`-prefixed). */ -export function encodeDslForViewer(dsl: string): string { - const compressed = deflate(new TextEncoder().encode(dsl), { level: 9 }); - return PAKO_PREFIX + toBase64Url(compressed); -} diff --git a/src/components/HomePage.tsx b/src/components/HomePage.tsx index a957105..a7c3c99 100644 --- a/src/components/HomePage.tsx +++ b/src/components/HomePage.tsx @@ -3,12 +3,13 @@ import { useFlowStore } from '../store'; import { useWorkspaceDocumentActions, useWorkspaceDocumentsState } from '@/store/documentHooks'; import { HomeDashboard, type HomeFlowCard } from './home/HomeDashboard'; import { HomeFlowDeleteDialog, HomeFlowRenameDialog } from './home/HomeFlowDialogs'; +import { HomeMCPView } from './home/HomeMCPView'; import { HomeSettingsView } from './home/HomeSettingsView'; import { HomeSidebar } from './home/HomeSidebar'; import { HomeTemplatesView } from './home/HomeTemplatesView'; import { shouldShowWelcomeModal } from './home/welcomeModalState'; -type HomePageTab = 'home' | 'templates' | 'settings'; +type HomePageTab = 'home' | 'templates' | 'settings' | 'mcp'; type HomeSettingsTab = 'general' | 'canvas' | 'shortcuts' | 'ai' | 'mcp'; const LazyWelcomeModal = lazy(async () => { @@ -133,6 +134,8 @@ export const HomePage: React.FC = ({ )} + {activeTab === 'mcp' && } + {activeTab === 'settings' && ( sum + g.tools.length, 0); - function buildConfig(): string { return JSON.stringify( { @@ -173,7 +171,12 @@ function StepRail({ ); } -export function MCPSettings(): React.ReactElement { +interface MCPSettingsProps { + /** 'page' hides the intro header (the standalone page supplies its own); 'panel' is the in-Settings tab. */ + variant?: 'page' | 'panel'; +} + +export function MCPSettings({ variant = 'panel' }: MCPSettingsProps = {}): React.ReactElement { const { t } = useTranslation(); const [client, setClient] = useState('claude'); const installCmd = 'npx -y @vrun-design/openflowkit-mcp'; @@ -182,34 +185,22 @@ export function MCPSettings(): React.ReactElement { return (
-
-

- {t('mcpSettings.eyebrow', 'Model Context Protocol')} -

-

- {t('mcpSettings.title', 'Connect AI tools (MCP)')} -

-

- {t( - 'mcpSettings.intro', - 'Add the OpenFlowKit MCP server to Claude Desktop, Cursor, Windsurf, or any MCP client. Your assistant uses its own model to author diagrams, while OpenFlowKit supplies local validation, templates, icon lookup, codebase analysis, and viewer links.', - )} -

-
- {[ - { value: TOTAL_TOOLS, label: t('mcpSettings.statTools', 'Tools') }, - { value: CLIENTS.length, label: t('mcpSettings.statClients', 'Clients') }, - { value: t('mcpSettings.statTransport', 'stdio'), label: t('mcpSettings.statTransportLabel', 'Transport') }, - ].map((stat, i) => ( -
-
- {stat.label} -
-
{stat.value}
-
- ))} -
-
+ {variant === 'panel' ? ( +
+

+ {t('mcpSettings.eyebrow', 'Model Context Protocol')} +

+

+ {t('mcpSettings.title', 'Connect AI tools (MCP)')} +

+

+ {t( + 'mcpSettings.intro', + 'Add the OpenFlowKit MCP server to Claude Desktop, Cursor, Windsurf, or any MCP client. Your assistant uses its own model to author diagrams, while OpenFlowKit supplies local validation, templates, icon lookup, codebase analysis, and viewer links.', + )} +

+
+ ) : null}
    diff --git a/src/components/flow-editor/useFlowEditorScreenModel.ts b/src/components/flow-editor/useFlowEditorScreenModel.ts index 1f0855d..6e35b83 100644 --- a/src/components/flow-editor/useFlowEditorScreenModel.ts +++ b/src/components/flow-editor/useFlowEditorScreenModel.ts @@ -1,5 +1,6 @@ -import { useCallback, useState } from 'react'; +import { useCallback, useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; +import { getInitialFlowEditorOpenFlowDsl } from '@/app/routeState'; import { useAIGeneration } from '@/hooks/useAIGeneration'; import { parseInfraDslApplyInput } from './infraDslApply'; import { useFlowExport } from '@/hooks/useFlowExport'; @@ -20,6 +21,8 @@ export function useFlowEditorScreenModel({ onGoHome }: UseFlowEditorScreenModelP const { t } = useTranslation(); const { addToast } = useToast(); const screenState = useFlowEditorScreenState(); + const { location, navigate } = screenState; + const consumedInitialDslRef = useRef(null); const { operations, callbacks } = useFlowEditorScreenBehavior({ screenState, t, @@ -64,6 +67,31 @@ export function useFlowEditorScreenModel({ onGoHome }: UseFlowEditorScreenModelP [addToast, callbacks] ); + useEffect(() => { + const initialDsl = getInitialFlowEditorOpenFlowDsl(location.state); + if (!initialDsl || consumedInitialDslRef.current === initialDsl) { + return; + } + + consumedInitialDslRef.current = initialDsl; + handleApplyDsl(initialDsl); + navigate( + { + pathname: location.pathname, + search: location.search, + hash: location.hash, + }, + { replace: true, state: null } + ); + }, [ + handleApplyDsl, + location.hash, + location.pathname, + location.search, + location.state, + navigate, + ]); + const { handleGenerateEntityFields, handleSuggestArchitectureNode, diff --git a/src/components/home/HomeMCPView.tsx b/src/components/home/HomeMCPView.tsx new file mode 100644 index 0000000..2d13057 --- /dev/null +++ b/src/components/home/HomeMCPView.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import { MCPFlowVisual } from './MCPFlowVisual'; +import { MCPSettings } from '../SettingsModal/MCPSettings'; + +export function HomeMCPView(): React.ReactElement { + const { t } = useTranslation(); + + return ( +
    +
    +

    + {t('mcp.pageTitle', 'Connect AI tools')} +

    +

    + {t( + 'mcp.pageSubtitle', + 'Give Claude, Cursor, Windsurf, or any MCP client first-class diagramming tools. Local-first, no API key, no cloud round-trip.' + )} +

    +
    + +
    + +
    + + +
    + ); +} diff --git a/src/components/home/HomeSidebar.tsx b/src/components/home/HomeSidebar.tsx index fd10d74..2409934 100644 --- a/src/components/home/HomeSidebar.tsx +++ b/src/components/home/HomeSidebar.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Book, Home, LayoutTemplate, Settings } from 'lucide-react'; +import { Book, Home, LayoutTemplate, Plug, Settings } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { OpenFlowLogo } from '../icons/OpenFlowLogo'; import { SidebarFooter } from './SidebarFooter'; @@ -7,7 +7,7 @@ import { GithubCard } from './GithubCard'; import { SidebarItem } from '../ui/SidebarItem'; import { APP_NAME } from '@/lib/brand'; -type HomeSidebarTab = 'home' | 'templates' | 'settings'; +type HomeSidebarTab = 'home' | 'templates' | 'settings' | 'mcp'; interface NavigationItem { icon: React.ReactNode; @@ -41,6 +41,12 @@ export function HomeSidebar({ tab: 'templates', testId: 'sidebar-templates', }, + { + icon: , + label: t('nav.mcp', 'MCP'), + tab: 'mcp', + testId: 'sidebar-mcp', + }, { icon: , label: t('nav.settings', 'Settings'), diff --git a/src/components/home/MCPFlowVisual.tsx b/src/components/home/MCPFlowVisual.tsx new file mode 100644 index 0000000..85f4380 --- /dev/null +++ b/src/components/home/MCPFlowVisual.tsx @@ -0,0 +1,162 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; + +interface ToolNode { + id: string; + label: string; + cy: number; + wire: string; + delay: string; +} + +const CORE = { x: 380, y: 150, r: 46 }; +const CLIENT_WIRE = 'M242 150 L334 150'; + +const TOOLS: ToolNode[] = [ + { id: 'validate', label: 'validate_dsl', cy: 74, wire: 'M426 150 C 488 150 500 74 556 74', delay: '0s' }, + { id: 'template', label: 'get_template', cy: 120, wire: 'M426 150 C 488 150 508 120 556 120', delay: '0.5s' }, + { id: 'icon', label: 'find_icon', cy: 166, wire: 'M426 150 C 488 150 508 166 556 166', delay: '1s' }, + { id: 'viewer', label: 'viewer_url', cy: 212, wire: 'M426 150 C 488 150 500 212 556 212', delay: '1.5s' }, +]; + +/** + * Animated schematic of the MCP exchange: an AI client talks to the OpenFlowKit + * core over stdio, which fans out to local diagramming tools. Motion is gated on + * prefers-reduced-motion; the static frame still reads as a complete topology. + */ +export function MCPFlowVisual(): React.ReactElement { + const { t } = useTranslation(); + + return ( +
    +
    +
    + + + + + {/* connection wires (static spine) */} + + {TOOLS.map((tool) => ( + + ))} + + {/* request / response packets on the stdio wire */} + + + + + {/* invoke packets fanning out to each tool */} + {TOOLS.map((tool) => ( + + ))} + + {/* AI client */} + + + + + {t('mcp.visualClient', 'Your AI client')} + Claude · Cursor · Windsurf + + + {/* stdio label */} + stdio + + {/* OpenFlowKit core */} + + + + + OpenFlowKit + + + {/* tools */} + {TOOLS.map((tool) => ( + + + + {tool.label} + + ))} + + +

    + {t('mcp.visualCaption', 'Local · stdio · no API key')} +

    +
    + ); +} + +const mcpFlowStyles = ` +.mcpflow-wire { fill: none; stroke: var(--color-brand-border); stroke-width: 1.5; } +.mcpflow-node { fill: var(--brand-surface); stroke: var(--color-brand-border); stroke-width: 1.5; } +.mcpflow-client-badge { fill: color-mix(in srgb, var(--brand-primary), transparent 88%); } +.mcpflow-spark { fill: var(--brand-primary); } +.mcpflow-label-strong { fill: var(--brand-text); font-size: 13px; font-weight: 650; } +.mcpflow-label-sub { fill: var(--brand-secondary); font-size: 10.5px; font-weight: 500; } +.mcpflow-wire-label { fill: var(--brand-secondary); font-size: 9.5px; font-weight: 700; letter-spacing: 0.16em; text-transform: uppercase; text-anchor: middle; } +.mcpflow-core-halo { fill: color-mix(in srgb, var(--brand-primary), transparent 90%); } +.mcpflow-core-ring { fill: var(--brand-surface); stroke: var(--brand-primary); stroke-width: 2; } +.mcpflow-core-mark { fill: var(--brand-primary); } +.mcpflow-core-label { fill: var(--brand-text); font-size: 12px; font-weight: 700; text-anchor: middle; } +.mcpflow-port { fill: var(--brand-primary); } +.mcpflow-tool-label { fill: var(--brand-text); font-size: 12px; font-weight: 600; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; } +.mcpflow-packet { opacity: 0; } +.mcpflow-req { fill: var(--brand-secondary); } +.mcpflow-res { fill: var(--brand-primary); } +.mcpflow-tool { fill: var(--brand-primary); } + +@media (prefers-reduced-motion: no-preference) { + .mcpflow-packet { offset-rotate: 0deg; animation: mcpflow-travel 2.4s linear infinite; } + .mcpflow-res { animation-direction: reverse; } + .mcpflow-tool { animation-duration: 2s; } + .mcpflow-core-halo { transform-box: fill-box; transform-origin: center; animation: mcpflow-breathe 3.4s ease-in-out infinite; } + .mcpflow-chip { animation: mcpflow-wake 2s ease-in-out infinite; } +} + +@keyframes mcpflow-travel { + 0% { offset-distance: 0%; opacity: 0; } + 12% { opacity: 1; } + 88% { opacity: 1; } + 100% { offset-distance: 100%; opacity: 0; } +} +@keyframes mcpflow-breathe { + 0%, 100% { opacity: 0.5; transform: scale(0.94); } + 50% { opacity: 1; transform: scale(1.06); } +} +@keyframes mcpflow-wake { + 0%, 60%, 100% { opacity: 0.78; } + 20% { opacity: 1; } +} +`; diff --git a/src/hooks/useFlowEditorActions.ts b/src/hooks/useFlowEditorActions.ts index 271ab35..9f96e67 100644 --- a/src/hooks/useFlowEditorActions.ts +++ b/src/hooks/useFlowEditorActions.ts @@ -17,7 +17,7 @@ import { exportPlantUMLToClipboard, } from './flow-editor-actions/exportHandlers'; import { toOpenFlowDSL } from '@/services/openFlowDSLExporter'; -import { encodeDslForViewer } from '@/components/DiagramViewer'; +import { encodeDslForViewer } from '@/services/viewerUrlCodec'; import { buildTemplateInsertionResult, getAutoLayoutResult, @@ -184,7 +184,7 @@ export function useFlowEditorActions({ } const dsl = toOpenFlowDSL(nodes, edges, { mode: exportSerializationMode }); const encoded = encodeDslForViewer(dsl); - const url = `${window.location.origin}/view?flow=${encoded}`; + const url = `${window.location.origin}/#/view?flow=${encoded}`; setShareViewerUrl(url); recordOnboardingEvent('first_share_opened', { surface: 'editor' }); captureAnalyticsEvent('share_opened', { surface: 'editor' }); diff --git a/src/i18n/locales/de/translation.json b/src/i18n/locales/de/translation.json index 29ad49e..dd3b611 100644 --- a/src/i18n/locales/de/translation.json +++ b/src/i18n/locales/de/translation.json @@ -95,7 +95,8 @@ "loadJSON": "JSON laden", "playbackMode": "Wiedergabemodus", "privacyMessage": "Ihre Diagramme bleiben bei Ihnen und erreichen unsere Server nicht.", - "templates": "Vorlagen" + "templates": "Vorlagen", + "mcp": "MCP" }, "menu": { "file": "Datei", @@ -1482,5 +1483,12 @@ "testPromptHint": "In jeden verbundenen Client einfügen", "copyInstallPrompt": "Installations-Prompt kopieren", "copyTestPrompt": "Test-Prompt kopieren" + }, + "mcp": { + "pageTitle": "Connect AI tools", + "pageSubtitle": "Give any MCP client first-class diagramming tools. Local-first, no API key.", + "visualAlt": "Your AI client connects to the OpenFlowKit MCP server over stdio, which provides local diagramming tools.", + "visualClient": "Your AI client", + "visualCaption": "Local · stdio · no API key" } } diff --git a/src/i18n/locales/en/translation.json b/src/i18n/locales/en/translation.json index 3d8da78..b0b7559 100644 --- a/src/i18n/locales/en/translation.json +++ b/src/i18n/locales/en/translation.json @@ -95,7 +95,8 @@ "loadJSON": "Load JSON", "playbackMode": "Playback Mode", "templates": "Templates", - "privacyMessage": "Your diagrams stay with you and do not reach our servers." + "privacyMessage": "Your diagrams stay with you and do not reach our servers.", + "mcp": "MCP" }, "menu": { "file": "File", @@ -1477,5 +1478,12 @@ "testPromptHint": "Paste into any connected client", "copyInstallPrompt": "Copy install prompt", "copyTestPrompt": "Copy test prompt" + }, + "mcp": { + "pageTitle": "Connect AI tools", + "pageSubtitle": "Give any MCP client first-class diagramming tools. Local-first, no API key.", + "visualAlt": "Your AI client connects to the OpenFlowKit MCP server over stdio, which provides local diagramming tools.", + "visualClient": "Your AI client", + "visualCaption": "Local · stdio · no API key" } } diff --git a/src/i18n/locales/es/translation.json b/src/i18n/locales/es/translation.json index 1aac052..160d573 100644 --- a/src/i18n/locales/es/translation.json +++ b/src/i18n/locales/es/translation.json @@ -95,7 +95,8 @@ "loadJSON": "Cargar JSON", "playbackMode": "Modo reproducción", "privacyMessage": "Sus diagramas permanecen con usted y no llegan a nuestros servidores.", - "templates": "Plantillas" + "templates": "Plantillas", + "mcp": "MCP" }, "menu": { "file": "Archivo", @@ -1482,5 +1483,12 @@ "testPromptHint": "Pega en cualquier cliente conectado", "copyInstallPrompt": "Copiar prompt de instalación", "copyTestPrompt": "Copiar prompt de prueba" + }, + "mcp": { + "pageTitle": "Connect AI tools", + "pageSubtitle": "Give any MCP client first-class diagramming tools. Local-first, no API key.", + "visualAlt": "Your AI client connects to the OpenFlowKit MCP server over stdio, which provides local diagramming tools.", + "visualClient": "Your AI client", + "visualCaption": "Local · stdio · no API key" } } diff --git a/src/i18n/locales/fr/translation.json b/src/i18n/locales/fr/translation.json index 1b7bdf3..2b2b240 100644 --- a/src/i18n/locales/fr/translation.json +++ b/src/i18n/locales/fr/translation.json @@ -95,7 +95,8 @@ "loadJSON": "Charger JSON", "playbackMode": "Mode lecture", "privacyMessage": "Vos diagrammes restent avec vous et n’atteignent pas nos serveurs.", - "templates": "Modèles" + "templates": "Modèles", + "mcp": "MCP" }, "menu": { "file": "Fichier", @@ -1482,5 +1483,12 @@ "testPromptHint": "Collez dans n’importe quel client connecté", "copyInstallPrompt": "Copier le prompt d’installation", "copyTestPrompt": "Copier le prompt de test" + }, + "mcp": { + "pageTitle": "Connect AI tools", + "pageSubtitle": "Give any MCP client first-class diagramming tools. Local-first, no API key.", + "visualAlt": "Your AI client connects to the OpenFlowKit MCP server over stdio, which provides local diagramming tools.", + "visualClient": "Your AI client", + "visualCaption": "Local · stdio · no API key" } } diff --git a/src/i18n/locales/ja/translation.json b/src/i18n/locales/ja/translation.json index 4ac576c..23d2622 100644 --- a/src/i18n/locales/ja/translation.json +++ b/src/i18n/locales/ja/translation.json @@ -95,7 +95,8 @@ "loadJSON": "JSONを読む", "playbackMode": "再生モード", "privacyMessage": "図はあなたの手元に残り、当社のサーバーには届きません。", - "templates": "テンプレート" + "templates": "テンプレート", + "mcp": "MCP" }, "menu": { "file": "ファイル", @@ -1482,5 +1483,12 @@ "testPromptHint": "接続済みの任意のクライアントに貼り付け", "copyInstallPrompt": "インストールプロンプトをコピー", "copyTestPrompt": "テストプロンプトをコピー" + }, + "mcp": { + "pageTitle": "Connect AI tools", + "pageSubtitle": "Give any MCP client first-class diagramming tools. Local-first, no API key.", + "visualAlt": "Your AI client connects to the OpenFlowKit MCP server over stdio, which provides local diagramming tools.", + "visualClient": "Your AI client", + "visualCaption": "Local · stdio · no API key" } } diff --git a/src/i18n/locales/tr/translation.json b/src/i18n/locales/tr/translation.json index 6a66307..8155085 100644 --- a/src/i18n/locales/tr/translation.json +++ b/src/i18n/locales/tr/translation.json @@ -95,7 +95,8 @@ "loadJSON": "JSON Yükle", "playbackMode": "Oynatma Modu", "privacyMessage": "Diyagramlarınız sizinle kalır ve sunucularımıza ulaşmaz.", - "templates": "Şablonlar" + "templates": "Şablonlar", + "mcp": "MCP" }, "menu": { "file": "Dosya", @@ -1482,5 +1483,12 @@ "testPromptHint": "Bağlı herhangi bir istemciye yapıştır", "copyInstallPrompt": "Kurulum promptunu kopyala", "copyTestPrompt": "Test promptunu kopyala" + }, + "mcp": { + "pageTitle": "Connect AI tools", + "pageSubtitle": "Give any MCP client first-class diagramming tools. Local-first, no API key.", + "visualAlt": "Your AI client connects to the OpenFlowKit MCP server over stdio, which provides local diagramming tools.", + "visualClient": "Your AI client", + "visualCaption": "Local · stdio · no API key" } } diff --git a/src/i18n/locales/zh/translation.json b/src/i18n/locales/zh/translation.json index de7c7ac..cd9e2c7 100644 --- a/src/i18n/locales/zh/translation.json +++ b/src/i18n/locales/zh/translation.json @@ -95,7 +95,8 @@ "loadJSON": "加载 JSON", "playbackMode": "回放模式", "privacyMessage": "您的图表只留在您这里,不会发送到我们的服务器。", - "templates": "模板" + "templates": "模板", + "mcp": "MCP" }, "menu": { "file": "文件", @@ -1482,5 +1483,12 @@ "testPromptHint": "粘贴到任何已连接的客户端", "copyInstallPrompt": "复制安装提示语", "copyTestPrompt": "复制测试提示语" + }, + "mcp": { + "pageTitle": "Connect AI tools", + "pageSubtitle": "Give any MCP client first-class diagramming tools. Local-first, no API key.", + "visualAlt": "Your AI client connects to the OpenFlowKit MCP server over stdio, which provides local diagramming tools.", + "visualClient": "Your AI client", + "visualCaption": "Local · stdio · no API key" } } diff --git a/src/services/viewerUrlCodec.test.ts b/src/services/viewerUrlCodec.test.ts new file mode 100644 index 0000000..9509c91 --- /dev/null +++ b/src/services/viewerUrlCodec.test.ts @@ -0,0 +1,12 @@ +import { describe, expect, it } from 'vitest'; +import { decodeDslFromViewerParam, encodeDslForViewer } from './viewerUrlCodec'; + +describe('viewerUrlCodec', () => { + it('round-trips compressed OpenFlow DSL viewer params', () => { + const dsl = 'flow: Test\n[start] start: Start\n[end] done: Done\nstart -> done'; + const encoded = encodeDslForViewer(dsl); + + expect(encoded.startsWith('~')).toBe(true); + expect(decodeDslFromViewerParam(encoded)).toBe(dsl); + }); +}); diff --git a/src/services/viewerUrlCodec.ts b/src/services/viewerUrlCodec.ts new file mode 100644 index 0000000..3271e49 --- /dev/null +++ b/src/services/viewerUrlCodec.ts @@ -0,0 +1,40 @@ +import { deflate, inflate } from 'pako'; + +const PAKO_PREFIX = '~'; + +function fromBase64Url(value: string): Uint8Array { + const pad = value.length % 4 === 0 ? '' : '='.repeat(4 - (value.length % 4)); + const base64 = value.replace(/-/g, '+').replace(/_/g, '/') + pad; + const binary = atob(base64); + const bytes = new Uint8Array(binary.length); + + for (let index = 0; index < binary.length; index += 1) { + bytes[index] = binary.charCodeAt(index); + } + + return bytes; +} + +function toBase64Url(bytes: Uint8Array): string { + let binary = ''; + + for (let index = 0; index < bytes.length; index += 1) { + binary += String.fromCharCode(bytes[index]); + } + + return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); +} + +export function decodeDslFromViewerParam(encoded: string): string { + if (encoded.startsWith(PAKO_PREFIX)) { + const bytes = fromBase64Url(encoded.slice(PAKO_PREFIX.length)); + return new TextDecoder().decode(inflate(bytes)); + } + + return decodeURIComponent(atob(encoded)); +} + +export function encodeDslForViewer(dsl: string): string { + const compressed = deflate(new TextEncoder().encode(dsl), { level: 9 }); + return PAKO_PREFIX + toBase64Url(compressed); +} diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo index af338b3..8c41189 100644 --- a/tsconfig.tsbuildinfo +++ b/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/app.test.tsx","./src/app.tsx","./src/constants.test.ts","./src/constants.ts","./src/index.tsx","./src/store.test.ts","./src/store.ts","./src/theme.test.ts","./src/theme.ts","./src/app/routestate.test.ts","./src/app/routestate.ts","./src/components/annotationnode.tsx","./src/components/architecturerulespanel.tsx","./src/components/cinematicexportoverlay.tsx","./src/components/commandbar.test.tsx","./src/components/commandbar.tsx","./src/components/connectmenu.test.tsx","./src/components/connectmenu.tsx","./src/components/connectmenusections.tsx","./src/components/contextmenu.test.tsx","./src/components/contextmenu.tsx","./src/components/customconnectionline.test.tsx","./src/components/customconnectionline.tsx","./src/components/customedge.tsx","./src/components/customnode.handleinteraction.test.tsx","./src/components/customnode.tsx","./src/components/customnodecontent.tsx","./src/components/designsystem.integration.test.tsx","./src/components/diagramviewer.tsx","./src/components/errorboundary.tsx","./src/components/exportmenu.tsx","./src/components/exportmenupanel.test.tsx","./src/components/exportmenupanel.tsx","./src/components/flowcanvas.tsx","./src/components/floweditor.test.tsx","./src/components/floweditor.tsx","./src/components/floweditoremptystate.tsx","./src/components/floweditorlayoutoverlay.tsx","./src/components/floweditorpanels.test.tsx","./src/components/floweditorpanels.tsx","./src/components/flowtabs.test.tsx","./src/components/flowtabs.tsx","./src/components/groupnode.tsx","./src/components/homepage.integration.test.tsx","./src/components/homepage.tsx","./src/components/iconassetnodebody.tsx","./src/components/iconmap.test.tsx","./src/components/iconmap.ts","./src/components/imagenode.tsx","./src/components/importrecoverydialog.test.tsx","./src/components/importrecoverydialog.tsx","./src/components/inlinetexteditsurface.test.tsx","./src/components/inlinetexteditsurface.tsx","./src/components/keyboardshortcutsmodal.tsx","./src/components/languageselector.tsx","./src/components/markdownrenderer.tsx","./src/components/memoizedmarkdown.tsx","./src/components/mermaiddiagnosticsbanner.test.tsx","./src/components/mermaiddiagnosticsbanner.tsx","./src/components/mermaidsvgnode.tsx","./src/components/navigationcontrols.tsx","./src/components/nodebadges.tsx","./src/components/nodechrome.tsx","./src/components/nodequickcreatebuttons.tsx","./src/components/nodeshapesvg.tsx","./src/components/nodetransformcontrols.tsx","./src/components/playbackcontrols.tsx","./src/components/propertiespanel.tsx","./src/components/rightrail.tsx","./src/components/sectionnode.tsx","./src/components/shareembedmodal.tsx","./src/components/sharemodal.test.tsx","./src/components/sharemodal.tsx","./src/components/sidebarshell.tsx","./src/components/snapshotspanel.test.tsx","./src/components/snapshotspanel.tsx","./src/components/studioaipanel.test.tsx","./src/components/studioaipanel.tsx","./src/components/studioaipanelsections.tsx","./src/components/studiocodepanel.test.tsx","./src/components/studiocodepanel.tsx","./src/components/studiopanel.test.tsx","./src/components/studiopanel.tsx","./src/components/studioplaybackpanel.test.tsx","./src/components/studioplaybackpanel.tsx","./src/components/swimlanenode.tsx","./src/components/textnode.tsx","./src/components/themetoggle.tsx","./src/components/toolbar.tsx","./src/components/tooltip.tsx","./src/components/topnav.tsx","./src/components/welcomemodal.tsx","./src/components/annotationtheme.ts","./src/components/container-nodes.handleinteraction.test.tsx","./src/components/editorsurfacetiers.ts","./src/components/handleinteraction.test.ts","./src/components/handleinteraction.ts","./src/components/handleinteractionusage.test.ts","./src/components/lightweight-nodes.handleinteraction.test.tsx","./src/components/markdownsyntax.ts","./src/components/nodehelpers.test.ts","./src/components/nodehelpers.ts","./src/components/sharemodalcontent.ts","./src/components/studioaicopy.ts","./src/components/studioaipanelexamples.ts","./src/components/transformdiagnostics.test.ts","./src/components/transformdiagnostics.ts","./src/components/useactivenodeselection.ts","./src/components/useexportmenu.test.tsx","./src/components/useexportmenu.ts","./src/components/settingsmodal/aisettings.tsx","./src/components/settingsmodal/canvassettings.tsx","./src/components/settingsmodal/generalsettings.test.tsx","./src/components/settingsmodal/generalsettings.tsx","./src/components/settingsmodal/mcpsettings.tsx","./src/components/settingsmodal/settingsmodal.test.tsx","./src/components/settingsmodal/settingsmodal.tsx","./src/components/settingsmodal/shortcutssettings.tsx","./src/components/settingsmodal/ai/advancedendpointsection.tsx","./src/components/settingsmodal/ai/customheaderseditor.tsx","./src/components/settingsmodal/ai/privacysection.tsx","./src/components/settingsmodal/ai/providericon.tsx","./src/components/settingsmodal/ai/providersection.tsx","./src/components/settingsmodal/ai/step.tsx","./src/components/add-items/additemregistry.tsx","./src/components/app/docssiteredirect.test.tsx","./src/components/app/docssiteredirect.tsx","./src/components/app/mobileworkspacegate.test.tsx","./src/components/app/mobileworkspacegate.tsx","./src/components/app/routeloadingfallback.test.tsx","./src/components/app/routeloadingfallback.tsx","./src/components/app/mobileworkspacegatecopy.ts","./src/components/app/routeloadingcopy.ts","./src/components/architecture-lint/lintrulespanel.tsx","./src/components/architecture-lint/ruleform.tsx","./src/components/architecture-lint/visualeditor.tsx","./src/components/command-bar/assetsview.test.tsx","./src/components/command-bar/assetsview.tsx","./src/components/command-bar/codebaseimportpanels.tsx","./src/components/command-bar/codebaseimportsection.tsx","./src/components/command-bar/designsystemeditor.tsx","./src/components/command-bar/designsystemview.tsx","./src/components/command-bar/diagramminipreview.tsx","./src/components/command-bar/figmaimportpanel.tsx","./src/components/command-bar/importsurfaceprimitives.tsx","./src/components/command-bar/importview.tsx","./src/components/command-bar/importviewpanels.tsx","./src/components/command-bar/layersview.tsx","./src/components/command-bar/layoutview.tsx","./src/components/command-bar/pagesview.tsx","./src/components/command-bar/rootview.test.tsx","./src/components/command-bar/rootview.tsx","./src/components/command-bar/searchview.tsx","./src/components/command-bar/templatesview.test.tsx","./src/components/command-bar/templatesview.tsx","./src/components/command-bar/viewheader.tsx","./src/components/command-bar/visualsview.tsx","./src/components/command-bar/applycodechanges.test.ts","./src/components/command-bar/applycodechanges.ts","./src/components/command-bar/assetsviewconstants.ts","./src/components/command-bar/importdetection.test.ts","./src/components/command-bar/importdetection.ts","./src/components/command-bar/importnativeparsers.ts","./src/components/command-bar/importviewmodel.test.ts","./src/components/command-bar/importviewmodel.ts","./src/components/command-bar/mermaidimportparser.ts","./src/components/command-bar/searchquery.test.ts","./src/components/command-bar/searchquery.ts","./src/components/command-bar/types.ts","./src/components/command-bar/useaiviewstate.test.tsx","./src/components/command-bar/useaiviewstate.ts","./src/components/command-bar/usecloudassetcatalog.ts","./src/components/command-bar/usecommandbarcommands.test.tsx","./src/components/command-bar/usecommandbarcommands.tsx","./src/components/custom-edge/customedgewrapper.tsx","./src/components/custom-edge/edgemarkerdefs.tsx","./src/components/custom-edge/sequencemessageedge.test.tsx","./src/components/custom-edge/sequencemessageedge.tsx","./src/components/custom-edge/animatededgepresentation.test.ts","./src/components/custom-edge/animatededgepresentation.ts","./src/components/custom-edge/classrelationsemantics.test.ts","./src/components/custom-edge/classrelationsemantics.ts","./src/components/custom-edge/edgecurve.test.ts","./src/components/custom-edge/edgecurve.ts","./src/components/custom-edge/edgerendermode.ts","./src/components/custom-edge/pathutils.test.ts","./src/components/custom-edge/pathutils.ts","./src/components/custom-edge/pathutilsgeometry.ts","./src/components/custom-edge/pathutilssiblingrouting.ts","./src/components/custom-edge/pathutilstypes.ts","./src/components/custom-edge/relationroutingsemantics.test.ts","./src/components/custom-edge/relationroutingsemantics.ts","./src/components/custom-edge/standardedgemarkers.test.ts","./src/components/custom-edge/standardedgemarkers.ts","./src/components/custom-nodes/architecturenode.handleinteraction.test.tsx","./src/components/custom-nodes/architecturenode.tsx","./src/components/custom-nodes/browsernode.tsx","./src/components/custom-nodes/classentitynode.handleinteraction.test.tsx","./src/components/custom-nodes/classnode.tsx","./src/components/custom-nodes/entitynode.tsx","./src/components/custom-nodes/journeynode.tsx","./src/components/custom-nodes/mindmapnode.tsx","./src/components/custom-nodes/mobilenode.tsx","./src/components/custom-nodes/sequencenotenode.tsx","./src/components/custom-nodes/sequenceparticipantnode.tsx","./src/components/custom-nodes/structurednodehandles.tsx","./src/components/custom-nodes/visualnodes.handleinteraction.test.tsx","./src/components/custom-nodes/browservariantrenderer.tsx","./src/components/custom-nodes/mobilevariantrenderer.tsx","./src/components/custom-nodes/structuredlistnavigation.test.ts","./src/components/custom-nodes/structuredlistnavigation.ts","./src/components/custom-nodes/variantconstants.ts","./src/components/diagram-diff/diffmodebanner.tsx","./src/components/flow-canvas/flowcanvasalignmentguidesoverlay.tsx","./src/components/flow-canvas/flowcanvasoverlays.tsx","./src/components/flow-canvas/flowcanvassurface.test.tsx","./src/components/flow-canvas/flowcanvassurface.tsx","./src/components/flow-canvas/streamingoverlay.tsx","./src/components/flow-canvas/alignmentguides.test.ts","./src/components/flow-canvas/alignmentguides.ts","./src/components/flow-canvas/flowcanvasreactflowcontracts.ts","./src/components/flow-canvas/flowcanvastypes.test.ts","./src/components/flow-canvas/flowcanvastypes.tsx","./src/components/flow-canvas/largegraphsafetymode.test.ts","./src/components/flow-canvas/largegraphsafetymode.ts","./src/components/flow-canvas/nodechromecoverage.test.ts","./src/components/flow-canvas/pastehelpers.test.ts","./src/components/flow-canvas/pastehelpers.ts","./src/components/flow-canvas/useflowcanvasalignmentguides.ts","./src/components/flow-canvas/useflowcanvasconnectionstate.ts","./src/components/flow-canvas/useflowcanvascontextactions.ts","./src/components/flow-canvas/useflowcanvasdragdrop.ts","./src/components/flow-canvas/useflowcanvasinteractionlod.ts","./src/components/flow-canvas/useflowcanvasmenus.ts","./src/components/flow-canvas/useflowcanvasmenusandactions.test.tsx","./src/components/flow-canvas/useflowcanvasmenusandactions.ts","./src/components/flow-canvas/useflowcanvasnodedraghandlers.ts","./src/components/flow-canvas/useflowcanvaspaste.ts","./src/components/flow-canvas/useflowcanvasreactflowconfig.test.ts","./src/components/flow-canvas/useflowcanvasreactflowconfig.ts","./src/components/flow-canvas/useflowcanvasselectiontools.test.tsx","./src/components/flow-canvas/useflowcanvasselectiontools.ts","./src/components/flow-canvas/useflowcanvasviewstate.test.ts","./src/components/flow-canvas/useflowcanvasviewstate.ts","./src/components/flow-canvas/useflowcanvaszoomlod.ts","./src/components/flow-editor/collaborationpresenceoverlay.test.tsx","./src/components/flow-editor/collaborationpresenceoverlay.tsx","./src/components/flow-editor/floweditorchrome.tsx","./src/components/flow-editor/buildfloweditorcontrollerparams.ts","./src/components/flow-editor/buildfloweditorscreencontrollerparams.ts","./src/components/flow-editor/chromeproptypes.ts","./src/components/flow-editor/floweditorchromeprops.ts","./src/components/flow-editor/infradslapply.test.ts","./src/components/flow-editor/infradslapply.ts","./src/components/flow-editor/panelprops.test.ts","./src/components/flow-editor/panelprops.ts","./src/components/flow-editor/shouldexitstudioonselection.test.ts","./src/components/flow-editor/shouldexitstudioonselection.ts","./src/components/flow-editor/usecollaborationnodepositions.ts","./src/components/flow-editor/usefloweditorcontroller.ts","./src/components/flow-editor/usefloweditorinteractionbindings.ts","./src/components/flow-editor/usefloweditorpanelactions.ts","./src/components/flow-editor/usefloweditorpanelprops.ts","./src/components/flow-editor/usefloweditorruntime.ts","./src/components/flow-editor/usefloweditorscreenbehavior.ts","./src/components/flow-editor/usefloweditorscreenmodel.ts","./src/components/flow-editor/usefloweditorscreenstate.ts","./src/components/flow-editor/usefloweditorshellcontroller.test.tsx","./src/components/flow-editor/usefloweditorshellcontroller.ts","./src/components/flow-editor/usefloweditorstudiocontroller.test.tsx","./src/components/flow-editor/usefloweditorstudiocontroller.ts","./src/components/flow-editor/useinfradslapply.ts","./src/components/home/githubcard.tsx","./src/components/home/homedashboard.tsx","./src/components/home/homeflowdialogs.tsx","./src/components/home/homesettingsview.tsx","./src/components/home/homesidebar.tsx","./src/components/home/hometemplatesview.tsx","./src/components/home/sidebarfooter.tsx","./src/components/home/welcomemodalstate.ts","./src/components/icons/assetsicon.tsx","./src/components/icons/openflowlogo.tsx","./src/components/infra-sync/infrasyncpanel.test.tsx","./src/components/infra-sync/infrasyncpanel.tsx","./src/components/journey/journeyscorecontrol.test.tsx","./src/components/journey/journeyscorecontrol.tsx","./src/components/properties/bulknodeproperties.test.tsx","./src/components/properties/bulknodeproperties.tsx","./src/components/properties/bulknodepropertiesfamilysections.tsx","./src/components/properties/bulknodepropertiessections.tsx","./src/components/properties/bulknodepropertiesutilitysections.tsx","./src/components/properties/colorpicker.test.tsx","./src/components/properties/colorpicker.tsx","./src/components/properties/customcolorpopover.tsx","./src/components/properties/diagramnodepropertiesrouter.test.ts","./src/components/properties/diagramnodepropertiesrouter.tsx","./src/components/properties/edgeproperties.tsx","./src/components/properties/iconpicker.tsx","./src/components/properties/icontilepickerprimitives.tsx","./src/components/properties/imageupload.tsx","./src/components/properties/inspectorprimitives.tsx","./src/components/properties/nodeactionbuttons.tsx","./src/components/properties/nodecontentsection.tsx","./src/components/properties/nodeimagesettingssection.tsx","./src/components/properties/nodeproperties.test.tsx","./src/components/properties/nodeproperties.tsx","./src/components/properties/nodewireframevariantsection.tsx","./src/components/properties/propertysliderrow.tsx","./src/components/properties/segmentedchoice.tsx","./src/components/properties/shapeselector.tsx","./src/components/properties/swatchpicker.tsx","./src/components/properties/bulknodepropertiesmodel.test.ts","./src/components/properties/bulknodepropertiesmodel.ts","./src/components/properties/colorpickerutils.ts","./src/components/properties/propertyinputbehavior.test.ts","./src/components/properties/propertyinputbehavior.ts","./src/components/properties/sectionactionbuilder.ts","./src/components/properties/shared.ts","./src/components/properties/wireframevariants.ts","./src/components/properties/edge/architectureedgesemanticssection.tsx","./src/components/properties/edge/edgecolorsection.test.tsx","./src/components/properties/edge/edgecolorsection.tsx","./src/components/properties/edge/edgeconditionsection.tsx","./src/components/properties/edge/edgelabelsection.tsx","./src/components/properties/edge/edgerelationsection.test.tsx","./src/components/properties/edge/edgerelationsection.tsx","./src/components/properties/edge/edgeroutesection.test.tsx","./src/components/properties/edge/edgeroutesection.tsx","./src/components/properties/edge/edgestylesection.tsx","./src/components/properties/edge/sequencemessagesection.tsx","./src/components/properties/edge/architecturesemantics.test.ts","./src/components/properties/edge/architecturesemantics.ts","./src/components/properties/edge/edgecolorutils.ts","./src/components/properties/edge/edgelabelmodel.test.ts","./src/components/properties/edge/edgelabelmodel.ts","./src/components/properties/edge/errelationoptions.ts","./src/components/properties/families/architecturenodeproperties.test.tsx","./src/components/properties/families/architecturenodeproperties.tsx","./src/components/properties/families/architecturenodesection.tsx","./src/components/properties/families/classdiagramnodeproperties.tsx","./src/components/properties/families/classmemberlisteditor.tsx","./src/components/properties/families/classnodesection.tsx","./src/components/properties/families/erdiagramnodeproperties.tsx","./src/components/properties/families/entityfieldlisteditor.tsx","./src/components/properties/families/entitynodesection.tsx","./src/components/properties/families/journeynodeproperties.tsx","./src/components/properties/families/journeynodesection.tsx","./src/components/properties/families/mindmapnodeproperties.test.tsx","./src/components/properties/families/mindmapnodeproperties.tsx","./src/components/properties/families/sequencenodeproperties.tsx","./src/components/properties/families/sequencenodesection.tsx","./src/components/properties/families/specializednodecolorsections.test.tsx","./src/components/properties/families/structuredtextlisteditor.tsx","./src/components/properties/families/architectureoptions.ts","./src/components/studio-code-panel/usestudiocodepanelcontroller.test.tsx","./src/components/studio-code-panel/usestudiocodepanelcontroller.ts","./src/components/templates/templatepresentation.tsx","./src/components/toolbar/toolbaraddmenu.test.tsx","./src/components/toolbar/toolbaraddmenu.tsx","./src/components/toolbar/toolbaraddmenupanel.tsx","./src/components/toolbar/toolbarhistorycontrols.tsx","./src/components/toolbar/toolbarmodecontrols.tsx","./src/components/toolbar/toolbarbuttonstyles.ts","./src/components/top-nav/savestatusindicator.tsx","./src/components/top-nav/topnavactions.tsx","./src/components/top-nav/topnavbrand.tsx","./src/components/top-nav/topnavmenu.test.tsx","./src/components/top-nav/topnavmenu.tsx","./src/components/top-nav/topnavmenupanel.tsx","./src/components/top-nav/usetopnavstate.ts","./src/components/ui/button.tsx","./src/components/ui/collapsiblesection.tsx","./src/components/ui/input.tsx","./src/components/ui/label.tsx","./src/components/ui/searchfield.tsx","./src/components/ui/segmentedtabs.tsx","./src/components/ui/select.test.tsx","./src/components/ui/select.tsx","./src/components/ui/sidebaritem.tsx","./src/components/ui/slider.tsx","./src/components/ui/switch.tsx","./src/components/ui/textarea.tsx","./src/components/ui/toastcontext.tsx","./src/components/ui/editorfieldstyles.ts","./src/config/aiproviders.test.ts","./src/config/aiproviders.ts","./src/config/rolloutflags.ts","./src/context/architecturelintcontext.tsx","./src/context/cinematicexportcontext.tsx","./src/context/diagramdiffcontext.tsx","./src/context/themecontext.tsx","./src/diagram-types/bootstrap.test.ts","./src/diagram-types/bootstrap.ts","./src/diagram-types/builtinplugins.ts","./src/diagram-types/builtinpropertypanels.ts","./src/diagram-types/registerbuiltinplugins.test.ts","./src/diagram-types/registerbuiltinplugins.ts","./src/diagram-types/registerbuiltinpropertypanels.test.ts","./src/diagram-types/registerbuiltinpropertypanels.ts","./src/diagram-types/architecture/fuzzcorpus.test.ts","./src/diagram-types/architecture/plugin.test.ts","./src/diagram-types/architecture/plugin.ts","./src/diagram-types/classdiagram/fuzzcorpus.test.ts","./src/diagram-types/classdiagram/plugin.test.ts","./src/diagram-types/classdiagram/plugin.ts","./src/diagram-types/core/contracts.ts","./src/diagram-types/core/index.ts","./src/diagram-types/core/propertypanels.test.ts","./src/diagram-types/core/propertypanels.ts","./src/diagram-types/core/registry.ts","./src/diagram-types/erdiagram/fuzzcorpus.test.ts","./src/diagram-types/erdiagram/plugin.test.ts","./src/diagram-types/erdiagram/plugin.ts","./src/diagram-types/flowchart/plugin.ts","./src/diagram-types/journey/fuzzcorpus.test.ts","./src/diagram-types/journey/plugin.test.ts","./src/diagram-types/journey/plugin.ts","./src/diagram-types/mindmap/fuzzcorpus.test.ts","./src/diagram-types/mindmap/plugin.test.ts","./src/diagram-types/mindmap/plugin.ts","./src/diagram-types/sequence/plugin.test.ts","./src/diagram-types/sequence/plugin.ts","./src/diagram-types/statediagram/plugin.test.ts","./src/diagram-types/statediagram/plugin.ts","./src/docs/docsroutes.ts","./src/docs/publicdocscatalog.js","./src/hooks/edgeconnectinteractions.test.ts","./src/hooks/edgeconnectinteractions.ts","./src/hooks/flowexportviewport.test.ts","./src/hooks/flowexportviewport.ts","./src/hooks/mindmaptopicactionrequest.ts","./src/hooks/nodelabeleditrequest.test.ts","./src/hooks/nodelabeleditrequest.ts","./src/hooks/nodequickcreaterequest.test.ts","./src/hooks/nodequickcreaterequest.ts","./src/hooks/snapshotpolicy.test.ts","./src/hooks/snapshotpolicy.ts","./src/hooks/useaigeneration.ts","./src/hooks/useanalyticspreference.ts","./src/hooks/useanimatededgeperformancewarning.test.ts","./src/hooks/useanimatededgeperformancewarning.ts","./src/hooks/useassetcatalog.ts","./src/hooks/usecinematicexport.ts","./src/hooks/useclipboardoperations.ts","./src/hooks/usedesignsystem.ts","./src/hooks/useedgeinteractions.ts","./src/hooks/useedgeoperations.ts","./src/hooks/usefloweditoractions.test.ts","./src/hooks/usefloweditoractions.ts","./src/hooks/usefloweditorcallbacks.ts","./src/hooks/usefloweditorcollaboration.test.ts","./src/hooks/usefloweditorcollaboration.ts","./src/hooks/usefloweditoruistate.ts","./src/hooks/useflowexport.ts","./src/hooks/useflowhistory.test.ts","./src/hooks/useflowhistory.ts","./src/hooks/useflowoperations.ts","./src/hooks/usegithubstars.ts","./src/hooks/useinfrasync.ts","./src/hooks/useinlinenodetextedit.test.ts","./src/hooks/useinlinenodetextedit.ts","./src/hooks/usekeyboardshortcuts.test.ts","./src/hooks/usekeyboardshortcuts.ts","./src/hooks/uselayoutoperations.ts","./src/hooks/usemarkdowneditor.ts","./src/hooks/usemenukeyboardnavigation.ts","./src/hooks/usemodifierkeys.test.ts","./src/hooks/usemodifierkeys.ts","./src/hooks/usenodeoperations.ts","./src/hooks/useplayback.ts","./src/hooks/useprovidershapepreview.ts","./src/hooks/userecentimports.ts","./src/hooks/useshiftheld.ts","./src/hooks/usesnapshots.ts","./src/hooks/usestaticexport.ts","./src/hooks/usestoragepressureguard.ts","./src/hooks/usestructuredlisteditor.ts","./src/hooks/usestyleclipboard.test.ts","./src/hooks/usestyleclipboard.ts","./src/hooks/ai-generation/chathistorystorage.test.ts","./src/hooks/ai-generation/chathistorystorage.ts","./src/hooks/ai-generation/codetoarchitecture.test.ts","./src/hooks/ai-generation/codetoarchitecture.ts","./src/hooks/ai-generation/codebaseanalyzer.test.ts","./src/hooks/ai-generation/codebaseanalyzer.ts","./src/hooks/ai-generation/codebaseparser.test.ts","./src/hooks/ai-generation/codebaseparser.ts","./src/hooks/ai-generation/codebasetonativediagram.test.ts","./src/hooks/ai-generation/codebasetonativediagram.ts","./src/hooks/ai-generation/graphcomposer.test.ts","./src/hooks/ai-generation/graphcomposer.ts","./src/hooks/ai-generation/nodeactionprompts.test.ts","./src/hooks/ai-generation/nodeactionprompts.ts","./src/hooks/ai-generation/openapiparser.test.ts","./src/hooks/ai-generation/openapiparser.ts","./src/hooks/ai-generation/openapitosequence.ts","./src/hooks/ai-generation/positionpreservingapply.test.ts","./src/hooks/ai-generation/positionpreservingapply.ts","./src/hooks/ai-generation/readiness.test.ts","./src/hooks/ai-generation/readiness.ts","./src/hooks/ai-generation/requestlifecycle.test.ts","./src/hooks/ai-generation/requestlifecycle.ts","./src/hooks/ai-generation/sqlparser.test.ts","./src/hooks/ai-generation/sqlparser.ts","./src/hooks/ai-generation/sqltoerd.ts","./src/hooks/ai-generation/streamingparser.ts","./src/hooks/ai-generation/streamingstore.ts","./src/hooks/ai-generation/terraformtocloud.ts","./src/hooks/ai-generation/codebaseanalyzer/pathresolution.ts","./src/hooks/ai-generation/codebaseanalyzer/servicedetection.ts","./src/hooks/ai-generation/codebaseanalyzer/summary.ts","./src/hooks/ai-generation/codebaseanalyzer/types.ts","./src/hooks/edge-operations/utils.test.ts","./src/hooks/edge-operations/utils.ts","./src/hooks/flow-editor-actions/exporthandlers.test.ts","./src/hooks/flow-editor-actions/exporthandlers.ts","./src/hooks/flow-editor-actions/helpers.ts","./src/hooks/flow-editor-actions/layouthandlers.test.ts","./src/hooks/flow-editor-actions/layouthandlers.ts","./src/hooks/flow-export/diagramdocumenttransfer.test.ts","./src/hooks/flow-export/diagramdocumenttransfer.ts","./src/hooks/flow-export/exportcapture.test.ts","./src/hooks/flow-export/exportcapture.ts","./src/hooks/flow-operations/useflowcoreactions.ts","./src/hooks/node-operations/createconnectedsibling.ts","./src/hooks/node-operations/dragstopreconcilepolicy.test.ts","./src/hooks/node-operations/dragstopreconcilepolicy.ts","./src/hooks/node-operations/nodefactories.ts","./src/hooks/node-operations/routingduringdrag.test.ts","./src/hooks/node-operations/routingduringdrag.ts","./src/hooks/node-operations/sectionbounds.ts","./src/hooks/node-operations/sectionhittesting.ts","./src/hooks/node-operations/sectionoperations.ts","./src/hooks/node-operations/usearchitecturenodeoperations.test.ts","./src/hooks/node-operations/usearchitecturenodeoperations.ts","./src/hooks/node-operations/usemindmapnodeoperations.test.ts","./src/hooks/node-operations/usemindmapnodeoperations.ts","./src/hooks/node-operations/usenodedragoperations.test.ts","./src/hooks/node-operations/usenodedragoperations.ts","./src/hooks/node-operations/usenodeoperationadders.ts","./src/hooks/node-operations/utils.test.ts","./src/hooks/node-operations/utils.ts","./src/i18n/config.test.ts","./src/i18n/config.ts","./src/i18n/strictmodelocalecoverage.test.ts","./src/i18n/usedlocalecoverage.test.ts","./src/lib/aiiconspipeline.test.ts","./src/lib/architecturetemplatedata.ts","./src/lib/architecturetemplates.test.ts","./src/lib/architecturetemplates.ts","./src/lib/brand.ts","./src/lib/classmembers.ts","./src/lib/colorutils.ts","./src/lib/connectcreationpolicy.test.ts","./src/lib/connectcreationpolicy.ts","./src/lib/date.ts","./src/lib/designtokens.ts","./src/lib/devperformance.ts","./src/lib/edgeroutedata.ts","./src/lib/entityfields.test.ts","./src/lib/entityfields.ts","./src/lib/ertoclassconversion.test.ts","./src/lib/ertoclassconversion.ts","./src/lib/exportfilename.test.ts","./src/lib/exportfilename.ts","./src/lib/flowminddslparserv2.test.ts","./src/lib/flowminddslparserv2.ts","./src/lib/fuzzymatch.ts","./src/lib/genericshapepolicy.ts","./src/lib/iconmatcher.test.ts","./src/lib/iconmatcher.ts","./src/lib/iconresolver.test.ts","./src/lib/iconresolver.ts","./src/lib/id.test.ts","./src/lib/id.ts","./src/lib/index.ts","./src/lib/legacybranding.ts","./src/lib/logger.ts","./src/lib/mermaidenrichmentpipeline.test.ts","./src/lib/mermaidparser.ts","./src/lib/mermaidparserhelpers.ts","./src/lib/mermaidparsermodel.ts","./src/lib/mindmaplayout.test.ts","./src/lib/mindmaplayout.ts","./src/lib/mindmaplayoutengine.ts","./src/lib/mindmaptree.ts","./src/lib/nodebulkediting.test.ts","./src/lib/nodebulkediting.ts","./src/lib/nodeenricher.test.ts","./src/lib/nodeenricher.ts","./src/lib/nodehandles.ts","./src/lib/nodeiconstate.test.ts","./src/lib/nodeiconstate.ts","./src/lib/nodeparent.ts","./src/lib/nodestyledata.test.ts","./src/lib/nodestyledata.ts","./src/lib/openflowdslparser.ts","./src/lib/openflowdslparserv2.ts","./src/lib/reactflowcompat.ts","./src/lib/reconnectedge.test.ts","./src/lib/reconnectedge.ts","./src/lib/relationsemantics.test.ts","./src/lib/relationsemantics.ts","./src/lib/releasestaleelkroutes.test.ts","./src/lib/releasestaleelkroutes.ts","./src/lib/result.ts","./src/lib/semanticclassifier.test.ts","./src/lib/semanticclassifier.ts","./src/lib/storagepressure.test.ts","./src/lib/storagepressure.ts","./src/lib/types.ts","./src/lib/xsssafety.test.tsx","./src/services/aligndistribute.ts","./src/services/aiservice.test.ts","./src/services/aiservice.ts","./src/services/aiserviceschemas.ts","./src/services/animatedexport.test.ts","./src/services/animatedexport.ts","./src/services/architectureroundtrip.test.ts","./src/services/assetcatalog.test.ts","./src/services/assetcatalog.ts","./src/services/assetpresentation.ts","./src/services/canonicalserialization.test.ts","./src/services/canonicalserialization.ts","./src/services/composediagramfordisplay.test.ts","./src/services/composediagramfordisplay.ts","./src/services/diagramdocument.test.ts","./src/services/diagramdocument.ts","./src/services/diagramdocumentschemas.ts","./src/services/domainlibrary.test.ts","./src/services/domainlibrary.ts","./src/services/elklayout.test.ts","./src/services/elklayout.ts","./src/services/exportservice.test.ts","./src/services/exportservice.ts","./src/services/figmaexportservice.ts","./src/services/flowchartroundtrip.test.ts","./src/services/geminiservice.ts","./src/services/geminisysteminstruction.ts","./src/services/gifencoder.test.ts","./src/services/gifencoder.ts","./src/services/githubfetcher.test.ts","./src/services/githubfetcher.ts","./src/services/iconassetcatalog.ts","./src/services/importfidelity.test.ts","./src/services/importfidelity.ts","./src/services/importlayoutmetadata.ts","./src/services/mermaidparser.test.ts","./src/services/openflowdslexporter.test.ts","./src/services/openflowdslexporter.ts","./src/services/openflowdslparser.test.ts","./src/services/openflowroundtripgolden.test.ts","./src/services/openflowroundtripgoldenfixtures.ts","./src/services/operationfeedback.ts","./src/services/remainingfamiliesroundtrip.test.ts","./src/services/sequencelayout.test.ts","./src/services/sequencelayout.ts","./src/services/smartedgerouting.test.ts","./src/services/smartedgerouting.ts","./src/services/statediagramroundtrip.test.ts","./src/services/templates.selector.test.ts","./src/services/templates.ts","./src/services/zipextractor.ts","./src/services/ai/contextserializer.test.ts","./src/services/ai/contextserializer.ts","./src/services/analytics/analytics.ts","./src/services/analytics/analyticssettings.test.ts","./src/services/analytics/analyticssettings.ts","./src/services/analytics/surfaceanalyticsclient.ts","./src/services/architecturelint/defaultrules.ts","./src/services/architecturelint/ruleengine.test.ts","./src/services/architecturelint/ruleengine.ts","./src/services/architecturelint/rulelibrary.ts","./src/services/architecturelint/types.ts","./src/services/architecturelint/workspacerules.ts","./src/services/collaboration/bootstrap.test.ts","./src/services/collaboration/bootstrap.ts","./src/services/collaboration/canvasdiff.test.ts","./src/services/collaboration/canvasdiff.ts","./src/services/collaboration/comments.test.ts","./src/services/collaboration/comments.ts","./src/services/collaboration/contracts.test.ts","./src/services/collaboration/contracts.ts","./src/services/collaboration/hookutils.ts","./src/services/collaboration/operationlog.test.ts","./src/services/collaboration/operationlog.ts","./src/services/collaboration/presenceviewmodel.test.ts","./src/services/collaboration/presenceviewmodel.ts","./src/services/collaboration/reducer.test.ts","./src/services/collaboration/reducer.ts","./src/services/collaboration/roomconfig.ts","./src/services/collaboration/roomlink.test.ts","./src/services/collaboration/roomlink.ts","./src/services/collaboration/runtimecontroller.test.ts","./src/services/collaboration/runtimecontroller.ts","./src/services/collaboration/runtimehookutils.test.ts","./src/services/collaboration/runtimehookutils.ts","./src/services/collaboration/schemas.ts","./src/services/collaboration/session.test.ts","./src/services/collaboration/session.ts","./src/services/collaboration/storebridge.test.ts","./src/services/collaboration/storebridge.ts","./src/services/collaboration/transport.test.ts","./src/services/collaboration/transport.ts","./src/services/collaboration/transportfactory.test.ts","./src/services/collaboration/transportfactory.ts","./src/services/collaboration/types.ts","./src/services/collaboration/versioning.test.ts","./src/services/collaboration/versioning.ts","./src/services/collaboration/yjspeertransport.test.ts","./src/services/collaboration/yjspeertransport.ts","./src/services/diagramdiff/diffengine.ts","./src/services/elk-layout/algorithmselection.ts","./src/services/elk-layout/anchoredlayout.test.ts","./src/services/elk-layout/architecturelayout.ts","./src/services/elk-layout/boundaryfanout.ts","./src/services/elk-layout/determinism.ts","./src/services/elk-layout/edgehandles.ts","./src/services/elk-layout/fallbacklayout.ts","./src/services/elk-layout/graphbuilding.ts","./src/services/elk-layout/layoutcache.ts","./src/services/elk-layout/options.test.ts","./src/services/elk-layout/options.ts","./src/services/elk-layout/runtime.ts","./src/services/elk-layout/textsizing.ts","./src/services/elk-layout/types.ts","./src/services/export/cinematicbuildplan.test.ts","./src/services/export/cinematicbuildplan.ts","./src/services/export/cinematicexport.ts","./src/services/export/cinematicexporttheme.test.ts","./src/services/export/cinematicexporttheme.ts","./src/services/export/cinematicrenderstate.test.ts","./src/services/export/cinematicrenderstate.ts","./src/services/export/formatting.ts","./src/services/export/mermaidbuilder.test.ts","./src/services/export/mermaidbuilder.ts","./src/services/export/mermaidexportquality.test.ts","./src/services/export/pdfdocument.test.ts","./src/services/export/pdfdocument.ts","./src/services/export/plantumlbuilder.ts","./src/services/export/webcodecsexport.test.ts","./src/services/export/webcodecsexport.ts","./src/services/export/mermaid/architecturemermaid.ts","./src/services/export/mermaid/classdiagrammermaid.ts","./src/services/export/mermaid/erdiagrammermaid.ts","./src/services/export/mermaid/journeymermaid.ts","./src/services/export/mermaid/mindmapmermaid.ts","./src/services/export/mermaid/sequencemermaid.ts","./src/services/export/mermaid/statediagrammermaid.ts","./src/services/figma/edgehelpers.ts","./src/services/figma/iconhelpers.ts","./src/services/figma/nodelayers.ts","./src/services/figma/themehelpers.ts","./src/services/figmaimport/figmaapiclient.ts","./src/services/flowpilot/assetgrounding.test.ts","./src/services/flowpilot/assetgrounding.ts","./src/services/flowpilot/prompting.ts","./src/services/flowpilot/responsepolicy.test.ts","./src/services/flowpilot/responsepolicy.ts","./src/services/flowpilot/skills.ts","./src/services/flowpilot/thread.ts","./src/services/flowpilot/types.ts","./src/services/infrasync/dockercomposeparser.test.ts","./src/services/infrasync/dockercomposeparser.ts","./src/services/infrasync/infratodsl.test.ts","./src/services/infrasync/infratodsl.ts","./src/services/infrasync/kubernetesparser.test.ts","./src/services/infrasync/kubernetesparser.ts","./src/services/infrasync/terraformstateparser.test.ts","./src/services/infrasync/terraformstateparser.ts","./src/services/infrasync/types.ts","./src/services/mermaid/compatfixturecorpus.test.ts","./src/services/mermaid/compatreportharness.test.ts","./src/services/mermaid/detectdiagramtype.test.ts","./src/services/mermaid/detectdiagramtype.ts","./src/services/mermaid/diagnosticformatting.test.ts","./src/services/mermaid/diagnosticformatting.ts","./src/services/mermaid/diagnosticssnapshot.test.ts","./src/services/mermaid/diagnosticssnapshot.ts","./src/services/mermaid/editablepartialcorpus.test.ts","./src/services/mermaid/ensuremermaidmeasurementsupport.test.ts","./src/services/mermaid/ensuremermaidmeasurementsupport.ts","./src/services/mermaid/extractlayoutfromsvg.test.ts","./src/services/mermaid/extractlayoutfromsvg.ts","./src/services/mermaid/flowchartgoldcorpusintegrity.test.ts","./src/services/mermaid/flowchartimportfidelitycorpus.test.ts","./src/services/mermaid/flowchartimportoutcomecorpus.test.ts","./src/services/mermaid/importcontracts.ts","./src/services/mermaid/importgeometryutils.test.ts","./src/services/mermaid/importgeometryutils.ts","./src/services/mermaid/importprovenance.test.ts","./src/services/mermaid/importprovenance.ts","./src/services/mermaid/importsceneprojection.test.ts","./src/services/mermaid/importsceneprojection.ts","./src/services/mermaid/importstatepresentation.test.ts","./src/services/mermaid/importstatepresentation.ts","./src/services/mermaid/mermaidlayoutcorpus.test.ts","./src/services/mermaid/mermaidrendercompatibility.test.ts","./src/services/mermaid/officialflowchartimport.test.ts","./src/services/mermaid/officialflowchartimport.ts","./src/services/mermaid/officialmermaidvalidation.test.ts","./src/services/mermaid/officialmermaidvalidation.ts","./src/services/mermaid/parsemermaidbytype.test.ts","./src/services/mermaid/parsemermaidbytype.ts","./src/services/mermaid/parsemermaiddirectives.test.ts","./src/services/mermaid/parsemermaiddirectives.ts","./src/services/mermaid/recoverypresentation.test.ts","./src/services/mermaid/recoverypresentation.ts","./src/services/mermaid/rendererfirstimport.test.ts","./src/services/mermaid/rendererfirstimport.ts","./src/services/mermaid/strictmodediagnosticspresentation.test.ts","./src/services/mermaid/strictmodediagnosticspresentation.ts","./src/services/mermaid/strictmodeguidance.test.ts","./src/services/mermaid/strictmodeguidance.ts","./src/services/mermaid/strictmodeuxregression.test.ts","./src/services/mermaid/supportmatrix.test.ts","./src/services/mermaid/supportmatrix.ts","./src/services/mermaid/extractlayoutfromsvg/rawextraction.ts","./src/services/mermaid/extractlayoutfromsvg/reconciliation.ts","./src/services/mermaid/extractlayoutfromsvg/svggeometry.ts","./src/services/mermaid/extractlayoutfromsvg/types.ts","./src/services/mermaid/officialflowchartimport/edgereconciliation.ts","./src/services/mermaid/officialflowchartimport/runtime.ts","./src/services/mermaid/officialflowchartimport/sceneassembly.ts","./src/services/mermaid/officialflowchartimport/sectionmapping.ts","./src/services/mermaid/officialflowchartimport/types.ts","./src/services/offline/registerappshellserviceworker.test.ts","./src/services/offline/registerappshellserviceworker.ts","./src/services/onboarding/config.ts","./src/services/onboarding/eventschemas.ts","./src/services/onboarding/events.test.ts","./src/services/onboarding/events.ts","./src/services/playback/contracts.test.ts","./src/services/playback/contracts.ts","./src/services/playback/model.test.ts","./src/services/playback/model.ts","./src/services/playback/studio.test.ts","./src/services/playback/studio.ts","./src/services/sequence/layoutconstants.ts","./src/services/sequence/sequencemessage.test.ts","./src/services/sequence/sequencemessage.ts","./src/services/shapelibrary/bootstrap.test.ts","./src/services/shapelibrary/bootstrap.ts","./src/services/shapelibrary/ingestionpipeline.test.ts","./src/services/shapelibrary/ingestionpipeline.ts","./src/services/shapelibrary/manifestvalidation.test.ts","./src/services/shapelibrary/manifestvalidation.ts","./src/services/shapelibrary/providercatalog.test.ts","./src/services/shapelibrary/providercatalog.ts","./src/services/shapelibrary/registry.test.ts","./src/services/shapelibrary/registry.ts","./src/services/shapelibrary/starterpacks.ts","./src/services/shapelibrary/types.ts","./src/services/storage/fallbackstorage.ts","./src/services/storage/flowdocumentmodel.test.ts","./src/services/storage/flowdocumentmodel.ts","./src/services/storage/flowpersiststorage.test.ts","./src/services/storage/flowpersiststorage.ts","./src/services/storage/indexeddbhelpers.ts","./src/services/storage/indexeddbschema.test.ts","./src/services/storage/indexeddbschema.ts","./src/services/storage/indexeddbstatestorage.test.ts","./src/services/storage/indexeddbstatestorage.ts","./src/services/storage/localfirstrepository.ts","./src/services/storage/localfirstruntime.ts","./src/services/storage/persisteddocumentadapters.test.ts","./src/services/storage/persisteddocumentadapters.ts","./src/services/storage/persistencetypes.ts","./src/services/storage/snapshotstorage.test.ts","./src/services/storage/snapshotstorage.ts","./src/services/storage/storageruntime.test.ts","./src/services/storage/storageruntime.ts","./src/services/storage/storageschemas.test.ts","./src/services/storage/storageschemas.ts","./src/services/storage/storagetelemetry.test.ts","./src/services/storage/storagetelemetry.ts","./src/services/storage/storagetelemetrysink.test.ts","./src/services/storage/storagetelemetrysink.ts","./src/services/storage/uilocalstorage.test.ts","./src/services/storage/uilocalstorage.ts","./src/services/templatelibrary/registry.test.ts","./src/services/templatelibrary/registry.ts","./src/services/templatelibrary/startertemplates.assets.test.ts","./src/services/templatelibrary/startertemplates.test.ts","./src/services/templatelibrary/startertemplates.ts","./src/services/templatelibrary/templatefactories.ts","./src/services/templatelibrary/types.ts","./src/store/actionfactory.ts","./src/store/aisettings.test.ts","./src/store/aisettings.ts","./src/store/aisettingspersistence.ts","./src/store/aisettingsschemas.test.ts","./src/store/aisettingsschemas.ts","./src/store/canvashooks.ts","./src/store/createflowstore.test.ts","./src/store/createflowstore.ts","./src/store/createflowstorepersistoptions.ts","./src/store/createflowstorestate.ts","./src/store/defaults.ts","./src/store/designsystemhooks.ts","./src/store/documenthooks.ts","./src/store/documentstatesync.test.ts","./src/store/documentstatesync.ts","./src/store/editorpagehooks.ts","./src/store/historyhooks.ts","./src/store/historystate.ts","./src/store/persistence.test.ts","./src/store/persistence.ts","./src/store/persistenceschemas.ts","./src/store/selectionhooks.ts","./src/store/selectors.test.ts","./src/store/selectors.ts","./src/store/tabhooks.ts","./src/store/types.ts","./src/store/viewhooks.ts","./src/store/workspacedocumentmodel.test.ts","./src/store/workspacedocumentmodel.ts","./src/store/actions/createaiandselectionactions.ts","./src/store/actions/createcanvasactions.ts","./src/store/actions/createdesignsystemactions.ts","./src/store/actions/createhistoryactions.test.ts","./src/store/actions/createhistoryactions.ts","./src/store/actions/createlayeractions.ts","./src/store/actions/createtabactions.ts","./src/store/actions/createviewactions.ts","./src/store/actions/createworkspacedocumentactions.ts","./src/store/actions/synctabnodesedges.ts","./src/store/slices/createcanvaseditorslice.ts","./src/store/slices/createexperienceslice.ts","./src/store/slices/createworkspaceslice.ts","./src/theme/nodedefaults.ts","./src/theme/palettes.ts","./src/theme/resolvers.ts","./src/theme/sections.ts","./src/theme/types.ts"],"version":"5.8.3"} \ No newline at end of file +{"root":["./src/app.test.tsx","./src/app.tsx","./src/constants.test.ts","./src/constants.ts","./src/index.tsx","./src/store.test.ts","./src/store.ts","./src/theme.test.ts","./src/theme.ts","./src/app/routestate.test.ts","./src/app/routestate.ts","./src/components/annotationnode.tsx","./src/components/architecturerulespanel.tsx","./src/components/cinematicexportoverlay.tsx","./src/components/commandbar.test.tsx","./src/components/commandbar.tsx","./src/components/connectmenu.test.tsx","./src/components/connectmenu.tsx","./src/components/connectmenusections.tsx","./src/components/contextmenu.test.tsx","./src/components/contextmenu.tsx","./src/components/customconnectionline.test.tsx","./src/components/customconnectionline.tsx","./src/components/customedge.tsx","./src/components/customnode.handleinteraction.test.tsx","./src/components/customnode.tsx","./src/components/customnodecontent.tsx","./src/components/designsystem.integration.test.tsx","./src/components/diagramviewer.tsx","./src/components/errorboundary.tsx","./src/components/exportmenu.tsx","./src/components/exportmenupanel.test.tsx","./src/components/exportmenupanel.tsx","./src/components/flowcanvas.tsx","./src/components/floweditor.test.tsx","./src/components/floweditor.tsx","./src/components/floweditoremptystate.tsx","./src/components/floweditorlayoutoverlay.tsx","./src/components/floweditorpanels.test.tsx","./src/components/floweditorpanels.tsx","./src/components/flowtabs.test.tsx","./src/components/flowtabs.tsx","./src/components/groupnode.tsx","./src/components/homepage.integration.test.tsx","./src/components/homepage.tsx","./src/components/iconassetnodebody.tsx","./src/components/iconmap.test.tsx","./src/components/iconmap.ts","./src/components/imagenode.tsx","./src/components/importrecoverydialog.test.tsx","./src/components/importrecoverydialog.tsx","./src/components/inlinetexteditsurface.test.tsx","./src/components/inlinetexteditsurface.tsx","./src/components/keyboardshortcutsmodal.tsx","./src/components/languageselector.tsx","./src/components/markdownrenderer.tsx","./src/components/memoizedmarkdown.tsx","./src/components/mermaiddiagnosticsbanner.test.tsx","./src/components/mermaiddiagnosticsbanner.tsx","./src/components/mermaidsvgnode.tsx","./src/components/navigationcontrols.tsx","./src/components/nodebadges.tsx","./src/components/nodechrome.tsx","./src/components/nodequickcreatebuttons.tsx","./src/components/nodeshapesvg.tsx","./src/components/nodetransformcontrols.tsx","./src/components/playbackcontrols.tsx","./src/components/propertiespanel.tsx","./src/components/rightrail.tsx","./src/components/sectionnode.tsx","./src/components/shareembedmodal.tsx","./src/components/sharemodal.test.tsx","./src/components/sharemodal.tsx","./src/components/sidebarshell.tsx","./src/components/snapshotspanel.test.tsx","./src/components/snapshotspanel.tsx","./src/components/studioaipanel.test.tsx","./src/components/studioaipanel.tsx","./src/components/studioaipanelsections.tsx","./src/components/studiocodepanel.test.tsx","./src/components/studiocodepanel.tsx","./src/components/studiopanel.test.tsx","./src/components/studiopanel.tsx","./src/components/studioplaybackpanel.test.tsx","./src/components/studioplaybackpanel.tsx","./src/components/swimlanenode.tsx","./src/components/textnode.tsx","./src/components/themetoggle.tsx","./src/components/toolbar.tsx","./src/components/tooltip.tsx","./src/components/topnav.tsx","./src/components/welcomemodal.tsx","./src/components/annotationtheme.ts","./src/components/container-nodes.handleinteraction.test.tsx","./src/components/editorsurfacetiers.ts","./src/components/handleinteraction.test.ts","./src/components/handleinteraction.ts","./src/components/handleinteractionusage.test.ts","./src/components/lightweight-nodes.handleinteraction.test.tsx","./src/components/markdownsyntax.ts","./src/components/nodehelpers.test.ts","./src/components/nodehelpers.ts","./src/components/sharemodalcontent.ts","./src/components/studioaicopy.ts","./src/components/studioaipanelexamples.ts","./src/components/transformdiagnostics.test.ts","./src/components/transformdiagnostics.ts","./src/components/useactivenodeselection.ts","./src/components/useexportmenu.test.tsx","./src/components/useexportmenu.ts","./src/components/settingsmodal/aisettings.tsx","./src/components/settingsmodal/canvassettings.tsx","./src/components/settingsmodal/generalsettings.test.tsx","./src/components/settingsmodal/generalsettings.tsx","./src/components/settingsmodal/mcpsettings.tsx","./src/components/settingsmodal/settingsmodal.test.tsx","./src/components/settingsmodal/settingsmodal.tsx","./src/components/settingsmodal/shortcutssettings.tsx","./src/components/settingsmodal/ai/advancedendpointsection.tsx","./src/components/settingsmodal/ai/customheaderseditor.tsx","./src/components/settingsmodal/ai/privacysection.tsx","./src/components/settingsmodal/ai/providericon.tsx","./src/components/settingsmodal/ai/providersection.tsx","./src/components/settingsmodal/ai/step.tsx","./src/components/add-items/additemregistry.tsx","./src/components/app/docssiteredirect.test.tsx","./src/components/app/docssiteredirect.tsx","./src/components/app/mobileworkspacegate.test.tsx","./src/components/app/mobileworkspacegate.tsx","./src/components/app/routeloadingfallback.test.tsx","./src/components/app/routeloadingfallback.tsx","./src/components/app/mobileworkspacegatecopy.ts","./src/components/app/routeloadingcopy.ts","./src/components/architecture-lint/lintrulespanel.tsx","./src/components/architecture-lint/ruleform.tsx","./src/components/architecture-lint/visualeditor.tsx","./src/components/command-bar/assetsview.test.tsx","./src/components/command-bar/assetsview.tsx","./src/components/command-bar/codebaseimportpanels.tsx","./src/components/command-bar/codebaseimportsection.tsx","./src/components/command-bar/designsystemeditor.tsx","./src/components/command-bar/designsystemview.tsx","./src/components/command-bar/diagramminipreview.tsx","./src/components/command-bar/figmaimportpanel.tsx","./src/components/command-bar/importsurfaceprimitives.tsx","./src/components/command-bar/importview.tsx","./src/components/command-bar/importviewpanels.tsx","./src/components/command-bar/layersview.tsx","./src/components/command-bar/layoutview.tsx","./src/components/command-bar/pagesview.tsx","./src/components/command-bar/rootview.test.tsx","./src/components/command-bar/rootview.tsx","./src/components/command-bar/searchview.tsx","./src/components/command-bar/templatesview.test.tsx","./src/components/command-bar/templatesview.tsx","./src/components/command-bar/viewheader.tsx","./src/components/command-bar/visualsview.tsx","./src/components/command-bar/applycodechanges.test.ts","./src/components/command-bar/applycodechanges.ts","./src/components/command-bar/assetsviewconstants.ts","./src/components/command-bar/importdetection.test.ts","./src/components/command-bar/importdetection.ts","./src/components/command-bar/importnativeparsers.ts","./src/components/command-bar/importviewmodel.test.ts","./src/components/command-bar/importviewmodel.ts","./src/components/command-bar/mermaidimportparser.ts","./src/components/command-bar/searchquery.test.ts","./src/components/command-bar/searchquery.ts","./src/components/command-bar/types.ts","./src/components/command-bar/useaiviewstate.test.tsx","./src/components/command-bar/useaiviewstate.ts","./src/components/command-bar/usecloudassetcatalog.ts","./src/components/command-bar/usecommandbarcommands.test.tsx","./src/components/command-bar/usecommandbarcommands.tsx","./src/components/custom-edge/customedgewrapper.tsx","./src/components/custom-edge/edgemarkerdefs.tsx","./src/components/custom-edge/sequencemessageedge.test.tsx","./src/components/custom-edge/sequencemessageedge.tsx","./src/components/custom-edge/animatededgepresentation.test.ts","./src/components/custom-edge/animatededgepresentation.ts","./src/components/custom-edge/classrelationsemantics.test.ts","./src/components/custom-edge/classrelationsemantics.ts","./src/components/custom-edge/edgecurve.test.ts","./src/components/custom-edge/edgecurve.ts","./src/components/custom-edge/edgerendermode.ts","./src/components/custom-edge/pathutils.test.ts","./src/components/custom-edge/pathutils.ts","./src/components/custom-edge/pathutilsgeometry.ts","./src/components/custom-edge/pathutilssiblingrouting.ts","./src/components/custom-edge/pathutilstypes.ts","./src/components/custom-edge/relationroutingsemantics.test.ts","./src/components/custom-edge/relationroutingsemantics.ts","./src/components/custom-edge/standardedgemarkers.test.ts","./src/components/custom-edge/standardedgemarkers.ts","./src/components/custom-nodes/architecturenode.handleinteraction.test.tsx","./src/components/custom-nodes/architecturenode.tsx","./src/components/custom-nodes/browsernode.tsx","./src/components/custom-nodes/classentitynode.handleinteraction.test.tsx","./src/components/custom-nodes/classnode.tsx","./src/components/custom-nodes/entitynode.tsx","./src/components/custom-nodes/journeynode.tsx","./src/components/custom-nodes/mindmapnode.tsx","./src/components/custom-nodes/mobilenode.tsx","./src/components/custom-nodes/sequencenotenode.tsx","./src/components/custom-nodes/sequenceparticipantnode.tsx","./src/components/custom-nodes/structurednodehandles.tsx","./src/components/custom-nodes/visualnodes.handleinteraction.test.tsx","./src/components/custom-nodes/browservariantrenderer.tsx","./src/components/custom-nodes/mobilevariantrenderer.tsx","./src/components/custom-nodes/structuredlistnavigation.test.ts","./src/components/custom-nodes/structuredlistnavigation.ts","./src/components/custom-nodes/variantconstants.ts","./src/components/diagram-diff/diffmodebanner.tsx","./src/components/flow-canvas/flowcanvasalignmentguidesoverlay.tsx","./src/components/flow-canvas/flowcanvasoverlays.tsx","./src/components/flow-canvas/flowcanvassurface.test.tsx","./src/components/flow-canvas/flowcanvassurface.tsx","./src/components/flow-canvas/streamingoverlay.tsx","./src/components/flow-canvas/alignmentguides.test.ts","./src/components/flow-canvas/alignmentguides.ts","./src/components/flow-canvas/flowcanvasreactflowcontracts.ts","./src/components/flow-canvas/flowcanvastypes.test.ts","./src/components/flow-canvas/flowcanvastypes.tsx","./src/components/flow-canvas/largegraphsafetymode.test.ts","./src/components/flow-canvas/largegraphsafetymode.ts","./src/components/flow-canvas/nodechromecoverage.test.ts","./src/components/flow-canvas/pastehelpers.test.ts","./src/components/flow-canvas/pastehelpers.ts","./src/components/flow-canvas/useflowcanvasalignmentguides.ts","./src/components/flow-canvas/useflowcanvasconnectionstate.ts","./src/components/flow-canvas/useflowcanvascontextactions.ts","./src/components/flow-canvas/useflowcanvasdragdrop.ts","./src/components/flow-canvas/useflowcanvasinteractionlod.ts","./src/components/flow-canvas/useflowcanvasmenus.ts","./src/components/flow-canvas/useflowcanvasmenusandactions.test.tsx","./src/components/flow-canvas/useflowcanvasmenusandactions.ts","./src/components/flow-canvas/useflowcanvasnodedraghandlers.ts","./src/components/flow-canvas/useflowcanvaspaste.ts","./src/components/flow-canvas/useflowcanvasreactflowconfig.test.ts","./src/components/flow-canvas/useflowcanvasreactflowconfig.ts","./src/components/flow-canvas/useflowcanvasselectiontools.test.tsx","./src/components/flow-canvas/useflowcanvasselectiontools.ts","./src/components/flow-canvas/useflowcanvasviewstate.test.ts","./src/components/flow-canvas/useflowcanvasviewstate.ts","./src/components/flow-canvas/useflowcanvaszoomlod.ts","./src/components/flow-editor/collaborationpresenceoverlay.test.tsx","./src/components/flow-editor/collaborationpresenceoverlay.tsx","./src/components/flow-editor/floweditorchrome.tsx","./src/components/flow-editor/buildfloweditorcontrollerparams.ts","./src/components/flow-editor/buildfloweditorscreencontrollerparams.ts","./src/components/flow-editor/chromeproptypes.ts","./src/components/flow-editor/floweditorchromeprops.ts","./src/components/flow-editor/infradslapply.test.ts","./src/components/flow-editor/infradslapply.ts","./src/components/flow-editor/panelprops.test.ts","./src/components/flow-editor/panelprops.ts","./src/components/flow-editor/shouldexitstudioonselection.test.ts","./src/components/flow-editor/shouldexitstudioonselection.ts","./src/components/flow-editor/usecollaborationnodepositions.ts","./src/components/flow-editor/usefloweditorcontroller.ts","./src/components/flow-editor/usefloweditorinteractionbindings.ts","./src/components/flow-editor/usefloweditorpanelactions.ts","./src/components/flow-editor/usefloweditorpanelprops.ts","./src/components/flow-editor/usefloweditorruntime.ts","./src/components/flow-editor/usefloweditorscreenbehavior.ts","./src/components/flow-editor/usefloweditorscreenmodel.ts","./src/components/flow-editor/usefloweditorscreenstate.ts","./src/components/flow-editor/usefloweditorshellcontroller.test.tsx","./src/components/flow-editor/usefloweditorshellcontroller.ts","./src/components/flow-editor/usefloweditorstudiocontroller.test.tsx","./src/components/flow-editor/usefloweditorstudiocontroller.ts","./src/components/flow-editor/useinfradslapply.ts","./src/components/home/githubcard.tsx","./src/components/home/homedashboard.tsx","./src/components/home/homeflowdialogs.tsx","./src/components/home/homemcpview.tsx","./src/components/home/homesettingsview.tsx","./src/components/home/homesidebar.tsx","./src/components/home/hometemplatesview.tsx","./src/components/home/mcpflowvisual.tsx","./src/components/home/sidebarfooter.tsx","./src/components/home/welcomemodalstate.ts","./src/components/icons/assetsicon.tsx","./src/components/icons/openflowlogo.tsx","./src/components/infra-sync/infrasyncpanel.test.tsx","./src/components/infra-sync/infrasyncpanel.tsx","./src/components/journey/journeyscorecontrol.test.tsx","./src/components/journey/journeyscorecontrol.tsx","./src/components/properties/bulknodeproperties.test.tsx","./src/components/properties/bulknodeproperties.tsx","./src/components/properties/bulknodepropertiesfamilysections.tsx","./src/components/properties/bulknodepropertiessections.tsx","./src/components/properties/bulknodepropertiesutilitysections.tsx","./src/components/properties/colorpicker.test.tsx","./src/components/properties/colorpicker.tsx","./src/components/properties/customcolorpopover.tsx","./src/components/properties/diagramnodepropertiesrouter.test.ts","./src/components/properties/diagramnodepropertiesrouter.tsx","./src/components/properties/edgeproperties.tsx","./src/components/properties/iconpicker.tsx","./src/components/properties/icontilepickerprimitives.tsx","./src/components/properties/imageupload.tsx","./src/components/properties/inspectorprimitives.tsx","./src/components/properties/nodeactionbuttons.tsx","./src/components/properties/nodecontentsection.tsx","./src/components/properties/nodeimagesettingssection.tsx","./src/components/properties/nodeproperties.test.tsx","./src/components/properties/nodeproperties.tsx","./src/components/properties/nodewireframevariantsection.tsx","./src/components/properties/propertysliderrow.tsx","./src/components/properties/segmentedchoice.tsx","./src/components/properties/shapeselector.tsx","./src/components/properties/swatchpicker.tsx","./src/components/properties/bulknodepropertiesmodel.test.ts","./src/components/properties/bulknodepropertiesmodel.ts","./src/components/properties/colorpickerutils.ts","./src/components/properties/propertyinputbehavior.test.ts","./src/components/properties/propertyinputbehavior.ts","./src/components/properties/sectionactionbuilder.ts","./src/components/properties/shared.ts","./src/components/properties/wireframevariants.ts","./src/components/properties/edge/architectureedgesemanticssection.tsx","./src/components/properties/edge/edgecolorsection.test.tsx","./src/components/properties/edge/edgecolorsection.tsx","./src/components/properties/edge/edgeconditionsection.tsx","./src/components/properties/edge/edgelabelsection.tsx","./src/components/properties/edge/edgerelationsection.test.tsx","./src/components/properties/edge/edgerelationsection.tsx","./src/components/properties/edge/edgeroutesection.test.tsx","./src/components/properties/edge/edgeroutesection.tsx","./src/components/properties/edge/edgestylesection.tsx","./src/components/properties/edge/sequencemessagesection.tsx","./src/components/properties/edge/architecturesemantics.test.ts","./src/components/properties/edge/architecturesemantics.ts","./src/components/properties/edge/edgecolorutils.ts","./src/components/properties/edge/edgelabelmodel.test.ts","./src/components/properties/edge/edgelabelmodel.ts","./src/components/properties/edge/errelationoptions.ts","./src/components/properties/families/architecturenodeproperties.test.tsx","./src/components/properties/families/architecturenodeproperties.tsx","./src/components/properties/families/architecturenodesection.tsx","./src/components/properties/families/classdiagramnodeproperties.tsx","./src/components/properties/families/classmemberlisteditor.tsx","./src/components/properties/families/classnodesection.tsx","./src/components/properties/families/erdiagramnodeproperties.tsx","./src/components/properties/families/entityfieldlisteditor.tsx","./src/components/properties/families/entitynodesection.tsx","./src/components/properties/families/journeynodeproperties.tsx","./src/components/properties/families/journeynodesection.tsx","./src/components/properties/families/mindmapnodeproperties.test.tsx","./src/components/properties/families/mindmapnodeproperties.tsx","./src/components/properties/families/sequencenodeproperties.tsx","./src/components/properties/families/sequencenodesection.tsx","./src/components/properties/families/specializednodecolorsections.test.tsx","./src/components/properties/families/structuredtextlisteditor.tsx","./src/components/properties/families/architectureoptions.ts","./src/components/studio-code-panel/usestudiocodepanelcontroller.test.tsx","./src/components/studio-code-panel/usestudiocodepanelcontroller.ts","./src/components/templates/templatepresentation.tsx","./src/components/toolbar/toolbaraddmenu.test.tsx","./src/components/toolbar/toolbaraddmenu.tsx","./src/components/toolbar/toolbaraddmenupanel.tsx","./src/components/toolbar/toolbarhistorycontrols.tsx","./src/components/toolbar/toolbarmodecontrols.tsx","./src/components/toolbar/toolbarbuttonstyles.ts","./src/components/top-nav/savestatusindicator.tsx","./src/components/top-nav/topnavactions.tsx","./src/components/top-nav/topnavbrand.tsx","./src/components/top-nav/topnavmenu.test.tsx","./src/components/top-nav/topnavmenu.tsx","./src/components/top-nav/topnavmenupanel.tsx","./src/components/top-nav/usetopnavstate.ts","./src/components/ui/button.tsx","./src/components/ui/collapsiblesection.tsx","./src/components/ui/input.tsx","./src/components/ui/label.tsx","./src/components/ui/searchfield.tsx","./src/components/ui/segmentedtabs.tsx","./src/components/ui/select.test.tsx","./src/components/ui/select.tsx","./src/components/ui/sidebaritem.tsx","./src/components/ui/slider.tsx","./src/components/ui/switch.tsx","./src/components/ui/textarea.tsx","./src/components/ui/toastcontext.tsx","./src/components/ui/editorfieldstyles.ts","./src/config/aiproviders.test.ts","./src/config/aiproviders.ts","./src/config/rolloutflags.ts","./src/context/architecturelintcontext.tsx","./src/context/cinematicexportcontext.tsx","./src/context/diagramdiffcontext.tsx","./src/context/themecontext.tsx","./src/diagram-types/bootstrap.test.ts","./src/diagram-types/bootstrap.ts","./src/diagram-types/builtinplugins.ts","./src/diagram-types/builtinpropertypanels.ts","./src/diagram-types/registerbuiltinplugins.test.ts","./src/diagram-types/registerbuiltinplugins.ts","./src/diagram-types/registerbuiltinpropertypanels.test.ts","./src/diagram-types/registerbuiltinpropertypanels.ts","./src/diagram-types/architecture/fuzzcorpus.test.ts","./src/diagram-types/architecture/plugin.test.ts","./src/diagram-types/architecture/plugin.ts","./src/diagram-types/classdiagram/fuzzcorpus.test.ts","./src/diagram-types/classdiagram/plugin.test.ts","./src/diagram-types/classdiagram/plugin.ts","./src/diagram-types/core/contracts.ts","./src/diagram-types/core/index.ts","./src/diagram-types/core/propertypanels.test.ts","./src/diagram-types/core/propertypanels.ts","./src/diagram-types/core/registry.ts","./src/diagram-types/erdiagram/fuzzcorpus.test.ts","./src/diagram-types/erdiagram/plugin.test.ts","./src/diagram-types/erdiagram/plugin.ts","./src/diagram-types/flowchart/plugin.ts","./src/diagram-types/journey/fuzzcorpus.test.ts","./src/diagram-types/journey/plugin.test.ts","./src/diagram-types/journey/plugin.ts","./src/diagram-types/mindmap/fuzzcorpus.test.ts","./src/diagram-types/mindmap/plugin.test.ts","./src/diagram-types/mindmap/plugin.ts","./src/diagram-types/sequence/plugin.test.ts","./src/diagram-types/sequence/plugin.ts","./src/diagram-types/statediagram/plugin.test.ts","./src/diagram-types/statediagram/plugin.ts","./src/docs/docsroutes.ts","./src/docs/publicdocscatalog.js","./src/hooks/edgeconnectinteractions.test.ts","./src/hooks/edgeconnectinteractions.ts","./src/hooks/flowexportviewport.test.ts","./src/hooks/flowexportviewport.ts","./src/hooks/mindmaptopicactionrequest.ts","./src/hooks/nodelabeleditrequest.test.ts","./src/hooks/nodelabeleditrequest.ts","./src/hooks/nodequickcreaterequest.test.ts","./src/hooks/nodequickcreaterequest.ts","./src/hooks/snapshotpolicy.test.ts","./src/hooks/snapshotpolicy.ts","./src/hooks/useaigeneration.ts","./src/hooks/useanalyticspreference.ts","./src/hooks/useanimatededgeperformancewarning.test.ts","./src/hooks/useanimatededgeperformancewarning.ts","./src/hooks/useassetcatalog.ts","./src/hooks/usecinematicexport.ts","./src/hooks/useclipboardoperations.ts","./src/hooks/usedesignsystem.ts","./src/hooks/useedgeinteractions.ts","./src/hooks/useedgeoperations.ts","./src/hooks/usefloweditoractions.test.ts","./src/hooks/usefloweditoractions.ts","./src/hooks/usefloweditorcallbacks.ts","./src/hooks/usefloweditorcollaboration.test.ts","./src/hooks/usefloweditorcollaboration.ts","./src/hooks/usefloweditoruistate.ts","./src/hooks/useflowexport.ts","./src/hooks/useflowhistory.test.ts","./src/hooks/useflowhistory.ts","./src/hooks/useflowoperations.ts","./src/hooks/usegithubstars.ts","./src/hooks/useinfrasync.ts","./src/hooks/useinlinenodetextedit.test.ts","./src/hooks/useinlinenodetextedit.ts","./src/hooks/usekeyboardshortcuts.test.ts","./src/hooks/usekeyboardshortcuts.ts","./src/hooks/uselayoutoperations.ts","./src/hooks/usemarkdowneditor.ts","./src/hooks/usemenukeyboardnavigation.ts","./src/hooks/usemodifierkeys.test.ts","./src/hooks/usemodifierkeys.ts","./src/hooks/usenodeoperations.ts","./src/hooks/useplayback.ts","./src/hooks/useprovidershapepreview.ts","./src/hooks/userecentimports.ts","./src/hooks/useshiftheld.ts","./src/hooks/usesnapshots.ts","./src/hooks/usestaticexport.ts","./src/hooks/usestoragepressureguard.ts","./src/hooks/usestructuredlisteditor.ts","./src/hooks/usestyleclipboard.test.ts","./src/hooks/usestyleclipboard.ts","./src/hooks/ai-generation/chathistorystorage.test.ts","./src/hooks/ai-generation/chathistorystorage.ts","./src/hooks/ai-generation/codetoarchitecture.test.ts","./src/hooks/ai-generation/codetoarchitecture.ts","./src/hooks/ai-generation/codebaseanalyzer.test.ts","./src/hooks/ai-generation/codebaseanalyzer.ts","./src/hooks/ai-generation/codebaseparser.test.ts","./src/hooks/ai-generation/codebaseparser.ts","./src/hooks/ai-generation/codebasetonativediagram.test.ts","./src/hooks/ai-generation/codebasetonativediagram.ts","./src/hooks/ai-generation/graphcomposer.test.ts","./src/hooks/ai-generation/graphcomposer.ts","./src/hooks/ai-generation/nodeactionprompts.test.ts","./src/hooks/ai-generation/nodeactionprompts.ts","./src/hooks/ai-generation/openapiparser.test.ts","./src/hooks/ai-generation/openapiparser.ts","./src/hooks/ai-generation/openapitosequence.ts","./src/hooks/ai-generation/positionpreservingapply.test.ts","./src/hooks/ai-generation/positionpreservingapply.ts","./src/hooks/ai-generation/readiness.test.ts","./src/hooks/ai-generation/readiness.ts","./src/hooks/ai-generation/requestlifecycle.test.ts","./src/hooks/ai-generation/requestlifecycle.ts","./src/hooks/ai-generation/sqlparser.test.ts","./src/hooks/ai-generation/sqlparser.ts","./src/hooks/ai-generation/sqltoerd.ts","./src/hooks/ai-generation/streamingparser.ts","./src/hooks/ai-generation/streamingstore.ts","./src/hooks/ai-generation/terraformtocloud.ts","./src/hooks/ai-generation/codebaseanalyzer/pathresolution.ts","./src/hooks/ai-generation/codebaseanalyzer/servicedetection.ts","./src/hooks/ai-generation/codebaseanalyzer/summary.ts","./src/hooks/ai-generation/codebaseanalyzer/types.ts","./src/hooks/edge-operations/utils.test.ts","./src/hooks/edge-operations/utils.ts","./src/hooks/flow-editor-actions/exporthandlers.test.ts","./src/hooks/flow-editor-actions/exporthandlers.ts","./src/hooks/flow-editor-actions/helpers.ts","./src/hooks/flow-editor-actions/layouthandlers.test.ts","./src/hooks/flow-editor-actions/layouthandlers.ts","./src/hooks/flow-export/diagramdocumenttransfer.test.ts","./src/hooks/flow-export/diagramdocumenttransfer.ts","./src/hooks/flow-export/exportcapture.test.ts","./src/hooks/flow-export/exportcapture.ts","./src/hooks/flow-operations/useflowcoreactions.ts","./src/hooks/node-operations/createconnectedsibling.ts","./src/hooks/node-operations/dragstopreconcilepolicy.test.ts","./src/hooks/node-operations/dragstopreconcilepolicy.ts","./src/hooks/node-operations/nodefactories.ts","./src/hooks/node-operations/routingduringdrag.test.ts","./src/hooks/node-operations/routingduringdrag.ts","./src/hooks/node-operations/sectionbounds.ts","./src/hooks/node-operations/sectionhittesting.ts","./src/hooks/node-operations/sectionoperations.ts","./src/hooks/node-operations/usearchitecturenodeoperations.test.ts","./src/hooks/node-operations/usearchitecturenodeoperations.ts","./src/hooks/node-operations/usemindmapnodeoperations.test.ts","./src/hooks/node-operations/usemindmapnodeoperations.ts","./src/hooks/node-operations/usenodedragoperations.test.ts","./src/hooks/node-operations/usenodedragoperations.ts","./src/hooks/node-operations/usenodeoperationadders.ts","./src/hooks/node-operations/utils.test.ts","./src/hooks/node-operations/utils.ts","./src/i18n/config.test.ts","./src/i18n/config.ts","./src/i18n/strictmodelocalecoverage.test.ts","./src/i18n/usedlocalecoverage.test.ts","./src/lib/aiiconspipeline.test.ts","./src/lib/architecturetemplatedata.ts","./src/lib/architecturetemplates.test.ts","./src/lib/architecturetemplates.ts","./src/lib/brand.ts","./src/lib/classmembers.ts","./src/lib/colorutils.ts","./src/lib/connectcreationpolicy.test.ts","./src/lib/connectcreationpolicy.ts","./src/lib/date.ts","./src/lib/designtokens.ts","./src/lib/devperformance.ts","./src/lib/edgeroutedata.ts","./src/lib/entityfields.test.ts","./src/lib/entityfields.ts","./src/lib/ertoclassconversion.test.ts","./src/lib/ertoclassconversion.ts","./src/lib/exportfilename.test.ts","./src/lib/exportfilename.ts","./src/lib/flowminddslparserv2.test.ts","./src/lib/flowminddslparserv2.ts","./src/lib/fuzzymatch.ts","./src/lib/genericshapepolicy.ts","./src/lib/iconmatcher.test.ts","./src/lib/iconmatcher.ts","./src/lib/iconresolver.test.ts","./src/lib/iconresolver.ts","./src/lib/id.test.ts","./src/lib/id.ts","./src/lib/index.ts","./src/lib/legacybranding.ts","./src/lib/logger.ts","./src/lib/mermaidenrichmentpipeline.test.ts","./src/lib/mermaidparser.ts","./src/lib/mermaidparserhelpers.ts","./src/lib/mermaidparsermodel.ts","./src/lib/mindmaplayout.test.ts","./src/lib/mindmaplayout.ts","./src/lib/mindmaplayoutengine.ts","./src/lib/mindmaptree.ts","./src/lib/nodebulkediting.test.ts","./src/lib/nodebulkediting.ts","./src/lib/nodeenricher.test.ts","./src/lib/nodeenricher.ts","./src/lib/nodehandles.ts","./src/lib/nodeiconstate.test.ts","./src/lib/nodeiconstate.ts","./src/lib/nodeparent.ts","./src/lib/nodestyledata.test.ts","./src/lib/nodestyledata.ts","./src/lib/openflowdslparser.ts","./src/lib/openflowdslparserv2.ts","./src/lib/reactflowcompat.ts","./src/lib/reconnectedge.test.ts","./src/lib/reconnectedge.ts","./src/lib/relationsemantics.test.ts","./src/lib/relationsemantics.ts","./src/lib/releasestaleelkroutes.test.ts","./src/lib/releasestaleelkroutes.ts","./src/lib/result.ts","./src/lib/semanticclassifier.test.ts","./src/lib/semanticclassifier.ts","./src/lib/storagepressure.test.ts","./src/lib/storagepressure.ts","./src/lib/types.ts","./src/lib/xsssafety.test.tsx","./src/services/aligndistribute.ts","./src/services/aiservice.test.ts","./src/services/aiservice.ts","./src/services/aiserviceschemas.ts","./src/services/animatedexport.test.ts","./src/services/animatedexport.ts","./src/services/architectureroundtrip.test.ts","./src/services/assetcatalog.test.ts","./src/services/assetcatalog.ts","./src/services/assetpresentation.ts","./src/services/canonicalserialization.test.ts","./src/services/canonicalserialization.ts","./src/services/composediagramfordisplay.test.ts","./src/services/composediagramfordisplay.ts","./src/services/diagramdocument.test.ts","./src/services/diagramdocument.ts","./src/services/diagramdocumentschemas.ts","./src/services/domainlibrary.test.ts","./src/services/domainlibrary.ts","./src/services/elklayout.test.ts","./src/services/elklayout.ts","./src/services/exportservice.test.ts","./src/services/exportservice.ts","./src/services/figmaexportservice.ts","./src/services/flowchartroundtrip.test.ts","./src/services/geminiservice.ts","./src/services/geminisysteminstruction.ts","./src/services/gifencoder.test.ts","./src/services/gifencoder.ts","./src/services/githubfetcher.test.ts","./src/services/githubfetcher.ts","./src/services/iconassetcatalog.ts","./src/services/importfidelity.test.ts","./src/services/importfidelity.ts","./src/services/importlayoutmetadata.ts","./src/services/mermaidparser.test.ts","./src/services/openflowdslexporter.test.ts","./src/services/openflowdslexporter.ts","./src/services/openflowdslparser.test.ts","./src/services/openflowroundtripgolden.test.ts","./src/services/openflowroundtripgoldenfixtures.ts","./src/services/operationfeedback.ts","./src/services/remainingfamiliesroundtrip.test.ts","./src/services/sequencelayout.test.ts","./src/services/sequencelayout.ts","./src/services/smartedgerouting.test.ts","./src/services/smartedgerouting.ts","./src/services/statediagramroundtrip.test.ts","./src/services/templates.selector.test.ts","./src/services/templates.ts","./src/services/viewerurlcodec.test.ts","./src/services/viewerurlcodec.ts","./src/services/zipextractor.ts","./src/services/ai/contextserializer.test.ts","./src/services/ai/contextserializer.ts","./src/services/analytics/analytics.ts","./src/services/analytics/analyticssettings.test.ts","./src/services/analytics/analyticssettings.ts","./src/services/analytics/surfaceanalyticsclient.ts","./src/services/architecturelint/defaultrules.ts","./src/services/architecturelint/ruleengine.test.ts","./src/services/architecturelint/ruleengine.ts","./src/services/architecturelint/rulelibrary.ts","./src/services/architecturelint/types.ts","./src/services/architecturelint/workspacerules.ts","./src/services/collaboration/bootstrap.test.ts","./src/services/collaboration/bootstrap.ts","./src/services/collaboration/canvasdiff.test.ts","./src/services/collaboration/canvasdiff.ts","./src/services/collaboration/comments.test.ts","./src/services/collaboration/comments.ts","./src/services/collaboration/contracts.test.ts","./src/services/collaboration/contracts.ts","./src/services/collaboration/hookutils.ts","./src/services/collaboration/operationlog.test.ts","./src/services/collaboration/operationlog.ts","./src/services/collaboration/presenceviewmodel.test.ts","./src/services/collaboration/presenceviewmodel.ts","./src/services/collaboration/reducer.test.ts","./src/services/collaboration/reducer.ts","./src/services/collaboration/roomconfig.ts","./src/services/collaboration/roomlink.test.ts","./src/services/collaboration/roomlink.ts","./src/services/collaboration/runtimecontroller.test.ts","./src/services/collaboration/runtimecontroller.ts","./src/services/collaboration/runtimehookutils.test.ts","./src/services/collaboration/runtimehookutils.ts","./src/services/collaboration/schemas.ts","./src/services/collaboration/session.test.ts","./src/services/collaboration/session.ts","./src/services/collaboration/storebridge.test.ts","./src/services/collaboration/storebridge.ts","./src/services/collaboration/transport.test.ts","./src/services/collaboration/transport.ts","./src/services/collaboration/transportfactory.test.ts","./src/services/collaboration/transportfactory.ts","./src/services/collaboration/types.ts","./src/services/collaboration/versioning.test.ts","./src/services/collaboration/versioning.ts","./src/services/collaboration/yjspeertransport.test.ts","./src/services/collaboration/yjspeertransport.ts","./src/services/diagramdiff/diffengine.ts","./src/services/elk-layout/algorithmselection.ts","./src/services/elk-layout/anchoredlayout.test.ts","./src/services/elk-layout/architecturelayout.ts","./src/services/elk-layout/boundaryfanout.ts","./src/services/elk-layout/determinism.ts","./src/services/elk-layout/edgehandles.ts","./src/services/elk-layout/fallbacklayout.ts","./src/services/elk-layout/graphbuilding.ts","./src/services/elk-layout/layoutcache.ts","./src/services/elk-layout/options.test.ts","./src/services/elk-layout/options.ts","./src/services/elk-layout/runtime.ts","./src/services/elk-layout/textsizing.ts","./src/services/elk-layout/types.ts","./src/services/export/cinematicbuildplan.test.ts","./src/services/export/cinematicbuildplan.ts","./src/services/export/cinematicexport.ts","./src/services/export/cinematicexporttheme.test.ts","./src/services/export/cinematicexporttheme.ts","./src/services/export/cinematicrenderstate.test.ts","./src/services/export/cinematicrenderstate.ts","./src/services/export/formatting.ts","./src/services/export/mermaidbuilder.test.ts","./src/services/export/mermaidbuilder.ts","./src/services/export/mermaidexportquality.test.ts","./src/services/export/pdfdocument.test.ts","./src/services/export/pdfdocument.ts","./src/services/export/plantumlbuilder.ts","./src/services/export/webcodecsexport.test.ts","./src/services/export/webcodecsexport.ts","./src/services/export/mermaid/architecturemermaid.ts","./src/services/export/mermaid/classdiagrammermaid.ts","./src/services/export/mermaid/erdiagrammermaid.ts","./src/services/export/mermaid/journeymermaid.ts","./src/services/export/mermaid/mindmapmermaid.ts","./src/services/export/mermaid/sequencemermaid.ts","./src/services/export/mermaid/statediagrammermaid.ts","./src/services/figma/edgehelpers.ts","./src/services/figma/iconhelpers.ts","./src/services/figma/nodelayers.ts","./src/services/figma/themehelpers.ts","./src/services/figmaimport/figmaapiclient.ts","./src/services/flowpilot/assetgrounding.test.ts","./src/services/flowpilot/assetgrounding.ts","./src/services/flowpilot/prompting.ts","./src/services/flowpilot/responsepolicy.test.ts","./src/services/flowpilot/responsepolicy.ts","./src/services/flowpilot/skills.ts","./src/services/flowpilot/thread.ts","./src/services/flowpilot/types.ts","./src/services/infrasync/dockercomposeparser.test.ts","./src/services/infrasync/dockercomposeparser.ts","./src/services/infrasync/infratodsl.test.ts","./src/services/infrasync/infratodsl.ts","./src/services/infrasync/kubernetesparser.test.ts","./src/services/infrasync/kubernetesparser.ts","./src/services/infrasync/terraformstateparser.test.ts","./src/services/infrasync/terraformstateparser.ts","./src/services/infrasync/types.ts","./src/services/mermaid/compatfixturecorpus.test.ts","./src/services/mermaid/compatreportharness.test.ts","./src/services/mermaid/detectdiagramtype.test.ts","./src/services/mermaid/detectdiagramtype.ts","./src/services/mermaid/diagnosticformatting.test.ts","./src/services/mermaid/diagnosticformatting.ts","./src/services/mermaid/diagnosticssnapshot.test.ts","./src/services/mermaid/diagnosticssnapshot.ts","./src/services/mermaid/editablepartialcorpus.test.ts","./src/services/mermaid/ensuremermaidmeasurementsupport.test.ts","./src/services/mermaid/ensuremermaidmeasurementsupport.ts","./src/services/mermaid/extractlayoutfromsvg.test.ts","./src/services/mermaid/extractlayoutfromsvg.ts","./src/services/mermaid/flowchartgoldcorpusintegrity.test.ts","./src/services/mermaid/flowchartimportfidelitycorpus.test.ts","./src/services/mermaid/flowchartimportoutcomecorpus.test.ts","./src/services/mermaid/importcontracts.ts","./src/services/mermaid/importgeometryutils.test.ts","./src/services/mermaid/importgeometryutils.ts","./src/services/mermaid/importprovenance.test.ts","./src/services/mermaid/importprovenance.ts","./src/services/mermaid/importsceneprojection.test.ts","./src/services/mermaid/importsceneprojection.ts","./src/services/mermaid/importstatepresentation.test.ts","./src/services/mermaid/importstatepresentation.ts","./src/services/mermaid/mermaidlayoutcorpus.test.ts","./src/services/mermaid/mermaidrendercompatibility.test.ts","./src/services/mermaid/officialflowchartimport.test.ts","./src/services/mermaid/officialflowchartimport.ts","./src/services/mermaid/officialmermaidvalidation.test.ts","./src/services/mermaid/officialmermaidvalidation.ts","./src/services/mermaid/parsemermaidbytype.test.ts","./src/services/mermaid/parsemermaidbytype.ts","./src/services/mermaid/parsemermaiddirectives.test.ts","./src/services/mermaid/parsemermaiddirectives.ts","./src/services/mermaid/recoverypresentation.test.ts","./src/services/mermaid/recoverypresentation.ts","./src/services/mermaid/rendererfirstimport.test.ts","./src/services/mermaid/rendererfirstimport.ts","./src/services/mermaid/strictmodediagnosticspresentation.test.ts","./src/services/mermaid/strictmodediagnosticspresentation.ts","./src/services/mermaid/strictmodeguidance.test.ts","./src/services/mermaid/strictmodeguidance.ts","./src/services/mermaid/strictmodeuxregression.test.ts","./src/services/mermaid/supportmatrix.test.ts","./src/services/mermaid/supportmatrix.ts","./src/services/mermaid/extractlayoutfromsvg/rawextraction.ts","./src/services/mermaid/extractlayoutfromsvg/reconciliation.ts","./src/services/mermaid/extractlayoutfromsvg/svggeometry.ts","./src/services/mermaid/extractlayoutfromsvg/types.ts","./src/services/mermaid/officialflowchartimport/edgereconciliation.ts","./src/services/mermaid/officialflowchartimport/runtime.ts","./src/services/mermaid/officialflowchartimport/sceneassembly.ts","./src/services/mermaid/officialflowchartimport/sectionmapping.ts","./src/services/mermaid/officialflowchartimport/types.ts","./src/services/offline/registerappshellserviceworker.test.ts","./src/services/offline/registerappshellserviceworker.ts","./src/services/onboarding/config.ts","./src/services/onboarding/eventschemas.ts","./src/services/onboarding/events.test.ts","./src/services/onboarding/events.ts","./src/services/playback/contracts.test.ts","./src/services/playback/contracts.ts","./src/services/playback/model.test.ts","./src/services/playback/model.ts","./src/services/playback/studio.test.ts","./src/services/playback/studio.ts","./src/services/sequence/layoutconstants.ts","./src/services/sequence/sequencemessage.test.ts","./src/services/sequence/sequencemessage.ts","./src/services/shapelibrary/bootstrap.test.ts","./src/services/shapelibrary/bootstrap.ts","./src/services/shapelibrary/ingestionpipeline.test.ts","./src/services/shapelibrary/ingestionpipeline.ts","./src/services/shapelibrary/manifestvalidation.test.ts","./src/services/shapelibrary/manifestvalidation.ts","./src/services/shapelibrary/providercatalog.test.ts","./src/services/shapelibrary/providercatalog.ts","./src/services/shapelibrary/registry.test.ts","./src/services/shapelibrary/registry.ts","./src/services/shapelibrary/starterpacks.ts","./src/services/shapelibrary/types.ts","./src/services/storage/fallbackstorage.ts","./src/services/storage/flowdocumentmodel.test.ts","./src/services/storage/flowdocumentmodel.ts","./src/services/storage/flowpersiststorage.test.ts","./src/services/storage/flowpersiststorage.ts","./src/services/storage/indexeddbhelpers.ts","./src/services/storage/indexeddbschema.test.ts","./src/services/storage/indexeddbschema.ts","./src/services/storage/indexeddbstatestorage.test.ts","./src/services/storage/indexeddbstatestorage.ts","./src/services/storage/localfirstrepository.ts","./src/services/storage/localfirstruntime.ts","./src/services/storage/persisteddocumentadapters.test.ts","./src/services/storage/persisteddocumentadapters.ts","./src/services/storage/persistencetypes.ts","./src/services/storage/snapshotstorage.test.ts","./src/services/storage/snapshotstorage.ts","./src/services/storage/storageruntime.test.ts","./src/services/storage/storageruntime.ts","./src/services/storage/storageschemas.test.ts","./src/services/storage/storageschemas.ts","./src/services/storage/storagetelemetry.test.ts","./src/services/storage/storagetelemetry.ts","./src/services/storage/storagetelemetrysink.test.ts","./src/services/storage/storagetelemetrysink.ts","./src/services/storage/uilocalstorage.test.ts","./src/services/storage/uilocalstorage.ts","./src/services/templatelibrary/registry.test.ts","./src/services/templatelibrary/registry.ts","./src/services/templatelibrary/startertemplates.assets.test.ts","./src/services/templatelibrary/startertemplates.test.ts","./src/services/templatelibrary/startertemplates.ts","./src/services/templatelibrary/templatefactories.ts","./src/services/templatelibrary/types.ts","./src/store/actionfactory.ts","./src/store/aisettings.test.ts","./src/store/aisettings.ts","./src/store/aisettingspersistence.ts","./src/store/aisettingsschemas.test.ts","./src/store/aisettingsschemas.ts","./src/store/canvashooks.ts","./src/store/createflowstore.test.ts","./src/store/createflowstore.ts","./src/store/createflowstorepersistoptions.ts","./src/store/createflowstorestate.ts","./src/store/defaults.ts","./src/store/designsystemhooks.ts","./src/store/documenthooks.ts","./src/store/documentstatesync.test.ts","./src/store/documentstatesync.ts","./src/store/editorpagehooks.ts","./src/store/historyhooks.ts","./src/store/historystate.ts","./src/store/persistence.test.ts","./src/store/persistence.ts","./src/store/persistenceschemas.ts","./src/store/selectionhooks.ts","./src/store/selectors.test.ts","./src/store/selectors.ts","./src/store/tabhooks.ts","./src/store/types.ts","./src/store/viewhooks.ts","./src/store/workspacedocumentmodel.test.ts","./src/store/workspacedocumentmodel.ts","./src/store/actions/createaiandselectionactions.ts","./src/store/actions/createcanvasactions.ts","./src/store/actions/createdesignsystemactions.ts","./src/store/actions/createhistoryactions.test.ts","./src/store/actions/createhistoryactions.ts","./src/store/actions/createlayeractions.ts","./src/store/actions/createtabactions.ts","./src/store/actions/createviewactions.ts","./src/store/actions/createworkspacedocumentactions.ts","./src/store/actions/synctabnodesedges.ts","./src/store/slices/createcanvaseditorslice.ts","./src/store/slices/createexperienceslice.ts","./src/store/slices/createworkspaceslice.ts","./src/theme/nodedefaults.ts","./src/theme/palettes.ts","./src/theme/resolvers.ts","./src/theme/sections.ts","./src/theme/types.ts"],"version":"5.8.3"} \ No newline at end of file