Compare commits

...

1 Commits

Author SHA1 Message Date
Owen Lin
0303b871be feat(app-server): API proposal for better thread loading performance 2026-05-05 14:48:45 -07:00
52 changed files with 5070 additions and 113 deletions

View File

@@ -1478,6 +1478,24 @@
],
"type": "object"
},
"LargeContentMode": {
"oneOf": [
{
"description": "Preserve legacy behavior and embed large payloads directly in returned ThreadItems.",
"enum": [
"inline"
],
"type": "string"
},
{
"description": "Return metadata placeholders for large payloads and fetch bytes through `thread/item/content/read`.",
"enum": [
"deferred"
],
"type": "string"
}
]
},
"ListMcpServerStatusParams": {
"properties": {
"cursor": {
@@ -3516,6 +3534,17 @@
"ephemeral": {
"type": "boolean"
},
"largeContent": {
"anyOf": [
{
"$ref": "#/definitions/LargeContentMode"
},
{
"type": "null"
}
],
"description": "Controls whether large item payloads, such as generated image bytes, are embedded in returned ThreadItems or replaced with deferred content references.\n\nDefaults to `inline` for compatibility. New clients that may load large histories should prefer `deferred` and fetch bytes on demand with `thread/item/content/read`."
},
"model": {
"description": "Configuration overrides for the forked thread, if any.",
"type": [
@@ -3591,6 +3620,84 @@
],
"type": "object"
},
"ThreadItemContentReadParams": {
"properties": {
"contentId": {
"description": "Opaque content identifier returned from a deferred item content placeholder.",
"type": "string"
},
"itemId": {
"type": "string"
},
"threadId": {
"type": "string"
},
"turnId": {
"type": "string"
}
},
"required": [
"contentId",
"itemId",
"threadId",
"turnId"
],
"type": "object"
},
"ThreadItemsListParams": {
"properties": {
"cursor": {
"description": "Opaque cursor to pass to the next call to continue after the last item.",
"type": [
"string",
"null"
]
},
"largeContent": {
"anyOf": [
{
"$ref": "#/definitions/LargeContentMode"
},
{
"type": "null"
}
],
"description": "Controls whether large item payloads, such as generated image bytes, are embedded in returned ThreadItems or replaced with deferred content references.\n\nDefaults to `inline` for compatibility. New clients should prefer `deferred`."
},
"limit": {
"description": "Optional item page size.",
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"sortDirection": {
"anyOf": [
{
"$ref": "#/definitions/SortDirection"
},
{
"type": "null"
}
],
"description": "Optional item pagination direction; defaults to ascending."
},
"threadId": {
"type": "string"
},
"turnId": {
"description": "Turn to hydrate after receiving a summary Turn from `thread/turns/list`.",
"type": "string"
}
},
"required": [
"threadId",
"turnId"
],
"type": "object"
},
"ThreadListCwdFilter": {
"anyOf": [
{
@@ -3776,9 +3883,20 @@
"properties": {
"includeTurns": {
"default": false,
"description": "When true, include turns and their items from rollout history.",
"description": "When true, include the traditional fully hydrated thread history: `thread.turns` is populated and each returned Turn has `itemsView: \"full\"`.\n\nWhen false, `thread/read` returns metadata only. Clients can page history separately with `thread/turns/list`, then hydrate individual summary turns with `thread/items/list`.",
"type": "boolean"
},
"largeContent": {
"anyOf": [
{
"$ref": "#/definitions/LargeContentMode"
},
{
"type": "null"
}
],
"description": "Controls whether large item payloads, such as generated image bytes, are embedded in returned ThreadItems or replaced with deferred content references.\n\nDefaults to `inline` for compatibility. New clients that may load large histories should prefer `deferred` and fetch bytes on demand with `thread/item/content/read`."
},
"threadId": {
"type": "string"
}
@@ -3917,6 +4035,17 @@
"null"
]
},
"largeContent": {
"anyOf": [
{
"$ref": "#/definitions/LargeContentMode"
},
{
"type": "null"
}
],
"description": "Controls whether large item payloads, such as generated image bytes, are embedded in returned ThreadItems or replaced with deferred content references.\n\nDefaults to `inline` for compatibility. New clients that may load large histories should prefer `deferred` and fetch bytes on demand with `thread/item/content/read`."
},
"model": {
"description": "Configuration overrides for the resumed thread, if any.",
"type": [
@@ -4906,6 +5035,54 @@
"title": "Thread/readRequest",
"type": "object"
},
{
"properties": {
"id": {
"$ref": "#/definitions/RequestId"
},
"method": {
"enum": [
"thread/items/list"
],
"title": "Thread/items/listRequestMethod",
"type": "string"
},
"params": {
"$ref": "#/definitions/ThreadItemsListParams"
}
},
"required": [
"id",
"method",
"params"
],
"title": "Thread/items/listRequest",
"type": "object"
},
{
"properties": {
"id": {
"$ref": "#/definitions/RequestId"
},
"method": {
"enum": [
"thread/item/content/read"
],
"title": "Thread/item/content/readRequestMethod",
"type": "string"
},
"params": {
"$ref": "#/definitions/ThreadItemContentReadParams"
}
},
"required": [
"id",
"method",
"params"
],
"title": "Thread/item/content/readRequest",
"type": "object"
},
{
"description": "Append raw Responses API items to the thread history without starting a user turn.",
"properties": {

View File

@@ -1930,6 +1930,115 @@
],
"type": "object"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"ItemCompletedNotification": {
"properties": {
"completedAtMs": {
@@ -3783,10 +3892,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -3817,6 +3935,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -4312,7 +4431,7 @@
"type": "string"
},
"items": {
"description": "Thread items currently included in this turn payload.",
"description": "Turn items at the level of detail described by `itemsView`.",
"items": {
"$ref": "#/definitions/ThreadItem"
},
@@ -4325,7 +4444,7 @@
}
],
"default": "full",
"description": "Describes how much of `items` has been loaded for this turn."
"description": "Indicates how much of this Turn's item history is present in `items`."
},
"startedAt": {
"description": "Unix timestamp (in seconds) when the turn started.",
@@ -4412,21 +4531,21 @@
"TurnItemsView": {
"oneOf": [
{
"description": "`items` was not loaded for this turn. The field is intentionally empty.",
"description": "`items` was not loaded for this Turn. The field is intentionally empty.",
"enum": [
"notLoaded"
],
"type": "string"
},
{
"description": "`items` contains only a display summary for this turn.",
"description": "`items` contains only a display summary for this Turn.\n\nFor `thread/turns/list`, this currently means the first user message and the final assistant message when those items are available.",
"enum": [
"summary"
],
"type": "string"
},
{
"description": "`items` contains every ThreadItem available from persisted app-server history for this turn.",
"description": "`items` contains every ThreadItem available from persisted app-server history for this Turn.",
"enum": [
"full"
],
@@ -6074,4 +6193,4 @@
}
],
"title": "ServerNotification"
}
}

View File

@@ -569,6 +569,54 @@
"title": "Thread/readRequest",
"type": "object"
},
{
"properties": {
"id": {
"$ref": "#/definitions/v2/RequestId"
},
"method": {
"enum": [
"thread/items/list"
],
"title": "Thread/items/listRequestMethod",
"type": "string"
},
"params": {
"$ref": "#/definitions/v2/ThreadItemsListParams"
}
},
"required": [
"id",
"method",
"params"
],
"title": "Thread/items/listRequest",
"type": "object"
},
{
"properties": {
"id": {
"$ref": "#/definitions/v2/RequestId"
},
"method": {
"enum": [
"thread/item/content/read"
],
"title": "Thread/item/content/readRequestMethod",
"type": "string"
},
"params": {
"$ref": "#/definitions/v2/ThreadItemContentReadParams"
}
},
"required": [
"id",
"method",
"params"
],
"title": "Thread/item/content/readRequest",
"type": "object"
},
{
"description": "Append raw Responses API items to the thread history without starting a user turn.",
"properties": {
@@ -10169,6 +10217,115 @@
],
"type": "string"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"InputModality": {
"description": "Canonical user-input modality tags advertised by a model.",
"oneOf": [
@@ -10322,6 +10479,24 @@
"title": "ItemStartedNotification",
"type": "object"
},
"LargeContentMode": {
"oneOf": [
{
"description": "Preserve legacy behavior and embed large payloads directly in returned ThreadItems.",
"enum": [
"inline"
],
"type": "string"
},
{
"description": "Return metadata placeholders for large payloads and fetch bytes through `thread/item/content/read`.",
"enum": [
"deferred"
],
"type": "string"
}
]
},
"ListMcpServerStatusParams": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
@@ -15397,6 +15572,17 @@
"ephemeral": {
"type": "boolean"
},
"largeContent": {
"anyOf": [
{
"$ref": "#/definitions/v2/LargeContentMode"
},
{
"type": "null"
}
],
"description": "Controls whether large item payloads, such as generated image bytes, are embedded in returned ThreadItems or replaced with deferred content references.\n\nDefaults to `inline` for compatibility. New clients that may load large histories should prefer `deferred` and fetch bytes on demand with `thread/item/content/read`."
},
"model": {
"description": "Configuration overrides for the forked thread, if any.",
"type": [
@@ -16188,10 +16374,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/v2/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -16222,6 +16417,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -16300,6 +16496,148 @@
}
]
},
"ThreadItemContentReadParams": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"contentId": {
"description": "Opaque content identifier returned from a deferred item content placeholder.",
"type": "string"
},
"itemId": {
"type": "string"
},
"threadId": {
"type": "string"
},
"turnId": {
"type": "string"
}
},
"required": [
"contentId",
"itemId",
"threadId",
"turnId"
],
"title": "ThreadItemContentReadParams",
"type": "object"
},
"ThreadItemContentReadResponse": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"byteLength": {
"description": "Decoded byte length when known.",
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"description": "Base64-encoded content bytes.",
"type": "string"
},
"mimeType": {
"description": "Media type of the returned content when known.",
"type": [
"string",
"null"
]
}
},
"required": [
"dataBase64"
],
"title": "ThreadItemContentReadResponse",
"type": "object"
},
"ThreadItemsListParams": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"cursor": {
"description": "Opaque cursor to pass to the next call to continue after the last item.",
"type": [
"string",
"null"
]
},
"largeContent": {
"anyOf": [
{
"$ref": "#/definitions/v2/LargeContentMode"
},
{
"type": "null"
}
],
"description": "Controls whether large item payloads, such as generated image bytes, are embedded in returned ThreadItems or replaced with deferred content references.\n\nDefaults to `inline` for compatibility. New clients should prefer `deferred`."
},
"limit": {
"description": "Optional item page size.",
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"sortDirection": {
"anyOf": [
{
"$ref": "#/definitions/v2/SortDirection"
},
{
"type": "null"
}
],
"description": "Optional item pagination direction; defaults to ascending."
},
"threadId": {
"type": "string"
},
"turnId": {
"description": "Turn to hydrate after receiving a summary Turn from `thread/turns/list`.",
"type": "string"
}
},
"required": [
"threadId",
"turnId"
],
"title": "ThreadItemsListParams",
"type": "object"
},
"ThreadItemsListResponse": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"backwardsCursor": {
"description": "Opaque cursor to pass as `cursor` when reversing `sortDirection`. This is only populated when the page contains at least one item. Use it with the opposite `sortDirection` to include the anchor item again and catch updates to that item.",
"type": [
"string",
"null"
]
},
"data": {
"description": "Full ThreadItems for the requested turn page. Accumulate pages until `nextCursor` is null to hydrate the client-side Turn representation.",
"items": {
"$ref": "#/definitions/v2/ThreadItem"
},
"type": "array"
},
"nextCursor": {
"description": "Opaque cursor to pass to the next call to continue after the last item. if None, there are no more items to return.",
"type": [
"string",
"null"
]
}
},
"required": [
"data"
],
"title": "ThreadItemsListResponse",
"type": "object"
},
"ThreadListCwdFilter": {
"anyOf": [
{
@@ -16578,9 +16916,20 @@
"properties": {
"includeTurns": {
"default": false,
"description": "When true, include turns and their items from rollout history.",
"description": "When true, include the traditional fully hydrated thread history: `thread.turns` is populated and each returned Turn has `itemsView: \"full\"`.\n\nWhen false, `thread/read` returns metadata only. Clients can page history separately with `thread/turns/list`, then hydrate individual summary turns with `thread/items/list`.",
"type": "boolean"
},
"largeContent": {
"anyOf": [
{
"$ref": "#/definitions/v2/LargeContentMode"
},
{
"type": "null"
}
],
"description": "Controls whether large item payloads, such as generated image bytes, are embedded in returned ThreadItems or replaced with deferred content references.\n\nDefaults to `inline` for compatibility. New clients that may load large histories should prefer `deferred` and fetch bytes on demand with `thread/item/content/read`."
},
"threadId": {
"type": "string"
}
@@ -16894,6 +17243,17 @@
"null"
]
},
"largeContent": {
"anyOf": [
{
"$ref": "#/definitions/v2/LargeContentMode"
},
{
"type": "null"
}
],
"description": "Controls whether large item payloads, such as generated image bytes, are embedded in returned ThreadItems or replaced with deferred content references.\n\nDefaults to `inline` for compatibility. New clients that may load large histories should prefer `deferred` and fetch bytes on demand with `thread/item/content/read`."
},
"model": {
"description": "Configuration overrides for the resumed thread, if any.",
"type": [
@@ -17683,7 +18043,7 @@
"type": "string"
},
"items": {
"description": "Thread items currently included in this turn payload.",
"description": "Turn items at the level of detail described by `itemsView`.",
"items": {
"$ref": "#/definitions/v2/ThreadItem"
},
@@ -17696,7 +18056,7 @@
}
],
"default": "full",
"description": "Describes how much of `items` has been loaded for this turn."
"description": "Indicates how much of this Turn's item history is present in `items`."
},
"startedAt": {
"description": "Unix timestamp (in seconds) when the turn started.",
@@ -17824,21 +18184,21 @@
"TurnItemsView": {
"oneOf": [
{
"description": "`items` was not loaded for this turn. The field is intentionally empty.",
"description": "`items` was not loaded for this Turn. The field is intentionally empty.",
"enum": [
"notLoaded"
],
"type": "string"
},
{
"description": "`items` contains only a display summary for this turn.",
"description": "`items` contains only a display summary for this Turn.\n\nFor `thread/turns/list`, this currently means the first user message and the final assistant message when those items are available.",
"enum": [
"summary"
],
"type": "string"
},
{
"description": "`items` contains every ThreadItem available from persisted app-server history for this turn.",
"description": "`items` contains every ThreadItem available from persisted app-server history for this Turn.",
"enum": [
"full"
],
@@ -18553,4 +18913,4 @@
},
"title": "CodexAppServerProtocol",
"type": "object"
}
}

View File

@@ -1328,6 +1328,54 @@
"title": "Thread/readRequest",
"type": "object"
},
{
"properties": {
"id": {
"$ref": "#/definitions/RequestId"
},
"method": {
"enum": [
"thread/items/list"
],
"title": "Thread/items/listRequestMethod",
"type": "string"
},
"params": {
"$ref": "#/definitions/ThreadItemsListParams"
}
},
"required": [
"id",
"method",
"params"
],
"title": "Thread/items/listRequest",
"type": "object"
},
{
"properties": {
"id": {
"$ref": "#/definitions/RequestId"
},
"method": {
"enum": [
"thread/item/content/read"
],
"title": "Thread/item/content/readRequestMethod",
"type": "string"
},
"params": {
"$ref": "#/definitions/ThreadItemContentReadParams"
}
},
"required": [
"id",
"method",
"params"
],
"title": "Thread/item/content/readRequest",
"type": "object"
},
{
"description": "Append raw Responses API items to the thread history without starting a user turn.",
"properties": {
@@ -6736,6 +6784,115 @@
],
"type": "string"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"InitializeCapabilities": {
"description": "Client-declared capabilities negotiated during initialize.",
"properties": {
@@ -6933,6 +7090,24 @@
"title": "ItemStartedNotification",
"type": "object"
},
"LargeContentMode": {
"oneOf": [
{
"description": "Preserve legacy behavior and embed large payloads directly in returned ThreadItems.",
"enum": [
"inline"
],
"type": "string"
},
{
"description": "Return metadata placeholders for large payloads and fetch bytes through `thread/item/content/read`.",
"enum": [
"deferred"
],
"type": "string"
}
]
},
"ListMcpServerStatusParams": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
@@ -13283,6 +13458,17 @@
"ephemeral": {
"type": "boolean"
},
"largeContent": {
"anyOf": [
{
"$ref": "#/definitions/LargeContentMode"
},
{
"type": "null"
}
],
"description": "Controls whether large item payloads, such as generated image bytes, are embedded in returned ThreadItems or replaced with deferred content references.\n\nDefaults to `inline` for compatibility. New clients that may load large histories should prefer `deferred` and fetch bytes on demand with `thread/item/content/read`."
},
"model": {
"description": "Configuration overrides for the forked thread, if any.",
"type": [
@@ -14074,10 +14260,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -14108,6 +14303,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -14186,6 +14382,148 @@
}
]
},
"ThreadItemContentReadParams": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"contentId": {
"description": "Opaque content identifier returned from a deferred item content placeholder.",
"type": "string"
},
"itemId": {
"type": "string"
},
"threadId": {
"type": "string"
},
"turnId": {
"type": "string"
}
},
"required": [
"contentId",
"itemId",
"threadId",
"turnId"
],
"title": "ThreadItemContentReadParams",
"type": "object"
},
"ThreadItemContentReadResponse": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"byteLength": {
"description": "Decoded byte length when known.",
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"description": "Base64-encoded content bytes.",
"type": "string"
},
"mimeType": {
"description": "Media type of the returned content when known.",
"type": [
"string",
"null"
]
}
},
"required": [
"dataBase64"
],
"title": "ThreadItemContentReadResponse",
"type": "object"
},
"ThreadItemsListParams": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"cursor": {
"description": "Opaque cursor to pass to the next call to continue after the last item.",
"type": [
"string",
"null"
]
},
"largeContent": {
"anyOf": [
{
"$ref": "#/definitions/LargeContentMode"
},
{
"type": "null"
}
],
"description": "Controls whether large item payloads, such as generated image bytes, are embedded in returned ThreadItems or replaced with deferred content references.\n\nDefaults to `inline` for compatibility. New clients should prefer `deferred`."
},
"limit": {
"description": "Optional item page size.",
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"sortDirection": {
"anyOf": [
{
"$ref": "#/definitions/SortDirection"
},
{
"type": "null"
}
],
"description": "Optional item pagination direction; defaults to ascending."
},
"threadId": {
"type": "string"
},
"turnId": {
"description": "Turn to hydrate after receiving a summary Turn from `thread/turns/list`.",
"type": "string"
}
},
"required": [
"threadId",
"turnId"
],
"title": "ThreadItemsListParams",
"type": "object"
},
"ThreadItemsListResponse": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"backwardsCursor": {
"description": "Opaque cursor to pass as `cursor` when reversing `sortDirection`. This is only populated when the page contains at least one item. Use it with the opposite `sortDirection` to include the anchor item again and catch updates to that item.",
"type": [
"string",
"null"
]
},
"data": {
"description": "Full ThreadItems for the requested turn page. Accumulate pages until `nextCursor` is null to hydrate the client-side Turn representation.",
"items": {
"$ref": "#/definitions/ThreadItem"
},
"type": "array"
},
"nextCursor": {
"description": "Opaque cursor to pass to the next call to continue after the last item. if None, there are no more items to return.",
"type": [
"string",
"null"
]
}
},
"required": [
"data"
],
"title": "ThreadItemsListResponse",
"type": "object"
},
"ThreadListCwdFilter": {
"anyOf": [
{
@@ -14464,9 +14802,20 @@
"properties": {
"includeTurns": {
"default": false,
"description": "When true, include turns and their items from rollout history.",
"description": "When true, include the traditional fully hydrated thread history: `thread.turns` is populated and each returned Turn has `itemsView: \"full\"`.\n\nWhen false, `thread/read` returns metadata only. Clients can page history separately with `thread/turns/list`, then hydrate individual summary turns with `thread/items/list`.",
"type": "boolean"
},
"largeContent": {
"anyOf": [
{
"$ref": "#/definitions/LargeContentMode"
},
{
"type": "null"
}
],
"description": "Controls whether large item payloads, such as generated image bytes, are embedded in returned ThreadItems or replaced with deferred content references.\n\nDefaults to `inline` for compatibility. New clients that may load large histories should prefer `deferred` and fetch bytes on demand with `thread/item/content/read`."
},
"threadId": {
"type": "string"
}
@@ -14780,6 +15129,17 @@
"null"
]
},
"largeContent": {
"anyOf": [
{
"$ref": "#/definitions/LargeContentMode"
},
{
"type": "null"
}
],
"description": "Controls whether large item payloads, such as generated image bytes, are embedded in returned ThreadItems or replaced with deferred content references.\n\nDefaults to `inline` for compatibility. New clients that may load large histories should prefer `deferred` and fetch bytes on demand with `thread/item/content/read`."
},
"model": {
"description": "Configuration overrides for the resumed thread, if any.",
"type": [
@@ -15569,7 +15929,7 @@
"type": "string"
},
"items": {
"description": "Thread items currently included in this turn payload.",
"description": "Turn items at the level of detail described by `itemsView`.",
"items": {
"$ref": "#/definitions/ThreadItem"
},
@@ -15582,7 +15942,7 @@
}
],
"default": "full",
"description": "Describes how much of `items` has been loaded for this turn."
"description": "Indicates how much of this Turn's item history is present in `items`."
},
"startedAt": {
"description": "Unix timestamp (in seconds) when the turn started.",
@@ -15710,21 +16070,21 @@
"TurnItemsView": {
"oneOf": [
{
"description": "`items` was not loaded for this turn. The field is intentionally empty.",
"description": "`items` was not loaded for this Turn. The field is intentionally empty.",
"enum": [
"notLoaded"
],
"type": "string"
},
{
"description": "`items` contains only a display summary for this turn.",
"description": "`items` contains only a display summary for this Turn.\n\nFor `thread/turns/list`, this currently means the first user message and the final assistant message when those items are available.",
"enum": [
"summary"
],
"type": "string"
},
{
"description": "`items` contains every ThreadItem available from persisted app-server history for this turn.",
"description": "`items` contains every ThreadItem available from persisted app-server history for this Turn.",
"enum": [
"full"
],
@@ -16438,4 +16798,4 @@
},
"title": "CodexAppServerProtocolV2",
"type": "object"
}
}

View File

@@ -285,6 +285,115 @@
],
"type": "object"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"McpToolCallError": {
"properties": {
"message": {
@@ -1035,10 +1144,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -1069,6 +1187,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -1393,4 +1512,4 @@
],
"title": "ItemCompletedNotification",
"type": "object"
}
}

View File

@@ -285,6 +285,115 @@
],
"type": "object"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"McpToolCallError": {
"properties": {
"message": {
@@ -1035,10 +1144,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -1069,6 +1187,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -1393,4 +1512,4 @@
],
"title": "ItemStartedNotification",
"type": "object"
}
}

View File

@@ -422,6 +422,115 @@
],
"type": "object"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"McpToolCallError": {
"properties": {
"message": {
@@ -1179,10 +1288,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -1213,6 +1331,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -1324,7 +1443,7 @@
"type": "string"
},
"items": {
"description": "Thread items currently included in this turn payload.",
"description": "Turn items at the level of detail described by `itemsView`.",
"items": {
"$ref": "#/definitions/ThreadItem"
},
@@ -1337,7 +1456,7 @@
}
],
"default": "full",
"description": "Describes how much of `items` has been loaded for this turn."
"description": "Indicates how much of this Turn's item history is present in `items`."
},
"startedAt": {
"description": "Unix timestamp (in seconds) when the turn started.",
@@ -1389,21 +1508,21 @@
"TurnItemsView": {
"oneOf": [
{
"description": "`items` was not loaded for this turn. The field is intentionally empty.",
"description": "`items` was not loaded for this Turn. The field is intentionally empty.",
"enum": [
"notLoaded"
],
"type": "string"
},
{
"description": "`items` contains only a display summary for this turn.",
"description": "`items` contains only a display summary for this Turn.\n\nFor `thread/turns/list`, this currently means the first user message and the final assistant message when those items are available.",
"enum": [
"summary"
],
"type": "string"
},
{
"description": "`items` contains every ThreadItem available from persisted app-server history for this turn.",
"description": "`items` contains every ThreadItem available from persisted app-server history for this Turn.",
"enum": [
"full"
],

View File

@@ -64,6 +64,24 @@
}
]
},
"LargeContentMode": {
"oneOf": [
{
"description": "Preserve legacy behavior and embed large payloads directly in returned ThreadItems.",
"enum": [
"inline"
],
"type": "string"
},
{
"description": "Return metadata placeholders for large payloads and fetch bytes through `thread/item/content/read`.",
"enum": [
"deferred"
],
"type": "string"
}
]
},
"PermissionProfileModificationParams": {
"oneOf": [
{
@@ -190,6 +208,17 @@
"ephemeral": {
"type": "boolean"
},
"largeContent": {
"anyOf": [
{
"$ref": "#/definitions/LargeContentMode"
},
{
"type": "null"
}
],
"description": "Controls whether large item payloads, such as generated image bytes, are embedded in returned ThreadItems or replaced with deferred content references.\n\nDefaults to `inline` for compatibility. New clients that may load large histories should prefer `deferred` and fetch bytes on demand with `thread/item/content/read`."
},
"model": {
"description": "Configuration overrides for the forked thread, if any.",
"type": [

View File

@@ -756,6 +756,115 @@
],
"type": "object"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"McpToolCallError": {
"properties": {
"message": {
@@ -2005,10 +2114,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -2039,6 +2157,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -2225,7 +2344,7 @@
"type": "string"
},
"items": {
"description": "Thread items currently included in this turn payload.",
"description": "Turn items at the level of detail described by `itemsView`.",
"items": {
"$ref": "#/definitions/ThreadItem"
},
@@ -2238,7 +2357,7 @@
}
],
"default": "full",
"description": "Describes how much of `items` has been loaded for this turn."
"description": "Indicates how much of this Turn's item history is present in `items`."
},
"startedAt": {
"description": "Unix timestamp (in seconds) when the turn started.",
@@ -2290,21 +2409,21 @@
"TurnItemsView": {
"oneOf": [
{
"description": "`items` was not loaded for this turn. The field is intentionally empty.",
"description": "`items` was not loaded for this Turn. The field is intentionally empty.",
"enum": [
"notLoaded"
],
"type": "string"
},
{
"description": "`items` contains only a display summary for this turn.",
"description": "`items` contains only a display summary for this Turn.\n\nFor `thread/turns/list`, this currently means the first user message and the final assistant message when those items are available.",
"enum": [
"summary"
],
"type": "string"
},
{
"description": "`items` contains every ThreadItem available from persisted app-server history for this turn.",
"description": "`items` contains every ThreadItem available from persisted app-server history for this Turn.",
"enum": [
"full"
],

View File

@@ -0,0 +1,26 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"contentId": {
"description": "Opaque content identifier returned from a deferred item content placeholder.",
"type": "string"
},
"itemId": {
"type": "string"
},
"threadId": {
"type": "string"
},
"turnId": {
"type": "string"
}
},
"required": [
"contentId",
"itemId",
"threadId",
"turnId"
],
"title": "ThreadItemContentReadParams",
"type": "object"
}

View File

@@ -0,0 +1,29 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"byteLength": {
"description": "Decoded byte length when known.",
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"description": "Base64-encoded content bytes.",
"type": "string"
},
"mimeType": {
"description": "Media type of the returned content when known.",
"type": [
"string",
"null"
]
}
},
"required": [
"dataBase64"
],
"title": "ThreadItemContentReadResponse",
"type": "object"
}

View File

@@ -0,0 +1,83 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"LargeContentMode": {
"oneOf": [
{
"description": "Preserve legacy behavior and embed large payloads directly in returned ThreadItems.",
"enum": [
"inline"
],
"type": "string"
},
{
"description": "Return metadata placeholders for large payloads and fetch bytes through `thread/item/content/read`.",
"enum": [
"deferred"
],
"type": "string"
}
]
},
"SortDirection": {
"enum": [
"asc",
"desc"
],
"type": "string"
}
},
"properties": {
"cursor": {
"description": "Opaque cursor to pass to the next call to continue after the last item.",
"type": [
"string",
"null"
]
},
"largeContent": {
"anyOf": [
{
"$ref": "#/definitions/LargeContentMode"
},
{
"type": "null"
}
],
"description": "Controls whether large item payloads, such as generated image bytes, are embedded in returned ThreadItems or replaced with deferred content references.\n\nDefaults to `inline` for compatibility. New clients should prefer `deferred`."
},
"limit": {
"description": "Optional item page size.",
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"sortDirection": {
"anyOf": [
{
"$ref": "#/definitions/SortDirection"
},
{
"type": "null"
}
],
"description": "Optional item pagination direction; defaults to ascending."
},
"threadId": {
"type": "string"
},
"turnId": {
"description": "Turn to hydrate after receiving a summary Turn from `thread/turns/list`.",
"type": "string"
}
},
"required": [
"threadId",
"turnId"
],
"title": "ThreadItemsListParams",
"type": "object"
}

File diff suppressed because it is too large Load Diff

View File

@@ -448,6 +448,115 @@
],
"type": "object"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"McpToolCallError": {
"properties": {
"message": {
@@ -1455,10 +1564,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -1489,6 +1607,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -1675,7 +1794,7 @@
"type": "string"
},
"items": {
"description": "Thread items currently included in this turn payload.",
"description": "Turn items at the level of detail described by `itemsView`.",
"items": {
"$ref": "#/definitions/ThreadItem"
},
@@ -1688,7 +1807,7 @@
}
],
"default": "full",
"description": "Describes how much of `items` has been loaded for this turn."
"description": "Indicates how much of this Turn's item history is present in `items`."
},
"startedAt": {
"description": "Unix timestamp (in seconds) when the turn started.",
@@ -1740,21 +1859,21 @@
"TurnItemsView": {
"oneOf": [
{
"description": "`items` was not loaded for this turn. The field is intentionally empty.",
"description": "`items` was not loaded for this Turn. The field is intentionally empty.",
"enum": [
"notLoaded"
],
"type": "string"
},
{
"description": "`items` contains only a display summary for this turn.",
"description": "`items` contains only a display summary for this Turn.\n\nFor `thread/turns/list`, this currently means the first user message and the final assistant message when those items are available.",
"enum": [
"summary"
],
"type": "string"
},
{
"description": "`items` contains every ThreadItem available from persisted app-server history for this turn.",
"description": "`items` contains every ThreadItem available from persisted app-server history for this Turn.",
"enum": [
"full"
],

View File

@@ -448,6 +448,115 @@
],
"type": "object"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"McpToolCallError": {
"properties": {
"message": {
@@ -1455,10 +1564,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -1489,6 +1607,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -1675,7 +1794,7 @@
"type": "string"
},
"items": {
"description": "Thread items currently included in this turn payload.",
"description": "Turn items at the level of detail described by `itemsView`.",
"items": {
"$ref": "#/definitions/ThreadItem"
},
@@ -1688,7 +1807,7 @@
}
],
"default": "full",
"description": "Describes how much of `items` has been loaded for this turn."
"description": "Indicates how much of this Turn's item history is present in `items`."
},
"startedAt": {
"description": "Unix timestamp (in seconds) when the turn started.",
@@ -1740,21 +1859,21 @@
"TurnItemsView": {
"oneOf": [
{
"description": "`items` was not loaded for this turn. The field is intentionally empty.",
"description": "`items` was not loaded for this Turn. The field is intentionally empty.",
"enum": [
"notLoaded"
],
"type": "string"
},
{
"description": "`items` contains only a display summary for this turn.",
"description": "`items` contains only a display summary for this Turn.\n\nFor `thread/turns/list`, this currently means the first user message and the final assistant message when those items are available.",
"enum": [
"summary"
],
"type": "string"
},
{
"description": "`items` contains every ThreadItem available from persisted app-server history for this turn.",
"description": "`items` contains every ThreadItem available from persisted app-server history for this Turn.",
"enum": [
"full"
],

View File

@@ -1,11 +1,42 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"LargeContentMode": {
"oneOf": [
{
"description": "Preserve legacy behavior and embed large payloads directly in returned ThreadItems.",
"enum": [
"inline"
],
"type": "string"
},
{
"description": "Return metadata placeholders for large payloads and fetch bytes through `thread/item/content/read`.",
"enum": [
"deferred"
],
"type": "string"
}
]
}
},
"properties": {
"includeTurns": {
"default": false,
"description": "When true, include turns and their items from rollout history.",
"description": "When true, include the traditional fully hydrated thread history: `thread.turns` is populated and each returned Turn has `itemsView: \"full\"`.\n\nWhen false, `thread/read` returns metadata only. Clients can page history separately with `thread/turns/list`, then hydrate individual summary turns with `thread/items/list`.",
"type": "boolean"
},
"largeContent": {
"anyOf": [
{
"$ref": "#/definitions/LargeContentMode"
},
{
"type": "null"
}
],
"description": "Controls whether large item payloads, such as generated image bytes, are embedded in returned ThreadItems or replaced with deferred content references.\n\nDefaults to `inline` for compatibility. New clients that may load large histories should prefer `deferred` and fetch bytes on demand with `thread/item/content/read`."
},
"threadId": {
"type": "string"
}

View File

@@ -448,6 +448,115 @@
],
"type": "object"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"McpToolCallError": {
"properties": {
"message": {
@@ -1455,10 +1564,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -1489,6 +1607,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -1675,7 +1794,7 @@
"type": "string"
},
"items": {
"description": "Thread items currently included in this turn payload.",
"description": "Turn items at the level of detail described by `itemsView`.",
"items": {
"$ref": "#/definitions/ThreadItem"
},
@@ -1688,7 +1807,7 @@
}
],
"default": "full",
"description": "Describes how much of `items` has been loaded for this turn."
"description": "Indicates how much of this Turn's item history is present in `items`."
},
"startedAt": {
"description": "Unix timestamp (in seconds) when the turn started.",
@@ -1740,21 +1859,21 @@
"TurnItemsView": {
"oneOf": [
{
"description": "`items` was not loaded for this turn. The field is intentionally empty.",
"description": "`items` was not loaded for this Turn. The field is intentionally empty.",
"enum": [
"notLoaded"
],
"type": "string"
},
{
"description": "`items` contains only a display summary for this turn.",
"description": "`items` contains only a display summary for this Turn.\n\nFor `thread/turns/list`, this currently means the first user message and the final assistant message when those items are available.",
"enum": [
"summary"
],
"type": "string"
},
{
"description": "`items` contains every ThreadItem available from persisted app-server history for this turn.",
"description": "`items` contains every ThreadItem available from persisted app-server history for this Turn.",
"enum": [
"full"
],

View File

@@ -215,6 +215,24 @@
],
"type": "string"
},
"LargeContentMode": {
"oneOf": [
{
"description": "Preserve legacy behavior and embed large payloads directly in returned ThreadItems.",
"enum": [
"inline"
],
"type": "string"
},
{
"description": "Return metadata placeholders for large payloads and fetch bytes through `thread/item/content/read`.",
"enum": [
"deferred"
],
"type": "string"
}
]
},
"LocalShellAction": {
"oneOf": [
{
@@ -1067,6 +1085,17 @@
"null"
]
},
"largeContent": {
"anyOf": [
{
"$ref": "#/definitions/LargeContentMode"
},
{
"type": "null"
}
],
"description": "Controls whether large item payloads, such as generated image bytes, are embedded in returned ThreadItems or replaced with deferred content references.\n\nDefaults to `inline` for compatibility. New clients that may load large histories should prefer `deferred` and fetch bytes on demand with `thread/item/content/read`."
},
"model": {
"description": "Configuration overrides for the resumed thread, if any.",
"type": [

View File

@@ -756,6 +756,115 @@
],
"type": "object"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"McpToolCallError": {
"properties": {
"message": {
@@ -2005,10 +2114,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -2039,6 +2157,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -2225,7 +2344,7 @@
"type": "string"
},
"items": {
"description": "Thread items currently included in this turn payload.",
"description": "Turn items at the level of detail described by `itemsView`.",
"items": {
"$ref": "#/definitions/ThreadItem"
},
@@ -2238,7 +2357,7 @@
}
],
"default": "full",
"description": "Describes how much of `items` has been loaded for this turn."
"description": "Indicates how much of this Turn's item history is present in `items`."
},
"startedAt": {
"description": "Unix timestamp (in seconds) when the turn started.",
@@ -2290,21 +2409,21 @@
"TurnItemsView": {
"oneOf": [
{
"description": "`items` was not loaded for this turn. The field is intentionally empty.",
"description": "`items` was not loaded for this Turn. The field is intentionally empty.",
"enum": [
"notLoaded"
],
"type": "string"
},
{
"description": "`items` contains only a display summary for this turn.",
"description": "`items` contains only a display summary for this Turn.\n\nFor `thread/turns/list`, this currently means the first user message and the final assistant message when those items are available.",
"enum": [
"summary"
],
"type": "string"
},
{
"description": "`items` contains every ThreadItem available from persisted app-server history for this turn.",
"description": "`items` contains every ThreadItem available from persisted app-server history for this Turn.",
"enum": [
"full"
],

View File

@@ -448,6 +448,115 @@
],
"type": "object"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"McpToolCallError": {
"properties": {
"message": {
@@ -1455,10 +1564,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -1489,6 +1607,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -1675,7 +1794,7 @@
"type": "string"
},
"items": {
"description": "Thread items currently included in this turn payload.",
"description": "Turn items at the level of detail described by `itemsView`.",
"items": {
"$ref": "#/definitions/ThreadItem"
},
@@ -1688,7 +1807,7 @@
}
],
"default": "full",
"description": "Describes how much of `items` has been loaded for this turn."
"description": "Indicates how much of this Turn's item history is present in `items`."
},
"startedAt": {
"description": "Unix timestamp (in seconds) when the turn started.",
@@ -1740,21 +1859,21 @@
"TurnItemsView": {
"oneOf": [
{
"description": "`items` was not loaded for this turn. The field is intentionally empty.",
"description": "`items` was not loaded for this Turn. The field is intentionally empty.",
"enum": [
"notLoaded"
],
"type": "string"
},
{
"description": "`items` contains only a display summary for this turn.",
"description": "`items` contains only a display summary for this Turn.\n\nFor `thread/turns/list`, this currently means the first user message and the final assistant message when those items are available.",
"enum": [
"summary"
],
"type": "string"
},
{
"description": "`items` contains every ThreadItem available from persisted app-server history for this turn.",
"description": "`items` contains every ThreadItem available from persisted app-server history for this Turn.",
"enum": [
"full"
],

View File

@@ -756,6 +756,115 @@
],
"type": "object"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"McpToolCallError": {
"properties": {
"message": {
@@ -2005,10 +2114,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -2039,6 +2157,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -2225,7 +2344,7 @@
"type": "string"
},
"items": {
"description": "Thread items currently included in this turn payload.",
"description": "Turn items at the level of detail described by `itemsView`.",
"items": {
"$ref": "#/definitions/ThreadItem"
},
@@ -2238,7 +2357,7 @@
}
],
"default": "full",
"description": "Describes how much of `items` has been loaded for this turn."
"description": "Indicates how much of this Turn's item history is present in `items`."
},
"startedAt": {
"description": "Unix timestamp (in seconds) when the turn started.",
@@ -2290,21 +2409,21 @@
"TurnItemsView": {
"oneOf": [
{
"description": "`items` was not loaded for this turn. The field is intentionally empty.",
"description": "`items` was not loaded for this Turn. The field is intentionally empty.",
"enum": [
"notLoaded"
],
"type": "string"
},
{
"description": "`items` contains only a display summary for this turn.",
"description": "`items` contains only a display summary for this Turn.\n\nFor `thread/turns/list`, this currently means the first user message and the final assistant message when those items are available.",
"enum": [
"summary"
],
"type": "string"
},
{
"description": "`items` contains every ThreadItem available from persisted app-server history for this turn.",
"description": "`items` contains every ThreadItem available from persisted app-server history for this Turn.",
"enum": [
"full"
],

View File

@@ -448,6 +448,115 @@
],
"type": "object"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"McpToolCallError": {
"properties": {
"message": {
@@ -1455,10 +1564,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -1489,6 +1607,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -1675,7 +1794,7 @@
"type": "string"
},
"items": {
"description": "Thread items currently included in this turn payload.",
"description": "Turn items at the level of detail described by `itemsView`.",
"items": {
"$ref": "#/definitions/ThreadItem"
},
@@ -1688,7 +1807,7 @@
}
],
"default": "full",
"description": "Describes how much of `items` has been loaded for this turn."
"description": "Indicates how much of this Turn's item history is present in `items`."
},
"startedAt": {
"description": "Unix timestamp (in seconds) when the turn started.",
@@ -1740,21 +1859,21 @@
"TurnItemsView": {
"oneOf": [
{
"description": "`items` was not loaded for this turn. The field is intentionally empty.",
"description": "`items` was not loaded for this Turn. The field is intentionally empty.",
"enum": [
"notLoaded"
],
"type": "string"
},
{
"description": "`items` contains only a display summary for this turn.",
"description": "`items` contains only a display summary for this Turn.\n\nFor `thread/turns/list`, this currently means the first user message and the final assistant message when those items are available.",
"enum": [
"summary"
],
"type": "string"
},
{
"description": "`items` contains every ThreadItem available from persisted app-server history for this turn.",
"description": "`items` contains every ThreadItem available from persisted app-server history for this Turn.",
"enum": [
"full"
],

View File

@@ -448,6 +448,115 @@
],
"type": "object"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"McpToolCallError": {
"properties": {
"message": {
@@ -1455,10 +1564,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -1489,6 +1607,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -1675,7 +1794,7 @@
"type": "string"
},
"items": {
"description": "Thread items currently included in this turn payload.",
"description": "Turn items at the level of detail described by `itemsView`.",
"items": {
"$ref": "#/definitions/ThreadItem"
},
@@ -1688,7 +1807,7 @@
}
],
"default": "full",
"description": "Describes how much of `items` has been loaded for this turn."
"description": "Indicates how much of this Turn's item history is present in `items`."
},
"startedAt": {
"description": "Unix timestamp (in seconds) when the turn started.",
@@ -1740,21 +1859,21 @@
"TurnItemsView": {
"oneOf": [
{
"description": "`items` was not loaded for this turn. The field is intentionally empty.",
"description": "`items` was not loaded for this Turn. The field is intentionally empty.",
"enum": [
"notLoaded"
],
"type": "string"
},
{
"description": "`items` contains only a display summary for this turn.",
"description": "`items` contains only a display summary for this Turn.\n\nFor `thread/turns/list`, this currently means the first user message and the final assistant message when those items are available.",
"enum": [
"summary"
],
"type": "string"
},
{
"description": "`items` contains every ThreadItem available from persisted app-server history for this turn.",
"description": "`items` contains every ThreadItem available from persisted app-server history for this Turn.",
"enum": [
"full"
],

View File

@@ -422,6 +422,115 @@
],
"type": "object"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"McpToolCallError": {
"properties": {
"message": {
@@ -1179,10 +1288,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -1213,6 +1331,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -1324,7 +1443,7 @@
"type": "string"
},
"items": {
"description": "Thread items currently included in this turn payload.",
"description": "Turn items at the level of detail described by `itemsView`.",
"items": {
"$ref": "#/definitions/ThreadItem"
},
@@ -1337,7 +1456,7 @@
}
],
"default": "full",
"description": "Describes how much of `items` has been loaded for this turn."
"description": "Indicates how much of this Turn's item history is present in `items`."
},
"startedAt": {
"description": "Unix timestamp (in seconds) when the turn started.",
@@ -1389,21 +1508,21 @@
"TurnItemsView": {
"oneOf": [
{
"description": "`items` was not loaded for this turn. The field is intentionally empty.",
"description": "`items` was not loaded for this Turn. The field is intentionally empty.",
"enum": [
"notLoaded"
],
"type": "string"
},
{
"description": "`items` contains only a display summary for this turn.",
"description": "`items` contains only a display summary for this Turn.\n\nFor `thread/turns/list`, this currently means the first user message and the final assistant message when those items are available.",
"enum": [
"summary"
],
"type": "string"
},
{
"description": "`items` contains every ThreadItem available from persisted app-server history for this turn.",
"description": "`items` contains every ThreadItem available from persisted app-server history for this Turn.",
"enum": [
"full"
],

View File

@@ -422,6 +422,115 @@
],
"type": "object"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"McpToolCallError": {
"properties": {
"message": {
@@ -1179,10 +1288,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -1213,6 +1331,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -1324,7 +1443,7 @@
"type": "string"
},
"items": {
"description": "Thread items currently included in this turn payload.",
"description": "Turn items at the level of detail described by `itemsView`.",
"items": {
"$ref": "#/definitions/ThreadItem"
},
@@ -1337,7 +1456,7 @@
}
],
"default": "full",
"description": "Describes how much of `items` has been loaded for this turn."
"description": "Indicates how much of this Turn's item history is present in `items`."
},
"startedAt": {
"description": "Unix timestamp (in seconds) when the turn started.",
@@ -1389,21 +1508,21 @@
"TurnItemsView": {
"oneOf": [
{
"description": "`items` was not loaded for this turn. The field is intentionally empty.",
"description": "`items` was not loaded for this Turn. The field is intentionally empty.",
"enum": [
"notLoaded"
],
"type": "string"
},
{
"description": "`items` contains only a display summary for this turn.",
"description": "`items` contains only a display summary for this Turn.\n\nFor `thread/turns/list`, this currently means the first user message and the final assistant message when those items are available.",
"enum": [
"summary"
],
"type": "string"
},
{
"description": "`items` contains every ThreadItem available from persisted app-server history for this turn.",
"description": "`items` contains every ThreadItem available from persisted app-server history for this Turn.",
"enum": [
"full"
],

View File

@@ -422,6 +422,115 @@
],
"type": "object"
},
"ImageGenerationContent": {
"oneOf": [
{
"description": "Image bytes are embedded directly in the item.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"dataBase64": {
"type": "string"
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"inline"
],
"title": "InlineImageGenerationContentType",
"type": "string"
}
},
"required": [
"dataBase64",
"type"
],
"title": "InlineImageGenerationContent",
"type": "object"
},
{
"description": "Image bytes are available through `thread/item/content/read`.",
"properties": {
"byteLength": {
"format": "int64",
"type": [
"integer",
"null"
]
},
"contentId": {
"type": "string"
},
"height": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
},
"mimeType": {
"type": [
"string",
"null"
]
},
"type": {
"enum": [
"deferred"
],
"title": "DeferredImageGenerationContentType",
"type": "string"
},
"width": {
"format": "uint32",
"minimum": 0.0,
"type": [
"integer",
"null"
]
}
},
"required": [
"contentId",
"type"
],
"title": "DeferredImageGenerationContent",
"type": "object"
},
{
"description": "Image content is not available yet, or is no longer available.",
"properties": {
"reason": {
"type": "string"
},
"type": {
"enum": [
"unavailable"
],
"title": "UnavailableImageGenerationContentType",
"type": "string"
}
},
"required": [
"reason",
"type"
],
"title": "UnavailableImageGenerationContent",
"type": "object"
}
]
},
"McpToolCallError": {
"properties": {
"message": {
@@ -1179,10 +1288,19 @@
},
{
"properties": {
"content": {
"allOf": [
{
"$ref": "#/definitions/ImageGenerationContent"
}
],
"description": "Structured image content metadata. New clients should render from this field instead of reading the legacy `result` field directly."
},
"id": {
"type": "string"
},
"result": {
"description": "Legacy base64-encoded image result.\n\nThis is populated in `largeContent: \"inline\"` mode for compatibility. In `largeContent: \"deferred\"` mode, clients should expect this to be empty and use `content` plus `thread/item/content/read` instead.",
"type": "string"
},
"revisedPrompt": {
@@ -1213,6 +1331,7 @@
}
},
"required": [
"content",
"id",
"result",
"status",
@@ -1324,7 +1443,7 @@
"type": "string"
},
"items": {
"description": "Thread items currently included in this turn payload.",
"description": "Turn items at the level of detail described by `itemsView`.",
"items": {
"$ref": "#/definitions/ThreadItem"
},
@@ -1337,7 +1456,7 @@
}
],
"default": "full",
"description": "Describes how much of `items` has been loaded for this turn."
"description": "Indicates how much of this Turn's item history is present in `items`."
},
"startedAt": {
"description": "Unix timestamp (in seconds) when the turn started.",
@@ -1389,21 +1508,21 @@
"TurnItemsView": {
"oneOf": [
{
"description": "`items` was not loaded for this turn. The field is intentionally empty.",
"description": "`items` was not loaded for this Turn. The field is intentionally empty.",
"enum": [
"notLoaded"
],
"type": "string"
},
{
"description": "`items` contains only a display summary for this turn.",
"description": "`items` contains only a display summary for this Turn.\n\nFor `thread/turns/list`, this currently means the first user message and the final assistant message when those items are available.",
"enum": [
"summary"
],
"type": "string"
},
{
"description": "`items` contains every ThreadItem available from persisted app-server history for this turn.",
"description": "`items` contains every ThreadItem available from persisted app-server history for this Turn.",
"enum": [
"full"
],

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,5 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
export type ImageGenerationContent = { "type": "inline", dataBase64: string, mimeType: string | null, byteLength: number | null, } | { "type": "deferred", contentId: string, mimeType: string | null, byteLength: number | null, width: number | null, height: number | null, } | { "type": "unavailable", reason: string, };

View File

@@ -0,0 +1,5 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
export type LargeContentMode = "inline" | "deferred";

View File

@@ -5,6 +5,7 @@ import type { ServiceTier } from "../ServiceTier";
import type { JsonValue } from "../serde_json/JsonValue";
import type { ApprovalsReviewer } from "./ApprovalsReviewer";
import type { AskForApproval } from "./AskForApproval";
import type { LargeContentMode } from "./LargeContentMode";
import type { SandboxMode } from "./SandboxMode";
/**
@@ -23,4 +24,11 @@ model?: string | null, modelProvider?: string | null, serviceTier?: ServiceTier
* Override where approval requests are routed for review on this thread
* and subsequent turns.
*/
approvalsReviewer?: ApprovalsReviewer | null, sandbox?: SandboxMode | null, config?: { [key in string]?: JsonValue } | null, baseInstructions?: string | null, developerInstructions?: string | null, ephemeral?: boolean};
approvalsReviewer?: ApprovalsReviewer | null, sandbox?: SandboxMode | null, config?: { [key in string]?: JsonValue } | null, baseInstructions?: string | null, developerInstructions?: string | null, /**
* Controls whether large item payloads, such as generated image bytes, are embedded in
* returned ThreadItems or replaced with deferred content references.
*
* Defaults to `inline` for compatibility. New clients that may load large histories should
* prefer `deferred` and fetch bytes on demand with `thread/item/content/read`.
*/
largeContent?: LargeContentMode | null, ephemeral?: boolean};

View File

@@ -15,6 +15,7 @@ import type { DynamicToolCallOutputContentItem } from "./DynamicToolCallOutputCo
import type { DynamicToolCallStatus } from "./DynamicToolCallStatus";
import type { FileUpdateChange } from "./FileUpdateChange";
import type { HookPromptFragment } from "./HookPromptFragment";
import type { ImageGenerationContent } from "./ImageGenerationContent";
import type { McpToolCallError } from "./McpToolCallError";
import type { McpToolCallResult } from "./McpToolCallResult";
import type { McpToolCallStatus } from "./McpToolCallStatus";
@@ -98,4 +99,17 @@ reasoningEffort: ReasoningEffort | null,
/**
* Last known status of the target agents, when available.
*/
agentsStates: { [key in string]?: CollabAgentState }, } | { "type": "webSearch", id: string, query: string, action: WebSearchAction | null, } | { "type": "imageView", id: string, path: AbsolutePathBuf, } | { "type": "imageGeneration", id: string, status: string, revisedPrompt: string | null, result: string, savedPath?: AbsolutePathBuf, } | { "type": "enteredReviewMode", id: string, review: string, } | { "type": "exitedReviewMode", id: string, review: string, } | { "type": "contextCompaction", id: string, };
agentsStates: { [key in string]?: CollabAgentState }, } | { "type": "webSearch", id: string, query: string, action: WebSearchAction | null, } | { "type": "imageView", id: string, path: AbsolutePathBuf, } | { "type": "imageGeneration", id: string, status: string, revisedPrompt: string | null,
/**
* Structured image content metadata. New clients should render from this field instead
* of reading the legacy `result` field directly.
*/
content: ImageGenerationContent,
/**
* Legacy base64-encoded image result.
*
* This is populated in `largeContent: "inline"` mode for compatibility. In
* `largeContent: "deferred"` mode, clients should expect this to be empty and use
* `content` plus `thread/item/content/read` instead.
*/
result: string, savedPath?: AbsolutePathBuf, } | { "type": "enteredReviewMode", id: string, review: string, } | { "type": "exitedReviewMode", id: string, review: string, } | { "type": "contextCompaction", id: string, };

View File

@@ -0,0 +1,9 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
export type ThreadItemContentReadParams = { threadId: string, turnId: string, itemId: string,
/**
* Opaque content identifier returned from a deferred item content placeholder.
*/
contentId: string, };

View File

@@ -0,0 +1,17 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
export type ThreadItemContentReadResponse = {
/**
* Media type of the returned content when known.
*/
mimeType: string | null,
/**
* Base64-encoded content bytes.
*/
dataBase64: string,
/**
* Decoded byte length when known.
*/
byteLength: number | null, };

View File

@@ -0,0 +1,30 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { LargeContentMode } from "./LargeContentMode";
import type { SortDirection } from "./SortDirection";
export type ThreadItemsListParams = { threadId: string,
/**
* Turn to hydrate after receiving a summary Turn from `thread/turns/list`.
*/
turnId: string,
/**
* Controls whether large item payloads, such as generated image bytes, are embedded in
* returned ThreadItems or replaced with deferred content references.
*
* Defaults to `inline` for compatibility. New clients should prefer `deferred`.
*/
largeContent?: LargeContentMode | null,
/**
* Opaque cursor to pass to the next call to continue after the last item.
*/
cursor?: string | null,
/**
* Optional item page size.
*/
limit?: number | null,
/**
* Optional item pagination direction; defaults to ascending.
*/
sortDirection?: SortDirection | null, };

View File

@@ -0,0 +1,23 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { ThreadItem } from "./ThreadItem";
export type ThreadItemsListResponse = {
/**
* Full ThreadItems for the requested turn page. Accumulate pages until `nextCursor` is null
* to hydrate the client-side Turn representation.
*/
data: Array<ThreadItem>,
/**
* Opaque cursor to pass to the next call to continue after the last item.
* if None, there are no more items to return.
*/
nextCursor: string | null,
/**
* Opaque cursor to pass as `cursor` when reversing `sortDirection`.
* This is only populated when the page contains at least one item.
* Use it with the opposite `sortDirection` to include the anchor item again
* and catch updates to that item.
*/
backwardsCursor: string | null, };

View File

@@ -1,9 +1,22 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { LargeContentMode } from "./LargeContentMode";
export type ThreadReadParams = { threadId: string,
/**
* When true, include turns and their items from rollout history.
* Controls whether large item payloads, such as generated image bytes, are embedded in
* returned ThreadItems or replaced with deferred content references.
*
* Defaults to `inline` for compatibility. New clients that may load large histories should
* prefer `deferred` and fetch bytes on demand with `thread/item/content/read`.
*/
largeContent?: LargeContentMode | null,
/**
* When true, include the traditional fully hydrated thread history:
* `thread.turns` is populated and each returned Turn has `itemsView: "full"`.
*
* When false, `thread/read` returns metadata only. Clients can page history separately
* with `thread/turns/list`, then hydrate individual summary turns with `thread/items/list`.
*/
includeTurns: boolean, };

View File

@@ -6,6 +6,7 @@ import type { ServiceTier } from "../ServiceTier";
import type { JsonValue } from "../serde_json/JsonValue";
import type { ApprovalsReviewer } from "./ApprovalsReviewer";
import type { AskForApproval } from "./AskForApproval";
import type { LargeContentMode } from "./LargeContentMode";
import type { SandboxMode } from "./SandboxMode";
/**
@@ -26,4 +27,11 @@ model?: string | null, modelProvider?: string | null, serviceTier?: ServiceTier
* Override where approval requests are routed for review on this thread
* and subsequent turns.
*/
approvalsReviewer?: ApprovalsReviewer | null, sandbox?: SandboxMode | null, config?: { [key in string]?: JsonValue } | null, baseInstructions?: string | null, developerInstructions?: string | null, personality?: Personality | null};
approvalsReviewer?: ApprovalsReviewer | null, sandbox?: SandboxMode | null, config?: { [key in string]?: JsonValue } | null, baseInstructions?: string | null, developerInstructions?: string | null, personality?: Personality | null, /**
* Controls whether large item payloads, such as generated image bytes, are embedded in
* returned ThreadItems or replaced with deferred content references.
*
* Defaults to `inline` for compatibility. New clients that may load large histories should
* prefer `deferred` and fetch bytes on demand with `thread/item/content/read`.
*/
largeContent?: LargeContentMode | null};

View File

@@ -8,11 +8,11 @@ import type { TurnStatus } from "./TurnStatus";
export type Turn = { id: string,
/**
* Thread items currently included in this turn payload.
* Turn items at the level of detail described by `itemsView`.
*/
items: Array<ThreadItem>,
/**
* Describes how much of `items` has been loaded for this turn.
* Indicates how much of this Turn's item history is present in `items`.
*/
itemsView: TurnItemsView, status: TurnStatus,
/**

View File

@@ -172,10 +172,12 @@ export type { HookTrustStatus } from "./HookTrustStatus";
export type { HooksListEntry } from "./HooksListEntry";
export type { HooksListParams } from "./HooksListParams";
export type { HooksListResponse } from "./HooksListResponse";
export type { ImageGenerationContent } from "./ImageGenerationContent";
export type { ItemCompletedNotification } from "./ItemCompletedNotification";
export type { ItemGuardianApprovalReviewCompletedNotification } from "./ItemGuardianApprovalReviewCompletedNotification";
export type { ItemGuardianApprovalReviewStartedNotification } from "./ItemGuardianApprovalReviewStartedNotification";
export type { ItemStartedNotification } from "./ItemStartedNotification";
export type { LargeContentMode } from "./LargeContentMode";
export type { ListMcpServerStatusParams } from "./ListMcpServerStatusParams";
export type { ListMcpServerStatusResponse } from "./ListMcpServerStatusResponse";
export type { LoginAccountParams } from "./LoginAccountParams";
@@ -367,6 +369,10 @@ export type { ThreadGoalUpdatedNotification } from "./ThreadGoalUpdatedNotificat
export type { ThreadInjectItemsParams } from "./ThreadInjectItemsParams";
export type { ThreadInjectItemsResponse } from "./ThreadInjectItemsResponse";
export type { ThreadItem } from "./ThreadItem";
export type { ThreadItemContentReadParams } from "./ThreadItemContentReadParams";
export type { ThreadItemContentReadResponse } from "./ThreadItemContentReadResponse";
export type { ThreadItemsListParams } from "./ThreadItemsListParams";
export type { ThreadItemsListResponse } from "./ThreadItemsListResponse";
export type { ThreadListParams } from "./ThreadListParams";
export type { ThreadListResponse } from "./ThreadListResponse";
export type { ThreadLoadedListParams } from "./ThreadLoadedListParams";

View File

@@ -577,6 +577,18 @@ client_request_definitions! {
serialization: None,
response: v2::ThreadTurnsListResponse,
},
ThreadItemsList => "thread/items/list" {
params: v2::ThreadItemsListParams,
// Explicitly concurrent: this primarily reads append-only rollout storage.
serialization: None,
response: v2::ThreadItemsListResponse,
},
ThreadItemContentRead => "thread/item/content/read" {
params: v2::ThreadItemContentReadParams,
// Explicitly concurrent: this reads deferred item content without mutating the thread.
serialization: None,
response: v2::ThreadItemContentReadResponse,
},
/// Append raw Responses API items to the thread history without starting a user turn.
ThreadInjectItems => "thread/inject_items" {
params: v2::ThreadInjectItemsParams,
@@ -1834,6 +1846,7 @@ mod tests {
request_id: request_id(),
params: v2::ThreadTurnsListParams {
thread_id: "thread-1".to_string(),
large_content: None,
cursor: None,
limit: None,
sort_direction: None,

View File

@@ -10,6 +10,7 @@ use crate::protocol::v2::CollabAgentToolCallStatus;
use crate::protocol::v2::CommandExecutionStatus;
use crate::protocol::v2::DynamicToolCallOutputContentItem;
use crate::protocol::v2::DynamicToolCallStatus;
use crate::protocol::v2::ImageGenerationContent;
use crate::protocol::v2::McpToolCallError;
use crate::protocol::v2::McpToolCallResult;
use crate::protocol::v2::McpToolCallStatus;
@@ -586,6 +587,9 @@ impl ThreadHistoryBuilder {
id: payload.call_id.clone(),
status: String::new(),
revised_prompt: None,
content: ImageGenerationContent::Unavailable {
reason: "image generation has not completed".to_string(),
},
result: String::new(),
saved_path: None,
};
@@ -597,6 +601,11 @@ impl ThreadHistoryBuilder {
id: payload.call_id.clone(),
status: payload.status.clone(),
revised_prompt: payload.revised_prompt.clone(),
content: ImageGenerationContent::Inline {
data_base64: payload.result.clone(),
mime_type: None,
byte_length: None,
},
result: payload.result.clone(),
saved_path: payload.saved_path.clone(),
};
@@ -1469,6 +1478,11 @@ mod tests {
id: "ig_123".into(),
status: "completed".into(),
revised_prompt: Some("final prompt".into()),
content: ImageGenerationContent::Inline {
data_base64: "Zm9v".into(),
mime_type: None,
byte_length: None,
},
result: "Zm9v".into(),
saved_path: Some(test_path_buf("/tmp/ig_123.png").abs()),
},

View File

@@ -3974,9 +3974,19 @@ pub struct ThreadResumeParams {
pub developer_instructions: Option<String>,
#[ts(optional = nullable)]
pub personality: Option<Personality>,
/// When true, return only thread metadata and live-resume state without
/// populating `thread.turns`. This is useful when the client plans to call
/// `thread/turns/list` immediately after resuming.
/// Controls whether large item payloads, such as generated image bytes, are embedded in
/// returned ThreadItems or replaced with deferred content references.
///
/// Defaults to `inline` for compatibility. New clients that may load large histories should
/// prefer `deferred` and fetch bytes on demand with `thread/item/content/read`.
#[ts(optional = nullable)]
pub large_content: Option<LargeContentMode>,
/// When false, `thread/resume` returns the traditional fully hydrated thread history:
/// `thread.turns` is populated and each returned Turn has `itemsView: "full"`.
///
/// When true, return only thread metadata and live-resume state without populating
/// `thread.turns`. Clients that choose this scalable mode should page history with
/// `thread/turns/list`, then hydrate individual summary turns with `thread/items/list`.
#[experimental("thread/resume.excludeTurns")]
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub exclude_turns: bool,
@@ -4078,6 +4088,13 @@ pub struct ThreadForkParams {
pub base_instructions: Option<String>,
#[ts(optional = nullable)]
pub developer_instructions: Option<String>,
/// Controls whether large item payloads, such as generated image bytes, are embedded in
/// returned ThreadItems or replaced with deferred content references.
///
/// Defaults to `inline` for compatibility. New clients that may load large histories should
/// prefer `deferred` and fetch bytes on demand with `thread/item/content/read`.
#[ts(optional = nullable)]
pub large_content: Option<LargeContentMode>,
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub ephemeral: bool,
/// When true, return only thread metadata and live fork state without
@@ -4651,7 +4668,18 @@ pub enum ThreadActiveFlag {
#[ts(export_to = "v2/")]
pub struct ThreadReadParams {
pub thread_id: String,
/// When true, include turns and their items from rollout history.
/// Controls whether large item payloads, such as generated image bytes, are embedded in
/// returned ThreadItems or replaced with deferred content references.
///
/// Defaults to `inline` for compatibility. New clients that may load large histories should
/// prefer `deferred` and fetch bytes on demand with `thread/item/content/read`.
#[ts(optional = nullable)]
pub large_content: Option<LargeContentMode>,
/// When true, include the traditional fully hydrated thread history:
/// `thread.turns` is populated and each returned Turn has `itemsView: "full"`.
///
/// When false, `thread/read` returns metadata only. Clients can page history separately
/// with `thread/turns/list`, then hydrate individual summary turns with `thread/items/list`.
#[serde(default)]
pub include_turns: bool,
}
@@ -4668,6 +4696,12 @@ pub struct ThreadReadResponse {
#[ts(export_to = "v2/")]
pub struct ThreadTurnsListParams {
pub thread_id: String,
/// Controls whether large item payloads in summary Turn items are embedded inline or returned
/// as deferred content references.
///
/// Defaults to `inline` for compatibility. New clients should prefer `deferred`.
#[ts(optional = nullable)]
pub large_content: Option<LargeContentMode>,
/// Opaque cursor to pass to the next call to continue after the last turn.
#[ts(optional = nullable)]
pub cursor: Option<String>,
@@ -4683,6 +4717,11 @@ pub struct ThreadTurnsListParams {
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct ThreadTurnsListResponse {
/// Summary turns for paged history UIs.
///
/// Each Turn returned by `thread/turns/list` has `itemsView: "summary"` and includes only
/// the first user message and final assistant message in `items` when those items are
/// available. Use `thread/items/list` to hydrate the complete item list for a turn.
pub data: Vec<Turn>,
/// Opaque cursor to pass to the next call to continue after the last turn.
/// if None, there are no more turns to return.
@@ -4694,6 +4733,82 @@ pub struct ThreadTurnsListResponse {
pub backwards_cursor: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct ThreadItemsListParams {
pub thread_id: String,
/// Turn to hydrate after receiving a summary Turn from `thread/turns/list`.
pub turn_id: String,
/// Controls whether large item payloads, such as generated image bytes, are embedded in
/// returned ThreadItems or replaced with deferred content references.
///
/// Defaults to `inline` for compatibility. New clients should prefer `deferred`.
#[ts(optional = nullable)]
pub large_content: Option<LargeContentMode>,
/// Opaque cursor to pass to the next call to continue after the last item.
#[ts(optional = nullable)]
pub cursor: Option<String>,
/// Optional item page size.
#[ts(optional = nullable)]
pub limit: Option<u32>,
/// Optional item pagination direction; defaults to ascending.
#[ts(optional = nullable)]
pub sort_direction: Option<SortDirection>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct ThreadItemsListResponse {
/// Full ThreadItems for the requested turn page. Accumulate pages until `nextCursor` is null
/// to hydrate the client-side Turn representation.
pub data: Vec<ThreadItem>,
/// Opaque cursor to pass to the next call to continue after the last item.
/// if None, there are no more items to return.
pub next_cursor: Option<String>,
/// Opaque cursor to pass as `cursor` when reversing `sortDirection`.
/// This is only populated when the page contains at least one item.
/// Use it with the opposite `sortDirection` to include the anchor item again
/// and catch updates to that item.
pub backwards_cursor: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct ThreadItemContentReadParams {
pub thread_id: String,
pub turn_id: String,
pub item_id: String,
/// Opaque content identifier returned from a deferred item content placeholder.
pub content_id: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct ThreadItemContentReadResponse {
/// Media type of the returned content when known.
pub mime_type: Option<String>,
/// Base64-encoded content bytes.
pub data_base64: String,
/// Decoded byte length when known.
#[ts(type = "number | null")]
pub byte_length: Option<i64>,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(rename_all = "camelCase", export_to = "v2/")]
pub enum LargeContentMode {
/// Preserve legacy behavior and embed large payloads directly in returned ThreadItems.
Inline,
/// Return metadata placeholders for large payloads and fetch bytes through
/// `thread/item/content/read`.
Deferred,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
@@ -5434,9 +5549,9 @@ impl From<CoreTokenUsage> for TokenUsageBreakdown {
#[ts(export_to = "v2/")]
pub struct Turn {
pub id: String,
/// Thread items currently included in this turn payload.
/// Turn items at the level of detail described by `itemsView`.
pub items: Vec<ThreadItem>,
/// Describes how much of `items` has been loaded for this turn.
/// Indicates how much of this Turn's item history is present in `items`.
#[serde(default)]
pub items_view: TurnItemsView,
pub status: TurnStatus,
@@ -5455,13 +5570,17 @@ pub struct Turn {
#[derive(Default, Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
#[ts(rename_all = "camelCase", export_to = "v2/")]
pub enum TurnItemsView {
/// `items` was not loaded for this turn. The field is intentionally empty.
/// `items` was not loaded for this Turn. The field is intentionally empty.
NotLoaded,
/// `items` contains only a display summary for this turn.
/// `items` contains only a display summary for this Turn.
///
/// For `thread/turns/list`, this currently means the first user message and the final
/// assistant message when those items are available.
Summary,
/// `items` contains every ThreadItem available from persisted app-server history for this turn.
/// `items` contains every ThreadItem available from persisted app-server history for this
/// Turn.
#[default]
Full,
}
@@ -6250,6 +6369,14 @@ pub enum ThreadItem {
id: String,
status: String,
revised_prompt: Option<String>,
/// Structured image content metadata. New clients should render from this field instead
/// of reading the legacy `result` field directly.
content: ImageGenerationContent,
/// Legacy base64-encoded image result.
///
/// This is populated in `largeContent: "inline"` mode for compatibility. In
/// `largeContent: "deferred"` mode, clients should expect this to be empty and use
/// `content` plus `thread/item/content/read` instead.
result: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[ts(optional)]
@@ -6266,6 +6393,36 @@ pub enum ThreadItem {
ContextCompaction { id: String },
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]
#[serde(tag = "type", rename_all = "camelCase")]
#[ts(tag = "type", export_to = "v2/")]
pub enum ImageGenerationContent {
/// Image bytes are embedded directly in the item.
#[serde(rename_all = "camelCase")]
#[ts(rename_all = "camelCase")]
Inline {
data_base64: String,
mime_type: Option<String>,
#[ts(type = "number | null")]
byte_length: Option<i64>,
},
/// Image bytes are available through `thread/item/content/read`.
#[serde(rename_all = "camelCase")]
#[ts(rename_all = "camelCase")]
Deferred {
content_id: String,
mime_type: Option<String>,
#[ts(type = "number | null")]
byte_length: Option<i64>,
width: Option<u32>,
height: Option<u32>,
},
/// Image content is not available yet, or is no longer available.
#[serde(rename_all = "camelCase")]
#[ts(rename_all = "camelCase")]
Unavailable { reason: String },
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(rename_all = "camelCase", export_to = "v2/")]
@@ -6727,6 +6884,11 @@ impl From<CoreTurnItem> for ThreadItem {
id: image.id,
status: image.status,
revised_prompt: image.revised_prompt,
content: ImageGenerationContent::Inline {
data_base64: image.result.clone(),
mime_type: None,
byte_length: None,
},
result: image.result,
saved_path: image.saved_path,
},

View File

@@ -149,7 +149,9 @@ Example with notification opt-out:
- `thread/list` — page through stored rollouts; supports cursor-based pagination and optional `modelProviders`, `sourceKinds`, `archived`, `cwd`, and `searchTerm` filters. Each returned `thread` includes `status` (`ThreadStatus`), defaulting to `notLoaded` when the thread is not currently loaded.
- `thread/loaded/list` — list the thread ids currently loaded in memory.
- `thread/read` — read a stored thread by id without resuming it; optionally include turns via `includeTurns`. The returned `thread` includes `status` (`ThreadStatus`), defaulting to `notLoaded` when the thread is not currently loaded.
- `thread/turns/list` experimental; page through a stored threads turn history without resuming it; supports cursor-based pagination with `sortDirection`, `nextCursor`, and `backwardsCursor`.
- `thread/turns/list` — page through a stored threads turn history without resuming it; supports cursor-based pagination with `sortDirection`, `nextCursor`, and `backwardsCursor`. Returned turns use `itemsView: "summary"` and include only the first user message and final assistant message in `items` when available.
- `thread/items/list` — page through the full item history for a single turn without resuming the thread; supports cursor-based pagination with `sortDirection`, `nextCursor`, and `backwardsCursor`.
- `thread/item/content/read` — fetch large deferred item content, such as generated image bytes, after a history-loading API returns a placeholder.
- `thread/metadata/update` — patch stored thread metadata in sqlite; currently supports updating persisted `gitInfo` fields and returns the refreshed `thread`.
- `thread/memoryMode/set` — experimental; set a threads persisted memory eligibility to `"enabled"` or `"disabled"` for either a loaded thread or a stored rollout; returns `{}` on success.
- `memory/reset` — experimental; clear the current `CODEX_HOME/memories` directory and reset persisted memory stage data in sqlite while preserving existing thread memory modes; returns `{}` on success.
@@ -283,7 +285,14 @@ Valid `personality` values are `"friendly"`, `"pragmatic"`, and `"none"`. When `
To continue a stored session, call `thread/resume` with the `thread.id` you previously recorded. The response shape matches `thread/start`. When the stored session includes persisted token usage, the server emits `thread/tokenUsage/updated` immediately after the response so clients can render restored usage before the next turn starts. You can also pass the same configuration overrides supported by `thread/start`, including `approvalsReviewer`.
By default, `thread/resume` includes the reconstructed turn history in `thread.turns`. Experimental clients can pass `excludeTurns: true` to return only thread metadata and live resume state, then call `thread/turns/list` separately if they want to page the turn history over the network. In that mode the server also skips replaying restored `thread/tokenUsage/updated`, which avoids rebuilding turns just to attribute historical usage.
App-server supports two history loading modes:
- Fully hydrated history: the default for `thread/resume`, and the behavior for `thread/read` when `includeTurns: true`. The response includes `thread.turns`; each returned turn has `itemsView: "full"` and `items` contains every `ThreadItem` available from persisted app-server history.
- Paged history: pass `excludeTurns: true` to `thread/resume`, or omit `includeTurns` on `thread/read`, to receive only thread metadata. Then call `thread/turns/list` for summary turns and `thread/items/list` to hydrate the full item list for an individual turn.
Both modes can defer large item payloads. Pass `largeContent: "deferred"` when loading history to receive metadata placeholders for large content, such as generated images, and fetch bytes later with `thread/item/content/read`. Omit `largeContent`, or pass `"inline"`, to preserve the legacy behavior of embedding large payloads directly in returned `ThreadItem`s.
In paged history mode, `thread/resume` skips replaying restored `thread/tokenUsage/updated`, which avoids rebuilding turns just to attribute historical usage.
By default, resume uses the latest persisted `model` and `reasoningEffort` values associated with the thread. Supplying any of `model`, `modelProvider`, `config.model`, or `config.model_reasoning_effort` disables that persisted fallback and uses the explicit overrides plus normal config resolution instead.
@@ -407,7 +416,7 @@ Later, after the idle unload timeout:
### Example: Read a thread
Use `thread/read` to fetch a stored thread by id without resuming it. Pass `includeTurns` when you want thread history loaded into `thread.turns`. The returned thread includes `agentNickname` and `agentRole` for AgentControl-spawned thread sub-agents when available.
Use `thread/read` to fetch a stored thread by id without resuming it. By default, this returns metadata only so clients can page history with `thread/turns/list` and `thread/items/list`. Pass `includeTurns` when you want the fully hydrated rollout history loaded into `thread.turns`; returned turns use `itemsView: "full"`. The returned thread includes `agentNickname` and `agentRole` for AgentControl-spawned thread sub-agents when available.
```json
{ "method": "thread/read", "id": 22, "params": { "threadId": "thr_123" } }
@@ -423,11 +432,9 @@ Use `thread/read` to fetch a stored thread by id without resuming it. Pass `incl
} }
```
### Example: List thread turns (experimental)
### Example: List thread turns
Use `thread/turns/list` with `capabilities.experimentalApi = true` to page a stored threads turn history without resuming it. By default, results are sorted descending so clients can start at the present and fetch older turns with `nextCursor`. The response also includes `backwardsCursor`; pass it as `cursor` on a later request with `sortDirection: "asc"` to fetch turns newer than the first item from the earlier page.
Every returned `Turn` includes `itemsView`, which tells clients whether the `items` array was omitted intentionally (`notLoaded`), contains only summary items (`summary`), or contains every item available from persisted app-server history (`full`). Current `thread/turns/list` responses return `full` turns.
Use `thread/turns/list` to page a stored threads turn history without resuming it. This endpoint is the scalable alternative to loading fully hydrated `thread.turns` in `thread/resume` or `thread/read`. By default, results are sorted descending so clients can start at the present and fetch older turns with `nextCursor`. The response also includes `backwardsCursor`; pass it as `cursor` on a later request with `sortDirection: "asc"` to fetch turns newer than the first item from the earlier page. Returned turns use `itemsView: "summary"`; their `items` field contains only the first user message and final assistant message when those items are available.
```json
{ "method": "thread/turns/list", "id": 24, "params": {
@@ -442,6 +449,42 @@ Every returned `Turn` includes `itemsView`, which tells clients whether the `ite
} }
```
### Example: List turn items
Use `thread/items/list` to hydrate a summarized turn returned from `thread/turns/list`. By default, results are sorted ascending so clients can append items in natural turn order. Accumulate pages until `nextCursor` is null, then replace the client-side turns `items` with the collected item list and treat that local turn representation as fully hydrated. Pass `largeContent: "deferred"` to keep large item payloads as placeholders even while hydrating the item list. The response also includes `backwardsCursor`; pass it as `cursor` on a later request with `sortDirection: "desc"` to fetch items before the first item from the earlier page.
```json
{ "method": "thread/items/list", "id": 25, "params": {
"threadId": "thr_123",
"turnId": "turn_456",
"limit": 50,
"sortDirection": "asc"
} }
{ "id": 25, "result": {
"data": [ ... ],
"nextCursor": "newer-items-cursor-or-null",
"backwardsCursor": "older-items-cursor-or-null"
} }
```
### Example: Read deferred item content
Some `ThreadItem`s can contain large payloads. For example, `imageGeneration` items expose structured `content`; when `content.type` is `"deferred"`, render a placeholder from the available metadata and call `thread/item/content/read` when the bytes are needed:
```json
{ "method": "thread/item/content/read", "id": 26, "params": {
"threadId": "thr_123",
"turnId": "turn_456",
"itemId": "ig_789",
"contentId": "img_abc"
} }
{ "id": 26, "result": {
"mimeType": "image/png",
"dataBase64": "...",
"byteLength": 1234567
} }
```
### Example: Update stored thread metadata
Use `thread/metadata/update` to patch sqlite-backed metadata for a thread without resuming it. Today this supports persisted `gitInfo`; omitted fields are left unchanged, while explicit `null` clears a stored value.

View File

@@ -1044,6 +1044,12 @@ impl MessageProcessor {
ClientRequest::ThreadTurnsList { params, .. } => {
self.thread_processor.thread_turns_list(params).await
}
ClientRequest::ThreadItemsList { .. } => Err(invalid_request(
"thread/items/list is not implemented".to_string(),
)),
ClientRequest::ThreadItemContentRead { .. } => Err(invalid_request(
"thread/item/content/read is not implemented".to_string(),
)),
ClientRequest::ThreadShellCommand { params, .. } => {
self.thread_processor
.thread_shell_command(&request_id, params)

View File

@@ -1839,6 +1839,7 @@ impl ThreadRequestProcessor {
) -> Result<ThreadReadResponse, JSONRPCErrorError> {
let ThreadReadParams {
thread_id,
large_content: _,
include_turns,
} = params;
@@ -2022,6 +2023,7 @@ impl ThreadRequestProcessor {
) -> Result<ThreadTurnsListResponse, JSONRPCErrorError> {
let ThreadTurnsListParams {
thread_id,
large_content: _,
cursor,
limit,
sort_direction,
@@ -2268,6 +2270,7 @@ impl ThreadRequestProcessor {
base_instructions,
developer_instructions,
personality,
large_content: _,
exclude_turns,
persist_extended_history: _persist_extended_history,
} = params;
@@ -2879,6 +2882,7 @@ impl ThreadRequestProcessor {
config: cli_overrides,
base_instructions,
developer_instructions,
large_content: _,
ephemeral,
exclude_turns,
persist_extended_history,

View File

@@ -524,6 +524,7 @@ mod thread_processor_behavior_tests {
base_instructions: None,
developer_instructions: None,
personality: None,
large_content: None,
exclude_turns: false,
persist_extended_history: false,
};

View File

@@ -350,6 +350,7 @@ async fn external_agent_config_import_creates_session_rollouts() -> Result<()> {
let request_id = mcp
.send_thread_read_request(ThreadReadParams {
thread_id: thread.id.clone(),
large_content: None,
include_turns: true,
})
.await?;
@@ -409,6 +410,7 @@ async fn external_agent_config_import_creates_session_rollouts() -> Result<()> {
let request_id = mcp
.send_thread_read_request(ThreadReadParams {
thread_id: thread.id,
large_content: None,
include_turns: true,
})
.await?;

View File

@@ -102,6 +102,7 @@ async fn thread_metadata_update_patches_git_branch_and_returns_updated_thread()
let read_id = mcp
.send_thread_read_request(ThreadReadParams {
thread_id: thread.id,
large_content: None,
include_turns: false,
})
.await?;
@@ -465,6 +466,7 @@ async fn thread_metadata_update_can_clear_stored_git_fields() -> Result<()> {
let read_id = mcp
.send_thread_read_request(ThreadReadParams {
thread_id,
large_content: None,
include_turns: false,
})
.await?;

View File

@@ -107,6 +107,7 @@ async fn thread_read_returns_summary_without_turns() -> Result<()> {
let read_id = mcp
.send_thread_read_request(ThreadReadParams {
thread_id: conversation_id.clone(),
large_content: None,
include_turns: false,
})
.await?;
@@ -162,6 +163,7 @@ async fn thread_read_can_include_turns() -> Result<()> {
let read_id = mcp
.send_thread_read_request(ThreadReadParams {
thread_id: conversation_id.clone(),
large_content: None,
include_turns: true,
})
.await?;
@@ -220,6 +222,7 @@ async fn thread_turns_list_can_page_backward_and_forward() -> Result<()> {
let read_id = mcp
.send_thread_turns_list_request(ThreadTurnsListParams {
thread_id: conversation_id.clone(),
large_content: None,
cursor: None,
limit: Some(2),
sort_direction: Some(SortDirection::Desc),
@@ -246,6 +249,7 @@ async fn thread_turns_list_can_page_backward_and_forward() -> Result<()> {
let read_id = mcp
.send_thread_turns_list_request(ThreadTurnsListParams {
thread_id: conversation_id.clone(),
large_content: None,
cursor: Some(next_cursor),
limit: Some(10),
sort_direction: Some(SortDirection::Desc),
@@ -264,6 +268,7 @@ async fn thread_turns_list_can_page_backward_and_forward() -> Result<()> {
let read_id = mcp
.send_thread_turns_list_request(ThreadTurnsListParams {
thread_id: conversation_id,
large_content: None,
cursor: Some(backwards_cursor),
limit: Some(10),
sort_direction: Some(SortDirection::Asc),
@@ -331,6 +336,7 @@ async fn thread_turns_list_reads_store_history_without_rollout_path() -> Result<
request_id: RequestId::Integer(1),
params: ThreadTurnsListParams {
thread_id: thread_id.to_string(),
large_content: None,
cursor: None,
limit: Some(10),
sort_direction: Some(SortDirection::Asc),
@@ -416,6 +422,7 @@ async fn thread_read_loaded_include_turns_reads_store_history_without_rollout_pa
request_id: RequestId::Integer(2),
params: ThreadReadParams {
thread_id: thread.id,
large_content: None,
include_turns: true,
},
})
@@ -536,6 +543,7 @@ async fn thread_read_can_return_archived_threads_by_id() -> Result<()> {
let read_id = mcp
.send_thread_read_request(ThreadReadParams {
thread_id: conversation_id.clone(),
large_content: None,
include_turns: false,
})
.await?;
@@ -580,6 +588,7 @@ async fn thread_turns_list_rejects_cursor_when_anchor_turn_is_rolled_back() -> R
let read_id = mcp
.send_thread_turns_list_request(ThreadTurnsListParams {
thread_id: conversation_id.clone(),
large_content: None,
cursor: None,
limit: Some(2),
sort_direction: Some(SortDirection::Desc),
@@ -604,6 +613,7 @@ async fn thread_turns_list_rejects_cursor_when_anchor_turn_is_rolled_back() -> R
let read_id = mcp
.send_thread_turns_list_request(ThreadTurnsListParams {
thread_id: conversation_id,
large_content: None,
cursor: Some(backwards_cursor),
limit: Some(10),
sort_direction: Some(SortDirection::Asc),
@@ -658,6 +668,7 @@ async fn thread_read_returns_forked_from_id_for_forked_threads() -> Result<()> {
let read_id = mcp
.send_thread_read_request(ThreadReadParams {
thread_id: forked.id,
large_content: None,
include_turns: false,
})
.await?;
@@ -703,6 +714,7 @@ async fn thread_read_loaded_thread_returns_precomputed_path_before_materializati
let read_id = mcp
.send_thread_read_request(ThreadReadParams {
thread_id: thread.id.clone(),
large_content: None,
include_turns: false,
})
.await?;
@@ -770,6 +782,7 @@ async fn thread_name_set_is_reflected_in_read_list_and_resume() -> Result<()> {
let read_id = mcp
.send_thread_read_request(ThreadReadParams {
thread_id: conversation_id.clone(),
large_content: None,
include_turns: false,
})
.await?;
@@ -909,6 +922,7 @@ async fn thread_read_include_turns_rejects_unmaterialized_loaded_thread() -> Res
let read_id = mcp
.send_thread_read_request(ThreadReadParams {
thread_id: thread.id.clone(),
large_content: None,
include_turns: true,
})
.await?;
@@ -960,6 +974,7 @@ async fn thread_turns_list_rejects_unmaterialized_loaded_thread() -> Result<()>
let read_id = mcp
.send_thread_turns_list_request(ThreadTurnsListParams {
thread_id: thread.id,
large_content: None,
cursor: None,
limit: None,
sort_direction: None,
@@ -1035,6 +1050,7 @@ async fn thread_read_reports_system_error_idle_flag_after_failed_turn() -> Resul
let read_id = mcp
.send_thread_read_request(ThreadReadParams {
thread_id: thread.id,
large_content: None,
include_turns: false,
})
.await?;

View File

@@ -1368,6 +1368,7 @@ async fn thread_resume_and_read_interrupt_incomplete_rollout_turn_when_thread_is
let read_id = mcp
.send_thread_read_request(ThreadReadParams {
thread_id: resumed_again.id,
large_content: None,
include_turns: true,
})
.await?;
@@ -1402,6 +1403,7 @@ async fn thread_resume_without_overrides_does_not_change_updated_at_or_mtime() -
let read_id = mcp
.send_thread_read_request(ThreadReadParams {
thread_id: thread_id.clone(),
large_content: None,
include_turns: false,
})
.await?;
@@ -2722,6 +2724,7 @@ async fn start_materialized_thread_and_restart(
let read_id = first_mcp
.send_thread_read_request(ThreadReadParams {
thread_id: thread.id.clone(),
large_content: None,
include_turns: false,
})
.await?;

View File

@@ -133,6 +133,7 @@ async fn thread_shell_command_history_responses_exclude_persisted_command_execut
let read_id = mcp
.send_thread_read_request(ThreadReadParams {
thread_id: thread.id.clone(),
large_content: None,
include_turns: true,
})
.await?;
@@ -148,6 +149,7 @@ async fn thread_shell_command_history_responses_exclude_persisted_command_execut
let turns_list_id = mcp
.send_thread_turns_list_request(ThreadTurnsListParams {
thread_id: thread.id.clone(),
large_content: None,
cursor: None,
limit: None,
sort_direction: Some(SortDirection::Asc),
@@ -321,6 +323,7 @@ async fn thread_shell_command_uses_existing_active_turn() -> Result<()> {
let read_id = mcp
.send_thread_read_request(ThreadReadParams {
thread_id: thread.id,
large_content: None,
include_turns: true,
})
.await?;

View File

@@ -282,6 +282,7 @@ async fn thread_unsubscribe_preserves_cached_status_before_idle_unload() -> Resu
let read_id = mcp
.send_thread_read_request(ThreadReadParams {
thread_id: thread_id.clone(),
large_content: None,
include_turns: false,
})
.await?;