From def3afeae59cd78dd64deeb8b4d438d7ae9e7818 Mon Sep 17 00:00:00 2001 From: Sol Date: Mon, 23 Feb 2026 14:26:33 +0100 Subject: [PATCH 01/12] Deprecate codex_mcp backend name via codex alias --- lib/solum/actions/tools/spawn_coder.ex | 1 + test/solum/tools/spawn_coder_test.exs | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/solum/actions/tools/spawn_coder.ex b/lib/solum/actions/tools/spawn_coder.ex index e9a8d3da..4b9b5e76 100644 --- a/lib/solum/actions/tools/spawn_coder.ex +++ b/lib/solum/actions/tools/spawn_coder.ex @@ -80,6 +80,7 @@ defmodule Solum.Actions.Tools.SpawnCoder do end defp parse_backend("codex"), do: :codex + defp parse_backend("codex_mcp"), do: :codex defp parse_backend("claude_code"), do: :claude_code defp parse_backend(_), do: :codex diff --git a/test/solum/tools/spawn_coder_test.exs b/test/solum/tools/spawn_coder_test.exs index 162b3cfe..bd9158b4 100644 --- a/test/solum/tools/spawn_coder_test.exs +++ b/test/solum/tools/spawn_coder_test.exs @@ -18,6 +18,11 @@ defmodule Solum.Actions.Tools.SpawnCoderTest do assert :ok = SpawnCoder.validate_model_backend(nil, "codex") end + test "treats codex_mcp backend as codex alias" do + assert :ok = SpawnCoder.validate_model_backend("gpt-5.3-codex", "codex_mcp") + assert {:error, _} = SpawnCoder.validate_model_backend("claude-opus-4-1", "codex_mcp") + end + test "allows Anthropic model with claude_code backend" do assert :ok = SpawnCoder.validate_model_backend("sonnet", "claude_code") assert :ok = SpawnCoder.validate_model_backend("claude-sonnet-4-20250514", "claude_code") @@ -26,7 +31,7 @@ defmodule Solum.Actions.Tools.SpawnCoderTest do test "rejects Anthropic alias with non-claude backend" do assert {:error, msg} = SpawnCoder.validate_model_backend("opus", "codex") assert msg =~ "Invalid model/backend combination" - assert msg =~ "backend 'claude_code'" + assert msg =~ "switch backend to 'claude_code'" end test "rejects Anthropic prefixed model with unknown backend (defaults to codex)" do @@ -39,7 +44,7 @@ defmodule Solum.Actions.Tools.SpawnCoderTest do test "allows supported OpenAI models with codex backend" do assert :ok = SpawnCoder.validate_model_backend("gpt-5.3-codex", "codex") - assert :ok = SpawnCoder.validate_model_backend("openai/gpt-4o", "unknown_backend") + assert :ok = SpawnCoder.validate_model_backend("gpt-4o", "unknown_backend") assert :ok = SpawnCoder.validate_model_backend("o1", "codex") end From bc9f70aa06bddd748870caae039295cc36b44557 Mon Sep 17 00:00:00 2001 From: Sol Date: Mon, 23 Feb 2026 19:36:52 +0100 Subject: [PATCH 02/12] chore(codex): fix tests for backend deprecation and update TODO --- LAUNCH-TODO.md | 2 +- test/solum/tools/spawn_coder_test.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LAUNCH-TODO.md b/LAUNCH-TODO.md index 3e42193f..ac5b9d83 100644 --- a/LAUNCH-TODO.md +++ b/LAUNCH-TODO.md @@ -28,7 +28,7 @@ - [ ] README rewrite - [ ] Dashboard polish - [ ] **Improve dashboard** — consolidated agents → subagents → coders tree view -- [ ] **Replace codex backend with codex_mcp (interactive) by default** — keep plain codex only if we want one-shot speed +- [x] ~~**Replace codex backend with codex_mcp (interactive) by default**~~ — legacy `codex exec` removed, `codex` now uses MCP, `codex_mcp` alias added for compat - [ ] OAuth login flow - [ ] **Generalize coder wrapper** — support Cursor, Codex, and other coding agents beyond Claude Code diff --git a/test/solum/tools/spawn_coder_test.exs b/test/solum/tools/spawn_coder_test.exs index 2545f523..20966f68 100644 --- a/test/solum/tools/spawn_coder_test.exs +++ b/test/solum/tools/spawn_coder_test.exs @@ -31,7 +31,7 @@ defmodule Solum.Actions.Tools.SpawnCoderTest do test "rejects Anthropic alias with non-claude backend" do assert {:error, msg} = SpawnCoder.validate_model_backend("opus", "codex") assert msg =~ "Invalid model/backend combination" - assert msg =~ "switch backend to 'claude_code'" + assert msg =~ "Use backend 'claude_code' or 'cursor'" end test "rejects Anthropic prefixed model with unknown backend (defaults to codex)" do From 88811181c22a800e3b08b8ba1a199a898ff53b98 Mon Sep 17 00:00:00 2001 From: Sol Date: Mon, 23 Feb 2026 19:46:15 +0100 Subject: [PATCH 03/12] fix(deps): add explicit plug dependency for telegex --- mix.exs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 22b41884..777303b0 100644 --- a/mix.exs +++ b/mix.exs @@ -70,7 +70,9 @@ defmodule Solum.MixProject do {:esc, "~> 0.9"}, {:anthropix, "~> 0.6"}, {:term_ui, "~> 1.0.0-rc"}, - {:bandit, "~> 1.0"} + {:bandit, "~> 1.0"}, + {:telegex, "~> 1.8"}, + {:plug, "~> 1.14"} ] end end From 62c7efc09f946a6225fecb7416ad45d4953590a0 Mon Sep 17 00:00:00 2001 From: Sol Date: Mon, 23 Feb 2026 20:00:45 +0100 Subject: [PATCH 04/12] fix(deps): upgrade telegex to 1.9.0-rc to fix plug compilation error --- mix.exs | 2 +- mix.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mix.exs b/mix.exs index 777303b0..27e5308e 100644 --- a/mix.exs +++ b/mix.exs @@ -71,7 +71,7 @@ defmodule Solum.MixProject do {:anthropix, "~> 0.6"}, {:term_ui, "~> 1.0.0-rc"}, {:bandit, "~> 1.0"}, - {:telegex, "~> 1.8"}, + {:telegex, "~> 1.9.0-rc"}, {:plug, "~> 1.14"} ] end diff --git a/mix.lock b/mix.lock index a5c4eb27..488a0199 100644 --- a/mix.lock +++ b/mix.lock @@ -93,7 +93,7 @@ "slack_elixir": {:hex, :slack_elixir, "1.2.0", "8f8a6aa5d208bc445352d4d0d29bfb8309f4fd956a5b604ea0109e7b94ce7124", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:req, "~> 0.3", [hex: :req, repo: "hexpm", optional: false]}, {:websockex, "~> 0.4.3", [hex: :websockex, repo: "hexpm", optional: false]}], "hexpm", "4c883805de2f0bf0e517bfaea4ed65afe6a1ae46b9d62590aea313b9f509f5f7"}, "splode": {:hex, :splode, "0.3.0", "ff8effecc509a51245df2f864ec78d849248647c37a75886033e3b1a53ca9470", [:mix], [], "hexpm", "73cfd0892d7316d6f2c93e6e8784bd6e137b2aa38443de52fd0a25171d106d81"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, - "telegex": {:hex, :telegex, "1.8.0", "982ef33e9576167189c4980c27ebe927e8b0945d0e8c93c1173ea9482ef78137", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:typed_struct, "~> 0.3.0", [hex: :typed_struct, repo: "hexpm", optional: false]}], "hexpm", "899fdadedc3691faf923e12639247b083f259284b2963e94b265088473c7349b"}, + "telegex": {:hex, :telegex, "1.9.0-rc.0", "0f5b76a21879c900ddbaa56c582a10b168ebd218d007ed88e11ff1003364f6d5", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:typed_struct, "~> 0.3.0", [hex: :typed_struct, repo: "hexpm", optional: false]}], "hexpm", "0ab1b2413e29a2b6c0c7ecaa7be4e921dfd7f1adf12e8d5167f27f5bacd78050"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, "telemetry_metrics": {:hex, :telemetry_metrics, "1.1.0", "5bd5f3b5637e0abea0426b947e3ce5dd304f8b3bc6617039e2b5a008adc02f8f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7b79e8ddfde70adb6db8a6623d1778ec66401f366e9a8f5dd0955c56bc8ce67"}, "telemetry_metrics_prometheus": {:hex, :telemetry_metrics_prometheus, "1.1.0", "1cc23e932c1ef9aa3b91db257ead31ea58d53229d407e059b29bb962c1505a13", [:mix], [{:plug_cowboy, "~> 2.1", [hex: :plug_cowboy, repo: "hexpm", optional: false]}, {:telemetry_metrics_prometheus_core, "~> 1.0", [hex: :telemetry_metrics_prometheus_core, repo: "hexpm", optional: false]}], "hexpm", "d43b3659b3244da44fe0275b717701542365d4519b79d9ce895b9719c1ce4d26"}, From a849f268d31039e53700a47ce9e08f96fc0b5b66 Mon Sep 17 00:00:00 2001 From: Sol Date: Mon, 23 Feb 2026 20:13:31 +0100 Subject: [PATCH 05/12] fix: use telegex master to resolve Plug.Router dependency issue --- mix.exs | 4 ++-- mix.lock | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mix.exs b/mix.exs index 27e5308e..946bc759 100644 --- a/mix.exs +++ b/mix.exs @@ -71,8 +71,8 @@ defmodule Solum.MixProject do {:anthropix, "~> 0.6"}, {:term_ui, "~> 1.0.0-rc"}, {:bandit, "~> 1.0"}, - {:telegex, "~> 1.9.0-rc"}, - {:plug, "~> 1.14"} + {:telegex, git: "https://github.com/telegex/telegex.git", branch: "master", override: true}, + {:plug, "~> 1.14", override: true} ] end end diff --git a/mix.lock b/mix.lock index 488a0199..e62abcc9 100644 --- a/mix.lock +++ b/mix.lock @@ -93,7 +93,7 @@ "slack_elixir": {:hex, :slack_elixir, "1.2.0", "8f8a6aa5d208bc445352d4d0d29bfb8309f4fd956a5b604ea0109e7b94ce7124", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:req, "~> 0.3", [hex: :req, repo: "hexpm", optional: false]}, {:websockex, "~> 0.4.3", [hex: :websockex, repo: "hexpm", optional: false]}], "hexpm", "4c883805de2f0bf0e517bfaea4ed65afe6a1ae46b9d62590aea313b9f509f5f7"}, "splode": {:hex, :splode, "0.3.0", "ff8effecc509a51245df2f864ec78d849248647c37a75886033e3b1a53ca9470", [:mix], [], "hexpm", "73cfd0892d7316d6f2c93e6e8784bd6e137b2aa38443de52fd0a25171d106d81"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, - "telegex": {:hex, :telegex, "1.9.0-rc.0", "0f5b76a21879c900ddbaa56c582a10b168ebd218d007ed88e11ff1003364f6d5", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:typed_struct, "~> 0.3.0", [hex: :typed_struct, repo: "hexpm", optional: false]}], "hexpm", "0ab1b2413e29a2b6c0c7ecaa7be4e921dfd7f1adf12e8d5167f27f5bacd78050"}, + "telegex": {:git, "https://github.com/telegex/telegex.git", "cc8a77c9436ff89e1e3dc8d0068c8c901d647785", [branch: "master"]}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, "telemetry_metrics": {:hex, :telemetry_metrics, "1.1.0", "5bd5f3b5637e0abea0426b947e3ce5dd304f8b3bc6617039e2b5a008adc02f8f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7b79e8ddfde70adb6db8a6623d1778ec66401f366e9a8f5dd0955c56bc8ce67"}, "telemetry_metrics_prometheus": {:hex, :telemetry_metrics_prometheus, "1.1.0", "1cc23e932c1ef9aa3b91db257ead31ea58d53229d407e059b29bb962c1505a13", [:mix], [{:plug_cowboy, "~> 2.1", [hex: :plug_cowboy, repo: "hexpm", optional: false]}, {:telemetry_metrics_prometheus_core, "~> 1.0", [hex: :telemetry_metrics_prometheus_core, repo: "hexpm", optional: false]}], "hexpm", "d43b3659b3244da44fe0275b717701542365d4519b79d9ce895b9719c1ce4d26"}, From d9e105149740d7d7b1e045a90d0fb6f338aa3aca Mon Sep 17 00:00:00 2001 From: Sol Date: Mon, 23 Feb 2026 20:20:45 +0100 Subject: [PATCH 06/12] fix: pin telegex to 1.8.0 to resolve Plug dependency issues --- mix.exs | 4 ++-- mix.lock | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mix.exs b/mix.exs index 946bc759..acf39240 100644 --- a/mix.exs +++ b/mix.exs @@ -71,8 +71,8 @@ defmodule Solum.MixProject do {:anthropix, "~> 0.6"}, {:term_ui, "~> 1.0.0-rc"}, {:bandit, "~> 1.0"}, - {:telegex, git: "https://github.com/telegex/telegex.git", branch: "master", override: true}, - {:plug, "~> 1.14", override: true} + {:telegex, "1.8.0"}, + {:plug, "~> 1.14"} ] end end diff --git a/mix.lock b/mix.lock index e62abcc9..a5c4eb27 100644 --- a/mix.lock +++ b/mix.lock @@ -93,7 +93,7 @@ "slack_elixir": {:hex, :slack_elixir, "1.2.0", "8f8a6aa5d208bc445352d4d0d29bfb8309f4fd956a5b604ea0109e7b94ce7124", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:req, "~> 0.3", [hex: :req, repo: "hexpm", optional: false]}, {:websockex, "~> 0.4.3", [hex: :websockex, repo: "hexpm", optional: false]}], "hexpm", "4c883805de2f0bf0e517bfaea4ed65afe6a1ae46b9d62590aea313b9f509f5f7"}, "splode": {:hex, :splode, "0.3.0", "ff8effecc509a51245df2f864ec78d849248647c37a75886033e3b1a53ca9470", [:mix], [], "hexpm", "73cfd0892d7316d6f2c93e6e8784bd6e137b2aa38443de52fd0a25171d106d81"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, - "telegex": {:git, "https://github.com/telegex/telegex.git", "cc8a77c9436ff89e1e3dc8d0068c8c901d647785", [branch: "master"]}, + "telegex": {:hex, :telegex, "1.8.0", "982ef33e9576167189c4980c27ebe927e8b0945d0e8c93c1173ea9482ef78137", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:typed_struct, "~> 0.3.0", [hex: :typed_struct, repo: "hexpm", optional: false]}], "hexpm", "899fdadedc3691faf923e12639247b083f259284b2963e94b265088473c7349b"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, "telemetry_metrics": {:hex, :telemetry_metrics, "1.1.0", "5bd5f3b5637e0abea0426b947e3ce5dd304f8b3bc6617039e2b5a008adc02f8f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7b79e8ddfde70adb6db8a6623d1778ec66401f366e9a8f5dd0955c56bc8ce67"}, "telemetry_metrics_prometheus": {:hex, :telemetry_metrics_prometheus, "1.1.0", "1cc23e932c1ef9aa3b91db257ead31ea58d53229d407e059b29bb962c1505a13", [:mix], [{:plug_cowboy, "~> 2.1", [hex: :plug_cowboy, repo: "hexpm", optional: false]}, {:telemetry_metrics_prometheus_core, "~> 1.0", [hex: :telemetry_metrics_prometheus_core, repo: "hexpm", optional: false]}], "hexpm", "d43b3659b3244da44fe0275b717701542365d4519b79d9ce895b9719c1ce4d26"}, From 8084217b13031c95797812e679a82eb7bd3bf59a Mon Sep 17 00:00:00 2001 From: Sol Date: Mon, 23 Feb 2026 20:32:35 +0100 Subject: [PATCH 07/12] fix(deps): upgrade telegex to 1.9.0-rc.0 to fix compilation --- mix.exs | 2 +- mix.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mix.exs b/mix.exs index acf39240..fa06cc8b 100644 --- a/mix.exs +++ b/mix.exs @@ -71,7 +71,7 @@ defmodule Solum.MixProject do {:anthropix, "~> 0.6"}, {:term_ui, "~> 1.0.0-rc"}, {:bandit, "~> 1.0"}, - {:telegex, "1.8.0"}, + {:telegex, "1.9.0-rc.0"}, {:plug, "~> 1.14"} ] end diff --git a/mix.lock b/mix.lock index a5c4eb27..488a0199 100644 --- a/mix.lock +++ b/mix.lock @@ -93,7 +93,7 @@ "slack_elixir": {:hex, :slack_elixir, "1.2.0", "8f8a6aa5d208bc445352d4d0d29bfb8309f4fd956a5b604ea0109e7b94ce7124", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:req, "~> 0.3", [hex: :req, repo: "hexpm", optional: false]}, {:websockex, "~> 0.4.3", [hex: :websockex, repo: "hexpm", optional: false]}], "hexpm", "4c883805de2f0bf0e517bfaea4ed65afe6a1ae46b9d62590aea313b9f509f5f7"}, "splode": {:hex, :splode, "0.3.0", "ff8effecc509a51245df2f864ec78d849248647c37a75886033e3b1a53ca9470", [:mix], [], "hexpm", "73cfd0892d7316d6f2c93e6e8784bd6e137b2aa38443de52fd0a25171d106d81"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, - "telegex": {:hex, :telegex, "1.8.0", "982ef33e9576167189c4980c27ebe927e8b0945d0e8c93c1173ea9482ef78137", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:typed_struct, "~> 0.3.0", [hex: :typed_struct, repo: "hexpm", optional: false]}], "hexpm", "899fdadedc3691faf923e12639247b083f259284b2963e94b265088473c7349b"}, + "telegex": {:hex, :telegex, "1.9.0-rc.0", "0f5b76a21879c900ddbaa56c582a10b168ebd218d007ed88e11ff1003364f6d5", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:typed_struct, "~> 0.3.0", [hex: :typed_struct, repo: "hexpm", optional: false]}], "hexpm", "0ab1b2413e29a2b6c0c7ecaa7be4e921dfd7f1adf12e8d5167f27f5bacd78050"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, "telemetry_metrics": {:hex, :telemetry_metrics, "1.1.0", "5bd5f3b5637e0abea0426b947e3ce5dd304f8b3bc6617039e2b5a008adc02f8f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7b79e8ddfde70adb6db8a6623d1778ec66401f366e9a8f5dd0955c56bc8ce67"}, "telemetry_metrics_prometheus": {:hex, :telemetry_metrics_prometheus, "1.1.0", "1cc23e932c1ef9aa3b91db257ead31ea58d53229d407e059b29bb962c1505a13", [:mix], [{:plug_cowboy, "~> 2.1", [hex: :plug_cowboy, repo: "hexpm", optional: false]}, {:telemetry_metrics_prometheus_core, "~> 1.0", [hex: :telemetry_metrics_prometheus_core, repo: "hexpm", optional: false]}], "hexpm", "d43b3659b3244da44fe0275b717701542365d4519b79d9ce895b9719c1ce4d26"}, From b2a42454e446ad46daefbdd8c256990c5443dc42 Mon Sep 17 00:00:00 2001 From: Sol Date: Mon, 23 Feb 2026 20:42:20 +0100 Subject: [PATCH 08/12] fix(deps): pin telegex to 1.7.0 to fix compilation error --- mix.exs | 2 +- mix.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mix.exs b/mix.exs index fa06cc8b..270cee0f 100644 --- a/mix.exs +++ b/mix.exs @@ -71,7 +71,7 @@ defmodule Solum.MixProject do {:anthropix, "~> 0.6"}, {:term_ui, "~> 1.0.0-rc"}, {:bandit, "~> 1.0"}, - {:telegex, "1.9.0-rc.0"}, + {:telegex, "1.7.0", override: true}, {:plug, "~> 1.14"} ] end diff --git a/mix.lock b/mix.lock index 488a0199..e4bf683b 100644 --- a/mix.lock +++ b/mix.lock @@ -93,7 +93,7 @@ "slack_elixir": {:hex, :slack_elixir, "1.2.0", "8f8a6aa5d208bc445352d4d0d29bfb8309f4fd956a5b604ea0109e7b94ce7124", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:req, "~> 0.3", [hex: :req, repo: "hexpm", optional: false]}, {:websockex, "~> 0.4.3", [hex: :websockex, repo: "hexpm", optional: false]}], "hexpm", "4c883805de2f0bf0e517bfaea4ed65afe6a1ae46b9d62590aea313b9f509f5f7"}, "splode": {:hex, :splode, "0.3.0", "ff8effecc509a51245df2f864ec78d849248647c37a75886033e3b1a53ca9470", [:mix], [], "hexpm", "73cfd0892d7316d6f2c93e6e8784bd6e137b2aa38443de52fd0a25171d106d81"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, - "telegex": {:hex, :telegex, "1.9.0-rc.0", "0f5b76a21879c900ddbaa56c582a10b168ebd218d007ed88e11ff1003364f6d5", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:typed_struct, "~> 0.3.0", [hex: :typed_struct, repo: "hexpm", optional: false]}], "hexpm", "0ab1b2413e29a2b6c0c7ecaa7be4e921dfd7f1adf12e8d5167f27f5bacd78050"}, + "telegex": {:hex, :telegex, "1.7.0", "82e5bda6ba9ad1106068cbc8b0f258aa2e517ba77d38ad308f2ff08881789d19", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:typed_struct, "~> 0.3.0", [hex: :typed_struct, repo: "hexpm", optional: false]}], "hexpm", "070c5f35df6da8b51024f867a330ceeda7b5553b6035830b4f063522014e1dbd"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, "telemetry_metrics": {:hex, :telemetry_metrics, "1.1.0", "5bd5f3b5637e0abea0426b947e3ce5dd304f8b3bc6617039e2b5a008adc02f8f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7b79e8ddfde70adb6db8a6623d1778ec66401f366e9a8f5dd0955c56bc8ce67"}, "telemetry_metrics_prometheus": {:hex, :telemetry_metrics_prometheus, "1.1.0", "1cc23e932c1ef9aa3b91db257ead31ea58d53229d407e059b29bb962c1505a13", [:mix], [{:plug_cowboy, "~> 2.1", [hex: :plug_cowboy, repo: "hexpm", optional: false]}, {:telemetry_metrics_prometheus_core, "~> 1.0", [hex: :telemetry_metrics_prometheus_core, repo: "hexpm", optional: false]}], "hexpm", "d43b3659b3244da44fe0275b717701542365d4519b79d9ce895b9719c1ce4d26"}, From aee93dcdb86bc416eee8499969654841d2f6bc18 Mon Sep 17 00:00:00 2001 From: Sol Date: Mon, 23 Feb 2026 21:02:28 +0100 Subject: [PATCH 09/12] chore: use telegex fork to fix elixir 1.19 compat --- mix.exs | 2 +- mix.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mix.exs b/mix.exs index 270cee0f..3198060d 100644 --- a/mix.exs +++ b/mix.exs @@ -71,7 +71,7 @@ defmodule Solum.MixProject do {:anthropix, "~> 0.6"}, {:term_ui, "~> 1.0.0-rc"}, {:bandit, "~> 1.0"}, - {:telegex, "1.7.0", override: true}, + {:telegex, github: "mikehostetler/telegex", branch: "fix/plug-router-guard", override: true}, {:plug, "~> 1.14"} ] end diff --git a/mix.lock b/mix.lock index e4bf683b..738a88ea 100644 --- a/mix.lock +++ b/mix.lock @@ -93,7 +93,7 @@ "slack_elixir": {:hex, :slack_elixir, "1.2.0", "8f8a6aa5d208bc445352d4d0d29bfb8309f4fd956a5b604ea0109e7b94ce7124", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:req, "~> 0.3", [hex: :req, repo: "hexpm", optional: false]}, {:websockex, "~> 0.4.3", [hex: :websockex, repo: "hexpm", optional: false]}], "hexpm", "4c883805de2f0bf0e517bfaea4ed65afe6a1ae46b9d62590aea313b9f509f5f7"}, "splode": {:hex, :splode, "0.3.0", "ff8effecc509a51245df2f864ec78d849248647c37a75886033e3b1a53ca9470", [:mix], [], "hexpm", "73cfd0892d7316d6f2c93e6e8784bd6e137b2aa38443de52fd0a25171d106d81"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, - "telegex": {:hex, :telegex, "1.7.0", "82e5bda6ba9ad1106068cbc8b0f258aa2e517ba77d38ad308f2ff08881789d19", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:typed_struct, "~> 0.3.0", [hex: :typed_struct, repo: "hexpm", optional: false]}], "hexpm", "070c5f35df6da8b51024f867a330ceeda7b5553b6035830b4f063522014e1dbd"}, + "telegex": {:git, "https://github.com/mikehostetler/telegex.git", "a07f4e180cd5ffb024c76557bb13f9f72c0d61f8", [branch: "fix/plug-router-guard"]}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, "telemetry_metrics": {:hex, :telemetry_metrics, "1.1.0", "5bd5f3b5637e0abea0426b947e3ce5dd304f8b3bc6617039e2b5a008adc02f8f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7b79e8ddfde70adb6db8a6623d1778ec66401f366e9a8f5dd0955c56bc8ce67"}, "telemetry_metrics_prometheus": {:hex, :telemetry_metrics_prometheus, "1.1.0", "1cc23e932c1ef9aa3b91db257ead31ea58d53229d407e059b29bb962c1505a13", [:mix], [{:plug_cowboy, "~> 2.1", [hex: :plug_cowboy, repo: "hexpm", optional: false]}, {:telemetry_metrics_prometheus_core, "~> 1.0", [hex: :telemetry_metrics_prometheus_core, repo: "hexpm", optional: false]}], "hexpm", "d43b3659b3244da44fe0275b717701542365d4519b79d9ce895b9719c1ce4d26"}, From b41965864aebe94df5a0f8a594c7ce460ec4c56a Mon Sep 17 00:00:00 2001 From: Sol Date: Mon, 23 Feb 2026 21:10:51 +0100 Subject: [PATCH 10/12] chore: remove codex_mcp alias and update todo --- LAUNCH-TODO.md | 2 +- lib/solum/actions/tools/spawn_coder.ex | 1 - task-deprecate-codex.md | 39 ++++++++++++++++++++++++++ test/solum/tools/spawn_coder_test.exs | 5 ---- 4 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 task-deprecate-codex.md diff --git a/LAUNCH-TODO.md b/LAUNCH-TODO.md index ac5b9d83..238676d0 100644 --- a/LAUNCH-TODO.md +++ b/LAUNCH-TODO.md @@ -28,7 +28,7 @@ - [ ] README rewrite - [ ] Dashboard polish - [ ] **Improve dashboard** — consolidated agents → subagents → coders tree view -- [x] ~~**Replace codex backend with codex_mcp (interactive) by default**~~ — legacy `codex exec` removed, `codex` now uses MCP, `codex_mcp` alias added for compat +- [x] ~~**Replace codex backend with MCP (interactive) by default**~~ — legacy `codex exec` removed, `codex` now uses MCP exclusively. - [ ] OAuth login flow - [ ] **Generalize coder wrapper** — support Cursor, Codex, and other coding agents beyond Claude Code diff --git a/lib/solum/actions/tools/spawn_coder.ex b/lib/solum/actions/tools/spawn_coder.ex index 8eafa35d..9eb9f472 100644 --- a/lib/solum/actions/tools/spawn_coder.ex +++ b/lib/solum/actions/tools/spawn_coder.ex @@ -85,7 +85,6 @@ defmodule Solum.Actions.Tools.SpawnCoder do end defp parse_backend("codex"), do: :codex - defp parse_backend("codex_mcp"), do: :codex defp parse_backend("claude_code"), do: :claude_code defp parse_backend("cursor"), do: :cursor defp parse_backend(_), do: :codex diff --git a/task-deprecate-codex.md b/task-deprecate-codex.md new file mode 100644 index 00000000..f4868ce9 --- /dev/null +++ b/task-deprecate-codex.md @@ -0,0 +1,39 @@ +# Task: Deprecate Legacy Codex and Promote CodexMcp + +The goal is to remove the old "fire-and-forget" Codex backend and make the interactive MCP-based backend the default for `backend: "codex"`. + +## Context +- We currently have two Codex backends: + 1. Legacy: Fire-and-forget, uses `Exec` directly. + 2. New: Interactive, uses `CodexMcp` (Model Context Protocol). +- We want to delete (1) and make (2) the implementation for `backend: :codex`. + +## Instructions + +1. **Analyze current backends**: + - Look at `lib/solum/agent/coder/backend/`. + - Identify the legacy implementation (likely `Codex.ex` or similar). + - Identify the new implementation (`CodexMcp.ex`). + +2. **Remove Legacy**: + - Delete the legacy implementation file. + - Remove any specific configuration or support code for it. + +3. **Promote MCP Backend**: + - Rename `Solum.Agent.Coder.Backend.CodexMcp` to `Solum.Agent.Coder.Backend.Codex`. + - Update the module name in the file. + - Update any references in `spawn_coder.ex` (though we might have just mapped the atom there). + +4. **Update `spawn_coder.ex`**: + - Ensure `parse_backend("codex")` returns `:codex`. + - Ensure `parse_backend("codex_mcp")` also returns `:codex` (for backward compat) or is removed if no longer needed. + - Ensure the `spawn_coder` tool uses the new `Codex` backend (which is now the MCP one). + +5. **Verify & Test**: + - Run `mix compile` to catch renamed module issues. + - Run tests related to coders: `mix test test/solum/agent/coder_test.exs` (or similar). + - Ensure `spawn_coder` with `backend: "codex"` still works (you can dry-run or check logic). + +## Constraint +- Do NOT break `claude_code` backend. +- Keep `codex_mcp` as an alias if helpful, but the implementation should be the new one. diff --git a/test/solum/tools/spawn_coder_test.exs b/test/solum/tools/spawn_coder_test.exs index 20966f68..0fe7329e 100644 --- a/test/solum/tools/spawn_coder_test.exs +++ b/test/solum/tools/spawn_coder_test.exs @@ -18,11 +18,6 @@ defmodule Solum.Actions.Tools.SpawnCoderTest do assert :ok = SpawnCoder.validate_model_backend(nil, "codex") end - test "treats codex_mcp backend as codex alias" do - assert :ok = SpawnCoder.validate_model_backend("gpt-5.3-codex", "codex_mcp") - assert {:error, _} = SpawnCoder.validate_model_backend("claude-opus-4-1", "codex_mcp") - end - test "allows Anthropic model with claude_code backend" do assert :ok = SpawnCoder.validate_model_backend("sonnet", "claude_code") assert :ok = SpawnCoder.validate_model_backend("claude-sonnet-4-20250514", "claude_code") From c5311e54f5d953fb2341abba6091c3e85289ac55 Mon Sep 17 00:00:00 2001 From: Sol Date: Mon, 23 Feb 2026 21:11:48 +0100 Subject: [PATCH 11/12] chore: remove task file --- task-deprecate-codex.md | 39 --------------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 task-deprecate-codex.md diff --git a/task-deprecate-codex.md b/task-deprecate-codex.md deleted file mode 100644 index f4868ce9..00000000 --- a/task-deprecate-codex.md +++ /dev/null @@ -1,39 +0,0 @@ -# Task: Deprecate Legacy Codex and Promote CodexMcp - -The goal is to remove the old "fire-and-forget" Codex backend and make the interactive MCP-based backend the default for `backend: "codex"`. - -## Context -- We currently have two Codex backends: - 1. Legacy: Fire-and-forget, uses `Exec` directly. - 2. New: Interactive, uses `CodexMcp` (Model Context Protocol). -- We want to delete (1) and make (2) the implementation for `backend: :codex`. - -## Instructions - -1. **Analyze current backends**: - - Look at `lib/solum/agent/coder/backend/`. - - Identify the legacy implementation (likely `Codex.ex` or similar). - - Identify the new implementation (`CodexMcp.ex`). - -2. **Remove Legacy**: - - Delete the legacy implementation file. - - Remove any specific configuration or support code for it. - -3. **Promote MCP Backend**: - - Rename `Solum.Agent.Coder.Backend.CodexMcp` to `Solum.Agent.Coder.Backend.Codex`. - - Update the module name in the file. - - Update any references in `spawn_coder.ex` (though we might have just mapped the atom there). - -4. **Update `spawn_coder.ex`**: - - Ensure `parse_backend("codex")` returns `:codex`. - - Ensure `parse_backend("codex_mcp")` also returns `:codex` (for backward compat) or is removed if no longer needed. - - Ensure the `spawn_coder` tool uses the new `Codex` backend (which is now the MCP one). - -5. **Verify & Test**: - - Run `mix compile` to catch renamed module issues. - - Run tests related to coders: `mix test test/solum/agent/coder_test.exs` (or similar). - - Ensure `spawn_coder` with `backend: "codex"` still works (you can dry-run or check logic). - -## Constraint -- Do NOT break `claude_code` backend. -- Keep `codex_mcp` as an alias if helpful, but the implementation should be the new one. From 7a1185df0f6013c73976b5712986cb8ee57bf1ea Mon Sep 17 00:00:00 2001 From: Sol Date: Mon, 23 Feb 2026 21:19:17 +0100 Subject: [PATCH 12/12] style: fix formatting --- lib/solum/agent/coder_registry.ex | 3 ++- mix.exs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/solum/agent/coder_registry.ex b/lib/solum/agent/coder_registry.ex index 2f2e9b33..f6296bb3 100644 --- a/lib/solum/agent/coder_registry.ex +++ b/lib/solum/agent/coder_registry.ex @@ -198,7 +198,8 @@ defmodule Solum.Agent.CoderRegistry do is_number(info.duration_ms) -> info.duration_ms - info.status in [:running, :waiting, :starting, :stuck] and match?(%DateTime{}, info.started_at) -> + info.status in [:running, :waiting, :starting, :stuck] and + match?(%DateTime{}, info.started_at) -> started_ms = DateTime.to_unix(info.started_at, :millisecond) max(now_ms - started_ms, 0) diff --git a/mix.exs b/mix.exs index 3198060d..63eea661 100644 --- a/mix.exs +++ b/mix.exs @@ -71,7 +71,8 @@ defmodule Solum.MixProject do {:anthropix, "~> 0.6"}, {:term_ui, "~> 1.0.0-rc"}, {:bandit, "~> 1.0"}, - {:telegex, github: "mikehostetler/telegex", branch: "fix/plug-router-guard", override: true}, + {:telegex, + github: "mikehostetler/telegex", branch: "fix/plug-router-guard", override: true}, {:plug, "~> 1.14"} ] end