← 活動記録一覧

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/listthread/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を直接読む経路は設けていない。

local Codex taskを安全なsnapshotとして同期

図を描画しています…

確認したこと

確認結果

型検査、全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が通った内容が対象へ反映されたことをもって完了とした。