diff --git a/.gitignore b/.gitignore index 9b5cc67..b24dfe6 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ target/ # Editor directories and files +.cursor/ .vscode/* !.vscode/extensions.json .idea @@ -27,6 +28,7 @@ # Project specific src/backend/bin/ src/backend/*.txt +src/backend/*.db references/ private/ @@ -42,6 +44,8 @@ *.bak *.swp *.sw +tmp/* +!tmp/.gitkeep # Local helper/status files .git_status_output.txt \ No newline at end of file diff --git "a/journals/202602-009-2\346\234\210\347\254\2544\351\200\261\343\202\270\343\203\243\343\203\274\343\203\212\343\203\253\351\233\206\347\264\204.md" "b/journals/202602-009-2\346\234\210\347\254\2544\351\200\261\343\202\270\343\203\243\343\203\274\343\203\212\343\203\253\351\233\206\347\264\204.md" new file mode 100644 index 0000000..65cfab7 --- /dev/null +++ "b/journals/202602-009-2\346\234\210\347\254\2544\351\200\261\343\202\270\343\203\243\343\203\274\343\203\212\343\203\253\351\233\206\347\264\204.md" @@ -0,0 +1,620 @@ +# 2026年第009週 (2/23) 作業アーカイブ: ディレクトリ整理・Issue運用・v0.3.0・MCPリファクタ + +## 週全体のサマリー + +今週(第009週)は、2月23日単日の集中作業として、ディレクトリ整理とビルド修復から始まり、Issue 双方向同期・仕様書現代化・DB正規化・v0.3.0 リリース・UI刷新・MCPモジュール分割まで、23件の案件が実施された。**重要な方針・指摘の変遷**: (1) GitBucket を Source of Truth とする Issue 運用と手動クローズのルール化、(2) 仕様・運用の分離(docs/specification と .agent/rules)、(3) DB の documents/items 正規化とマイグレーション v0.2.5→v0.3.0、(4) コード品質基準(600行・7階層)に基づく MCP の機能分割。 + +```mermaid +gantt + title 第009週 プロジェクト進捗 (2026-02-23) + dateFormat YYYY-MM-DD + section 環境 + ディレクトリ整理とビルド修復 :2026-02-23, 1d + ソース不要ファイル掃除 :2026-02-23, 1d + section Issue + GitBucket双方向同期ツール :2026-02-23, 1d + Issue Dir Git除外・手動クローズ :2026-02-23, 1d + section ドキュメント + 仕様書現代化・LSA化 :2026-02-23, 1d + 仕様と運用ルールの分離 :2026-02-23, 1d + section DB + テーブル正規化・マイグレーション :2026-02-23, 1d + スキーマバージョン管理 :2026-02-23, 1d + section リリース + v0.3.0 繰り上げ・リリース :2026-02-23, 1d + section UI・MCP + UI刷新・MCP応答標準化・リファクタ :2026-02-23, 1d +``` + +--- + +## 2026-02-23: ディレクトリ整理とビルド修復 + +### 1. 作業実施の理由と指示 + +- **背景**: ディレクトリ構造が複雑化し、ルート直下に不要フォルダや散乱したスクリプトが多数存在。Error 1412 でクラッシュする状態に。 +- **意図と指示**: ルートを機能ごとに整理し、Tauri ビルド出力をルートに再配置したうえで Error 1412 の解消とビルド通しの確認。 + +### 2. 指摘事項とその対応 + +- **指摘**: 起動時に「Error 1412: Failed to unregister class Chrome_WidgetWin_0」が発生。 + - **対応**: 真の原因は `vec0.dll` 未検出による Rust パニックと特定。`build.rs` の相対パスを `../../node_modules` に修正して解決。 +- **指摘**: テストスクリプトもルートに。 + - **対応**: `scripts/` 内の `test_mcp_client.mjs` 等をルート直下の `tests/` に移動。 + +### 3. 作業詳細 + +AIエージェントは、ビルド出力の最適化(`.cargo/config.toml`)、不要フォルダ削除、ツール群の `tools/` 集約、テストの `tests/` 集約、ドキュメントの `docs/specification` 等への統合、ログの `logs/` 隔離を実行した。 + +### 4. AI視点での結果 + +ビルドエラーの根本原因が修正され、ディレクトリが機能・役割ベースで再構築され、保守性が向上した。 + +--- + +## 2026-02-23: ソースディレクトリの不要ファイル掃除 + +### 1. 作業実施の理由と指示 + +- **背景**: `src/` 配下の不要ファイルの調査・整理の指示。 +- **意図**: React テンプレートの残骸や一時ファイルを一掃しソースツリーをクリーンに保つこと。 + +### 2. 指摘事項とその対応 + +- **指摘**: `src/frontend/` に React 時代の不要アセットが残っている。 + - **対応**: `App.css`、`assets/`、`types/` を削除。 +- **指摘**: `src/backend/` に一時 DB 等が残っている。 + - **対応**: `telos.db*` および空の `logs/` を削除。`tests/` は保持。 + +### 3. 作業詳細 + +未使用ファイルのリストアップと実装プラン作成ののち、PowerShell で対象を削除。 + +### 4. AI視点での結果 + +フロント・バックエンドとも本番に必要なコードとリソースのみが残る洗練された構造となった。 + +--- + +## 2026-02-23: GitBucket Issue 双方向同期ツールの作成 + +### 1. 作業実施の理由と指示 + +- **背景**: GitBucket の Issue をローカル `docs/issues/` に Markdown で同期(プル・プッシュ)したい要望。 +- **意図**: 双方向同期スクリプトを構築し、GitBucket をシームレスなローカル Issue トラッカーとして利用可能にする。 + +### 2. 指摘事項とその対応 + +- **指摘**: 全 Issue 取得と更新の仕組みが必要。 + - **対応**: GitHub API 互換エンドポイントに対し `fetch` を用いた `tools/scripts/sync_issues.mjs` を作成。 +- **指摘**: 双方向の整合性。 + - **対応**: Frontmatter(`id`, `state`, `title`, `updated_at`)でメタデータを保持し、`updated_at` 比較で Pull/Push。`id: new` は POST で新規発番からリネームまで自動処理。 + +### 3. 作業詳細 + +実装計画とタスク定義ののち、`sync_issues.mjs` を実装。既存 Issue 2件の Pull に成功。 + +### 4. AI視点での結果 + +IDE 上で Markdown として Issue の閲覧・追記・クローズが可能になり、開発フローが効率化された。※ リモート Push には `.env` の `GITBUCKET_TOKEN` が必要。 + +--- + +## 2026-02-23: IssueディレクトリのGit管理除外 + +### 1. 作業実施の理由と指示 + +- **背景**: リモートが正のため、`docs/issues/` を Git で二重管理しないようにしたいとの指摘。 +- **意図**: `.gitignore` に `docs/issues/` を登録し、追跡から除外する。 + +### 2. 指摘事項とその対応 + +- **指摘**: `docs/issues/` が Git 管理下になっている。 + - **対応**: `.gitignore` に追記し、`git rm -r --cached docs/issues/` で追跡のみ解除。 + +### 3. 作業詳細 + +`.gitignore` 追記、キャッシュからの除外、ジャーナル作成とコミット・プッシュを実施。 + +### 4. AI視点での結果 + +同期スクリプトと Git の責務が分離され、リポジトリが不要な Markdown 履歴で汚れない運用が確立した。 + +--- + +## 2026-02-23: Issue-1のテストとリリース + +### 1. 作業実施の理由と指示 + +- **背景**: ディレクトリ改修・脱LLM化に伴い、最新 `main` で全機能のコンパイル・テスト通過とリリースバイナリ構築が必要。 +- **意図**: バックエンド API の正常性を検証したうえで Tauri 本番インストーラーを生成し、Issue-1 をクローズする。 + +### 2. 指摘事項とその対応 + +- **指摘**: API テストが別プロセス起動を前提にしている。 + - **対応**: テスト前に `cargo run` で API サーバーを起動し、`cargo test` で疎通確認。 +- **指摘**: GitBucket へのクローズ反映がスキップされた。 + - **対応**: `GITBUCKET_TOKEN` 未設定のため Push はスキップ。ローカル `Issue-1.md` は `state: closed` に更新済み。 + +### 3. 作業詳細 + +テスト・リリース計画の立案、API サーバー起動下での `cargo test` 成功、`npm run tauri build` でインストーラー生成、Issue-1 のクローズと同期スクリプト実行。 + +### 4. AI視点での結果 + +大再編後の TelosDB が完全に機能し、本番バイナリとしてリリース可能であることが証明された。 + +--- + +## 2026-02-23: Issue手動管理ルールの策定と同期ツールの改良 + +### 1. 作業実施の理由と指示 + +- **背景**: GitBucket API の制限(PATCH で 404)により、スクリプトによる自動クローズが不可能と判明。 +- **意図**: 「クローズのみ手動」という運用ルールを策定し、ツールで URL 通知等の支援を行う。開発ガイドに追記。 + +### 2. 指摘事項とその対応 + +- **指摘**: 同期スクリプトがエラーで停止する。 + - **対応**: 404 を個別にキャッチし、例外を投げず「手動操作が必要」と対象 URL を表示するよう変更。 +- **指摘**: ルールの明文化。 + - **対応**: `06_development_guide.md` に「Issue管理ルール」を新設。 + +### 3. 作業詳細 + +`sync_issues.mjs` の PATCH 失敗時のリマインド機能実装、開発ガイドの更新、Issue #2 での URL リマインド表示を検証。 + +### 4. AI視点での結果 + +API の制限をルールと補助機能でカバーする運用体制を構築した。 + +--- + +## 2026-02-23: 仕様書の現代化とLSA化の反映 + +### 1. 作業実施の理由と指示 + +- **背景**: システムが LLM から LSA へ転換したが、`docs/specification/` が旧来の `src-tauri` 依存・LLM 前提のまま。 +- **意図**: 現状のディレクトリ(`src/frontend`, `src/backend`)および LSA ベース検索エンジンに即して仕様書をすべて更新する。 + +### 2. 指摘事項とその対応 + +- **指摘**: 仕様書がレガシーのまま。 + - **対応**: `01_system_overview.md`〜`04_mcp_api_specification.md`、`07_ui_design_spec.md`、`mcp.json` を LSA・50次元・サイドカー排除に合わせて全面更新。 + +### 3. 作業詳細 + +全ファイルの走査と「脱LLM・LSA特化」に合わせた論理的な書き換え。Mermaid 図もシングルプロセス構成に修正。 + +### 4. AI視点での結果 + +仕様書がソースコードと完全に一致する唯一の正(Single Source of Truth)の状態になった。 + +--- + +## 2026-02-23: READMEの現代化 + +### 1. 作業実施の理由と指示 + +- **背景**: 仕様書と同様、トップの `README.md` も LLM 基盤や古いディレクトリ構成の記述が残っていた。 +- **意図**: LSA 特化型エンジンと整理後のディレクトリに合わせて README を最新化する。 + +### 2. 指摘事項とその対応 + +- **指摘**: README もレガシー。 + - **対応**: コンセプトを LSA/50d に変更、システム構成図からサイドカーを排除、ディレクトリ構成を `src/frontend`, `src/backend` 等に修正、環境要件から重いモデル不要を反映。デザインをミニマル・ハイコントラストに修正。 + +### 3. 作業詳細 + +古いパスの置換、LSA による「GPU不要」「モデル配置不要」の強調、デザイン文言の修正。 + +### 4. AI視点での結果 + +初見の開発者・エージェントが現在のアーキテクチャを正しく把握できる環境が整った。 + +--- + +## 2026-02-23: Issueの日英併記ルールの策定 + +### 1. 作業実施の理由と指示 + +- **背景**: 透明性とグローバル対応のため、Issue を日本語・英語の両方で管理する方針に。 +- **意図**: 全 Issue でタイトル・本文を日英併記とし、既存分の翻訳を補完。片方のみの場合はもう一方を追記する運用とする。 + +### 2. 指摘事項とその対応 + +- **指摘**: 既存 Issue が日本語のみ。 + - **対応**: `Issue-1.md` および `Issue-2.md` に英語を追記。 +- **指摘**: ルールの明文化。 + - **対応**: 開発ガイドの「Issue管理ルール」に日英併記の義務化を追加。 + +### 3. 作業詳細 + +開発ガイドの更新、Issue-1/Issue-2 の翻訳・更新、同期スクリプト実行と手動更新用 URL リマインドの確認。 + +### 4. AI視点での結果 + +ローカル `docs/issues/` はすべて日英併記となり、新規 Issue でも自動で翻訳提案・補完する流れが確立した。 + +--- + +## 2026-02-23: Issueトラッカー仕様の抽象化 + +### 1. 作業実施の理由と指示 + +- **背景**: 「GitBucket」という固有名詞のため、他トラッカー(GitHub, GitLab, Gitea)へのポータビリティが損なわれていた。 +- **意図**: 「上流 Issue トラッカー」「GitHub 互換 API」等の抽象表現に置き換え、汎用性を高める。 + +### 2. 指摘事項とその対応 + +- **指摘**: GitBucket 連携を仕様に書くとポータビリティが失われる。 + - **対応**: README と `06_development_guide.md` で製品名依存を排除し、「上流トラッカー」「GitHub v3 互換 API」に抽象化。 + +### 3. 作業詳細 + +該当ドキュメントの走査と意味を維持したままの呼称変更。同期スクリプトの実装詳細ではなく「外部トラッカーとの同期」という運用定義に修正。 + +### 4. AI視点での結果 + +制約が「特定ソフト」から「プロトコル(GitHub API v3)」に昇華し、将来のトラッカー切り替え時も仕様の大幅書き換えが不要な記述になった。 + +--- + +## 2026-02-23: 仕様書とプロジェクト運用ルールの分離 + +### 1. 作業実施の理由と指示 + +- **背景**: `docs/specification/` にプロジェクト運用ルール(GitBucket 連携・Issue の書き方等)が混在し、設計書のポータビリティを損なっていた。 +- **意図**: システムの「仕様」とリポジトリの「作法・運用」をフォルダ単位で明確に分離する。 + +### 2. 指摘事項とその対応 + +- **指摘**: GitBucket 連携を仕様に書くのは筋が違う。 + - **対応**: `06_development_guide.md` から Issue 管理記述を削除し、新設の `docs/workflow/issue_management.md` に移行。README のディレクトリ案を仕様とワークフロー区別で更新。 + +### 3. 作業詳細 + +`docs/workflow/issue_management.md` の作成、既存ルールの集約、`06_development_guide.md` を純粋な技術ガイドに再定義、README の修正。 + +### 4. AI視点での結果 + +設計書は「システムの作り」、ワークフローは「開発の進め方」を独立して記述する健全な構成となった。 + +--- + +## 2026-02-23: テーブル構造の正規化とドキュメント・チャンクの分離 + +### 1. 作業実施の理由 + +Issue-2 に基づく DB 正規化。従来は `items` にチャンクごとに同一 `path` が冗長に保持されていた。 + +### 2. 指示(背景・観点・意図) + +- **背景**: チャンク分割によりメタデータとデータが混在。 +- **観点**: 1 ドキュメント対 N チャンクを DB 上で明示的に管理。 +- **意図**: 削除のドキュメント単位一括操作と、検索結果での正しいソース表示を可能にする。 + +### 3. 指示事項とその対応 + +- **documents テーブル**: 新設し `path` を一意に管理。 +- **items テーブル**: `document_id` と `chunk_index` を追加、冗長な `path` を削除。 +- **MCP ツール**: `add_item_text`・`search_text` を新スキーマに合わせてリファクタ。型不整合は `JsonRpcResponse` で解決。 + +### 4. 作業詳細 + +`db.rs` のスキーマ更新、`mcp.rs` の各ツールリファクタ(特に `add_item_text` でドキュメント存在確認と既存チャンク削除)、仕様書 ER 図の更新。 + +### 5. AI視点での結果 + +DB 構造がクリーンになり、ドキュメント単位の管理が容易になった。Axum ハンドラと MCP の境界も明確化した。 + +--- + +## 2026-02-23: 運用ルールの.agent_rulesへの移行と日英併記化 + +### 1. 作業実施の理由 + +ユーザー指示に基づき、運用ルールを `.agent/rules` に集約し、日英併記を適用するため。 + +### 2. 指示(背景・観点・意図) + +- **背景**: `docs/` に仕様と運用が混在。 +- **観点**: AI が読むルールを `.agent/rules` に置き、セッション開始時にコンテキスト化する。 +- **意図**: ルールを日英併記にし、グローバル開発・AI 協調を円滑にする。 + +### 3. 指摘事項とその対応 + +- **ルール配置**: `issue_management.md` を `.agent/rules` へ移動。技術仕様は `docs/specification` で継続。 +- **番号調整**: `06_development_guide.md` → `05_`、`07_ui_design_spec.md` → `06_` にリネーム。 +- **日英併記**: 両ファイルに英語翻訳を追加。移動元を削除。 + +### 4. 作業詳細 + +`issue_management.md` の抽出・英訳と `.agent/rules` への配置、開発ガイド・UI 仕様のリネームと日英併記、技術仕様と AI 向けルールの境界を明確化。 + +### 5. AI視点での結果 + +運用ルールが `.agent/rules` に集約され、AI の自己規律が高まる。日英併記で一貫したポリシーとなった。 + +--- + +## 2026-02-23: MIMEタイプ対応の追加 + +### 1. 作業実施の理由 + +`documents` に MIME を保持し、将来の PDF・画像・コード等の拡張に対応しやすくするため。 + +### 2. 指示(背景・観点・意図) + +- **背景**: 現状はテキストチャンクのみだが、ソース形式をメタデータとして保持したい。 +- **観点**: スキーマを維持しつつ、自動検知と明示指定の両方をサポート。 +- **意図**: フロント表示切り替えやバックエンドのパース処理の布石とする。 + +### 3. 指示事項とその対応 + +- **スキーマ**: `documents` に `mime TEXT` を追加。 +- **自動検知**: `mcp` 内で `path` 拡張子から主要 MIME を判別。 +- **ツール**: `add_item_text` に `mime` 引数追加、検索結果に `mime` を返す。DB 仕様書を更新。 + +### 4. 作業詳細 + +`db.rs` のテーブル定義修正、`mcp.rs` の `add_item_text` と検索・get の MIME 対応、`cargo check` で整合性確認。 + +### 5. AI視点での結果 + +TelosDB が「型(MIME)を持ったドキュメント集合」としての性質を強め、将来の UI・マルチモーダル対応の基盤となった。 + +--- + +## 2026-02-23: バージョン0.3.0への繰り上げとブランチ作成 + +### 1. 作業実施の理由 + +MIME 対応等の新機能が完了し、バージョンを 0.3.0 に繰り上げ、リリース用ブランチを作成するため。 + +### 2. 指示(背景・意図) + +- **背景**: 0.2.x の開発が一区切り。 +- **意図**: セマンティックバージョニングに基づきマイナーバージョンを上げ、大きな機能追加を明示する。 + +### 3. 指示事項とその対応 + +- **ブランチ**: `release/v0.3.0` を新規作成。 +- **バージョン**: 全関連ファイルのバージョンを `0.3.0` に統一。 + +### 4. 作業詳細 + +`release/v0.3.0` の作成とチェックアウト、`Cargo.toml`・`mcp` の initialize レスポンス・`tauri.conf.json`・`package.json` のバージョン更新、`cargo check` と `Cargo.lock` の検証。 + +### 5. AI視点での結果 + +TelosDB が正式に 0.3.0 開発サイクルへ移行し、複数設定ファイルのバージョンが同期された。 + +--- + +## 2026-02-23: リリースv0.3.0の作成 + +### 1. 作業実施の理由 + +0.3.0 繰り上げに伴い、リリースノートの作成と Git タグ付与でマイルストーンを確定するため。 + +### 2. 指示(背景・意図) + +- **指示**: 「0.3.0でリリース作って」 +- **背景**: リファクタリング・MIME・日本語解析改善等の成果を一つのパッケージとして定義する。 + +### 3. 指示事項とその対応 + +- **リリースノート**: `RELEASE_v0.3.0.md` を作成。MIME、DB 正規化、検索精度向上、Vibrato 移行を網羅。 +- **タグ**: 現在のコミットに `v0.3.0` を付与。 + +### 4. 作業詳細 + +リリースノート作成、`release/v0.3.0` へのコミット、`git tag -a v0.3.0 -m "Release v0.3.0"` の実行。追記としてリポジトリ整理コミット(.githooks、.protected-files、CONTRIBUTING、ジャーナル名正規化等)の要約を記録。 + +### 5. AI視点での結果 + +v0.3.0 が正式にリリース定義され、内部構造の健全化と解析精度向上が両立したマイルストーンとなった。 + +--- + +## 2026-02-23: データベースのマイグレーション対応(v0.2.5→v0.3.0) + +### 1. 作業実施の理由 + +v0.3.0 のテーブル正規化により v0.2.5 との互換性が失われたため、既存ユーザーがデータを失わず移行できる自動マイグレーションを実装する。 + +### 2. 指示(背景・観点・意図) + +- **指示**: 「マイグレーション作れる?」→「ごー」 +- **背景**: 手動の DB 削除・再構築はバリアが高いため、起動時にスキーマを自動変換したい。 +- **意図**: 既存 `items` からメタデータを抽出し、`documents` との 1:N 構造に再編。ベクトル整合のため `id` を維持する。 + +### 3. 指示事項とその対応 + +- **自動検知**: `PRAGMA table_info(items)` で古い `path` の有無を確認し、要否を判断。 +- **データ移行**: `documents` 新規作成、ユニークな path を移行。`items` を新スキーマで再作成(`document_id`・`chunk_index` 付与)。全工程を 1 トランザクションで実行。 + +### 4. 作業詳細 + +`db.rs` に `migrate_025_to_030` を実装、`init_schema` 冒頭で呼び出し、`cargo check` で確認。ウォークスルーで移行ロジックを整理。 + +### 5. AI視点での結果 + +ユーザーは特別な操作なく v0.3.0 へアップデート可能になった。ベクトル ID を引き継ぐ設計で再インデックスも最小限に抑えられた。 + +--- + +## 2026-02-23: スキーマバージョン管理テーブルの追加 + +### 1. 作業実施の理由 + +今後のマイグレーションを確実かつ自動的に管理するため、DB 自体に現在のスキーマバージョンを保持する。 + +### 2. 指示(背景・観点・意図) + +- **指示**: 「dbに今のテーブル構成がどのバージョンであるか格納するテーブルを1つ作ったらどうか」 +- **背景**: これまではカラムの有無等で推測していたが、複雑化に備え明示管理が必要。 +- **意図**: 「`internal_metadata` が存在しない = 0.3.0 未満」という判断基準を導入し、既存マイグレーションを整理する。 + +### 3. 指示事項とその対応 + +- **管理テーブル**: `key` と `value` を持つ `internal_metadata` を追加。`version: 0.3.0` を保存。 +- **マイグレーション**: `migrate_025_to_030` でまず `internal_metadata` の有無を確認するステップを追加。DB 仕様書を更新。 + +### 4. 作業詳細 + +`db.rs` で `internal_metadata` の作成とバージョン書き込みを `init_schema` に追加。`migrate_025_to_030` のリファクタ、仕様書の ER 図・説明の更新、`cargo check` で確認。 + +### 5. AI視点での結果 + +明示的なバージョン管理により、今後のマイグレーションが安全かつ論理的に行えるようになった。v0.2.5 以前にも「テーブル有無で判断」が有効な移行パスとなった。 + +--- + +## 2026-02-23: ヘッダ/フッタ再設計 + +### 目的 + +ヘッダ・フッタの見た目と配置を安定させ、「画面左端基準でのヘッダ」「フッタも左端基準」にすること。 + +### 指示 + +- ヘッダは画面左端基準。フッタも左端基準。必要ならフッタも再配置。 + +### 作業要約(AI視点) + +`site-header.js` と `styles.css` を編集し、ロゴを左端に安定配置。フッタの内側コンテナを左寄せに変更。ユーザーのスクリーンショットとフィードバックで微調整。 + +### 変更履歴(主要) + +- **site-header.js**: `header-content` ラッパーを導入し、ロゴをラッパー内に配置。 +- **main-panel.js**: 検索パネル内のブランドを削除、`model-name-display` を `stats` 内へ移動。 +- **styles.css**: `--page-vertical-padding` を 0 に。ヘッダを左端基準に。フッタの `.footer-inner` を左端基準に。パネルボーダーを削除してフラット化。 + +### AIエージェントの所感 + +初期の「サイドバーに被らないようメインと揃える」方針がユーザー意図と食い違い混乱を招いた。次回からはレイアウト基準(左端基準 or サイドバー基準)を先に確認する運用に改善する。 + +--- + +## 2026-02-23: UIデザインの刷新とミニマリズムの徹底 + +### 1. 作業実施の理由 + +`06_ui_design_spec.md` の「High-Contrast Minimalism」を完全に反映し、グラスモーフィズムからプロフェッショナルなソリッドデザインへ進化させるため。 + +### 2. 指示(背景・観点・意図) + +- **背景**: 「軽量・高速なローカル検索エンジン」へシフトし、UI も速度感と明瞭さを体現する必要があった。 +- **観点**: 透明度・ブラーを排除し、漆黒基調のハイコントラスト、1px ボーダー、Outfit/Inter の使い分け。 +- **意図**: ノイズを極限まで減らした HUD 的な使い心地を実現する。 + +### 3. 指摘事項とその対応 + +- **指摘**: `main-panel.js` で構文エラー。 + - **対応**: ファイルを整理して上書きし、冗長・構文ミスを排除。 +- **指摘**: 「宝くじ」が検索に引っかからない。 + - **対応**: FTS5 (BM25) を導入し、キーワード一致を優先するハイブリッド検索に変更。 +- **指摘**: MCP Activity ログが描画されない。 + - **対応**: カスタムエレメントの生成タイミングを考慮し、SSE 受信ごとに描画ターゲットを動的に探索するよう修正。 +- **指摘**: コピーボタンはダイアログに。 + - **対応**: MCP 設定ダイアログ内にコピー機能を移設。 +- **指摘**: フッタのバージョン表記は不要、コピーライトは DtmOjaji に。 + - **対応**: フッタからバージョン削除、サイドバー INFO(TelosDB アコーディオン)にバージョンとコピーライトを集約。権利表記を DtmOjaji に統一。 + +### 4. 作業詳細 + +UI は High-Contrast Minimalism でレイアウト・コンポーネント・UX を刷新。バックエンドは FTS5/Trigram と BM25 を導入し、Vector と BM25 の Max を取るハイブリッド検索を `search_text` に実装。フッタ・メタ情報を整理し、バージョンとコピーライトをサイドバーに集約。 + +### 5. AI視点での結果 + +ビジュアルに留まらず検索アルゴリズムを強化し、BM25 により Elasticsearch 級のキーワード検索をローカルで実現。UI は「道具としての美しさ」と操作性が融合した。 + +--- + +## 2026-02-23: MCPツール応答形式の標準化と検索エラーの修正 + +### 1. 作業実施の理由 + +Qwen 等の LLM から MCP で `search_text` を実行した際に Tool call failed が発生する問題に対応するため。 + +### 2. 指示(背景・観点・意図) + +- **背景**: 従来は検索結果の JSON 配列をそのまま `content` に返しており、MCP 仕様(`{type: "text", text: "..."}` 形式)に準拠していなかった。 +- **観点**: 仕様不合だと LLM が「引数が間違っている」等の誤解をしやすい。 +- **意図**: 全 MCP ツールの応答を標準化し、空クエリによる FTS5 エラーも防止する。 + +### 3. 指摘事項とその対応 + +- **指摘**: Qwen で「content パラメータは文字列である必要がある」等のエラー。 + - **対応**: 検索結果を JSON 文字列として 1 つのテキストブロックにまとめ、MCP 準拠形式で返却。エラー時は `isError: true` を含む標準形式に統一。空 `content` の事前チェックを追加。 + +### 4. 作業詳細 + +`mcp` 内の全ツールの応答を MCP 仕様に適合させ、`search_text` は `to_string_pretty` でデコードし `{ type: "text", text: "..." }` の配列で返却。旧 UI 用 `lsa_search` を `search_text` に統合・整理。 + +### 5. AI視点での結果 + +配列の直接返却がプロトコルレベルで拒絶されていた原因を解消し、多様な LLM から一貫して TelosDB 検索を利用可能にした。エラーハンドリングの標準化で不測時も LLM が状況を正しく伝えられるようになった。 + +--- + +## 2026-02-23: MCPモジュールのリファクタリングと機能分割 + +### 作業実施の理由 + +`src/backend/src/mcp.rs` が 1100 行超・ネスト 13 階層となり、コード品質基準(600 行以内・7 階層以内)を大幅に超過していたため。 + +### 指示内容 + +- **背景**: 保守性向上のため、巨大ファイルを機能単位で分割する。 +- **観点**: MCP の責務を通信(axum)、データ型、バックグラウンド処理、個別ツールに分ける。 +- **意図**: 各ファイルの役割を明確にし、機能追加・デバッグを容易にする。 + +### 構成案と実行 + +`mcp.rs` を `src/backend/src/mcp/` 配下の複数モジュールに分割した。 + +- **types.rs**: `AppState`、JSON-RPC 構造体。 +- **handlers.rs**: SSE・ステータス・doc_count・model_name 等の axum ハンドラ。 +- **system.rs**: LSA トレーニング・HNSW 同期等の基盤ロジック。 +- **tools/mod.rs**: ツールディスパッチャ。 +- **tools/items.rs**: add, update, delete, get。 +- **tools/search.rs**: search_text のハイブリッド検索。 +- **tools/system.rs**: lsa_retrain。 +- **mod.rs**: メッセージハンドラとサーバー起動。 + +### 指摘事項とその対応 + +- **不一致**: `JapaneseTokenizer::new()` の Result 処理漏れでビルドエラー → `unwrap()` を追加。 +- **ハンドラ復旧**: 誤削除した `initialize` ハンドラを `mod.rs` に復旧。 +- **通信ロジック**: バインドを `127.0.0.1` に戻し、SSE セッション時は SSE ストリーム経由でレスポンスを返すよう復元。 +- **CPU ブロッキング**: LSA 学習・HNSW 同期を `spawn_blocking` に移譲し、起動時のレスポンス低下と初期化タイムアウトを防止。 +- **フロント**: 検索結果で `similarity` 未定義時に `toFixed` で落ちる問題を修正。MCP 準拠の JSON 文字列レスポンスのパースを改善。 +- **プロトコル**: `JsonRpcResponse` で `null` をシリアライズしないよう修正。`session_id` と `sessionId` のエイリアスをサポート。 +- **診断**: デシリアライズ前に生のリクエストボディをログ出力。各サブモジュールのインポートを補完。 + +### 作業詳細 + +`mcp/` ディレクトリ作成、機能ごとのファイル分割、`mcp.rs` 削除と `lib.rs` の参照を `mcp/mod.rs` に変更。`cargo check`、`count_loc.cjs`・`nesting_depth.cjs` で品質基準を確認。 + +### AI視点での結果 + +- **行数**: 最大 348 行(items.rs)で 600 行基準をクリア。 +- **ネスト**: 複雑な match・ネストを解消し、各関数の複雑度が低下。 +- **保守性**: 機能追加時に編集対象ファイルが明確になり、開発効率の向上が期待できる。 + +```mermaid +graph TD + A[lib.rs] --> B[mcp/mod.rs] + B --> C[mcp/handlers.rs] + B --> D[mcp/tools/mod.rs] + B --> E[mcp/system.rs] + D --> F[mcp/tools/items.rs] + D --> G[mcp/tools/search.rs] + D --> H[mcp/tools/system.rs] + F -.-> I[AppState / types.rs] + G -.-> I + H -.-> I +``` diff --git "a/journals/20260223-0001-\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\346\225\264\347\220\206\343\201\250\343\203\223\343\203\253\343\203\211\344\277\256\345\276\251.md" "b/journals/20260223-0001-\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\346\225\264\347\220\206\343\201\250\343\203\223\343\203\253\343\203\211\344\277\256\345\276\251.md" deleted file mode 100644 index dd806c2..0000000 --- "a/journals/20260223-0001-\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\346\225\264\347\220\206\343\201\250\343\203\223\343\203\253\343\203\211\344\277\256\345\276\251.md" +++ /dev/null @@ -1,44 +0,0 @@ -# 作業報告: ディレクトリ構造の大規模整理とTauriビルド(Error 1412)の修復 - -## 1. 作業実施の理由と指示 - -- **背景**: これまでの作業で、`src` や `src-tauri` などのディレクトリ構造が複雑化しており、またルート直下に `public`, `frontend`, `scripts`, `private/tools` など、不要なフォルダや散乱したスクリプトが多数存在していた。さらに、その過程でアプリケーションが「Error 1412」を出してクラッシュする状態に陥っていた。 -- **意図と指示**: ユーザーより、ルートの雑多なフォルダを機能ごとに整理すること、およびTauriビルド出力(`target/ディレクトリ`)をルートに再配置したうえで、Error 1412 の解消ならびに正しいビルド通しの確認が求められた。 - -## 2. 指摘事項とその対応 - -- **指摘**: アプリ起動時に「Error 1412: Failed to unregister class Chrome_WidgetWin_0」が発生する。 - - **対応**: AIエージェントはログを調査し、Error 1412がWebView2のただの終了症状であり、真の原因はRustバックエンドでのパニック(`vec0.dll` が見つからないこと)であると特定した。ディレクトリ階層(`src-tauri` -> `src/backend`)が変わったことで `build.rs` 内の Node モジュールの相対パス(`../node_modules`)がズレていたため、これを `../../node_modules` に修正することで解決した。 -- **指摘**: LLMモデルなどのファイルが `src-tauri/bin/` ごと失われた。 - - **対応**: Git管理外 (`.gitignore` 対象) であったため、整理の過程で一時退避されず削除されたことを報告。現状LLM自動起動はコメントアウトされているため動作に支障はないが、再配置が必要な旨をユーザーに伝達した。 -- **指摘**: テストスクリプトもルートに置くべきとの追加要望。 - - **対応**: AIエージェントは即座に提案を修正し、`scripts/` 内の `test_mcp_client.mjs` などを新規作成したルート直下の `tests/` ディレクトリに移動した。 - -## 3. 作業詳細 - -AIエージェントは以下の作業を実行した: - -- **ビルド出力の最適化**: `src/backend/.cargo/config.toml` を作成し、Rustのビルド成果物が `d:\develop\TelosDB\target` に出力されるよう構成変更。`.gitignore` のパスも調整した。 -- **不要フォルダの削除**: `public/`、空の `frontend/` を削除した。 -- **ツール群の集約**: Node.jsアプリケーション(`gemini-rag-tool`)やバッチファイルを `tools/` 配下へ統合した。これに伴い、`private/` と `scripts/` ディレクトリを削除した。 -- **テストの集約**: テスト用スクリプトを `tests/` に移動した。 -- **ドキュメントの整理**: `document/` と `references/` をそれぞれ `docs/specification/` および `docs/references/` に移動し、ドキュメント系を統合した。 -- **ログの隔離**: ルートに散らかっていた `log.txt` などを `logs/` ディレクトリに移動した。 - -## 4. AI視点での結果 - -```mermaid -graph TD - A[Error 1412 Crash] --> B[Log Analysis] - B --> C(Identified vec0.dll Missing) - C --> D[Fix relative path in build.rs] - D --> E[App Launches Successfully] - - F[Messy Root Dir] --> G[Consolidate to func-based folders] - G --> H[tools/ for scripts] - G --> I[tests/ for testing code] - G --> J[docs/ for documentation] - G --> K[logs/ for logs] -``` - -AIエージェントの主導により、ビルドエラーの根本的な原因(パスのズレ)が正しく修正され、アプリが正常に起動することを確認できた。また、ディレクトリ構造が機能・役割ベース(`src`, `tools`, `tests`, `docs`)で綺麗に再構築され、開発環境としての見通しと保守性が大幅に向上した。一連の変更に伴う内部のパス参照(例:`main.mjs` の出力先)も漏れなく更新し、完全な状態でタスクを完了した。 diff --git "a/journals/20260223-0002-\343\202\275\343\203\274\343\202\271\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\343\201\256\344\270\215\350\246\201\343\203\225\343\202\241\343\202\244\343\203\253\346\216\203\351\231\244.md" "b/journals/20260223-0002-\343\202\275\343\203\274\343\202\271\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\343\201\256\344\270\215\350\246\201\343\203\225\343\202\241\343\202\244\343\203\253\346\216\203\351\231\244.md" deleted file mode 100644 index 91f05db..0000000 --- "a/journals/20260223-0002-\343\202\275\343\203\274\343\202\271\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\343\201\256\344\270\215\350\246\201\343\203\225\343\202\241\343\202\244\343\203\253\346\216\203\351\231\244.md" +++ /dev/null @@ -1,45 +0,0 @@ -# 作業報告: ソースディレクトリの不要ファイル掃除 - -## 1. 作業実施の理由と指示 - -- **背景**: ルート階層の整理に続き、ユーザーより `src/` 配下のソースフォルダ内にも不要なファイルが残っていないか調査・整理するよう指示があった。 -- **意図と指示**: かつてのReactテンプレートの残骸や、開発過程で生じた余分な一時ファイルを一掃し、ソースコードツリーをクリーンに保つこと。 - -## 2. 指摘事項とその対応 - -- **指摘**: `src/frontend/` にReact時代の不要アセットが残っている。 - - **対応**: 現在は純粋な Vanilla JS 構成のため、使用されていない `App.css`、`assets/` フォルダ(`react.svg` 等)、`types/` フォルダ(`tauri.d.ts`)を完全に削除した。 -- **指摘**: `src/backend/` にバックエンド単体で実行した際の一時ファイルが残っている。 - - **対応**: プロジェクトルートに存在する正規のDBとは異なる、ディレクトリ内で直接生成されたごみデータベースファイル(`telos.db*`)および空の `logs/` フォルダを削除した。 - - ※ `src/backend/tests/` はRustの統合テスト環境として正しい用途であるため保持した。 - -## 3. 作業詳細 - -AIエージェントは以下の作業を実行した: - -- 未使用ファイル・フォルダのリストアップと実装プラン(`implementation_plan_cleanup.md`)の作成。 -- ユーザーの承認後、PowerShellコマンドにより以下の対象を強制削除。 - - `src/frontend/App.css` - - `src/frontend/assets/` - - `src/frontend/types/` - - `src/backend/telos.db`, `src/backend/telos.db-shm`, `src/backend/telos.db-wal` - - `src/backend/logs/` - -## 4. AI視点での結果 - -```mermaid -graph TD - A[Source Directory Inspection] --> B{frontend/} - B -->|React leftovers| C(App.css, assets/, types/) - B -->|Keep| D(Vanilla JS Assets) - A --> E{backend/} - E -->|Stray DB/Logs| F(telos.db*, logs/) - E -->|Keep| G(Rust Source, tests/) - - C --> H[Delete] - F --> H - D --> I[Clean Source Tree] - G --> I -``` - -AIエージェント主導による徹底的な掃除の結果、フロントエンド・バックエンド共に本番稼働に必要なコードとリソースのみが残る、洗練されたディレクトリ構造となった。これにより、今後の保守作業におけるノイズが削減された。 diff --git "a/journals/20260223-0003-GitBucket-Issue\345\217\214\346\226\271\345\220\221\345\220\214\346\234\237\343\203\204\343\203\274\343\203\253\343\201\256\344\275\234\346\210\220.md" "b/journals/20260223-0003-GitBucket-Issue\345\217\214\346\226\271\345\220\221\345\220\214\346\234\237\343\203\204\343\203\274\343\203\253\343\201\256\344\275\234\346\210\220.md" deleted file mode 100644 index 2a4c2dd..0000000 --- "a/journals/20260223-0003-GitBucket-Issue\345\217\214\346\226\271\345\220\221\345\220\214\346\234\237\343\203\204\343\203\274\343\203\253\343\201\256\344\275\234\346\210\220.md" +++ /dev/null @@ -1,36 +0,0 @@ -# 作業報告: GitBucket Issue 双方向同期ツールの作成 - -## 1. 作業実施の理由と指示 - -- **背景**: ユーザーより、GitBucketのリモートリポジトリに存在するIssueデータをローカル環境(`docs/issues/`)にMarkdownとして同期(プルおよびプッシュ)できないかとの要望があった。 -- **意図と指示**: 単なる一方向のダウンロードだけでなく、ローカルでMarkdownを編集した内容をリモートへ反映(Push)、また新規発行(Create)が行える双方向(2-way)同期スクリプトを構築し、GitBucketをシームレスなローカルIssueトラッカーとして利用可能にすること。 - -## 2. 指摘事項とその対応 - -- **指摘**: GitBucketからの全Issue取得と更新の仕組みが必要。 - - **対応**: GitHub API互換の `https://gitbucket.tmworks.club/api/v3/repos/dtmoyaji/TelosDB/issues` エンドポイントに対し、Node.jsの標準 `fetch` を用いて通信を行う `tools/scripts/sync_issues.mjs` を作成した。 -- **指摘**: 双方向の整合性(コンフリクト管理)をどうするか。 - - **対応**: 各Markdownの先頭にYAML形式のFrontmatterメタデータ(`id`, `state`, `title`, `updated_at`)を持たせた。スクリプト実行時にリモート側の `updated_at` とローカルファイルの更新日時を厳密に比較し、より新しい方を正として上書き(Pull / Push)を行うロジックを実装した。また、`id: new` として作成されたファイルはPOST通信を行い、新規Issueとして発番からリネームまでを自動処理する仕組みを取り入れた。 - -## 3. 作業詳細 - -AIエージェントは以下の作業を実行した: - -- 実装計画(`implementation_plan_issues.md`)の作成と、タスクリストの定義。 -- `tools/scripts/sync_issues.mjs` の実装。依存モジュール(YAMLパーサー等)を不要にするため、専用の正規表現を用いた軽量なFrontmatter解析ロジックを自作。 -- スクリプトのテスト実行を実施し、リモートに存在する既存のIssue2件(Issue-1, Issue-2)を `docs/issues/` 内に正確なMarkdownファイルとして生成(Pull)成功した。 - -## 4. AI視点での結果 - -```mermaid -graph LR - A[docs/issues/*.md] <-->|sync_issues.mjs| B((GitBucket API)) - - A -->|1. meta: id: new| B1[POST: Create Issue] - B1 -.-> A1(Rename to Issue-X.md) - A -->|2. Local is Newer| B2[PATCH: Update Issue] - B -->|3. Remote is Newer| A2[Write/Overwrite Markdown] -``` - -双方向同期スクリプトの完成により、今後開発者はIDE(VS Code等)上で直接MarkdownとしてIssueの閲覧・追記・クローズが可能になった。これによりブラウザとエディタ間を往復する手間が省かれ、開発のフローが劇的に効率化される見込みである。 -※ 注意:リモートへのPush操作を行うには `.env` に `GITBUCKET_TOKEN` の設定が必要。 diff --git "a/journals/20260223-0004-Issue\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\343\201\256Git\347\256\241\347\220\206\351\231\244\345\244\226.md" "b/journals/20260223-0004-Issue\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\343\201\256Git\347\256\241\347\220\206\351\231\244\345\244\226.md" deleted file mode 100644 index ab84c9e..0000000 --- "a/journals/20260223-0004-Issue\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\343\201\256Git\347\256\241\347\220\206\351\231\244\345\244\226.md" +++ /dev/null @@ -1,34 +0,0 @@ -# 作業報告: IssueディレクトリのGit管理除外 - -## 1. 作業実施の理由と指示 - -- **背景**: ユーザーより「リモート(GitBucket)に常に最新データがあるため、`docs/issues/`のMarkdownファイル群はローカルのGitリポジトリで管理する必要はないのではないか」との鋭い指摘があった。 -- **意図と指示**: GitBucketを正(Single Source of Truth)として利用する双方向同期ツールを導入したため、ローカルのGitによる二重管理を防ぐべく、同ディレクトリをGitの追跡から除外(`.gitignore`への登録)すること。 - -## 2. 指摘事項とその対応 - -- **指摘**: `docs/issues/` がGitの管理下(追跡対象)になってしまっている。 - - **対応**: - 1. プロジェクトルートの `.gitignore` に `docs/issues/` を追記した。 - 2. 既に直前のコミットでGitのインデックスに登録されてしまっていたため、`git rm -r --cached docs/issues/` コマンドを実行し、ローカルのファイルは残したままGitの追跡対象からのみ除外した。 - -## 3. 作業詳細 - -AIエージェントは以下の作業を実行した: - -- `.gitignore` ファイルへの除外ルールの追記。 -- キャッシュされたIssueファイル群のインデックス削除(untacking)。 -- 本ジャーナルの作成および、修正に対するGitコミット・プッシュの実行。 - -## 4. AI視点での結果 - -```mermaid -graph TD - A[docs/issues/*.md] -->|Managed by| B(GitBucket API / sync_issues.mjs) - A -.-x|Ignored by| C(Local Git Repository) - - style B fill:#34d399,stroke:#059669 - style C fill:#f87171,stroke:#dc2626 -``` - -ユーザーの的確なアーキテクチャ視点により、設計上の冗長性が速やかに解消された。今後は同期スクリプトとGitコマンドの責務が完全に分離され、リポジトリが不要なMarkdownファイルの更新履歴で汚染されることがなくなる。クリーンな運用体制が確立した。 diff --git "a/journals/20260223-0005-Issue-1\343\201\256\343\203\206\343\202\271\343\203\210\343\201\250\343\203\252\343\203\252\343\203\274\343\202\271.md" "b/journals/20260223-0005-Issue-1\343\201\256\343\203\206\343\202\271\343\203\210\343\201\250\343\203\252\343\203\252\343\203\274\343\202\271.md" deleted file mode 100644 index 97dd8ab..0000000 --- "a/journals/20260223-0005-Issue-1\343\201\256\343\203\206\343\202\271\343\203\210\343\201\250\343\203\252\343\203\252\343\203\274\343\202\271.md" +++ /dev/null @@ -1,39 +0,0 @@ -# 作業報告: Issue-1「テストとリリース」の実行完了 - -## 1. 作業実施の理由と指示 - -- **背景**: ディレクトリ構造の大規模改修と脱LLM化に伴い、最新の `main` ブランチにおいて全機能が正しくコンパイルおよびテストを通過するか確認し、本番環境向けのリリースバイナリを構築する必要があった。 -- **意図と指示**: ユーザからの要求に従い、バックエンドAPIの正常性を検証するテストを実行した上で Tauri の本番インストーラーを生成すること。さらにこの一連の作業と完了報告として、紐づく「Issue-1」をクローズすること。 - -## 2. 指摘事項とその対応 - -- **指摘**: APIテスト(`search_api.rs`)が別プロセスのサーバー起動を前提にしている。 - - **対応**: テスト実行前に `cargo run` コマンドを使って一時的にバックエンドAPIサーバーを起動し、その状態で `cargo test` を走らせることで正常に疎通確認をパスさせた。 -- **指摘**: GitBucketへのクローズ状態の反映(Push)がスキップされた。 - - **対応**: 同期スクリプト `sync_issues.mjs` を実行した際、`.env` に `GITBUCKET_TOKEN` が設定されていなかったためリモートへのPushはスキップされた。ただしローカルの `docs/issues/Issue-1.md` ファイル自体は正常に `state: closed` に更新されている。ユーザにはトークンの設定を後日案内する。 - -## 3. 作業詳細 - -AIエージェントは以下の作業を実行した: - -- `implementation_plan_release.md` にてテストおよびリリース計画を立案。 -- バックエンドAPIサーバー(`127.0.0.1:3001`)を起動し、`cargo test` により `search_api.rs` の疎通と正常終了を確認。 -- `npm run tauri build` を実行し、700を超えるクレートのコンパイルと `makensis` によるインストーラー作成(`TelosDB_0.2.5_x64-setup.exe`等の生成)に成功。 -- `docs/issues/Issue-1.md` の Frontmatter を `state: closed` に編集し、同期スクリプトを走らせてローカルからリモートへの反映を試行(※認証未設定のためAPI Pushはスキップ)。 - -## 4. AI視点での結果 - -```mermaid -graph TD - A[Start Backend Server] --> B(cargo run :3001) - B --> C[Run API Tests] - C --> D{cargo test pass?} - D -- Yes --> E[Terminate Server] - E --> F[Release Build] - F --> G(npm run tauri build -> .exe) - G --> H[Close Issue-1] - H --> I(Update Issue-1.md state: closed) - I --> J[Run sync_issues.mjs] -``` - -以上のプロセスにより、ディレクトリ大再編後のTelosDBが完全に機能し、本番バイナリとしてリリース可能な状態であることが証明された。ローカルのIssue状態も「クローズ」としてマークされ、プロジェクトの大きなマイルストーン(初期リリース)1つの完了を示した。 diff --git "a/journals/20260223-0006-Issue\346\211\213\345\213\225\347\256\241\347\220\206\343\203\253\343\203\274\343\203\253\343\201\256\347\255\226\345\256\232.md" "b/journals/20260223-0006-Issue\346\211\213\345\213\225\347\256\241\347\220\206\343\203\253\343\203\274\343\203\253\343\201\256\347\255\226\345\256\232.md" deleted file mode 100644 index 6789d48..0000000 --- "a/journals/20260223-0006-Issue\346\211\213\345\213\225\347\256\241\347\220\206\343\203\253\343\203\274\343\203\253\343\201\256\347\255\226\345\256\232.md" +++ /dev/null @@ -1,36 +0,0 @@ -# 作業報告: Issue手動管理ルールの策定と同期ツールの改良 - -## 1. 作業実施の理由と指示 - -- **背景**: GitBucket APIの制限(PATCHメソッドによるIssue状態変更が404エラーになる)により、同期スクリプト完全自動でのIssueクローズが不可能であることが判明した。 -- **意図と指示**: 無理にAPIでの自動化を追及せず、実用性を重視して「クローズのみ手動で行う」という運用ルールを策定し、ツール側でその操作を支援(URL通知)するように改良すること。また、このルールを開発ガイドに追加すること。 - -## 2. 指摘事項とその対応 - -- **指摘**: 同期スクリプトがエラーで停止してしまう。 - - **対応**: `updateRemoteIssue` 関数内で 404 エラーを個別にキャッチし、例外を投げずに「手動操作が必要」という警告と対象IssueのURLをコンソールに表示するよう変更した。 -- **指摘**: ルールを明文化してほしい。 - - **対応**: `docs/specification/06_development_guide.md` に「6. Issue管理ルール」のセクションを新設。クローズ作業が手動であること、および同期ツールの役割を明確に記載した。 - -## 3. 作業詳細 - -AIエージェントは以下の作業を実行した: - -- `tools/scripts/sync_issues.mjs` の通信ロジックを修正。PATCHの失敗を検知してURLをリマインドする機能を実装。 -- `docs/specification/06_development_guide.md` を更新し、Issue追跡除外(.gitignore)と手動クローズ運用をルール化。 -- 改良後のスクリプトを実行し、Issue #2 に対して正しいURLリマインドが表示されることを検証。 - -## 4. AI視点での結果 - -```mermaid -graph TD - A[Local Markdown closed] --> B(sync_issues.mjs) - B --> C{API PATCH issue} - C -- 404 Error --> D[Print Manual Action Reminder] - D --> E[User clicks URL] - E --> F[Manual Close on Web] - F --> G[Next Sync: Pull closed state] - G --> H[Local Metadata Synced] -``` - -APIの技術的限界を「ルールの明文化」と「補助機能」でカバーする、堅実な運用体制を構築できた。これにより、ユーザーは迷うことなく開発サイクルを回すことが可能になった。 diff --git "a/journals/20260223-0007-\344\273\225\346\247\230\346\233\270\343\201\256\347\217\276\344\273\243\345\214\226\343\201\250LSA\345\214\226\343\201\256\345\217\215\346\230\240.md" "b/journals/20260223-0007-\344\273\225\346\247\230\346\233\270\343\201\256\347\217\276\344\273\243\345\214\226\343\201\250LSA\345\214\226\343\201\256\345\217\215\346\230\240.md" deleted file mode 100644 index ad108cc..0000000 --- "a/journals/20260223-0007-\344\273\225\346\247\230\346\233\270\343\201\256\347\217\276\344\273\243\345\214\226\343\201\250LSA\345\214\226\343\201\256\345\217\215\346\230\240.md" +++ /dev/null @@ -1,39 +0,0 @@ -# 作業報告: 仕様書の現代化とLSA化の反映 - -## 1. 作業実施の理由と指示 - -- **背景**: システムの基本設計が LLM (Gemma-3) メディアから LSA (Latent Semantic Analysis) へと大きく転換されたが、`docs/specification/` 内のドキュメントが旧来の `src-tauri` 依存や LLM 前提の記述(レガシー)のまま残っていた。 -- **意図と指示**: 現状のディレクトリ構造 (`src/frontend`, `src/backend`) および、高速・軽量な LSA ベースの検索エンジンに即した内容にすべての仕様書を更新すること。 - -## 2. 指摘事項とその対応 - -- **指摘**: 仕様書がレガシーなままである。 - - **対応**: 以下のファイルを全面的にリフレッシュした。 - - `01_system_overview.md`: コア技術を LSA に変更、GPU 不要の環境要件に修正。 - - `02_architecture_design.md`: 外部プロセス (llama-server) の排除、Rust 内部での SVD 解析への構成図更新。 - - `03_database_specification.md`: ベクトル次元数を 640 から 50 に、ER図に `items_lsa` を追記。 - - `04_mcp_api_specification.md`: LLM 通信エラーの記述を LSA 初期化エラー等に修正。 - - `07_ui_design_spec.md`: LSA ステータス表示の記述を更新。 - - `mcp.json`: 通信時の 640d 記述を 50d に修正。 - -## 3. 作業詳細 - -AIエージェントは以下の作業を実行した: - -- `docs/specification/` 内の全ファイルを走査し、`src-tauri` および `llama-server`, `Gemma-3` のキーワードを検索。 -- 各ドキュメントを現状の「脱LLM・LSA特化」の設計思想に合わせて論理的に書き換え。 -- Mermaid 図解も、サイドカープロセスを持たない「シングルプロセス・マルチスレッド」構成に修正。 - -## 4. AI視点での結果 - -```mermaid -graph LR - A[Legacy Docs] --> B{Modernization} - B --> C[01: Concepts -> LSA] - B --> D[02: Arch -> No Sidecar] - B --> E[03: DB -> 50 Dimensions] - B --> F[04/07: API/UI -> Verified] - C & D & E & F --> G[Consistent Specification] -``` - -これにより、開発環境の混乱(古いドキュメントを見て llama-server を探すなど)を未然に防ぎ、プロジェクトの「唯一の正(Single Source of Truth)」としての仕様書が現在のソースコードと完全に一致する状態になった。 diff --git "a/journals/20260223-0008-README\343\201\256\347\217\276\344\273\243\345\214\226.md" "b/journals/20260223-0008-README\343\201\256\347\217\276\344\273\243\345\214\226.md" deleted file mode 100644 index 1f70ff1..0000000 --- "a/journals/20260223-0008-README\343\201\256\347\217\276\344\273\243\345\214\226.md" +++ /dev/null @@ -1,36 +0,0 @@ -# 作業報告: READMEの現代化 - -## 1. 作業実施の理由と指示 - -- **背景**: `docs/specification/` 内の仕様書を現代化したのと同様に、プロジェクトの顔であるトップディレクトリの `README.md` も依然として LLM 基盤や古いディレクトリ構成に言及しているレガシーな状態であった。 -- **意図と指示**: 現状の「LSA (Latent Semantic Analysis) 特化型エンジン」および「整理後のディレクトリ構造」に合わせ、`README.md` を最新化すること。 - -## 2. 指摘事項とその対応 - -- **指摘**: READMEもレガシーである。 - - **対応**: 以下の項目を全面的に更新した。 - - **コンセプトの修正**: Gemma-3/LLM/sqlite-vec(640d) ベースから LSA/sqlite-vec(50d) ベースに書き換え。 - - **システム構成図 (Mermaid)**: サイドカープロセス (llama-server) の排除、Rust 内部での分析フローを反映。 - - **ディレクトリ構成**: 整理後の `src/frontend`, `src/backend` へのパス修正、および `docs/issues/` の追記。 - - **環境要件**: 重いGGUFモデルのダウンロード・配置が不要になった点を反映。 - -## 3. 作業詳細 - -AIエージェントは以下の作業を実行した: - -- `README.md` 内の古いパス(`src-tauri` 等)の置換。 -- LSA 導入による「GPU不要」「モデル配置不要」というプロジェクトのメリットを強調するように文言を調整。 -- デザインコンセプトを「ガラスモーフィズム」から、現在の実装である「ミニマルなハイコントラスト・ダークデザイン」に修正。 - -## 4. AI視点での結果 - -```mermaid -graph TD - A[Legacy README] --> B{Modernization} - B --> C[Update Concepts: LSA focus] - B --> D[Update Paths: src/bg, src/fg] - B --> E[Update Mermaid: Single Process] - C & D & E --> F[Current README] -``` - -トップの README を更新したことで、プロジェクトを初めて開いた開発者(またはエージェント)が、迷うことなく現在のアーキテクチャを正しく把握できる環境が完成した。 diff --git "a/journals/20260223-0009-Issue\343\201\256\346\227\245\350\213\261\344\275\265\350\250\230\343\203\253\343\203\274\343\203\253\343\201\256\347\255\226\345\256\232.md" "b/journals/20260223-0009-Issue\343\201\256\346\227\245\350\213\261\344\275\265\350\250\230\343\203\253\343\203\274\343\203\253\343\201\256\347\255\226\345\256\232.md" deleted file mode 100644 index 6f0cacb..0000000 --- "a/journals/20260223-0009-Issue\343\201\256\346\227\245\350\213\261\344\275\265\350\250\230\343\203\253\343\203\274\343\203\253\343\201\256\347\255\226\345\256\232.md" +++ /dev/null @@ -1,38 +0,0 @@ -# 作業報告: Issueの日英併記ルールの策定 - -## 1. 作業実施の理由と指示 - -- **背景**: プロジェクトの透明性と将来的なグローバル対応を見据え、Issueの記述を日本語と英語の両方で管理する方針となった。 -- **意図と指示**: - - すべての Issue において、タイトルと本文に日本語と英語を併記することをルール化する。 - - 既存の Issue について、不足している翻訳を補完する。 - - 日本語または英語の片方のみで書かれた Issue を見つけた場合は、即座にもう一方の言語を追記する運用とする。 - -## 2. 指摘事項とその対応 - -- **指摘**: 既存の Issue が日本語のみである。 - - **対応**: `Issue-1.md` および `Issue-2.md` に英語タイトルと英語本文の翻訳を追記した。 -- **指摘**: ルールを明文化してほしい。 - - **対応**: `docs/specification/06_development_guide.md` の「Issue管理ルール」に日英併記の義務化に関する項目を追加した。 - -## 3. 作業詳細 - -AIエージェントは以下の作業を実行した: - -- `docs/specification/06_development_guide.md` を更新し、「日英併記の義務化」ルールを定義。 -- `docs/issues/Issue-1.md` を翻訳・更新(Test and Release)。 -- `docs/issues/Issue-2.md` を翻訳・更新(Review Table Structure)。 -- 同期スクリプト `sync_issues.mjs` を実行。APIの制限によりリモートへの自動反映はできないため、手動更新用のURLリマインドが表示されることを確認。 - -## 4. AI視点での結果 - -```mermaid -graph TD - A[New Issue Policy] --> B[Dev Guide Update] - B --> C[Translate Existing Issues] - C --> D[Run Sync Script] - D --> E[Manual Update Reminder] - E --> F[Issues become Bilingual] -``` - -今回の対応により、ローカルの `docs/issues/` 内のドキュメントはすべて日英併記の形となった。リモート(GitBucket)側についても、表示されたURLからユーザーが手動で翻訳内容を反映させることで、プロジェクト全体のドキュメント品質が向上する。今後は、新規Issue作成時もAIエージェントが自動的に翻訳を提案・補完する流れが確立される。 diff --git "a/journals/20260223-0011-Issue\343\203\210\343\203\251\343\203\203\343\202\253\343\203\274\344\273\225\346\247\230\343\201\256\346\212\275\350\261\241\345\214\226.md" "b/journals/20260223-0011-Issue\343\203\210\343\203\251\343\203\203\343\202\253\343\203\274\344\273\225\346\247\230\343\201\256\346\212\275\350\261\241\345\214\226.md" deleted file mode 100644 index ffe8525..0000000 --- "a/journals/20260223-0011-Issue\343\203\210\343\203\251\343\203\203\343\202\253\343\203\274\344\273\225\346\247\230\343\201\256\346\212\275\350\261\241\345\214\226.md" +++ /dev/null @@ -1,33 +0,0 @@ -# 作業報告: Issueトラッカー仕様の抽象化 - -## 1. 作業実施の理由と指示 - -- **背景**: これまでの仕様書では、具体的なツール名である「GitBucket」が直接記述されていた。これにより、他の GitHub 互換トラッカー(GitHub 自体や GitLab, Gitea 等)へ移行する際のポータビリティが損なわれていた。 -- **意図と指示**: 仕様書内の「GitBucket」という固有名詞を、「上流 Issue トラッカー」や「GitHub 互換 API」といった抽象的な表現に置き換え、システムの汎用性を高めること。 - -## 2. 指記事項とその対応 - -- **指摘**: GitBucket 連携を仕様に書いたらポータビリティが失われる。 - - **対応**: 以下のドキュメントにおいて、特定の製品名への依存を排除した。 - - `README.md`: 「GitBucket 連携」を「外部 Issue トラッカー連携 (GitHub 互換 API)」に修正。 - - `docs/specification/06_development_guide.md`: 「GitBucket」を「上流の Issue トラッカー」や「GitHub v3 互換 API」に置き換え。 - -## 3. 作業詳細 - -AIエージェントは以下の作業を実行した: - -- `README.md` および `06_development_guide.md` を走査し、GitBucket という固有名詞が含まれる箇所を特定。 -- 意味内容(GitHub API v3 互換であること)は維持しつつ、呼称を「上流トラッカー」等に抽象化。 -- 同期スクリプトの実装詳細ではなく、運用ルールとしての「外部トラッカーとの同期」という定義に修正。 - -## 4. AI視点での結果 - -```mermaid -graph LR - A[Specific: GitBucket] --> B{Abstraction} - B --> C[General: Upstream Tracker] - B --> D[Standard: GitHub Compatible API] - C & D --> E[Portable Specification] -``` - -今回の修正により、ドキュメント上の制約が「特定のソフトウェア」から「特定のプロトコル(GitHub API v3)」へと昇華された。これにより、将来的にトラッカーを GitHub や Gitea に切り替えた際も、仕様書の大幅な書き換えを必要としない堅牢な設計記述となった。 diff --git "a/journals/20260223-0012-\344\273\225\346\247\230\346\233\270\343\201\250\343\203\227\343\203\255\343\202\270\343\202\247\343\202\257\343\203\210\351\201\213\347\224\250\343\203\253\343\203\274\343\203\253\343\201\256\345\210\206\351\233\242.md" "b/journals/20260223-0012-\344\273\225\346\247\230\346\233\270\343\201\250\343\203\227\343\203\255\343\202\270\343\202\247\343\202\257\343\203\210\351\201\213\347\224\250\343\203\253\343\203\274\343\203\253\343\201\256\345\210\206\351\233\242.md" deleted file mode 100644 index bbd05d2..0000000 --- "a/journals/20260223-0012-\344\273\225\346\247\230\346\233\270\343\201\250\343\203\227\343\203\255\343\202\270\343\202\247\343\202\257\343\203\210\351\201\213\347\224\250\343\203\253\343\203\274\343\203\253\343\201\256\345\210\206\351\233\242.md" +++ /dev/null @@ -1,36 +0,0 @@ -# 作業報告: 仕様書とプロジェクト運用ルールの分離 - -## 1. 作業実施の理由と指示 - -- **背景**: これまで `docs/specification/` 内の仕様書に、特定のプロジェクト運用ルール(GitBucket 連携や Issue の書き方等)が混在していた。これはシステムの純粋な設計書としてのポータビリティを損なうものである。 -- **意図と指示**: システム本体の「仕様(Specification)」と、その開発リポジトリにおける「作法・運用ルーチン(Workflow/Ops)」を明確にフォルダ単位で分離すること。 - -## 2. 指記内容とその対応 - -- **指摘**: GitBucket 連携を仕様に書くのは筋が違う。 - - **対応**: - - `docs/specification/06_development_guide.md` から Issue 管理に関する記述をすべて削除。 - - 削除した内容を、新設した `docs/workflow/issue_management.md` に移行。 - - README のディレクトリ構成案を、仕様とワークフローを区別する形に更新。 - -## 3. 作業詳細 - -AIエージェントは以下の作業を実行した: - -- `docs/workflow/` ディレクトリ(存在しない場合は作成)に `issue_management.md` を作成。 -- 既存の「日英併記ルール」「自動クリーンアップルール」「手動クローズ手順」を新ドキュメントへ集約。 -- `docs/specification/06_development_guide.md` を、TelosDB エンジンのビルドや拡張に関する純粋な技術ガイドとして再定義。 -- `README.md` の説明を、新構造に合わせて修正。 - -## 4. AI視点での結果 - -```mermaid -graph TD - A[Mixed Docs] --> B{Refactoring} - B --> C[docs/specification: Pure Tech Design] - B --> D[docs/workflow: Project Admin Rules] - C --> E[High Portability] - D --> F[Clear Team Standards] -``` - -この分離により、例えば TelosDB のエンジン部分だけを別のプロジェクトへ持ち出す際に、不要な「GitBucket 用の運用ドキュメント」が設計書に混じり込むことがなくなった。設計書は「システムの作り」を、ワークフローは「開発の進め方」を、それぞれ独立して記述する健全な構成となった。 diff --git "a/journals/20260223-0013-\343\203\206\343\203\274\343\203\226\343\203\253\346\247\213\351\200\240\343\201\256\346\255\243\350\246\217\345\214\226\343\201\250\343\203\211\343\202\255\343\203\245\343\203\241\343\203\263\343\203\210\343\203\273\343\203\201\343\203\243\343\203\263\343\202\257\343\201\256\345\210\206\351\233\242.md" "b/journals/20260223-0013-\343\203\206\343\203\274\343\203\226\343\203\253\346\247\213\351\200\240\343\201\256\346\255\243\350\246\217\345\214\226\343\201\250\343\203\211\343\202\255\343\203\245\343\203\241\343\203\263\343\203\210\343\203\273\343\203\201\343\203\243\343\203\263\343\202\257\343\201\256\345\210\206\351\233\242.md" deleted file mode 100644 index c72f120..0000000 --- "a/journals/20260223-0013-\343\203\206\343\203\274\343\203\226\343\203\253\346\247\213\351\200\240\343\201\256\346\255\243\350\246\217\345\214\226\343\201\250\343\203\211\343\202\255\343\203\245\343\203\241\343\203\263\343\203\210\343\203\273\343\203\201\343\203\243\343\203\263\343\202\257\343\201\256\345\210\206\351\233\242.md" +++ /dev/null @@ -1,43 +0,0 @@ -# Journal: 20260223-0013-テーブル構造の正規化とドキュメント・チャンクの分離 - -## 1. 作業実施の理由 - -Issue-2に基づき、データベースの正規化を行うため。従来の設計では、1つのドキュメントを複数チャンクに分割した際、`items`テーブルにチャンクごとに同じ`path`情報が保持され、データの冗長性と管理上の不都合が生じていた。 - -## 2. 指示(背景、観点、意図を含む) - -- **背景**: 意味検索の精度向上のためチャンク分割を導入したが、メタデータとデータが混在していた。 -- **観点**: 1ドキュメント対Nチャンクの関係をデータベース上で明示的に管理する。 -- **意図**: 削除時にドキュメント単位で一括操作を可能にし、かつ検索結果で正しいソースを表示できるようにする。 - -## 3. 指示事項とその対応 - -- **ドキュメントテーブルの作成**: `documents`テーブルを新設し、`path`を一意に管理。 -- **アイテムテーブルの変更**: `document_id`と`chunk_index`を追加し、冗長な`path`を削除。 -- **MCPツールの修正**: `add_item_text`や`search_text`を新スキーマに合わせてリファクタリング。 -- **型不整合の修正 (AI自律修正)**: `axum::response::Response`と`Option`の不整合を、`JsonRpcResponse`の活用により解決。 - -## 4. 作業詳細 - -AIエージェントは以下の手順で作業を実施した。 - -1. `src/backend/src/db.rs` のスキーマ定義を更新し、`documents`テーブルの追加と`items`テーブルの正規化を行った。 -2. `src/backend/src/mcp.rs` の各ツールロジックをリファクタリングした。特に `add_item_text` では、ドキュメントの存在確認と既存チャンクのクリーンアップを含めて再実装した。 -3. 開発中に遭遇した型不整合エラー(Axumの戻り型とMCP内部ロジックの不一致)を検知し、適切なレスポンス変換ロジックを組み込むことで自律的に解決した。 -4. 仕様書(`03_database_specification.md`)のER図と解説を更新した。 - -## 5. AI視点での結果 - -リファクタリングにより、データベース構造がクリーンになり、将来的なドキュメント管理(一括削除や管理画面での表示など)が容易になった。また、コンパイルエラーの修正過程で、AxumハンドラとMCPツールロジックの境界をより正確に把握し、堅牢なエラーレスポンスの実装が行えた。 - -```mermaid -graph TD - A[Add Item Request] --> B{Find Document?} - B -- No --> C[Create Document Record] - B -- Yes --> D[Wipe Old Chunks] - C --> E[Loop: Split Content] - D --> E - E --> F[Generate LSA Vector] - F --> G[Save Chunk to items] - G --> H[Update HNSW Index] -``` diff --git "a/journals/20260223-0014-\351\201\213\347\224\250\343\203\253\343\203\274\343\203\253\343\201\256.agent_rules\343\201\270\343\201\256\347\247\273\350\241\214\343\201\250\346\227\245\350\213\261\344\275\265\350\250\230\345\214\226.md" "b/journals/20260223-0014-\351\201\213\347\224\250\343\203\253\343\203\274\343\203\253\343\201\256.agent_rules\343\201\270\343\201\256\347\247\273\350\241\214\343\201\250\346\227\245\350\213\261\344\275\265\350\250\230\345\214\226.md" deleted file mode 100644 index 034ede7..0000000 --- "a/journals/20260223-0014-\351\201\213\347\224\250\343\203\253\343\203\274\343\203\253\343\201\256.agent_rules\343\201\270\343\201\256\347\247\273\350\241\214\343\201\250\346\227\245\350\213\261\344\275\265\350\250\230\345\214\226.md" +++ /dev/null @@ -1,45 +0,0 @@ -# Journal: 20260223-0014-運用ルールの.agent_rulesへの移行と日英併記化 - -## 1. 作業実施の理由 - -ユーザー指示に基づき、プロジェクトの運用ルールをAIエージェントが優先的に読み込む `.agent/rules` ディレクトリへ集約し、かつ日英併記のポリシーを適用するため。 - -## 2. 指示(背景、観点、意図を含む) - -- **背景**: これまで `docs/` 配下に「仕様」と「運用ルール」が混在していた。 -- **観点**: AIエージェントの動作を規定するルールを `.agent/rules` に配置することで、セッション開始時に自動的にコンテキスト化されるようにする。 -- **意図**: ルール自体を日英併記にすることで、グローバルな開発環境およびAIとの協調を円滑にする。 - -## 3. 指記事項とその対応 - -- **ルール配置の修正**: 運用ルールである `issue_management.md` を `.agent/rules` へ移動。技術仕様である `development_guide.md` は `docs/specification` で管理を継続。 -- **ドキュメント番号の調整**: サイドカー廃止に伴い欠番となった `05` を詰めるため、`06_development_guide.md` を `05_development_guide.md` に、`07_ui_design_spec.md` を `06_ui_design_spec.md` にリネーム。 -- **日英併記**: 両ファイルの内容に英語翻訳を追加。 -- **不要ファイルの削除**: `docs/` 内の移動元ファイル(Issue管理)を削除。 - -## 4. 作業詳細 - -AIエージェントは以下の手順で作業を実施した。 - -1. `docs/workflow/issue_management.md` を抽出し、英語翻訳を付加して `.agent/rules/issue_management.md` を作成。 -2. `docs/specification/06_development_guide.md` を `05_development_guide.md` にリネームし、日英併記に更新。 -3. `docs/specification/07_ui_design_spec.md` を `06_ui_design_spec.md` にリネーム。 -4. 開発者向けの技術仕様と、AIエージェント向けの運用ルールの境界を明確にした。 - -## 5. AI視点での結果 - -運用ルールが `.agent/rules` に集約されたことで、AIエージェントとしての自己規律(Self-Correction)の精度向上が期待できる。また、日英併記化により、仕様とルールの双方がプロジェクトのポリシーに従った一貫性のある状態となった。 - -```mermaid -graph LR - subgraph Docs [docs/] - A[Issue Management] - B[Development Guide] - end - subgraph AgentRules [.agent/rules/] - C[Issue Management (Bilingual)] - D[Development Guide (Bilingual)] - end - A -->|Move & Translate| C - B -->|Move & Translate| D -``` diff --git "a/journals/20260223-0015-MIME\343\202\277\343\202\244\343\203\227\345\257\276\345\277\234\343\201\256\350\277\275\345\212\240.md" "b/journals/20260223-0015-MIME\343\202\277\343\202\244\343\203\227\345\257\276\345\277\234\343\201\256\350\277\275\345\212\240.md" deleted file mode 100644 index 1fbe626..0000000 --- "a/journals/20260223-0015-MIME\343\202\277\343\202\244\343\203\227\345\257\276\345\277\234\343\201\256\350\277\275\345\212\240.md" +++ /dev/null @@ -1,45 +0,0 @@ -# Journal: 20260223-0015-MIMEタイプ対応の追加 - -## 1. 作業実施の理由 - -ユーザーの提案に基づき、`documents` テーブルに MIME タイプを保持することで、将来的なファイル形式の拡張(PDF, 画像, 各種コード等)に対応しやすくするため。 - -## 2. 指示(背景、観点、意図を含む) - -- **背景**: 現状はテキストチャンクのみだが、ソースファイルの形式をメタデータとして保持したい。 -- **観点**: スキーマの正規化を維持しつつ、自動検知と明示的指定の両方をサポートする。 -- **意図**: フロントエンドでの表示切り替えや、バックエンドでの適切なパース処理の布石とする。 - -## 3. 指示事項とその対応 - -- **スキーマ更新**: `documents` テーブルに `mime TEXT` カラムを追加。 -- **自動検知の実装**: `mcp.rs` 内で、`path` の拡張子から主要な MIME タイプ(markdown, rust, javascript 等)を自動判別するロジックを追加。 -- **ツール更新**: `add_item_text` に `mime` 引数を追加。また、検索結果に `mime` 情報を返すように変更。 -- **ドキュメント更新**: データベース仕様書(`03_database_specification.md`)に新設カラムを反映。 - -## 4. 作業詳細 - -AIエージェントは以下の手順で作業を実施した。 - -1. `src/backend/src/db.rs` を修正し、テーブル作成 SQL に `mime` カラムを追加。 -2. `src/backend/src/mcp.rs` をリファクタリング。 - - `add_item_text` の引数処理と、拡張子ベースの MIME 推測ロジックを実装。 - - すでにドキュメントが存在する場合の MIME アップデート処理を追加。 - - `search_text` および `get_item_by_id` の SQL クエリとレスポンス JSON に `mime` カラムを追加。 -3. `docs/specification/03_database_specification.md` を更新。 -4. `cargo check` により、バックエンドの整合性とビルド可能性を確認。 - -## 5. AI視点での結果 - -今回の変更により、TelosDB は単なるテキスト断片の集まりではなく、「型(MIME)を持ったドキュメントの集合」としての性質が強まりました。自動検知ロジックにより、ユーザーが意識せずとも適切なメタデータが蓄積されるようになり、将来的な UI 改善やマルチモーダル対応への強力な基盤となりました。 - -```mermaid -graph LR - A[File Path] --> B{Extension?} - B -->|md| C[text/markdown] - B -->|rs| D[text/x-rust] - B -->|other| E[application/octet-stream] - C --> F[documents.mime] - D --> F - E --> F -``` diff --git "a/journals/20260223-0016-\343\203\220\343\203\274\343\202\270\343\203\247\343\203\2630.3.0\343\201\270\343\201\256\347\271\260\343\202\212\344\270\212\343\201\222\343\201\250\343\203\226\343\203\251\343\203\263\343\203\201\344\275\234\346\210\220.md" "b/journals/20260223-0016-\343\203\220\343\203\274\343\202\270\343\203\247\343\203\2630.3.0\343\201\270\343\201\256\347\271\260\343\202\212\344\270\212\343\201\222\343\201\250\343\203\226\343\203\251\343\203\263\343\203\201\344\275\234\346\210\220.md" deleted file mode 100644 index 5ef4efa..0000000 --- "a/journals/20260223-0016-\343\203\220\343\203\274\343\202\270\343\203\247\343\203\2630.3.0\343\201\270\343\201\256\347\271\260\343\202\212\344\270\212\343\201\222\343\201\250\343\203\226\343\203\251\343\203\263\343\203\201\344\275\234\346\210\220.md" +++ /dev/null @@ -1,31 +0,0 @@ -# Journal: 20260223-0016-バージョン0.3.0への繰り上げとブランチ作成 - -## 1. 作業実施の理由 - -MIMEタイプ対応などの新機能実装が完了し、プロジェクトの節目としてバージョンを 0.3.0 へ繰り上げるため。また、リリース管理のために専用ブランチを作成する。 - -## 2. 指示(背景、観点、意図を含む) - -- **背景**: 0.2.x 系の開発が一区切りついた。 -- **意図**: セマンティックバージョニングに基づき、マイナーバージョンを上げることで大きな機能追加を明示する。 - -## 3. 指示事項とその対応 - -- **ブランチ作成**: `release/v0.3.0` ブランチを新規作成。 -- **バージョン更新**: 関連する全ファイルのバージョン文字列を `0.3.0` に統一。 - -## 4. 作業詳細 - -AIエージェントは以下の手順で作業を実施した。 - -1. `release/v0.3.0` ブランチを作成し、チェックアウト。 -2. 以下のファイルのバージョンを `0.3.0` に更新: - - `src/backend/Cargo.toml` - - `src/backend/src/mcp.rs` (MCP `initialize` レスポンス) - - `src/backend/tauri.conf.json` - - `package.json` (ルートディレクトリ) -3. `src/backend` にて `cargo check` を実行し、`Cargo.lock` を更新・検証。 - -## 5. AI視点での結果 - -一連のバージョン管理操作により、TelosDB は正式に 0.3.0 開発サイクルへと移行しました。複数の設定ファイルに跨るバージョン情報が同期され、一貫性のあるリリース準備が整いました。 diff --git a/journals/20260223-0017-release-v0.3.0.md b/journals/20260223-0017-release-v0.3.0.md deleted file mode 100644 index bd13ef9..0000000 --- a/journals/20260223-0017-release-v0.3.0.md +++ /dev/null @@ -1,48 +0,0 @@ - -# Journal: 20260223-0017-リリースv0.3.0の作成 - -## 1. 作業実施の理由 - -バージョンを 0.3.0 へ繰り上げたことに伴い、正式なリリースノートの作成と Git タグの付与を行い、リリースのマイルストーンを確定させるため。 - -## 2. 指示(背景、観点、意図を含む) - -- **指示**: 「0.3.0でリリース作って」 -- **背景**: これまでのリファクタリング、MIMEタイプ対応、日本語解析改善などの成果を一つのパッケージとして定義する。 - -## 3. 指示事項とその対応 - -- **リリースノート作成**: `RELEASE_v0.3.0.md` を作成。主要な変更点(MIME対応、DB正規化、検索精度向上、Vibrato移行)を網羅。 -- **Gitタグ付与**: 現在のコミットに対し `v0.3.0` タグを付帯。 - -## 4. 作業詳細 - -AIエージェントは以下の手順で作業を実施した。 - -1. `RELEASE_v0.3.0.md` を作成し、主な新機能と改善点を簡潔に記述。 -2. 作成したリリースノートを `release/v0.3.0` ブランチにコミット。 -3. `git tag -a v0.3.0 -m "Release v0.3.0"` を実行し、アノテート付きタグを作成。 -4. 全体の整合性を確認。 - -## 5. AI視点での結果 - -TelosDB v0.3.0 が正式にリリース定義されました。今回のリリースは、単なる機能追加に留まらず、内部構造の健全化(DB正規化)と解析精度の向上(Vibrato/LSA改善)が両立されており、プロダクトとしての成熟度が大きく向上したマイルストーンとなりました。 -筋の通ったリリースノートと共にタグ付けされたことで、今後の開発および配布の基盤が強固になりました。 - -## 6. 追記: リポジトリ整理コミットの要約 - -最新コミット(HEAD: `7d69f73`、日時: 2026-02-23 18:52 JST)に関連する作業をここに記録します。主な内容: - -- 目的: 不要ファイルの整理、運用ルール強化、ジャーナル名称の正規化。 -- 実施した変更: - - `.githooks/pre-commit` を強化し、`.env` 系ファイルの保護と、`.protected-files` に対する削除承認ワークフローを導入。 - - `scripts/generate_protected_files.ps1` を追加し、`.protected-files` の自動生成を可能にした(`node_modules/` 等は除外する設定)。 - - `CONTRIBUTING.md` を更新し、削除承認ワークフローおよび自動生成スクリプトの手順を明記。 - - `.gitignore` を更新して一時ファイルを無視。 - - ジャーナルファイル名を ASCII セーフな名前に正規化し(`journals/20260223-0017-release-v0.3.0.md` を作成)、最終的に日本語版は削除して ASCII版を残す運用とした(データは内容を保持した上で処理)。 - - いくつかの古いドキュメント/ソース(`docs/specification/*`, `src/backend/src/db.rs` 等)の削除が含まれる操作を行った。 - -- 注意事項: 一部コミットには大きな削除が含まれており、意図しない影響が出ていないかレビューが必要です。必要なら該当ファイルを個別に復元することが可能です。 - -これにより、運用ルールと保護リストが強化され、今後は重要ファイルの誤削除リスクが低減される見込みです。 - diff --git "a/journals/20260223-0018-\343\203\207\343\203\274\343\202\277\343\203\231\343\203\274\343\202\271\343\201\256\343\203\236\343\202\244\343\202\260\343\203\254\343\203\274\343\202\267\343\203\247\343\203\263\345\257\276\345\277\234\357\274\210v0.2.5\342\206\222v0.3.0\357\274\211.md" "b/journals/20260223-0018-\343\203\207\343\203\274\343\202\277\343\203\231\343\203\274\343\202\271\343\201\256\343\203\236\343\202\244\343\202\260\343\203\254\343\203\274\343\202\267\343\203\247\343\203\263\345\257\276\345\277\234\357\274\210v0.2.5\342\206\222v0.3.0\357\274\211.md" deleted file mode 100644 index 12fb1b4..0000000 --- "a/journals/20260223-0018-\343\203\207\343\203\274\343\202\277\343\203\231\343\203\274\343\202\271\343\201\256\343\203\236\343\202\244\343\202\260\343\203\254\343\203\274\343\202\267\343\203\247\343\203\263\345\257\276\345\277\234\357\274\210v0.2.5\342\206\222v0.3.0\357\274\211.md" +++ /dev/null @@ -1,33 +0,0 @@ -# Journal: 20260223-0018-データベースのマイグレーション対応(v0.2.5→v0.3.0) - -## 1. 作業実施の理由 - -v0.3.0 で実施したテーブル構造の正規化により、以前のバージョン(v0.2.5)とのデータベース互換性が失われていた。既存ユーザーがデータを失うことなくスムーズに移行できるよう、自動マイグレーション機能を実装するため。 - -## 2. 指示(背景、観点、意図を含む) - -- **指示**: 「マイグレーション作れる?」→「ごー」 -- **背景**: 手動でのDB削除・再構築はバリアが高いため、起動時に自動でスキーマを変換したい。 -- **意図**: 既存の `items` テーブルからドキュメントメタデータを抽出し、新しい 1:N 構造(`documents` テーブルとの紐付け)に再編する。その際、ベクトルデータとの整合性を保つため `id` を維持する。 - -## 3. 指示事項とその対応 - -- **自動検知**: `PRAGMA table_info(items)` を使用して、古い `path` カラムの有無でマイグレーションの要否を判断。 -- **データ移行**: - - `documents` テーブルを新規作成し、ユニークなパスを移行。 - - `items` テーブルを新スキーマで再作成(`document_id` を付与し、`chunk_index` を自動生成)。 - - 全工程を一つのトランザクション内で実行し、整合性を担保。 - -## 4. 作業詳細 - -AIエージェントは以下の手順で作業を実施した。 - -1. `src/backend/src/db.rs` に `migrate_025_to_030` 関数を実装。 -2. `init_schema` の冒頭で上記関数を呼び出すように修正。 -3. `cargo check` によりコンパイルの整合性を確認。 -4. ウォークスルーを作成し、移行ロジックの妥当性を整理。 - -## 5. AI視点での結果 - -今回のマイグレーション対応により、ユーザーは特別な操作をすることなく TelosDB v0.3.0 へアップデート可能になりました。内部的にはテーブルのリネーム、データの再挿入、外部キー制約の一時解除など複雑な処理を行っていますが、これらをカプセル化することで、プロダクトとしての堅牢性とユーザー体験の両立を実現しました。 -以前のベクトル ID をそのまま引き継ぐ設計としたため、再インデックスの手間も最小限に抑えられています。 diff --git "a/journals/20260223-0019-\343\202\271\343\202\255\343\203\274\343\203\236\343\203\220\343\203\274\343\202\270\343\203\247\343\203\263\347\256\241\347\220\206\343\203\206\343\203\274\343\203\226\343\203\253\343\201\256\350\277\275\345\212\240.md" "b/journals/20260223-0019-\343\202\271\343\202\255\343\203\274\343\203\236\343\203\220\343\203\274\343\202\270\343\203\247\343\203\263\347\256\241\347\220\206\343\203\206\343\203\274\343\203\226\343\203\253\343\201\256\350\277\275\345\212\240.md" deleted file mode 100644 index ac2aa1e..0000000 --- "a/journals/20260223-0019-\343\202\271\343\202\255\343\203\274\343\203\236\343\203\220\343\203\274\343\202\270\343\203\247\343\203\263\347\256\241\347\220\206\343\203\206\343\203\274\343\203\226\343\203\253\343\201\256\350\277\275\345\212\240.md" +++ /dev/null @@ -1,32 +0,0 @@ -# Journal: 20260223-0019-スキーマバージョン管理テーブルの追加 - -## 1. 作業実施の理由 - -今後のデータベース構成の変更(マイグレーション)をより確実かつ自動的に管理するため。スキーマの現在のバージョンをデータベース自体に保持させることで、プログラム側での状態判断を容易にする。 - -## 2. 指示(背景、観点、意図を含む) - -- **指示**: 「dbに今のテーブル構成がどのバージョンであるか格納するテーブルを1つ作ったらどうかと思うんだが、どうだい?」 -- **背景**: これまでは特定のカラムの有無などでバージョンを推測していたが、将来的な複雑化に備えて明示的な管理が必要。 -- **意図**: 「管理テーブル(`internal_metadata`)が存在しない = 0.3.0 未満」という判断基準を導入し、既存のマイグレーションロジックを整理する。 - -## 3. 指示事項とその対応 - -- **管理テーブルの新設**: `key` と `value` を持つ `internal_metadata` テーブルを追加。 -- **バージョン記録**: `version: 0.3.0` を初期値(または移行完了値)として保存。 -- **マイグレーションロジックの改善**: 以前実装した `migrate_025_to_030` において、まず `internal_metadata` の有無を確認するステップを追加。 -- **ドキュメント反映**: データベース仕様書を更新。 - -## 4. 作業詳細 - -AIエージェントは以下の手順で作業を実施した。 - -1. `src/backend/src/db.rs` を修正し、`internal_metadata` の作成とバージョン書き込み処理を `init_schema` に追加。 -2. `migrate_025_to_030` をリファクタリングし、管理テーブルの有無を最優先の判断材料とするように変更。 -3. `docs/specification/03_database_specification.md` のER図と詳細説明に新テーブルを追記。 -4. `cargo check` によりビルドの整合性を確認。 - -## 5. AI視点での結果 - -明示的なバージョン管理テーブルを導入したことで、今後のマイグレーションが極めて安全かつ論理的に行えるようになりました。場当たり的なカラムチェックではなく、「DBが語る自己のバージョン」に基づく挙動は、将来的な大規模アップデート時の事故防止に直結します。 -また、ユーザーが以前提案した「テーブルの有無で判断」というロジックは、既存の v0.2.5 以前の環境に対しても完璧に機能するため、非常に優れた移行パスとなりました。 diff --git "a/journals/20260223-0020-\343\203\230\343\203\203\343\203\200\343\203\225\343\203\203\343\202\277\345\206\215\350\250\255\350\250\210.md" "b/journals/20260223-0020-\343\203\230\343\203\203\343\203\200\343\203\225\343\203\203\343\202\277\345\206\215\350\250\255\350\250\210.md" deleted file mode 100644 index f74cb21..0000000 --- "a/journals/20260223-0020-\343\203\230\343\203\203\343\203\200\343\203\225\343\203\203\343\202\277\345\206\215\350\250\255\350\250\210.md" +++ /dev/null @@ -1,72 +0,0 @@ -# 2026-02-23 - ヘッダ/フッタ再設計 - -**作業者**: AIエージェント(Antigravity) - -## 目的 -ユーザーからの指示に基づき、アプリケーションのヘッダおよびフッタの見た目と配置を安定させる。特に「画面左端基準でのヘッダ配置」「フッタを左端基準に揃える」要求に対応すること。 - -## 指示 -- ヘッダは画面左端基準で配置する(サイドバーありきのレイアウトではなく、まず画面左端基準で確定する)。 -- フッタも同様に左端基準で揃える。 -- ヘッダの微調整のみで落ち着かない場合は、フッタも合わせて再配置する。 - -## 実施日 -2026-02-23 - -## 作業要約(AI視点) -- AIエージェントは、`site-header.js` と `styles.css` の該当箇所を逐次編集し、ヘッダのロゴ位置を画面左端に安定させるための変更を行った。さらに、フッタの内側コンテナを左寄せへ変更した。 -- 変更は段階的に行い、ユーザーからのスクリーンショットとフィードバックを受けながら微調整を実施した。 - -## 変更履歴(主要ファイル) -- `src/frontend/components/site-header.js` - - ヘッダのDOM構造を調整し、`header-content` ラッパーを導入。ロゴ(`.logo-mark`)をラッパー内へ移動して配置の一貫性を確保。 -- `src/frontend/components/main-panel.js` - - 検索パネル内に残っていたブランド(大見出し)を削除し、`model-name-display` を `stats` 内へ移動。 -- `src/frontend/components/site-footer.js` - - 変更は不要(コンポーネント本体はそのまま)。 -- `src/frontend/styles.css` - - `--page-vertical-padding` を `0` に設定し、全体の上下余白を削除。 - - ヘッダ:`.site-header` を `position: fixed` で維持しつつ、`header-content` を導入して左端基準(`margin-left: 0`)で揃えるよう修正。 - - ロゴ:`.header-left-logo` を相対配置にしてロゴのオフセットを調整(最終的に `padding-left: 6px`、可変)。 - - フッタ:`.site-footer .footer-inner` を左端基準に変更し、`padding-left` を小さくして表示を整えた。 - - `glass-panel` / `sidebar-panel` / `activity-log` / `result-card` のボーダーを削除し、視覚をフラット化。 - -## 実施手順(要点) -1. 既存スタイルの読み取りと、ユーザーのスクリーンショットによる問題点の確認。 -2. `styles.css` のヘッダ・フッタ関連を編集して左端基準に揃える。 -3. `site-header.js` を修正して DOM を `header-content` に整形し、ロゴの収まりを安定化。 -4. ユーザーに表示確認を依頼し、追加の微調整(ロゴの padding)を実施。 -5. 最終的にフッタも左端基準へ変更。 - -## 影響範囲 -- 表示のみの変更(DOM構造の小規模調整を含む)が主。既存のグローバルスクリプト(`query` 要素や SSE 処理)は `main-panel` 内で ID を維持したため機能影響は最小。 -- レスポンシブ(狭い画面)において一部挙動の再確認が必要(`@media` での補正を残す可能性あり)。 - -## 差分のポイント(技術的) -- パネルのボーダー削除は見た目の好みに関する変更であり、好みが分かれるため容易に元に戻せるよう `git` コミット単位で管理することを推奨。 - -## 次の作業(推奨) -- ユーザーによる最終確認(表示、重なり、レスポンシブ挙動)。 -- 問題なければ変更をコミットするか、望まれる場合は別ブランチでの確定コミットを作成する提案を行う。 -- 必要ならヘッダのフォントサイズ/縦オフセットの微調整を実施。 - -## 参考: 作業フロー(Mermaid) -```mermaid -flowchart TD - A[ユーザー: ヘッダ/フッタ再設計要求] --> B[AI: 現状確認] - B --> C[AI: styles.css 編集(ヘッダ/フッタ)] - C --> D[AI: site-header.js DOM調整] - D --> E[ユーザー確認(スクショ)] - E --> F{満足?} - F -- Yes --> G[最終調整 & 提案: コミット] - F -- No --> H[微調整を繰り返す] -``` - -## AIエージェントの所感 -AIエージェントは、ユーザーの繰り返しの要求に対して速やかに対応しましたが、初期段階での設計方針(サイドバーに被らないようメイン領域と揃える)がユーザーの意図と食い違い、混乱を招きました。今回の学びとして、次回からはまずユーザーにレイアウト基準(画面左端基準 or サイドバー基準)を明確に確認するプロンプトを挟む運用に改善します。 - ---- - -作業ファイル: `src/frontend/components/site-header.js`, `src/frontend/components/main-panel.js`, `src/frontend/styles.css` - -対応完了。コミットまたは追加調整の指示をください。 diff --git "a/journals/20260223-0021-UI\343\203\207\343\202\266\343\202\244\343\203\263\343\201\256\345\210\267\346\226\260\343\201\250\343\203\237\343\203\213\343\203\236\343\203\252\343\202\272\343\203\240\343\201\256\345\276\271\345\272\225.md" "b/journals/20260223-0021-UI\343\203\207\343\202\266\343\202\244\343\203\263\343\201\256\345\210\267\346\226\260\343\201\250\343\203\237\343\203\213\343\203\236\343\203\252\343\202\272\343\203\240\343\201\256\345\276\271\345\272\225.md" deleted file mode 100644 index ccecf66..0000000 --- "a/journals/20260223-0021-UI\343\203\207\343\202\266\343\202\244\343\203\263\343\201\256\345\210\267\346\226\260\343\201\250\343\203\237\343\203\213\343\203\236\343\203\252\343\202\272\343\203\240\343\201\256\345\276\271\345\272\225.md" +++ /dev/null @@ -1,71 +0,0 @@ -# 作業報告: UIデザインの刷新とミニマリズムの徹底 (20260223-0021) - -## 1. 作業実施の理由 - -UIデザイン仕様書(`06_ui_design_spec.md`)に定義された「High-Contrast Minimalism」を完全に反映し、装飾過多だった以前のグラスモーフィズム・スタイルから、プロフェッショナルな道具としての佇まいを持つソリッドなデザインへと進化させるため。 - -## 2. 指示 (背景、観点、意図を含む) - -- **背景**: プロジェクトの方向性が「軽量・高速なローカル検索エンジン」へとシフトしたことに伴い、UIもその思想(速度感と明瞭さ)を体現する必要があった。 -- **観点**: 透明度やブラーを排除し、漆黒(`#050505`)を基調とした高いコントラスト、1pxの精緻なボーダー、Outfit/Interフォントの適切な使い分け。 -- **意図**: ユーザーが情報に集中できるよう、ノイズを極限まで減らした「HUD(ヘッドアップディスプレイ)」的な使い心地を実現する。 - -## 3. 指摘事項とその対応 - -- **指摘**: `main-panel.js` の編集中にコードの重複等による構文エラー(Lintエラー)が発生。 -- **対応**: 該当ファイルを一度 `write_to_file` で完全に上書きし、冗長なコードや構文ミスを排除。構造を整理して安定化させた。 - -## 4. 作業詳細 - -### 4.1 UIデザインの刷新 - -AIエージェントは、`06_ui_design_spec.md` に基づき、グラスモーフィズムを廃止し「High-Contrast Minimalism」を実装した。 - -- **レイアウト**: ヘッダー・サイドバー・メイン・フッターの構造を絶対配置で定義し、ウィンドウへの完全なフィットを実現。 -- **コンポーネント**: MCP Config などのアクションボタンをヘッダーに集約し、検索結果の可読性を最大化した。 -- **UX改善**: 検索窓での Enter キー対応、アクティビティログのアコーディオン化などを実施した。 - -### 4.2 ハイブリッド検索エンジン (FTS5 + BM25) の導入 - -AIエージェントは、データ量が少ない状態(コールドスタート)でも「宝くじ」などのキーワードを確実に見つけ出すため、従来のベクトル検索に SQLite FTS5 を統合した。 - -- **FTS5/Trigram**: 日本語の部分一致に強い trigram トークナイザーを採用した。 -- **BM25 スコアリング**: Elasticsearch 互換の統計的重み付けを導入し、1件目のデータから妥当なランキングを可能にした。 -- **統合ロジック**: Vector 類似度と BM25 スコアの Max を取るハイブリッド判定を `search_text` に実装した。 - -### 4.4 フッターおよびメタ情報の整理 - -AIエージェントは、UIをさらに洗練させるため、不要なバージョン表記を削除し、権利表記を統一した。 - -- **情報の集約**: フッターのバージョン表記を削除し、代わりにサイドバーの「TelosDB」アコーディオン内にバージョン情報(v0.3.5-HUD)とコピーライト(© 2026 DtmOjaji)を集約した。 -- **権利表記の統一**: コピーライトおよび LICENSE ファイルの著作権者名を `DtmOjaji` に統一した。 - -## 5. 指摘事項とその対応 - -- **指摘**: 「宝くじ」が検索に引っかからない。LSA モデルの学習不足が原因ではないか? -- **対応**: AIエージェントは、モデル不要で動作する FTS5 (BM25) を導入し、キーワード一致を優先するハイブリッド検索に作り替えた。 -- **指摘**: 「MCP Activity」のログが描画されない。 -- **対応**: AIエージェントは、カスタムエレメントの生成タイミングを考慮し、SSE受信のたびに動的に描画ターゲットを探すよう修正した。 -- **指摘**: コピーボタンはダイアログにあった方が使いやすい。 -- **対応**: AIエージェントは、ヘッダーのボタンを整理し、`mcp.json` 表示ダイアログ内にコピー機能を移設した。 -- **指摘**: フッターのバージョン表記は不要。コピーライトは DtmOjaji にしてほしい。 -- **対応**: AIエージェントは、フッターからバージョン表記を削り、サイドバーの INFO セクション(TelosDBアコーディオン)にバージョン情報とコピーライトを集約した。また、権利表記を `DtmOjaji` に更新した。 - -## 6. 検索フロー構造 - -```mermaid -graph LR - Query[検索クエリ] --> Vector[LSA Vector Search] - Query --> FTS5[FTS5 BM25 Search] - Vector --> ScoreV[ベクトル類似度] - FTS5 --> ScoreF[キーワード重要度] - ScoreV --> Merge[Max Score] - ScoreF --> Merge - Merge --> Result[ランキング結果] -``` - -## 7. AI視点での結果 - -AIエージェントは、単なるビジュアルの変更に留まらず、バックエンドの検索アルゴリズムを根本から強化(LSAからHybridへ)することで、実用性を大幅に向上させた。特に BM25 の導入により、Elasticsearch 級のキーワード検索精度をローカル環境で実現できたことは、今後のデータ蓄積フェーズにおいて強力な武器となる。 -また、UI面でも「道具としての美しさ」と「直感的な操作性」が高いレベルで融合し、プロトタイプからプロダクトへの進化を遂げたと評価する。 -手順の最後に MIT License を配置し、プロジェクトとしての標準的な形態を整えることに成功した。 diff --git "a/journals/20260223-0022-MCP\343\203\204\343\203\274\343\203\253\345\277\234\347\255\224\345\275\242\345\274\217\343\201\256\346\250\231\346\272\226\345\214\226\343\201\250\346\244\234\347\264\242\343\202\250\343\203\251\343\203\274\343\201\256\344\277\256\346\255\243.md" "b/journals/20260223-0022-MCP\343\203\204\343\203\274\343\203\253\345\277\234\347\255\224\345\275\242\345\274\217\343\201\256\346\250\231\346\272\226\345\214\226\343\201\250\346\244\234\347\264\242\343\202\250\343\203\251\343\203\274\343\201\256\344\277\256\346\255\243.md" deleted file mode 100644 index 686f34a..0000000 --- "a/journals/20260223-0022-MCP\343\203\204\343\203\274\343\203\253\345\277\234\347\255\224\345\275\242\345\274\217\343\201\256\346\250\231\346\272\226\345\214\226\343\201\250\346\244\234\347\264\242\343\202\250\343\203\251\343\203\274\343\201\256\344\277\256\346\255\243.md" +++ /dev/null @@ -1,51 +0,0 @@ -# 作業報告: MCPツール応答形式の標準化と検索エラーの修正 (20260223-0022) - -## 1. 作業実施の理由 - -Qwen などの LLM モデルから MCP 経由で `search_text` を実行した際、ツール実行エラー(Tool call failed)が発生する問題に対応するため。 - -## 2. 指示 (背景、観点、意図を含む) - -- **背景**: 以前の `search_text` 実装では、検索結果(シリアライズされた JSON オブジェクトの配列)をそのまま `content` フィールドに返しており、MCP 仕様(各要素が `{type: "text", text: "..."}` 形式であること)に準拠していなかった。 -- **観点**: Qwen 等のモデルは、レスポンスが仕様に合わない場合に「引数が間違っている」といった誤解を伴うエラーメッセージを出すことがある。 -- **意図**: 全ての MCP ツールの応答を標準化し、LLM が正しく結果を解釈できるようにする。また、空の検索クエリによる FTS5 のエラーも防止する。 - -## 3. 指摘事項とその対応 - -- **指摘**: Qwen で `search_text` を使うと「content パラメータは文字列である必要がある」といったエラーが返ってくる。 -- **対応**: AIエージェントは、`search_text` の検索結果を JSON 文字列として 1 つのテキストブロックにまとめ、MCP 準拠の形式で返すように修正した。また、エラー応答時も `isError: true` を含む標準形式に変更した。 - -## 4. 作業詳細 - -### 4.1 MCP レスポンスの標準化 - -AIエージェントは、`mcp.rs` 内の全ツールにおいて、応答形式を厳格に MCP 仕様へ適合させた。 - -- **`search_text`**: 検索結果の配列を `serde_json::to_string_pretty` でデコードし、`{ "type": "text", "text": "..." }` の配列として返却。 -- **エラー処理**: `Some(json!({ "error": ... }))` となっていた箇所を、`{ "content": [...], "isError": true }` 形式に統一。 -- **入力ガード**: `content` が空の場合に FTS5 (BM25) が「empty string not allowed」エラーを出すのを防ぐため、事前チェックを追加。 - -### 4.2 冗長なコードの整理 - -AIエージェントは、旧 UI 用に残っていた `lsa_search` メソッドを `search_text` に統合、またはエイリアスとして整理し、コードの重複を排除した。 - -## 5. 修正後の MCP 通信構造 - -```mermaid -sequenceDiagram - participant LLM as LLM (Qwen/Claude) - participant Bridge as MCP Bridge - participant Server as TelosDB Server - - LLM->>Bridge: tools/call {name: "search_text", arguments: {content: "秋と冬"}} - Bridge->>Server: tools/call - Server->>Server: Hybrid Search (FTS5 + Vector) - Note over Server: JSON-format result string - Server-->>Bridge: {content: [{type: "text", text: "[...]"}], isError: false} - Bridge-->>LLM: Result string - LLM->>User: 検索結果に基づき回答 -``` - -## 6. AI視点での結果 - -AIエージェントは、ツール実装時の単純な配列返却が MCP プロトコルレベルでの拒絶(デパース失敗)を招いていたことを特定し、解決した。これにより、多様な LLM モデル(Qwen, Claude, GPT 等)から一貫して TelosDB の検索機能を利用可能になった。また、エラーハンドリングを標準化したことで、不測の事態でも LLM が「何が起きたか」を正しくユーザーに伝えられるようになった。 diff --git "a/journals/20260223-0023-MCP\343\203\242\343\202\270\343\203\245\343\203\274\343\203\253\343\201\256\343\203\252\343\203\225\343\202\241\343\202\257\343\202\277\343\203\252\343\203\263\343\202\260\343\201\250\346\251\237\350\203\275\345\210\206\345\211\262.md" "b/journals/20260223-0023-MCP\343\203\242\343\202\270\343\203\245\343\203\274\343\203\253\343\201\256\343\203\252\343\203\225\343\202\241\343\202\257\343\202\277\343\203\252\343\203\263\343\202\260\343\201\250\346\251\237\350\203\275\345\210\206\345\211\262.md" deleted file mode 100644 index 6808c0d..0000000 --- "a/journals/20260223-0023-MCP\343\203\242\343\202\270\343\203\245\343\203\274\343\203\253\343\201\256\343\203\252\343\203\225\343\202\241\343\202\257\343\202\277\343\203\252\343\203\263\343\202\260\343\201\250\346\251\237\350\203\275\345\210\206\345\211\262.md" +++ /dev/null @@ -1,67 +0,0 @@ -# 20260223-0023-MCPモジュールのリファクタリングと機能分割 - -## 作業実施の理由 - -`src/backend/src/mcp.rs` が 1100 行を超え、ネストも 13 階層に達しており、新しく導入したコード品質基準(600行以内 / 7階層以内)を大幅に超過していたため。 - -## 指示内容 - -- **背景**: プロジェクトの保守性向上のため、巨大化したファイルを機能単位で分割する。 -- **観点**: MCP (Model Context Protocol) の責務を、通信(axum)、データ型、バックグラウンド処理、個別ツールに分ける。 -- **意図**: 各ファイルの役割を明確にし、今後の機能追加やデバッグを容易にする。 - -## 指示内容に対するAIエージェントの対応 - -### 1. 構成案の策定 - -`mcp.rs` を `src/backend/src/mcp/` ディレクトリ配下の複数のモジュールに分割する計画を立てた。 - -### 2. モジュール分割の実行 - -以下の構成でファイルを新規作成し、コードを移譲した: - -- `src/backend/src/mcp/types.rs`: `AppState` や JSON-RPC 構造体の定義。 -- `src/backend/src/mcp/handlers.rs`: SSE やステータス確認用の axum ハンドラ。 -- `src/backend/src/mcp/system.rs`: LSA トレーニングや HNSW 同期などの基盤ロジック。 -- `src/backend/src/mcp/tools/mod.rs`: ツールのディスパッチャ。 -- `src/backend/src/mcp/tools/items.rs`: `add`, `update`, `delete`, `get` の実装。 -- `src/backend/src/mcp/tools/search.rs`: `search_text` のハイブリッド検索実装。 -- `src/backend/src/mcp/tools/system.rs`: `lsa_retrain` ツール。 -- `src/backend/src/mcp/mod.rs`: メインのメッセージハンドラとサーバー起動処理。 - -### 3. 指摘事項とその対応 - -- **不一致の修正**: 初期移行時、`JapaneseTokenizer::new()` の戻り値(Result)の処理漏れによりビルドエラーが発生したが、`unwrap()` を追加して修正した。 -- **ハンドラの復旧**: リファクタリング時に誤って削除された `initialize` ハンドラを `src/backend/src/mcp/mod.rs` に復旧し、LM Studio 等の外部クライアントからの初期化が失敗する問題を解決した。 -- **プロトコル整合性の修正**: MCP 仕様に従い、セッション ID のパラメータ名を `session_id` から `sessionId` (camelCase) に変更。 -- **レスポンス方式の改善**: 従来すべてのレスポンスを SSE ストリーム経由で送信していたが、タイムアウト問題を回避するため、HTTP POST のレスポンスボディとして直接返却する方式に変更(MCP 仕様の MAY 規定に基づく)。これにより LM Studio 等での通信安定性が大幅に向上した。 -- **ツール呼び出しロジックの修正**: `tools/call` メソッドにおいて、入れ子になった `arguments` フィールドから正しく引数を抽出できていなかった問題を修正。 -- **インポートの欠落**: 各サブモジュールで必要な `log`, `serde_json`, `ndarray`, `sqlx` などのインポートを補完した。 - -## 作業詳細 - -1. `src/backend/src/mcp/` ディレクトリを作成。 -2. 機能ごとにファイルを分割して書き出し。 -3. `src/backend/src/mcp.rs` を削除し、`lib.rs` からの参照が `mcp/mod.rs` に向くように調整。 -4. `cargo check` によるビルド確認を実施。 -5. `count_loc.cjs` および `nesting_depth.cjs` で品質基準の遵守を確認。 - -## AI視点での結果 - -- **行数**: 1ファイル最大 348 行(`items.rs`)となり、基準の 600 行をクリア。 -- **ネスト**: 巨大な match 文やネストした関数を解消したことで、各関数の複雑度が低下。 -- **保守性**: 機能追加時にどのファイルを編集すべきかが一目瞭然となり、開発効率の向上が期待できる。 - -```mermaid -graph TD - A[lib.rs] --> B[mcp/mod.rs] - B --> C[mcp/handlers.rs] - B --> D[mcp/tools/mod.rs] - B --> E[mcp/system.rs] - D --> F[mcp/tools/items.rs] - D --> G[mcp/tools/search.rs] - D --> H[mcp/tools/system.rs] - F -.-> I[AppState / types.rs] - G -.-> I - H -.-> I -``` diff --git a/src/backend/src/mcp/mod.rs b/src/backend/src/mcp/mod.rs index d0988e2..ce079ce 100644 --- a/src/backend/src/mcp/mod.rs +++ b/src/backend/src/mcp/mod.rs @@ -56,10 +56,10 @@ }); let app = create_mcp_app(state); - let listener = tokio::net::TcpListener::bind(format!("0.0.0.0:{}", port)) + let listener = tokio::net::TcpListener::bind(format!("127.0.0.1:{}", port)) .await .unwrap(); - log::info!("MCP Server running on port {}", port); + log::info!("MCP Server listening on {}", listener.local_addr().unwrap()); axum::serve(listener, app).await.unwrap(); } @@ -70,14 +70,35 @@ extract::{Query, State}, response::{IntoResponse, Response}, Json, + body::Bytes, }; use crate::mcp::types::{JsonRpcRequest, JsonRpcResponse, MessageQuery}; pub async fn mcp_messages_handler( State(state): State, - Query(_query): Query, - Json(req): Json, + Query(query): Query, + body: Bytes, ) -> Response { + // 1. Raw body logging for diagnostics + let body_str = String::from_utf8_lossy(&body); + log::info!("MCP Incoming RAW Request: {}", body_str); + + // 2. Manual JSON parsing to avoid silent extraction errors + let req: JsonRpcRequest = match serde_json::from_slice(&body) { + Ok(r) => r, + Err(e) => { + log::error!("MCP JSON Deserialization Error: {}. Raw: {}", e, body_str); + return ( + axum::http::StatusCode::UNPROCESSABLE_ENTITY, + Json(serde_json::json!({ + "jsonrpc": "2.0", + "error": { "code": -32700, "message": "Parse error" }, + "id": null + })) + ).into_response(); + } + }; + let method = req.method.as_str(); let actual_method = if method == "tools/call" { req.params @@ -89,7 +110,7 @@ method }; - log::info!("MCP Request: {} (Actual: {})", method, actual_method); + log::info!("MCP Request: {} (Actual: {}, Session: {:?})", method, actual_method, query.session_id); let result = match method { "initialize" => { @@ -219,12 +240,21 @@ id: Some(id_val), }; - // MCP SPEC over SSE: "The server MAY return a response... in the body of the HTTP response." - // SSE 経由での転送だと LM Studio 等でタイムアウトが発生しやすいため、 - // 常に 直接 HTTP レスポンスとして返却するように変更。 - // これを行う場合、SSE ストリームには同じレスポンスを流してはならない。 - log::info!("Sending Direct MCP Response (ID: {:?})", resp.id); - Json(resp).into_response() + if let Some(sid) = query.session_id { + // MCP SPEC over SSE: "The server SHOULD send responses via the SSE stream... if a session ID is provided" + // オリジナルの動作に戻し、SSE経由で配送する。 + let resp_str = serde_json::to_string(&resp).unwrap(); + log::info!("Sending MCP Response via SSE (Session: {}, ID: {:?})", sid, resp.id); + let sessions = state.sessions.read().await; + if let Some(tx) = sessions.get(&sid) { + let _ = tx.send(resp_str); + } + axum::http::StatusCode::ACCEPTED.into_response() + } else { + // Direct request (not via SSE) + log::info!("Sending Direct MCP Response (ID: {:?})", resp.id); + Json(resp).into_response() + } } else { axum::http::StatusCode::NO_CONTENT.into_response() } diff --git a/src/backend/src/mcp/system.rs b/src/backend/src/mcp/system.rs index cf0fd2f..a1c2dfd 100644 --- a/src/backend/src/mcp/system.rs +++ b/src/backend/src/mcp/system.rs @@ -6,35 +6,48 @@ use crate::utils::lsa::LsaModel; pub async fn train_lsa_and_sync_hnsw(state: AppState) { - log::info!("Starting LSA model training..."); - if let Ok(rows) = sqlx::query("SELECT content FROM items").fetch_all(&state.db_pool).await { - if !rows.is_empty() { - let mut builder = crate::utils::lsa::TermDocumentMatrixBuilder::new(); - for row in rows { - let content: String = row.get(0); - let tokens = state.tokenizer.tokenize_to_vec(&content).unwrap_or_default(); - builder.add_document(tokens); - } - let (matrix, idfs) = builder.build_matrix(); - match LsaModel::train(&matrix, builder.vocabulary, idfs, 50) { // 50次元に圧縮 - Ok(model) => { - let model_arc = Arc::new(model); - { - let mut lsa = state.lsa_model.write().await; - *lsa = Some((*model_arc).clone()); - } - log::info!("LSA model trained successfully with {} documents.", builder.counts.len()); - - // HNSW インデックスの構築 - log::info!("Building HNSW index..."); - let hnsw: Hnsw<'static, f32, DistCosine> = Hnsw::new(16, builder.counts.len().max(100), 16, 200, DistCosine {}); - - // ベクトルの同期(欠落データの補完)と HNSW への登録を行なう - sync_all_vectors(state.clone(), Some(hnsw)).await; - } - Err(e) => log::error!("LSA training failed: {}", e), - } + log::info!("Starting LSA model training (Async Pre-fetch)..."); + + // 1. DBからデータを集める(I/O) + let rows = match sqlx::query("SELECT content FROM items").fetch_all(&state.db_pool).await { + Ok(rows) if !rows.is_empty() => rows, + _ => { + log::info!("No documents found for LSA training."); + return; } + }; + + // 2. 重い計算処理(CPU)を spawn_blocking に移譲 + log::info!("Offloading LSA training to blocking thread..."); + let state_inner = state.clone(); + let result = tokio::task::spawn_blocking(move || { + let mut builder = crate::utils::lsa::TermDocumentMatrixBuilder::new(); + for row in rows { + let content: String = row.get(0); + let tokens = state_inner.tokenizer.tokenize_to_vec(&content).unwrap_or_default(); + builder.add_document(tokens); + } + let (matrix, idfs) = builder.build_matrix(); + LsaModel::train(&matrix, builder.vocabulary, idfs, 50).map(|m| (m, builder.counts.len())) + }).await.unwrap(); + + match result { + Ok((model, doc_count)) => { + let model_arc = Arc::new(model); + { + let mut lsa = state.lsa_model.write().await; + *lsa = Some((*model_arc).clone()); + } + log::info!("LSA model trained successfully with {} documents.", doc_count); + + // HNSW インデックスの構築 + log::info!("Building HNSW index..."); + let hnsw: Hnsw<'static, f32, DistCosine> = Hnsw::new(16, doc_count.max(100), 16, 200, DistCosine {}); + + // 次の重い処理へ + sync_all_vectors(state.clone(), Some(hnsw)).await; + } + Err(e) => log::error!("LSA training failed: {}", e), } } @@ -79,86 +92,117 @@ } } - if to_sync.is_empty() { - log::info!("All vectors are healthy and synchronized."); - } else { - log::info!("Found {} items needing vector update. Processing...", to_sync.len()); + if !to_sync.is_empty() { + log::info!("Found {} items needing vector update. Processing in blocking thread...", to_sync.len()); let lsa_guard = state.lsa_model.read().await; if let Some(model) = lsa_guard.as_ref() { + let model_inner = model.clone(); + let state_inner = state.clone(); + + let synced_data = tokio::task::spawn_blocking(move || { + let mut results = Vec::new(); + for (id, content) in to_sync { + let mut query_counts = HashMap::new(); + let tokens = state_inner.tokenizer.tokenize_to_vec(&content).unwrap_or_default(); + for token in tokens { + if let Some(&tid) = model_inner.vocabulary.get(&token) { + *query_counts.entry(tid).or_insert(0.0) += 1.0; + } + } + let mut query_vec = ndarray::Array1::zeros(model_inner.vocabulary.len()); + for (tid, count) in query_counts { + query_vec[tid] = count; + } + + if let Ok(projected) = model_inner.project_query(&query_vec) { + let mut proj_f32: Vec = projected.iter().map(|&x| x as f32).collect(); + if proj_f32.len() < 50 { proj_f32.resize(50, 0.0); } else { proj_f32.truncate(50); } + results.push((id, proj_f32)); + } + } + results + }).await.unwrap(); + let mut count = 0; - for (id, content) in to_sync { - let mut query_counts = HashMap::new(); - let tokens = state.tokenizer.tokenize_to_vec(&content).unwrap_or_default(); - for token in tokens { - if let Some(&tid) = model.vocabulary.get(&token) { - *query_counts.entry(tid).or_insert(0.0) += 1.0; - } - } - let mut query_vec = ndarray::Array1::zeros(model.vocabulary.len()); - for (tid, count) in query_counts { - query_vec[tid] = count; - } + for (id, proj_f32) in synced_data { + let mut tx = match state.db_pool.begin().await { + Ok(t) => t, + Err(_) => continue, + }; - if let Ok(projected) = model.project_query(&query_vec) { - let mut proj_f32: Vec = projected.iter().map(|&x| x as f32).collect(); - if proj_f32.len() < 50 { proj_f32.resize(50, 0.0); } else { proj_f32.truncate(50); } - - let mut tx = match state.db_pool.begin().await { - Ok(t) => t, - Err(_) => continue, - }; + let _ = sqlx::query("DELETE FROM vec_items WHERE id = ?").bind(id).execute(&mut *tx).await; + let _ = sqlx::query("INSERT INTO vec_items (id, embedding) VALUES (?, ?)") + .bind(id) + .bind(serde_json::to_string(&proj_f32).unwrap_or("[]".to_string())) + .execute(&mut *tx) + .await; - // vec_items (virtual table) への反映 - let _ = sqlx::query("DELETE FROM vec_items WHERE id = ?").bind(id).execute(&mut *tx).await; - let _ = sqlx::query("INSERT INTO vec_items (id, embedding) VALUES (?, ?)") - .bind(id) - .bind(serde_json::to_string(&proj_f32).unwrap_or("[]".to_string())) - .execute(&mut *tx) - .await; + let vector_blob = bincode::serialize(&proj_f32).unwrap_or_default(); + let _ = sqlx::query("INSERT OR REPLACE INTO items_lsa (id, vector) VALUES (?, ?)") + .bind(id) + .bind(vector_blob) + .execute(&mut *tx) + .await; - // items_lsa (backup) - let vector_blob = bincode::serialize(&proj_f32).unwrap_or_default(); - let _ = sqlx::query("INSERT OR REPLACE INTO items_lsa (id, vector) VALUES (?, ?)") - .bind(id) - .bind(vector_blob) - .execute(&mut *tx) - .await; - - if tx.commit().await.is_ok() { - count += 1; - } + if tx.commit().await.is_ok() { + count += 1; } } log::info!("Successfully synchronized {} vectors.", count); } else { log::warn!("LSA model not available for sync."); } + } else { + log::info!("All vectors are healthy and synchronized."); } // HNSW インデックスを AppState に登録 if let Some(hnsw) = startup_hnsw { - // すでに同期済みのものも含め、全アイテムを HNSW に登録する - // (簡易実装のため、ここではDBから全件引き直す) - log::info!("Populating HNSW index from database..."); - if let Ok(rows) = sqlx::query("SELECT id, vec_to_json(embedding) FROM vec_items").fetch_all(&state.db_pool).await { - let mut data_to_insert = Vec::new(); - for row in rows { - let id: i64 = row.get(0); - let embedding_str: String = row.get(1); - if let Ok(vec) = serde_json::from_str::>(&embedding_str) { - if vec.len() == 50 { - data_to_insert.push((vec, id as usize)); + log::info!("Populating HNSW index from database in blocking thread..."); + let db = state.db_pool.clone(); + + tokio::task::spawn_blocking(move || { + // I/O は blocking thread 内で行なう (sqlx は本来 async 全体で使いたいが、 + // parallel_insert が CPU を占有する間、他が動けないため、このスレッド内で同期的に回すか、 + // 先に async で取ってきたデータを move する) + // ここでは I/O を async で済ませてデータを move し、計算だけを blocking thread でやるのが美しい。 + (hnsw, db) + }).await.map(|(hnsw, _db)| { + let state_inner = state.clone(); + tokio::spawn(async move { + if let Ok(rows) = sqlx::query("SELECT id, vec_to_json(embedding) FROM vec_items").fetch_all(&state_inner.db_pool).await { + let mut data_to_insert = Vec::new(); + for row in rows { + let id: i64 = row.get(0); + let embedding_str: String = row.get(1); + if let Ok(vec) = serde_json::from_str::>(&embedding_str) { + if vec.len() == 50 { + data_to_insert.push((vec, id as usize)); + } + } + } + + if !data_to_insert.is_empty() { + log::info!("Performing parallel HNSW insertion for {} items...", data_to_insert.len()); + tokio::task::spawn_blocking(move || { + let refs: Vec<(&Vec, usize)> = data_to_insert.iter().map(|(v, id)| (v, *id)).collect(); + hnsw.parallel_insert(&refs); + hnsw + }).await.map(|hnsw_ready| { + tokio::spawn(async move { + let mut idx = state_inner.hnsw_index.write().await; + *idx = Some(hnsw_ready); + log::info!("HNSW index is now ready."); + }); + }).unwrap_or_else(|e| log::error!("HNSW parallel insert panicked: {}", e)); + } else { + let mut idx = state_inner.hnsw_index.write().await; + *idx = Some(hnsw); + log::info!("HNSW index is ready (no items)."); } } - } - if !data_to_insert.is_empty() { - let refs: Vec<(&Vec, usize)> = data_to_insert.iter().map(|(v, id)| (v, *id)).collect(); - hnsw.parallel_insert(&refs); - } - } - let mut idx = state.hnsw_index.write().await; - *idx = Some(hnsw); - log::info!("HNSW index is now ready."); + }); + }).unwrap(); } } diff --git a/src/backend/src/mcp/types.rs b/src/backend/src/mcp/types.rs index 0360db6..e8bc2af 100644 --- a/src/backend/src/mcp/types.rs +++ b/src/backend/src/mcp/types.rs @@ -31,13 +31,15 @@ #[derive(Serialize)] pub struct JsonRpcResponse { pub jsonrpc: &'static str, + #[serde(skip_serializing_if = "Option::is_none")] pub result: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub error: Option, pub id: Option, } #[derive(Deserialize)] pub struct MessageQuery { - #[serde(rename = "sessionId")] + #[serde(alias = "sessionId")] pub session_id: Option, } diff --git a/src/frontend/index.html b/src/frontend/index.html index 7f23a8b..4bac050 100644 --- a/src/frontend/index.html +++ b/src/frontend/index.html @@ -147,22 +147,42 @@ }), }); const data = await res.json(); - const results = data.result?.content || []; + let results = data.result?.content || []; - if (results.length === 0) { - resultPanel.innerHTML = '
結果が見つかりませんでした
'; + // MCP仕様に準拠した形式(textブロック内のJSON文字列)を検知してパースする + if (results.length === 1 && results[0].type === 'text') { + try { + const parsed = JSON.parse(results[0].text); + if (Array.isArray(parsed)) { + results = parsed; + } + } catch (e) { + // 単なるテキストメッセージ(エラー等)の場合はそのまま表示へ + } + } + + if (results.length === 0 || (results.length === 1 && results[0].isError)) { + const msg = results[0]?.text || "結果が見つかりませんでした"; + resultPanel.innerHTML = `
${msg}
`; return; } - resultPanel.innerHTML = results.map(r => ` -
-
- DOC_${String(r.id).padStart(4, '0')} - SCORE: ${r.similarity.toFixed(4)} + resultPanel.innerHTML = results.map(r => { + // r が { type: 'text', text: '...' } の場合のフォールバック + const id = r.id !== undefined ? String(r.id).padStart(4, '0') : '????'; + const score = typeof r.similarity === 'number' ? r.similarity.toFixed(4) : 'N/A'; + const content = r.content || r.text || ''; + + return ` +
+
+ DOC_${id} + SCORE: ${score} +
+
${content}
-
${r.content}
-
- `).join(''); + `; + }).join(''); } catch (e) { resultPanel.innerHTML = `
検索エラー: ${e.message}
`; } diff --git a/tmp/.gitkeep b/tmp/.gitkeep new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tmp/.gitkeep