fix: CSM-001 done

This commit is contained in:
2026-05-06 19:33:54 +02:00
parent 3ce6010b87
commit d3f45ba0dd
16 changed files with 217 additions and 60 deletions

View File

@@ -15,6 +15,7 @@ defmodule BDS.AI.Catalog do
alias BDS.AI.Model
alias BDS.AI.ModelModality
alias BDS.AI.OpenAICompatibleRuntime
alias BDS.MapUtils
alias BDS.Persistence
alias BDS.Repo
@@ -211,9 +212,7 @@ defmodule BDS.AI.Catalog do
end
end
defp atomize_map_keys(map) do
Enum.into(map, %{}, fn {key, value} -> {String.to_atom(key), value} end)
end
defp atomize_map_keys(map), do: MapUtils.safe_atomize_keys(map)
defp persist_catalog(payload) do
now = Persistence.now_ms()
@@ -313,7 +312,7 @@ defmodule BDS.AI.Catalog do
defp parse_modality("audio"), do: :audio
defp parse_modality("file"), do: :file
defp parse_modality("tool"), do: :tool
defp parse_modality(other) when is_binary(other), do: String.to_atom(other)
defp parse_modality(other) when is_binary(other), do: MapUtils.safe_atomize_key(other)
defp encode_nullable(nil), do: nil
defp encode_nullable(value), do: Jason.encode!(value)

View File

@@ -909,7 +909,7 @@ defmodule BDS.AI.ChatTools do
defp metadata_attrs(arguments, keys) do
Enum.reduce(keys, %{}, fn key, acc ->
maybe_put(acc, String.to_atom(key), arguments[key])
maybe_put(acc, BDS.MapUtils.safe_atomize_key(key), arguments[key])
end)
end

View File

@@ -375,13 +375,7 @@ defmodule BDS.Desktop.Automation do
defp normalize_simple_reply("ok"), do: :ok
defp normalize_simple_reply(reply), do: reply
defp atomize_map(map) when is_map(map) do
Enum.into(map, %{}, fn {key, value} ->
normalized_key = if is_binary(key), do: String.to_atom(key), else: key
normalized_value = if is_map(value), do: atomize_map(value), else: value
{normalized_key, normalized_value}
end)
end
defp atomize_map(map) when is_map(map), do: BDS.MapUtils.safe_atomize_keys(map)
defp project_root do
Path.expand("../../..", __DIR__)

View File

@@ -287,7 +287,7 @@ defmodule BDS.Desktop.ShellLive.ChatEditor.ToolSurfaces do
defp map_value(map, key, default \\ nil)
defp map_value(map, key, default) when is_map(map) and is_binary(key) do
Map.get(map, key, Map.get(map, String.to_atom(key), default))
Map.get(map, key, Map.get(map, String.to_existing_atom(key), default))
rescue
ArgumentError -> Map.get(map, key, default)
end

View File

@@ -91,19 +91,11 @@ defmodule BDS.ImportDefinitions do
defp maybe_put(map, _key, nil), do: map
defp maybe_put(map, key, value), do: Map.put(map, key, value)
alias BDS.MapUtils
defp normalize_analysis_result(nil), do: nil
defp normalize_analysis_result(value) when is_binary(value), do: value
defp normalize_analysis_result(value), do: Jason.encode!(value)
defp atomize_keys(value) when is_map(value) do
value
|> Enum.map(fn {key, nested_value} ->
normalized_key = if(is_binary(key), do: String.to_atom(key), else: key)
{normalized_key, atomize_keys(nested_value)}
end)
|> Map.new()
end
defp atomize_keys(value) when is_list(value), do: Enum.map(value, &atomize_keys/1)
defp atomize_keys(value), do: value
defp atomize_keys(value), do: MapUtils.safe_atomize_keys(value)
end

View File

@@ -6,6 +6,7 @@ defmodule BDS.ImportExecution do
alias BDS.Posts
alias BDS.Posts.Post
alias BDS.Repo
alias BDS.MapUtils
alias BDS.Tags
def execute_import(project_id, report, opts \\ [])
@@ -535,17 +536,7 @@ defmodule BDS.ImportExecution do
defp item_identity(%{item_type: "media", filename: filename}), do: {:media, filename}
defp item_identity(%{item_type: item_type, slug: slug}), do: {item_type, slug}
defp normalize_report(report) when is_map(report) do
report
|> Enum.map(fn {key, value} ->
normalized_key = if(is_binary(key), do: String.to_atom(key), else: key)
{normalized_key, normalize_report(value)}
end)
|> Map.new()
end
defp normalize_report(report) when is_list(report), do: Enum.map(report, &normalize_report/1)
defp normalize_report(report), do: report
defp normalize_report(report), do: MapUtils.safe_atomize_keys(report)
defp normalize_item(item) do
normalize_report(item)

View File

@@ -30,4 +30,25 @@ defmodule BDS.MapUtils do
def blank_to_nil(nil), do: nil
def blank_to_nil(""), do: nil
def blank_to_nil(value), do: value
@spec safe_atomize_key(atom() | String.t()) :: atom() | String.t()
def safe_atomize_key(key) when is_atom(key), do: key
def safe_atomize_key(key) when is_binary(key) do
String.to_existing_atom(key)
rescue
ArgumentError -> key
end
@spec safe_atomize_keys(term()) :: term()
def safe_atomize_keys(value) when is_map(value) do
value
|> Enum.map(fn {key, nested_value} ->
{safe_atomize_key(key), safe_atomize_keys(nested_value)}
end)
|> Map.new()
end
def safe_atomize_keys(value) when is_list(value), do: Enum.map(value, &safe_atomize_keys/1)
def safe_atomize_keys(value), do: value
end

View File

@@ -69,7 +69,7 @@ defmodule BDS.ReleasePackaging do
defp normalize_platform(:darwin), do: :macos
defp normalize_platform(platform) when is_binary(platform),
do: platform |> String.downcase() |> String.to_atom()
do: platform |> String.downcase() |> String.to_existing_atom()
defp archive_extension(:windows), do: ".zip"
defp archive_extension(_platform), do: ".tar.gz"

View File

@@ -121,7 +121,7 @@ defmodule BDS.UI.MenuBar do
defp sidebar_view_command(command_id) do
with "view_" <> suffix <- Atom.to_string(command_id),
view_id = String.to_atom(suffix),
view_id = String.to_existing_atom(suffix),
%{} <- Registry.sidebar_view(view_id) do
{:ok, view_id}
else
@@ -131,7 +131,7 @@ defmodule BDS.UI.MenuBar do
defp singleton_editor_command(command_id) do
with "open_" <> suffix <- Atom.to_string(command_id),
route_id = String.to_atom(suffix),
route_id = String.to_existing_atom(suffix),
%{singleton: true} <- Registry.editor_route(route_id) do
{:ok, route_id}
else

View File

@@ -267,7 +267,7 @@ defmodule BDS.UI.Workbench do
defp token_usage(_state, _usage), do: nil
defp normalize_type(type) when is_atom(type), do: type
defp normalize_type(type) when is_binary(type), do: String.to_atom(type)
defp normalize_type(type) when is_binary(type), do: String.to_existing_atom(type)
defp tab_ref(tab), do: {tab.type, tab.id}