Skip to content

feat(room): the room keeps no history #48

Description

@smileygames

目的

部屋の発言をローカルの追記ログに残し、過去のやり取りを左サイドバーの履歴として参照できるようにする。

観測

2026-08-22 のセッションで、Master が部屋でのやり取りを引用しようとして、履歴が存在しないことが判明した。部屋の発言はウィンドウの DOM にしか無く、閉じれば消える。

引用できないことは症状のひとつに過ぎない。#47 のような「実際に何が起きたか」を根拠にする設計判断が、参加者の記憶と Master の記憶だけを頼りにしている。

前提

いずれも 2026-08-27 に main の作業ツリーで実測して確認済み。

保存の土台は既にあり、使われていない

src-tauri/src/config.rs に保存の土台が存在する。SavedChatMessage(113 行)/ SessionData(120 行)/ TabSessions(127 行)/ save_sessions(241 行)/ load_sessions(253 行)。いずれも lib.rs:43-44 で登録済み。

フロントエンドからの参照は 0 件src/**/*.ts 全体を save_sessions|load_sessions|TabSessions|SavedChatMessage で走査)。

土台の形が現在のモデルと合っていない

  • SavedChatMessagerolecontent_type を持つ。チャットアシスタントの語彙であり、feat(room): one post frame, so a participant is a participant #39 の参加者モデルには role に当たる軸が無い。発言者は名前で、種別は持たない。
  • TabSessions はタブ単位。掲示板ではログは部屋のものであってタブのものではない。タブは起動の設定であり、会話の器ではない。

そのまま配線すると、#39 で外した人間 / AI の非対称が保存層から戻ってくる。

保存する 5 欄は現在の投稿型にそのままある

src-tauri/src/room.rs:108RoomMessagemessage_id / speaker / content / to / ts を持つ。同じ構造体に hueown もあるが、own は「見ている側の属性であって話者の属性ではない」と型のコメントが明言している(room.rs:105-107)。保存層に持ち込めば壊れる欄であり、5 欄指定はこれと整合する。

design は既に答えを持っている

design/Vision.dc.html:191ルーム情報パネルに ログ logs\main.jsonl がある。部屋単位、追記形式。同じパネルの隣の行は 部屋ソケット 127.0.0.1:64475 で、ログのパスはそれと同列の「情報」として置かれている。

現在の画面は左に何も置いていない

index.html:44#body は flex 行で、#conversationflex:1、45 行)と <aside id="participants">(16.5rem 固定、border-left、162 行 / styles.css:495)の 2 つだけ。左端は #conversation が占めており、左サイドバーは新規に追加する必要がある。

制約

  • ログは部屋のものとする。タブ単位にしない。既存の TabSessions 系はこのモデルに合わないため、流用ではなく作り直す。
  • 保存する形は投稿そのものとする。message_id / speaker / content / to / ts。参加者クラスを値域に取る欄を作らない(feat(room): one post frame, so a participant is a participant #39)。own は保存しない(見る側の属性であるため)。
  • 起動時の部屋は新規とする。 過去ログを #room の本文へ復元しない。閉じれば部屋の中身は消える、という現在の振る舞いを変えない。
  • 履歴は左サイドバーという別のサーフェスに置く。 部屋の本文と履歴は別物であり、混ぜない。
  • 履歴の読み出しは画面のためのものであり、参加者への再配信ではない。あとから参加したセッションの channel へ過去の発言を流し込まない。src-tauri/src/room.rs:503 の「a later joiner simply missed it」という現在の扱いを変えない。変えると、部屋が「誰が何を聞いたか」を持ち始める(feat(room): give utterances an addressee so agents can stay silent #31 / feat(room): one post frame, so a participant is a participant #39 で退けた形)。
  • ローカルに留める。rules/task/task.md の「エージェント間の対話を GitHub へ流さない」に当たる。
  • アプリは部屋であってランタイムではない。ログを監視して何かを発言する機構をここで作らない。
  • 追記の失敗で発言が失われない、あるいは失敗が観測できること。黙って落ちる経路を作らない。

決定(旧・未決)

2026-08-27 に Master が判断。

  1. 読み戻し — 左サイドバーを作り、履歴として表示する。ただし起動時は新規ルームとして起動する(本文は空から始まり、過去ログはサイドバー側にのみ現れる)。
  2. 保持期間と上限 — 無制限追記、ローテーションなし。Vision が main.jsonl と単数形で持ち、日付を持たないことに従う。
  3. ファイル名の形logs\{部屋名}.jsonl。Vision の main を部屋名の位置と読む。複数部屋そのものの実装は今回やらない。

対象ファイル

ファイル 変更
src-tauri/src/room.rs 投稿が部屋に入った経路から追記を呼ぶ。RoomMessage から保存 5 欄を落とす写像。
部屋ログの新規モジュール(src-tauri/src/ 配下) jsonl 追記と読み出し。config.rsTabSessions 系は流用しない。
src-tauri/src/lib.rs 読み出しコマンドの generate_handler! 登録。
index.html #body の先頭へ左 <aside> を追加。#conversation の前。
src/styles.css 左 aside の幅と border-right#participantsborder-left)と対になる形。
src/main.ts サイドバーの描画と読み出しコマンドの呼び出し。

依存: src-tauri 側の読み出しコマンドが先。main.ts はそれに乗る。

関連

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancement新機能・改善要望ready本文が実装開始できる形まで収束している状態。ただし更新は継続可能

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions