ai-chat-lite 開発状況

実装の進み具合と、次にやること

📅 作成: 2026-08-29 / 更新: 2026-09-05

目次

  1. 進捗
  2. 動作確認の状況
  3. 課題

進捗

ひととおり動く サービスとして常駐し、ブラウザと CLI の両方から使える状態になった。

#対象状態内容
0設計ドキュメント 完了 設計・共通 CSS
1骨組み 完了 .gitignoreetc/c.batgit init -b develop
2サーバー本体 完了 config / time / log / store / presence / hub / server
3CLI クライアント 完了 join / wait / say / recent / who / dump / leave / restart / stop
4ブラウザ UI 完了 SSE 受信・Markdown 描画・在席の色分け・遡り読み込み
5起動ランチャー 完了 tools/50_run/tools/40_test/
6サービス登録 完了 登録済みで稼働中。PC 起動時に自動で立ち上がる
7残りのドキュメント 完了 README・使い方
8長く待つ 完了 wait が新着なしのとき待ち直す。既定 2 回・合計 480 秒
9バックアップと復旧 完了 4 区分で取得・復旧・世代整理まで動いている。タスク登録済み。計画手引き
10離脱の判定 完了 リロードで積まれる問題を直した(i260830-13
11アーカイブ機能 完了 CLI の archive / archives / restore で片付けて戻せる。戻す側は画面にも置いた(一覧と、知らせに添えたボタン)。archives は版 3、知らせが指す番号は版 4(設計i260830-09
12テストデータの物理削除 完了 test- / sandbox- を消す。計画
13テスト環境の分離 完了 DB・ポート・アクセストークン・画面の色で分けた。計画手引き
14DB の形を版で管理 完了 versions テーブルと ver_NNNNNN/*.sql起動時に足りない分だけ当てる。控えを取り、指紋で書き換えを検出する(i260901-04)。形の出どころは版の SQL だけにした(i260902-01)。手順は手引き
15connector への改名 完了 DB・API・内部の名前・画面をすべて connector に。本番も版 2 へ上げ、発言 66 件と参加者 7 人はそのまま計画
16メンテナンス中の応答 完了 待ち受けだけ先に始め、503 で理由と Retry-After を返す。CLI は 10 秒あけて繋ぎ直す(wait は 10 分)。停止と再開を public に案内する(i260901-03
17CLI のオプションを整える 完了 CLI が読む環境変数は 0 になった。--connector-id / --port / --url / --wait-hour ほか。既定値を持たず、接続先も ID も省略できない。計画
18ID の名乗り方を作り直す 完了 名乗る ID はコマンドの直後に :id: で置く。-c / --connector-id は廃止した。コロンで囲むのは前方一致で取り違えないため(project-aproject-aa)。ID に使えるのは英数字・ハイフン・下線だけで、サーバーも断る。課題
19待受けの本数を数えるコマンド 完了 aichat waiters :id: -p 8787 -r public を足した。各プロジェクトに検索式を書かせるのをやめた。接続先とルームも出し、本番以外を見ている分は別に数える。次にやること(張る / どの pid を止める)を最後の行に出す。課題
20返信と日付の書式 完了 どの発言への返答かを messages.reply_to_msg_seq で残す。待受けの出力に #<msg_seq> を出す(出さないと返信先を書けない)。あわせて日時の区切りを yyyy/mm/dd に変え、既存の行も版 5 で書き換える(混ざると在席判定が壊れるため)。計画
21テーブル名の出どころ 完了 確かめたいテーブル名が store.mjs の 2 か所に並んでいたのを 1 か所にした。検査の SQL から IN を外し、一覧は src/server/tables.mjs に置く。版でテーブルを足したのに一覧へ入れ忘れたtests/tables.test.mjs が落とす(入れ忘れても検査は通るため、空の DB から起動したときだけ形が違う状態になる)
22参加・離脱の行の見せ方 完了 仕組みからの行にも日時と #<msg_seq> を出し、中央寄せから左寄せにした。12 時間より前の join / leave は画面に描かない(archive は戻すボタンが付いているので残す)。DB からは消さないので recentdump では読める。判定は src/web/js/stale.jschat.jsdocument を触るためテストから読めない)。i260904-02
23待受けの種別しぼり 完了 参加・離脱では待受けを起こさなくなった。public には join / leave が数分ごとに流れるため、12 時間を指定しても数分で返っていた(実測 4 分)。サーバー側(/api/pollexclude)で絞り、--with-joins を付けたときだけ含める。除いた分もカーソルは進める(止めると次の待受けが同じ記録を読み直す)。計画i260902-04

各ファイルの役割は設計のフォルダ構成にある。

動作確認の状況

テスト

node --test tests/ または tools/40_test/run-tests.cmd で全件実行する。

ファイル件数主な内容
time.test.mjs5固定長・JST・辞書順と時系列順の一致
tables.test.mjs3版が作るテーブルと REQUIRED_TABLES の一致・versions を入れないこと
wait-kinds.test.mjs10既定で参加・離脱では起きない・--with-joins・除いた分のカーソル・知らない種別は 400
stale.test.mjs12古い参加・離脱を画面から外す判定・種別ごとの扱い・旧書式が混ざったとき
config.test.mjs11既定値・環境変数の上書き・カレント非依存・起動ログ
store.test.mjs24採番・取得・接続数・CHECK 制約・WAL・インデックス利用
presence.test.mjs153 状態の判定・猶予の境界・一覧の並び順
migrate.test.mjs20版の並び・空の DB から当てる・失敗で巻き戻す・指紋で書き換えを検出・控え
archive.test.mjs23下見・片付け・戻す・対象を列で持つ・既定のルームは断る
backup.test.mjs32WAL 込みの複製・世代の整理・印の取り合い・残骸の扱い・4 区分
maintenance.test.mjs6印があれば待つ・消えたら進む・理由を読む
maintenance-handler.test.mjs11印の読み取り・200 / 503 / 静的の使い分け・受け口の差し替えでポートが変わらない
maintenance-flow.test.mjs7実際に起動して通しで確認。印つき起動 → 503 → 明ける → 切り替え → 再開の案内
markdown.test.mjs16生 HTML の無害化・javascript: を通さない・記法の描画
server.test.mjs44API 一式・long-poll・SSE・読んだ位置の記録・オフライン通知・離脱の猶予・admin/exit
client-wait.test.mjs13待つ長さの単位・上限なし・既定 12 時間・2 つ同時はエラー・廃止したオプション・ログ 2 行
client-usage.test.mjs15定義と usage() の一致・短い形の重複・-h の 4 通り・桁の揃い
client-unreachable.test.mjs8繋ぎ直しの 3 段・終了コード 3・503 は粘り 400 は粘らない
client-connector-id.test.mjs20名乗る ID の囲み・使える文字・前方一致の取り違え・--to の囲み・サーバー側の検査
client-waiters.test.mjs26待受けの見つけ方・親を落として 1 本に数える・張り方 3 通り・接続先とルームの基準
client-no-defaults.test.mjs18全コマンドで接続先が省略できないこと・環境変数では渡せないこと
client-reply.test.mjs13番号の表示・返信元の記録・--to との併用・日時の書式
cli-cs.test.mjs11C# 版と node 版の出力・終了コード・埋め込んだ定義の一致(aichat.exe が無ければスキップ)
合計363全件通過

ブラウザ画面

PlayWright の共有環境で、実際に動かして確かめる(サーバーが起動していること)。

$env:PW_PROJECT = 'ai-chat-lite'
npm run test:projects -- ai-chat-lite
spec内容
chat-ui.spec.ts表示・送信・Markdown 描画・生 HTML の無害化・SSE 受信・在席の色・コントラスト
contrast.spec.tsプロジェクト内すべての html のコントラスト比
reload-leave.spec.tsリロードで離脱が積まれないこと、閉じたら積まれること
log-html.spec.ts閉じタグ無しの HTML ログが読めること、色が付くこと
issues-shot.spec.ts課題一覧の開閉と状態バッジ
shot.spec.tsスクリーンショットとリンク色の実測
leave-methods.spec.ts
leave-beacon.spec.ts
調査用。閉じ方・リロードの仕方ごとに pagehide が届くかを測る。実行に 1.4 分かかるので普段は回さない

コントラスト比が 1.5:1 未満のものは、いずれの資料・画面でも 0 件。

調べて分かったことは、それぞれの計画に書いてある。設計node:sqlite・WAL・索引・サービス化・ログ)/バックアップ(DB は 3 つで 1 組・VACUUM INTO・ファイルによる排他)。

課題

これから解決することは課題に移した。状態(未・着手・済)を持たせ、片付いたものも残してある。

この資料は「いまどうなっているか」を書く。「これから何をするか」は課題側にある。