# アーキテクチャ — ソース実装ガイド LLM プラグインのサイドバーを支えるクライアント/サーバモジュールの技術リファレンス。 > **設計上の根拠 — 処理フロー・ルール・優先順位と「なぜそうなっているか」は > [docs/jp/design.md](./design.md) にまとめてある。** 本ドキュメントは「各モジュールが何をするか」の > カタログ、design.md は「なぜその順序・ルールなのか」を扱う。 ## 全体像 ``` Editor sidebar (vibe_ui) ──Send──► /llm-plugin/generate ──► Ollama / OpenAI / Custom ▲ │ │ ▼ addMessageToUI response { response, model, elapsed } importFlowFromMessage ◄──────────────────────────────┘ │ ├── extractFlowNodes (LLMJsonParser → Vibe Schema → FlowConverterCore.toNodeRed) ├── rebuildWorkspaceFromSnapshot (additive wires + property preservation │ + CanvasLayout positions x / y) └── applyWorkspaceDiff → 削除 / その場で更新 / リンクの追加・削除 → RED.nodes.import は「追加されたノード」だけ (差分で表現できないときは、消して入れ直す 従来方式 replaceWorkspaceFlow にフォールバック) ``` `src/core/` にある3つの独立したコアモジュールが、変換+レイアウトの土台を形成する: | モジュール | 担当 | 参照 | |--------|------|-----------| | `flow_converter_core.js` | Vibe Schema ↔ Node-RED JSON + 型判定ヘルパー | [docs/jp/vibe-schema.md](./vibe-schema.md) | | `canvas_layout.js` | トポロジカルレイアウト、幅を考慮した間隔、コメント配置、グループの枠、衝突の解消 | [docs/jp/layout.md](./layout.md) | | `llm_json_parser.js` | JSON 修復、fuzzy エイリアス一致、スキーマ抽出 | (インライン JSDoc) | 残りはすべてプラグイン固有のグルーコード。まず下のファイルマップを見て、 各ファイルの詳細はモジュールリファレンスを参照。 ## ファイルマップ ``` llm_plugin.js Node-RED プラグインのエントリポイント — server.js を読み込む llm_plugin.html サイドバー + 設定の HTML テンプレート、marked.js と DOMPurify の読み込み llm-plugin_styles.css 全プラグイン CSS docs/ 全開発者ドキュメント(このフォルダ) — en/ + jp/ src/ client.js スクリプトローダー(ブラウザのエントリ) + 設定ダイアログのコントローラ common.js 共有ヘルパー(escapeHtml, notice, el, randomId, …) prompt_system.txt Agent 用システムプロンプト: Vibe Schema の規約 prompt_ask.txt Ask 用システムプロンプト: フローを読んで説明する core/ canvas_layout.js レイアウトエンジン(UMD) flow_converter_core.js Vibe Schema 変換器(UMD) llm_json_parser.js LLM JSON パース(UMD) chat_manager.js チャットセッション CRUD + チェックポイント永続化 importer.js LLM 出力の抽出、再構築、エディタへの import ui_core.js メッセージ描画、フローエクスポート vibe_ui.js サイドバー構築 + 生成ワークフロー llm_core.js 共有 LLM エンジン(設定/認証/プロバイダ/プロンプト) server.js HTTP エンドポイント + チャット/チェックポイント永続化 node/ `llm-request` ノード(パレットカテゴリ: llm-plugin) llm-request/ msg.payload を送り、モデルの応答を出力する ``` ## 読み込み順(クライアント) `llm_plugin.html` が `