FACTUAL ACTIVITY RECORD · 実際の作業をもとにした活動記録
ローカルのAI会話を安全に同期するConnectorを作る
read-only取得、durable outbox、認証済みbatch投入で表示用snapshotを継続転送する
目的
3D表示がlocalのAI taskと会話を直接読む構成では、元端末が止まると保存済み履歴も参照できず、複数process間の通知だけを正本にすることもできなかった。local履歴を再照合し、表示用snapshotとして外部databaseへ安全に同期する独立processが必要だった。
秘密権限を端末へ置かず、通信断でも順序を失わず、進行中taskを優先しながら古い履歴もbackfillし、再送や巨大履歴でも一貫性を保つheadless Connectorを目指した。
実装
local履歴clientとroot task readerは、app-serverをstdioで起動してinitializeし、完全一致するworkspaceのthread/listとthread/readをread-onlyで再照合する。別processの通知は補助にせず、取得結果を正本として履歴normalizerで許可fieldだけへ正規化する。
- 更新の新しいroot・subagentと親chainを8件の優先batchとして読み、最大4件を並列処理する。
- 残りの履歴は既定30分ごとに32件ずつbackfillし、通常pollを全履歴の待ち時間から分離する。
- 初回は全scanし、checkpointがある再起動では優先batchから再開する。
永続outboxは取得したbatchをSQLiteへ先に永続化し、FIFOで送信する。単調増加sequenceと冪等なbatch identityにより古いretryが新しい状態を上書きしない。4 MiBを超える履歴は分割し、完全なID manifestがある場合だけ欠落したturnとmessageを削除扱いへ揃える。
端末側はbrowser利用可能なpublishable keyと利用者sessionだけを持つ。限定ingestion endpointとheartbeat functionがJWTを検証し、権限を持つtransactional RPCへ渡す。databaseはowner単位の行制御を適用し、端末・project・definition・thread・turn・message・batchを同じowner境界へ置く。
- reasoning、command、tool引数・結果、workspaceやGit remoteの構造化fieldは同期しない。
- 利用者とAIの会話本文は原文を同期し、本文内の秘密情報やpathを自動で消す機能はないことを明記した。
- command入口にlogin、単発同期、常時実行、状態確認、診断、恒久error batchの再試行、service管理を用意した。
負荷境界の検査では、巨大threadの削除整合、長いagent key、definition全体の4 MiB超過、絵文字を途中で切るmetadata正規化が問題になった。ID manifestによる整合、byte長制約、definitionのsize保証、Unicode scalar単位の正規化へ修正し、上限付近の入力を含めて再検査した。
Connectorは取得、正規化、durable outbox、remote ingestを一つのCollectorで順序付けた。browser applicationからlocal sourceを直接読む経路は設けていない。
図を描画しています…
確認したこと
確認結果
型検査、全test、buildをまとめたcheckが最終実装で成功した。
最大寄りのagent metadata 200件は約2.39 MiBに収まり、4 MiB上限まで約1.80 MiBの余裕を確認した。
C0 control、対応しないsurrogate、長いidentity name、巨大履歴分割、再送順序、tombstone整合の境界を検査した。
端末にsecret keyやdatabase passwordを置かず、直接書込権限を与えない認証境界と、raw message本文は自動redactしない限界が文書と実装で一致した。
cutoff時点でConnector初期実装は対象へ反映されていた。端末がsleep・停止中の新規取得、極端なID manifestの完全整合、本文へ貼られた秘密情報の自動除去は保証していない。
完了とした根拠
read-only取得、優先scanとbackfill、durable outbox、認証済み投入、owner境界、巨大入力の処理が揃い、指摘されたsize・Unicode・整合性の問題を修正した最終checkが通った内容が対象へ反映されたことをもって完了とした。