Skip to content

feat(account): one participant list, and a dialog to make an account in #59

Description

@smileygames

目的

名簿と端末リストを一つにする。行にアカウントの操作が乗り、種別で分かれ、起動していないアカウントも最初から並ぶ。あわせてアカウントの作成をランチャ行からモーダルへ出す。

前提

いまリストが二つある

画面右に「参加者」と「端末」が縦に並んでいる(Master のスクリーンショット、2026-08-23)。稼働中のアカウントは両方に出る。終了ボタンは端末側にしかない。

#57 がそう作ったのは、名簿の行にアカウントを結べなかったためである。Participant は接続キーであり アカウント id を持たない。名前で結ぶ形は #40#53 が却下している。

「部屋に触らない」は原則ではなかった

その制約は #53 のスコープ判断だった。アカウントは画面と config の概念であり、あの issue では protocol を変える必要が無かった。ただそれだけである。

それを標準の制約として #57 へ持ち込んだのは誤りであり、リストが二つに割れた直接の原因である。

部屋がアカウント id を運ぶことは、#39 / #40 の規律を壊さない。 同一性は接続に置いたままとし、自分の発言の抑止も名簿の同一性も接続で判定し続ける。アカウント id は名前ではなく、同一性を置き換えるものでもない。運ぶだけである。

種別は作るときに決める

参加者が人間かどうかを接続の種類から推測しようとすると、別クライアントから来た人間を取り違える。部屋は接続の種類しか知らない。

アカウントの作成フォームは既にある。そこで選べばよい。

これにより #53 が保留にした「人間をアカウントにするか」も決まる。 Master は種別 user のアカウントになる。

ランチャ行が二つの仕事を持っている

現在の行は、アカウント選択 / + / / 名前 / 色 / 作業ディレクトリ / セッション参加 を並べ、起動オプションが次の行に続く。

「どのアカウントで参加するか」と「このアカウントの設定を編集する」は別の行為である。 種別が増えることで、なおさら分ける理由がある。

起動時に並ばない件(切り分け済み・欠陥ではない)

Master の初回観測では human のみが並んでいたが、再起動後の観測(2026-08-23)で Claude Lin / Claude Lay が起動直後から 未起動 として並ぶことを確認した。

原因は #55 / #56 の改名である。バンドル識別子が変わって appdata が切り替わり、その起動時点では config が空だった。欠陥ではない。 この項目に実装作業は無い。

作成に「決めた」瞬間が無い

現在、アカウントの各欄は change で保存される(src/main.tsaccountNameEl ほかの change ハンドラが saveAccounts() を呼ぶ)。フォーカスが外れた時点で書き込まれる。+ を押した瞬間にアカウントが実在し、以後はその場で直していく形になる。

決定も取消も無い。 Master の言葉では「煩わしい」(2026-08-23)。

モーダルへ移すこと自体はこれを直さない。モーダルの中で change 保存を続ければ同じである。

リストの見た目(Master の参考、2026-08-23)

Discord のロールリストが参考として示された。読み取れる構造は次のとおり。

アバターは入れない(Master、2026-08-23)。参考画像にはあるが、今回は対象外とする。現在の色付きの名前と在席ドットをそのまま使い、グループ見出しと行の操作を足す形になる。

オフラインの参加者は、色を保ったまま薄く表示し、ドットを白抜きにする。灰色に落として色を捨てない —— 色はアカウントの同一性を担っており、居ないだけで別人に見えるのは誤りである。

制約

  • protocol を 4 → 5 とする。 hello にアカウント id を足す。画面側の参加経路(room_join)にも同じものを通す。
  • アカウント id は任意とする。 持たない接続も参加者である。部屋がアカウントの存在を前提にしない。
  • 同一性は接続に置いたままとする。 自分の発言の抑止、名簿の同一性、speaker の刻印はいずれも接続で判定する(feat(room): one post frame, so a participant is a participant #39 / fix(session): a participant cannot declare who they are in the room #40 / feat(room): let a participant see the floor before speaking #47)。アカウント id は突き合わせのために運ぶだけであり、判定の基準にしない。
  • リストは一つにする。 二つのリストを見た目だけ揃えるのではなく、一つにする。
  • グループは種別で分ける。種別は作成時の宣言であり、接続の種類から推測しない。
  • 起動していないアカウントも最初から並ぶ。 一度起動することを条件にしない。
  • 終了は feat(account): give each account its own terminal and a way to end it #57 の 2 段階(arm)を維持する。 名簿の行へ移すことで、無地のクリック一つに戻さない。
  • アカウントの窓は同一 webview 内のモーダルとする。 OS の別ウィンドウにしない。
  • モーダルは明示的な決定と取消を持つ。 欄の change で保存しない。+ は空のフォームを開くだけとし、決定するまでアカウントを作らない。 取消は何も残さない。編集も決定するまで反映しない。
  • ランチャ行に残すのは「アカウントを選ぶ」「参加する」のみ。 名前・色・作業ディレクトリ・起動オプションはモーダルへ移す。
  • 未起動のアカウントに端末の操作を出さない(feat(account): give each account its own terminal and a way to end it #57 の条件を維持)。

対象外

対象ファイル

  • src-tauri/src/room.rshello / room_join のアカウント id、Participant への搭載、protocol
  • sidecar/src/index.tshello にアカウント id
  • src-tauri/src/config.rs — アカウント種別
  • src-tauri/src/session.rs — 起動時のアカウント id の受け渡し
  • index.html, src/main.ts, src/styles.css — 統合リスト、グループ、モーダル、ランチャ行の整理
  • sidecar/test/round-trip.test.mjs
  • docs/0-requirements.md

完了条件

  • 画面右のリストが一つである。
  • 稼働中のアカウントの行に 終了 がある。押し間違いで終了しない(arm を維持)。
  • 起動していないアカウントも、アプリを起動した直後から並ぶ。
  • リストが種別で分かれ、それぞれの数が読める。
  • グループ見出しが種別名と件数を示している。
  • オフラインの参加者が、色を保ったまま薄く表示されている。
  • 種別はアカウント作成時に選ぶ。接続の種類から推測していない。
  • 画面の本人が種別 user のアカウントとして扱われる。
  • アカウントの作成・編集・削除がモーダルで行える。
  • モーダルに決定と取消がある。取消したとき、アカウントが作られていない / 編集が反映されていない。
  • 欄からフォーカスが外れただけでは保存されない。
  • ランチャ行にはアカウントの選択と参加のみが残っている。
  • hello にアカウント id が載り、Participant がそれを持つ。protocol が 5 である。
  • アカウント id を持たない接続も参加者として扱われる。
  • 自分の発言の抑止と名簿の同一性が、依然として接続で判定されている。

関連

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