@@ -30,8 +30,9 @@ type writeTool struct {
32type WriteResponseMetadata struct {
32type WriteResponseMetadata struct {
33+ Diff string `json:"diff"`
33− Additions int `json:"additions"`
34+ Additions int `json:"additions"`
34− Removals int `json:"removals"`
35+ Removals int `json:"removals"`
@@ -128,12 +129,12 @@ func (w *writeTool) Run(ctx context.Context, call ToolCall) (ToolResponse, error
128 return NewTextErrorResponse(fmt.Sprintf("File %s already contains the exact content. No changes made.", filePath)), nil
129 return NewTextErrorResponse(fmt.Sprintf("File %s already contains the exact content. No changes made.", filePath)), nil
130 } else if !os.IsNotExist(err) {
131 } else if !os.IsNotExist(err) {
131− return NewTextErrorResponse(fmt.Sprintf("Failed to access file: %s", err)), nil
132+ return ToolResponse{}, fmt.Errorf("error checking file: %w", err)
134 dir := filepath.Dir(filePath)
135 dir := filepath.Dir(filePath)
135 if err = os.MkdirAll(dir, 0o755); err != nil {
136 if err = os.MkdirAll(dir, 0o755); err != nil {
136− return NewTextErrorResponse(fmt.Sprintf("Failed to create parent directories: %s", err)), nil
137+ return ToolResponse{}, fmt.Errorf("error creating directory: %w", err)
139 oldContent := ""
140 oldContent := ""
@@ -146,7 +147,7 @@ func (w *writeTool) Run(ctx context.Context, call ToolCall) (ToolResponse, error
147 sessionID, messageID := GetContextValues(ctx)
148 sessionID, messageID := GetContextValues(ctx)
148 if sessionID == "" || messageID == "" {
149 if sessionID == "" || messageID == "" {
149− return NewTextErrorResponse("session ID or message ID is missing"), nil
150+ return ToolResponse{}, fmt.Errorf("session_id and message_id are required")
151 diff, stats, err := git.GenerateGitDiffWithStats(
152 diff, stats, err := git.GenerateGitDiffWithStats(
152 removeWorkingDirectoryPrefix(filePath),
153 removeWorkingDirectoryPrefix(filePath),
@@ -154,7 +155,7 @@ func (w *writeTool) Run(ctx context.Context, call ToolCall) (ToolResponse, error
154 params.Content,
155 params.Content,
156 if err != nil {
157 if err != nil {
157− return NewTextErrorResponse(fmt.Sprintf("Failed to get file diff: %s", err)), nil
158+ return ToolResponse{}, fmt.Errorf("error generating diff: %w", err)
159 p := w.permissions.Request(
160 p := w.permissions.Request(
160 permission.CreatePermissionRequest{
161 permission.CreatePermissionRequest{
@@ -169,12 +170,12 @@ func (w *writeTool) Run(ctx context.Context, call ToolCall) (ToolResponse, error
172− return NewTextErrorResponse(fmt.Sprintf("Permission denied to create file: %s", filePath)), nil
173+ return ToolResponse{}, permission.ErrorPermissionDenied
175 err = os.WriteFile(filePath, []byte(params.Content), 0o644)
176 err = os.WriteFile(filePath, []byte(params.Content), 0o644)
176 if err != nil {
177 if err != nil {
177− return NewTextErrorResponse(fmt.Sprintf("Failed to write file: %s", err)), nil
178+ return ToolResponse{}, fmt.Errorf("error writing file: %w", err)
180 recordFileWrite(filePath)
181 recordFileWrite(filePath)
@@ -186,6 +187,7 @@ func (w *writeTool) Run(ctx context.Context, call ToolCall) (ToolResponse, error
186 result += getDiagnostics(filePath, w.lspClients)
187 result += getDiagnostics(filePath, w.lspClients)
187 return WithResponseMetadata(NewTextResponse(result),
188 return WithResponseMetadata(NewTextResponse(result),
188 WriteResponseMetadata{
189 WriteResponseMetadata{
189 Additions: stats.Additions,
191 Additions: stats.Additions,
190 Removals: stats.Removals,
192 Removals: stats.Removals,