@jrkropp/codex-js 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # @jrkropp/codex-js
2
2
 
3
+ ## 0.1.4
4
+
5
+ Expose the full React chat lifecycle helper surface from the public React subpath.
6
+
3
7
  ## 0.1.3
4
8
 
5
9
  Expose deliberate low-level Codex and T3 mirror subpaths so host adapters can migrate off the vendored workspace package.
package/README.md CHANGED
@@ -23,8 +23,8 @@ endorsed by, or sponsored by OpenAI.
23
23
 
24
24
  | Segment | Purpose | Source of Truth |
25
25
  | --- | --- | --- |
26
- | `src/upstream/codex-rs` | Codex runtime, protocol, thread store, tools, model transport, and app-server protocol primitives. | `.reference/codex/codex-rs` |
27
- | `src/upstream/t3code` | T3Chat web UI primitives: composer, timeline, model picker, image previews, and chat helpers. | `.reference/t3code` |
26
+ | `src/upstream/codex-rs` | Codex runtime, protocol, thread store, tools, model transport, and app-server protocol primitives. | `external/codex/codex-rs` |
27
+ | `src/upstream/t3code` | T3Chat web UI primitives: composer, timeline, model picker, image previews, and chat helpers. | `external/t3code` |
28
28
  | `src/runtime` | Package-owned Codex lifecycle contracts, store and reader boundaries, app-server boundary, and route-neutral thread state. | Package-owned |
29
29
  | `src/components` | Stable public React component surface built from the T3 upstream source. | Package-owned |
30
30
  | `src/shadcn` | Package-owned standard shadcn primitives used for optional chat layout composition. | Package-owned |
@@ -61,6 +61,7 @@ type CodexChatLifecycleOptions = {
61
61
  threadReader?: ThreadReader;
62
62
  threadId: ThreadId | string;
63
63
  };
64
+ declare function createDefaultThreadStartParams({ threadId, }: CodexChatLifecycleBuildThreadStartParamsInput): CodexChatLifecycleThreadStartParams;
64
65
  declare function createDefaultTurnStartParams({ clientMessageId, imageUrls, interactionMode, runtimeMode, sendContext, threadId, }: CodexChatLifecycleBuildTurnStartParamsInput): CodexChatLifecycleTurnStartParams;
65
66
  type CodexChatLifecycle = {
66
67
  activeThread: StoredThread | null;
@@ -378,4 +379,4 @@ declare function CodexChatProvider({ appServer, children, threadReader, threadId
378
379
  declare function useCodexChatRuntime(): ChatRuntime;
379
380
  declare function useCodexChat(options: CodexChatRuntimeOptions): ChatRuntime;
380
381
 
381
- export { type CodexChatRuntimeOptions as A, type CodexChatViewComposerProps as B, CodexChat as C, type CodexChatViewLifecycleProps as D, type CodexChatViewManualProps as E, createCodexChatRenderState as F, createDefaultTurnStartParams as G, useCodexChat as H, useCodexChatLifecycle as I, useCodexChatRuntime as J, type MessagePart as M, type SendMessageInput as S, type ThreadReader as T, CodexChatLayout as a, type CodexChatLayoutProps as b, type CodexChatProps as c, CodexChatProvider as d, type CodexChatProviderProps as e, CodexChatSidebar as f, type CodexChatSidebarProps as g, CodexChatView as h, type CodexChatViewProps as i, type ChatMessage as j, type ChatRuntime as k, type ChatRuntimeStatus as l, type CodexChatComposerCommand as m, type CodexChatComposerCommandName as n, type CodexChatComposerSkill as o, type CodexChatInteractionMode as p, type CodexChatLifecycle as q, type CodexChatLifecycleOptions as r, type CodexChatModelOption as s, type CodexChatPendingRequest as t, type CodexChatPendingRequestRenderContext as u, type CodexChatPendingUserInputRenderContext as v, type CodexChatProposedPlan as w, type CodexChatProviderStatus as x, type CodexChatRenderState as y, type CodexChatRuntimeMode as z };
382
+ export { type CodexChatProposedPlan as A, type CodexChatProviderStatus as B, CodexChat as C, type CodexChatRenderState as D, type CodexChatRuntimeMode as E, type CodexChatRuntimeOptions as F, type CodexChatViewComposerProps as G, type CodexChatViewLifecycleProps as H, type CodexChatViewManualProps as I, createCodexChatRenderState as J, createDefaultThreadStartParams as K, createDefaultTurnStartParams as L, type MessagePart as M, useCodexChat as N, useCodexChatLifecycle as O, useCodexChatRuntime as P, type SendMessageInput as S, type ThreadReader as T, CodexChatLayout as a, type CodexChatLayoutProps as b, type CodexChatProps as c, CodexChatProvider as d, type CodexChatProviderProps as e, CodexChatSidebar as f, type CodexChatSidebarProps as g, CodexChatView as h, type CodexChatViewProps as i, type ChatMessage as j, type ChatRuntime as k, type ChatRuntimeStatus as l, type CodexChatComposerCommand as m, type CodexChatComposerCommandName as n, type CodexChatComposerSkill as o, type CodexChatInteractionMode as p, type CodexChatLifecycle as q, type CodexChatLifecycleBuildThreadStartParamsInput as r, type CodexChatLifecycleBuildTurnStartParamsInput as s, type CodexChatLifecycleOptions as t, type CodexChatLifecycleSendControls as u, type CodexChatLifecycleSendOptions as v, type CodexChatModelOption as w, type CodexChatPendingRequest as x, type CodexChatPendingRequestRenderContext as y, type CodexChatPendingUserInputRenderContext as z };
@@ -3,7 +3,7 @@ import { Sidebar, SidebarProvider, SidebarInset } from './chunk-FN3SWHRH.js';
3
3
  import { ThreadEventStore, AppServerSession, threadEventSnapshotHasStarted } from './chunk-6ZMJ34KE.js';
4
4
  import { thread_token_usage_updated_notification_from_rollout_items } from './chunk-V4BMZWBM.js';
5
5
  import { asThreadId } from './chunk-LWQNX4LI.js';
6
- import { createContext, useMemo, useState, useRef, useCallback, useEffect, createElement, Fragment as Fragment$1, useContext } from 'react';
6
+ import { createContext, useState, useCallback, useMemo, useRef, useEffect, createElement, Fragment as Fragment$1, useContext } from 'react';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
8
 
9
9
  function createLocalDispatchSnapshot(threadState) {
@@ -88,9 +88,19 @@ function deriveAssistantStreaming(threadState) {
88
88
  function deriveChatLifecycleWorkingState(input) {
89
89
  return Boolean(input.threadState?.activeTurnIds.length) || input.isSendBusy || input.connectionStatus === "connecting" || input.connectionStatus === "reconnecting";
90
90
  }
91
+ function threadHasStarted(threadState) {
92
+ return Boolean(
93
+ threadState && (threadState.turns.some((turn) => turn.items.length > 0) || threadState.activeTurnIds.length > 0 || threadState.errors.length > 0 || threadState.pendingRequests.length > 0)
94
+ );
95
+ }
91
96
  function threadTurnItemIds(threadState) {
92
97
  return threadState?.turns.flatMap((turn) => turn.items.map((item) => item.id)) ?? [];
93
98
  }
99
+ function createDefaultThreadStartParams({
100
+ threadId
101
+ }) {
102
+ return { threadId };
103
+ }
94
104
  function createDefaultTurnStartParams({
95
105
  clientMessageId,
96
106
  imageUrls,
@@ -1968,6 +1978,6 @@ function CodexComposer() {
1968
1978
  );
1969
1979
  }
1970
1980
 
1971
- export { CodexChat, CodexChatLayout, CodexChatProvider, CodexChatSidebar, CodexChatView, CodexComposer, CodexMessages, CodexThread, createCodexChatRenderState, createDefaultTurnStartParams, useCodexChat, useCodexChatLifecycle, useCodexChatRuntime };
1972
- //# sourceMappingURL=chunk-ILXA6HLX.js.map
1973
- //# sourceMappingURL=chunk-ILXA6HLX.js.map
1981
+ export { CodexChat, CodexChatLayout, CodexChatProvider, CodexChatSidebar, CodexChatView, CodexComposer, CodexMessages, CodexThread, createCodexChatRenderState, createDefaultThreadStartParams, createDefaultTurnStartParams, createLocalDispatchSnapshot, deriveActiveWorkStartedAt, deriveAssistantStreaming, deriveChatLifecycleWorkingState, hasServerAcknowledgedLocalDispatch, threadHasStarted, useCodexChat, useCodexChatLifecycle, useCodexChatRuntime, useLocalDispatchState };
1982
+ //# sourceMappingURL=chunk-W7S6HFCQ.js.map
1983
+ //# sourceMappingURL=chunk-W7S6HFCQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/lifecycle.ts","../src/hooks/chat-lifecycle.tsx","../src/components/codex-chat-render-state.ts","../src/components/codex-chat-view.tsx","../src/components/codex-chat.tsx","../src/components/codex-chat-layout.tsx","../src/components/chat-runtime.tsx","../src/components/primitives.tsx"],"names":["useMemo","useState","useCallback","abortController","useRef","createElement","Fragment","normalizeThreadId"],"mappings":"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","file":"chunk-W7S6HFCQ.js","sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\n\nimport type { ThreadEventSnapshot } from \"../runtime\";\n\ntype ChatLifecycleThreadState = Pick<\n\tThreadEventSnapshot,\n\t\"activeTurnIds\" | \"errors\" | \"pendingRequests\" | \"turns\"\n>;\ntype ChatLifecycleConnectionStatus = ThreadEventSnapshot[\"connectionStatus\"];\n\nexport type LocalDispatchSnapshot = {\n\terrorCount: number;\n\titemIds: readonly string[];\n\trunningTurnIds: readonly string[];\n\tstartedAt: string;\n};\n\nexport function createLocalDispatchSnapshot(\n\tthreadState: ChatLifecycleThreadState | null,\n): LocalDispatchSnapshot {\n\treturn {\n\t\terrorCount: threadState?.errors.length ?? 0,\n\t\titemIds: threadTurnItemIds(threadState),\n\t\trunningTurnIds: [...(threadState?.activeTurnIds ?? [])],\n\t\tstartedAt: new Date().toISOString(),\n\t};\n}\n\nexport function hasServerAcknowledgedLocalDispatch(input: {\n\thasPendingRequest: boolean;\n\tlocalDispatch: LocalDispatchSnapshot | null;\n\truntimeError: string | null;\n\tthreadState: ChatLifecycleThreadState | null;\n}): boolean {\n\tconst localDispatch = input.localDispatch;\n\tif (!localDispatch) {\n\t\treturn false;\n\t}\n\tif (input.hasPendingRequest || Boolean(input.runtimeError)) {\n\t\treturn true;\n\t}\n\n\tconst runningTurnIds = input.threadState?.activeTurnIds ?? [];\n\tif (\n\t\trunningTurnIds.some(\n\t\t\t(turnId) => !localDispatch.runningTurnIds.includes(turnId),\n\t\t)\n\t) {\n\t\treturn true;\n\t}\n\n\tif (\n\t\tthreadTurnItemIds(input.threadState).some(\n\t\t\t(itemId) => !localDispatch.itemIds.includes(itemId),\n\t\t)\n\t) {\n\t\treturn true;\n\t}\n\n\treturn (input.threadState?.errors.length ?? 0) > localDispatch.errorCount;\n}\n\nexport function useLocalDispatchState(input: {\n\thasPendingRequest: boolean;\n\truntimeError: string | null;\n\tthreadState: ChatLifecycleThreadState | null;\n}) {\n\tconst [localDispatch, setLocalDispatch] =\n\t\tuseState<LocalDispatchSnapshot | null>(null);\n\n\tconst beginLocalDispatch = useCallback(() => {\n\t\tsetLocalDispatch((current) =>\n\t\t\tcurrent ?? createLocalDispatchSnapshot(input.threadState),\n\t\t);\n\t}, [input.threadState]);\n\n\tconst resetLocalDispatch = useCallback(() => {\n\t\tsetLocalDispatch(null);\n\t}, []);\n\n\tconst serverAcknowledgedLocalDispatch = useMemo(\n\t\t() =>\n\t\t\thasServerAcknowledgedLocalDispatch({\n\t\t\t\thasPendingRequest: input.hasPendingRequest,\n\t\t\t\tlocalDispatch,\n\t\t\t\truntimeError: input.runtimeError,\n\t\t\t\tthreadState: input.threadState,\n\t\t\t}),\n\t\t[\n\t\t\tinput.hasPendingRequest,\n\t\t\tinput.runtimeError,\n\t\t\tinput.threadState,\n\t\t\tlocalDispatch,\n\t\t],\n\t);\n\n\treturn {\n\t\tbeginLocalDispatch,\n\t\tisSendBusy: localDispatch !== null && !serverAcknowledgedLocalDispatch,\n\t\tlocalDispatch,\n\t\tlocalDispatchStartedAt: localDispatch?.startedAt ?? null,\n\t\tresetLocalDispatch,\n\t\tserverAcknowledgedLocalDispatch,\n\t};\n}\n\nexport function deriveActiveWorkStartedAt(input: {\n\tisWorking: boolean;\n\truntimeStartedAt: string | null;\n\tsendStartedAt: string | null;\n}): string | null {\n\tif (!input.isWorking) {\n\t\treturn null;\n\t}\n\treturn input.sendStartedAt ?? input.runtimeStartedAt;\n}\n\nexport function deriveAssistantStreaming(\n\tthreadState: ChatLifecycleThreadState | null,\n): boolean {\n\tif (!threadState || threadState.activeTurnIds.length === 0) {\n\t\treturn false;\n\t}\n\n\tconst activeTurnIds = new Set(threadState.activeTurnIds);\n\treturn threadState.turns.some(\n\t\t(turn) =>\n\t\t\tactiveTurnIds.has(turn.id) &&\n\t\t\tturn.items.some(\n\t\t\t\t(item) => item.type === \"agentMessage\" && item.text.length > 0,\n\t\t\t),\n\t);\n}\n\nexport function deriveChatLifecycleWorkingState(input: {\n\tconnectionStatus: ChatLifecycleConnectionStatus;\n\tisSendBusy: boolean;\n\tthreadState: ChatLifecycleThreadState | null;\n}): boolean {\n\treturn (\n\t\tBoolean(input.threadState?.activeTurnIds.length) ||\n\t\tinput.isSendBusy ||\n\t\tinput.connectionStatus === \"connecting\" ||\n\t\tinput.connectionStatus === \"reconnecting\"\n\t);\n}\n\nexport function threadHasStarted(\n\tthreadState: ChatLifecycleThreadState | null,\n): boolean {\n\treturn Boolean(\n\t\tthreadState &&\n\t\t\t(threadState.turns.some((turn) => turn.items.length > 0) ||\n\t\t\t\tthreadState.activeTurnIds.length > 0 ||\n\t\t\t\tthreadState.errors.length > 0 ||\n\t\t\t\tthreadState.pendingRequests.length > 0),\n\t);\n}\n\nfunction threadTurnItemIds(\n\tthreadState: ChatLifecycleThreadState | null,\n): string[] {\n\treturn threadState?.turns.flatMap((turn) => turn.items.map((item) => item.id)) ?? [];\n}\n","import {\n\tuseCallback,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\n\nimport {\n\tAppServerSession,\n\tasThreadId,\n\ttype AppServerEvent,\n\ttype JSONRPCErrorError,\n\ttype Result,\n\ttype RequestId,\n\ttype ServerNotification,\n\ttype ServerRequest,\n\ttype StoredThread,\n\ttype Thread,\n\tThreadEventStore,\n\tthreadEventSnapshotHasStarted,\n\ttype ThreadEventSnapshot,\n\ttype ThreadId,\n\ttype ThreadStartParams,\n\ttype TurnStartParams,\n\ttype UserInput as ProtocolUserInput,\n} from \"../runtime\";\nimport type { CodexAppServer, ThreadReader } from \"./thread-reader\";\nimport {\n\tbuildOptimisticUserMessageTurnItem,\n\ttype ChatComposerSubmitPayload,\n} from \"../upstream/t3code/apps/web/src\";\nimport type { CollaborationMode } from \"../upstream/codex-rs/core/src/config-types\";\nimport type { UserMessageTurnItem } from \"../upstream/codex-rs/core/src/items\";\nimport { thread_token_usage_updated_notification_from_rollout_items } from \"../upstream/codex-rs/app-server/src/request_processors/token_usage_replay\";\nimport {\n\tderiveActiveWorkStartedAt,\n\tderiveAssistantStreaming,\n\tderiveChatLifecycleWorkingState,\n\tuseLocalDispatchState,\n} from \"./lifecycle\";\n\nexport type CodexChatLifecycleBuildThreadStartParamsInput = {\n\tthreadId: ThreadId;\n};\n\nexport type CodexChatLifecycleThreadStartParams = ThreadStartParams & {\n\tthreadId?: ThreadId | string;\n};\n\nexport type CodexChatLifecycleBuildTurnStartParamsInput = {\n\tclientMessageId: string;\n\timageUrls: string[];\n\tinteractionMode?: \"default\" | \"plan\";\n\truntimeMode?: \"approval-required\" | \"auto-accept-edits\" | \"full-access\";\n\tsendContext: ChatComposerSubmitPayload;\n\tthreadId: ThreadId;\n};\n\nexport type CodexChatLifecycleTurnStartParams = TurnStartParams & {\n\tcollaborationMode?: CollaborationMode;\n\tcollaboration_mode?: CollaborationMode;\n\tclientMessageId?: string;\n};\n\nexport type CodexChatLifecycleSendControls = {\n\tclearComposer: () => void;\n\tprepareForOptimisticAppend: () => Promise<void>;\n\trestoreComposer: (sendContext: ChatComposerSubmitPayload) => void;\n};\n\nexport type CodexChatLifecycleSendOptions = {\n\tinteractionMode?: \"default\" | \"plan\";\n\truntimeMode?: \"approval-required\" | \"auto-accept-edits\" | \"full-access\";\n};\n\nexport type CodexChatLifecycleOptions = {\n\tbuildThreadStartParams?: (\n\t\tinput: CodexChatLifecycleBuildThreadStartParamsInput,\n\t) => CodexChatLifecycleThreadStartParams;\n\tbuildTurnStartParams?: (\n\t\tinput: CodexChatLifecycleBuildTurnStartParamsInput,\n\t) => CodexChatLifecycleTurnStartParams;\n\tconnectOnMount?: boolean;\n\tinitialState?: ThreadEventSnapshot | null;\n\tisRecoverableConnectionError?: (error: Error) => boolean;\n\tonActiveThread?: (thread: StoredThread | null) => void;\n\tonRuntimeError?: (error: Error) => void;\n\tonServerRequest?: (request: ServerRequest) => void;\n\tonState?: (state: ThreadEventSnapshot | null) => void;\n\tonSubmittedUserMessage?: (state: ThreadEventSnapshot) => void;\n\tonThreadListChanged?: () => void;\n\tonThreadStarted?: (state: ThreadEventSnapshot) => void;\n\tappServer: CodexAppServer;\n\tthreadReader?: ThreadReader;\n\tthreadId: ThreadId | string;\n};\n\nexport function createDefaultThreadStartParams({\n\tthreadId,\n}: CodexChatLifecycleBuildThreadStartParamsInput): CodexChatLifecycleThreadStartParams {\n\treturn { threadId };\n}\n\nexport function createDefaultTurnStartParams({\n\tclientMessageId,\n\timageUrls,\n\tinteractionMode = \"default\",\n\truntimeMode,\n\tsendContext,\n\tthreadId,\n}: CodexChatLifecycleBuildTurnStartParamsInput): CodexChatLifecycleTurnStartParams {\n\tconst collaborationMode =\n\t\tinteractionMode === \"plan\"\n\t\t\t? ({\n\t\t\t\t\tmode: \"plan\",\n\t\t\t\t\tsettings: {\n\t\t\t\t\t\tmodel: sendContext.model,\n\t\t\t\t\t\treasoning_effort: sendContext.effort ?? null,\n\t\t\t\t\t\tdeveloper_instructions: null,\n\t\t\t\t\t},\n\t\t\t\t} satisfies CollaborationMode)\n\t\t\t: undefined;\n\treturn {\n\t\tclientMessageId,\n\t\t...(collaborationMode ? { collaborationMode } : {}),\n\t\t...runtimeModeToTurnPolicy(runtimeMode),\n\t\teffort: sendContext.effort,\n\t\tinput: [\n\t\t\t...sendContext.items.map(composerUserInputToProtocolUserInput),\n\t\t\t...imageUrls.map((url): ProtocolUserInput => ({ type: \"image\", url })),\n\t\t],\n\t\tmodel: sendContext.model,\n\t\tthreadId,\n\t};\n}\n\nfunction runtimeModeToTurnPolicy(\n\truntimeMode: CodexChatLifecycleBuildTurnStartParamsInput[\"runtimeMode\"],\n): Pick<CodexChatLifecycleTurnStartParams, \"approvalPolicy\" | \"sandboxPolicy\"> {\n\tif (runtimeMode === \"approval-required\") {\n\t\treturn {\n\t\t\tapprovalPolicy: \"on-request\",\n\t\t\tsandboxPolicy: {\n\t\t\t\ttype: \"workspaceWrite\",\n\t\t\t\twritableRoots: [],\n\t\t\t\tnetworkAccess: false,\n\t\t\t\texcludeTmpdirEnvVar: false,\n\t\t\t\texcludeSlashTmp: false,\n\t\t\t},\n\t\t};\n\t}\n\tif (runtimeMode === \"auto-accept-edits\") {\n\t\treturn {\n\t\t\tapprovalPolicy: \"on-failure\",\n\t\t\tsandboxPolicy: {\n\t\t\t\ttype: \"workspaceWrite\",\n\t\t\t\twritableRoots: [],\n\t\t\t\tnetworkAccess: false,\n\t\t\t\texcludeTmpdirEnvVar: false,\n\t\t\t\texcludeSlashTmp: false,\n\t\t\t},\n\t\t};\n\t}\n\tif (runtimeMode === \"full-access\") {\n\t\treturn {\n\t\t\tapprovalPolicy: \"never\",\n\t\t\tsandboxPolicy: { type: \"dangerFullAccess\" },\n\t\t};\n\t}\n\treturn {};\n}\n\nexport type CodexChatLifecycle = {\n\tactiveThread: StoredThread | null;\n\tactiveWorkStartedAt: string | null;\n\tassistantStreaming: boolean;\n\tcompact: () => Promise<boolean>;\n\tconnectionStatus: ThreadEventSnapshot[\"connectionStatus\"] | \"idle\";\n\tinterrupt: () => Promise<boolean>;\n\tisSendBusy: boolean;\n\tisSending: boolean;\n\tisWorking: boolean;\n\tpendingPermissionRequestActive: boolean;\n\tpendingUserInputActive: boolean;\n\treconnect: () => void;\n\truntimeError: string | null;\n\tsendComposerMessage: (\n\t\tsendContext: ChatComposerSubmitPayload,\n\t\tcontrols: CodexChatLifecycleSendControls,\n\t\toptions?: CodexChatLifecycleSendOptions,\n\t) => Promise<void>;\n\tresolveServerRequest: (\n\t\trequestId: RequestId,\n\t\tresponse: Result,\n\t) => Promise<boolean>;\n\trejectServerRequest: (\n\t\trequestId: RequestId,\n\t\terror: JSONRPCErrorError,\n\t) => Promise<boolean>;\n\tthreadSnapshot: ThreadEventSnapshot | null;\n\tthreadId: ThreadId;\n\tturnRunning: boolean;\n\tvisibleOptimisticUserMessages: readonly UserMessageTurnItem[];\n};\n\ntype OptimisticUserMessage = {\n\titem: UserMessageTurnItem;\n\tthreadId: ThreadId;\n};\n\ntype PendingComposerSend = {\n\toptimisticItemId: string;\n\trestore: (() => void) | null;\n\tserverUserMessageAcknowledged: boolean;\n\ttargetThreadId: ThreadId;\n};\n\ntype ThreadRuntimeError = {\n\tmessage: string;\n\tthreadId: ThreadId;\n};\n\nexport function useCodexChatLifecycle(\n\toptions: CodexChatLifecycleOptions,\n): CodexChatLifecycle {\n\tconst threadId = useMemo(() => normalizeThreadId(options.threadId), [options.threadId]);\n\tconst [threadSnapshot, setThreadSnapshot] = useState<ThreadEventSnapshot | null>(\n\t\toptions.initialState?.thread?.id === threadId ? options.initialState : null,\n\t);\n\tconst [activeThread, setActiveThread] = useState<StoredThread | null>(null);\n\tconst [runtimeError, setRuntimeError] = useState<ThreadRuntimeError | null>(null);\n\tconst [isSending, setIsSending] = useState(false);\n\tconst [reconnectToken, setReconnectToken] = useState(0);\n\tconst [optimisticUserMessages, setOptimisticUserMessages] = useState<\n\t\tOptimisticUserMessage[]\n\t>([]);\n\tconst [activeRuntimeStartedAt, setActiveRuntimeStartedAt] = useState<string | null>(\n\t\tnull,\n\t);\n\tconst activeRuntimeStartedAtRef = useRef<string | null>(null);\n\tconst localDispatchStartedAtRef = useRef<string | null>(null);\n\tconst pendingComposerSendRef = useRef<PendingComposerSend | null>(null);\n\tconst sendInFlightRef = useRef(false);\n\tconst threadStoreRef = useRef<ThreadEventStore | null>(\n\t\toptions.initialState?.thread?.id === threadId\n\t\t\t? ThreadEventStore.fromThread(options.initialState.thread)\n\t\t\t: null,\n\t);\n\tconst threadSnapshotRef = useRef<ThreadEventSnapshot | null>(threadSnapshot);\n\tconst activeEventsIteratorRef = useRef<AsyncIterator<AppServerEvent> | null>(null);\n\tconst lifecycleGenerationRef = useRef(0);\n\tconst lifecycleKeyRef = useRef<string | null>(null);\n\tconst subscriptionAbortRef = useRef<AbortController | null>(null);\n\tconst appServerSession = useMemo(\n\t\t() => new AppServerSession(options.appServer),\n\t\t[options.appServer],\n\t);\n\tconst lifecycleKey = `${threadId}:${options.connectOnMount === false ? \"draft\" : \"server\"}`;\n\tif (lifecycleKeyRef.current !== lifecycleKey) {\n\t\tlifecycleKeyRef.current = lifecycleKey;\n\t\tlifecycleGenerationRef.current += 1;\n\t}\n\tconst visibleRuntimeError =\n\t\truntimeError?.threadId === threadId ? runtimeError.message : null;\n\n\tconst closeActiveSubscription = useCallback(() => {\n\t\tsubscriptionAbortRef.current?.abort();\n\t\tsubscriptionAbortRef.current = null;\n\t\tconst iterator = activeEventsIteratorRef.current;\n\t\tactiveEventsIteratorRef.current = null;\n\t\tvoid iterator?.return?.();\n\t}, []);\n\n\tconst visibleOptimisticUserMessages = useMemo(\n\t\t() =>\n\t\t\toptimisticUserMessages\n\t\t\t\t.filter((message) => message.threadId === threadId)\n\t\t\t\t.map((message) => message.item),\n\t\t[optimisticUserMessages, threadId],\n\t);\n\tconst setProtocolConnectionStatus = useCallback(\n\t\t(status: ThreadEventSnapshot[\"connectionStatus\"]) => {\n\t\t\tconst store = threadStoreRef.current;\n\t\t\tif (!store) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst snapshot = store.setConnectionStatus(status);\n\t\t\tthreadSnapshotRef.current = snapshot;\n\t\t\tsetThreadSnapshot(snapshot);\n\t\t},\n\t\t[],\n\t);\n\tconst hasPendingRequest =\n\t\tBoolean(threadSnapshot?.pendingRequests.length);\n\tconst {\n\t\tbeginLocalDispatch,\n\t\tisSendBusy,\n\t\tlocalDispatchStartedAt,\n\t\tresetLocalDispatch,\n\t\tserverAcknowledgedLocalDispatch,\n\t} = useLocalDispatchState({\n\t\thasPendingRequest,\n\t\truntimeError: visibleRuntimeError,\n\t\tthreadState: threadSnapshot,\n\t});\n\n\tuseEffect(() => {\n\t\tthreadSnapshotRef.current = threadSnapshot;\n\t\toptions.onState?.(threadSnapshot);\n\t}, [options, threadSnapshot]);\n\n\tuseEffect(() => {\n\t\tactiveRuntimeStartedAtRef.current = activeRuntimeStartedAt;\n\t}, [activeRuntimeStartedAt]);\n\n\tuseEffect(() => {\n\t\tlocalDispatchStartedAtRef.current = localDispatchStartedAt;\n\t}, [localDispatchStartedAt]);\n\n\tconst removeOptimisticUserMessage = useCallback((itemId: string) => {\n\t\tsetOptimisticUserMessages((current) =>\n\t\t\tcurrent.filter((message) => message.item.id !== itemId),\n\t\t);\n\t}, []);\n\n\tconst restorePendingComposerSend = useCallback(() => {\n\t\tconst pendingComposerSend = pendingComposerSendRef.current;\n\t\tif (!pendingComposerSend) {\n\t\t\treturn;\n\t\t}\n\t\tremoveOptimisticUserMessage(pendingComposerSend.optimisticItemId);\n\t\tpendingComposerSend.restore?.();\n\t}, [removeOptimisticUserMessage]);\n\n\tconst handleRuntimeError = useCallback(\n\t\t(error: Error) => {\n\t\t\toptions.onRuntimeError?.(error);\n\t\t\tif (\n\t\t\t\toptions.isRecoverableConnectionError?.(error) &&\n\t\t\t\t!pendingComposerSendRef.current\n\t\t\t) {\n\t\t\t\tresetLocalDispatch();\n\t\t\t\tsetActiveRuntimeStartedAt(null);\n\t\t\t\tsetIsSending(false);\n\t\t\t\tsetProtocolConnectionStatus(\"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetRuntimeError({ message: error.message, threadId });\n\t\t\tif (pendingComposerSendRef.current) {\n\t\t\t\tif (!pendingComposerSendRef.current.serverUserMessageAcknowledged) {\n\t\t\t\t\trestorePendingComposerSend();\n\t\t\t\t}\n\t\t\t\tpendingComposerSendRef.current = null;\n\t\t\t\tsendInFlightRef.current = false;\n\t\t\t\tsetIsSending(false);\n\t\t\t\tresetLocalDispatch();\n\t\t\t\tsetActiveRuntimeStartedAt(null);\n\t\t\t}\n\t\t\tsetProtocolConnectionStatus(\"error\");\n\t\t},\n\t\t[\n\t\t\toptions,\n\t\t\tresetLocalDispatch,\n\t\t\trestorePendingComposerSend,\n\t\t\tsetProtocolConnectionStatus,\n\t\t\tthreadId,\n\t\t],\n\t);\n\n\tconst handleSubmittedUserMessage = useCallback(\n\t\t(state: ThreadEventSnapshot) => {\n\t\t\tconst pendingComposerSend = pendingComposerSendRef.current;\n\t\t\tif (pendingComposerSend) {\n\t\t\t\tpendingComposerSendRef.current = {\n\t\t\t\t\t...pendingComposerSend,\n\t\t\t\t\tserverUserMessageAcknowledged: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tsendInFlightRef.current = false;\n\t\t\tsetIsSending(false);\n\t\t\toptions.onThreadListChanged?.();\n\t\t\toptions.onSubmittedUserMessage?.(state);\n\t\t\tpendingComposerSendRef.current = null;\n\t\t},\n\t\t[options],\n\t);\n\n\tconst handleThreadStarted = useCallback(\n\t\t(state: ThreadEventSnapshot) => {\n\t\t\tconst runtimeStartedAt =\n\t\t\t\tactiveRuntimeStartedAtRef.current ??\n\t\t\t\tlocalDispatchStartedAtRef.current ??\n\t\t\t\tnew Date().toISOString();\n\t\t\tsetActiveRuntimeStartedAt((current) => current ?? runtimeStartedAt);\n\t\t\tif (pendingComposerSendRef.current) {\n\t\t\t\tpendingComposerSendRef.current = null;\n\t\t\t\tsendInFlightRef.current = false;\n\t\t\t\tsetIsSending(false);\n\t\t\t\toptions.onThreadListChanged?.();\n\t\t\t}\n\t\t\toptions.onThreadStarted?.(state);\n\t\t},\n\t\t[options],\n\t);\n\n\tconst applyServerNotification = useCallback(\n\t\t(notification: ServerNotification) => {\n\t\t\tconst store = threadStoreRef.current;\n\t\t\tif (!store) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst next = store.applyNotification(notification);\n\t\t\tthreadSnapshotRef.current = next;\n\t\t\tsetThreadSnapshot(next);\n\t\t\tif (\n\t\t\t\tnotification.method === \"item/completed\" &&\n\t\t\t\tnotification.params.item.type === \"userMessage\"\n\t\t\t) {\n\t\t\t\twindow.setTimeout(() => handleSubmittedUserMessage(next), 0);\n\t\t\t}\n\t\t\tif (threadEventSnapshotHasStarted(next)) {\n\t\t\t\twindow.setTimeout(() => handleThreadStarted(next), 0);\n\t\t\t}\n\t\t},\n\t\t[handleSubmittedUserMessage, handleThreadStarted],\n\t);\n\tconst applyServerRequest = useCallback(\n\t\t(request: ServerRequest) => {\n\t\t\tconst store = threadStoreRef.current;\n\t\t\tif (!store) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst next = store.applyRequest(request);\n\t\t\tthreadSnapshotRef.current = next;\n\t\t\tsetThreadSnapshot(next);\n\t\t},\n\t\t[],\n\t);\n\n\tconst connectThread = useCallback(\n\t\tasync (input: { force?: boolean } = {}) => {\n\t\t\tconst generation = lifecycleGenerationRef.current;\n\t\t\tconst isCurrentLifecycle = (abortController: AbortController) =>\n\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\tlifecycleGenerationRef.current === generation;\n\t\t\tcloseActiveSubscription();\n\t\t\tconst abortController = new AbortController();\n\t\t\tsubscriptionAbortRef.current = abortController;\n\t\t\ttry {\n\t\t\t\tsetRuntimeError(null);\n\t\t\t\tlet resumeThread: Thread | null = null;\n\t\t\t\tif (options.buildThreadStartParams) {\n\t\t\t\t\tconst response = await appServerSession.threadStart(\n\t\t\t\t\t\toptions.buildThreadStartParams({ threadId }),\n\t\t\t\t\t);\n\t\t\t\t\tresumeThread = response.thread;\n\t\t\t\t} else {\n\t\t\t\t\tconst response = await appServerSession.threadResume({ threadId });\n\t\t\t\t\tresumeThread = response.thread;\n\t\t\t\t}\n\t\t\t\tif (!isCurrentLifecycle(abortController)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst currentSnapshot = threadSnapshotRef.current;\n\t\t\t\tconst handoffSnapshot =\n\t\t\t\t\tcurrentSnapshot?.thread?.id === threadId &&\n\t\t\t\t\tthreadEventSnapshotHasStarted(currentSnapshot)\n\t\t\t\t\t\t? currentSnapshot\n\t\t\t\t\t\t: options.initialState?.thread?.id === threadId\n\t\t\t\t\t\t\t? options.initialState\n\t\t\t\t\t\t\t: null;\n\t\t\t\tconst shouldDeferVisibleResumeSnapshot =\n\t\t\t\t\tBoolean(pendingComposerSendRef.current) &&\n\t\t\t\t\t!handoffSnapshot &&\n\t\t\t\t\tcurrentSnapshot === null;\n\t\t\t\tconst handoffWorkStartedAt =\n\t\t\t\t\tactiveRuntimeStartedAtRef.current ?? localDispatchStartedAtRef.current;\n\t\t\t\tif (handoffWorkStartedAt) {\n\t\t\t\t\tsetActiveRuntimeStartedAt((current) => current ?? handoffWorkStartedAt);\n\t\t\t\t}\n\t\t\t\tif (!handoffSnapshot) {\n\t\t\t\t\tthreadStoreRef.current = ThreadEventStore.fromThread(resumeThread);\n\t\t\t\t}\n\t\t\t\tconst storedThread = options.threadReader\n\t\t\t\t\t? await options.threadReader.readThread({\n\t\t\t\t\t\t\tthread_id: threadId,\n\t\t\t\t\t\t\tinclude_archived: false,\n\t\t\t\t\t\t\tinclude_history: false,\n\t\t\t\t\t\t})\n\t\t\t\t\t: storedThreadFromAppServerThread(resumeThread);\n\t\t\t\tconst tokenUsageReplay = options.threadReader\n\t\t\t\t\t? await storedTokenUsageReplayNotification({\n\t\t\t\t\t\t\tthread: resumeThread,\n\t\t\t\t\t\t\tthreadId,\n\t\t\t\t\t\t\tthreadReader: options.threadReader,\n\t\t\t\t\t\t})\n\t\t\t\t\t: null;\n\t\t\t\tif (!isCurrentLifecycle(abortController)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetActiveThread(storedThread);\n\t\t\t\toptions.onActiveThread?.(storedThread);\n\t\t\t\tconst store = threadStoreRef.current ?? ThreadEventStore.fromThread(resumeThread);\n\t\t\t\tthreadStoreRef.current = store;\n\t\t\t\tif (tokenUsageReplay) {\n\t\t\t\t\tstore.applyNotification(tokenUsageReplay);\n\t\t\t\t}\n\t\t\t\tconst nextSnapshot = store.setConnectionStatus(\n\t\t\t\t\tinput.force ? \"reconnecting\" : \"connecting\",\n\t\t\t\t);\n\t\t\t\tif (!shouldDeferVisibleResumeSnapshot) {\n\t\t\t\t\tthreadSnapshotRef.current = nextSnapshot;\n\t\t\t\t\tsetThreadSnapshot(nextSnapshot);\n\t\t\t\t\tif (threadEventSnapshotHasStarted(nextSnapshot)) {\n\t\t\t\t\t\twindow.setTimeout(() => handleThreadStarted(nextSnapshot), 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst events = appServerSession.events();\n\t\t\t\tif (!events) {\n\t\t\t\t\tsetProtocolConnectionStatus(\"connected\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (shouldDeferVisibleResumeSnapshot) {\n\t\t\t\t\tstore.setConnectionStatus(\"connected\");\n\t\t\t\t} else {\n\t\t\t\t\tsetProtocolConnectionStatus(\"connected\");\n\t\t\t\t}\n\t\t\t\tconst iterator = events[Symbol.asyncIterator]();\n\t\t\t\tactiveEventsIteratorRef.current = iterator;\n\t\t\t\tvoid (async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\twhile (true) {\n\t\t\t\t\t\t\tconst result = await iterator.next();\n\t\t\t\t\t\t\tif (!isCurrentLifecycle(abortController)) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (result.done) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tapplyAppServerEvent(result.value, {\n\t\t\t\t\t\t\t\tapplyServerNotification,\n\t\t\t\t\t\t\t\tapplyServerRequest,\n\t\t\t\t\t\t\t\tonServerRequest: options.onServerRequest,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isCurrentLifecycle(abortController)) {\n\t\t\t\t\t\t\tsetProtocolConnectionStatus(\"closed\");\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (isCurrentLifecycle(abortController)) {\n\t\t\t\t\t\t\thandleRuntimeError(\n\t\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t\t? error\n\t\t\t\t\t\t\t\t\t: new Error(\"Codex chat connection failed.\"),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif (activeEventsIteratorRef.current === iterator) {\n\t\t\t\t\t\t\tactiveEventsIteratorRef.current = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t} catch (error) {\n\t\t\t\tif (isCurrentLifecycle(abortController)) {\n\t\t\t\t\thandleRuntimeError(\n\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t? error\n\t\t\t\t\t\t\t: new Error(\"Codex chat could not connect.\"),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tappServerSession,\n\t\t\tapplyServerNotification,\n\t\t\tapplyServerRequest,\n\t\t\tcloseActiveSubscription,\n\t\t\thandleRuntimeError,\n\t\t\thandleThreadStarted,\n\t\t\toptions,\n\t\t\tsetProtocolConnectionStatus,\n\t\t\tthreadId,\n\t\t],\n\t);\n\n\tuseEffect(() => {\n\t\tif (options.connectOnMount === false) {\n\t\t\tcloseActiveSubscription();\n\t\t\tsetActiveThread(null);\n\t\t\toptions.onActiveThread?.(null);\n\t\t\tsetRuntimeError(null);\n\t\t\tif (!pendingComposerSendRef.current) {\n\t\t\t\tsetActiveRuntimeStartedAt(null);\n\t\t\t\tthreadStoreRef.current = null;\n\t\t\t\tthreadSnapshotRef.current = null;\n\t\t\t\tsetThreadSnapshot(null);\n\t\t\t\tsetIsSending(false);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tvoid connectThread({ force: reconnectToken > 0 });\n\t\treturn () => {\n\t\t\tcloseActiveSubscription();\n\t\t};\n\t}, [closeActiveSubscription, connectThread, options, options.connectOnMount, reconnectToken]);\n\n\tuseEffect(() => {\n\t\tif (!threadSnapshot?.turns.length || optimisticUserMessages.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst serverUserMessages = threadSnapshot.turns.flatMap((turn) =>\n\t\t\tturn.items.flatMap((item) =>\n\t\t\t\titem.type === \"userMessage\"\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcontentFingerprint: protocolUserInputFingerprint(item.content),\n\t\t\t\t\t\t\t\tid: item.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]\n\t\t\t\t\t: [],\n\t\t\t),\n\t\t);\n\t\tconst serverUserMessageIds = new Set(\n\t\t\tserverUserMessages.map((message) => message.id),\n\t\t);\n\t\tconst serverUserMessageFingerprints = new Set(\n\t\t\tserverUserMessages.map((message) => message.contentFingerprint),\n\t\t);\n\t\tconst acknowledgedOptimisticIds = optimisticUserMessages.flatMap((message) => {\n\t\t\tif (message.threadId !== threadId) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tif (serverUserMessageIds.has(message.item.id)) {\n\t\t\t\treturn [message.item.id];\n\t\t\t}\n\t\t\treturn serverUserMessageFingerprints.has(\n\t\t\t\tcoreUserInputFingerprint(message.item.content),\n\t\t\t)\n\t\t\t\t? [message.item.id]\n\t\t\t\t: [];\n\t\t});\n\t\tif (acknowledgedOptimisticIds.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst timerId = window.setTimeout(() => {\n\t\t\tsetOptimisticUserMessages((current) =>\n\t\t\t\tcurrent.filter(\n\t\t\t\t\t(message) => !acknowledgedOptimisticIds.includes(message.item.id),\n\t\t\t\t),\n\t\t\t);\n\t\t}, 0);\n\n\t\treturn () => window.clearTimeout(timerId);\n\t}, [optimisticUserMessages, threadId, threadSnapshot?.turns]);\n\n\tuseEffect(() => {\n\t\tconst timerId = window.setTimeout(() => {\n\t\t\tsetOptimisticUserMessages((current) => {\n\t\t\t\tconst next = current.filter((message) => message.threadId === threadId);\n\t\t\t\treturn next.length === current.length ? current : next;\n\t\t\t});\n\t\t}, 0);\n\n\t\treturn () => window.clearTimeout(timerId);\n\t}, [threadId]);\n\n\tuseEffect(() => {\n\t\tif (!serverAcknowledgedLocalDispatch) {\n\t\t\treturn;\n\t\t}\n\t\tconst timerId = window.setTimeout(() => {\n\t\t\tresetLocalDispatch();\n\t\t\tsendInFlightRef.current = false;\n\t\t\tsetIsSending(false);\n\t\t}, 0);\n\t\treturn () => window.clearTimeout(timerId);\n\t}, [resetLocalDispatch, serverAcknowledgedLocalDispatch]);\n\n\tconst connectionStatus = threadSnapshot?.connectionStatus ?? \"idle\";\n\tconst turnRunning = Boolean(threadSnapshot?.activeTurnIds.length);\n\tconst assistantStreaming = deriveAssistantStreaming(threadSnapshot);\n\tconst isWorking = deriveChatLifecycleWorkingState({\n\t\tconnectionStatus,\n\t\tisSendBusy,\n\t\tthreadState: threadSnapshot,\n\t});\n\tconst activeWorkStartedAt = deriveActiveWorkStartedAt({\n\t\tisWorking,\n\t\truntimeStartedAt: activeRuntimeStartedAt,\n\t\tsendStartedAt: localDispatchStartedAt,\n\t});\n\n\tuseEffect(() => {\n\t\tif (isWorking || activeRuntimeStartedAt === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst timerId = window.setTimeout(() => {\n\t\t\tsetActiveRuntimeStartedAt(null);\n\t\t}, 0);\n\t\treturn () => window.clearTimeout(timerId);\n\t}, [activeRuntimeStartedAt, isWorking]);\n\n\tconst resolveServerRequest = useCallback(\n\t\tasync (requestId: RequestId, response: Result): Promise<boolean> => {\n\t\t\ttry {\n\t\t\t\tawait appServerSession.resolveServerRequest(requestId, response);\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tsetRuntimeError({\n\t\t\t\t\tmessage:\n\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t\t: \"Codex server-request response failed.\",\n\t\t\t\t\tthreadId,\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\t[appServerSession, threadId],\n\t);\n\tconst rejectServerRequest = useCallback(\n\t\tasync (\n\t\t\trequestId: RequestId,\n\t\t\terror: JSONRPCErrorError,\n\t\t): Promise<boolean> => {\n\t\t\ttry {\n\t\t\t\tawait appServerSession.rejectServerRequest(requestId, error);\n\t\t\t\treturn true;\n\t\t\t} catch (rejectError) {\n\t\t\t\tsetRuntimeError({\n\t\t\t\t\tmessage:\n\t\t\t\t\t\trejectError instanceof Error\n\t\t\t\t\t\t\t? rejectError.message\n\t\t\t\t\t\t\t: \"Codex server-request rejection failed.\",\n\t\t\t\t\tthreadId,\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\t[appServerSession, threadId],\n\t);\n\n\tconst sendComposerMessage = useCallback(\n\t\tasync (\n\t\t\tsendContext: ChatComposerSubmitPayload,\n\t\t\tcontrols: CodexChatLifecycleSendControls,\n\t\t\tsendOptions: CodexChatLifecycleSendOptions = {},\n\t\t) => {\n\t\t\tif (sendInFlightRef.current || isSending || isSendBusy) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (sendContext.items.length === 0 && sendContext.files.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsendInFlightRef.current = true;\n\t\t\tsetIsSending(true);\n\t\t\tbeginLocalDispatch();\n\t\t\ttry {\n\t\t\t\tconst imageUrls = await Promise.all(sendContext.files.map(fileToDataUrl));\n\t\t\t\tconst clientMessageId = defaultId();\n\t\t\t\tconst turnStartParams = (\n\t\t\t\t\toptions.buildTurnStartParams ?? createDefaultTurnStartParams\n\t\t\t\t)({\n\t\t\t\t\tclientMessageId,\n\t\t\t\t\timageUrls,\n\t\t\t\t\tinteractionMode: sendOptions.interactionMode,\n\t\t\t\t\truntimeMode: sendOptions.runtimeMode,\n\t\t\t\t\tsendContext,\n\t\t\t\t\tthreadId,\n\t\t\t\t});\n\t\t\t\tconst optimisticItemId = optimisticUserMessageIdForClientMessageId(\n\t\t\t\t\tclientMessageId,\n\t\t\t\t);\n\t\t\t\tconst optimisticMessage = buildOptimisticUserMessageTurnItem({\n\t\t\t\t\tid: optimisticItemId,\n\t\t\t\t\timageUrls,\n\t\t\t\t\titems: sendContext.items,\n\t\t\t\t});\n\t\t\t\tpendingComposerSendRef.current = {\n\t\t\t\t\toptimisticItemId,\n\t\t\t\t\trestore: () => controls.restoreComposer(sendContext),\n\t\t\t\t\tserverUserMessageAcknowledged: false,\n\t\t\t\t\ttargetThreadId: threadId,\n\t\t\t\t};\n\t\t\t\tawait controls.prepareForOptimisticAppend();\n\t\t\t\tsetOptimisticUserMessages((current) => [\n\t\t\t\t\t...current.filter((message) => message.item.id !== optimisticItemId),\n\t\t\t\t\t{ item: optimisticMessage, threadId },\n\t\t\t\t]);\n\t\t\t\tcontrols.clearComposer();\n\t\t\t\toptions.onThreadListChanged?.();\n\t\t\t\tif (options.connectOnMount === false || !threadSnapshotRef.current) {\n\t\t\t\t\tawait connectThread({ force: true });\n\t\t\t\t}\n\t\t\t\tconst activeTurnId = currentActiveTurnId(threadSnapshotRef.current);\n\t\t\t\tif (activeTurnId) {\n\t\t\t\t\tawait appServerSession.turnSteer({\n\t\t\t\t\t\texpectedTurnId: activeTurnId,\n\t\t\t\t\t\tinput: turnStartParams.input,\n\t\t\t\t\t\tthreadId,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tawait appServerSession.turnStart(turnStartParams);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\trestorePendingComposerSend();\n\t\t\t\tpendingComposerSendRef.current = null;\n\t\t\t\tsendInFlightRef.current = false;\n\t\t\t\tresetLocalDispatch();\n\t\t\t\tsetActiveRuntimeStartedAt(null);\n\t\t\t\tsetIsSending(false);\n\t\t\t\tsetRuntimeError({\n\t\t\t\t\tmessage:\n\t\t\t\t\t\terror instanceof Error ? error.message : \"Codex could not send the message.\",\n\t\t\t\t\tthreadId,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tbeginLocalDispatch,\n\t\t\tappServerSession,\n\t\t\tconnectThread,\n\t\t\tisSendBusy,\n\t\t\tisSending,\n\t\t\toptions,\n\t\t\tresetLocalDispatch,\n\t\t\trestorePendingComposerSend,\n\t\t\tthreadId,\n\t\t],\n\t);\n\n\tconst interrupt = useCallback(async () => {\n\t\tconst turnId = currentActiveTurnId(threadSnapshotRef.current);\n\t\tif (!turnId) {\n\t\t\tsetRuntimeError({\n\t\t\t\tmessage: \"Codex has no active response to stop.\",\n\t\t\t\tthreadId,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t\ttry {\n\t\t\tawait appServerSession.turnInterrupt({ threadId, turnId });\n\t\t} catch (error) {\n\t\t\tsetRuntimeError({\n\t\t\t\tmessage:\n\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: \"Codex could not stop the active response.\",\n\t\t\t\tthreadId,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t\tif (pendingComposerSendRef.current) {\n\t\t\tremoveOptimisticUserMessage(pendingComposerSendRef.current.optimisticItemId);\n\t\t}\n\t\tpendingComposerSendRef.current = null;\n\t\tsendInFlightRef.current = false;\n\t\tresetLocalDispatch();\n\t\tsetActiveRuntimeStartedAt(null);\n\t\tsetIsSending(false);\n\t\treturn true;\n\t}, [appServerSession, removeOptimisticUserMessage, resetLocalDispatch, threadId]);\n\n\tconst compact = useCallback(async () => {\n\t\tif (turnRunning || isSending || isSendBusy) {\n\t\t\tsetRuntimeError({\n\t\t\t\tmessage: \"Wait for the current response to finish before compacting.\",\n\t\t\t\tthreadId,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t\ttry {\n\t\t\tawait appServerSession.threadCompactStart({ threadId });\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tsetRuntimeError({\n\t\t\t\tmessage: error instanceof Error ? error.message : \"Codex compact failed.\",\n\t\t\t\tthreadId,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t}, [appServerSession, isSendBusy, isSending, threadId, turnRunning]);\n\n\tconst reconnect = useCallback(() => {\n\t\tcloseActiveSubscription();\n\t\tif (pendingComposerSendRef.current) {\n\t\t\tremoveOptimisticUserMessage(pendingComposerSendRef.current.optimisticItemId);\n\t\t}\n\t\tpendingComposerSendRef.current = null;\n\t\tsendInFlightRef.current = false;\n\t\tsetIsSending(false);\n\t\tresetLocalDispatch();\n\t\tsetActiveRuntimeStartedAt(null);\n\t\tsetRuntimeError(null);\n\t\tsetProtocolConnectionStatus(\"reconnecting\");\n\t\tsetReconnectToken((current) => current + 1);\n\t}, [\n\t\tcloseActiveSubscription,\n\t\tremoveOptimisticUserMessage,\n\t\tresetLocalDispatch,\n\t\tsetProtocolConnectionStatus,\n\t]);\n\n\treturn {\n\t\tactiveThread,\n\t\tactiveWorkStartedAt,\n\t\tassistantStreaming,\n\t\tcompact,\n\t\tconnectionStatus,\n\t\tinterrupt,\n\t\tisSendBusy,\n\t\tisSending,\n\t\tisWorking,\n\t\tpendingPermissionRequestActive: Boolean(\n\t\t\tthreadSnapshot?.pendingRequests.some(\n\t\t\t\t(request) => request.method === \"item/permissions/requestApproval\",\n\t\t\t),\n\t\t),\n\t\tpendingUserInputActive: Boolean(\n\t\t\tthreadSnapshot?.pendingRequests.some(\n\t\t\t\t(request) => request.method === \"item/tool/requestUserInput\",\n\t\t\t),\n\t\t),\n\t\treconnect,\n\t\trejectServerRequest,\n\t\truntimeError: visibleRuntimeError,\n\t\tsendComposerMessage,\n\t\tresolveServerRequest,\n\t\tthreadSnapshot,\n\t\tthreadId,\n\t\tturnRunning,\n\t\tvisibleOptimisticUserMessages,\n\t};\n}\n\nfunction normalizeThreadId(threadId: ThreadId | string): ThreadId {\n\treturn typeof threadId === \"string\" ? asThreadId(threadId) : threadId;\n}\n\nfunction optimisticUserMessageIdForClientMessageId(clientMessageId: string): string {\n\treturn `user-${clientMessageId}`;\n}\n\nfunction fileToDataUrl(file: File): Promise<string> {\n\tconst blob = new Blob([file], { type: file.type || \"image/png\" });\n\n\treturn new Promise((resolve, reject) => {\n\t\tconst reader = new FileReader();\n\t\treader.onload = () => resolve(String(reader.result));\n\t\treader.onerror = () => reject(reader.error ?? new Error(\"Could not read file.\"));\n\t\treader.readAsDataURL(blob);\n\t});\n}\n\nfunction defaultId(): string {\n\treturn globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random()}`;\n}\n\nfunction currentActiveTurnId(snapshot: ThreadEventSnapshot | null): string | null {\n\treturn snapshot?.activeTurnIds.at(-1) ?? null;\n}\n\nfunction protocolUserInputFingerprint(items: readonly ProtocolUserInput[]): string {\n\treturn JSON.stringify(items.map(protocolUserInputFingerprintPart));\n}\n\nfunction protocolUserInputFingerprintPart(item: ProtocolUserInput) {\n\tswitch (item.type) {\n\t\tcase \"text\":\n\t\t\treturn { text: item.text, type: \"text\" };\n\t\tcase \"image\":\n\t\t\treturn { type: \"image\", url: item.url };\n\t\tcase \"localImage\":\n\t\t\treturn { path: item.path, type: \"localImage\" };\n\t\tcase \"skill\":\n\t\t\treturn { name: item.name, path: item.path, type: \"skill\" };\n\t\tcase \"mention\":\n\t\t\treturn { name: item.name, path: item.path, type: \"mention\" };\n\t}\n}\n\nfunction coreUserInputFingerprint(\n\titems: readonly UserMessageTurnItem[\"content\"][number][],\n): string {\n\treturn JSON.stringify(items.map(coreUserInputFingerprintPart));\n}\n\nfunction coreUserInputFingerprintPart(\n\titem: UserMessageTurnItem[\"content\"][number],\n) {\n\tswitch (item.type) {\n\t\tcase \"text\":\n\t\t\treturn { text: item.text, type: \"text\" };\n\t\tcase \"image\":\n\t\t\treturn { type: \"image\", url: item.image_url };\n\t\tcase \"local_image\":\n\t\t\treturn { path: item.path, type: \"localImage\" };\n\t\tcase \"skill\":\n\t\t\treturn { name: item.name, path: item.path, type: \"skill\" };\n\t\tcase \"mention\":\n\t\t\treturn { name: item.name, path: item.path, type: \"mention\" };\n\t}\n}\n\nfunction composerUserInputToProtocolUserInput(\n\titem: ChatComposerSubmitPayload[\"items\"][number],\n): ProtocolUserInput {\n\tswitch (item.type) {\n\t\tcase \"text\":\n\t\t\treturn {\n\t\t\t\ttext: item.text,\n\t\t\t\ttext_elements: (item.text_elements ?? []).map((element) => ({\n\t\t\t\t\tbyteRange: element.byte_range,\n\t\t\t\t\tplaceholder: element.placeholder ?? null,\n\t\t\t\t})),\n\t\t\t\ttype: \"text\",\n\t\t\t};\n\t\tcase \"image\":\n\t\t\treturn { type: \"image\", url: item.image_url };\n\t\tcase \"local_image\":\n\t\t\treturn { path: item.path, type: \"localImage\" };\n\t\tcase \"skill\":\n\t\t\treturn { name: item.name, path: item.path, type: \"skill\" };\n\t\tcase \"mention\":\n\t\t\treturn { name: item.name, path: item.path, type: \"mention\" };\n\t}\n}\n\nasync function storedTokenUsageReplayNotification(input: {\n\tthread: Thread;\n\tthreadId: ThreadId;\n\tthreadReader: ThreadReader;\n}): Promise<ServerNotification | null> {\n\ttry {\n\t\tconst history = await input.threadReader.loadHistory({\n\t\t\tthread_id: input.threadId,\n\t\t\tinclude_archived: false,\n\t\t});\n\t\treturn thread_token_usage_updated_notification_from_rollout_items({\n\t\t\trolloutItems: history.items,\n\t\t\tthread: input.thread,\n\t\t\tthreadId: input.threadId,\n\t\t});\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction storedThreadFromAppServerThread(thread: Thread): StoredThread {\n\treturn {\n\t\tthread_id: asThreadId(thread.id),\n\t\trollout_path: thread.path ?? null,\n\t\tforked_from_id: thread.forkedFromId ? asThreadId(thread.forkedFromId) : null,\n\t\tpreview: thread.preview,\n\t\tname: thread.name,\n\t\tmodel_provider: thread.modelProvider,\n\t\tmodel: null,\n\t\treasoning_effort: null,\n\t\tcreated_at: new Date(thread.createdAt * 1000).toISOString(),\n\t\tupdated_at: new Date(thread.updatedAt * 1000).toISOString(),\n\t\tarchived_at: null,\n\t\tcwd: thread.cwd,\n\t\tcli_version: thread.cliVersion,\n\t\tsource: typeof thread.source === \"string\" ? thread.source : \"custom\",\n\t\tthread_source: typeof thread.threadSource === \"string\" ? thread.threadSource : null,\n\t\tagent_nickname: thread.agentNickname,\n\t\tagent_role: thread.agentRole,\n\t\tgit_info: thread.gitInfo,\n\t\thistory: null,\n\t};\n}\n\nfunction applyAppServerEvent(\n\tevent: AppServerEvent,\n\thandlers: {\n\t\tapplyServerNotification: (notification: ServerNotification) => void;\n\t\tapplyServerRequest: (request: ServerRequest) => void;\n\t\tonServerRequest?: (request: ServerRequest) => void;\n\t},\n) {\n\tswitch (event.type) {\n\t\tcase \"server_notification\":\n\t\t\thandlers.applyServerNotification(event.notification);\n\t\t\treturn;\n\t\tcase \"server_request\":\n\t\t\thandlers.applyServerRequest(event.request);\n\t\t\thandlers.onServerRequest?.(event.request);\n\t\t\treturn;\n\t\tcase \"disconnected\":\n\t\t\tthrow new Error(event.message);\n\t\tcase \"lagged\":\n\t\t\treturn;\n\t}\n}\n","import type { ReactNode } from \"react\";\n\nimport type {\n\tJSONRPCErrorError,\n\tRequestId,\n\tResult,\n\tServerRequest,\n\tThreadEventSnapshot,\n\tThreadItem,\n\tTurn,\n} from \"../runtime\";\nimport type { MessagesTimelineProps } from \"../upstream/t3code/apps/web/src/components/chat/MessagesTimeline\";\nimport type {\n\tTurn as T3Turn,\n\tTurnStatus as T3TurnStatus,\n} from \"../upstream/codex-rs/core/src/thread-history-builder\";\nimport type {\n\tTurnItem as T3TurnItem,\n\tUserMessageTurnItem,\n} from \"../upstream/codex-rs/core/src/items\";\nimport type {\n\tDynamicToolCallRequest,\n\tUserInput as CoreUserInput,\n} from \"../upstream/codex-rs/core/src/protocol\";\nimport type { RequestPermissionsEvent } from \"../upstream/codex-rs/core/src/request_permissions\";\nimport type { UserInput as AppServerUserInput } from \"../upstream/codex-rs/app-server-protocol/schema/typescript/v2\";\nimport {\n\tnormalizePendingUserInputQuestion,\n\ttype PendingUserInput,\n} from \"../upstream/t3code/apps/web/src/pendingUserInput\";\nimport { proposedPlanTitle } from \"../upstream/t3code/apps/web/src/components/chat/proposed-plan\";\nimport {\n\tderiveContextWindowSnapshotFromTokenUsage,\n\ttype ContextWindowSnapshot,\n} from \"../upstream/t3code/apps/web/src/lib/contextWindow\";\n\nexport type CodexChatInteractionMode = \"default\" | \"plan\";\n\nexport type CodexChatProposedPlan = {\n\tid: string;\n\tplanMarkdown: string;\n\ttitle: string | null;\n\tturnId: string;\n};\n\nexport type CodexChatPendingUserInputRequest = {\n\tkind: \"userInput\";\n\titemId: string;\n\tpendingUserInput: PendingUserInput;\n\trequest: Extract<ServerRequest, { method: \"item/tool/requestUserInput\" }>;\n\trequestId: RequestId;\n\tthreadId: string;\n\tturnId: string;\n};\n\nexport type CodexChatPendingPermissionRequest = {\n\tkind: \"permissions\";\n\tcomposerRequest: RequestPermissionsEvent;\n\trequest: Extract<ServerRequest, { method: \"item/permissions/requestApproval\" }>;\n\trequestId: RequestId;\n\tthreadId: string;\n\tturnId: string | null;\n};\n\nexport type CodexChatPendingDynamicToolCallRequest = {\n\tkind: \"dynamicToolCall\";\n\tcompatRequest: DynamicToolCallRequest;\n\trequest: Extract<ServerRequest, { method: \"item/tool/call\" }>;\n\trequestId: RequestId;\n\tthreadId: string;\n\tturnId: string | null;\n};\n\nexport type CodexChatPendingMcpElicitationRequest = {\n\tkind: \"mcpElicitation\";\n\trequest: Extract<ServerRequest, { method: \"mcpServer/elicitation/request\" }>;\n\trequestId: RequestId;\n\tthreadId: string | null;\n\tturnId: string | null;\n};\n\nexport type CodexChatPendingCommandApprovalRequest = {\n\tkind: \"commandApproval\";\n\trequest: Extract<ServerRequest, { method: \"item/commandExecution/requestApproval\" }>;\n\trequestId: RequestId;\n\tthreadId: string;\n\tturnId: string | null;\n};\n\nexport type CodexChatPendingFileChangeApprovalRequest = {\n\tkind: \"fileChangeApproval\";\n\trequest: Extract<ServerRequest, { method: \"item/fileChange/requestApproval\" }>;\n\trequestId: RequestId;\n\tthreadId: string;\n\tturnId: string | null;\n};\n\nexport type CodexChatPendingAuthRefreshRequest = {\n\tkind: \"chatgptAuthTokensRefresh\";\n\trequest: Extract<ServerRequest, { method: \"account/chatgptAuthTokens/refresh\" }>;\n\trequestId: RequestId;\n\tthreadId: null;\n\tturnId: null;\n};\n\nexport type CodexChatPendingApplyPatchApprovalRequest = {\n\tkind: \"applyPatchApproval\";\n\trequest: Extract<ServerRequest, { method: \"applyPatchApproval\" }>;\n\trequestId: RequestId;\n\tthreadId: string;\n\tturnId: null;\n};\n\nexport type CodexChatPendingExecCommandApprovalRequest = {\n\tkind: \"execCommandApproval\";\n\trequest: Extract<ServerRequest, { method: \"execCommandApproval\" }>;\n\trequestId: RequestId;\n\tthreadId: string;\n\tturnId: null;\n};\n\nexport type CodexChatPendingRequest =\n\t| CodexChatPendingApplyPatchApprovalRequest\n\t| CodexChatPendingAuthRefreshRequest\n\t| CodexChatPendingCommandApprovalRequest\n\t| CodexChatPendingDynamicToolCallRequest\n\t| CodexChatPendingExecCommandApprovalRequest\n\t| CodexChatPendingFileChangeApprovalRequest\n\t| CodexChatPendingMcpElicitationRequest\n\t| CodexChatPendingPermissionRequest\n\t| CodexChatPendingUserInputRequest;\n\nexport type CodexChatRenderLifecycleState = {\n\tactiveWorkStartedAt: string | null;\n\tisWorking: boolean;\n\truntimeError: string | null;\n\tvisibleOptimisticUserMessages: readonly UserMessageTurnItem[];\n};\n\nexport type CodexChatPendingRequestRenderContext = {\n\tdefaultNode: ReactNode;\n\treject: (message?: string | JSONRPCErrorError) => Promise<boolean>;\n\trequest: CodexChatPendingRequest;\n\tresolve: (result: Result) => Promise<boolean>;\n\tstate: CodexChatRenderState;\n};\n\nexport type CodexChatPendingUserInputRenderContext = {\n\tdefaultNode: ReactNode;\n\treject: (message?: string | JSONRPCErrorError) => Promise<boolean>;\n\trequest: CodexChatPendingUserInputRequest;\n\tresolve: (result: Result) => Promise<boolean>;\n\tstate: CodexChatRenderState;\n};\n\nexport type CodexChatRenderStateInput = {\n\tinteractionMode?: CodexChatInteractionMode;\n\tlifecycle?: Partial<CodexChatRenderLifecycleState>;\n\tsnapshot: ThreadEventSnapshot | null;\n};\n\nexport type CodexChatRenderState = {\n\tactiveProposedPlan: CodexChatProposedPlan | null;\n\tactiveTurnStartedAt: string | null;\n\tbanners: CodexChatRenderBanner[];\n\tcomposer: CodexChatComposerRenderState;\n\terrors: string[];\n\tinteractionMode: CodexChatInteractionMode;\n\titems: T3TurnItem[];\n\tisWorking: boolean;\n\toptimisticUserMessages: readonly UserMessageTurnItem[];\n\tpending_dynamic_tool_call_requests: DynamicToolCallRequest[];\n\tpendingRequests: readonly CodexChatPendingRequest[];\n\tpendingPermissionRequest: CodexChatPendingPermissionRequest | null;\n\tpendingUserInputRequest: CodexChatPendingUserInputRequest | null;\n\truntimeError: string | null;\n\trunning_turn_ids: string[];\n\tshowPlanFollowUpPrompt: boolean;\n\ttimeline: Omit<\n\t\tMessagesTimelineProps,\n\t\t\"listRef\" | \"onImageExpand\" | \"onIsAtEndChange\"\n\t>;\n\tturns: T3Turn[];\n\twarnings: string[];\n};\n\nexport type CodexChatComposerRenderState = {\n\tcontextWindow: ContextWindowSnapshot | null;\n\tpendingUserInput: PendingUserInput | null;\n\tpendingUserInputAdapter: CodexChatPendingUserInputRequest | null;\n};\n\nexport type CodexChatRenderBanner = {\n\tdescription?: string;\n\tid: string;\n\trequest?: CodexChatPendingRequest;\n\ttitle: string;\n\ttone?: \"destructive\";\n\tvariant: \"error\" | \"info\" | \"success\" | \"warning\";\n};\n\nexport function createCodexChatRenderState({\n\tinteractionMode = \"default\",\n\tlifecycle,\n\tsnapshot,\n}: CodexChatRenderStateInput): CodexChatRenderState {\n\tconst activeTurnIds = new Set(snapshot?.activeTurnIds ?? []);\n\tconst turns = (snapshot?.turns ?? []).map((turn) =>\n\t\tt3TurnFromAppServerTurn(turn, activeTurnIds.has(turn.id)),\n\t);\n\tconst pendingRequests = (snapshot?.pendingRequests ?? []).map(codexChatPendingRequest);\n\tconst pendingDynamicToolCallRequests = pendingRequests.flatMap((request) =>\n\t\trequest.kind === \"dynamicToolCall\" ? [request.compatRequest] : [],\n\t);\n\tconst pendingPermissionRequest =\n\t\tpendingRequests.find((request) => request.kind === \"permissions\") ?? null;\n\tconst pendingUserInputRequest =\n\t\tpendingRequests.find((request) => request.kind === \"userInput\") ?? null;\n\tconst activeTurnStartedAt = lifecycle?.activeWorkStartedAt ?? null;\n\tconst errors = snapshot?.errors ?? [];\n\tconst isWorking = lifecycle?.isWorking ?? false;\n\tconst optimisticUserMessages = lifecycle?.visibleOptimisticUserMessages ?? [];\n\tconst runtimeError = lifecycle?.runtimeError ?? null;\n\tconst warnings = snapshot?.warnings ?? [];\n\tconst activeProposedPlan = findActiveProposedPlan(snapshot);\n\tconst contextWindow = deriveContextWindowSnapshotFromTokenUsage({\n\t\ttokenUsage: snapshot?.tokenUsage?.tokenUsage,\n\t\tupdatedAt: snapshot?.tokenUsage?.updatedAt,\n\t});\n\tconst banners = defaultRenderBanners({\n\t\tpendingRequests,\n\t\truntimeError,\n\t});\n\treturn {\n\t\tactiveProposedPlan,\n\t\tactiveTurnStartedAt,\n\t\tbanners,\n\t\tcomposer: {\n\t\t\tcontextWindow,\n\t\t\tpendingUserInput: pendingUserInputRequest?.pendingUserInput ?? null,\n\t\t\tpendingUserInputAdapter: pendingUserInputRequest,\n\t\t},\n\t\terrors,\n\t\tinteractionMode,\n\t\titems: turns.flatMap((turn) => turn.items),\n\t\tisWorking,\n\t\toptimisticUserMessages,\n\t\tpending_dynamic_tool_call_requests: pendingDynamicToolCallRequests,\n\t\tpendingRequests,\n\t\tpendingPermissionRequest,\n\t\tpendingUserInputRequest,\n\t\truntimeError,\n\t\trunning_turn_ids: snapshot?.activeTurnIds ?? [],\n\t\tshowPlanFollowUpPrompt:\n\t\t\tinteractionMode === \"plan\" &&\n\t\t\tBoolean(activeProposedPlan) &&\n\t\t\t!isWorking &&\n\t\t\t!pendingUserInputRequest,\n\t\ttimeline: {\n\t\t\tactiveTurnStartedAt,\n\t\t\terrors,\n\t\t\tisWorking,\n\t\t\toptimisticUserMessages,\n\t\t\truntimeError,\n\t\t\tturns,\n\t\t\twarnings,\n\t\t},\n\t\tturns,\n\t\twarnings,\n\t};\n}\n\nfunction findActiveProposedPlan(\n\tsnapshot: ThreadEventSnapshot | null,\n): CodexChatProposedPlan | null {\n\tif (!snapshot) {\n\t\treturn null;\n\t}\n\tfor (const turn of [...snapshot.turns].reverse()) {\n\t\tfor (const item of [...turn.items].reverse()) {\n\t\t\tif (item.type !== \"plan\" || item.text.trim().length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tid: `${turn.id}:${item.id}`,\n\t\t\t\tplanMarkdown: item.text,\n\t\t\t\ttitle: proposedPlanTitle(item.text),\n\t\t\t\tturnId: turn.id,\n\t\t\t};\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction codexChatPendingRequest(request: ServerRequest): CodexChatPendingRequest {\n\tswitch (request.method) {\n\t\tcase \"item/tool/requestUserInput\":\n\t\t\treturn {\n\t\t\t\tkind: \"userInput\",\n\t\t\t\titemId: request.params.itemId,\n\t\t\t\tpendingUserInput: pendingUserInputFromServerRequest(request),\n\t\t\t\trequest,\n\t\t\t\trequestId: request.id,\n\t\t\t\tthreadId: request.params.threadId,\n\t\t\t\tturnId: request.params.turnId,\n\t\t\t};\n\t\tcase \"item/permissions/requestApproval\":\n\t\t\treturn {\n\t\t\t\tkind: \"permissions\",\n\t\t\t\tcomposerRequest: requestPermissionsFromServerRequest(request),\n\t\t\t\trequest,\n\t\t\t\trequestId: request.id,\n\t\t\t\tthreadId: request.params.threadId,\n\t\t\t\tturnId: request.params.turnId,\n\t\t\t};\n\t\tcase \"item/tool/call\":\n\t\t\treturn {\n\t\t\t\tkind: \"dynamicToolCall\",\n\t\t\t\tcompatRequest: {\n\t\t\t\t\targuments: request.params.arguments,\n\t\t\t\t\tcall_id: request.params.callId,\n\t\t\t\t\tnamespace: request.params.namespace,\n\t\t\t\t\ttool: request.params.tool,\n\t\t\t\t\tturn_id: request.params.turnId,\n\t\t\t\t},\n\t\t\t\trequest,\n\t\t\t\trequestId: request.id,\n\t\t\t\tthreadId: request.params.threadId,\n\t\t\t\tturnId: request.params.turnId,\n\t\t\t};\n\t\tcase \"mcpServer/elicitation/request\":\n\t\t\treturn {\n\t\t\t\tkind: \"mcpElicitation\",\n\t\t\t\trequest,\n\t\t\t\trequestId: request.id,\n\t\t\t\tthreadId: request.params.threadId,\n\t\t\t\tturnId: request.params.turnId,\n\t\t\t};\n\t\tcase \"item/commandExecution/requestApproval\":\n\t\t\treturn {\n\t\t\t\tkind: \"commandApproval\",\n\t\t\t\trequest,\n\t\t\t\trequestId: request.id,\n\t\t\t\tthreadId: request.params.threadId,\n\t\t\t\tturnId: request.params.turnId,\n\t\t\t};\n\t\tcase \"item/fileChange/requestApproval\":\n\t\t\treturn {\n\t\t\t\tkind: \"fileChangeApproval\",\n\t\t\t\trequest,\n\t\t\t\trequestId: request.id,\n\t\t\t\tthreadId: request.params.threadId,\n\t\t\t\tturnId: request.params.turnId,\n\t\t\t};\n\t\tcase \"account/chatgptAuthTokens/refresh\":\n\t\t\treturn {\n\t\t\t\tkind: \"chatgptAuthTokensRefresh\",\n\t\t\t\trequest,\n\t\t\t\trequestId: request.id,\n\t\t\t\tthreadId: null,\n\t\t\t\tturnId: null,\n\t\t\t};\n\t\tcase \"applyPatchApproval\":\n\t\t\treturn {\n\t\t\t\tkind: \"applyPatchApproval\",\n\t\t\t\trequest,\n\t\t\t\trequestId: request.id,\n\t\t\t\tthreadId: request.params.conversationId,\n\t\t\t\tturnId: null,\n\t\t\t};\n\t\tcase \"execCommandApproval\":\n\t\t\treturn {\n\t\t\t\tkind: \"execCommandApproval\",\n\t\t\t\trequest,\n\t\t\t\trequestId: request.id,\n\t\t\t\tthreadId: request.params.conversationId,\n\t\t\t\tturnId: null,\n\t\t\t};\n\t}\n}\n\nfunction defaultRenderBanners({\n\tpendingRequests,\n\truntimeError,\n}: {\n\tpendingRequests: readonly CodexChatPendingRequest[];\n\truntimeError: string | null;\n}): CodexChatRenderBanner[] {\n\tconst banners: CodexChatRenderBanner[] = [];\n\tif (runtimeError) {\n\t\tbanners.push({\n\t\t\tid: \"runtime-error\",\n\t\t\ttitle: \"Codex connection interrupted\",\n\t\t\tdescription: runtimeError,\n\t\t\tvariant: \"error\",\n\t\t\ttone: \"destructive\",\n\t\t});\n\t}\n\tfor (const request of pendingRequests) {\n\t\tif (request.kind === \"userInput\" || request.kind === \"dynamicToolCall\") {\n\t\t\tcontinue;\n\t\t}\n\t\tif (request.kind === \"permissions\") {\n\t\t\tbanners.push({\n\t\t\t\tid: `request-permissions:${request.requestId}`,\n\t\t\t\trequest,\n\t\t\t\ttitle: \"Permissions requested\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Codex requested extra permissions. Approval controls are not available yet, so the request was denied for this turn.\",\n\t\t\t\tvariant: \"warning\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tbanners.push({\n\t\t\tid: `server-request:${request.requestId}`,\n\t\t\trequest,\n\t\t\ttitle: \"Codex needs input\",\n\t\t\tdescription: `No default renderer is available for ${request.request.method}.`,\n\t\t\tvariant: \"warning\",\n\t\t});\n\t}\n\treturn banners;\n}\n\nfunction t3TurnFromAppServerTurn(turn: Turn, isActive: boolean): T3Turn {\n\treturn {\n\t\tcompleted_at: epochMillis(turn.completedAt),\n\t\tduration_ms: turn.durationMs,\n\t\terror: turn.error\n\t\t\t? {\n\t\t\t\t\tadditional_details: turn.error.additionalDetails,\n\t\t\t\t\tcodex_error_info: turn.error.codexErrorInfo,\n\t\t\t\t\tmessage: turn.error.message,\n\t\t\t\t}\n\t\t\t: null,\n\t\tid: turn.id,\n\t\titems: turn.items.flatMap((item) => t3TurnItemFromThreadItem(item, isActive)),\n\t\titems_view: turn.itemsView === \"notLoaded\" ? \"not_loaded\" : turn.itemsView,\n\t\tstarted_at: epochMillis(turn.startedAt),\n\t\tstatus: t3TurnStatusFromAppServer(turn.status),\n\t};\n}\n\nfunction t3TurnItemFromThreadItem(\n\titem: ThreadItem,\n\tturnIsActive: boolean,\n): T3TurnItem[] {\n\tswitch (item.type) {\n\t\tcase \"userMessage\":\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tcontent: item.content.map(coreUserInputFromAppServer),\n\t\t\t\t\tid: item.id,\n\t\t\t\t\ttype: \"UserMessage\",\n\t\t\t\t},\n\t\t\t];\n\t\tcase \"agentMessage\":\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tcontent: [{ text: item.text, type: \"Text\" }],\n\t\t\t\t\tid: item.id,\n\t\t\t\t\tmemory_citation: item.memoryCitation\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tentries: item.memoryCitation.entries,\n\t\t\t\t\t\t\t\trolloutIds: item.memoryCitation.threadIds,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: null,\n\t\t\t\t\tphase:\n\t\t\t\t\t\tturnIsActive && item.text.trim().length > 0\n\t\t\t\t\t\t\t? \"streaming\"\n\t\t\t\t\t\t\t: item.phase,\n\t\t\t\t\ttype: \"AgentMessage\",\n\t\t\t\t},\n\t\t\t];\n\t\tcase \"plan\":\n\t\t\treturn [{ id: item.id, text: item.text, type: \"Plan\" }];\n\t\tcase \"reasoning\":\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: item.id,\n\t\t\t\t\traw_content: item.content,\n\t\t\t\t\tsummary_text: item.summary,\n\t\t\t\t\ttype: \"Reasoning\",\n\t\t\t\t},\n\t\t\t];\n\t\tcase \"commandExecution\":\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tcommand: [item.command],\n\t\t\t\t\tcwd: item.cwd,\n\t\t\t\t\tduration_ms: item.durationMs,\n\t\t\t\t\texit_code: item.exitCode,\n\t\t\t\t\tid: item.id,\n\t\t\t\t\tstatus:\n\t\t\t\t\t\titem.status === \"inProgress\"\n\t\t\t\t\t\t\t? \"in_progress\"\n\t\t\t\t\t\t\t: item.status === \"declined\"\n\t\t\t\t\t\t\t\t? \"cancelled\"\n\t\t\t\t\t\t\t\t: item.status,\n\t\t\t\t\tstdout: item.aggregatedOutput ?? \"\",\n\t\t\t\t\ttype: \"CommandExecution\",\n\t\t\t\t},\n\t\t\t];\n\t\tcase \"fileChange\":\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tauto_approved: false,\n\t\t\t\t\tchanges: {},\n\t\t\t\t\tid: item.id,\n\t\t\t\t\tstatus:\n\t\t\t\t\t\titem.status === \"completed\" ||\n\t\t\t\t\t\titem.status === \"failed\" ||\n\t\t\t\t\t\titem.status === \"declined\"\n\t\t\t\t\t\t\t? item.status\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\tstderr: \"\",\n\t\t\t\t\tstdout: \"\",\n\t\t\t\t\ttype: \"FileChange\",\n\t\t\t\t},\n\t\t\t];\n\t\tcase \"dynamicToolCall\":\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\targuments: item.arguments,\n\t\t\t\t\tcontent_items: item.contentItems,\n\t\t\t\t\tduration: item.durationMs === null ? null : String(item.durationMs),\n\t\t\t\t\tid: item.id,\n\t\t\t\t\tnamespace: item.namespace,\n\t\t\t\t\tstatus: item.status,\n\t\t\t\t\tsuccess: item.success,\n\t\t\t\t\ttool: item.tool,\n\t\t\t\t\ttype: \"DynamicToolCall\",\n\t\t\t\t},\n\t\t\t];\n\t\tcase \"contextCompaction\":\n\t\t\treturn [{ id: item.id, type: \"ContextCompaction\" }];\n\t\tdefault:\n\t\t\treturn [];\n\t}\n}\n\nfunction pendingUserInputFromServerRequest(\n\trequest: Extract<ServerRequest, { method: \"item/tool/requestUserInput\" }>,\n): PendingUserInput {\n\treturn {\n\t\titemId: request.params.itemId,\n\t\tquestions: request.params.questions.map((question) => {\n\t\t\tconst normalized = normalizePendingUserInputQuestion(question);\n\t\t\treturn {\n\t\t\t\t...normalized,\n\t\t\t\toptions: normalized.options.map((option) => ({ ...option })),\n\t\t\t};\n\t\t}),\n\t\trequestId: request.id,\n\t\tthreadId: request.params.threadId,\n\t\tturnId: request.params.turnId,\n\t};\n}\n\nfunction requestPermissionsFromServerRequest(\n\trequest: Extract<ServerRequest, { method: \"item/permissions/requestApproval\" }>,\n): RequestPermissionsEvent {\n\treturn {\n\t\tcall_id: String(request.id),\n\t\tcwd: request.params.cwd,\n\t\tpermissions: request.params.permissions as never,\n\t\treason: request.params.reason,\n\t\tturn_id: request.params.turnId,\n\t};\n}\n\nfunction coreUserInputFromAppServer(input: AppServerUserInput): CoreUserInput {\n\tif (input.type === \"image\") {\n\t\treturn { image_url: input.url, type: \"image\" };\n\t}\n\tif (input.type === \"localImage\") {\n\t\treturn { path: input.path, type: \"local_image\" };\n\t}\n\tif (input.type === \"text\") {\n\t\treturn {\n\t\t\ttext: input.text,\n\t\t\ttext_elements: input.text_elements.map((element) => ({\n\t\t\t\tbyte_range: element.byteRange,\n\t\t\t\tplaceholder: element.placeholder ?? undefined,\n\t\t\t})),\n\t\t\ttype: \"text\",\n\t\t};\n\t}\n\treturn {\n\t\ttext: input.name,\n\t\ttext_elements: [],\n\t\ttype: \"text\",\n\t};\n}\n\nfunction t3TurnStatusFromAppServer(status: Turn[\"status\"]): T3TurnStatus {\n\treturn status === \"inProgress\" ? \"in_progress\" : status;\n}\n\nfunction epochMillis(value: number | null | undefined): number | null {\n\treturn typeof value === \"number\" ? value * 1000 : null;\n}\n","import {\n\tcreateElement,\n\ttype ComponentPropsWithRef,\n\ttype ReactElement,\n\ttype ReactNode,\n\ttype RefObject,\n\tuseCallback,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport type { LegendListRef } from \"@legendapp/list/react\";\n\nimport {\n\ttype CodexChatLifecycleOptions,\n\tuseCodexChatLifecycle,\n} from \"../hooks\";\nimport {\n\tbuildRequestUserInputResponse,\n\tChatComposer,\n\tChatView as T3ChatView,\n\tcreateComposerImageAttachments,\n\ttype ChatComposerHandle,\n\ttype ChatComposerRuntimeMode,\n\ttype ChatComposerSubmitPayload,\n\ttype ChatViewProps as T3ChatViewProps,\n\ttype ChatViewRenderComposerControls,\n\ttype ComposerBannerStackItem,\n\ttype ProviderStatus,\n\tuseComposerDraftStore,\n} from \"../upstream/t3code/apps/web/src\";\nimport {\n\tbuildPlanImplementationPrompt,\n\tresolvePlanFollowUpSubmission,\n} from \"../upstream/t3code/apps/web/src/components/chat/proposed-plan\";\nimport { TooltipProvider } from \"../upstream/t3code/apps/web/src/components/ui/tooltip\";\nimport {\n\tcreateCodexChatRenderState,\n\ttype CodexChatInteractionMode,\n\ttype CodexChatPendingUserInputRenderContext,\n\ttype CodexChatProposedPlan,\n\ttype CodexChatPendingRequest,\n\ttype CodexChatPendingRequestRenderContext,\n\ttype CodexChatRenderState,\n} from \"./codex-chat-render-state\";\nexport type CodexChatViewComposerProps =\n\tComponentPropsWithRef<typeof ChatComposer>;\nexport type CodexChatComposerCommand = NonNullable<\n\tCodexChatViewComposerProps[\"composerCommands\"]\n>[number];\nexport type CodexChatComposerCommandName = CodexChatComposerCommand[\"name\"];\nexport type CodexChatComposerSkill = NonNullable<\n\tCodexChatViewComposerProps[\"composerSkills\"]\n>[number];\nexport type CodexChatModelOption = NonNullable<\n\tCodexChatViewComposerProps[\"modelOptions\"]\n>[number];\nexport type CodexChatProviderStatus = ProviderStatus;\nexport type CodexChatRuntimeMode = ChatComposerRuntimeMode;\n\nexport type CodexChatViewManualProps = Omit<T3ChatViewProps, \"composer\"> & {\n\tcomposer: CodexChatViewComposerProps;\n\tlifecycle?: never;\n};\n\nexport type CodexChatViewLifecycleProps = Omit<\n\tT3ChatViewProps,\n\t| \"composer\"\n\t| \"listRef\"\n\t| \"onControlsChange\"\n\t| \"onIsAtEndChange\"\n\t| \"threadKey\"\n\t| \"timeline\"\n\t| \"title\"\n> & {\n\tcomposerCommands?: CodexChatViewComposerProps[\"composerCommands\"];\n\tcomposerSkills?: CodexChatViewComposerProps[\"composerSkills\"];\n\tcomposerDraftKey?: string;\n\tcomposerRef?: RefObject<ChatComposerHandle | null>;\n\teditorAriaLabel?: string;\n\tisEnvironmentUnavailable?: boolean;\n\tdefaultInteractionMode?: CodexChatInteractionMode;\n\tdefaultRuntimeMode?: CodexChatRuntimeMode;\n\tinteractionMode?: CodexChatInteractionMode;\n\tlistRef?: RefObject<LegendListRef | null>;\n\tlifecycle: CodexChatLifecycleOptions;\n\tmentionRefs?: CodexChatViewComposerProps[\"mentionRefs\"];\n\tmodelOptions?: CodexChatViewComposerProps[\"modelOptions\"];\n\tplaceholder?: string;\n\tproviderStatus?: CodexChatProviderStatus | null;\n\trealtimeConversation?: CodexChatViewComposerProps[\"realtimeConversation\"];\n\trenderBannerItems?: (\n\t\tstate: CodexChatRenderState,\n\t) => readonly ComposerBannerStackItem[];\n\trenderPendingRequest?: (\n\t\tcontext: CodexChatPendingRequestRenderContext,\n\t) => ReactNode;\n\trenderPendingUserInput?: (\n\t\tcontext: CodexChatPendingUserInputRenderContext,\n\t) => ReactNode;\n\trenderTimelineExtras?: (context: { state: CodexChatRenderState }) => ReactNode;\n\tshowInteractionModeToggle?: boolean;\n\truntimeMode?: CodexChatRuntimeMode;\n\tshowPlanToggle?: boolean;\n\tplanSidebarLabel?: string;\n\tplanSidebarOpen?: boolean;\n\tonCommand?: CodexChatViewComposerProps[\"onCommand\"];\n\tonComposerError?: (message: string | null) => void;\n\tonControlsChange?: (controls: ChatViewRenderComposerControls | null) => void;\n\tonIsAtEndChange?: (isAtEnd: boolean) => void;\n\tonImplementProposedPlan?: (plan: CodexChatProposedPlan) => void;\n\tonInteractionModeChange?: (mode: CodexChatInteractionMode) => void;\n\tonRuntimeModeChange?: (mode: CodexChatRuntimeMode) => void;\n\tonTogglePlanSidebar?: () => void;\n\tthreadKey?: string;\n\ttitle?: ReactNode;\n};\n\nexport type CodexChatViewProps =\n\t| CodexChatViewLifecycleProps\n\t| CodexChatViewManualProps;\n\nexport function CodexChatView(props: CodexChatViewProps): ReactElement {\n\tif (isLifecycleCodexChatViewProps(props)) {\n\t\treturn createElement(CodexLifecycleChatView, props);\n\t}\n\tconst { composer, ...chatViewProps } = props;\n\treturn createElement(\n\t\tTooltipProvider,\n\t\tnull,\n\t\tcreateElement(T3ChatView, {\n\t\t\t...chatViewProps,\n\t\t\tcomposer: createElement(ChatComposer, composer),\n\t\t}),\n\t);\n}\n\nfunction CodexLifecycleChatView({\n\tactions,\n\tbannerItems = [],\n\tclassName,\n\tcomposerCommands,\n\tcomposerSkills,\n\tcomposerDraftKey,\n\tcomposerRef: externalComposerRef,\n\tdefaultInteractionMode = \"default\",\n\tdefaultRuntimeMode = \"full-access\",\n\teditorAriaLabel,\n\theaderLeading,\n\tinteractionMode,\n\tisEnvironmentUnavailable = false,\n\tlistRef: externalListRef,\n\tlifecycle: lifecycleOptions,\n\tmentionRefs,\n\tmodelOptions,\n\tplaceholder,\n\tproviderStatus = null,\n\trealtimeConversation,\n\trenderBannerItems,\n\trenderPendingRequest,\n\trenderPendingUserInput,\n\trenderTimelineExtras,\n\truntimeMode,\n\tshowInteractionModeToggle = true,\n\tshowPlanToggle = false,\n\tplanSidebarLabel = \"Plan\",\n\tplanSidebarOpen = false,\n\tsubtitle,\n\tthreadKey,\n\ttitle,\n\tonCommand,\n\tonComposerError,\n\tonControlsChange,\n\tonInteractionModeChange,\n\tonRuntimeModeChange,\n\tonTogglePlanSidebar,\n\tonImplementProposedPlan,\n\tonIsAtEndChange,\n}: CodexChatViewLifecycleProps): ReactElement {\n\tconst lifecycle = useCodexChatLifecycle(lifecycleOptions);\n\tconst [localInteractionMode, setLocalInteractionMode] =\n\t\tuseState<CodexChatInteractionMode>(defaultInteractionMode);\n\tconst [localRuntimeMode, setLocalRuntimeMode] =\n\t\tuseState<CodexChatRuntimeMode>(defaultRuntimeMode);\n\tconst effectiveInteractionMode = interactionMode ?? localInteractionMode;\n\tconst effectiveRuntimeMode = runtimeMode ?? localRuntimeMode;\n\tconst setInteractionMode = useCallback(\n\t\t(nextMode: CodexChatInteractionMode) => {\n\t\t\tif (interactionMode === undefined) {\n\t\t\t\tsetLocalInteractionMode(nextMode);\n\t\t\t}\n\t\t\tonInteractionModeChange?.(nextMode);\n\t\t},\n\t\t[interactionMode, onInteractionModeChange],\n\t);\n\tconst setRuntimeMode = useCallback(\n\t\t(nextMode: CodexChatRuntimeMode) => {\n\t\t\tif (runtimeMode === undefined) {\n\t\t\t\tsetLocalRuntimeMode(nextMode);\n\t\t\t}\n\t\t\tonRuntimeModeChange?.(nextMode);\n\t\t},\n\t\t[runtimeMode, onRuntimeModeChange],\n\t);\n\tconst effectiveThreadKey = threadKey ?? String(lifecycle.threadId);\n\tconst effectiveComposerDraftKey =\n\t\tcomposerDraftKey ?? `codex:${String(lifecycle.threadId)}`;\n\tconst effectiveEditorAriaLabel = editorAriaLabel ?? \"Message Codex\";\n\tconst effectivePlaceholder =\n\t\tplaceholder ??\n\t\t\"Ask anything, @tag files/folders, or use / to show available commands\";\n\tconst effectiveTitle = title ?? \"Codex\";\n\tconst renderState = createCodexChatRenderState({\n\t\tinteractionMode: effectiveInteractionMode,\n\t\tlifecycle,\n\t\tsnapshot: lifecycle.threadSnapshot,\n\t});\n\tconst activeProposedPlan = renderState.activeProposedPlan;\n\tconst showPlanFollowUpPrompt =\n\t\trenderState.showPlanFollowUpPrompt && Boolean(activeProposedPlan);\n\tconst pendingUserInput = renderState.composer.pendingUserInputAdapter;\n\tconst pendingRequestRenderItems = renderPendingRequest\n\t\t? renderState.pendingRequests.flatMap((request) => {\n\t\t\t\tif (request.kind === \"userInput\") {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t\tconst defaultNode = defaultPendingRequestNode(request);\n\t\t\t\tconst node = renderPendingRequest({\n\t\t\t\t\tdefaultNode,\n\t\t\t\t\treject: (error) => rejectPendingRequest(request, error),\n\t\t\t\t\trequest,\n\t\t\t\t\tresolve: (result) =>\n\t\t\t\t\t\tlifecycle.resolveServerRequest(request.requestId, result),\n\t\t\t\t\tstate: renderState,\n\t\t\t\t});\n\t\t\t\tif (node === defaultNode) {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t\treturn node ? [{ node, request }] : [];\n\t\t\t})\n\t\t: [];\n\tconst customPendingRequestIds = new Set(\n\t\tpendingRequestRenderItems.map(({ request }) => request.requestId),\n\t);\n\tconst customUserInputNode = pendingUserInput\n\t\t? renderPendingUserInput?.({\n\t\t\t\tdefaultNode: null,\n\t\t\t\treject: (error) => rejectPendingRequest(pendingUserInput, error),\n\t\t\t\trequest: pendingUserInput,\n\t\t\t\tresolve: (result) =>\n\t\t\t\t\tlifecycle.resolveServerRequest(pendingUserInput.requestId, result),\n\t\t\t\tstate: renderState,\n\t\t\t})\n\t\t: null;\n\tconst timelineExtras = renderTimelineExtras?.({ state: renderState });\n\tconst internalComposerRef = useRef<ChatComposerHandle | null>(null);\n\tconst composerRef = externalComposerRef ?? internalComposerRef;\n\tconst internalListRef = useRef<LegendListRef | null>(null);\n\tconst listRef = externalListRef ?? internalListRef;\n\tconst controlsRef = useRef<ChatViewRenderComposerControls | null>(null);\n\tconst shouldAutoScrollRef = useRef(true);\n\tconst [composerNotice, setComposerNotice] = useState<string | null>(null);\n\tconst setComposerDraftPrompt = useComposerDraftStore((store) => store.setPrompt);\n\tconst addComposerDraftImages = useComposerDraftStore((store) => store.addImages);\n\n\tconst setNotice = useCallback(\n\t\t(message: string | null) => {\n\t\t\tsetComposerNotice(message);\n\t\t\tonComposerError?.(message);\n\t\t},\n\t\t[onComposerError],\n\t);\n\tconst scheduleStickToBottom = useCallback(() => {\n\t\tcontrolsRef.current?.scheduleStickToBottom();\n\t}, []);\n\tfunction restoreComposer(sendContext: ChatComposerSubmitPayload) {\n\t\tconst snapshot = composerRef.current?.readSnapshot();\n\t\tconst composerIsEmpty = !snapshot || snapshot.value.trim().length === 0;\n\t\tif (!composerIsEmpty) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst restoredImages = createComposerImageAttachments(sendContext.files);\n\t\tsetComposerDraftPrompt(effectiveComposerDraftKey, sendContext.text);\n\t\taddComposerDraftImages(effectiveComposerDraftKey, restoredImages);\n\t\tcomposerRef.current?.setDraft({\n\t\t\tmentionBindings: sendContext.mentionBindings,\n\t\t\tmessage: sendContext.text,\n\t\t});\n\t}\n\n\tasync function sendComposerMessage() {\n\t\tconst sendContext = composerRef.current?.getSendContext();\n\t\tif (!sendContext) {\n\t\t\tsetNotice(\"Composer is not ready. Try again.\");\n\t\t\treturn;\n\t\t}\n\t\tconst activePlan = activeProposedPlan;\n\t\tconst shouldSubmitPlanFollowUp =\n\t\t\tBoolean(activePlan) &&\n\t\t\tshowPlanFollowUpPrompt &&\n\t\t\tsendContext.items.length === 0 &&\n\t\t\tsendContext.files.length === 0;\n\t\tconst effectiveSendContext =\n\t\t\tshouldSubmitPlanFollowUp && activePlan\n\t\t\t\t? planImplementationSendContext(sendContext, activePlan)\n\t\t\t\t: sendContext;\n\t\tconst submitInteractionMode =\n\t\t\tshouldSubmitPlanFollowUp && activePlan\n\t\t\t\t? resolvePlanFollowUpSubmission({\n\t\t\t\t\t\tdraftText: sendContext.text,\n\t\t\t\t\t\tplanMarkdown: activePlan.planMarkdown,\n\t\t\t\t\t}).interactionMode\n\t\t\t\t: effectiveInteractionMode;\n\t\tif (\n\t\t\teffectiveSendContext.items.length === 0 &&\n\t\t\teffectiveSendContext.files.length === 0\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tawait lifecycle.sendComposerMessage(effectiveSendContext, {\n\t\t\tclearComposer: () => {\n\t\t\t\tcomposerRef.current?.clear();\n\t\t\t\tsetNotice(null);\n\t\t\t},\n\t\t\tprepareForOptimisticAppend: async () => {\n\t\t\t\tshouldAutoScrollRef.current = true;\n\t\t\t\tawait (controlsRef.current?.prepareForOptimisticAppend?.() ??\n\t\t\t\t\tlistRef.current?.scrollToEnd?.({ animated: false }));\n\t\t\t},\n\t\t\trestoreComposer,\n\t\t}, { interactionMode: submitInteractionMode, runtimeMode: effectiveRuntimeMode });\n\t\tif (submitInteractionMode !== effectiveInteractionMode) {\n\t\t\tsetInteractionMode(submitInteractionMode);\n\t\t}\n\t}\n\n\tconst submitPendingUserInput: NonNullable<\n\t\tCodexChatViewComposerProps[\"onPendingRequestSubmit\"]\n\t> = (response) => {\n\t\tconst request = pendingUserInput;\n\t\tif (!request) {\n\t\t\tsetNotice(\"Codex thread is not connected. Reconnect and try again.\");\n\t\t\treturn false;\n\t\t}\n\t\tvoid lifecycle.resolveServerRequest(request.requestId, response);\n\t\treturn true;\n\t};\n\tconst dismissPendingUserInput = () => {\n\t\tconst request = pendingUserInput;\n\t\tif (!request) {\n\t\t\treturn;\n\t\t}\n\t\tsubmitPendingUserInput(buildRequestUserInputResponse(request.pendingUserInput, {}));\n\t};\n\tfunction rejectPendingRequest(\n\t\trequest: CodexChatPendingRequest,\n\t\terror: Parameters<CodexChatPendingRequestRenderContext[\"reject\"]>[0] =\n\t\t\t\"Codex server request was dismissed.\",\n\t) {\n\t\tconst jsonRpcError =\n\t\t\ttypeof error === \"string\"\n\t\t\t\t? { code: -32000, message: error }\n\t\t\t\t: error;\n\t\treturn lifecycle.rejectServerRequest(request.requestId, jsonRpcError);\n\t}\n\tconst interrupt = useCallback(() => {\n\t\tvoid lifecycle.interrupt().then((accepted) => {\n\t\t\tif (!accepted) {\n\t\t\t\tsetNotice(\n\t\t\t\t\t\"Codex could not stop the active response. Reconnect and try again.\",\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}, [lifecycle, setNotice]);\n\tconst handleCommand = useCallback<NonNullable<CodexChatViewComposerProps[\"onCommand\"]>>(\n\t\t(command) => {\n\t\t\tif (command === \"plan\") {\n\t\t\t\tsetInteractionMode(\"plan\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (command === \"default\") {\n\t\t\t\tsetInteractionMode(\"default\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (command === \"compact\") {\n\t\t\t\tvoid lifecycle.compact().then((accepted) => {\n\t\t\t\t\tif (!accepted) {\n\t\t\t\t\t\tsetNotice(\"Codex thread is not connected. Reconnect and try again.\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tonCommand?.(command);\n\t\t},\n\t\t[lifecycle, onCommand, setInteractionMode, setNotice],\n\t);\n\tconst implementProposedPlanInNewThread = useCallback(\n\t\t(plan: CodexChatProposedPlan) => {\n\t\t\tonImplementProposedPlan?.(plan);\n\t\t},\n\t\t[onImplementProposedPlan],\n\t);\n\n\tconst lifecycleBannerItems: ComposerBannerStackItem[] = [...bannerItems];\n\tif (composerNotice) {\n\t\tlifecycleBannerItems.push({\n\t\t\tid: \"composer-notice\",\n\t\t\ttitle: \"Composer needs attention\",\n\t\t\tdescription: composerNotice,\n\t\t\tvariant: \"warning\",\n\t\t\tonDismiss: () => setNotice(null),\n\t\t});\n\t}\n\tif (providerStatus && providerStatus.status !== \"ready\" && providerStatus.status !== \"disabled\") {\n\t\tconst providerLabel =\n\t\t\tproviderStatus.displayName?.trim() ||\n\t\t\t(providerStatus.driver\n\t\t\t\t? providerStatus.driver\n\t\t\t\t\t\t.split(/[-_\\s]+/g)\n\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t.map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n\t\t\t\t\t\t.join(\" \")\n\t\t\t\t: \"Codex\");\n\t\tconst description =\n\t\t\tproviderStatus.message ??\n\t\t\t(providerStatus.status === \"error\"\n\t\t\t\t? `${providerLabel} provider is unavailable.`\n\t\t\t\t: `${providerLabel} provider has limited availability.`);\n\t\tlifecycleBannerItems.push({\n\t\t\tdescription,\n\t\t\tid: \"provider-status\",\n\t\t\ttitle: `${providerLabel} provider status`,\n\t\t\tvariant: providerStatus.status === \"error\" ? \"error\" : \"warning\",\n\t\t});\n\t}\n\tlifecycleBannerItems.push(\n\t\t...renderState.banners\n\t\t\t.filter(\n\t\t\t\t(banner) =>\n\t\t\t\t\t!banner.request ||\n\t\t\t\t\t!customPendingRequestIds.has(banner.request.requestId),\n\t\t\t)\n\t\t\t.map((banner) => ({\n\t\t\t\t...banner,\n\t\t\t\taction:\n\t\t\t\t\tbanner.id === \"runtime-error\"\n\t\t\t\t\t\t? { label: \"Reconnect\", onClick: lifecycle.reconnect }\n\t\t\t\t\t\t: undefined,\n\t\t\t})),\n\t);\n\tlifecycleBannerItems.push(\n\t\t...pendingRequestRenderItems.map(({ node, request }) => ({\n\t\t\tid: `custom-pending-request:${request.requestId}`,\n\t\t\ttitle: \"Codex needs input\",\n\t\t\tdescription: node,\n\t\t\tvariant: \"info\" as const,\n\t\t})),\n\t);\n\tif (customUserInputNode) {\n\t\tlifecycleBannerItems.push({\n\t\t\tid: `custom-pending-request:${pendingUserInput?.requestId ?? \"user-input\"}`,\n\t\t\ttitle: \"Codex needs input\",\n\t\t\tdescription: customUserInputNode,\n\t\t\tvariant: \"info\",\n\t\t});\n\t}\n\tlifecycleBannerItems.push(...(renderBannerItems?.(renderState) ?? []));\n\tconst effectiveActions = showInteractionModeToggle ? (\n\t\t<>\n\t\t\t<CodexInteractionModeToggle\n\t\t\t\tmode={effectiveInteractionMode}\n\t\t\t\tonChange={setInteractionMode}\n\t\t\t/>\n\t\t\t{actions}\n\t\t</>\n\t) : (\n\t\tactions\n\t);\n\tconst chatView = (\n\t\t<TooltipProvider>\n\t\t\t<T3ChatView\n\t\t\t\tactions={effectiveActions}\n\t\t\t\tbannerItems={lifecycleBannerItems}\n\t\t\t\tclassName={className}\n\t\t\t\theaderLeading={headerLeading}\n\t\t\t\tlistRef={listRef}\n\t\t\t\tsubtitle={subtitle}\n\t\t\t\tthreadKey={effectiveThreadKey}\n\t\t\t\ttimeline={renderState.timeline}\n\t\t\t\ttitle={effectiveTitle}\n\t\t\t\tonControlsChange={(controls) => {\n\t\t\t\t\tcontrolsRef.current = controls;\n\t\t\t\t\tonControlsChange?.(controls);\n\t\t\t\t}}\n\t\t\t\tonIsAtEndChange={(isAtEnd) => {\n\t\t\t\t\tshouldAutoScrollRef.current = isAtEnd;\n\t\t\t\t\tonIsAtEndChange?.(isAtEnd);\n\t\t\t\t}}\n\t\t\t\tcomposer={\n\t\t\t\t\t<ChatComposer\n\t\t\t\t\t\tref={composerRef}\n\t\t\t\t\t\tcontextWindow={renderState.composer.contextWindow}\n\t\t\t\t\t\tdisabled={\n\t\t\t\t\t\t\tBoolean(lifecycle.runtimeError) ||\n\t\t\t\t\t\t\tlifecycle.connectionStatus === \"connecting\" ||\n\t\t\t\t\t\t\tlifecycle.connectionStatus === \"reconnecting\"\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdraftKey={effectiveComposerDraftKey}\n\t\t\t\t\t\teditorAriaLabel={effectiveEditorAriaLabel}\n\t\t\t\t\t\tinteractionMode={effectiveInteractionMode}\n\t\t\t\t\t\tisConnecting={\n\t\t\t\t\t\t\tlifecycle.connectionStatus === \"connecting\" ||\n\t\t\t\t\t\t\tlifecycle.connectionStatus === \"reconnecting\"\n\t\t\t\t\t\t}\n\t\t\t\t\t\tisEnvironmentUnavailable={isEnvironmentUnavailable}\n\t\t\t\t\t\tisRunning={lifecycle.turnRunning}\n\t\t\t\t\t\tisSending={lifecycle.isSending || lifecycle.isSendBusy}\n\t\t\t\t\t\tmentionRefs={mentionRefs ?? []}\n\t\t\t\t\t\tcomposerCommands={composerCommands}\n\t\t\t\t\t\tcomposerSkills={composerSkills}\n\t\t\t\t\t\tmodelOptions={modelOptions}\n\t\t\t\t\t\tpendingUserInput={\n\t\t\t\t\t\t\tcustomUserInputNode ? null : renderState.composer.pendingUserInput\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpendingRequestDisabled={lifecycle.connectionStatus !== \"connected\"}\n\t\t\t\t\t\tplaceholder={effectivePlaceholder}\n\t\t\t\t\t\tplanFollowUpTitle={activeProposedPlan?.title ?? null}\n\t\t\t\t\t\tplanSidebarLabel={planSidebarLabel}\n\t\t\t\t\t\tplanSidebarOpen={planSidebarOpen}\n\t\t\t\t\t\trealtimeConversation={realtimeConversation}\n\t\t\t\t\t\truntimeMode={effectiveRuntimeMode}\n\t\t\t\t\t\tshowInteractionModeToggle={showInteractionModeToggle}\n\t\t\t\t\t\tshowPlanFollowUpPrompt={showPlanFollowUpPrompt}\n\t\t\t\t\t\tshowPlanToggle={showPlanToggle}\n\t\t\t\t\t\tonCommand={handleCommand}\n\t\t\t\t\t\tonComposerError={setNotice}\n\t\t\t\t\t\tonImplementPlanInNewThread={\n\t\t\t\t\t\t\tactiveProposedPlan && onImplementProposedPlan\n\t\t\t\t\t\t\t\t? () => implementProposedPlanInNewThread(activeProposedPlan)\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonToggleInteractionMode={() =>\n\t\t\t\t\t\t\tsetInteractionMode(\n\t\t\t\t\t\t\t\teffectiveInteractionMode === \"plan\" ? \"default\" : \"plan\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonRuntimeModeChange={setRuntimeMode}\n\t\t\t\t\t\tonTogglePlanSidebar={onTogglePlanSidebar}\n\t\t\t\t\t\tonPendingRequestDismiss={dismissPendingUserInput}\n\t\t\t\t\t\tonPendingRequestSubmit={submitPendingUserInput}\n\t\t\t\t\t\tonInterrupt={interrupt}\n\t\t\t\t\t\tscheduleStickToBottom={scheduleStickToBottom}\n\t\t\t\t\t\tshouldAutoScrollRef={shouldAutoScrollRef}\n\t\t\t\t\t\tonSend={() => void sendComposerMessage()}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t</TooltipProvider>\n\t);\n\tif (!timelineExtras) {\n\t\treturn chatView;\n\t}\n\treturn (\n\t\t<>\n\t\t\t{chatView}\n\t\t\t{timelineExtras}\n\t\t</>\n\t);\n}\n\nexport type {\n\tChatComposerHandle,\n\tChatComposerSubmitPayload,\n\tChatViewRenderComposerControls as CodexChatViewRenderComposerControls,\n};\n\nfunction isLifecycleCodexChatViewProps(\n\tprops: CodexChatViewProps,\n): props is CodexChatViewLifecycleProps {\n\treturn \"lifecycle\" in props && Boolean(props.lifecycle);\n}\n\nfunction defaultPendingRequestNode(request: CodexChatPendingRequest): ReactNode {\n\tif (request.kind === \"permissions\") {\n\t\treturn null;\n\t}\n\treturn `No default renderer is available for ${request.request.method}.`;\n}\n\nfunction CodexInteractionModeToggle({\n\tmode,\n\tonChange,\n}: {\n\tmode: CodexChatInteractionMode;\n\tonChange: (mode: CodexChatInteractionMode) => void;\n}): ReactElement {\n\treturn (\n\t\t<div\n\t\t\taria-label=\"Interaction mode\"\n\t\t\tclassName=\"flex shrink-0 items-center rounded-md border bg-background p-0.5\"\n\t\t\trole=\"group\"\n\t\t>\n\t\t\t<button\n\t\t\t\taria-pressed={mode === \"default\"}\n\t\t\t\tclassName={\n\t\t\t\t\tmode === \"default\"\n\t\t\t\t\t\t? \"rounded px-2 py-1 font-medium text-foreground text-xs shadow-xs\"\n\t\t\t\t\t\t: \"rounded px-2 py-1 text-muted-foreground text-xs hover:text-foreground\"\n\t\t\t\t}\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => onChange(\"default\")}\n\t\t\t>\n\t\t\t\tBuild\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\taria-pressed={mode === \"plan\"}\n\t\t\t\tclassName={\n\t\t\t\t\tmode === \"plan\"\n\t\t\t\t\t\t? \"rounded px-2 py-1 font-medium text-foreground text-xs shadow-xs\"\n\t\t\t\t\t\t: \"rounded px-2 py-1 text-muted-foreground text-xs hover:text-foreground\"\n\t\t\t\t}\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => onChange(\"plan\")}\n\t\t\t>\n\t\t\t\tPlan\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n\nfunction planImplementationSendContext(\n\tsendContext: ChatComposerSubmitPayload,\n\tplan: CodexChatProposedPlan,\n): ChatComposerSubmitPayload {\n\tconst text = buildPlanImplementationPrompt(plan.planMarkdown);\n\treturn {\n\t\t...sendContext,\n\t\tfiles: [],\n\t\titems: [{ text, text_elements: [], type: \"text\" }],\n\t\ttext,\n\t};\n}\n","import { createElement } from \"react\";\n\nimport {\n\ttype CodexChatLifecycleOptions,\n\tcreateDefaultTurnStartParams,\n} from \"../hooks\";\nimport type {\n\tCodexAppServer,\n\tThreadId,\n\tThreadReader,\n} from \"../hooks\";\nimport {\n\tCodexChatView,\n\ttype CodexChatViewLifecycleProps,\n} from \"./codex-chat-view\";\n\ntype CodexChatLifecyclePassthroughProps = Pick<\n\tCodexChatLifecycleOptions,\n\t| \"buildThreadStartParams\"\n\t| \"buildTurnStartParams\"\n\t| \"connectOnMount\"\n\t| \"initialState\"\n\t| \"isRecoverableConnectionError\"\n\t| \"onActiveThread\"\n\t| \"onRuntimeError\"\n\t| \"onServerRequest\"\n\t| \"onState\"\n\t| \"onSubmittedUserMessage\"\n\t| \"onThreadListChanged\"\n\t| \"onThreadStarted\"\n>;\n\nexport type CodexChatProps = Omit<\n\tCodexChatViewLifecycleProps,\n\t\"lifecycle\"\n> &\n\tCodexChatLifecyclePassthroughProps & {\n\t\tappServer: CodexAppServer;\n\t\tthreadId: ThreadId | string;\n\t\tthreadReader?: ThreadReader;\n\t};\n\nexport function CodexChat({\n\tappServer,\n\tbuildThreadStartParams,\n\tbuildTurnStartParams,\n\tconnectOnMount,\n\tinitialState,\n\tisRecoverableConnectionError,\n\tonActiveThread,\n\tonRuntimeError,\n\tonServerRequest,\n\tonState,\n\tonSubmittedUserMessage,\n\tonThreadListChanged,\n\tonThreadStarted,\n\tthreadId,\n\tthreadReader,\n\t...viewProps\n}: CodexChatProps) {\n\tconst lifecycle: CodexChatLifecycleOptions = {\n\t\tappServer,\n\t\tbuildThreadStartParams,\n\t\tbuildTurnStartParams: buildTurnStartParams ?? createDefaultTurnStartParams,\n\t\tconnectOnMount,\n\t\tinitialState,\n\t\tisRecoverableConnectionError,\n\t\tonActiveThread,\n\t\tonRuntimeError,\n\t\tonServerRequest,\n\t\tonState,\n\t\tonSubmittedUserMessage,\n\t\tonThreadListChanged,\n\t\tonThreadStarted,\n\t\tthreadId,\n\t\tthreadReader,\n\t};\n\treturn createElement(CodexChatView, {\n\t\t...viewProps,\n\t\tlifecycle,\n\t});\n}\n","import {\n\tFragment,\n\tcreateElement,\n\ttype ComponentProps,\n\ttype ReactNode,\n} from \"react\";\n\nimport {\n\tSidebar,\n\tSidebarInset,\n\tSidebarProvider,\n} from \"../shadcn/ui/sidebar\";\n\nexport type CodexChatSidebarProps = ComponentProps<typeof Sidebar>;\n\nexport function CodexChatSidebar(props: CodexChatSidebarProps) {\n\treturn createElement(Sidebar, props);\n}\n\nexport type CodexChatLayoutProps = {\n\tchildren: ReactNode;\n\tsidebar?: ReactNode;\n\tside?: CodexChatSidebarProps[\"side\"];\n\tcollapsible?: CodexChatSidebarProps[\"collapsible\"];\n\tdefaultOpen?: ComponentProps<typeof SidebarProvider>[\"defaultOpen\"];\n\topen?: ComponentProps<typeof SidebarProvider>[\"open\"];\n\tonOpenChange?: ComponentProps<typeof SidebarProvider>[\"onOpenChange\"];\n\tclassName?: ComponentProps<typeof SidebarProvider>[\"className\"];\n};\n\nexport function CodexChatLayout({\n\tchildren,\n\tclassName,\n\tcollapsible,\n\tdefaultOpen,\n\tonOpenChange,\n\topen,\n\tside,\n\tsidebar,\n}: CodexChatLayoutProps) {\n\tif (!sidebar) {\n\t\treturn createElement(Fragment, null, children);\n\t}\n\n\treturn createElement(\n\t\tSidebarProvider,\n\t\t{\n\t\t\tclassName,\n\t\t\tdefaultOpen,\n\t\t\tonOpenChange,\n\t\t\topen,\n\t\t},\n\t\tcreateElement(CodexChatSidebar, { collapsible, side }, sidebar),\n\t\tcreateElement(SidebarInset, null, children),\n\t);\n}\n","import {\n\tcreateContext,\n\tcreateElement,\n\ttype ReactNode,\n\tuseContext,\n\tuseMemo,\n\tuseState,\n} from \"react\";\n\nimport {\n\tasThreadId,\n\ttype ThreadEventSnapshot,\n} from \"../runtime\";\nimport type {\n\tCodexAppServer,\n\tThreadId,\n\tThreadReader,\n} from \"../hooks\";\nimport type { ChatComposerSubmitPayload } from \"../upstream/t3code/apps/web/src\";\nimport {\n\tdefaultCodexModel,\n\tdefaultCodexReasoningEffort,\n} from \"../upstream/t3code/apps/web/src/lib/modelSelection\";\nimport type { UserInput as CoreUserInput } from \"../upstream/codex-rs/core/src/protocol\";\nimport { useCodexChatLifecycle } from \"../hooks/chat-lifecycle\";\nimport {\n\tcreateCodexChatRenderState,\n\ttype CodexChatRenderState,\n} from \"./codex-chat-render-state\";\n\nexport type MessagePart =\n\t| { type: \"text\"; text: string }\n\t| { type: \"image\"; url: string }\n\t| { type: \"file\"; name?: string; url: string }\n\t| { type: \"tool-call\"; input: unknown; name: string; toolCallId: string }\n\t| { type: \"tool-result\"; output: unknown; toolCallId: string };\n\nexport type ChatMessage = {\n\tid: string;\n\tmetadata?: Record<string, unknown>;\n\tparts: MessagePart[];\n\trole: \"assistant\" | \"system\" | \"user\";\n};\n\nexport type ChatRuntimeStatus =\n\t| \"error\"\n\t| \"idle\"\n\t| \"loading\"\n\t| \"ready\"\n\t| \"streaming\"\n\t| \"submitting\";\n\nexport type SendMessageInput = {\n\tfiles?: FileList | File[] | MessagePart[];\n\tmetadata?: Record<string, unknown>;\n\ttext?: string;\n};\n\nexport type ChatRuntime = {\n\terror: Error | null;\n\tmessages: ChatMessage[];\n\tsendMessage(input: SendMessageInput): Promise<void>;\n\tsetThread(threadId: ThreadId | string | null): void;\n\tstatus: ChatRuntimeStatus;\n\tstop(): Promise<void>;\n\tthreadId: ThreadId | string | null;\n\tthreadSnapshot: ThreadEventSnapshot | null;\n\tthreadState: CodexChatRenderState | null;\n};\n\nexport type CodexChatRuntimeOptions = {\n\tappServer: CodexAppServer;\n\tthreadReader?: ThreadReader;\n\tthreadId?: ThreadId | string;\n};\n\nconst CodexChatContext = createContext<ChatRuntime | null>(null);\n\nexport type CodexChatProviderProps = CodexChatRuntimeOptions & {\n\tchildren?: ReactNode;\n};\n\nexport function CodexChatProvider({\n\tappServer,\n\tchildren,\n\tthreadReader,\n\tthreadId,\n}: CodexChatProviderProps) {\n\tconst runtime = useCodexChat({ appServer, threadReader, threadId });\n\treturn createElement(\n\t\tCodexChatContext.Provider,\n\t\t{ value: runtime },\n\t\tchildren,\n\t);\n}\n\nexport function useCodexChatRuntime(): ChatRuntime {\n\tconst runtime = useContext(CodexChatContext);\n\tif (!runtime) {\n\t\tthrow new Error(\"useCodexChatRuntime must be used inside CodexChatProvider.\");\n\t}\n\treturn runtime;\n}\n\nexport function useCodexChat(options: CodexChatRuntimeOptions): ChatRuntime {\n\tconst [activeThreadId, setActiveThreadId] = useState<\n\t\tThreadId | string | null\n\t>(options.threadId ?? null);\n\tconst normalizedThreadId = useMemo(\n\t\t() =>\n\t\t\tactiveThreadId\n\t\t\t\t? normalizeThreadId(activeThreadId)\n\t\t\t\t: asThreadId(\"00000000-0000-4000-8000-000000000000\"),\n\t\t[activeThreadId],\n\t);\n\tconst lifecycle = useCodexChatLifecycle({\n\t\tappServer: options.appServer,\n\t\tconnectOnMount: activeThreadId !== null,\n\t\tthreadId: normalizedThreadId,\n\t\tthreadReader: options.threadReader,\n\t});\n\tconst threadState = useMemo(\n\t\t() =>\n\t\t\tcreateCodexChatRenderState({\n\t\t\t\tlifecycle,\n\t\t\t\tsnapshot: lifecycle.threadSnapshot,\n\t\t\t}),\n\t\t[lifecycle],\n\t);\n\tconst error = lifecycle.runtimeError ? new Error(lifecycle.runtimeError) : null;\n\n\treturn {\n\t\terror,\n\t\tmessages: messagesFromRenderState(threadState),\n\t\tasync sendMessage(input) {\n\t\t\tif (!activeThreadId) {\n\t\t\t\tthrow new Error(\"Cannot send a Codex chat message without a thread.\");\n\t\t\t}\n\t\t\tconst sendContext = sendContextFromMessageInput(input);\n\t\t\tawait lifecycle.sendComposerMessage(sendContext, {\n\t\t\t\tclearComposer: () => {},\n\t\t\t\tprepareForOptimisticAppend: async () => {},\n\t\t\t\trestoreComposer: () => {},\n\t\t\t});\n\t\t},\n\t\tsetThread(nextThreadId) {\n\t\t\tsetActiveThreadId(nextThreadId);\n\t\t},\n\t\tstatus: chatRuntimeStatus(lifecycle, activeThreadId !== null),\n\t\tasync stop() {\n\t\t\tawait lifecycle.interrupt();\n\t\t},\n\t\tthreadId: activeThreadId,\n\t\tthreadSnapshot: lifecycle.threadSnapshot,\n\t\tthreadState,\n\t};\n}\n\nfunction chatRuntimeStatus(\n\tlifecycle: ReturnType<typeof useCodexChatLifecycle>,\n\thasThread: boolean,\n): ChatRuntimeStatus {\n\tif (!hasThread) {\n\t\treturn \"idle\";\n\t}\n\tif (lifecycle.runtimeError) {\n\t\treturn \"error\";\n\t}\n\tif (\n\t\tlifecycle.connectionStatus === \"connecting\" ||\n\t\tlifecycle.connectionStatus === \"reconnecting\"\n\t) {\n\t\treturn \"loading\";\n\t}\n\tif (lifecycle.isSending || lifecycle.isSendBusy) {\n\t\treturn \"submitting\";\n\t}\n\tif (lifecycle.turnRunning || lifecycle.assistantStreaming) {\n\t\treturn \"streaming\";\n\t}\n\treturn \"ready\";\n}\n\nfunction sendContextFromMessageInput(input: SendMessageInput): ChatComposerSubmitPayload {\n\tconst text = input.text?.trim() ?? \"\";\n\tconst files = messageInputFiles(input.files);\n\tconst fileParts =\n\t\tinput.files && !isFileList(input.files) && !isFileArray(input.files)\n\t\t\t? input.files\n\t\t\t: [];\n\tconst items: ChatComposerSubmitPayload[\"items\"] = [\n\t\t...(text\n\t\t\t? [{\n\t\t\t\t\ttext,\n\t\t\t\t\ttext_elements: [],\n\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t}]\n\t\t\t: []),\n\t\t...fileParts.flatMap(messagePartToComposerItem),\n\t];\n\treturn {\n\t\teffort: defaultCodexReasoningEffort,\n\t\tfiles,\n\t\titems,\n\t\tmentionBindings: [],\n\t\tmodel: defaultCodexModel,\n\t\ttext,\n\t};\n}\n\nfunction messageInputFiles(\n\tfiles: SendMessageInput[\"files\"],\n): ChatComposerSubmitPayload[\"files\"] {\n\tif (!files) {\n\t\treturn [];\n\t}\n\tif (isFileList(files)) {\n\t\treturn Array.from(files);\n\t}\n\tif (isFileArray(files)) {\n\t\treturn files;\n\t}\n\treturn [];\n}\n\nfunction messagePartToComposerItem(\n\tpart: MessagePart,\n): ChatComposerSubmitPayload[\"items\"] {\n\tif (part.type === \"image\") {\n\t\treturn [{ image_url: part.url, type: \"image\" }];\n\t}\n\tif (part.type === \"file\") {\n\t\treturn [{ path: part.url, type: \"local_image\" }];\n\t}\n\treturn [];\n}\n\nfunction isFileList(files: SendMessageInput[\"files\"]): files is FileList {\n\treturn typeof FileList !== \"undefined\" && files instanceof FileList;\n}\n\nfunction isFileArray(files: SendMessageInput[\"files\"]): files is File[] {\n\treturn (\n\t\ttypeof File !== \"undefined\" &&\n\t\tArray.isArray(files) &&\n\t\tfiles.every((file) => file instanceof File)\n\t);\n}\n\nfunction messagesFromRenderState(threadState: CodexChatRenderState): ChatMessage[] {\n\treturn threadState.items.flatMap((item): ChatMessage[] => {\n\t\tif (item.type === \"UserMessage\") {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: item.id,\n\t\t\t\t\tparts: item.content.flatMap(userInputToMessageParts),\n\t\t\t\t\trole: \"user\",\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t\tif (item.type === \"AgentMessage\") {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: item.id,\n\t\t\t\t\tparts: item.content.map((part) => ({\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: part.text,\n\t\t\t\t\t})),\n\t\t\t\t\trole: \"assistant\",\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t\treturn [];\n\t});\n}\n\nfunction userInputToMessageParts(input: CoreUserInput): MessagePart[] {\n\tif (input.type === \"text\") {\n\t\treturn [{ type: \"text\", text: input.text }];\n\t}\n\tif (input.type === \"image\") {\n\t\treturn [{ type: \"image\", url: input.image_url }];\n\t}\n\tif (input.type === \"local_image\") {\n\t\treturn [{ type: \"file\", url: input.path }];\n\t}\n\treturn [];\n}\n\nfunction normalizeThreadId(threadId: ThreadId | string): ThreadId {\n\treturn typeof threadId === \"string\" ? asThreadId(threadId) : threadId;\n}\n","import {\n\tcreateElement,\n\ttype ReactNode,\n\tuseCallback,\n} from \"react\";\n\nimport { useCodexChatRuntime } from \"./chat-runtime\";\n\nexport function CodexThread({ children }: { children?: ReactNode }) {\n\treturn createElement(\"div\", { \"data-codex-thread\": \"\" }, children);\n}\n\nexport function CodexMessages() {\n\tconst runtime = useCodexChatRuntime();\n\treturn createElement(\n\t\t\"div\",\n\t\t{ \"data-codex-messages\": \"\" },\n\t\truntime.messages.map((message) =>\n\t\t\tcreateElement(\n\t\t\t\t\"div\",\n\t\t\t\t{ \"data-role\": message.role, key: message.id },\n\t\t\t\tmessage.parts\n\t\t\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t\t\t.map((part) => part.text)\n\t\t\t\t\t.join(\"\\n\"),\n\t\t\t),\n\t\t),\n\t);\n}\n\nexport function CodexComposer() {\n\tconst runtime = useCodexChatRuntime();\n\tconst sendMessage = useCallback(\n\t\tasync (formData: FormData) => {\n\t\t\tconst text = String(formData.get(\"message\") ?? \"\");\n\t\t\tif (text.trim()) {\n\t\t\t\tawait runtime.sendMessage({ text });\n\t\t\t}\n\t\t},\n\t\t[runtime],\n\t);\n\treturn createElement(\n\t\t\"form\",\n\t\t{ action: sendMessage, \"data-codex-composer\": \"\" },\n\t\tcreateElement(\"textarea\", { name: \"message\" }),\n\t\tcreateElement(\"button\", { type: \"submit\" }, \"Send\"),\n\t);\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { C as CodexChat, a as CodexChatLayout, b as CodexChatLayoutProps, c as CodexChatProps, d as CodexChatProvider, e as CodexChatProviderProps, f as CodexChatSidebar, g as CodexChatSidebarProps, h as CodexChatView, i as CodexChatViewProps } from './chat-runtime-B6azJyKo.js';
1
+ export { C as CodexChat, a as CodexChatLayout, b as CodexChatLayoutProps, c as CodexChatProps, d as CodexChatProvider, e as CodexChatProviderProps, f as CodexChatSidebar, g as CodexChatSidebarProps, h as CodexChatView, i as CodexChatViewProps } from './chat-runtime-9RkXHC_w.js';
2
2
  export { S as ServerNotification, a as ServerRequest } from './ServerRequest-B5cKVJjr.js';
3
3
  export { C as CodexAppServerClientOptions, c as createCodexAppServerClient } from './remote-ClZbq9KN.js';
4
4
  export { C as CodexAppServer } from './session-BRYzi8OT.js';
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import './chunk-ZX5OIIJX.js';
2
- export { CodexChat, CodexChatLayout, CodexChatProvider, CodexChatSidebar, CodexChatView } from './chunk-ILXA6HLX.js';
2
+ export { CodexChat, CodexChatLayout, CodexChatProvider, CodexChatSidebar, CodexChatView } from './chunk-W7S6HFCQ.js';
3
3
  import './chunk-5JMJ6OI5.js';
4
4
  import './chunk-NCI4MAWZ.js';
5
5
  import './chunk-FN3SWHRH.js';
@@ -1,8 +1,9 @@
1
- export { j as ChatMessage, k as ChatRuntime, l as ChatRuntimeStatus, C as CodexChat, m as CodexChatComposerCommand, n as CodexChatComposerCommandName, o as CodexChatComposerSkill, p as CodexChatInteractionMode, a as CodexChatLayout, b as CodexChatLayoutProps, q as CodexChatLifecycle, r as CodexChatLifecycleOptions, s as CodexChatModelOption, t as CodexChatPendingRequest, u as CodexChatPendingRequestRenderContext, v as CodexChatPendingUserInputRenderContext, w as CodexChatProposedPlan, c as CodexChatProps, d as CodexChatProvider, e as CodexChatProviderProps, x as CodexChatProviderStatus, y as CodexChatRenderState, z as CodexChatRuntimeMode, A as CodexChatRuntimeOptions, f as CodexChatSidebar, g as CodexChatSidebarProps, h as CodexChatView, B as CodexChatViewComposerProps, D as CodexChatViewLifecycleProps, E as CodexChatViewManualProps, i as CodexChatViewProps, M as MessagePart, S as SendMessageInput, T as ThreadReader, F as createCodexChatRenderState, G as createDefaultTurnStartParams, H as useCodexChat, I as useCodexChatLifecycle, J as useCodexChatRuntime } from '../chat-runtime-B6azJyKo.js';
1
+ export { j as ChatMessage, k as ChatRuntime, l as ChatRuntimeStatus, C as CodexChat, m as CodexChatComposerCommand, n as CodexChatComposerCommandName, o as CodexChatComposerSkill, p as CodexChatInteractionMode, a as CodexChatLayout, b as CodexChatLayoutProps, q as CodexChatLifecycle, r as CodexChatLifecycleBuildThreadStartParamsInput, s as CodexChatLifecycleBuildTurnStartParamsInput, t as CodexChatLifecycleOptions, u as CodexChatLifecycleSendControls, v as CodexChatLifecycleSendOptions, w as CodexChatModelOption, x as CodexChatPendingRequest, y as CodexChatPendingRequestRenderContext, z as CodexChatPendingUserInputRenderContext, A as CodexChatProposedPlan, c as CodexChatProps, d as CodexChatProvider, e as CodexChatProviderProps, B as CodexChatProviderStatus, D as CodexChatRenderState, E as CodexChatRuntimeMode, F as CodexChatRuntimeOptions, f as CodexChatSidebar, g as CodexChatSidebarProps, h as CodexChatView, G as CodexChatViewComposerProps, H as CodexChatViewLifecycleProps, I as CodexChatViewManualProps, i as CodexChatViewProps, M as MessagePart, S as SendMessageInput, T as ThreadReader, J as createCodexChatRenderState, K as createDefaultThreadStartParams, L as createDefaultTurnStartParams, N as useCodexChat, O as useCodexChatLifecycle, P as useCodexChatRuntime } from '../chat-runtime-9RkXHC_w.js';
2
2
  import * as React from 'react';
3
3
  import { ReactNode } from 'react';
4
4
  export { L as LinkedMention, a as LinkedMentionRange, P as PROJECT_MENTION_SIGIL, S as SKILL_MENTION_SIGIL, T as TOOL_MENTION_SIGIL, b as buildCollapsedProposedPlanPreviewMarkdown, c as buildPlanImplementationPrompt, d as buildPlanImplementationThreadTitle, e as buildProposedPlanMarkdownFilename, f as decodeHistoryMentions, g as encodeHistoryMentions, h as findLinkedMentions, l as linkedMentionTextElements, m as mentionToken, n as normalizePlanMarkdownForExport, p as proposedPlanTitle, r as resolvePlanFollowUpSubmission, s as skillToken, i as stripDisplayedPlanMarkdown } from '../proposed-plan-DpN1ma0Y.js';
5
5
  export { C as ChatComposerHandle, a as ChatComposerSubmitPayload, b as CodexChatViewRenderComposerControls, c as CodexModelOption, d as CodexReasoningEffort, e as CodexReasoningEffortOption, f as ComposerDraftKey, g as ComposerDraftState, h as ComposerImageAttachment, i as ComposerImageValidationResult, E as ExpandedImagePreview, M as MentionBinding, j as MentionBindingRange, P as PersistedComposerDraftImageAttachment, k as ProviderDriverKind, l as ProviderInstanceEntry, m as ProviderInstanceId, R as RealtimeConversationControlState, n as RealtimeConversationPhase, o as RealtimeConversationUiState, p as RecordingMeterState, W as WORKSPACE_CHAT_MAX_IMAGE_ATTACHMENTS, q as WORKSPACE_CHAT_MAX_IMAGE_BYTES, r as assistantComposerDraftKey, s as buildExpandedImagePreview, t as codexModelOptions, u as codexReasoningEffortOptions, v as createComposerImageAttachments, w as defaultCodexModel, x as defaultCodexProviderInstance, y as defaultCodexReasoningEffort, z as getRealtimeConversationControlState, A as isAcceptedComposerImageFile, B as isCodexReasoningEffort, D as isRealtimeConversationLive, F as mentionBindingRangesForText, G as mentionBindingsAfterReplacement, H as normalizeMentionBindingsForText, I as persistComposerDraftAttachments, J as resolveCodexModelOption, K as resolveCodexReasoningEffortForModel, L as resolveCodexReasoningEffortOption, N as resolveDraftEffort, O as resolveDraftModel, Q as restoreComposerDraftAttachments, S as revokeComposerImageAttachments, T as useComposerDraftStore, U as useComposerThreadDraft, V as validateComposerImageFiles } from '../ProviderStatusBanner-BlP6lzwE.js';
6
+ import { a as ThreadEventSnapshot } from '../thread_event_store-C0zYzukG.js';
6
7
  import '@legendapp/list/react';
7
8
  import '../protocol-mpBcYHrm.js';
8
9
  import '../ToolRequestUserInputQuestion-CeZa5X1J.js';
@@ -12,18 +13,57 @@ import '../lib-nXlaKiS-.js';
12
13
  import '../types-BTeabLYr.js';
13
14
  import '../session-BRYzi8OT.js';
14
15
  import '../TurnSteerResponse-0kBCfplh.js';
15
- import '../thread_event_store-C0zYzukG.js';
16
- import '../rendered-thread-AOxw3V5b.js';
17
- import '../thread-history-builder-zW0zeqcS.js';
18
16
  import '../sidebar-DMMij22z.js';
19
17
  import 'class-variance-authority/types';
20
18
  import 'react/jsx-runtime';
21
19
  import 'class-variance-authority';
22
20
  import 'radix-ui';
23
21
  import '../store-AGRxhgQ3.js';
22
+ import '../thread-history-builder-zW0zeqcS.js';
24
23
  import '../ToolRequestUserInputResponse-zcPLwbiK.js';
25
24
  import 'zustand/middleware';
26
25
  import 'zustand';
26
+ import '../rendered-thread-AOxw3V5b.js';
27
+
28
+ type ChatLifecycleThreadState = Pick<ThreadEventSnapshot, "activeTurnIds" | "errors" | "pendingRequests" | "turns">;
29
+ type ChatLifecycleConnectionStatus = ThreadEventSnapshot["connectionStatus"];
30
+ type LocalDispatchSnapshot = {
31
+ errorCount: number;
32
+ itemIds: readonly string[];
33
+ runningTurnIds: readonly string[];
34
+ startedAt: string;
35
+ };
36
+ declare function createLocalDispatchSnapshot(threadState: ChatLifecycleThreadState | null): LocalDispatchSnapshot;
37
+ declare function hasServerAcknowledgedLocalDispatch(input: {
38
+ hasPendingRequest: boolean;
39
+ localDispatch: LocalDispatchSnapshot | null;
40
+ runtimeError: string | null;
41
+ threadState: ChatLifecycleThreadState | null;
42
+ }): boolean;
43
+ declare function useLocalDispatchState(input: {
44
+ hasPendingRequest: boolean;
45
+ runtimeError: string | null;
46
+ threadState: ChatLifecycleThreadState | null;
47
+ }): {
48
+ beginLocalDispatch: () => void;
49
+ isSendBusy: boolean;
50
+ localDispatch: LocalDispatchSnapshot | null;
51
+ localDispatchStartedAt: string | null;
52
+ resetLocalDispatch: () => void;
53
+ serverAcknowledgedLocalDispatch: boolean;
54
+ };
55
+ declare function deriveActiveWorkStartedAt(input: {
56
+ isWorking: boolean;
57
+ runtimeStartedAt: string | null;
58
+ sendStartedAt: string | null;
59
+ }): string | null;
60
+ declare function deriveAssistantStreaming(threadState: ChatLifecycleThreadState | null): boolean;
61
+ declare function deriveChatLifecycleWorkingState(input: {
62
+ connectionStatus: ChatLifecycleConnectionStatus;
63
+ isSendBusy: boolean;
64
+ threadState: ChatLifecycleThreadState | null;
65
+ }): boolean;
66
+ declare function threadHasStarted(threadState: ChatLifecycleThreadState | null): boolean;
27
67
 
28
68
  declare function CodexThread({ children }: {
29
69
  children?: ReactNode;
@@ -38,4 +78,4 @@ declare function CodexComposer(): React.ReactElement<{
38
78
  "data-codex-composer": string;
39
79
  }, string | React.JSXElementConstructor<any>>;
40
80
 
41
- export { CodexComposer, CodexMessages, CodexThread };
81
+ export { CodexComposer, CodexMessages, CodexThread, type LocalDispatchSnapshot, createLocalDispatchSnapshot, deriveActiveWorkStartedAt, deriveAssistantStreaming, deriveChatLifecycleWorkingState, hasServerAcknowledgedLocalDispatch, threadHasStarted, useLocalDispatchState };
@@ -1,4 +1,4 @@
1
- export { CodexChat, CodexChatLayout, CodexChatProvider, CodexChatSidebar, CodexChatView, CodexComposer, CodexMessages, CodexThread, createCodexChatRenderState, createDefaultTurnStartParams, useCodexChat, useCodexChatLifecycle, useCodexChatRuntime } from '../chunk-ILXA6HLX.js';
1
+ export { CodexChat, CodexChatLayout, CodexChatProvider, CodexChatSidebar, CodexChatView, CodexComposer, CodexMessages, CodexThread, createCodexChatRenderState, createDefaultThreadStartParams, createDefaultTurnStartParams, createLocalDispatchSnapshot, deriveActiveWorkStartedAt, deriveAssistantStreaming, deriveChatLifecycleWorkingState, hasServerAcknowledgedLocalDispatch, threadHasStarted, useCodexChat, useCodexChatLifecycle, useCodexChatRuntime, useLocalDispatchState } from '../chunk-W7S6HFCQ.js';
2
2
  import '../chunk-5JMJ6OI5.js';
3
3
  export { PROJECT_MENTION_SIGIL, RecordingMeterState, SKILL_MENTION_SIGIL, TOOL_MENTION_SIGIL, WORKSPACE_CHAT_MAX_IMAGE_ATTACHMENTS, WORKSPACE_CHAT_MAX_IMAGE_BYTES, assistantComposerDraftKey, buildCollapsedProposedPlanPreviewMarkdown, buildExpandedImagePreview, buildPlanImplementationPrompt, buildPlanImplementationThreadTitle, buildProposedPlanMarkdownFilename, codexModelOptions, codexReasoningEffortOptions, createComposerImageAttachments, decodeHistoryMentions, defaultCodexModel, defaultCodexProviderInstance, defaultCodexReasoningEffort, encodeHistoryMentions, findLinkedMentions, getRealtimeConversationControlState, isAcceptedComposerImageFile, isCodexReasoningEffort, isRealtimeConversationLive, linkedMentionTextElements, mentionBindingRangesForText, mentionBindingsAfterReplacement, mentionToken, normalizeMentionBindingsForText, normalizePlanMarkdownForExport, persistComposerDraftAttachments, proposedPlanTitle, resolveCodexModelOption, resolveCodexReasoningEffortForModel, resolveCodexReasoningEffortOption, resolveDraftEffort, resolveDraftModel, resolvePlanFollowUpSubmission, restoreComposerDraftAttachments, revokeComposerImageAttachments, skillToken, stripDisplayedPlanMarkdown, useComposerDraftStore, useComposerThreadDraft, validateComposerImageFiles } from '../chunk-NCI4MAWZ.js';
4
4
  import '../chunk-FN3SWHRH.js';