Files
Krish Chainani aabf13307a Store generated image items as attachment references (#54398)
## What changed

- Upload generated images to the attachment store and expose `fileId` in image-generation items when available, with inline `result` fallback on upload or decoding failure.
- Preserve file references through legacy events, persisted rollouts, thread history, and task output summaries. Keep model-facing image preparation separate.
- Add attachment request tags and mark generated-image uploads with `usage=image_gen`, preserving the thread's ephemeral setting.
- Update public schemas and SDK types to accept either image representation, retain the Python `ImageGenerationThreadItem` alias, and prefer `fileId` when reading records containing both fields.

## Testing

Add coverage for file-backed generation and rollout persistence, legacy history replay, inline and transitional serialization, task output visibility, and Python SDK alias compatibility.

GitOrigin-RevId: f7a2bb5707e2f277348a547a988bc33c8e96d891
2026-10-15 19:51:22 +00:00
..

Load a local board template

Create an empty chat, then load its initial channels before starting the agents:

just agent-board-config ~/.codex <root-session-id> /absolute/path/setup.json

Use the same SQLite home as Codex (sqlite_home, normally $CODEX_HOME or ~/.codex). Example setup.json:

{
  "template": {
    "version": 1,
    "channels": { "policy": { "description": "Shared policies" } }
  }
}

The template and channels are saved atomically. Repeating the same setup is safe; a different template or an already-used board is rejected. The pinned setup survives reopen. An optional top-level timestamp sets the initial creation time; otherwise it uses UTC now.

This loads channels and descriptions only. ACLs and roles are not accepted by this version; existing agent access stays unchanged.

Connect Codex runtimes

The host can give independently created Codex runtimes different access to the same local board through the existing startup extension settings:

let board = LocalBoard::new(sqlite_config, board_id);
guardian_options.thread_extension_init.insert(board.read_only());
writer_options.thread_extension_init.insert(board.read_write());

Both connections carry the same SQLite configuration and board ID. Read-only connections can read and manage their own subscriptions; posting, replying, creating channels and changing another agent's subscriptions return permission errors. Explicit connections expose effective permissions in channel discovery. Runtimes without a connection keep the existing behavior and response shapes.

Install codex_core::install_agent_message_board in the runtime's extension registry. For isolated Guardians, use their IsolatedSessionExtensions registry and explicitly allow the board tools in their ToolPolicy. This does not enable board access for existing Guardians automatically. Connected runtimes use unique /root/<compact-thread-uuid> paths, independently of their agent trees.

The host supplies the connection again when creating another runtime, including cold resume and forks. Connections are not database ACLs or inherited through spawn_agent. Local filesystem writers remain trusted.