From c3933314a40682bfaf7a1370d64e7d636747b561 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 20 Oct 2026 10:08:36 +0000 Subject: [PATCH 1/3] Update OpenCode client to 2.1.0 --- packages/opencode-adapter/package.json | 2 +- packages/opencode-adapter/src/index.ts | 2 +- pnpm-lock.yaml | 28 +++++++++++++------------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/opencode-adapter/package.json b/packages/opencode-adapter/package.json index c0d75fd..7b43e77 100644 --- a/packages/opencode-adapter/package.json +++ b/packages/opencode-adapter/package.json @@ -18,7 +18,7 @@ "typecheck": "tsc -p tsconfig.json" }, "dependencies": { - "@opencode/client": "2.0.32" + "@opencode/client": "2.1.0" }, "devDependencies": { "@opencode2-mobile/test-fixtures": "workspace:*", diff --git a/packages/opencode-adapter/src/index.ts b/packages/opencode-adapter/src/index.ts index f58cdd7..47eae08 100644 --- a/packages/opencode-adapter/src/index.ts +++ b/packages/opencode-adapter/src/index.ts @@ -23,7 +23,7 @@ import { import { ensurePromiseWithResolvers } from "./promise-with-resolvers"; -export const openCodeClientContractVersion = "2.0.32"; +export const openCodeClientContractVersion = "2.1.0"; export type OpenCodeClientOptions = { authorization?: string; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fc19cbe..767d48a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -203,8 +203,8 @@ importers: packages/opencode-adapter: dependencies: '@opencode/client': - specifier: 2.0.32 - version: 2.0.32(effect@4.0.1) + specifier: 2.1.0 + version: 2.1.0(effect@4.0.1) devDependencies: '@opencode2-mobile/test-fixtures': specifier: workspace:* @@ -1517,8 +1517,8 @@ packages: solid-js: optional: true - '@opencode/client@2.0.32': - resolution: {integrity: sha512-QjejcJTOC5v51gCMt7cRZJJsIydT1uGUowtiNkXWlIhKD7+/260PyqQ3S/2StnmwXucPOq6YNNkLLPv2gio6Iw==} + '@opencode/client@2.1.0': + resolution: {integrity: sha512-2rT2cog3QFMErvWaUvV3M5I9SvBF8p8MWC5PHh+Rno2Z828SiVQRlmXO0BwbxRou3xmAgKk5dHk0573BS2VBTw==} peerDependencies: effect: 4.0.1 solid-js: '>=1.9.0' @@ -1548,14 +1548,14 @@ packages: '@opencode/protocol@2.0.27': resolution: {integrity: sha512-t1j+m5T3TBusHaL58t6gSSQQEFoi+qjVyQ0Eta/4mLeZLJDqSV8BNN6N93GFpV2MJ1iBpGmrH0C02n2Q+nDHfw==} - '@opencode/protocol@2.0.32': - resolution: {integrity: sha512-aF0oW0T6vBUO+EfD0po5gNz9YzQnT+b3InhKaOGg3p8K1S1A1tVkEoOBR7gKWQjAmlpfAPP8zWx4Fgsc7nsCbQ==} + '@opencode/protocol@2.1.0': + resolution: {integrity: sha512-Zo1TDw5Yx41Bi7+I0Djs0b92IcPP7Jg/k+lL6FLm+m46TT27wIG7n8xPV490LTo4sXTtknYddnU4aLpwqaIa3g==} '@opencode/schema@2.0.27': resolution: {integrity: sha512-BxGuiIFo503tW6UYxoBrrgjyczEvPiU3fDn45FxUHtmZgBC8kFE+ldI56ab8kV0Lu5C94ZKOniRb2bWqDu4tAg==} - '@opencode/schema@2.0.32': - resolution: {integrity: sha512-FQOHjPUZwoEflWXFTaNirICglfOi+simArwm9UMj0/aFjYobsZbNh6l7AS8/sslZB+pkR8NB/JWEu29MlJpDeA==} + '@opencode/schema@2.1.0': + resolution: {integrity: sha512-Cv1bP3lEDXbRvmlw7pwDhMNFSAOy+Zo8zBs/t0lP1iWZE6tqMhRb1lsvaX6DPI8iwzF3QW2b9dKcixPjlqwAhQ==} '@opencode/util@2.0.27': resolution: {integrity: sha512-2TIEAJsX4UsyV9CHSk+/6jHWrEllgomgD0WQ8Ne+SN4xlmN9cGUvZo/Jgk0XrZZXSmADDOIER2HLcaI0tAr22A==} @@ -7407,10 +7407,10 @@ snapshots: optionalDependencies: effect: 4.0.1 - '@opencode/client@2.0.32(effect@4.0.1)': + '@opencode/client@2.1.0(effect@4.0.1)': dependencies: - '@opencode/protocol': 2.0.32 - '@opencode/schema': 2.0.32 + '@opencode/protocol': 2.1.0 + '@opencode/schema': 2.1.0 optionalDependencies: effect: 4.0.1 @@ -7436,9 +7436,9 @@ snapshots: '@opencode/schema': 2.0.27 effect: 4.0.1 - '@opencode/protocol@2.0.32': + '@opencode/protocol@2.1.0': dependencies: - '@opencode/schema': 2.0.32 + '@opencode/schema': 2.1.0 effect: 4.0.1 '@opencode/schema@2.0.27': @@ -7446,7 +7446,7 @@ snapshots: '@standard-schema/spec': 1.1.0 effect: 4.0.1 - '@opencode/schema@2.0.32': + '@opencode/schema@2.1.0': dependencies: '@standard-schema/spec': 1.1.0 effect: 4.0.1 From 2954dd1035f5edac007903a803597c628a62abfa Mon Sep 17 00:00:00 2001 From: Eivind Jonassen Date: Tue, 20 Oct 2026 14:42:21 +0200 Subject: [PATCH 2/3] Adapt to OpenCode 2.1.0 native message state OpenCode 2.1.0 replaces the provider state fields (`state`, `providerState`, `resultState`, `providerResultState`) with a single `native` field on events and message parts, and drops `recent` from compaction messages. Co-Authored-By: Claude Opus 5.5 --- .../src/screens/session-transcript.test.tsx | 1 - .../mobile/src/screens/session-transcript.tsx | 2 +- .../state/transcript-event-reducer.test.ts | 20 +++---- .../src/state/transcript-event-reducer.ts | 52 +++++++++---------- packages/opencode-adapter/src/index.test.ts | 2 - packages/opencode-adapter/src/index.ts | 3 +- 6 files changed, 38 insertions(+), 42 deletions(-) diff --git a/apps/mobile/src/screens/session-transcript.test.tsx b/apps/mobile/src/screens/session-transcript.test.tsx index e949b9f..09bbbbb 100644 --- a/apps/mobile/src/screens/session-transcript.test.tsx +++ b/apps/mobile/src/screens/session-transcript.test.tsx @@ -698,7 +698,6 @@ const messages: SessionMessageInfo[] = [ { id: "msg_compaction", reason: "auto", - recent: "Recent context", status: "completed", summary: "Compaction summary", time: { created: 10 }, diff --git a/apps/mobile/src/screens/session-transcript.tsx b/apps/mobile/src/screens/session-transcript.tsx index 82595c9..855348f 100644 --- a/apps/mobile/src/screens/session-transcript.tsx +++ b/apps/mobile/src/screens/session-transcript.tsx @@ -633,7 +633,7 @@ export const SessionTranscriptRow = memo(function SessionTranscriptRow({ ); default: diff --git a/apps/mobile/src/state/transcript-event-reducer.test.ts b/apps/mobile/src/state/transcript-event-reducer.test.ts index 1e8eea9..bd9cd0d 100644 --- a/apps/mobile/src/state/transcript-event-reducer.test.ts +++ b/apps/mobile/src/state/transcript-event-reducer.test.ts @@ -39,7 +39,7 @@ test("projects a complete assistant step and repairs volatile deltas with termin assistantMessageID: "msg_assistant", ordinal: 0, sessionID: "session-1", - state: { phase: "thinking" }, + native: { phase: "thinking" }, }), transcriptEvent("session.reasoning.delta", { assistantMessageID: "msg_assistant", @@ -51,14 +51,14 @@ test("projects a complete assistant step and repairs volatile deltas with termin assistantMessageID: "msg_assistant", ordinal: 0, sessionID: "session-1", - state: { response: true }, + native: { response: true }, text: "authoritative text", }), transcriptEvent("session.reasoning.ended", { assistantMessageID: "msg_assistant", ordinal: 0, sessionID: "session-1", - state: { phase: "done" }, + native: { phase: "done" }, text: "authoritative reasoning", }), transcriptEvent("session.tool.input.started", { @@ -85,7 +85,7 @@ test("projects a complete assistant step and repairs volatile deltas with termin id: "tool-1", input: { path: "file.ts" }, sessionID: "session-1", - state: { request: "accepted" }, + native: { request: "accepted" }, }), transcriptEvent("session.tool.progress", { assistantMessageID: "msg_assistant", @@ -99,7 +99,7 @@ test("projects a complete assistant step and repairs volatile deltas with termin executed: true, id: "tool-1", metadata: { progress: 1 }, - resultState: { complete: true }, + native: { complete: true }, sessionID: "session-1", }), transcriptEvent("session.step.ended", { @@ -107,7 +107,7 @@ test("projects a complete assistant step and repairs volatile deltas with termin cost: 0.25, files: ["changed.ts"], finish: "stop", - providerState: { settled: true }, + native: { settled: true }, rawFinish: "done", sessionID: "session-1", snapshot: "end-snapshot", @@ -124,14 +124,15 @@ test("projects a complete assistant step and repairs volatile deltas with termin cost: 0.25, finish: "stop", id: "msg_assistant", + native: { settled: true }, rawFinish: "done", snapshot: { end: "end-snapshot", files: ["changed.ts"], start: "start-snapshot" }, type: "assistant", }); expect(assistant?.type === "assistant" && assistant.content).toEqual([ - { state: { response: true }, text: "authoritative text", type: "text" }, + { native: { response: true }, text: "authoritative text", type: "text" }, { - state: { phase: "done" }, + native: { phase: "done" }, text: "authoritative reasoning", time: { completed: 1, created: 1 }, type: "reasoning", @@ -140,8 +141,7 @@ test("projects a complete assistant step and repairs volatile deltas with termin executed: true, id: "tool-1", name: "read", - providerResultState: { complete: true }, - providerState: { request: "accepted" }, + native: { complete: true }, state: { content: [{ mime: "text/plain", type: "file", uri: "file:///redacted" }], input: { path: "file.ts" }, diff --git a/apps/mobile/src/state/transcript-event-reducer.ts b/apps/mobile/src/state/transcript-event-reducer.ts index 61fffb2..d53b7db 100644 --- a/apps/mobile/src/state/transcript-event-reducer.ts +++ b/apps/mobile/src/state/transcript-event-reducer.ts @@ -64,7 +64,7 @@ export function isValidTranscriptReductionEvent(event: OpenCodeEvent) { isFiniteNumber(data.cost) && isTokenUsage(data.tokens) && (data.rawFinish === undefined || isBoundedString(data.rawFinish)) && - (data.providerState === undefined || isJsonRecord(data.providerState)) && + (data.native === undefined || isJsonRecord(data.native)) && (data.snapshot === undefined || isBoundedString(data.snapshot, 4096)) && isOptionalStringArray(data.files) ); @@ -75,7 +75,7 @@ export function isValidTranscriptReductionEvent(event: OpenCodeEvent) { isStructuredError(data.error) && (data.finish === undefined || data.finish === "content-filter") && (data.rawFinish === undefined || isBoundedString(data.rawFinish)) && - (data.providerState === undefined || isJsonRecord(data.providerState)) && + (data.native === undefined || isJsonRecord(data.native)) && (data.cost === undefined || isFiniteNumber(data.cost)) && (data.tokens === undefined || isTokenUsage(data.tokens)) && (data.snapshot === undefined || isBoundedString(data.snapshot, 4096)) && @@ -87,7 +87,7 @@ export function isValidTranscriptReductionEvent(event: OpenCodeEvent) { isEventTime(event.created) && isMessageID(data.assistantMessageID) && isOrdinal(data.ordinal) && - (data.state === undefined || isJsonRecord(data.state)) + (data.native === undefined || isJsonRecord(data.native)) ); case "session.text.delta": case "session.reasoning.delta": @@ -103,7 +103,7 @@ export function isValidTranscriptReductionEvent(event: OpenCodeEvent) { isMessageID(data.assistantMessageID) && isOrdinal(data.ordinal) && isBoundedString(data.text) && - (data.state === undefined || isJsonRecord(data.state)) + (data.native === undefined || isJsonRecord(data.native)) ); case "session.tool.input.started": return ( @@ -127,7 +127,7 @@ export function isValidTranscriptReductionEvent(event: OpenCodeEvent) { isToolID(data.id) && isJsonRecord(data.input) && typeof data.executed === "boolean" && - (data.state === undefined || isJsonRecord(data.state)) + (data.native === undefined || isJsonRecord(data.native)) ); case "session.tool.progress": return ( @@ -144,7 +144,7 @@ export function isValidTranscriptReductionEvent(event: OpenCodeEvent) { data.content.length <= 256 && data.content.every(isToolContent) && (data.metadata === undefined || isJsonRecord(data.metadata)) && - (data.resultState === undefined || isJsonRecord(data.resultState)) + (data.native === undefined || isJsonRecord(data.native)) ); case "session.tool.failed": return ( @@ -159,7 +159,7 @@ export function isValidTranscriptReductionEvent(event: OpenCodeEvent) { data.content.length <= 256 && data.content.every(isToolContent))) && (data.metadata === undefined || isJsonRecord(data.metadata)) && - (data.resultState === undefined || isJsonRecord(data.resultState)) + (data.native === undefined || isJsonRecord(data.native)) ); case "session.retry.scheduled": return ( @@ -236,12 +236,12 @@ function reduceTranscriptEvent( "text", event.created, event.data.text, - event.data.state, + event.data.native, ), ); case "session.reasoning.started": return updateAssistantMessage(current, event.data.assistantMessageID, (message) => - startTextPart(message, event.data.ordinal, "reasoning", event.created, event.data.state), + startTextPart(message, event.data.ordinal, "reasoning", event.created, event.data.native), ); case "session.reasoning.delta": return updateAssistantMessage(current, event.data.assistantMessageID, (message) => @@ -255,7 +255,7 @@ function reduceTranscriptEvent( "reasoning", event.created, event.data.text, - event.data.state, + event.data.native, ), ); case "session.tool.input.started": @@ -278,7 +278,7 @@ function reduceTranscriptEvent( event.data.input, event.data.executed, event.created, - event.data.state, + event.data.native, ), ); case "session.tool.progress": @@ -294,7 +294,7 @@ function reduceTranscriptEvent( event.data.metadata, event.data.executed, event.created, - event.data.resultState, + event.data.native, ), ); case "session.tool.failed": @@ -307,7 +307,7 @@ function reduceTranscriptEvent( event.data.metadata, event.data.executed, event.created, - event.data.resultState, + event.data.native, ), ); case "session.retry.scheduled": @@ -370,7 +370,7 @@ function endAssistantStep( ...message, cost: event.data.cost, finish: event.data.finish, - ...(event.data.providerState === undefined ? {} : { providerState: event.data.providerState }), + ...(event.data.native === undefined ? {} : { native: event.data.native }), ...(event.data.rawFinish === undefined ? {} : { rawFinish: event.data.rawFinish }), ...(snapshot === undefined ? {} : { snapshot }), time: { ...message.time, completed: event.created }, @@ -389,7 +389,7 @@ function failAssistantStep( error: event.data.error, finish: event.data.finish ?? "error", ...(event.data.cost === undefined ? {} : { cost: event.data.cost }), - ...(event.data.providerState === undefined ? {} : { providerState: event.data.providerState }), + ...(event.data.native === undefined ? {} : { native: event.data.native }), ...(event.data.rawFinish === undefined ? {} : { rawFinish: event.data.rawFinish }), ...(snapshot === undefined ? {} : { snapshot }), time: { ...message.time, completed: event.created }, @@ -522,7 +522,7 @@ function startTextPart( ordinal: number, type: "reasoning" | "text", at: number, - state?: ToolInput, + native?: ToolInput, ) { const existing = findTextPart(message, ordinal, type); if (existing) return message; @@ -531,7 +531,7 @@ function startTextPart( part = { text: "", type: "text" }; } else { part = { - ...(state === undefined ? {} : { state }), + ...(native === undefined ? {} : { native }), text: "", time: { created: at }, type: "reasoning", @@ -546,19 +546,19 @@ function finishTextPart( type: "reasoning" | "text", at: number, text: string, - state?: ToolInput, + native?: ToolInput, ) { return updateTextPart(message, ordinal, type, (part) => { if (part.type === "text") { return { ...part, - ...(state === undefined ? {} : { state }), + ...(native === undefined ? {} : { native }), text, }; } return { ...part, - ...(state === undefined ? {} : { state }), + ...(native === undefined ? {} : { native }), text, time: { created: part.time?.created ?? at, completed: at }, }; @@ -615,12 +615,12 @@ function setToolRunning( input: ToolInput, executed: boolean, at: number, - providerState: ToolInput | undefined, + native: ToolInput | undefined, ) { return updateTool(message, id, (tool) => ({ ...tool, executed, - ...(providerState === undefined ? {} : { providerState }), + ...(native === undefined ? {} : { native }), state: { input, metadata: {}, status: "running" }, time: { ...tool.time, ran: at }, })); @@ -639,12 +639,12 @@ function setToolCompleted( metadata: ToolInput | undefined, executed: boolean, at: number, - providerResultState: ToolInput | undefined, + native: ToolInput | undefined, ) { return updateTool(message, id, (tool) => ({ ...tool, executed: executed || tool.executed === true, - ...(providerResultState === undefined ? {} : { providerResultState }), + ...(native === undefined ? {} : { native }), state: { content: content as [ToolContent, ...ToolContent[]], input: toolInput(tool), @@ -663,14 +663,14 @@ function setToolFailed( metadata: ToolInput | undefined, executed: boolean, at: number, - providerResultState: ToolInput | undefined, + native: ToolInput | undefined, ) { return updateTool(message, id, (tool) => { const previousMetadata = tool.state.status === "running" ? tool.state.metadata : undefined; return { ...tool, executed: executed || tool.executed === true, - ...(providerResultState === undefined ? {} : { providerResultState }), + ...(native === undefined ? {} : { native }), state: { ...(content ? { content: content as [ToolContent, ...ToolContent[]] } : {}), error, diff --git a/packages/opencode-adapter/src/index.test.ts b/packages/opencode-adapter/src/index.test.ts index a7c5ddb..8607887 100644 --- a/packages/opencode-adapter/src/index.test.ts +++ b/packages/opencode-adapter/src/index.test.ts @@ -1487,7 +1487,6 @@ it("loads every current message variant and follows descending cursors toward ol { id: "msg_compaction_running", reason: "auto", - recent: "Recent", status: "running", summary: "Summary", time: { created: 10 }, @@ -1496,7 +1495,6 @@ it("loads every current message variant and follows descending cursors toward ol { id: "msg_compaction_completed", reason: "manual", - recent: "Recent", status: "completed", summary: "Summary", time: { created: 11 }, diff --git a/packages/opencode-adapter/src/index.ts b/packages/opencode-adapter/src/index.ts index 47eae08..c10dd7f 100644 --- a/packages/opencode-adapter/src/index.ts +++ b/packages/opencode-adapter/src/index.ts @@ -1002,8 +1002,7 @@ function isValidMessage(value: unknown): value is SessionMessageInfo { if (value.status === "failed") return isStructuredError(value.error); return ( (value.status === "running" || value.status === "completed") && - typeof value.summary === "string" && - typeof value.recent === "string" + typeof value.summary === "string" ); default: return false; From dc775818f0f6c1a15a176cbba81974f2e2018d65 Mon Sep 17 00:00:00 2001 From: Eivind Jonassen Date: Tue, 20 Oct 2026 14:48:54 +0200 Subject: [PATCH 3/3] Stop mirroring opaque provider state in transcript events The reducer copied provider-owned `native` state from events into cached messages, but nothing in the app reads it, and every upstream rename of that field broke the upgrade. REST snapshots remain authoritative and still carry it. Co-Authored-By: Claude Opus 5.5 --- .../state/transcript-event-reducer.test.ts | 5 +- .../src/state/transcript-event-reducer.ts | 53 +++---------------- 2 files changed, 9 insertions(+), 49 deletions(-) diff --git a/apps/mobile/src/state/transcript-event-reducer.test.ts b/apps/mobile/src/state/transcript-event-reducer.test.ts index bd9cd0d..829345f 100644 --- a/apps/mobile/src/state/transcript-event-reducer.test.ts +++ b/apps/mobile/src/state/transcript-event-reducer.test.ts @@ -124,15 +124,13 @@ test("projects a complete assistant step and repairs volatile deltas with termin cost: 0.25, finish: "stop", id: "msg_assistant", - native: { settled: true }, rawFinish: "done", snapshot: { end: "end-snapshot", files: ["changed.ts"], start: "start-snapshot" }, type: "assistant", }); expect(assistant?.type === "assistant" && assistant.content).toEqual([ - { native: { response: true }, text: "authoritative text", type: "text" }, + { text: "authoritative text", type: "text" }, { - native: { phase: "done" }, text: "authoritative reasoning", time: { completed: 1, created: 1 }, type: "reasoning", @@ -141,7 +139,6 @@ test("projects a complete assistant step and repairs volatile deltas with termin executed: true, id: "tool-1", name: "read", - native: { complete: true }, state: { content: [{ mime: "text/plain", type: "file", uri: "file:///redacted" }], input: { path: "file.ts" }, diff --git a/apps/mobile/src/state/transcript-event-reducer.ts b/apps/mobile/src/state/transcript-event-reducer.ts index d53b7db..a59ff50 100644 --- a/apps/mobile/src/state/transcript-event-reducer.ts +++ b/apps/mobile/src/state/transcript-event-reducer.ts @@ -64,7 +64,6 @@ export function isValidTranscriptReductionEvent(event: OpenCodeEvent) { isFiniteNumber(data.cost) && isTokenUsage(data.tokens) && (data.rawFinish === undefined || isBoundedString(data.rawFinish)) && - (data.native === undefined || isJsonRecord(data.native)) && (data.snapshot === undefined || isBoundedString(data.snapshot, 4096)) && isOptionalStringArray(data.files) ); @@ -75,7 +74,6 @@ export function isValidTranscriptReductionEvent(event: OpenCodeEvent) { isStructuredError(data.error) && (data.finish === undefined || data.finish === "content-filter") && (data.rawFinish === undefined || isBoundedString(data.rawFinish)) && - (data.native === undefined || isJsonRecord(data.native)) && (data.cost === undefined || isFiniteNumber(data.cost)) && (data.tokens === undefined || isTokenUsage(data.tokens)) && (data.snapshot === undefined || isBoundedString(data.snapshot, 4096)) && @@ -86,8 +84,7 @@ export function isValidTranscriptReductionEvent(event: OpenCodeEvent) { return ( isEventTime(event.created) && isMessageID(data.assistantMessageID) && - isOrdinal(data.ordinal) && - (data.native === undefined || isJsonRecord(data.native)) + isOrdinal(data.ordinal) ); case "session.text.delta": case "session.reasoning.delta": @@ -102,8 +99,7 @@ export function isValidTranscriptReductionEvent(event: OpenCodeEvent) { isEventTime(event.created) && isMessageID(data.assistantMessageID) && isOrdinal(data.ordinal) && - isBoundedString(data.text) && - (data.native === undefined || isJsonRecord(data.native)) + isBoundedString(data.text) ); case "session.tool.input.started": return ( @@ -126,8 +122,7 @@ export function isValidTranscriptReductionEvent(event: OpenCodeEvent) { isMessageID(data.assistantMessageID) && isToolID(data.id) && isJsonRecord(data.input) && - typeof data.executed === "boolean" && - (data.native === undefined || isJsonRecord(data.native)) + typeof data.executed === "boolean" ); case "session.tool.progress": return ( @@ -143,8 +138,7 @@ export function isValidTranscriptReductionEvent(event: OpenCodeEvent) { data.content.length > 0 && data.content.length <= 256 && data.content.every(isToolContent) && - (data.metadata === undefined || isJsonRecord(data.metadata)) && - (data.native === undefined || isJsonRecord(data.native)) + (data.metadata === undefined || isJsonRecord(data.metadata)) ); case "session.tool.failed": return ( @@ -158,8 +152,7 @@ export function isValidTranscriptReductionEvent(event: OpenCodeEvent) { data.content.length > 0 && data.content.length <= 256 && data.content.every(isToolContent))) && - (data.metadata === undefined || isJsonRecord(data.metadata)) && - (data.native === undefined || isJsonRecord(data.native)) + (data.metadata === undefined || isJsonRecord(data.metadata)) ); case "session.retry.scheduled": return ( @@ -230,18 +223,11 @@ function reduceTranscriptEvent( ); case "session.text.ended": return updateAssistantMessage(current, event.data.assistantMessageID, (message) => - finishTextPart( - message, - event.data.ordinal, - "text", - event.created, - event.data.text, - event.data.native, - ), + finishTextPart(message, event.data.ordinal, "text", event.created, event.data.text), ); case "session.reasoning.started": return updateAssistantMessage(current, event.data.assistantMessageID, (message) => - startTextPart(message, event.data.ordinal, "reasoning", event.created, event.data.native), + startTextPart(message, event.data.ordinal, "reasoning", event.created), ); case "session.reasoning.delta": return updateAssistantMessage(current, event.data.assistantMessageID, (message) => @@ -249,14 +235,7 @@ function reduceTranscriptEvent( ); case "session.reasoning.ended": return updateAssistantMessage(current, event.data.assistantMessageID, (message) => - finishTextPart( - message, - event.data.ordinal, - "reasoning", - event.created, - event.data.text, - event.data.native, - ), + finishTextPart(message, event.data.ordinal, "reasoning", event.created, event.data.text), ); case "session.tool.input.started": return updateAssistantMessage(current, event.data.assistantMessageID, (message) => @@ -278,7 +257,6 @@ function reduceTranscriptEvent( event.data.input, event.data.executed, event.created, - event.data.native, ), ); case "session.tool.progress": @@ -294,7 +272,6 @@ function reduceTranscriptEvent( event.data.metadata, event.data.executed, event.created, - event.data.native, ), ); case "session.tool.failed": @@ -307,7 +284,6 @@ function reduceTranscriptEvent( event.data.metadata, event.data.executed, event.created, - event.data.native, ), ); case "session.retry.scheduled": @@ -370,7 +346,6 @@ function endAssistantStep( ...message, cost: event.data.cost, finish: event.data.finish, - ...(event.data.native === undefined ? {} : { native: event.data.native }), ...(event.data.rawFinish === undefined ? {} : { rawFinish: event.data.rawFinish }), ...(snapshot === undefined ? {} : { snapshot }), time: { ...message.time, completed: event.created }, @@ -389,7 +364,6 @@ function failAssistantStep( error: event.data.error, finish: event.data.finish ?? "error", ...(event.data.cost === undefined ? {} : { cost: event.data.cost }), - ...(event.data.native === undefined ? {} : { native: event.data.native }), ...(event.data.rawFinish === undefined ? {} : { rawFinish: event.data.rawFinish }), ...(snapshot === undefined ? {} : { snapshot }), time: { ...message.time, completed: event.created }, @@ -522,7 +496,6 @@ function startTextPart( ordinal: number, type: "reasoning" | "text", at: number, - native?: ToolInput, ) { const existing = findTextPart(message, ordinal, type); if (existing) return message; @@ -531,7 +504,6 @@ function startTextPart( part = { text: "", type: "text" }; } else { part = { - ...(native === undefined ? {} : { native }), text: "", time: { created: at }, type: "reasoning", @@ -546,19 +518,16 @@ function finishTextPart( type: "reasoning" | "text", at: number, text: string, - native?: ToolInput, ) { return updateTextPart(message, ordinal, type, (part) => { if (part.type === "text") { return { ...part, - ...(native === undefined ? {} : { native }), text, }; } return { ...part, - ...(native === undefined ? {} : { native }), text, time: { created: part.time?.created ?? at, completed: at }, }; @@ -615,12 +584,10 @@ function setToolRunning( input: ToolInput, executed: boolean, at: number, - native: ToolInput | undefined, ) { return updateTool(message, id, (tool) => ({ ...tool, executed, - ...(native === undefined ? {} : { native }), state: { input, metadata: {}, status: "running" }, time: { ...tool.time, ran: at }, })); @@ -639,12 +606,10 @@ function setToolCompleted( metadata: ToolInput | undefined, executed: boolean, at: number, - native: ToolInput | undefined, ) { return updateTool(message, id, (tool) => ({ ...tool, executed: executed || tool.executed === true, - ...(native === undefined ? {} : { native }), state: { content: content as [ToolContent, ...ToolContent[]], input: toolInput(tool), @@ -663,14 +628,12 @@ function setToolFailed( metadata: ToolInput | undefined, executed: boolean, at: number, - native: ToolInput | undefined, ) { return updateTool(message, id, (tool) => { const previousMetadata = tool.state.status === "running" ? tool.state.metadata : undefined; return { ...tool, executed: executed || tool.executed === true, - ...(native === undefined ? {} : { native }), state: { ...(content ? { content: content as [ToolContent, ...ToolContent[]] } : {}), error,