///|
/// Main client for interacting with the OpenCode agent through its CLI.
pub struct OpenCode {
  priv exec : OpenCodeExec
}

///|
/// Construct an OpenCode CLI client.
pub fn OpenCode::OpenCode(
  options? : OpenCodeOptions = OpenCodeOptions::OpenCodeOptions(),
) -> OpenCode {
  {
    exec: OpenCodeExec::OpenCodeExec(
      options.opencode_path_override,
      options.env,
      options.config,
    ),
  }
}

///|
/// Start a new persisted OpenCode session.
pub fn OpenCode::start_thread(
  self : OpenCode,
  options? : ThreadOptions = ThreadOptions::ThreadOptions(),
) -> Thread {
  Thread::Thread(self.exec, options)
}

///|
/// Resume a persisted OpenCode session by identifier.
pub fn OpenCode::resume_thread(
  self : OpenCode,
  id : String,
  options? : ThreadOptions = ThreadOptions::ThreadOptions(),
) -> Thread {
  Thread::Thread(self.exec, options, id~)
}