Regenerate app-server bindings for Codex CLI 0.136.0

This commit is contained in:
murashit 2026-06-03 08:45:45 +09:00
parent 189a7f9736
commit f2b83f6a2a
34 changed files with 124 additions and 33 deletions

View file

@ -74,7 +74,7 @@ Codex Panel acts as a local Obsidian client for Codex App Server:
| Key | Version | Policy |
| ------------------------ | --------- | ---------------------------------------------------------- |
| `obsidian.minAppVersion` | `1.12.0` | Track the latest patch for this Obsidian minor. |
| `codex.testedCliVersion` | `0.135.0` | Track app-server compatibility by Codex CLI minor version. |
| `codex.testedCliVersion` | `0.136.0` | Track app-server compatibility by Codex CLI minor version. |
Codex Panel depends on the experimental `codex app-server` API.

File diff suppressed because one or more lines are too long

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.
import type { JsonValue } from "./serde_json/JsonValue";
/**
* Presentation metadata advertised by an initialized MCP server.
*/
export type McpServerInfo = { name: string, title: string | null, version: string, description: string | null, icons: Array<JsonValue> | null, websiteUrl: string | null, };

View file

@ -48,6 +48,7 @@ export type { InternalSessionSource } from "./InternalSessionSource";
export type { LocalShellAction } from "./LocalShellAction";
export type { LocalShellExecAction } from "./LocalShellExecAction";
export type { LocalShellStatus } from "./LocalShellStatus";
export type { McpServerInfo } from "./McpServerInfo";
export type { MessagePhase } from "./MessagePhase";
export type { ModeKind } from "./ModeKind";
export type { NetworkPolicyAmendment } from "./NetworkPolicyAmendment";

View file

@ -1,5 +1,5 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was mechanically normalized after generation by scripts/normalize-generated-types.mjs.
// This file was mechanically normalized after generation by scripts/generate-app-server-types.mjs.
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { ModeKind } from "../ModeKind";

View file

@ -9,5 +9,6 @@ import type { ManagedHooksRequirements } from "./ManagedHooksRequirements";
import type { NetworkRequirements } from "./NetworkRequirements";
import type { ResidencyRequirement } from "./ResidencyRequirement";
import type { SandboxMode } from "./SandboxMode";
import type { WindowsSandboxSetupMode } from "./WindowsSandboxSetupMode";
export type ConfigRequirements = { allowedApprovalPolicies: Array<AskForApproval> | null, allowedApprovalsReviewers: Array<ApprovalsReviewer> | null, allowedSandboxModes: Array<SandboxMode> | null, allowedPermissions: Array<string> | null, allowedWebSearchModes: Array<WebSearchMode> | null, allowManagedHooksOnly: boolean | null, allowAppshots: boolean | null, computerUse: ComputerUseRequirements | null, featureRequirements: { [key in string]?: boolean } | null, hooks: ManagedHooksRequirements | null, enforceResidency: ResidencyRequirement | null, network: NetworkRequirements | null, };
export type ConfigRequirements = { allowedApprovalPolicies: Array<AskForApproval> | null, allowedApprovalsReviewers: Array<ApprovalsReviewer> | null, allowedSandboxModes: Array<SandboxMode> | null, allowedWindowsSandboxImplementations: Array<WindowsSandboxSetupMode> | null, allowedPermissions: Array<string> | null, allowedWebSearchModes: Array<WebSearchMode> | null, allowManagedHooksOnly: boolean | null, allowAppshots: boolean | null, computerUse: ComputerUseRequirements | null, featureRequirements: { [key in string]?: boolean } | null, hooks: ManagedHooksRequirements | null, enforceResidency: ResidencyRequirement | null, network: NetworkRequirements | null, };

View file

@ -1,9 +1,10 @@
// 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 { McpServerInfo } from "../McpServerInfo";
import type { Resource } from "../Resource";
import type { ResourceTemplate } from "../ResourceTemplate";
import type { Tool } from "../Tool";
import type { McpAuthStatus } from "./McpAuthStatus";
export type McpServerStatus = { name: string, tools: { [key in string]?: Tool }, resources: Array<Resource>, resourceTemplates: Array<ResourceTemplate>, authStatus: McpAuthStatus, };
export type McpServerStatus = { name: string, serverInfo: McpServerInfo | null, tools: { [key in string]?: Tool }, resources: Array<Resource>, resourceTemplates: Array<ResourceTemplate>, authStatus: McpAuthStatus, };

View file

@ -2,4 +2,4 @@
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
export type NetworkUnixSocketPermission = "allow" | "none";
export type NetworkUnixSocketPermission = "allow" | "deny";

View file

@ -0,0 +1,6 @@
// 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 { AbsolutePathBuf } from "../AbsolutePathBuf";
export type SkillsExtraRootsSetParams = { extraRoots: Array<AbsolutePathBuf>, };

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 SkillsExtraRootsSetResponse = Record<string, never>;

View file

@ -1,5 +1,5 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was mechanically normalized after generation by scripts/normalize-generated-types.mjs.
// This file was mechanically normalized after generation by scripts/generate-app-server-types.mjs.
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { JsonValue } from "../serde_json/JsonValue";

View file

@ -23,7 +23,7 @@ import type { PatchApplyStatus } from "./PatchApplyStatus";
import type { UserInput } from "./UserInput";
import type { WebSearchAction } from "./WebSearchAction";
export type ThreadItem = { "type": "userMessage", id: string, content: Array<UserInput>, } | { "type": "hookPrompt", id: string, fragments: Array<HookPromptFragment>, } | { "type": "agentMessage", id: string, text: string, phase: MessagePhase | null, memoryCitation: MemoryCitation | null, } | { "type": "plan", id: string, text: string, } | { "type": "reasoning", id: string, summary: Array<string>, content: Array<string>, } | { "type": "commandExecution", id: string,
export type ThreadItem = { "type": "userMessage", id: string, clientId: string | null, content: Array<UserInput>, } | { "type": "hookPrompt", id: string, fragments: Array<HookPromptFragment>, } | { "type": "agentMessage", id: string, text: string, phase: MessagePhase | null, memoryCitation: MemoryCitation | null, } | { "type": "plan", id: string, text: string, } | { "type": "reasoning", id: string, summary: Array<string>, content: Array<string>, } | { "type": "commandExecution", id: string,
/**
* The command to be executed.
*/

View file

@ -1,5 +1,5 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was mechanically normalized after generation by scripts/normalize-generated-types.mjs.
// This file was mechanically normalized after generation by scripts/generate-app-server-types.mjs.
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { RealtimeOutputModality } from "../RealtimeOutputModality";

View file

@ -0,0 +1,19 @@
// 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 { SortDirection } from "./SortDirection";
import type { TurnItemsView } from "./TurnItemsView";
export type ThreadResumeInitialTurnsPageParams = {
/**
* Optional turn page size.
*/
limit?: number | null,
/**
* Optional turn pagination direction; defaults to descending.
*/
sortDirection?: SortDirection | null,
/**
* How much item detail to include for each returned turn; defaults to summary.
*/
itemsView?: TurnItemsView | null, };

View file

@ -1,5 +1,5 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was mechanically normalized after generation by scripts/normalize-generated-types.mjs.
// This file was mechanically normalized after generation by scripts/generate-app-server-types.mjs.
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { Personality } from "../Personality";
@ -8,6 +8,7 @@ import type { JsonValue } from "../serde_json/JsonValue";
import type { ApprovalsReviewer } from "./ApprovalsReviewer";
import type { AskForApproval } from "./AskForApproval";
import type { SandboxMode } from "./SandboxMode";
import type { ThreadResumeInitialTurnsPageParams } from "./ThreadResumeInitialTurnsPageParams";
/**
* There are three ways to resume a thread:
@ -64,6 +65,11 @@ permissions?: string | null, config?: { [key in string]?: JsonValue } | null, ba
* `thread/turns/list` immediately after resuming.
*/
excludeTurns?: boolean,
/**
* When present, include a `thread/turns/list` page in the resume response
* so clients can bootstrap recent turns without a second request.
*/
initialTurnsPage?: ThreadResumeInitialTurnsPageParams | null,
/**
* Deprecated and ignored by app-server. Kept only so older clients can
* continue sending the field while rollout persistence always uses the

View file

@ -8,6 +8,7 @@ import type { ApprovalsReviewer } from "./ApprovalsReviewer";
import type { AskForApproval } from "./AskForApproval";
import type { SandboxPolicy } from "./SandboxPolicy";
import type { Thread } from "./Thread";
import type { TurnsPage } from "./TurnsPage";
export type ThreadResumeResponse = { thread: Thread, model: string, modelProvider: string, serviceTier: string | null, cwd: AbsolutePathBuf,
/**
@ -32,4 +33,8 @@ sandbox: SandboxPolicy,
* Named or implicit built-in profile that produced the active
* permissions, when known.
*/
activePermissionProfile: ActivePermissionProfile | null, reasoningEffort: ReasoningEffort | null, };
activePermissionProfile: ActivePermissionProfile | null, reasoningEffort: ReasoningEffort | null,
/**
* `thread/turns/list` page returned when requested by `initialTurnsPage`.
*/
initialTurnsPage: TurnsPage | null, };

View file

@ -1,5 +1,5 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was mechanically normalized after generation by scripts/normalize-generated-types.mjs.
// This file was mechanically normalized after generation by scripts/generate-app-server-types.mjs.
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { CollaborationMode } from "../CollaborationMode";

View file

@ -1,5 +1,5 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was mechanically normalized after generation by scripts/normalize-generated-types.mjs.
// This file was mechanically normalized after generation by scripts/generate-app-server-types.mjs.
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { Personality } from "../Personality";

View file

@ -1,5 +1,5 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was mechanically normalized after generation by scripts/normalize-generated-types.mjs.
// This file was mechanically normalized after generation by scripts/generate-app-server-types.mjs.
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { CollaborationMode } from "../CollaborationMode";
@ -14,7 +14,7 @@ import type { SandboxPolicy } from "./SandboxPolicy";
import type { TurnEnvironmentParams } from "./TurnEnvironmentParams";
import type { UserInput } from "./UserInput";
export type TurnStartParams = { threadId: string, input: Array<UserInput>,
export type TurnStartParams = { threadId: string, clientUserMessageId?: string | null, input: Array<UserInput>,
/**
* Optional turn-scoped Responses API client metadata.
*/

View file

@ -4,7 +4,7 @@
import type { AdditionalContextEntry } from "./AdditionalContextEntry";
import type { UserInput } from "./UserInput";
export type TurnSteerParams = { threadId: string, input: Array<UserInput>,
export type TurnSteerParams = { threadId: string, clientUserMessageId?: string | null, input: Array<UserInput>,
/**
* Optional turn-scoped Responses API client metadata.
*/

View file

@ -0,0 +1,6 @@
// 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 { Turn } from "./Turn";
export type TurnsPage = { data: Array<Turn>, nextCursor: string | null, backwardsCursor: string | null, };

View file

@ -362,6 +362,8 @@ export type { SkillToolDependency } from "./SkillToolDependency";
export type { SkillsChangedNotification } from "./SkillsChangedNotification";
export type { SkillsConfigWriteParams } from "./SkillsConfigWriteParams";
export type { SkillsConfigWriteResponse } from "./SkillsConfigWriteResponse";
export type { SkillsExtraRootsSetParams } from "./SkillsExtraRootsSetParams";
export type { SkillsExtraRootsSetResponse } from "./SkillsExtraRootsSetResponse";
export type { SkillsListEntry } from "./SkillsListEntry";
export type { SkillsListParams } from "./SkillsListParams";
export type { SkillsListResponse } from "./SkillsListResponse";
@ -434,6 +436,7 @@ export type { ThreadRealtimeStopParams } from "./ThreadRealtimeStopParams";
export type { ThreadRealtimeStopResponse } from "./ThreadRealtimeStopResponse";
export type { ThreadRealtimeTranscriptDeltaNotification } from "./ThreadRealtimeTranscriptDeltaNotification";
export type { ThreadRealtimeTranscriptDoneNotification } from "./ThreadRealtimeTranscriptDoneNotification";
export type { ThreadResumeInitialTurnsPageParams } from "./ThreadResumeInitialTurnsPageParams";
export type { ThreadResumeParams } from "./ThreadResumeParams";
export type { ThreadResumeResponse } from "./ThreadResumeResponse";
export type { ThreadRollbackParams } from "./ThreadRollbackParams";
@ -494,6 +497,7 @@ export type { TurnStartedNotification } from "./TurnStartedNotification";
export type { TurnStatus } from "./TurnStatus";
export type { TurnSteerParams } from "./TurnSteerParams";
export type { TurnSteerResponse } from "./TurnSteerResponse";
export type { TurnsPage } from "./TurnsPage";
export type { UserInput } from "./UserInput";
export type { WarningNotification } from "./WarningNotification";
export type { WebSearchAction } from "./WebSearchAction";

View file

@ -311,7 +311,7 @@ function timestamp(year: number, month: number, day: number, hour: number, minut
}
function userMessage(id: string, text: string): ThreadItem {
return { type: "userMessage", id, content: [{ type: "text", text, text_elements: [] }] };
return { type: "userMessage", id, clientId: null, content: [{ type: "text", text, text_elements: [] }] };
}
function assistantMessage(id: string, text: string): ThreadItem {

View file

@ -51,7 +51,7 @@ describe("thread reference context", () => {
it("extracts user messages and final Codex responses in chronological order", () => {
const turns = referencedThreadTurns([
turn("turn-2", 2, [
{ type: "userMessage", id: "u2", content: [{ type: "text", text: "次の依頼", text_elements: [] }] },
{ type: "userMessage", id: "u2", clientId: null, content: [{ type: "text", text: "次の依頼", text_elements: [] }] },
{
type: "commandExecution",
id: "cmd",
@ -68,7 +68,7 @@ describe("thread reference context", () => {
{ type: "agentMessage", id: "a2", text: "次の回答", phase: "final_answer", memoryCitation: null },
]),
turn("turn-1", 1, [
{ type: "userMessage", id: "u1", content: [{ type: "text", text: "最初の依頼", text_elements: [] }] },
{ type: "userMessage", id: "u1", clientId: null, content: [{ type: "text", text: "最初の依頼", text_elements: [] }] },
{ type: "agentMessage", id: "draft", text: "途中経過", phase: null, memoryCitation: null },
{ type: "agentMessage", id: "a1", text: "最終回答", phase: "final_answer", memoryCitation: null },
]),

View file

@ -69,7 +69,7 @@ function turn(items: ThreadItem[], overrides: Partial<Turn> = {}): Turn {
}
function userMessage(id: string, text: string): ThreadItem {
return { type: "userMessage", id, content: [{ type: "text", text, text_elements: [] }] };
return { type: "userMessage", id, clientId: null, content: [{ type: "text", text, text_elements: [] }] };
}
function assistantMessage(id: string, text: string): ThreadItem {

View file

@ -190,6 +190,7 @@ function threadFixture(id: string, overrides: Partial<Thread> = {}): Thread {
function mcpServerStatus(): McpServerStatus {
return {
name: "github",
serverInfo: null,
tools: {
search_issues: { name: "search_issues", inputSchema: {} },
},

View file

@ -536,7 +536,7 @@ describe("ChatController", () => {
error: null,
itemsView: "full",
items: [
{ type: "userMessage", id: "u1", content: [{ type: "text", text: "hello", text_elements: [] }] },
{ type: "userMessage", id: "u1", clientId: null, content: [{ type: "text", text: "hello", text_elements: [] }] },
{ type: "agentMessage", id: "a1", text: "done", phase: "final_answer", memoryCitation: null },
],
},
@ -1030,7 +1030,7 @@ describe("ChatController", () => {
durationMs: null,
itemsView: "full",
items: [
{ type: "userMessage", id: "u1", content: [{ type: "text", text: "hello", text_elements: [] }] },
{ type: "userMessage", id: "u1", clientId: null, content: [{ type: "text", text: "hello", text_elements: [] }] },
{ type: "agentMessage", id: "a1", text: "done", phase: "final_answer", memoryCitation: null },
],
},
@ -1059,7 +1059,7 @@ describe("ChatController", () => {
durationMs: null,
itemsView: "full",
items: [
{ type: "userMessage", id: "u1", content: [{ type: "text", text: "hello", text_elements: [] }] },
{ type: "userMessage", id: "u1", clientId: null, content: [{ type: "text", text: "hello", text_elements: [] }] },
{ type: "agentMessage", id: "a1", text: "done", phase: "final_answer", memoryCitation: null },
],
};

View file

@ -55,7 +55,12 @@ function fileChangeItem(id: string, turnId: string, path = "src/main.ts"): Displ
describe("thread item conversion preserves app-server semantics", () => {
it("sorts app-server turns oldest first before converting messages", () => {
const userMessage: ThreadItem = { type: "userMessage", id: "u1", content: [{ type: "text", text: "hello", text_elements: [] }] };
const userMessage: ThreadItem = {
type: "userMessage",
id: "u1",
clientId: null,
content: [{ type: "text", text: "hello", text_elements: [] }],
};
const assistantMessage: ThreadItem = { type: "agentMessage", id: "a1", text: "world", phase: null, memoryCitation: null };
const turns: Turn[] = [
{
@ -80,6 +85,7 @@ describe("thread item conversion preserves app-server semantics", () => {
const userMessage: ThreadItem = {
type: "userMessage",
id: "u1",
clientId: null,
content: [
{ type: "text", text: "Read [[Alpha]] and [[Beta]].", text_elements: [] },
{ type: "mention", name: "Alpha", path: "thoughts/Alpha.md" },
@ -113,6 +119,7 @@ describe("thread item conversion preserves app-server semantics", () => {
displayItemFromThreadItem({
type: "userMessage",
id: "u1",
clientId: null,
content: [{ type: "text", text, text_elements: [] }],
}),
).toMatchObject({
@ -132,6 +139,7 @@ describe("thread item conversion preserves app-server semantics", () => {
const item: ThreadItem = {
type: "userMessage",
id: "u1",
clientId: null,
content: [
{ type: "text", text: "Use $obsidian-codex-panel-maintain and $missing.", text_elements: [] },
{ type: "skill", name: "obsidian-codex-panel-maintain", path: "/skills/obsidian-codex-panel-maintain/SKILL.md" },
@ -148,6 +156,7 @@ describe("thread item conversion preserves app-server semantics", () => {
const item: ThreadItem = {
type: "userMessage",
id: "u1",
clientId: null,
content: [
{
type: "text",

View file

@ -6,6 +6,7 @@ import { mcpStatusLines } from "../../../src/features/chat/mcp-status";
function mcpServer(overrides: Partial<McpServerStatus> = {}): McpServerStatus {
return {
name: "github",
serverInfo: null,
tools: {
search_issues: { name: "search_issues", description: null, inputSchema: {} },
fetch_pr: { name: "fetch_pr", description: null, inputSchema: {} },

View file

@ -36,7 +36,12 @@ describe("thread naming", () => {
expect(
namingContextFromTurn(
turn([
{ type: "userMessage", id: "u1", content: [{ type: "text", text: "Codex Panelに自動命名を付けたい", text_elements: [] }] },
{
type: "userMessage",
id: "u1",
clientId: null,
content: [{ type: "text", text: "Codex Panelに自動命名を付けたい", text_elements: [] }],
},
{ type: "agentMessage", id: "a1", text: "実装方針をまとめました。", phase: "final_answer", memoryCitation: null },
]),
),
@ -49,7 +54,7 @@ describe("thread naming", () => {
it("does not build naming context for failed or incomplete turns", () => {
expect(
namingContextFromTurn(
turn([{ type: "userMessage", id: "u1", content: [{ type: "text", text: "hello", text_elements: [] }] }], {
turn([{ type: "userMessage", id: "u1", clientId: null, content: [{ type: "text", text: "hello", text_elements: [] }] }], {
status: "failed",
}),
),
@ -94,7 +99,7 @@ describe("thread naming", () => {
if (cursor === null) {
return {
data: [
turn([{ type: "userMessage", id: "u1", content: [{ type: "text", text: "本文だけ", text_elements: [] }] }], {
turn([{ type: "userMessage", id: "u1", clientId: null, content: [{ type: "text", text: "本文だけ", text_elements: [] }] }], {
id: "turn-1",
}),
],
@ -105,7 +110,12 @@ describe("thread naming", () => {
data: [
turn(
[
{ type: "userMessage", id: "u2", content: [{ type: "text", text: "古い履歴から命名したい", text_elements: [] }] },
{
type: "userMessage",
id: "u2",
clientId: null,
content: [{ type: "text", text: "古い履歴から命名したい", text_elements: [] }],
},
{ type: "agentMessage", id: "a2", text: "古いturnを使って候補を作ります。", phase: "final_answer", memoryCitation: null },
],
{ id: "turn-2" },

View file

@ -158,7 +158,7 @@ function turnFixture(items: ThreadItem[]): Turn {
}
function userMessage(id: string, text: string): ThreadItem {
return { type: "userMessage", id, content: [{ type: "text", text, text_elements: [] }] };
return { type: "userMessage", id, clientId: null, content: [{ type: "text", text, text_elements: [] }] };
}
function assistantMessage(id: string, text: string): ThreadItem {

View file

@ -62,6 +62,7 @@ function responseFixture(thread: Thread): ThreadResumeResponse {
sandbox: { type: "readOnly", networkAccess: false },
activePermissionProfile: null,
reasoningEffort: "high",
initialTurnsPage: null,
};
}

View file

@ -895,7 +895,7 @@ function turnWithUserMessage(text: string) {
id: "turn-1",
startedAt: 1,
completedAt: 2,
items: [{ type: "userMessage", id: "user-1", content: [{ type: "text", text, text_elements: [] }] }],
items: [{ type: "userMessage", id: "user-1", clientId: null, content: [{ type: "text", text, text_elements: [] }] }],
};
}
@ -909,7 +909,7 @@ function completedTurn(turnId: string) {
durationMs: 1,
itemsView: "full",
items: [
{ type: "userMessage", id: "user-1", content: [{ type: "text", text: "hello", text_elements: [] }] },
{ type: "userMessage", id: "user-1", clientId: null, content: [{ type: "text", text: "hello", text_elements: [] }] },
{ type: "agentMessage", id: "agent-1", text: "done", phase: "final_answer", memoryCitation: null },
],
};
@ -948,7 +948,7 @@ function turnCompletedNotification(threadId: string, turnId: string): Extract<Se
durationMs: 1,
itemsView: "full",
items: [
{ type: "userMessage", id: "user-1", content: [{ type: "text", text: "hello", text_elements: [] }] },
{ type: "userMessage", id: "user-1", clientId: null, content: [{ type: "text", text: "hello", text_elements: [] }] },
{ type: "agentMessage", id: "agent-1", text: "done", phase: "final_answer", memoryCitation: null },
],
},

View file

@ -312,7 +312,12 @@ describe("CodexThreadsView", () => {
const threadTurnsList = vi.fn().mockResolvedValue({
data: [
turnFixture([
{ type: "userMessage", id: "u1", content: [{ type: "text", text: "threads viewのrenameを直したい", text_elements: [] }] },
{
type: "userMessage",
id: "u1",
clientId: null,
content: [{ type: "text", text: "threads viewのrenameを直したい", text_elements: [] }],
},
{ type: "agentMessage", id: "a1", text: "rename UIを調整しました。", phase: "final_answer", memoryCitation: null },
]),
],