diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 00000000..ed6c5f93 --- /dev/null +++ b/.mcp.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "openflowkit": { + "command": "node", + "args": ["./mcp-server/dist/index.js"] + } + } +} diff --git a/README.md b/README.md index a76acc90..beba84ac 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 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 { "mcpServers": { "openflowkit": { "command": "npx", - "args": ["-y", "@openflowkit/mcp-server"] + "args": ["-y", "@vrun-design/openflowkit-mcp"] } } } @@ -286,7 +286,7 @@ Point any MCP client at the [`@openflowkit/mcp-server`](mcp-server/) package and 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 @@ -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/github-embed.md b/docs-site/src/content/docs/github-embed.md index 4a9621c5..3d02f6aa 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/docs-site/src/content/docs/mcp-server.md b/docs-site/src/content/docs/mcp-server.md index 857d5446..be5afaee 100644 --- a/docs-site/src/content/docs/mcp-server.md +++ b/docs-site/src/content/docs/mcp-server.md @@ -4,22 +4,22 @@ 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 `@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"] } } } @@ -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 451cac27..74f25ea4 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/) @@ -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: @@ -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 d9db00f3..cdc230d6 100644 --- a/mcp-server/package.json +++ b/mcp-server/package.json @@ -1,7 +1,8 @@ { - "name": "@openflowkit/mcp-server", - "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.", + "name": "@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", "model-context-protocol", diff --git a/mcp-server/server.json b/mcp-server/server.json new file mode 100644 index 00000000..100fb010 --- /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 OpenFlowKit diagramming tools for Claude, Cursor, Windsurf & other MCP clients.", + "repository": { + "url": "https://github.com/Vrun-design/openflowkit", + "source": "github" + }, + "version": "0.1.2", + "packages": [ + { + "registryType": "npm", + "identifier": "@vrun-design/openflowkit-mcp", + "version": "0.1.2", + "transport": { + "type": "stdio" + } + } + ] +} diff --git a/mcp-server/src/lib/version.ts b/mcp-server/src/lib/version.ts index f5d5392a..0b66c63c 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.2'; export const MCP_SERVER_NAME = 'openflowkit'; diff --git a/mcp-server/src/lib/viewerUrl.ts b/mcp-server/src/lib/viewerUrl.ts index 0245f9f3..7b38423e 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/src/tools/discovery.ts b/mcp-server/src/tools/discovery.ts index 1d78c830..1f293cf2 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/mcp-server/tests/viewerUrl.test.ts b/mcp-server/tests/viewerUrl.test.ts index 15ea1b52..580f4c1c 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/package-lock.json b/package-lock.json index 09120d38..1f5b7d68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -94,8 +94,8 @@ } }, "mcp-server": { - "name": "@openflowkit/mcp-server", - "version": "0.1.0", + "name": "@vrun-design/openflowkit-mcp", + "version": "0.1.2", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.29.0", @@ -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", diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index 29ad49ed..dd3b6117 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 3d8da78d..b0b7559d 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 1aac052d..160d5730 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 1b7bdf3d..2b2b240d 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 4ac576c1..23d26220 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 6a663077..8155085e 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 de7c7ace..cd9e2c7d 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 c38cf02a..7bf6234a 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 a9571059..a7c3c999 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( { mcpServers: { openflowkit: { command: 'npx', - args: ['-y', '@openflowkit/mcp-server'], + args: ['-y', '@vrun-design/openflowkit-mcp'], }, }, }, @@ -173,43 +171,36 @@ 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 @openflowkit/mcp-server'; + const installCmd = 'npx -y @vrun-design/openflowkit-mcp'; const config = buildConfig(); const activeClient = CLIENTS.find((c) => c.id === client) ?? CLIENTS[0]; 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 1f0855d9..6e35b836 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 00000000..2d13057d --- /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 fd10d746..2409934a 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 00000000..85f43808 --- /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 271ab359..9f96e67a 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 29ad49ed..dd3b6117 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 3d8da78d..b0b7559d 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 1aac052d..160d5730 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 1b7bdf3d..2b2b240d 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 4ac576c1..23d26220 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 6a663077..8155085e 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 de7c7ace..cd9e2c7d 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 00000000..9509c913 --- /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 00000000..3271e49d --- /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 af338b33..8c411899 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