@molecule/api-agent-transcript-cline
Provider bond · agent-transcript · API (Node) · v1.0.1 · Apache-2.0
Reads Cline and Roo Code task history (ui_messages.json) into a normalized agent session
npm install @molecule/api-agent-transcript-clinenpm · Source on GitHub · Implements @molecule/api-agent-transcript
How it works
@molecule/api-agent-transcript-cline is a provider bond on the API (Node) side: it implements the agent-transcript core interface (@molecule/api-agent-transcript) with a concrete vendor or library behind it.
Your code calls the core; you wire this provider once at startup. Swapping vendors later is one line in that wiring, not a rewrite.
import { readFileSync } from 'node:fs'
import { readTranscript, setProvider } from '@molecule/api-agent-transcript'
import { provider } from '@molecule/api-agent-transcript-cline'
setProvider(provider)
// e.g. ~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/tasks/<taskId>/ui_messages.json
const file = 'ui_messages.json'
const session = readTranscript({ text: readFileSync(file, 'utf8'), fileName: file })
console.log(session.harness, session.turns.length) // 'Cline' or 'Roo Code'Works with: @molecule/api-agent-transcript
Reference
Cline and Roo Code transcript reader for @molecule/api-agent-transcript.
Reads a task's ui_messages.json — the chat history Cline and Roo Code
keep per task in the extension's storage — into a normalized
AgentSession: the task and your replies, the agent's messages, questions
and plans, and the files it created or edited.
Quick Start
import { readFileSync } from 'node:fs'
import { readTranscript, setProvider } from '@molecule/api-agent-transcript'
import { provider } from '@molecule/api-agent-transcript-cline'
setProvider(provider)
// e.g. ~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/tasks/<taskId>/ui_messages.json
const file = 'ui_messages.json'
const session = readTranscript({ text: readFileSync(file, 'utf8'), fileName: file })
console.log(session.harness, session.turns.length) // 'Cline' or 'Roo Code'
Type
provider
Installation
npm install @molecule/api-agent-transcript-cline @molecule/api-agent-transcript
API
Functions
looksLikeUiMessages(text)
Whether a text is a Cline / Roo Code ui_messages.json.
function looksLikeUiMessages(text: string): boolean
text— The file's text.
Returns: True on a positive match.
readUiMessages(text)
Read a Cline / Roo Code ui_messages.json.
function readUiMessages(text: string): AgentSession
text— The file's text.
Returns: The normalized session.
replacementsOf(diff)
The text each SEARCH/REPLACE block replaces with, in any of the three
marker styles (Cline's ------- SEARCH / +++++++ REPLACE, Roo Code's and
older Cline's <<<<<<< SEARCH / >>>>>>> REPLACE, and Cline's
*** Begin Patch files).
function replacementsOf(diff: string): { text: string; create: boolean }[]
diff— The diff text.
Returns: The replacement texts, and whether the whole file was written.
Constants
provider
Reads a Cline or Roo Code task's ui_messages.json.
const provider: AgentTranscriptReader
Core Interface
Implements @molecule/api-agent-transcript interface.
Bond Wiring
Setup function to register this provider with the core interface:
import { setProvider } from '@molecule/api-agent-transcript'
import { provider } from '@molecule/api-agent-transcript-cline'
export function setupAgentTranscriptCline(): void {
setProvider(provider)
}
Injection Notes
Requirements
Peer dependencies:
@molecule/api-agent-transcript^1.0.0
Runtime Dependencies
-
@molecule/api-agent-transcript -
Read
ui_messages.json, notapi_conversation_history.json. The second is the raw provider history, with injected environment details and tool results inside the user messages; it is not recognized here. -
harnessisClinewhen the file has Cline'staskmessage, otherwiseRoo Code(Roo records the task as its firsttextmessage). -
The UI messages name no model, so
modelis unset. -
Files:
newFileCreatedis the whole file;editedExistingFileand Roo'sappliedDiffcontribute each SEARCH/REPLACE block's replacement (Cline's------- SEARCH/+++++++ REPLACEand*** Begin Patchforms, and the<<<<<<< SEARCH/>>>>>>> REPLACEform Roo uses). An edit whose diff cannot be read is listed withcomplete: false. The approval (ask) and the result (say) of one edit count once. -
Streaming fragments (
partial: true) are skipped. -
Format verified 2026-09-29 against the Cline and Roo Code sources (
ExtensionMessage.ts,packages/types/src/message.ts).