@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-cline

npm · 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, not api_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.

  • harness is Cline when the file has Cline's task message, otherwise Roo Code (Roo records the task as its first text message).

  • The UI messages name no model, so model is unset.

  • Files: newFileCreated is the whole file; editedExistingFile and Roo's appliedDiff contribute each SEARCH/REPLACE block's replacement (Cline's ------- SEARCH / +++++++ REPLACE and *** Begin Patch forms, and the <<<<<<< SEARCH / >>>>>>> REPLACE form Roo uses). An edit whose diff cannot be read is listed with complete: 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).