{"_id":"@cyberocean/khabot-studio","_rev":"6-2506f7a542d44225cd028f58e2c8fa00","name":"@cyberocean/khabot-studio","dist-tags":{"latest":"2.2.1"},"versions":{"1.0.0":{"name":"@cyberocean/khabot-studio","version":"1.0.0","keywords":["khabot","ai","agents","studio","canvas","llm"],"_id":"@cyberocean/khabot-studio@1.0.0","maintainers":[{"name":"khalilbz","email":"khalil.benzineb@gmail.com"},{"name":"cyberocean.saas","email":"cyberocean.saas@gmail.com"}],"bin":{"khabot-studio":"bin/khabot-studio.js"},"dist":{"shasum":"7681b7fd7808fee388cd239c51c8d5407ff4910c","tarball":"https://registry.npmjs.org/@cyberocean/khabot-studio/-/khabot-studio-1.0.0.tgz","fileCount":88,"integrity":"sha512-E5UjG8998m/fz5oKnnhTl4RXNK/pCqOXBvdvDA2h9Tl69780vPToVZTlC2UiB8/UwU1MoHOU9YmQ0B4CFR09lg==","signatures":[{"sig":"MEYCIQChXwjrxFeakytdkMAbf4lgtLc+Thl9pgnPLQ7sFVm83wIhAPE2PE+kUlQB6yNdV25GiXu1+B0NybaK7xQfFriJmbis","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5841979},"engines":{"node":">=18"},"gitHead":"96b615c234baa4337dd48655e261f407a3784aa6","scripts":{"dev":"node bin/khabot-studio.js","build":"node scripts/build-ui.js","start":"node bin/khabot-studio.js","prepack":"npm run build"},"_npmUser":{"name":"khalilbz","email":"khalil.benzineb@gmail.com"},"_npmVersion":"9.5.0","description":"Visual IDE for KhaBot CLI agents — drag-and-drop canvas, real-time chat, and agent editor","directories":{},"_nodeVersion":"18.14.2","dependencies":{"ws":"^8.16.0","express":"^4.18.2","socket.io":"^4.7.5","better-sqlite3":"^9.4.3","http-proxy-middleware":"^2.0.6"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/khabot-studio_1.0.0_1773908223026_0.6080841642819377","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@cyberocean/khabot-studio","version":"1.0.1","keywords":["khabot","ai","agents","studio","canvas","llm"],"_id":"@cyberocean/khabot-studio@1.0.1","maintainers":[{"name":"khalilbz","email":"khalil.benzineb@gmail.com"},{"name":"cyberocean.saas","email":"cyberocean.saas@gmail.com"}],"bin":{"khabot-studio":"bin/khabot-studio.js"},"dist":{"shasum":"b3f965bcdc3ec1bd415038c619e1d7a9949d6be6","tarball":"https://registry.npmjs.org/@cyberocean/khabot-studio/-/khabot-studio-1.0.1.tgz","fileCount":88,"integrity":"sha512-+JsUDZgTYUfqc9aGPuj41Bo1Axze0gYryQWxVqBBXddfevJ3175aGLJ1ak2A3rQfzqhvR/4Td1/2A5zMxAocfA==","signatures":[{"sig":"MEUCIQCM9Ypp1laDPO2tSROuKXkKM5zC99Tlhjw9fIxOQt+4SgIgVFmwanACetvPg7qTZmQOme5C5ZJHq2LryK6SmD8bZsk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5841992},"engines":{"node":">=18"},"gitHead":"96b615c234baa4337dd48655e261f407a3784aa6","scripts":{"dev":"node bin/khabot-studio.js","build":"node scripts/build-ui.js","start":"node bin/khabot-studio.js","prepack":"npm run build"},"_npmUser":{"name":"khalilbz","email":"khalil.benzineb@gmail.com"},"_npmVersion":"9.5.0","description":"Visual IDE for KhaBot CLI agents — drag-and-drop canvas, real-time chat, and agent editor","directories":{},"_nodeVersion":"18.14.2","dependencies":{"ws":"^8.16.0","express":"^4.18.2","socket.io":"^4.7.5","better-sqlite3":"11.10.0","http-proxy-middleware":"^2.0.6"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/khabot-studio_1.0.1_1773911996550_0.35875243229391374","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@cyberocean/khabot-studio","version":"2.0.0","keywords":["khabot","ai","agents","studio","canvas","llm"],"_id":"@cyberocean/khabot-studio@2.0.0","maintainers":[{"name":"khalilbz","email":"khalil.benzineb@gmail.com"},{"name":"cyberocean.saas","email":"cyberocean.saas@gmail.com"}],"bin":{"khabot-studio":"bin/khabot-studio.js"},"dist":{"shasum":"3f00be3aa7b388a6d19108ba5a67d9666818a6f7","tarball":"https://registry.npmjs.org/@cyberocean/khabot-studio/-/khabot-studio-2.0.0.tgz","fileCount":1665,"integrity":"sha512-LVqMOkPugFRLxzAb2/Q2evYnxx9f1Rrrd/N8zWGMZHe012S6YjlTsEcQWzKQZRepGuAke4fulC601eeqbw/OxA==","signatures":[{"sig":"MEQCIFcSqgcdaR6Xpcl6d850MgMhBBg0HDtn3NH3g07tVwpaAiBiXQy+jV558jTzlIe8TdPuD149hX//K8hVuB0RGPQx9A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27084269},"engines":{"node":">=18"},"gitHead":"5626c53f06a009b0b6840b4c71915e3682c323cd","scripts":{"dev":"node bin/khabot-studio.js","build":"node scripts/build-ui.js","start":"node bin/khabot-studio.js","prepack":"npm run build"},"_npmUser":{"name":"khalilbz","email":"khalil.benzineb@gmail.com"},"_npmVersion":"9.5.0","description":"Visual IDE for KhaBot CLI agents — drag-and-drop canvas, real-time chat, and agent editor","directories":{},"_nodeVersion":"18.14.2","dependencies":{"ws":"^8.16.0","multer":"^2.1.1","express":"^4.18.2","node-pty":"^1.1.0","socket.io":"^4.7.5","better-sqlite3":"11.10.0","http-proxy-middleware":"^2.0.6"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/khabot-studio_2.0.0_1775242887285_0.05629403048008963","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"@cyberocean/khabot-studio","version":"2.1.1","keywords":["khabot","ai","agents","studio","canvas","llm"],"_id":"@cyberocean/khabot-studio@2.1.1","maintainers":[{"name":"khalilbz","email":"khalil.benzineb@gmail.com"},{"name":"cyberocean.saas","email":"cyberocean.saas@gmail.com"}],"bin":{"khabot-studio":"bin/khabot-studio.js"},"dist":{"shasum":"4078484232d47d191668fe20652a1e58362b4552","tarball":"https://registry.npmjs.org/@cyberocean/khabot-studio/-/khabot-studio-2.1.1.tgz","fileCount":1728,"integrity":"sha512-gCVfCXoRAbVo5MawNO7jS5TKAwT5PUwyvZre/1HxKyAFJbVVX3ib9CQhRr5sD8hZaTYthiKfNbqU7nEk6ItPjA==","signatures":[{"sig":"MEQCIF0uOQ3mKSm9KDJQHeh6uRcMu4mkm00n2o0GK8xkDCUIAiBnIA+u/+/Q/tT0NVZLxPs8y99x55FP1Ih8tjF0lvYuUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27640125},"engines":{"node":">=18"},"gitHead":"9264f6f3ec99903236f0c23ac1e87f3491d1ec9d","scripts":{"dev":"node bin/khabot-studio.js","test":"vitest run","aidev":"node tests/harness/server.js","build":"node scripts/build-ui.js","start":"node bin/khabot-studio.js","prepack":"npm run build","aidev:up":"node scripts/aidev-up.js","test:meta":"vitest run tests/_meta/","aidev:down":"node scripts/aidev-down.js","dev:studio":"STUDIO_AI_DEV=1 node bin/khabot-studio.js","test:watch":"vitest","aidev:spike":"node tests/_meta/_day1-spike-inject-event.js","flake-stats":"node tests/sdk/flake-budget.js 7","test:scenarios":"vitest run tests/scenarios/","aidev:log-integrity":"node tests/sdk/log-integrity.js","aidev:install-browsers":"PLAYWRIGHT_BROWSERS_PATH=./playwright-browsers npx playwright install chromium","aidev:build-fake-timers":"node tests/harness/_build-fake-timers-bundle.js","aidev:meta:inject-event":"node tests/_meta/inject-event-actually-reaches-frontend.spec.js","test:meta:mock-real-timing":"vitest run tests/_meta/mock-vs-real-timing-within-2x.spec.ts"},"_npmUser":{"name":"khalilbz","email":"khalil.benzineb@gmail.com"},"_npmVersion":"10.8.2","description":"Visual IDE for KhaBot CLI agents — drag-and-drop canvas, real-time chat, and agent editor","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ws":"^8.16.0","multer":"^2.1.1","express":"^4.18.2","chokidar":"^4.0.3","node-pty":"^1.1.0","socket.io":"^4.7.5","better-sqlite3":"11.10.0","@vscode/ripgrep":"^1.18.0","http-proxy-middleware":"^2.0.6"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","playwright":"^1.59.1","typescript":"^6.0.3","@sinonjs/fake-timers":"^11.3.1"},"_npmOperationalInternal":{"tmp":"tmp/khabot-studio_2.1.1_1781877332226_0.717742651839111","host":"s3://npm-registry-packages-npm-production"}},"2.1.3":{"name":"@cyberocean/khabot-studio","version":"2.1.3","keywords":["khabot","ai","agents","studio","canvas","llm"],"_id":"@cyberocean/khabot-studio@2.1.3","maintainers":[{"name":"khalilbz","email":"khalil.benzineb@gmail.com"},{"name":"cyberocean.saas","email":"cyberocean.saas@gmail.com"}],"bin":{"khabot-studio":"bin/khabot-studio.js"},"dist":{"shasum":"bdb86400a4db668ac2848bdb6a950a69e00637dd","tarball":"https://registry.npmjs.org/@cyberocean/khabot-studio/-/khabot-studio-2.1.3.tgz","fileCount":1730,"integrity":"sha512-oF2RSBpmqh5BOEJzYrKNqSioNG6g769vj3VjGGAic+ZhfhOTaMikpTD+w/dcwuRtatWeMBYIcwbU/0iMUB+jMg==","signatures":[{"sig":"MEUCICMldwvzTw+PYRaNSlHxeLdP/p7NKsDSP7hzp0KglPGsAiEA9ksf0CXnYHkuYtpFWqdJS7l94X9NVY7b3BGTs0cdzuQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27913202},"engines":{"node":">=18"},"gitHead":"2db90af496032b921fc7b12ecdd8970ef0b4b0e9","scripts":{"dev":"node bin/khabot-studio.js","test":"vitest run","aidev":"node tests/harness/server.js","build":"node scripts/build-ui.js","start":"node bin/khabot-studio.js","prepack":"npm run build","aidev:up":"node scripts/aidev-up.js","test:meta":"vitest run tests/_meta/","aidev:down":"node scripts/aidev-down.js","dev:studio":"STUDIO_AI_DEV=1 node bin/khabot-studio.js","test:watch":"vitest","aidev:spike":"node tests/_meta/_day1-spike-inject-event.js","flake-stats":"node tests/sdk/flake-budget.js 7","test:scenarios":"vitest run tests/scenarios/","aidev:log-integrity":"node tests/sdk/log-integrity.js","aidev:install-browsers":"PLAYWRIGHT_BROWSERS_PATH=./playwright-browsers npx playwright install chromium","aidev:build-fake-timers":"node tests/harness/_build-fake-timers-bundle.js","aidev:meta:inject-event":"node tests/_meta/inject-event-actually-reaches-frontend.spec.js","test:meta:mock-real-timing":"vitest run tests/_meta/mock-vs-real-timing-within-2x.spec.ts"},"_npmUser":{"name":"khalilbz","email":"khalil.benzineb@gmail.com"},"_npmVersion":"10.8.2","description":"Visual IDE for KhaBot CLI agents — drag-and-drop canvas, real-time chat, and agent editor","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ws":"^8.16.0","multer":"^2.1.1","express":"^4.18.2","chokidar":"^4.0.3","node-pty":"^1.1.0","socket.io":"^4.7.5","better-sqlite3":"11.10.0","@vscode/ripgrep":"^1.18.0","http-proxy-middleware":"^2.0.6"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","playwright":"^1.59.1","typescript":"^6.0.3","@sinonjs/fake-timers":"^11.3.1"},"_npmOperationalInternal":{"tmp":"tmp/khabot-studio_2.1.3_1783705000247_0.06373502444935597","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"@cyberocean/khabot-studio","version":"2.2.1","description":"Visual IDE for KhaBot CLI agents — drag-and-drop canvas, real-time chat, and agent editor","bin":{"khabot-studio":"bin/khabot-studio.js"},"scripts":{"start":"node bin/khabot-studio.js","dev":"node bin/khabot-studio.js","dev:studio":"STUDIO_AI_DEV=1 node bin/khabot-studio.js","aidev":"node tests/harness/server.js","aidev:up":"node scripts/aidev-up.js","aidev:down":"node scripts/aidev-down.js","aidev:spike":"node tests/_meta/_day1-spike-inject-event.js","aidev:log-integrity":"node tests/sdk/log-integrity.js","aidev:install-browsers":"PLAYWRIGHT_BROWSERS_PATH=./playwright-browsers npx playwright install chromium","aidev:build-fake-timers":"node tests/harness/_build-fake-timers-bundle.js","aidev:meta:inject-event":"node tests/_meta/inject-event-actually-reaches-frontend.spec.js","test":"vitest run","test:meta":"vitest run tests/_meta/","test:meta:mock-real-timing":"vitest run tests/_meta/mock-vs-real-timing-within-2x.spec.ts","test:scenarios":"vitest run tests/scenarios/","test:watch":"vitest","flake-stats":"node tests/sdk/flake-budget.js 7","build":"node scripts/build-ui.js","prepack":"npm run build"},"engines":{"node":">=18"},"keywords":["khabot","ai","agents","studio","canvas","llm"],"dependencies":{"@vscode/ripgrep":"^1.18.0","better-sqlite3":"11.10.0","chokidar":"^4.0.3","express":"^4.18.2","http-proxy-middleware":"^2.0.6","multer":"^2.1.1","node-pty":"^1.1.0","socket.io":"^4.7.5","ws":"^8.16.0"},"devDependencies":{"@sinonjs/fake-timers":"^11.3.1","playwright":"^1.59.1","typescript":"^6.0.3","vitest":"^4.1.5"},"_id":"@cyberocean/khabot-studio@2.2.1","gitHead":"2db90af496032b921fc7b12ecdd8970ef0b4b0e9","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-aoQ5TM2Dll/Ih7AWoVaxU2eq6EEpIJGegWo18J9Cj1QNL00j+9qq6rPkOWxbDyYEuW7+IuYs9+PemVj//kHSSw==","shasum":"07887cc59561f37ea4f643cbc4452d7dfdc80e8a","tarball":"https://registry.npmjs.org/@cyberocean/khabot-studio/-/khabot-studio-2.2.1.tgz","fileCount":1731,"unpackedSize":27922471,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICVmV8ywtqswipgY4rFBIo8ABrW1eGcEYhQxxktidK+tAiBRku5JPPTqaeXusJjrHAGDsjocCtMURjtHcnvL7rN9DQ=="}]},"_npmUser":{"name":"khalilbz","email":"khalil.benzineb@gmail.com"},"directories":{},"maintainers":[{"name":"khalilbz","email":"khalil.benzineb@gmail.com"},{"name":"cyberocean.saas","email":"cyberocean.saas@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/khabot-studio_2.2.1_1783818881621_0.6651108885519661"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-19T08:17:02.907Z","modified":"2026-07-12T01:14:42.055Z","1.0.0":"2026-03-19T08:17:03.307Z","1.0.1":"2026-03-19T09:19:56.969Z","2.0.0":"2026-04-03T19:01:28.269Z","2.1.1":"2026-06-19T13:55:32.603Z","2.1.3":"2026-07-10T17:36:40.560Z","2.2.1":"2026-07-12T01:14:41.915Z"},"keywords":["khabot","ai","agents","studio","canvas","llm"],"description":"Visual IDE for KhaBot CLI agents — drag-and-drop canvas, real-time chat, and agent editor","maintainers":[{"name":"khalilbz","email":"khalil.benzineb@gmail.com"},{"name":"cyberocean.saas","email":"cyberocean.saas@gmail.com"}],"readme":"# KhaBot Studio\n\nVisual workflow IDE for KhaBotCLI — an LLM agent runner.  \nDrag agents, sessions, memories, and data blocks onto an infinite canvas, wire them together, and watch everything run in real time.\n\n---\n\n## Features\n\n- **Infinite canvas** — place any element type, wire ports, organize with zones and saved views\n- **Real-time sync** — all board mutations broadcast to every connected client instantly\n- **Live chat** — stream token-by-token responses from any agent session, directly in the canvas\n- **External session monitoring** — sessions started by other apps or agent tools appear in Studio in real time, with live streaming, tool indicators, and user messages\n- **File explorer** — browse, edit, and add project files to the board as elements\n- **Persistent workspace state** — chat drafts, input history, unsaved-file hot-exit buffers, and terminal scrollback are mirrored server-side under `.khabot-studio/`, so they survive server restarts and Studio port changes\n- **Custom elements** — drop a folder into `.khabot-studio/elements/` to add any element type without rebuilding\n- **No build step** — Express server is plain CommonJS; starts instantly\n\n---\n\n## Quick Start\n\n```bash\n# Install globally\nnpm install -g @cyberocean/khabot-studio\n\n# Run (from any directory — that directory becomes the workspace)\nkhabot-studio\n```\n\nOpen **http://localhost:4444**\n\n> **Node ≥18 required** for running. Node 20 is only needed if building the frontend from source.\n\n### CLI Options\n\n```\nkhabot-studio [options]\n\n  --port,     -p  <number>  Studio port                  (default: 4444)\n  --api,      -a  <url>     KhaBotCLI API base URL       (default: http://localhost:5050)\n  --api-port, -ap <number>  KhaBotCLI port on localhost  (shortcut for --api)\n  --project,  -d  <path>    Workspace directory          (default: cwd)\n  --secret,   -s  <token>   KhaBotCLI API secret token\n  --dev,      -D            Force dev mode\n  --help,     -h            Show help\n```\n\nPositional shorthand: `khabot-studio <port> [api] [project] [secret]`\n\n### Run from source\n\n```bash\nnpm install\nnode bin/khabot-studio.js\n# or\nnpm start\n```\n\n### Dev mode (live Nuxt HMR for UI changes)\n\nPass `--dev` to spawn `nuxt dev` and proxy Vite HMR through the Studio port:\n\n```bash\nkhabot-studio --dev --port 4447 --api http://localhost:5063 --project /path/to/workspace\n```\n\n`--dev` forces Nuxt dev mode even when `nuxt-app/.output/public/` already contains a production build.\n\n---\n\n## Architecture\n\n```\nBrowser (Nuxt 3 SPA — TypeScript, Pinia, TailwindCSS)\n  │  Socket.IO   ← board mutations, chat, KhaBotCLI proxy\n  │  REST /api/files/*  ← file system only\n  ▼\nExpress server (port 4444) — Plain CommonJS, no build step\n  ├── Socket.IO handlers    server/socket.js\n  ├── REST routes           server/routes/files.js\n  ├── SQLite (sync)         .khabot-studio/studio.db\n  ├── In-memory Maps        board state (elements, links, zones, views)\n  └── WebSocket client  ──► KhaBotCLI /ws (port 5050)\n                            real-time events for all sessions\n```\n\n**Key rules:**\n- Browser **never** talks to KhaBotCLI directly — all calls proxied via Studio Socket.IO\n- Board state is **server-authoritative** — clients never optimistically mutate\n- Socket.IO for everything board/agent/chat; REST only for `/api/files/*`\n\n---\n\n## Environment Variables\n\n| Variable | Default | Purpose |\n|---|---|---|\n| `STUDIO_PORT` | `4444` | Studio server port |\n| `KHABOT_API` | `http://localhost:5050` | KhaBotCLI base URL (auto-read from `.khabot/settings.json`) |\n| `KHABOT_SECRET` | _(empty)_ | `X-KhaBot-Secret` auth header (auto-read from `.khabot/settings.json`) |\n| `PROJECT_DIR` | `process.cwd()` | Working directory (files, custom elements, DB) |\n\n---\n\n## Project Structure\n\n```\nKhaBotCLI_Studio/\n├── server/                   Backend — plain CommonJS\n│   ├── index.js              Entry: startup sequence, dev proxy, listen\n│   ├── socket.js             All Socket.IO event handlers\n│   ├── routes/files.js       REST /api/files/*\n│   └── utils/\n│       ├── config.js         All env/config resolution\n│       ├── db.js             SQLite singleton + schema\n│       ├── board-state.js    In-memory Maps + DB sync + broadcasts\n│       ├── element-registry.js  22 built-in + custom type registry\n│       ├── element-instances.js Running element instance Map\n│       ├── khabot-client.js  KhaBotCLI REST + SSE streaming wrapper\n│       ├── khabot-ws.js      Persistent WS to KhaBotCLI /ws\n│       ├── session-watcher.js   Message-count baseline tracker\n│       ├── socket-io.js      getIO()/setIO() singleton\n│       ├── file-utils.js     Path-safe file operations\n│       └── elements/         22 built-in element definitions\n│\n├── nuxt-app/                 Frontend — Nuxt 3, TypeScript, SPA\n│   ├── stores/               board.ts · ui.ts · chat.ts\n│   ├── composables/          useSocket · useBoard · useCamera · useChat\n│   │                         useKhabot · useElementRegistry · useFileExplorer\n│   ├── components/           canvas/ · elements/ · sidebar/ · chat/\n│   └── .output/              Production build (served by Express in prod)\n│\n└── docs/                     Full reference documentation\n```\n\n---\n\n## Built-in Element Types (22)\n\n| Category | Types |\n|---|---|\n| CLI | `agent` `agent-instance` `chat-view` `terminal` |\n| Data | `text` `markdown` `code-block` `json-object` `html` `web-preview` `file-reference` `image` `image-local` |\n| Dev | `diff-patch` `notification` |\n| Comm | `approval-gate` |\n| Flow | `processor` `queue` |\n| Org | `collapsible-group` `annotation` `label-tag` `divider` |\n\n---\n\n## Custom Elements\n\nDrop a folder in `.khabot-studio/elements/<type>/` containing:\n\n```\nelement.json       — metadata (type, name, icon, defaultWidth/Height, …)\nindex.js           — server-side factory: createInstance(context) → { getViewData, getPorts, actions }\nvue-component.js   — frontend Vue component (receives viewData, elementId props; emits action)\n```\n\nClick **Reload Custom Elements** in the palette sidebar — no server restart needed. Custom types with the same name as a built-in **override** the built-in completely.\n\n---\n\n## Documentation\n\n| Document | Contents |\n|---|---|\n| [`docs/README.md`](docs/README.md) | Architecture deep-dive, data flow, key decisions |\n| [`docs/Server.md`](docs/Server.md) | All server modules, DB schema, element system reference |\n| [`docs/SocketIO.md`](docs/SocketIO.md) | Every Socket.IO event — payloads, handlers, end-to-end flows |\n| [`docs/UI.md`](docs/UI.md) | Stores, composables, canvas components, chat components |\n\n---\n\n## Production Build\n\nWhen installed via `npm`, the pre-built frontend is included in the package (`nuxt-app/.output/public/`). The server auto-detects it and serves it statically.\n\nTo rebuild the frontend from source (requires Node 20):\n\n```bash\nnpm run build\n# runs scripts/build-ui.js → cd nuxt-app && nuxt build\n```\n\nThe server auto-detects whether `nuxt-app/.output/public/` exists — if yes, production mode; if no, dev mode (spawns Nuxt dev automatically). Pass `--dev` to force dev mode even when a build is present.\n","readmeFilename":"README.md"}