Packages
agent_client_protocol
0.1.0
Elixir implementation of the Agent Client Protocol (ACP) for communication between code editors and AI coding agents. Includes schema types, JSON-RPC primitives, behaviours, and connection management.
Current section
Files
Jump to
Current section
Files
lib/acp/agent.ex
defmodule ACP.Agent do
@moduledoc """
Behaviour defining the interface that all ACP-compliant agents must implement.
Agents handle requests from clients and execute tasks using language models and tools.
Required callbacks: `initialize/1`, `authenticate/1`, `new_session/1`, `prompt/1`, `cancel/1`.
Optional callbacks have default implementations that return `{:error, method_not_found}`.
"""
@type result(t) :: {:ok, t} | {:error, ACP.Error.t()}
@doc "Negotiate protocol capabilities."
@callback initialize(ACP.InitializeRequest.t()) :: result(ACP.InitializeResponse.t())
@doc "Authenticate the client."
@callback authenticate(ACP.AuthenticateRequest.t()) :: result(ACP.AuthenticateResponse.t())
@doc "Create a new conversation session."
@callback new_session(ACP.NewSessionRequest.t()) :: result(ACP.NewSessionResponse.t())
@doc "Process a user prompt within a session."
@callback prompt(ACP.PromptRequest.t()) :: result(ACP.PromptResponse.t())
@doc "Cancel ongoing operations for a session."
@callback cancel(ACP.CancelNotification.t()) :: :ok | {:error, ACP.Error.t()}
@doc "Load an existing session. Optional - defaults to method_not_found error."
@callback load_session(ACP.LoadSessionRequest.t()) :: result(ACP.LoadSessionResponse.t())
@doc "Set the current mode for a session. Optional."
@callback set_session_mode(ACP.SetSessionModeRequest.t()) ::
result(ACP.SetSessionModeResponse.t())
@doc "Handle extension method requests. Optional."
@callback ext_method(ACP.ExtRequest.t()) :: result(ACP.ExtResponse.t())
@doc "Handle extension notifications. Optional."
@callback ext_notification(ACP.ExtNotification.t()) :: :ok | {:error, ACP.Error.t()}
@optional_callbacks [load_session: 1, set_session_mode: 1, ext_method: 1, ext_notification: 1]
defmacro __using__(_opts) do
quote do
@behaviour ACP.Agent
@impl ACP.Agent
def load_session(_args), do: {:error, ACP.Error.method_not_found()}
@impl ACP.Agent
def set_session_mode(_args), do: {:error, ACP.Error.method_not_found()}
@impl ACP.Agent
def ext_method(_args), do: {:ok, %ACP.ExtResponse{value: nil}}
@impl ACP.Agent
def ext_notification(_args), do: :ok
defoverridable load_session: 1, set_session_mode: 1, ext_method: 1, ext_notification: 1
end
end
end