Current section

Files

Jump to
opencode_sdk lib opencode generated session.ex
Raw

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.BadRequestError.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, {OpenCode.Generated.BadRequestError, :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.BadRequestError.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, {OpenCode.Generated.BadRequestError, :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.BadRequestError.t() | OpenCode.Generated.NotFoundError.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, {OpenCode.Generated.BadRequestError, :t}},
{404, {OpenCode.Generated.NotFoundError, :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.BadRequestError.t() | OpenCode.Generated.NotFoundError.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, {OpenCode.Generated.BadRequestError, :t}},
{404, {OpenCode.Generated.NotFoundError, :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.BadRequestError.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, {OpenCode.Generated.BadRequestError, :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.BadRequestError.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, {OpenCode.Generated.BadRequestError, :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.BadRequestError.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, {OpenCode.Generated.BadRequestError, :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.BadRequestError.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, {OpenCode.Generated.BadRequestError, :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.BadRequestError.t() | OpenCode.Generated.NotFoundError.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, {OpenCode.Generated.BadRequestError, :t}},
{404, {OpenCode.Generated.NotFoundError, :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
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}]}],
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.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}},
{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.BadRequestError.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, {OpenCode.Generated.BadRequestError, :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.BadRequestError.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, {OpenCode.Generated.BadRequestError, :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
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}]}],
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.BadRequestError.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, {OpenCode.Generated.BadRequestError, :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.BadRequestError.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, {OpenCode.Generated.BadRequestError, :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.BadRequestError.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, {OpenCode.Generated.BadRequestError, :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.BadRequestError.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, {OpenCode.Generated.BadRequestError, :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.BadRequestError.t() | OpenCode.Generated.NotFoundError.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, {OpenCode.Generated.BadRequestError, :t}},
{404, {OpenCode.Generated.NotFoundError, :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.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}},
{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.BadRequestError.t() | OpenCode.Generated.NotFoundError.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, {OpenCode.Generated.BadRequestError, :t}},
{404, {OpenCode.Generated.NotFoundError, :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.BadRequestError.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, {OpenCode.Generated.BadRequestError, :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.BadRequestError.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, {OpenCode.Generated.BadRequestError, :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.BadRequestError.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, {OpenCode.Generated.BadRequestError, :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.BadRequestError.t() | OpenCode.Generated.NotFoundError.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, {OpenCode.Generated.BadRequestError, :t}},
{404, {OpenCode.Generated.NotFoundError, :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.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}},
{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.BadRequestError.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, {OpenCode.Generated.BadRequestError, :t}},
{404, {OpenCode.Generated.NotFoundError, :t}}
],
opts: opts
})
end
@type t :: %__MODULE__{
agent: String.t() | nil,
directory: String.t(),
id: String.t(),
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(),
version: String.t(),
workspace_id: String.t() | nil
}
defstruct [
:agent,
:directory,
:id,
:model,
:parent_id,
:path,
:permission,
:project_id,
:revert,
:share,
:slug,
:summary,
:time,
:title,
: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,
directory: :string,
id: :string,
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,
version: :string,
workspace_id: :string
]
end
end