コンピューター操作ワークスペース:セッション終了後もファイルを残す
コンピューター操作(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 # 既定 falsemax_per_agent = 3 # 社員 1 人あたりのワークスペース数、1–20max_bytes = 67108864 # ワークスペースあたりの容量(64 MiB)、1 MiB–1 GiBmax_files = 1000 # ワークスペースあたりのファイル数、1–10000retention_days = 30 # この日数接続されないと期限切れ。0 = 期限なし、最大 3650min_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両方がそろわないと、作成・接続・書き込みはできません。
社員の使い方
Section titled “社員の使い方”| ツール | 内容 |
|---|---|
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-…") で再接続します。
読み取りと一覧にセッションは不要です。書き込みには必ず必要です。
ファイルの場所
Section titled “ファイルの場所”- ホスト:
<home>/computer_workspaces/<id>/data/。ディレクトリは 0700 で、gateway を実行しているユーザーだけが入れます。 - コンテナ内:
/workspace/files(読み取り専用)。root だけが入れる小さな tmpfs(/workspace、0700)の下にあるため、ブラウザが使うsandboxアカウントからは届きません。読めるのは gateway が root で実行するコマンドだけです。 - 社員自身の状態ファイル
agents/<社員>/state/computer_workspaces.jsonに、所有するワークスペースの所有者資格情報が入っています(「社員の削除と同名での再作成」を参照)。
ルールと上限
Section titled “ルールと上限”- パス:相対パス、最大 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 つ目のゲートウェイは、自分のセッションを処理して自分のリースを更新しますが、レジストリのメンテナンスもワークスペースコンテナの削除も行いません。終了済みまたは期限を過ぎた残存コンテナは、各ゲートウェイが引き続き削除します。ダッシュボードとコマンドラインの操作には影響しません。
社員の削除と同名での再作成
Section titled “社員の削除と同名での再作成”ワークスペースは名前ではなく、それを作った社員そのものに属します。作成時にランダムな資格情報を生成し、登録簿と社員の状態ファイルの両方に書き込み、接続・読み取り・書き込み・一覧のたびに照合します。
次のどちらかに当てはまると、ワークスペースは所有者なしになります。
- 社員が削除された(
agent.tomlがない、または_trashにワークスペースより新しい同名の項目がある) - 現在その名前を持つ社員が再作成されたもので、資格情報を持っていない
所有者なしのワークスペースは運用者だけが扱えます(削除)。別の社員に割り当て直す機能はこの版にはありません。
運用者のコマンド
Section titled “運用者のコマンド”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 秒後のリース更新で終わります。
duduclaw doctor
Section titled “duduclaw doctor”「電腦操作工作區」(コンピューター操作ワークスペース)の行:
- 無効:合格(無効であることを表示)。
- セクションを解析できない、未対応のプラットフォーム、
computer_workspaces/のルートが安全でない、登録簿を開けない:失敗。 - Docker デーモン id が取れない、ディスクが
min_free_bytesを下回る、削除未完了・作成失敗・所有者なしのワークスペース、結果が確認できない書き込み、リースを失った後に反映された書き込み、データディレクトリが読めない:警告(ワークスペース id を表示)。
機能が無効で、ワークスペースを一度も作っていない場合、gateway は computer_workspaces.db を作りません。
無効にしたとき
Section titled “無効にしたとき”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 ではこの機能は使えません。