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..829345f 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", @@ -129,9 +129,8 @@ test("projects a complete assistant step and repairs volatile deltas with termin type: "assistant", }); expect(assistant?.type === "assistant" && assistant.content).toEqual([ - { state: { response: true }, text: "authoritative text", type: "text" }, + { text: "authoritative text", type: "text" }, { - state: { phase: "done" }, text: "authoritative reasoning", time: { completed: 1, created: 1 }, type: "reasoning", @@ -140,8 +139,6 @@ 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" }, 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..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.providerState === undefined || isJsonRecord(data.providerState)) && (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.providerState === undefined || isJsonRecord(data.providerState)) && (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.state === undefined || isJsonRecord(data.state)) + 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.state === undefined || isJsonRecord(data.state)) + 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.state === undefined || isJsonRecord(data.state)) + 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.resultState === undefined || isJsonRecord(data.resultState)) + (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.resultState === undefined || isJsonRecord(data.resultState)) + (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.state, - ), + 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.state), + 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.state, - ), + 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.state, ), ); case "session.tool.progress": @@ -294,7 +272,6 @@ function reduceTranscriptEvent( event.data.metadata, event.data.executed, event.created, - event.data.resultState, ), ); case "session.tool.failed": @@ -307,7 +284,6 @@ function reduceTranscriptEvent( event.data.metadata, event.data.executed, event.created, - event.data.resultState, ), ); case "session.retry.scheduled": @@ -370,7 +346,6 @@ function endAssistantStep( ...message, cost: event.data.cost, finish: event.data.finish, - ...(event.data.providerState === undefined ? {} : { providerState: event.data.providerState }), ...(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.providerState === undefined ? {} : { providerState: event.data.providerState }), ...(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, - state?: ToolInput, ) { const existing = findTextPart(message, ordinal, type); if (existing) return message; @@ -531,7 +504,6 @@ function startTextPart( part = { text: "", type: "text" }; } else { part = { - ...(state === undefined ? {} : { state }), text: "", time: { created: at }, type: "reasoning", @@ -546,19 +518,16 @@ function finishTextPart( type: "reasoning" | "text", at: number, text: string, - state?: ToolInput, ) { return updateTextPart(message, ordinal, type, (part) => { if (part.type === "text") { return { ...part, - ...(state === undefined ? {} : { state }), text, }; } return { ...part, - ...(state === undefined ? {} : { state }), text, time: { created: part.time?.created ?? at, completed: at }, }; @@ -615,12 +584,10 @@ function setToolRunning( input: ToolInput, executed: boolean, at: number, - providerState: ToolInput | undefined, ) { return updateTool(message, id, (tool) => ({ ...tool, executed, - ...(providerState === undefined ? {} : { providerState }), state: { input, metadata: {}, status: "running" }, time: { ...tool.time, ran: at }, })); @@ -639,12 +606,10 @@ function setToolCompleted( metadata: ToolInput | undefined, executed: boolean, at: number, - providerResultState: ToolInput | undefined, ) { return updateTool(message, id, (tool) => ({ ...tool, executed: executed || tool.executed === true, - ...(providerResultState === undefined ? {} : { providerResultState }), state: { content: content as [ToolContent, ...ToolContent[]], input: toolInput(tool), @@ -663,14 +628,12 @@ function setToolFailed( metadata: ToolInput | undefined, executed: boolean, at: number, - providerResultState: 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 }), state: { ...(content ? { content: content as [ToolContent, ...ToolContent[]] } : {}), error, 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.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 f58cdd7..c10dd7f 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; @@ -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; 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