コンテンツにスキップ

コンピューター操作ワークスペース:セッション終了後もファイルを残す

コンピューター操作(computer_* ツール)のコンテナはセッション終了時に削除され、AI 社員がブラウザで集めた内容も一緒に消えます。コンピューター操作ワークスペースは gateway が保管するフォルダーです。社員はセッション中にまとめたテキストをここへ書き込み、次のセッション(gateway の再起動後でも)で同じワークスペースを再び接続して作業を続けます。

ワークスペースは 1 人の AI 社員に属します。書き込むのは gateway だけで、接続したコンテナからは読み取り専用で見えます。既定は無効で、全体のスイッチと社員ごとのスイッチの両方が必要です。

macOS と Linux のみ対応です。Windows ではすべての入口が明示的に拒否します(別の方法に黙って切り替えることはありません)。

  • コンピューター操作そのものが使えること:Docker、コンピューター操作のイメージ、社員の computer_use = true。ブラウザ自動化とコンピューター操作を参照してください。
  • gateway が動いていること。3 つのワークスペースツールは gateway に転送されます。
  • ディスクの空きが min_free_bytes(既定 512 MiB)を超えていること。下回ると書き込みは拒否されます。

全体のスイッチは config.toml にあります。

[computer_use.workspaces]
enabled = true # 既定 false
max_per_agent = 3 # 社員 1 人あたりのワークスペース数、1–20
max_bytes = 67108864 # ワークスペースあたりの容量(64 MiB)、1 MiB–1 GiB
max_files = 1000 # ワークスペースあたりのファイル数、1–10000
retention_days = 30 # この日数接続されないと期限切れ。0 = 期限なし、最大 3650
min_free_bytes = 536870912 # ホストに残す空き容量(512 MiB)
admin_approval_minutes = 30 # ターミナル操作に対するダッシュボード承認の有効時間(分)、1–1440

このセクションは厳密に検査されます。型の誤り、範囲外の値、未知のキーがあるとセクション全体が無効になり、機能は無効扱い(既定値は使われません)で、duduclaw doctor はこの行を失敗にします。設定は使うたびに読み直すので、変更に再起動は不要です。

社員のスイッチはその社員の agent.toml にあります。

[capabilities]
computer_use = true
[capabilities.computer_use_config]
workspace = true

両方がそろわないと、作成・接続・書き込みはできません。

ツール 内容
computer_session_start の workspace "new" で新しいワークスペースを作って接続。ワークスペース id(ws-…)なら既存のものを接続。応答に workspace_id、mount_path、リビジョン、使用量が入ります
computer_workspace_list 自分のワークスペース一覧:状態、リビジョン、使用量、クォータ、期限、使用中かどうか、ファイル(パス、サイズ、sha256)
computer_workspace_read UTF-8 テキストファイルを 1 つ読む(最大 48 KiB)。内容はデータ用の囲みに入り、注入スキャンの結果が付きます
computer_workspace_write 自分の現在のセッションが接続したワークスペースに UTF-8 テキストファイルを 1 つ書く。expected_revision(最後に見たリビジョン)を付けると、その後に変更があった場合は拒否されます

典型的な流れ:computer_session_start(workspace="new") → 閲覧とスクリーンショット → まとめた内容を computer_workspace_write → セッション終了。あとで computer_workspace_list で id を確かめ、computer_session_start(workspace="ws-…") で再接続します。

読み取りと一覧にセッションは不要です。書き込みには必ず必要です。

  • ホスト:<home>/computer_workspaces/<id>/data/。ディレクトリは 0700 で、gateway を実行しているユーザーだけが入れます。
  • コンテナ内:/workspace/files(読み取り専用)。root だけが入れる小さな tmpfs(/workspace、0700)の下にあるため、ブラウザが使う sandbox アカウントからは届きません。読めるのは gateway が root で実行するコマンドだけです。
  • 社員自身の状態ファイル agents/<社員>/state/computer_workspaces.json に、所有するワークスペースの所有者資格情報が入っています(「社員の削除と同名での再作成」を参照)。
  • パス:相対パス、最大 4 階層。各階層は文字、数字、内部の空白、-_.()() のみで、. で始めず、前後に空白を置かない。パスは NFC に正規化されます。
  • 1 ファイルは UTF-8 テキストで最大 48 KiB。ツールのリクエスト本体は JSON にした後で 64 KiB が上限のため、引用符・バックスラッシュ・改行・制御文字が多い内容はエスケープで長くなり、実際に書ける量は 48 KiB を下回ります。その場合は複数のファイルに分けてください。
  • クォータ:max_bytes か max_files を超える書き込みは実行されず、既存のファイルはそのまま残ります。
  • 書き込みはアトミックです:一時ファイル、fsync、rename、ディレクトリの同期。途中で失敗しても古いファイルはそのままです。
  • 1 つのワークスペースへの書き込みは同時に 1 件(プロセスをまたぐファイルロック)。同じ expected_revision の書き込みが 2 件来ると、成功するのは 1 件だけで、もう 1 件はリビジョン不一致になります。
  • 処理できない項目:48 KiB を超えるファイル、ハードリンク、シンボリックリンク、特殊ファイル、ルールに合わない名前は読まず、名前も出しません。computer_workspace_list は件数(unprocessable_items)だけを返します。誰かがホストから直接ファイルを置いた場合にしか現れません。
  • ハッシュ:一覧の sha256 は gateway の台帳から取り、毎回フォルダー全体を読み直すことはしません。gateway が読めないファイルは sha256: null、hash_unknown: true で返します。
  • セッションが停止・一時停止中、または脅威レベルが GREEN でないときは書き込みを拒否します。読み取りと一覧は引き続き使えます。

retention_days 日接続されなかったワークスペースは期限切れになります。接続も書き込みもできませんが、ファイルは削除されず、所有者は一覧と読み取りができます。期限切れのワークスペースは max_per_agent の枠を使いません。運用者は renew で延長できます(後述)。

リース:同時に 1 セッションだけ

Section titled “リース:同時に 1 セッションだけ”

1 つのワークスペースを接続できるのは同時に 1 セッションだけです。gateway は 15 秒ごとに更新し、リースは 90 秒です。

  • セッションが終わると、リースはすぐに解放されます。
  • 通常の動作中に gateway が落ちた場合、別のセッションは最大 90 秒で接続できます。
  • セッション開始の途中で gateway が落ちた場合(承認待ちやコンテナ起動待ち)、開始時のリースは開始処理全体を覆うため、最長で約 8.5 分(90 秒+開始上限 415 秒)そのワークスペースを再接続できません。

レジストリのメンテナンスを行うゲートウェイは 1 つだけです。 データディレクトリのインスタンスロックを保持しているゲートウェイだけが、起動時と定期スイープ(10 分ごと)で、ワークスペースのレジストリ(期限切れリース、書き込みインテント、未完了の作成・削除、保持期限)を整理し、古いワークスペースコンテナを削除します。同じデータディレクトリ上の 2 つ目のゲートウェイは、自分のセッションを処理して自分のリースを更新しますが、レジストリのメンテナンスもワークスペースコンテナの削除も行いません。終了済みまたは期限を過ぎた残存コンテナは、各ゲートウェイが引き続き削除します。ダッシュボードとコマンドラインの操作には影響しません。

ワークスペースは名前ではなく、それを作った社員そのものに属します。作成時にランダムな資格情報を生成し、登録簿と社員の状態ファイルの両方に書き込み、接続・読み取り・書き込み・一覧のたびに照合します。

次のどちらかに当てはまると、ワークスペースは所有者なしになります。

  • 社員が削除された(agent.toml がない、または _trash にワークスペースより新しい同名の項目がある)
  • 現在その名前を持つ社員が再作成されたもので、資格情報を持っていない

所有者なしのワークスペースは運用者だけが扱えます(削除)。別の社員に割り当て直す機能はこの版にはありません。

ターミナルウィンドウ
duduclaw ops computer-workspaces list [--owner <社員>]
duduclaw ops computer-workspaces fence <ワークスペース id> [--reason <理由>]
duduclaw ops computer-workspaces revoke <ワークスペース id>
duduclaw ops computer-workspaces regrant <ワークスペース id>
duduclaw ops computer-workspaces renew <ワークスペース id>
duduclaw ops computer-workspaces delete <ワークスペース id> --confirm
操作 内容 承認
list 全ワークスペース(状態、所有者、使用量、リース期限) 不要
fence 現在のセッションから制御を取り上げる 必要
revoke 一時停止:状態のみ表示、読み取り・書き込み・接続は不可 必要
regrant 一時停止を解除 必要
renew 保持期限を延長。期限切れのものは再び使えるようになる 必要
delete ワークスペースと中のファイルをすべて削除。元に戻せません 必要

コマンドラインで状態を変える操作はすべてダッシュボードでの承認が必要です(list だけは不要)。ターミナルでは運用者と Bash を持つ AI 社員を区別できず、fence/revoke がすぐ効くと、Bash を持つどの社員でも他人のワークスペースを止められてしまうためです。緊急時はダッシュボード(computer_workspaces.*。ログインした Admin が実行し、即時に効き、実行中の操作の終了を待ちます)か [computer_use.workspaces] の全体スイッチを使ってください。

流れ:1 回目の実行はダッシュボードの受信箱に依頼を登録するだけで、請到儀表板的待辦核准(ダッシュボードの受信箱で承認してください)を表示して 0 以外の終了コードで終わります。Admin がダッシュボードで承認したら、admin_approval_minutes(既定 30 分)以内に同じコマンドをもう一度実行すると実行されます。

  • 承認は「操作、ワークスペース id、ワークスペースの状態バージョン」に結び付きます。承認後に状態が変わる(セッションが接続する、fence されるなど)と承認は無効になり、改めて依頼が必要です。

  • 承認は 1 回だけ使えます。承認を使った後に操作が失敗した場合、承認は使用済みで再申請が必要だと表示します。

  • 決定できるのはダッシュボードの Admin だけです。チャットチャネルのボタンや返信は効力がなく、Admin 以外のダッシュボードアカウントも承認できません。

  • ワークスペース、操作、凍結理由の組ごとに保留中の依頼は 1 件だけです。状態が変わるとその依頼は取り下げられ(state_changed)、新しい依頼が作られます。開いている間に書き換えられたカードを Admin が承認することはありません。fence の承認は --reason にも結び付き、理由が違えば別の依頼です。通知はワークスペースごとに 1 時間あたり最大 2 回で、それを超えると受信箱に残すだけで監査記録を書きます。

  • これらの規則はほかの運用者コマンドと共通です(コマンドラインからの運用者操作は 1 つの承認ゲートを共有する を参照)。2 つのターミナルが同じ承認済みコマンドを同時に再実行しても適用は 1 回で、もう一方は拒否され、新しい依頼も作りません。

  • 通知に含まれるのはワークスペース id、所有者、操作、ファイル数とバイト数、そして「這筆請求由本機指令列建立,系統無法確認下指令的人是誰」(この依頼はローカルのコマンドラインから作成され、誰が実行したかシステムは確認できません)だけです。

その他のルール:

  • DuDuClaw のセッションや身元を示す環境変数(DUDUCLAW_AGENT_ID、DUDUCLAW_TURN_ID など)が 1 つでもあると、コマンドは実行を拒否します。
  • AI 社員の Bash で duduclaw/duduclaw-pro の ops computer-workspaces を実行すると、agent-file-guard フックが拒否します(未検証の呼び出し元も同様)。
  • ターミナルからの操作は監査に「本機指令列(身分未驗證)」(ローカルのコマンドライン、身元未確認)として記録されます。
  • ターミナルからの操作は、依頼・適用・拒否のたびにセキュリティ監査の記録を書きます(security_audit.jsonl、イベント computer_workspace_cli_action)。
  • 承認後にターミナルから適用する fence/revoke/delete は登録簿だけを変更します(ターミナルのプロセスはセッションを持ちません)。最後の確認をまだ通っていない操作はすぐ拒否され、すでに通った 1 件は最後まで実行され、セッションは次の操作か約 15 秒後のリース更新で終わります。

「電腦操作工作區」(コンピューター操作ワークスペース)の行:

  • 無効:合格(無効であることを表示)。
  • セクションを解析できない、未対応のプラットフォーム、computer_workspaces/ のルートが安全でない、登録簿を開けない:失敗。
  • Docker デーモン id が取れない、ディスクが min_free_bytes を下回る、削除未完了・作成失敗・所有者なしのワークスペース、結果が確認できない書き込み、リースを失った後に反映された書き込み、データディレクトリが読めない:警告(ワークスペース id を表示)。

機能が無効で、ワークスペースを一度も作っていない場合、gateway は computer_workspaces.db を作りません。

enabled = false(または社員の workspace = false)は新しい作成・接続・書き込みを止めるだけで、接続中のセッションは次の操作で終わります。所有者は既存の内容を引き続き一覧・読み取りできます。読み取りも止めたい場合は revoke、内容を消したい場合は delete を使います。

  • 所有者による分離が成り立つのは 3 つのワークスペースツールだけです。 Read や Bash を持つ AI 社員はホストの <home>/computer_workspaces/ を直接読めます。制限のない Bash を持つ社員は、コマンドラインの身元判定と承認ゲートも回避できます:approvals.db、computer_workspaces.db、ワークスペースのディレクトリを直接書き換えたり、自分の依頼をデータベース上で承認済みに書き換えたりできます。Bash のチェックは速度を落とすだけです。本当の分離は Bash を与えないこと、またはタスクサンドボックスです。
  • 所有者資格情報は社員自身のディレクトリにあり、その社員が読み書きできます。Read を持つ社員は、削除された前任者が agents/_trash/ に残した資格情報も読めます。この照合が止められるのは製品のツールだけを使う同名の新社員で、制限のないファイルアクセスを持つ社員は止められません。
  • ファイルはディスク上で平文です。マスキングの「元に戻さない」は書き込み時にマスク記号を元の値に戻さないという意味で、ディスクに個人情報がないという意味ではありません。
  • denied_tools にワークスペースツールを書いても、computer_session_start が workspace 付きでワークスペースを読み取り専用でコンテナに接続することは止まりません。そのためのスイッチは [capabilities.computer_use_config] workspace です。
  • 機能を無効にしても、所有者は既存の内容を一覧・読み取りできます(前節)。
  • ブラウザは --no-sandbox で動きます(コンピューター操作の既存の状態)。
  • マウント元の確認と docker run の間に短い時間差があります。gateway と同じ OS ユーザーで動くプログラムなら利用できます。コンテナ内で /workspace に入れるのは root だけで、現在コンテナ内からワークスペースを読むツールはありません。
  • root の docker exec は /workspace の 64 KiB の tmpfs に書き込めます(/workspace/files 自体は読み取り専用)。そのように実行するのは gateway だけです。
  • リース取得後に開始処理が中断された場合(タイムアウトや接続切れ)、リースはすぐには解放されず、開始時のリースの期限(最長約 8.5 分)で切れます。
  • 所有者なしのワークスペースは削除のみで、割り当て直しはできません。
  • 実コンテナのテストは macOS arm64 の Docker Desktop でのみ実施しました。Linux ネイティブの Docker、amd64、Windows は未検証です。Windows ではこの機能は使えません。