LemonCore.ResumeToken (lemon_core v0.1.0)

View Source

Session identifier for resuming interrupted CLI sessions.

Each CLI tool (codex, claude, etc.) provides its own session ID format. The ResumeToken captures both the engine and the session value.

Examples

# Codex session
%LemonCore.ResumeToken{engine: "codex", value: "thread_abc123"}

# Claude session
%LemonCore.ResumeToken{engine: "claude", value: "session_xyz"}

# Kimi session
%LemonCore.ResumeToken{engine: "kimi", value: "session_kimi"}

Summary

Functions

Extract a resume token from text.

Extract a resume token for a specific engine from text.

Format token for display to user

Format token for plain-text display without code fences

Check if a line is exactly a resume line (for truncation preservation).

Check if a line is a resume line for a specific engine.

Create a new resume token

Types

t()

@type t() :: %LemonCore.ResumeToken{engine: String.t(), value: String.t()}

Functions

extract_resume(text)

@spec extract_resume(String.t()) :: t() | nil

Extract a resume token from text.

Searches text for resume line patterns from any supported engine. Returns the first token found, or nil if none.

Handles various formats:

  • Plain text: codex resume abc123
  • Backticks: `claude --resume xyz`
  • Code blocks: codex resume abc123

Examples

iex> LemonCore.ResumeToken.extract_resume("Please run `codex resume thread_abc123`")
%LemonCore.ResumeToken{engine: "codex", value: "thread_abc123"}

iex> LemonCore.ResumeToken.extract_resume("Continue with claude --resume session_xyz")
%LemonCore.ResumeToken{engine: "claude", value: "session_xyz"}

iex> LemonCore.ResumeToken.extract_resume("Continue with kimi --session session_kimi")
%LemonCore.ResumeToken{engine: "kimi", value: "session_kimi"}

iex> LemonCore.ResumeToken.extract_resume("lemon resume abc12345")
%LemonCore.ResumeToken{engine: "lemon", value: "abc12345"}

iex> LemonCore.ResumeToken.extract_resume("No resume token here")
nil

extract_resume(text, engine)

@spec extract_resume(String.t(), String.t()) :: t() | nil

Extract a resume token for a specific engine from text.

Examples

iex> LemonCore.ResumeToken.extract_resume("codex resume abc", "codex")
%LemonCore.ResumeToken{engine: "codex", value: "abc"}

iex> LemonCore.ResumeToken.extract_resume("codex resume abc", "claude")
nil

format(resume_token)

Format token for display to user

format_plain(resume_token)

@spec format_plain(t()) :: String.t()

Format token for plain-text display without code fences

is_resume_line(line)

@spec is_resume_line(String.t()) :: boolean()

Check if a line is exactly a resume line (for truncation preservation).

This is a strict check - the line should be primarily a resume command, not just contain one among other text.

Examples

iex> LemonCore.ResumeToken.is_resume_line("codex resume thread_abc123")
true

iex> LemonCore.ResumeToken.is_resume_line("`claude --resume session_xyz`")
true

iex> LemonCore.ResumeToken.is_resume_line("Please run codex resume abc")
false

iex> LemonCore.ResumeToken.is_resume_line("Some other text")
false

is_resume_line(line, engine)

@spec is_resume_line(String.t(), String.t()) :: boolean()

Check if a line is a resume line for a specific engine.

new(engine, value)

Create a new resume token