Newer
Older
TelosDB / journals / 202602-011-MCP件数・自動再学習・GUI改善.md

2026年第011週 作業アーカイブ: MCP件数・自動再学習・インデックス表示・UI整理

週全体のサマリー

Issue #5 対応として MCP でドキュメント件数を返す get_document_count を追加し、HTTP /doc_count と UI ヘッダーも documents 件数に統一。MCP ACTIVITY が空になる不具合をブロードキャスト追加で解消し、トレイクリックの二重発火にはデバウンスを導入。LSA 再学習を「変更件数が閾値(登録数の 20% と 5 の少ない方)を超えたら 90 秒デバウンスで自動実行」するようにし、インデックス化の状態をヘッダーに表示。文書一覧にチャンク0の先頭15文字を表示し、左サイドバー下部のアコーディオンと著作権表示を削除した。


2026-02-25: MCP でドキュメント件数取得(Issue #5)

1. 作業実施の理由と指示

  • 背景: 格納した件数を MCP から取得したい要望があり、当初は items(チャンク)数だったが、ドキュメント数に統一するよう指摘された。
  • 意図: MCP ツールと HTTP・UI の「件数」をすべて documents テーブルの件数で揃える。

2. 作業詳細

  • MCP: get_item_countget_document_count に変更。SELECT COUNT(*) FROM documents で件数を返す。tools/list・dispatch・handle_get_document_count を追加・改名。
  • HTTP: handlers.rsdoc_count_handlerCOUNT(*) FROM items から COUNT(*) FROM documents に変更。
  • 仕様: docs/specification/04_mcp_api_specification.mdget_document_count の説明を追記。

3. AI視点での結果

MCP と UI の「X docs」がどちらもドキュメント数で一致し、意味が明確になった。


2026-02-25: MCP ACTIVITY が空になる不具合

1. 作業実施の理由と指示

  • 背景: 検索パネル下部の MCP ACTIVITY が常に空だった。
  • 意図: ツール呼び出し時に mcp:call:<method> を SSE でブロードキャストし、UI に表示する。

2. 作業詳細

  • src/backend/src/mcp/mod.rs: mcp_messages_handler 内で、tools/call および各ツール名に該当するリクエストを受けた直後に state.tx.send(format!("mcp:call:{}", actual_method)) を実行。
  • フロントの index.html は既に update イベントで mcp:call: をパースして MCP ACTIVITY に追記する実装だったため、バックエンドの送信追加のみで解消。

3. AI視点での結果

Cursor 等から MCP ツールを呼ぶと、リアルタイムで MCP ACTIVITY にメソッド名が表示されるようになった。


2026-02-25: トレイアイコンクリックで一瞬開いてすぐ閉じる

1. 作業実施の理由と指示

  • 背景: タスクトレイのアイコンをクリックするとウィンドウが一瞬表示された直後に閉じてしまう。
  • 意図: クリックが二重に扱われているため、デバウンスで 2 回目を無視する。

2. 作業詳細

  • src/backend/src/lib.rs: on_tray_icon_event 内で、左クリック時に LAST_TRAY_CLICK_MS(AtomicU64)で前回クリック時刻を記録。前回から 400ms 以内のクリックは無視し、それ以外は表示/非表示をトグル。

3. AI視点での結果

トレイクリックでウィンドウの表示・非表示が安定して切り替わるようになった。


2026-02-25: LSA 再学習の自動実行(閾値・割合)

1. 作業実施の理由と指示

  • 背景: 追加・更新・削除のたびに手動で RE-INDEX するのは手間。毎回再学習するのはコストが高いため、変更が「たまった」タイミングで自動実行したい。
  • 意図: 変更件数が「登録ドキュメント数の 20%」と「5 件」の少ない方を超えたら、90 秒デバウンス後にバックグラウンドで train_lsa_and_sync_hnsw を実行する。

2. 作業詳細

  • 状態: AppStatechanges_since_train(AtomicU64)と retrain_scheduled(AtomicBool)を追加。
  • 閾値: schedule_retrain_if_needed を async 化し、SELECT COUNT(*) FROM documents で現在件数を取得。threshold = max(1, min(ceil(doc_count * 0.2), 5))。変更を 1 加算し、count >= threshold かつ未スケジュールなら retrain_scheduled を立て、90 秒後に train_lsa_and_sync_hnsw を spawn。完了後にカウントとフラグをリセット。
  • 呼び出し: add_item_textupdate_itemdelete_itemdelete_document の成功後に schedule_retrain_if_needed(state).await を実行。

3. AI視点での結果

少ない登録数では 1〜2 件の変更で、多い登録数では最大 5 件の変更で再学習が走り、RE-INDEX を押さなくても語彙・LSA が適度に更新されるようになった。


2026-02-25: インデックス化の様子を GUI に表示

1. 作業実施の理由と指示

  • 背景: 再学習やインデックス構築がいつ走っているか分からず、操作のフィードバックが欲しい。
  • 意図: バックエンドの状態(idle / training / syncing)を API と SSE で通知し、ヘッダーに表示する。

2. 作業詳細

  • 状態: AppStateindexing_status(RwLock)を追加。初期値 "idle"
  • API: GET /indexing_status{ "status": "idle"|"training"|"syncing" } を返す。
  • system.rs: train_lsa_and_sync_hnsw の開始時に "training"indexing:training をブロードキャスト。sync_all_vectors の直前に "syncing"indexing:syncing。完了・失敗・件数 0 の早期 return 時に "idle"indexing:idle
  • フロント: ヘッダーに「LSA学習中…」「ベクトル同期中…」用のバッジを追加。3 秒ごとのポーリングと SSE の indexing:* で表示を更新。idle 時はバッジを非表示。

3. AI視点での結果

起動時や RE-INDEX・自動再学習時に、ヘッダーでインデックス構築の進行が分かるようになった。


2026-02-25: 文書一覧にチャンク0の先頭15文字を表示

1. 作業実施の理由と指示

  • 背景: 文書管理のテーブルで、パス・MIME・チャンク数だけでは内容が想像しづらい。
  • 意図: 各ドキュメントのチャンク0の先頭 15 文字を一覧に表示する。

2. 作業詳細

  • バックエンド: list_documents の SQL に (SELECT substr(i.content, 1, 15) FROM items i WHERE i.document_id = d.id ORDER BY i.chunk_index ASC LIMIT 1) AS chunk0_preview を追加。返却 JSON に chunk0_preview を含める。
  • フロント: 文書管理テーブルに「先頭(chunk0)」列を追加。chunk0_preview を表示し、チャンクが 2 以上なら「…」を付与。.docs-cell-preview で最大幅・省略・色を指定。

3. AI視点での結果

一覧から各文書の冒頭が把握しやすくなった。


2026-02-25: 左サイドバー下部の整理

1. 作業実施の理由と指示

  • 背景: サイドバー下部の TelosDB アコーディオンは不要。著作権表示はサイトフッターにあるため重複する。
  • 意図: アコーディオンと著作権表示を削除し、ナビのみのシンプルなサイドバーにする。

2. 作業詳細

  • src/frontend/components/app-sidebar.js: sidebar-bottom 内のアコーディオン(TelosDB ▸ / v0.3.5-HUD・© 2026 DtmOjaji)を削除。アコーディオン用のクリックハンドラも削除。その後、著作権のみのフッターも削除し、sidebar-bottom ブロックごとなくした。

3. AI視点での結果

サイドバーは「検索・文書管理・設定」のナビのみとなり、見た目と役割が整理された。