Skip to content

fix(session): a participant cannot declare who they are in the room #40

Description

@smileygames

目的

参加者が参加の時点で自分の名前と色を決められるようにする。宛先がひとつの参加者を名指せ、発言の色でも追えるようにする。

前提

実測

2026-08-22、Master。並列に立てた 2 セッションの名前がどちらも Claude Code になり、Lin と Lay を宛先に指定できなかった。作業ディレクトリは別々に分けてあった。#31 で入れた宛先が、名指す先を区別できないため機能しない。

名前は起動ごとに選べない

ランチャは起動ごとに作業ディレクトリと起動オプションを差し替えられるが、名前は差し替えられない。

startSession は選択中のタブを { ...tab, cwd, args } として起動する(src/main.ts)。cwdargs は入力欄の値で上書きされるが、name はタブのものがそのまま乗る。その namestart_sessionagent_name になり(src-tauri/src/session.rs)、LIPLUS_AGENT_NAME として .mcp.json に書かれ、サイドカーが hello で名乗る。

そして既定のタブは 1 つだけで、名前は Claude Code である(src-tauri/src/config.rsAppConfig::default)。タブを追加する UI も、名前を編集する UI も存在しない(index.html#launcher)。

したがって、何回起動しても全員が Claude Code を名乗る。作業ディレクトリを分けても変わらない。

色も選べない

#43 で発言と名簿の色を参加者ごとの色相にしたが、色相は名前の FNV-1a ハッシュ由来である(src/main.tshueFor)。名前から決まるため安定はするが、どの名前が近接するかは選べない。

親側の実測: Lin 130.5° / Lay 165.5° / マスター 205.5°。実際に使う 3 名が 75° の帯に収まり、いずれも緑〜青緑になる。彩度は accent と同じ C 0.104 と低いため、35° 差は実際には見分けにくい。色で追うという目的が、まさに使う名前の組で弱まっている。

名前由来かつ安定という性質と、任意の 2 名の分離保証は両立しない。分離を得るには色を導出ではなく宣言にする必要がある。

名前と色は同じ宣言である

どちらも「この部屋での自分は誰か」であり、決まる瞬間は参加の時点で同じである。別々に入れるとランチャ UI・着席まわり・名簿を二度触ることになる。ひとつの issue にまとめる。

対称性

人間の名前は既に起動ごとに選べる。タイトルバーの #display-name(既定 human)がそれで、localStorage に残り、room_join で着席する。参加者が自分の名前を名乗って場に加わる形は、人間側だけ実装されている。

エージェント側に同じ形が無いことが、この issue の中身である。掲示板として人間と AI を同じ参加者として扱うなら、名前も色も参加の時点で決まるべきものであり、設定ファイルに固定されたタブの属性ではない。

名簿が名前で重複を畳む

participants: BTreeSet<String> であり、同名の 2 参加者は 1 エントリになる(src-tauri/src/room.rs)。片方が切断すると remove_participant で両方が名簿から消える。名前が一意になっても、名簿の同一性を名前に置いている点は独立に残る。

潜在的な上書き経路(今回の原因ではない)

register_sidecar<cwd>/.mcp.jsonmcpServers に固定鍵で書き込む(crates/mcp-config/src/lib.rs)。同じ作業ディレクトリを指す 2 セッションは同じ鍵を上書きするため、名前が一意になった後もこの経路では潰れる。

今回の実測では作業ディレクトリが分かれていたためこの経路は発火していない。名前を起動ごとに選べるようにした後に露出するので、同じ issue で塞ぐ。

制約

  • 名前は人間が読んで選ぶものである。UUID などの機械的な一意化で置き換えない。宛先の選択肢に出るのはこの名前であり、Master が Lin と Lay を選べることが目的である。
  • 名前も色も参加の時点で決める。人間側の #display-name と同じ形に揃える。設定ファイルのタブ属性として固定しない。
  • 色は宣言が導出に優先する。宣言の無い参加者には従来どおり hueFor の導出色を割り当てる。色を決めずに参加できる状態を壊さない。
  • 色の明度と彩度は accent と同じに保つ。宣言できるのは色相である。ライト / ダークの両方で読めるという feat(ui): surface the participant panel the design already specifies #43 の条件を維持する。
  • 自分の色が accent 固定である現在の扱いと、色を宣言できることの関係を決める。宣言した色が自分にも適用されるなら、自分を自分と判じる手段の行き先も決める。
  • 名簿の同一性はセッションに置く。名前は表示と宛先のための属性であって、識別子として扱わない。
  • .mcp.json の既存内容は保持する。この repo の他のサーバ登録を壊さない。

対象ファイル

  • index.html, src/main.ts — 起動時の名前と色の入力
  • src/styles.css — 宣言色の適用
  • src-tauri/src/session.rs — セッション起動時の名前の解決
  • src-tauri/src/config.rs — 既定のタブ、色の保持
  • crates/mcp-config/src/lib.rs — 同一作業ディレクトリでの書き込み単位
  • src-tauri/src/room.rs — 名簿の同一性
  • docs/0-requirements.md

完了条件

  • 起動ごとに名前を選べる。
  • 並列に立てた 2 セッションが別々の名前で名乗る。
  • 同じ作業ディレクトリを指す 2 セッションでも名前が潰れない。
  • 宛先の選択肢に両方が並び、片方を指定できる。
  • 片方が切断しても、もう片方が名簿に残る。
  • 参加者ごとに色を決められる。決めた色が発言と名簿の両方に出る。
  • 色を決めていない参加者も従来どおり参加でき、導出色が付く。

関連

Metadata

Metadata

Assignees

Labels

bug動いていない、壊れているready本文が実装開始できる形まで収束している状態。ただし更新は継続可能

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions