Current section

46 Versions

Jump to

Compare versions

4 files changed
+21 additions
-14 deletions
  @@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7 7
8 8 ## [Unreleased]
9 9
10 + ## [0.13.3] - 2026-01-14
11 +
12 + ### Changed
13 + - **`ResultMessage` optional fields use sensible defaults** - `model_usage` defaults to `%{}` and `permission_denials` defaults to `[]` instead of `nil` ([cda582b])
14 +
15 + ### Fixed
16 + - **`ResultMessage.result` is now optional** - Error messages from the CLI may contain an `errors` array instead of a `result` field. The field no longer crashes when nil and displays errors appropriately ([c06e825])
17 +
10 18 ## [0.13.2] - 2026-01-08
11 19
12 20 ### Fixed
  @@ -3,7 +3,7 @@
3 3 <<"https://github.com/guess/claude_code/blob/main/CHANGELOG.md">>},
4 4 {<<"GitHub">>,<<"https://github.com/guess/claude_code">>}]}.
5 5 {<<"name">>,<<"claude_code">>}.
6 - {<<"version">>,<<"0.13.2">>}.
6 + {<<"version">>,<<"0.13.3">>}.
7 7 {<<"description">>,
8 8 <<"The Elixir SDK for building AI agents with Claude Code">>}.
9 9 {<<"elixir">>,<<"~> 1.18">>}.
  @@ -62,7 +62,6 @@ defmodule ClaudeCode.Message.ResultMessage do
62 62 :duration_ms,
63 63 :duration_api_ms,
64 64 :num_turns,
65 - :result,
66 65 :session_id,
67 66 :total_cost_usd,
68 67 :usage
  @@ -92,13 +91,13 @@ defmodule ClaudeCode.Message.ResultMessage do
92 91 duration_ms: float(),
93 92 duration_api_ms: float(),
94 93 num_turns: non_neg_integer(),
95 - result: String.t(),
94 + result: String.t() | nil,
96 95 session_id: Types.session_id(),
97 96 total_cost_usd: float(),
98 97 usage: Types.usage(),
99 98 uuid: String.t() | nil,
100 - model_usage: %{String.t() => Types.model_usage()} | nil,
101 - permission_denials: [Types.permission_denial()] | nil,
99 + model_usage: %{String.t() => Types.model_usage()},
100 + permission_denials: [Types.permission_denial()],
102 101 structured_output: any() | nil,
103 102 errors: [String.t()] | nil
104 103 }
  @@ -122,7 +121,6 @@ defmodule ClaudeCode.Message.ResultMessage do
122 121 "duration_ms",
123 122 "duration_api_ms",
124 123 "num_turns",
125 - "result",
126 124 "session_id",
127 125 "total_cost_usd",
128 126 "usage"
  @@ -197,15 +195,13 @@ defmodule ClaudeCode.Message.ResultMessage do
197 195 defp parse_server_tool_use(%{"web_search_requests" => count}), do: %{web_search_requests: count}
198 196 defp parse_server_tool_use(_), do: %{web_search_requests: 0}
199 197
200 - defp parse_model_usage(nil), do: nil
201 -
202 198 defp parse_model_usage(model_usage) when is_map(model_usage) do
203 199 Map.new(model_usage, fn {model, usage_data} ->
204 200 {model, parse_single_model_usage(usage_data)}
205 201 end)
206 202 end
207 203
208 - defp parse_model_usage(_), do: nil
204 + defp parse_model_usage(_), do: %{}
209 205
210 206 defp parse_single_model_usage(usage_data) when is_map(usage_data) do
211 207 %{
  @@ -218,8 +214,6 @@ defmodule ClaudeCode.Message.ResultMessage do
218 214
219 215 defp parse_single_model_usage(_), do: nil
220 216
221 - defp parse_permission_denials(nil), do: nil
222 -
223 217 defp parse_permission_denials(denials) when is_list(denials) do
224 218 Enum.map(denials, fn denial ->
225 219 %{
  @@ -230,9 +224,14 @@ defmodule ClaudeCode.Message.ResultMessage do
230 224 end)
231 225 end
232 226
233 - defp parse_permission_denials(_), do: nil
227 + defp parse_permission_denials(_), do: []
234 228 end
235 229
236 - defimpl String.Chars, for: ClaudeCode.Message.Result do
230 + defimpl String.Chars, for: ClaudeCode.Message.ResultMessage do
231 + def to_string(%{result: nil, errors: errors}) when is_list(errors) do
232 + "Error: " <> Enum.join(errors, ", ")
233 + end
234 +
235 + def to_string(%{result: nil}), do: ""
237 236 def to_string(%{result: result}), do: result
238 237 end
  @@ -1,7 +1,7 @@
1 1 defmodule ClaudeCode.MixProject do
2 2 use Mix.Project
3 3
4 - @version "0.13.2"
4 + @version "0.13.3"
5 5 @source_url "https://github.com/guess/claude_code"
6 6
7 7 def project do