Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 0 additions & 27 deletions apps/harness/lib/harness/provider_session.ex

This file was deleted.

2 changes: 1 addition & 1 deletion apps/harness/lib/harness/providers/claude_session.ex
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ defmodule Harness.Providers.ClaudeSession do
@behaviour Harness.Providers.ProviderBehaviour

use GenServer, restart: :temporary
@behaviour Harness.ProviderSession

alias Harness.Event

Expand Down Expand Up @@ -88,6 +87,7 @@ defmodule Harness.Providers.ClaudeSession do
GenServer.stop(pid, :normal)
end

@impl Harness.Providers.ProviderBehaviour
def wait_for_ready(_pid, _timeout \\ 30_000) do
# Unlike CodexSession which starts a persistent process in init,
# ClaudeSession spawns the CLI process lazily on each send_turn.
Expand Down
16 changes: 4 additions & 12 deletions apps/harness/lib/harness/providers/codex_session.ex
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ defmodule Harness.Providers.CodexSession do
@behaviour Harness.Providers.ProviderBehaviour

use GenServer, restart: :temporary
@behaviour Harness.ProviderSession

alias Harness.JsonRpc
alias Harness.Event
Expand Down Expand Up @@ -151,6 +150,7 @@ defmodule Harness.Providers.CodexSession do
GenServer.stop(pid, :normal)
end

@impl Harness.Providers.ProviderBehaviour
def wait_for_ready(pid, timeout \\ 30_000) do
GenServer.call(pid, :wait_for_ready, timeout)
end
Expand Down Expand Up @@ -197,22 +197,14 @@ defmodule Harness.Providers.CodexSession do
def handle_info(:initialize, state) do
{id, state} = next_request_id(state)

codex_opts = get_in(state.params, ["providerOptions", "codex"]) || %{}
experimental_api = Map.get(codex_opts, "experimentalApi", false)

capabilities =
if experimental_api do
%{"experimentalApi" => true}
else
%{}
end

initialize_params = %{
"clientInfo" => %{
"name" => "t3-harness",
"version" => "0.1.0"
},
"capabilities" => capabilities
"capabilities" => %{
"experimentalApi" => true
}
}

state = send_rpc_request(state, id, "initialize", initialize_params)
Expand Down
2 changes: 1 addition & 1 deletion apps/harness/lib/harness/providers/cursor_session.ex
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ defmodule Harness.Providers.CursorSession do
@behaviour Harness.Providers.ProviderBehaviour

use GenServer, restart: :temporary
@behaviour Harness.ProviderSession

alias Harness.Event

Expand Down Expand Up @@ -82,6 +81,7 @@ defmodule Harness.Providers.CursorSession do
GenServer.stop(pid, :normal)
end

@impl Harness.Providers.ProviderBehaviour
def wait_for_ready(_pid, _timeout \\ 30_000) do
# Cursor is ready immediately — spawns process on send_turn, not in init.
:ok
Expand Down
13 changes: 12 additions & 1 deletion apps/harness/lib/harness/providers/mock_session.ex
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ defmodule Harness.Providers.MockSession do
- deltaSizeKb: size of each delta in KB (default: 1)
- delayMs: delay between deltas in ms (default: 10)
"""
@behaviour Harness.Providers.ProviderBehaviour
use GenServer, restart: :temporary
@behaviour Harness.ProviderSession

alias Harness.JsonRpc
alias Harness.Event
Expand All @@ -36,6 +36,7 @@ defmodule Harness.Providers.MockSession do

@request_timeout 30_000

@impl Harness.Providers.ProviderBehaviour
def start_link(opts) do
thread_id = Map.fetch!(opts, :thread_id)

Expand All @@ -44,17 +45,27 @@ defmodule Harness.Providers.MockSession do
)
end

@impl Harness.Providers.ProviderBehaviour
def send_turn(pid, params), do: GenServer.call(pid, {:send_turn, params}, 60_000)
@impl Harness.Providers.ProviderBehaviour
def interrupt_turn(pid, _tid, _turn_id), do: GenServer.call(pid, :interrupt_turn)
@impl Harness.Providers.ProviderBehaviour
def respond_to_approval(_, _, _), do: :ok
@impl Harness.Providers.ProviderBehaviour
def respond_to_user_input(_, _, _), do: :ok
@impl Harness.Providers.ProviderBehaviour
def read_thread(_, _), do: {:ok, %{}}
@impl Harness.Providers.ProviderBehaviour
def rollback_thread(_, _, _), do: {:ok, %{}}

@impl Harness.Providers.ProviderBehaviour
def wait_for_ready(pid, timeout \\ 30_000) do
GenServer.call(pid, :wait_for_ready, timeout)
end

@impl Harness.Providers.ProviderBehaviour
def stop(pid), do: GenServer.stop(pid)

@impl true
def init(opts) do
state = %__MODULE__{
Expand Down
2 changes: 1 addition & 1 deletion apps/harness/lib/harness/providers/opencode_session.ex
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ defmodule Harness.Providers.OpenCodeSession do
@behaviour Harness.Providers.ProviderBehaviour

use GenServer, restart: :temporary
@behaviour Harness.ProviderSession

alias Harness.Event

Expand Down Expand Up @@ -118,6 +117,7 @@ defmodule Harness.Providers.OpenCodeSession do
GenServer.stop(pid, :normal)
end

@impl Harness.Providers.ProviderBehaviour
def wait_for_ready(pid, timeout \\ 30_000) do
GenServer.call(pid, :wait_for_ready, timeout)
end
Expand Down
7 changes: 6 additions & 1 deletion apps/web/src/store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,12 @@ function toLegacySessionStatus(
}

function toLegacyProvider(providerName: string | null): ProviderKind {
if (providerName === "codex" || providerName === "claudeAgent") {
if (
providerName === "codex" ||
providerName === "claudeAgent" ||
providerName === "cursor" ||
providerName === "opencode"
) {
return providerName;
}
return "codex";
Expand Down
Loading