@@ -46,14 +46,15 @@ import { MessageV2 } from "@/session/message-v2"
4646import { Config } from "@/config"
4747import { ConfigMCP } from "@/config/mcp"
4848import { Todo } from "@/session/todo"
49- import { z } from "zod "
49+ import { Result , Schema } from "effect "
5050import { LoadAPIKeyError } from "ai"
5151import type { AssistantMessage , Event , OpencodeClient , SessionMessageResponse , ToolPart } from "@opencode-ai/sdk/v2"
5252import { applyPatch } from "diff"
5353import { InstallationVersion } from "@/installation/version"
5454
5555type ModeOption = { id : string ; name : string ; description ?: string }
5656type ModelOption = { modelId : string ; name : string }
57+ const decodeTodos = Schema . decodeUnknownResult ( Schema . fromJsonString ( Schema . Array ( Todo . Info ) ) )
5758
5859const DEFAULT_VARIANT_VALUE = "default"
5960
@@ -372,14 +373,14 @@ export class Agent implements ACPAgent {
372373 }
373374
374375 if ( part . tool === "todowrite" ) {
375- const parsedTodos = z . array ( Todo . Info . zod ) . safeParse ( JSON . parse ( part . state . output ) )
376- if ( parsedTodos . success ) {
376+ const parsedTodos = decodeTodos ( part . state . output )
377+ if ( Result . isSuccess ( parsedTodos ) ) {
377378 await this . connection
378379 . sessionUpdate ( {
379380 sessionId,
380381 update : {
381382 sessionUpdate : "plan" ,
382- entries : parsedTodos . data . map ( ( todo ) => {
383+ entries : parsedTodos . success . map ( ( todo ) => {
383384 const status : PlanEntry [ "status" ] =
384385 todo . status === "cancelled" ? "completed" : ( todo . status as PlanEntry [ "status" ] )
385386 return {
@@ -394,7 +395,7 @@ export class Agent implements ACPAgent {
394395 log . error ( "failed to send session update for todo" , { error } )
395396 } )
396397 } else {
397- log . error ( "failed to parse todo output" , { error : parsedTodos . error } )
398+ log . error ( "failed to parse todo output" , { error : parsedTodos . failure } )
398399 }
399400 }
400401
@@ -901,14 +902,14 @@ export class Agent implements ACPAgent {
901902 }
902903
903904 if ( part . tool === "todowrite" ) {
904- const parsedTodos = z . array ( Todo . Info . zod ) . safeParse ( JSON . parse ( part . state . output ) )
905- if ( parsedTodos . success ) {
905+ const parsedTodos = decodeTodos ( part . state . output )
906+ if ( Result . isSuccess ( parsedTodos ) ) {
906907 await this . connection
907908 . sessionUpdate ( {
908909 sessionId,
909910 update : {
910911 sessionUpdate : "plan" ,
911- entries : parsedTodos . data . map ( ( todo ) => {
912+ entries : parsedTodos . success . map ( ( todo ) => {
912913 const status : PlanEntry [ "status" ] =
913914 todo . status === "cancelled" ? "completed" : ( todo . status as PlanEntry [ "status" ] )
914915 return {
@@ -923,7 +924,7 @@ export class Agent implements ACPAgent {
923924 log . error ( "failed to send session update for todo" , { error : err } )
924925 } )
925926 } else {
926- log . error ( "failed to parse todo output" , { error : parsedTodos . error } )
927+ log . error ( "failed to parse todo output" , { error : parsedTodos . failure } )
927928 }
928929 }
929930
0 commit comments