diff --git a/LAUNCH-TODO.md b/LAUNCH-TODO.md index 3e42193f..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 -- [ ] **Replace codex backend with codex_mcp (interactive) by default** — keep plain codex only if we want one-shot speed +- [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/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 22b41884..63eea661 100644 --- a/mix.exs +++ b/mix.exs @@ -70,7 +70,10 @@ defmodule Solum.MixProject do {:esc, "~> 0.9"}, {:anthropix, "~> 0.6"}, {:term_ui, "~> 1.0.0-rc"}, - {:bandit, "~> 1.0"} + {:bandit, "~> 1.0"}, + {:telegex, + github: "mikehostetler/telegex", branch: "fix/plug-router-guard", override: true}, + {:plug, "~> 1.14"} ] end end diff --git a/mix.lock b/mix.lock index a5c4eb27..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.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": {: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"}, diff --git a/test/solum/tools/spawn_coder_test.exs b/test/solum/tools/spawn_coder_test.exs index c3084fa5..0fe7329e 100644 --- a/test/solum/tools/spawn_coder_test.exs +++ b/test/solum/tools/spawn_coder_test.exs @@ -26,7 +26,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 =~ "Use backend 'claude_code' or 'cursor'" end test "rejects Anthropic prefixed model with unknown backend (defaults to codex)" do @@ -39,7 +39,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") assert :ok = SpawnCoder.validate_model_backend("o3-mini", "codex") end