296- `thread/start` - create a new thread; emits `thread/started` and automatically subscribes you to turn/item events for that thread.296- `thread/start` - create a new thread; emits `thread/started` and automatically subscribes you to turn/item events for that thread.
297- `thread/resume` - reopen an existing thread by id so later `turn/start` calls append to it.297- `thread/resume` - reopen an existing thread by id so later `turn/start` calls append to it.
298- `thread/fork` - fork a thread into a new thread id by copying stored history. Pass `lastTurnId` to copy history through that turn and omit later turns, or `ephemeral: true` to create an in-memory fork. Emits `thread/started` for the new thread; returned threads include `forkedFromId` when available.298- `thread/fork` - fork a thread into a new thread id by copying stored history. Pass `lastTurnId` to copy history through that turn and omit later turns, or `ephemeral: true` to create an in-memory fork. Emits `thread/started` for the new thread; returned threads include `forkedFromId` when available.
299- `thread/read` - read a stored thread by id without resuming it; set `includeTurns` to return full turn history. Returned `thread` objects include runtime `status`.299- `thread/read` - read stored thread metadata by id without resuming it. Use `thread/turns/list` and `thread/items/list` to load history. Returned `thread` objects include runtime `status`.
300- `thread/list` - page through stored thread logs; supports cursor-based pagination plus `modelProviders`, `sourceKinds`, `archived`, `isPinned`, `cwd`, `useStateDbOnly`, `searchTerm`, and experimental `parentThreadId` or `ancestorThreadId` filters. Returned `thread` objects include runtime `status`.300- `thread/list` - page through stored thread logs; supports cursor-based pagination plus `modelProviders`, `sourceKinds`, `archived`, `isPinned`, `cwd`, `useStateDbOnly`, `searchTerm`, and experimental `parentThreadId` or `ancestorThreadId` filters. Returned `thread` objects include runtime `status`.
301- `thread/turns/list` - experimental; page through a stored thread's turn history without resuming it. `itemsView` controls whether turn items are omitted, summarized, or fully loaded.301- `thread/turns/list` - page through a stored thread's turn history without resuming it. `itemsView` controls whether turn items are omitted, summarized, or fully loaded.
302- `thread/items/list` - experimental; page through persisted thread items, optionally restricted to one `turnId`. The active thread store must support item pagination.302- `thread/items/list` - page through persisted thread items, optionally restricted to one `turnId`. The active thread store must support item pagination.
303- `thread/loaded/list` - list the thread ids currently loaded in memory.303- `thread/loaded/list` - list the thread ids currently loaded in memory.
304- `thread/name/set` - set or update a thread's user-facing name for a loaded thread or a persisted rollout; emits `thread/name/updated`.304- `thread/name/set` - set or update a thread's user-facing name for a loaded thread or a persisted rollout; emits `thread/name/updated`.
305- `thread/goal/set` - set the goal for a thread; emits `thread/goal/updated`.305- `thread/goal/set` - set the goal for a thread; emits `thread/goal/updated`.
316- `thread/backgroundTerminals/clean` - stop all running background terminals for a thread (experimental; requires `capabilities.experimentalApi`).316- `thread/backgroundTerminals/clean` - stop all running background terminals for a thread (experimental; requires `capabilities.experimentalApi`).
317- `thread/backgroundTerminals/list` - list running background terminals for a loaded thread (experimental; requires `capabilities.experimentalApi`).317- `thread/backgroundTerminals/list` - list running background terminals for a loaded thread (experimental; requires `capabilities.experimentalApi`).
318- `thread/backgroundTerminals/terminate` - terminate one running background terminal by app-server `processId` (experimental; requires `capabilities.experimentalApi`).318- `thread/backgroundTerminals/terminate` - terminate one running background terminal by app-server `processId` (experimental; requires `capabilities.experimentalApi`).
319- `thread/rollback` - deprecated; drop the last N turns from the in-memory context and persist a rollback marker; returns the updated `thread`.319- `thread/revert` - remove a specified turn and every later turn from a persistent paginated thread's history; returns updated metadata and history cursors, then emits `thread/reverted`.
320- `turn/start` - add user input or standalone tool output to a thread and begin Codex generation; responds with the initial `turn` and streams events. For `collaborationMode`, `settings.developer_instructions: null` means "use built-in instructions for the selected mode."320- `turn/start` - add user input or standalone tool output to a thread and begin Codex generation; responds with the initial `turn` and streams events. For `collaborationMode`, `settings.developer_instructions: null` means "use built-in instructions for the selected mode."
321- `thread/inject_items` - append raw Responses API items to a loaded thread's model-visible history without starting a user turn.321- `thread/inject_items` - append raw Responses API items to a loaded thread's model-visible history without starting a user turn.
322- `turn/steer` - append user input to the active in-flight turn for a thread; returns the accepted `turnId`.322- `turn/steer` - append user input to the active in-flight turn for a thread; returns the accepted `turnId`.
360- `mcpServer/elicitation/request` (server request) - ask the client for structured form input or confirmation of a URL flow requested by an MCP server.360- `mcpServer/elicitation/request` (server request) - ask the client for structured form input or confirmation of a URL flow requested by an MCP server.
361- `item/permissions/requestApproval` (server request) - ask the client to grant a subset of network or filesystem permissions requested by the built-in `request_permissions` tool.361- `item/permissions/requestApproval` (server request) - ask the client to grant a subset of network or filesystem permissions requested by the built-in `request_permissions` tool.
362- `config/mcpServer/reload` - reload MCP server configuration from disk and queue a refresh for loaded threads.362- `config/mcpServer/reload` - reload MCP server configuration from disk and queue a refresh for loaded threads.
363- `mcpServerStatus/list` - list MCP servers, tools, resources, and auth status (cursor + limit pagination). Use `detail: "full"` for full data or `detail: "toolsAndAuthOnly"` to omit resources.363- `mcpServerStatus/list` - list MCP servers, tools, resources, and auth status (cursor + limit pagination). Use `detail: "full"` for full data or `detail: "toolsAndAuthOnly"` to omit resources. Pass `serverName` to discover one server; with `threadId`, the request reuses that thread's MCP connection.
364- `mcpServer/resource/read` - read a single MCP resource through an initialized MCP server.364- `mcpServer/resource/read` - read a single MCP resource through an initialized MCP server.
365- `mcpServer/tool/call` - call a tool on a thread's configured MCP server.365- `mcpServer/tool/call` - call a tool on a thread's configured MCP server.
366- `mcpServer/startupStatus/updated` (notify) - emitted when a configured MCP server's startup status changes for a loaded thread.366- `mcpServer/startupStatus/updated` (notify) - emitted when a configured MCP server's startup status changes for a loaded thread.
408 "description": "Balances speed and reasoning depth for everyday tasks"408 "description": "Balances speed and reasoning depth for everyday tasks"
409 }],409 }],
410 "inputModalities": ["text", "image"],410 "inputModalities": ["text", "image"],
411 "supportsPersonality": true,411 "supportsPersonality": false,
412 "isDefault": true412 "isDefault": true
413 }],413 }],
414 "nextCursor": null414 "nextCursor": null
423- `upgradeInfo` - optional upgrade metadata for migration prompts in clients.423- `upgradeInfo` - optional upgrade metadata for migration prompts in clients.
424- `hidden` - whether the model is hidden from the default picker list.424- `hidden` - whether the model is hidden from the default picker list.
425- `inputModalities` - supported input types for the model (for example `text`, `image`).425- `inputModalities` - supported input types for the model (for example `text`, `image`).
426- `supportsPersonality` - whether the model supports personality-specific instructions such as `/personality`.426- `supportsPersonality` - deprecated compatibility field; always `false`. Models no longer support personality selection.
427- `isDefault` - whether the model is the recommended default.427- `isDefault` - whether the model is the recommended default.
428 428
429By default, `model/list` returns picker-visible models only. Set `includeHidden: true` if you need the full list and want to filter on the client side using `hidden`.429By default, `model/list` returns picker-visible models only. Set `includeHidden: true` if you need the full list and want to filter on the client side using `hidden`.
471 471
472## Threads472## Threads
473 473
474- `thread/read` reads a stored thread without subscribing to it; set `includeTurns` to include turns.474- `thread/read` reads stored thread metadata without subscribing to it.
475- `thread/turns/list` is experimental and pages through a stored thread's turn history without475- `thread/turns/list` pages through a stored thread's turn history without
476 resuming it. Use `itemsView` to choose whether turn items are omitted,476 resuming it. Use `itemsView` to choose whether turn items are omitted,
477 summarized, or fully loaded.477 summarized, or fully loaded.
478- `thread/items/list` is experimental and pages through persisted thread items, optionally restricted to one turn.478- `thread/items/list` pages through persisted thread items, optionally restricted to one turn.
479- `thread/list` supports cursor pagination plus `modelProviders`, `sourceKinds`, `archived`, `isPinned`, `cwd`, `useStateDbOnly`, `searchTerm`, and experimental `parentThreadId` or `ancestorThreadId` filtering.479- `thread/list` supports cursor pagination plus `modelProviders`, `sourceKinds`, `archived`, `isPinned`, `cwd`, `useStateDbOnly`, `searchTerm`, and experimental `parentThreadId` or `ancestorThreadId` filtering.
480- `thread/loaded/list` returns the thread IDs currently in memory.480- `thread/loaded/list` returns the thread IDs currently in memory.
481- `thread/archive` moves the thread's persisted JSONL log into the archived directory and attempts to archive spawned descendant thread logs that aren't already archived.481- `thread/archive` moves the thread's persisted JSONL log into the archived directory and attempts to archive spawned descendant thread logs that aren't already archived.
484- `thread/unsubscribe` unsubscribes the current connection from a loaded thread and can trigger `thread/closed` after an inactivity grace period.484- `thread/unsubscribe` unsubscribes the current connection from a loaded thread and can trigger `thread/closed` after an inactivity grace period.
485- `thread/unarchive` restores an archived thread rollout back into the active sessions directory.485- `thread/unarchive` restores an archived thread rollout back into the active sessions directory.
486- `thread/compact/start` triggers compaction and returns `{}` immediately.486- `thread/compact/start` triggers compaction and returns `{}` immediately.
487- `thread/rollback` is deprecated. It drops the last N turns from the in-memory context and records a rollback marker in the thread's persisted JSONL log.487- `thread/revert` removes a specified turn and every later turn from a persistent paginated thread's history. It doesn't change local files.
488- `thread/inject_items` appends raw Responses API items to a loaded thread's model-visible history without starting a user turn.488- `thread/inject_items` appends raw Responses API items to a loaded thread's model-visible history without starting a user turn.
489 489
490### Start or resume a thread490### Start or resume a thread
497 "cwd": "/Users/me/project",497 "cwd": "/Users/me/project",
498 "approvalPolicy": "never",498 "approvalPolicy": "never",
499 "sandbox": "workspaceWrite",499 "sandbox": "workspaceWrite",
500 "personality": "friendly",
501 "serviceName": "my_app_server_client"500 "serviceName": "my_app_server_client"
502} }501} }
503{ "id": 10, "result": {502{ "id": 10, "result": {
521its source environment's native absolute syntax, including for remote520its source environment's native absolute syntax, including for remote
522environments.521environments.
523 522
524Experimental clients can set `historyMode` on `thread/start` to `"legacy"`523New persistent local threads use paginated history by default. Load history
525(the default) or `"paginated"`. Paginated thread creation isn't supported yet524with `thread/turns/list` and `thread/items/list`. Explicitly setting
526and returns JSON-RPC error `-32601`. App-server can list and read summaries for525`historyMode` to `"legacy"` or `"paginated"` on `thread/start` is
527existing paginated records, but full-history reads, turn pagination, and resume526experimental and requires `capabilities.experimentalApi = true`.
528fail closed until paginated history is supported.
529 527
530Beta clients that opt into `capabilities.experimentalApi` can pass a named528Beta clients that opt into `capabilities.experimentalApi` can pass a named
531permission-profile id in `permissions` instead of the legacy `sandbox` field.529permission-profile id in `permissions` instead of the legacy `sandbox` field.
538of the root they came from. Clients should read the session id from536of the root they came from. Clients should read the session id from
539`thread.sessionId` instead of deriving it from the thread id.537`thread.sessionId` instead of deriving it from the thread id.
540 538
541To continue a stored session, call `thread/resume` with the `thread.id` you recorded earlier. The response shape matches `thread/start`. You can also pass the same configuration overrides supported by `thread/start`, such as `personality`:539To continue a stored session, call `thread/resume` with the `thread.id` you recorded earlier. Pass `excludeTurns: true` to return thread metadata and live session state, then load history with the pagination methods:
542 540
543```json541```json
544{ "method": "thread/resume", "id": 11, "params": {542{ "method": "thread/resume", "id": 11, "params": {
545 "threadId": "thr_123",543 "threadId": "thr_123",
546 "personality": "friendly"544 "excludeTurns": true
547} }545} }
548{ "id": 11, "result": { "thread": { "id": "thr_123", "name": "Bug bash notes", "ephemeral": false } } }546{ "id": 11, "result": { "thread": { "id": "thr_123", "name": "Bug bash notes", "ephemeral": false } } }
549```547```
550 548
549For paginated threads, full-history responses from `thread/resume` and
550`thread/fork` are deprecated and emit `deprecationNotice`. Both methods accept
551`excludeTurns: true` without the experimental API opt-in. A `thread/resume` response
552can also return `turnsBackwardsCursor` and `itemsBackwardsCursor`. Pass each to
553its matching pagination method with `sortDirection: "desc"`; the first page
554includes the cursor's anchor.
555
551Resuming a thread doesn't update `thread.updatedAt` (or the rollout file's modified time) by itself. The timestamp updates when you start a turn.556Resuming a thread doesn't update `thread.updatedAt` (or the rollout file's modified time) by itself. The timestamp updates when you start a turn.
552 557
553If you mark an enabled MCP server as `required` in config and that server fails to initialize, `thread/start` and `thread/resume` fail instead of continuing without it.558If you mark an enabled MCP server as `required` in config and that server fails to initialize, `thread/start` and `thread/resume` fail instead of continuing without it.
599turns:604turns:
600 605
601```json606```json
602{ "method": "thread/fork", "id": 12, "params": { "threadId": "thr_123", "lastTurnId": "turn_456" } }607{ "method": "thread/fork", "id": 12, "params": { "threadId": "thr_123", "lastTurnId": "turn_456", "excludeTurns": true } }
603{ "id": 12, "result": { "thread": { "id": "thr_456", "sessionId": "thr_123", "forkedFromId": "thr_123" } } }608{ "id": 12, "result": { "thread": { "id": "thr_456", "sessionId": "thr_123", "forkedFromId": "thr_123" } } }
604{ "method": "thread/started", "params": { "thread": { "id": "thr_456" } } }609{ "method": "thread/started", "params": { "thread": { "id": "thr_456" } } }
605```610```
617 "id": 13,622 "id": 13,
618 "params": {623 "params": {
619 "threadId": "thr_123",624 "threadId": "thr_123",
620 "ephemeral": true625 "ephemeral": true,
626 "excludeTurns": true
621 }627 }
622}628}
623{629{
633}639}
634```640```
635 641
636Ephemeral forks of paginated threads also require `excludeTurns: true`. That642Ephemeral forks of paginated threads require `excludeTurns: true`.
637field is experimental and requires `capabilities.experimentalApi = true`.
638 643
639When a user-facing thread title has been set, app-server hydrates `thread.name` on `thread/list`, `thread/read`, `thread/resume`, `thread/unarchive`, and `thread/rollback` responses. `thread/start` and `thread/fork` may omit `name` (or return `null`) until a title is set later.644When a user-facing thread title has been set, app-server hydrates `thread.name` on `thread/list`, `thread/read`, `thread/resume`, and `thread/unarchive` responses. `thread/start` and `thread/fork` may omit `name` (or return `null`) until a title is set later.
640 645
641### Read a stored thread (without resuming)646### Read a stored thread (without resuming)
642 647
643Use `thread/read` when you want stored thread data but don't want to resume the thread or subscribe to its events.648Use `thread/read` when you want stored thread data but don't want to resume the thread or subscribe to its events.
644 649
645- `includeTurns` - when `true`, the response includes the thread's turns; when `false` or omitted, you get the thread summary only.650- `includeTurns` - when `false` or omitted, returns the thread summary only. Setting it to `true` loads full history, which is deprecated for paginated threads and emits `deprecationNotice`. Use the pagination methods instead.
646- Returned `thread` objects include runtime `status` (`notLoaded`, `idle`, `systemError`, or `active` with `activeFlags`).651- Returned `thread` objects include runtime `status` (`notLoaded`, `idle`, `systemError`, or `active` with `activeFlags`).
647 652
648```json653```json
649{ "method": "thread/read", "id": 19, "params": { "threadId": "thr_123", "includeTurns": true } }654{ "method": "thread/read", "id": 19, "params": { "threadId": "thr_123" } }
650{ "id": 19, "result": { "thread": { "id": "thr_123", "name": "Bug bash notes", "ephemeral": false, "status": { "type": "notLoaded" }, "turns": [] } } }655{ "id": 19, "result": { "thread": { "id": "thr_123", "name": "Bug bash notes", "ephemeral": false, "status": { "type": "notLoaded" }, "turns": [] } } }
651```656```
652 657
654 659
655### List thread turns660### List thread turns
656 661
657`thread/turns/list` is experimental. Use it to page a stored thread's turn history without resuming it. Results default to newest-first so clients can fetch older turns with `nextCursor`. The response also includes `backwardsCursor`; pass it as `cursor` with `sortDirection: "asc"` to fetch turns newer than the first item from the earlier page.662Use `thread/turns/list` to page a stored thread's turn history without resuming it. Results default to newest-first so clients can fetch older turns with `nextCursor`. The response also includes `backwardsCursor`; pass it as `cursor` with the opposite `sortDirection` to reverse direction. This includes the anchor turn again so you can catch updates to it.
658 663
659`itemsView` controls how much turn-item data the response includes:664`itemsView` controls how much turn-item data the response includes:
660 665
676} }681} }
677```682```
678 683
679`thread/items/list` is also experimental. It pages persisted items without684### List thread items
685
686`thread/items/list` pages persisted items without
680resuming the thread. Pass `turnId` to restrict results to one turn, or omit it687resuming the thread. Pass `turnId` to restrict results to one turn, or omit it
681to page items across the thread. The active thread store must support item688to page items across the thread. Results default to oldest-first
682pagination; otherwise, the server returns an unsupported-method error.689(`sortDirection: "asc"`). The active thread store must support item pagination;
690otherwise, the server returns an unsupported-method error.
691
692Pass an opaque `nextCursor` from a previous response to continue paging. To
693start after a known item, pass an item anchor and a non-empty `turnId`:
694
695```json
696{ "method": "thread/items/list", "id": 21, "params": {
697 "threadId": "thr_123",
698 "turnId": "turn_456",
699 "cursor": { "type": "item", "itemId": "item_123" },
700 "sortDirection": "asc",
701 "limit": 50
702} }
703{ "id": 21, "result": {
704 "data": [],
705 "nextCursor": null,
706 "backwardsCursor": null
707} }
708```
709
710Item anchors exclude the anchor itself: ascending order returns newer items,
711and descending order returns older items. The item must belong to the
712requested turn's visible history. Missing `turnId`, an empty item ID, or an
713unknown or out-of-scope item returns invalid params (`-32602`). Continue with
714the returned string `nextCursor`. Each result entry contains `turnId`, `item`,
715and optional recorded start and completion timestamps.
683 716
684### List threads (with pagination & filters)717### List threads (with pagination & filters)
685 718
904{ "id": 29, "result": { "terminated": true } }937{ "id": 29, "result": { "terminated": true } }
905```938```
906 939
907### Roll back recent turns940### Revert thread history
908 941
909`thread/rollback` is deprecated and will be removed. It removes the last942Use `thread/revert` to remove `beforeTurnId` and every later turn from a
910`numTurns` entries from the in-memory context and persists a rollback marker in943persistent paginated thread's conversation history. It doesn't revert local
911the rollout log. The returned `thread` includes `turns` populated after the944file changes. Resume the thread first if it isn't loaded. Ephemeral threads
912rollback.945and threads with legacy history aren't supported.
913 946
914```json947```json
915{ "method": "thread/rollback", "id": 30, "params": { "threadId": "thr_b", "numTurns": 1 } }948{ "method": "thread/revert", "id": 30, "params": { "threadId": "thr_b", "beforeTurnId": "turn_456" } }
916{ "id": 30, "result": { "thread": { "id": "thr_b", "name": "Bug bash notes", "ephemeral": false } } }949{ "id": 30, "result": {
950 "thread": { "id": "thr_b", "ephemeral": false, "turns": [] },
951 "turnsBackwardsCursor": "retained-turn-cursor-or-null",
952 "itemsBackwardsCursor": "retained-item-cursor-or-null"
953} }
954{ "method": "thread/reverted", "params": { "threadId": "thr_b" } }
917```955```
918 956
957The returned `thread.turns` is always empty. Use the returned cursors with
958`thread/turns/list` or `thread/items/list` and `sortDirection: "desc"` to load
959retained history, including the cursor's anchor.
960
961`thread/rollback` has been removed and returns an unknown-method error.
962Existing rollback markers in older saved threads remain readable.
963
919## Turns964## Turns
920 965
921The `input` field accepts a list of items:966The `input` field accepts a list of items:
924- `{ "type": "image", "url": "https://.../design.png" }`969- `{ "type": "image", "url": "https://.../design.png" }`
925- `{ "type": "localImage", "path": "/tmp/screenshot.png" }`970- `{ "type": "localImage", "path": "/tmp/screenshot.png" }`
926 971
927You can override configuration settings per turn (model, effort, personality, `cwd`, sandbox policy, summary). When specified, these settings become the defaults for later turns on the same thread. `outputSchema` applies only to the current turn. For `sandboxPolicy.type = "externalSandbox"`, set `networkAccess` to `restricted` or `enabled`; for `workspaceWrite`, `networkAccess` remains a boolean.972You can override configuration settings per turn (model, effort, `cwd`, sandbox policy, summary). When specified, these settings become the defaults for later turns on the same thread. `outputSchema` applies only to the current turn. For `sandboxPolicy.type = "externalSandbox"`, set `networkAccess` to `restricted` or `enabled`; for `workspaceWrite`, `networkAccess` remains a boolean.
928 973
929For `turn/start.collaborationMode`, `settings.developer_instructions: null` means "use built-in instructions for the selected mode" rather than clearing mode instructions.974For `turn/start.collaborationMode`, `settings.developer_instructions: null` means "use built-in instructions for the selected mode" rather than clearing mode instructions.
930 975
1088- `commit` (review a specific commit)1133- `commit` (review a specific commit)
1089- `custom` (free-form instructions)1134- `custom` (free-form instructions)
1090 1135
1091Use `delivery: "inline"` (default) to run the review on the existing thread, or `delivery: "detached"` to fork a new review thread.1136Use `delivery: "inline"` (default) to run the review on the existing thread.
1137For a separate review thread, call `thread/start` and then run an inline
1138review on the new thread.
1092 1139
1093Example request/response:1140Example request/response:
1094 1141
1111} }1158} }
1112```1159```
1113 1160
1114For a detached review, use `"delivery": "detached"`. The response is the same shape, but `reviewThreadId` will be the id of the new review thread (different from the original `threadId`). The server also emits a `thread/started` notification for that new thread before streaming the review turn.1161`delivery: "detached"` is deprecated, emits `deprecationNotice`, and isn't
1162supported for paginated parent threads. If a separate review needs the
1163existing conversation history, use `thread/fork` followed by `turn/start`
1164with your review instructions.
1115 1165
1116Codex streams the usual `turn/started` notification followed by an `item/started` with an `enteredReviewMode` item:1166Codex streams the usual `turn/started` notification followed by an `item/started` with an `enteredReviewMode` item:
1117 1167
1325 1375
1326- `userMessage` - `{id, content}` where `content` is a list of user inputs (`text`, `image`, or `localImage`).1376- `userMessage` - `{id, content}` where `content` is a list of user inputs (`text`, `image`, or `localImage`).
1327- `functionCallOutput` - `{id, name, namespace, output}` for standalone tool output supplied through `turn/start.toolOutput`. `namespace` can be `null`.1377- `functionCallOutput` - `{id, name, namespace, output}` for standalone tool output supplied through `turn/start.toolOutput`. `namespace` can be `null`.
1328- `agentMessage` - `{id, text, phase?}` containing the accumulated agent reply. When present, `phase` uses Responses API wire values (`commentary`, `final_answer`).1378- `agentMessage` - `{id, text, phase?}` containing the accumulated agent reply. When present, `phase` uses Responses API wire values (`commentary`, `partial_answer`, `final_answer`). A `partial_answer` is stable answer text that may be followed by more output or tools.
1329- `plan` - `{id, text}` containing proposed plan text in plan mode. Treat the final `plan` item from `item/completed` as authoritative.1379- `plan` - `{id, text}` containing proposed plan text in plan mode. Treat the final `plan` item from `item/completed` as authoritative.
1330- `reasoning` - `{id, summary, content}` where `summary` holds streamed reasoning summaries and `content` holds raw reasoning blocks.1380- `reasoning` - `{id, summary, content}` where `summary` holds streamed reasoning summaries and `content` holds raw reasoning blocks.
1331- `commandExecution` - `{id, command, cwd, status, commandActions, aggregatedOutput?, exitCode?, durationMs?}`.1381- `commandExecution` - `{id, command, cwd, status, commandActions, aggregatedOutput?, exitCode?, durationMs?}`.