Packages
opencode_sdk
0.1.83
0.1.84
0.1.83
0.1.82
0.1.81
0.1.80
0.1.79
0.1.78
0.1.77
0.1.76
0.1.75
0.1.74
0.1.73
0.1.72
0.1.71
0.1.70
0.1.69
0.1.68
0.1.67
0.1.66
0.1.65
0.1.64
0.1.63
0.1.62
0.1.61
0.1.60
0.1.59
0.1.58
0.1.57
0.1.56
0.1.55
0.1.54
0.1.53
0.1.52
0.1.51
0.1.50
0.1.49
0.1.48
0.1.47
0.1.46
0.1.45
0.1.44
0.1.43
0.1.42
0.1.41
0.1.40
0.1.39
0.1.38
0.1.37
0.1.36
0.1.35
0.1.34
0.1.33
0.1.32
0.1.31
0.1.30
0.1.29
0.1.28
0.1.27
0.1.26
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Unofficial OpenCode SDK for Elixir. A complete Elixir SDK for OpenCode, providing server creation, session management, messaging, file operations, and more. Mirrors the functionality of the official JavaScript SDK (@opencode-ai/sdk). Not affiliated with or built by the OpenCode team.
Current section
Files
Jump to
Current section
Files
lib/opencode/generated/session.ex
defmodule OpenCode.Generated.Session do
@moduledoc """
Provides API endpoints related to session
"""
@default_client OpenCode.Client
@doc """
delete `/session/{sessionID}/message/{messageID}/part/{partID}`
Delete a part from a message.
## Options
* `directory`
* `workspace`
"""
@spec part_delete(
sessionID :: String.t(),
messageID :: String.t(),
partID :: String.t(),
opts :: keyword
) ::
{:ok, boolean}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()}
def part_delete(sessionID, messageID, partID, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID, messageID: messageID, partID: partID],
call: {OpenCode.Generated.Session, :part_delete},
url: "/session/#{sessionID}/message/#{messageID}/part/#{partID}",
method: :delete,
query: query,
response: [
{200, :boolean},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}}
],
opts: opts
})
end
@doc """
patch `/session/{sessionID}/message/{messageID}/part/{partID}`
Update a part in a message.
## Options
* `directory`
* `workspace`
## Request Body
**Content Types**: `application/json`
"""
@spec part_update(
sessionID :: String.t(),
messageID :: String.t(),
partID :: String.t(),
body ::
OpenCode.Generated.AgentPart.t()
| OpenCode.Generated.CompactionPart.t()
| OpenCode.Generated.FilePart.t()
| OpenCode.Generated.PatchPart.t()
| OpenCode.Generated.ReasoningPart.t()
| OpenCode.Generated.RetryPart.t()
| OpenCode.Generated.SnapshotPart.t()
| OpenCode.Generated.StepFinishPart.t()
| OpenCode.Generated.StepStartPart.t()
| OpenCode.Generated.SubtaskPart.t()
| OpenCode.Generated.TextPart.t()
| OpenCode.Generated.ToolPart.t(),
opts :: keyword
) ::
{:ok,
OpenCode.Generated.AgentPart.t()
| OpenCode.Generated.CompactionPart.t()
| OpenCode.Generated.FilePart.t()
| OpenCode.Generated.PatchPart.t()
| OpenCode.Generated.ReasoningPart.t()
| OpenCode.Generated.RetryPart.t()
| OpenCode.Generated.SnapshotPart.t()
| OpenCode.Generated.StepFinishPart.t()
| OpenCode.Generated.StepStartPart.t()
| OpenCode.Generated.SubtaskPart.t()
| OpenCode.Generated.TextPart.t()
| OpenCode.Generated.ToolPart.t()}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()}
def part_update(sessionID, messageID, partID, body, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID, messageID: messageID, partID: partID, body: body],
call: {OpenCode.Generated.Session, :part_update},
url: "/session/#{sessionID}/message/#{messageID}/part/#{partID}",
body: body,
method: :patch,
query: query,
request: [
{"application/json",
{:union,
[
{OpenCode.Generated.AgentPart, :t},
{OpenCode.Generated.CompactionPart, :t},
{OpenCode.Generated.FilePart, :t},
{OpenCode.Generated.PatchPart, :t},
{OpenCode.Generated.ReasoningPart, :t},
{OpenCode.Generated.RetryPart, :t},
{OpenCode.Generated.SnapshotPart, :t},
{OpenCode.Generated.StepFinishPart, :t},
{OpenCode.Generated.StepStartPart, :t},
{OpenCode.Generated.SubtaskPart, :t},
{OpenCode.Generated.TextPart, :t},
{OpenCode.Generated.ToolPart, :t}
]}}
],
response: [
{200,
{:union,
[
{OpenCode.Generated.AgentPart, :t},
{OpenCode.Generated.CompactionPart, :t},
{OpenCode.Generated.FilePart, :t},
{OpenCode.Generated.PatchPart, :t},
{OpenCode.Generated.ReasoningPart, :t},
{OpenCode.Generated.RetryPart, :t},
{OpenCode.Generated.SnapshotPart, :t},
{OpenCode.Generated.StepFinishPart, :t},
{OpenCode.Generated.StepStartPart, :t},
{OpenCode.Generated.SubtaskPart, :t},
{OpenCode.Generated.TextPart, :t},
{OpenCode.Generated.ToolPart, :t}
]}},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}}
],
opts: opts
})
end
@doc """
Respond to permission
Approve or deny a permission request from the AI assistant.
## Options
* `directory`
* `workspace`
## Request Body
**Content Types**: `application/json`
"""
@spec permission_respond(
sessionID :: String.t(),
permissionID :: String.t(),
body :: map,
opts :: keyword
) ::
{:ok, boolean}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()
| OpenCode.Generated.PermissionNotFoundError.t()}
def permission_respond(sessionID, permissionID, body, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID, permissionID: permissionID, body: body],
call: {OpenCode.Generated.Session, :permission_respond},
url: "/session/#{sessionID}/permissions/#{permissionID}",
body: body,
method: :post,
query: query,
request: [{"application/json", :map}],
response: [
{200, :boolean},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404,
{:union,
[
{OpenCode.Generated.NotFoundError, :t},
{OpenCode.Generated.PermissionNotFoundError, :t}
]}}
],
opts: opts
})
end
@doc """
Abort session
Abort an active session and stop any ongoing AI processing or command execution.
## Options
* `directory`
* `workspace`
"""
@spec session_abort(sessionID :: String.t(), opts :: keyword) ::
{:ok, boolean}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()}
def session_abort(sessionID, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID],
call: {OpenCode.Generated.Session, :session_abort},
url: "/session/#{sessionID}/abort",
method: :post,
query: query,
response: [
{200, :boolean},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}}
],
opts: opts
})
end
@doc """
Get session children
Retrieve all child sessions that were forked from the specified parent session.
## Options
* `directory`
* `workspace`
"""
@spec session_children(sessionID :: String.t(), opts :: keyword) ::
{:ok, [OpenCode.Generated.Session.t()]}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()}
def session_children(sessionID, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID],
call: {OpenCode.Generated.Session, :session_children},
url: "/session/#{sessionID}/children",
method: :get,
query: query,
response: [
{200, [{OpenCode.Generated.Session, :t}]},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}}
],
opts: opts
})
end
@type session_command_200_json_resp :: %{
info: OpenCode.Generated.AssistantMessage.t(),
parts: [
OpenCode.Generated.AgentPart.t()
| OpenCode.Generated.CompactionPart.t()
| OpenCode.Generated.FilePart.t()
| OpenCode.Generated.PatchPart.t()
| OpenCode.Generated.ReasoningPart.t()
| OpenCode.Generated.RetryPart.t()
| OpenCode.Generated.SnapshotPart.t()
| OpenCode.Generated.StepFinishPart.t()
| OpenCode.Generated.StepStartPart.t()
| OpenCode.Generated.SubtaskPart.t()
| OpenCode.Generated.TextPart.t()
| OpenCode.Generated.ToolPart.t()
]
}
@doc """
Send command
Send a new command to a session for execution by the AI assistant.
## Options
* `directory`
* `workspace`
## Request Body
**Content Types**: `application/json`
"""
@spec session_command(sessionID :: String.t(), body :: map, opts :: keyword) ::
{:ok, OpenCode.Generated.Session.session_command_200_json_resp()}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()}
def session_command(sessionID, body, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID, body: body],
call: {OpenCode.Generated.Session, :session_command},
url: "/session/#{sessionID}/command",
body: body,
method: :post,
query: query,
request: [{"application/json", :map}],
response: [
{200, {OpenCode.Generated.Session, :session_command_200_json_resp}},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}}
],
opts: opts
})
end
@doc """
Create session
Create a new OpenCode session for interacting with AI assistants and managing conversations.
## Options
* `directory`
* `workspace`
## Request Body
**Content Types**: `application/json`
"""
@spec session_create(body :: map, opts :: keyword) ::
{:ok, OpenCode.Generated.Session.t()}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()}
def session_create(body, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [body: body],
call: {OpenCode.Generated.Session, :session_create},
url: "/session",
body: body,
method: :post,
query: query,
request: [{"application/json", :map}],
response: [
{200, {OpenCode.Generated.Session, :t}},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}}
],
opts: opts
})
end
@doc """
Delete session
Delete a session and permanently remove all associated data, including messages and history.
## Options
* `directory`
* `workspace`
"""
@spec session_delete(sessionID :: String.t(), opts :: keyword) ::
{:ok, boolean}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()}
def session_delete(sessionID, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID],
call: {OpenCode.Generated.Session, :session_delete},
url: "/session/#{sessionID}",
method: :delete,
query: query,
response: [
{200, :boolean},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}}
],
opts: opts
})
end
@doc """
Delete message
Permanently delete a specific message and all of its parts from a session without reverting file changes.
## Options
* `directory`
* `workspace`
"""
@spec session_delete_message(sessionID :: String.t(), messageID :: String.t(), opts :: keyword) ::
{:ok, boolean}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()
| OpenCode.Generated.SessionBusyError.t()}
def session_delete_message(sessionID, messageID, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID, messageID: messageID],
call: {OpenCode.Generated.Session, :session_delete_message},
url: "/session/#{sessionID}/message/#{messageID}",
method: :delete,
query: query,
response: [
{200, :boolean},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}},
{409, {OpenCode.Generated.SessionBusyError, :t}}
],
opts: opts
})
end
@doc """
Get message diff
Get the file changes (diff) that resulted from a specific user message in the session.
## Options
* `directory`
* `workspace`
* `messageID`
"""
@spec session_diff(sessionID :: String.t(), opts :: keyword) ::
{:ok, [OpenCode.Generated.SnapshotFileDiff.t()]}
| {:error, OpenCode.Generated.BadRequestError.t()}
def session_diff(sessionID, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :messageID, :workspace])
client.request(%{
args: [sessionID: sessionID],
call: {OpenCode.Generated.Session, :session_diff},
url: "/session/#{sessionID}/diff",
method: :get,
query: query,
response: [
{200, [{OpenCode.Generated.SnapshotFileDiff, :t}]},
{400, {OpenCode.Generated.BadRequestError, :t}}
],
opts: opts
})
end
@doc """
Fork session
Create a new session by forking an existing session at a specific message point.
## Options
* `directory`
* `workspace`
## Request Body
**Content Types**: `application/json`
"""
@spec session_fork(sessionID :: String.t(), body :: map, opts :: keyword) ::
{:ok, OpenCode.Generated.Session.t()}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()}
def session_fork(sessionID, body, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID, body: body],
call: {OpenCode.Generated.Session, :session_fork},
url: "/session/#{sessionID}/fork",
body: body,
method: :post,
query: query,
request: [{"application/json", :map}],
response: [
{200, {OpenCode.Generated.Session, :t}},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}}
],
opts: opts
})
end
@doc """
Get session
Retrieve detailed information about a specific OpenCode session.
## Options
* `directory`
* `workspace`
"""
@spec session_get(sessionID :: String.t(), opts :: keyword) ::
{:ok, OpenCode.Generated.Session.t()}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()}
def session_get(sessionID, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID],
call: {OpenCode.Generated.Session, :session_get},
url: "/session/#{sessionID}",
method: :get,
query: query,
response: [
{200, {OpenCode.Generated.Session, :t}},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}}
],
opts: opts
})
end
@doc """
Initialize session
Analyze the current application and create an AGENTS.md file with project-specific agent configurations.
## Options
* `directory`
* `workspace`
## Request Body
**Content Types**: `application/json`
"""
@spec session_init(sessionID :: String.t(), body :: map, opts :: keyword) ::
{:ok, boolean}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()}
def session_init(sessionID, body, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID, body: body],
call: {OpenCode.Generated.Session, :session_init},
url: "/session/#{sessionID}/init",
body: body,
method: :post,
query: query,
request: [{"application/json", :map}],
response: [
{200, :boolean},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}}
],
opts: opts
})
end
@doc """
List sessions
Get a list of all OpenCode sessions, sorted by most recently updated.
## Options
* `directory`
* `workspace`
* `scope`
* `path`
* `roots`
* `start`
* `search`
* `limit`
"""
@spec session_list(opts :: keyword) ::
{:ok, [OpenCode.Generated.Session.t()]}
| {:error, OpenCode.Generated.BadRequestError.t()}
def session_list(opts \\ []) do
client = opts[:client] || @default_client
query =
Keyword.take(opts, [:directory, :limit, :path, :roots, :scope, :search, :start, :workspace])
client.request(%{
args: [],
call: {OpenCode.Generated.Session, :session_list},
url: "/session",
method: :get,
query: query,
response: [
{200, [{OpenCode.Generated.Session, :t}]},
{400, {OpenCode.Generated.BadRequestError, :t}}
],
opts: opts
})
end
@type session_message_200_json_resp :: %{
info: OpenCode.Generated.AssistantMessage.t() | OpenCode.Generated.UserMessage.t(),
parts: [
OpenCode.Generated.AgentPart.t()
| OpenCode.Generated.CompactionPart.t()
| OpenCode.Generated.FilePart.t()
| OpenCode.Generated.PatchPart.t()
| OpenCode.Generated.ReasoningPart.t()
| OpenCode.Generated.RetryPart.t()
| OpenCode.Generated.SnapshotPart.t()
| OpenCode.Generated.StepFinishPart.t()
| OpenCode.Generated.StepStartPart.t()
| OpenCode.Generated.SubtaskPart.t()
| OpenCode.Generated.TextPart.t()
| OpenCode.Generated.ToolPart.t()
]
}
@doc """
Get message
Retrieve a specific message from a session by its message ID.
## Options
* `directory`
* `workspace`
"""
@spec session_message(sessionID :: String.t(), messageID :: String.t(), opts :: keyword) ::
{:ok, OpenCode.Generated.Session.session_message_200_json_resp()}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()}
def session_message(sessionID, messageID, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID, messageID: messageID],
call: {OpenCode.Generated.Session, :session_message},
url: "/session/#{sessionID}/message/#{messageID}",
method: :get,
query: query,
response: [
{200, {OpenCode.Generated.Session, :session_message_200_json_resp}},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}}
],
opts: opts
})
end
@type session_messages_200_json_resp :: %{
info: OpenCode.Generated.AssistantMessage.t() | OpenCode.Generated.UserMessage.t(),
parts: [
OpenCode.Generated.AgentPart.t()
| OpenCode.Generated.CompactionPart.t()
| OpenCode.Generated.FilePart.t()
| OpenCode.Generated.PatchPart.t()
| OpenCode.Generated.ReasoningPart.t()
| OpenCode.Generated.RetryPart.t()
| OpenCode.Generated.SnapshotPart.t()
| OpenCode.Generated.StepFinishPart.t()
| OpenCode.Generated.StepStartPart.t()
| OpenCode.Generated.SubtaskPart.t()
| OpenCode.Generated.TextPart.t()
| OpenCode.Generated.ToolPart.t()
]
}
@doc """
Get session messages
Retrieve all messages in a session, including user prompts and AI responses.
## Options
* `directory`
* `workspace`
* `limit`
* `before`
"""
@spec session_messages(sessionID :: String.t(), opts :: keyword) ::
{:ok, [OpenCode.Generated.Session.session_messages_200_json_resp()]}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()}
def session_messages(sessionID, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:before, :directory, :limit, :workspace])
client.request(%{
args: [sessionID: sessionID],
call: {OpenCode.Generated.Session, :session_messages},
url: "/session/#{sessionID}/message",
method: :get,
query: query,
response: [
{200, [{OpenCode.Generated.Session, :session_messages_200_json_resp}]},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}}
],
opts: opts
})
end
@type session_prompt_200_json_resp :: %{
info: OpenCode.Generated.AssistantMessage.t(),
parts: [
OpenCode.Generated.AgentPart.t()
| OpenCode.Generated.CompactionPart.t()
| OpenCode.Generated.FilePart.t()
| OpenCode.Generated.PatchPart.t()
| OpenCode.Generated.ReasoningPart.t()
| OpenCode.Generated.RetryPart.t()
| OpenCode.Generated.SnapshotPart.t()
| OpenCode.Generated.StepFinishPart.t()
| OpenCode.Generated.StepStartPart.t()
| OpenCode.Generated.SubtaskPart.t()
| OpenCode.Generated.TextPart.t()
| OpenCode.Generated.ToolPart.t()
]
}
@doc """
Send message
Create and send a new message to a session, streaming the AI response.
## Options
* `directory`
* `workspace`
## Request Body
**Content Types**: `application/json`
"""
@spec session_prompt(sessionID :: String.t(), body :: map, opts :: keyword) ::
{:ok, OpenCode.Generated.Session.session_prompt_200_json_resp()}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()}
def session_prompt(sessionID, body, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID, body: body],
call: {OpenCode.Generated.Session, :session_prompt},
url: "/session/#{sessionID}/message",
body: body,
method: :post,
query: query,
request: [{"application/json", :map}],
response: [
{200, {OpenCode.Generated.Session, :session_prompt_200_json_resp}},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}}
],
opts: opts
})
end
@doc """
Send async message
Create and send a new message to a session asynchronously, starting the session if needed and returning immediately.
## Options
* `directory`
* `workspace`
## Request Body
**Content Types**: `application/json`
"""
@spec session_prompt_async(sessionID :: String.t(), body :: map, opts :: keyword) ::
:ok
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()}
def session_prompt_async(sessionID, body, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID, body: body],
call: {OpenCode.Generated.Session, :session_prompt_async},
url: "/session/#{sessionID}/prompt_async",
body: body,
method: :post,
query: query,
request: [{"application/json", :map}],
response: [
{204, :null},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}}
],
opts: opts
})
end
@doc """
Revert message
Revert a specific message in a session, undoing its effects and restoring the previous state.
## Options
* `directory`
* `workspace`
## Request Body
**Content Types**: `application/json`
"""
@spec session_revert(sessionID :: String.t(), body :: map, opts :: keyword) ::
{:ok, OpenCode.Generated.Session.t()}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()
| OpenCode.Generated.SessionBusyError.t()}
def session_revert(sessionID, body, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID, body: body],
call: {OpenCode.Generated.Session, :session_revert},
url: "/session/#{sessionID}/revert",
body: body,
method: :post,
query: query,
request: [{"application/json", :map}],
response: [
{200, {OpenCode.Generated.Session, :t}},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}},
{409, {OpenCode.Generated.SessionBusyError, :t}}
],
opts: opts
})
end
@doc """
Share session
Create a shareable link for a session, allowing others to view the conversation.
## Options
* `directory`
* `workspace`
"""
@spec session_share(sessionID :: String.t(), opts :: keyword) ::
{:ok, OpenCode.Generated.Session.t()}
| {:error,
OpenCode.Generated.BadRequestError.t()
| OpenCode.Generated.EffectHttpApiErrorInternalServerError.t()
| OpenCode.Generated.NotFoundError.t()}
def session_share(sessionID, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID],
call: {OpenCode.Generated.Session, :session_share},
url: "/session/#{sessionID}/share",
method: :post,
query: query,
response: [
{200, {OpenCode.Generated.Session, :t}},
{400, {OpenCode.Generated.BadRequestError, :t}},
{404, {OpenCode.Generated.NotFoundError, :t}},
{500, {OpenCode.Generated.EffectHttpApiErrorInternalServerError, :t}}
],
opts: opts
})
end
@type session_shell_200_json_resp :: %{
info: OpenCode.Generated.AssistantMessage.t() | OpenCode.Generated.UserMessage.t(),
parts: [
OpenCode.Generated.AgentPart.t()
| OpenCode.Generated.CompactionPart.t()
| OpenCode.Generated.FilePart.t()
| OpenCode.Generated.PatchPart.t()
| OpenCode.Generated.ReasoningPart.t()
| OpenCode.Generated.RetryPart.t()
| OpenCode.Generated.SnapshotPart.t()
| OpenCode.Generated.StepFinishPart.t()
| OpenCode.Generated.StepStartPart.t()
| OpenCode.Generated.SubtaskPart.t()
| OpenCode.Generated.TextPart.t()
| OpenCode.Generated.ToolPart.t()
]
}
@doc """
Run shell command
Execute a shell command within the session context and return the AI's response.
## Options
* `directory`
* `workspace`
## Request Body
**Content Types**: `application/json`
"""
@spec session_shell(sessionID :: String.t(), body :: map, opts :: keyword) ::
{:ok, OpenCode.Generated.Session.session_shell_200_json_resp()}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()
| OpenCode.Generated.SessionBusyError.t()}
def session_shell(sessionID, body, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID, body: body],
call: {OpenCode.Generated.Session, :session_shell},
url: "/session/#{sessionID}/shell",
body: body,
method: :post,
query: query,
request: [{"application/json", :map}],
response: [
{200, {OpenCode.Generated.Session, :session_shell_200_json_resp}},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}},
{409, {OpenCode.Generated.SessionBusyError, :t}}
],
opts: opts
})
end
@doc """
Get session status
Retrieve the current status of all sessions, including active, idle, and completed states.
## Options
* `directory`
* `workspace`
"""
@spec session_status(opts :: keyword) ::
{:ok, map}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()}
def session_status(opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [],
call: {OpenCode.Generated.Session, :session_status},
url: "/session/status",
method: :get,
query: query,
response: [
{200, :map},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}}
],
opts: opts
})
end
@doc """
Summarize session
Generate a concise summary of the session using AI compaction to preserve key information.
## Options
* `directory`
* `workspace`
## Request Body
**Content Types**: `application/json`
"""
@spec session_summarize(sessionID :: String.t(), body :: map, opts :: keyword) ::
{:ok, boolean}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()}
def session_summarize(sessionID, body, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID, body: body],
call: {OpenCode.Generated.Session, :session_summarize},
url: "/session/#{sessionID}/summarize",
body: body,
method: :post,
query: query,
request: [{"application/json", :map}],
response: [
{200, :boolean},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}}
],
opts: opts
})
end
@doc """
Get session todos
Retrieve the todo list associated with a specific session, showing tasks and action items.
## Options
* `directory`
* `workspace`
"""
@spec session_todo(sessionID :: String.t(), opts :: keyword) ::
{:ok, [OpenCode.Generated.Todo.t()]}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()}
def session_todo(sessionID, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID],
call: {OpenCode.Generated.Session, :session_todo},
url: "/session/#{sessionID}/todo",
method: :get,
query: query,
response: [
{200, [{OpenCode.Generated.Todo, :t}]},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}}
],
opts: opts
})
end
@doc """
Restore reverted messages
Restore all previously reverted messages in a session.
## Options
* `directory`
* `workspace`
"""
@spec session_unrevert(sessionID :: String.t(), opts :: keyword) ::
{:ok, OpenCode.Generated.Session.t()}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()
| OpenCode.Generated.SessionBusyError.t()}
def session_unrevert(sessionID, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID],
call: {OpenCode.Generated.Session, :session_unrevert},
url: "/session/#{sessionID}/unrevert",
method: :post,
query: query,
response: [
{200, {OpenCode.Generated.Session, :t}},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}},
{409, {OpenCode.Generated.SessionBusyError, :t}}
],
opts: opts
})
end
@doc """
Unshare session
Remove the shareable link for a session, making it private again.
## Options
* `directory`
* `workspace`
"""
@spec session_unshare(sessionID :: String.t(), opts :: keyword) ::
{:ok, OpenCode.Generated.Session.t()}
| {:error,
OpenCode.Generated.BadRequestError.t()
| OpenCode.Generated.EffectHttpApiErrorInternalServerError.t()
| OpenCode.Generated.NotFoundError.t()}
def session_unshare(sessionID, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID],
call: {OpenCode.Generated.Session, :session_unshare},
url: "/session/#{sessionID}/share",
method: :delete,
query: query,
response: [
{200, {OpenCode.Generated.Session, :t}},
{400, {OpenCode.Generated.BadRequestError, :t}},
{404, {OpenCode.Generated.NotFoundError, :t}},
{500, {OpenCode.Generated.EffectHttpApiErrorInternalServerError, :t}}
],
opts: opts
})
end
@doc """
Update session
Update properties of an existing session, such as title or other metadata.
## Options
* `directory`
* `workspace`
## Request Body
**Content Types**: `application/json`
"""
@spec session_update(sessionID :: String.t(), body :: map, opts :: keyword) ::
{:ok, OpenCode.Generated.Session.t()}
| {:error,
OpenCode.Generated.EffectHttpApiErrorBadRequest.t()
| OpenCode.Generated.InvalidRequestError.t()
| OpenCode.Generated.NotFoundError.t()}
def session_update(sessionID, body, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:directory, :workspace])
client.request(%{
args: [sessionID: sessionID, body: body],
call: {OpenCode.Generated.Session, :session_update},
url: "/session/#{sessionID}",
body: body,
method: :patch,
query: query,
request: [{"application/json", :map}],
response: [
{200, {OpenCode.Generated.Session, :t}},
{400,
{:union,
[
{OpenCode.Generated.EffectHttpApiErrorBadRequest, :t},
{OpenCode.Generated.InvalidRequestError, :t}
]}},
{404, {OpenCode.Generated.NotFoundError, :t}}
],
opts: opts
})
end
@type t :: %__MODULE__{
agent: String.t() | nil,
cost: number | nil,
directory: String.t(),
id: String.t(),
metadata: map | nil,
model: OpenCode.Generated.SessionModel.t() | nil,
parent_id: String.t() | nil,
path: String.t() | nil,
permission: [OpenCode.Generated.PermissionRule.t()] | nil,
project_id: String.t(),
revert: OpenCode.Generated.SessionRevert.t() | nil,
share: OpenCode.Generated.SessionShare.t() | nil,
slug: String.t(),
summary: OpenCode.Generated.SessionSummary.t() | nil,
time: OpenCode.Generated.SessionTime.t(),
title: String.t(),
tokens: OpenCode.Generated.SessionTokens.t() | nil,
version: String.t(),
workspace_id: String.t() | nil
}
defstruct [
:agent,
:cost,
:directory,
:id,
:metadata,
:model,
:parent_id,
:path,
:permission,
:project_id,
:revert,
:share,
:slug,
:summary,
:time,
:title,
:tokens,
:version,
:workspace_id
]
@doc false
@spec __fields__(atom) :: keyword
def __fields__(type \\ :t)
def __fields__(:session_command_200_json_resp) do
[
info: {OpenCode.Generated.AssistantMessage, :t},
parts: [
union: [
{OpenCode.Generated.AgentPart, :t},
{OpenCode.Generated.CompactionPart, :t},
{OpenCode.Generated.FilePart, :t},
{OpenCode.Generated.PatchPart, :t},
{OpenCode.Generated.ReasoningPart, :t},
{OpenCode.Generated.RetryPart, :t},
{OpenCode.Generated.SnapshotPart, :t},
{OpenCode.Generated.StepFinishPart, :t},
{OpenCode.Generated.StepStartPart, :t},
{OpenCode.Generated.SubtaskPart, :t},
{OpenCode.Generated.TextPart, :t},
{OpenCode.Generated.ToolPart, :t}
]
]
]
end
def __fields__(:session_message_200_json_resp) do
[
info:
{:union,
[{OpenCode.Generated.AssistantMessage, :t}, {OpenCode.Generated.UserMessage, :t}]},
parts: [
union: [
{OpenCode.Generated.AgentPart, :t},
{OpenCode.Generated.CompactionPart, :t},
{OpenCode.Generated.FilePart, :t},
{OpenCode.Generated.PatchPart, :t},
{OpenCode.Generated.ReasoningPart, :t},
{OpenCode.Generated.RetryPart, :t},
{OpenCode.Generated.SnapshotPart, :t},
{OpenCode.Generated.StepFinishPart, :t},
{OpenCode.Generated.StepStartPart, :t},
{OpenCode.Generated.SubtaskPart, :t},
{OpenCode.Generated.TextPart, :t},
{OpenCode.Generated.ToolPart, :t}
]
]
]
end
def __fields__(:session_messages_200_json_resp) do
[
info:
{:union,
[{OpenCode.Generated.AssistantMessage, :t}, {OpenCode.Generated.UserMessage, :t}]},
parts: [
union: [
{OpenCode.Generated.AgentPart, :t},
{OpenCode.Generated.CompactionPart, :t},
{OpenCode.Generated.FilePart, :t},
{OpenCode.Generated.PatchPart, :t},
{OpenCode.Generated.ReasoningPart, :t},
{OpenCode.Generated.RetryPart, :t},
{OpenCode.Generated.SnapshotPart, :t},
{OpenCode.Generated.StepFinishPart, :t},
{OpenCode.Generated.StepStartPart, :t},
{OpenCode.Generated.SubtaskPart, :t},
{OpenCode.Generated.TextPart, :t},
{OpenCode.Generated.ToolPart, :t}
]
]
]
end
def __fields__(:session_prompt_200_json_resp) do
[
info: {OpenCode.Generated.AssistantMessage, :t},
parts: [
union: [
{OpenCode.Generated.AgentPart, :t},
{OpenCode.Generated.CompactionPart, :t},
{OpenCode.Generated.FilePart, :t},
{OpenCode.Generated.PatchPart, :t},
{OpenCode.Generated.ReasoningPart, :t},
{OpenCode.Generated.RetryPart, :t},
{OpenCode.Generated.SnapshotPart, :t},
{OpenCode.Generated.StepFinishPart, :t},
{OpenCode.Generated.StepStartPart, :t},
{OpenCode.Generated.SubtaskPart, :t},
{OpenCode.Generated.TextPart, :t},
{OpenCode.Generated.ToolPart, :t}
]
]
]
end
def __fields__(:session_shell_200_json_resp) do
[
info:
{:union,
[{OpenCode.Generated.AssistantMessage, :t}, {OpenCode.Generated.UserMessage, :t}]},
parts: [
union: [
{OpenCode.Generated.AgentPart, :t},
{OpenCode.Generated.CompactionPart, :t},
{OpenCode.Generated.FilePart, :t},
{OpenCode.Generated.PatchPart, :t},
{OpenCode.Generated.ReasoningPart, :t},
{OpenCode.Generated.RetryPart, :t},
{OpenCode.Generated.SnapshotPart, :t},
{OpenCode.Generated.StepFinishPart, :t},
{OpenCode.Generated.StepStartPart, :t},
{OpenCode.Generated.SubtaskPart, :t},
{OpenCode.Generated.TextPart, :t},
{OpenCode.Generated.ToolPart, :t}
]
]
]
end
def __fields__(:t) do
[
agent: :string,
cost: :number,
directory: :string,
id: :string,
metadata: :map,
model: {OpenCode.Generated.SessionModel, :t},
parent_id: :string,
path: :string,
permission: [{OpenCode.Generated.PermissionRule, :t}],
project_id: :string,
revert: {OpenCode.Generated.SessionRevert, :t},
share: {OpenCode.Generated.SessionShare, :t},
slug: :string,
summary: {OpenCode.Generated.SessionSummary, :t},
time: {OpenCode.Generated.SessionTime, :t},
title: :string,
tokens: {OpenCode.Generated.SessionTokens, :t},
version: :string,
workspace_id: :string
]
end
end