diff --git a/.changeset/dull-hats-swim.md b/.changeset/dull-hats-swim.md new file mode 100644 index 00000000000..55bd00f33b6 --- /dev/null +++ b/.changeset/dull-hats-swim.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Add a JSONL version of task persistence diff --git a/src/core/task-persistence/taskMessages.jsonl.ts b/src/core/task-persistence/taskMessages.jsonl.ts new file mode 100644 index 00000000000..d4a0d3d1b02 --- /dev/null +++ b/src/core/task-persistence/taskMessages.jsonl.ts @@ -0,0 +1,56 @@ +import * as path from "path" +import * as fs from "fs/promises" +import * as readline from "readline" +import { createReadStream } from "fs" + +import { fileExistsAtPath } from "../../utils/fs" + +import { GlobalFileNames } from "../../shared/globalFileNames" +import { ClineMessage } from "../../shared/ExtensionMessage" +import { getTaskDirectoryPath } from "../../shared/storagePathManager" + +import type { ReadTaskMessagesOptions, SaveTaskMessagesOptions } from "./taskMessages" + +export async function readTaskMessages({ + taskId, + globalStoragePath, +}: ReadTaskMessagesOptions): Promise { + const taskDir = await getTaskDirectoryPath(globalStoragePath, taskId) + const filePath = path.join(taskDir, `${GlobalFileNames.apiConversationHistory}l`) + const fileExists = await fileExistsAtPath(filePath) + + if (!fileExists) { + return [] + } + + const messages: ClineMessage[] = [] + const fileStream = createReadStream(filePath, { encoding: "utf8" }) + const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity }) + + for await (const line of rl) { + if (line.trim()) { + messages.push(JSON.parse(line)) + } + } + + return messages +} + +export async function writeTaskMessages({ messages, taskId, globalStoragePath }: SaveTaskMessagesOptions) { + const taskDir = await getTaskDirectoryPath(globalStoragePath, taskId) + const filePath = path.join(taskDir, `${GlobalFileNames.apiConversationHistory}l`) + const content = messages.map((message) => JSON.stringify(message)).join("\n") + await fs.writeFile(filePath, content) +} + +export type AppendTaskMessageOptions = { + message: ClineMessage + taskId: string + globalStoragePath: string +} + +export async function appendTaskMessage({ message, taskId, globalStoragePath }: AppendTaskMessageOptions) { + const taskDir = await getTaskDirectoryPath(globalStoragePath, taskId) + const filePath = path.join(taskDir, `${GlobalFileNames.apiConversationHistory}l`) + await fs.appendFile(filePath, JSON.stringify(message) + "\n") +} diff --git a/src/core/task-persistence/taskMetadata.ts b/src/core/task-persistence/taskMetadata.ts index 659ba580cf0..9784e622958 100644 --- a/src/core/task-persistence/taskMetadata.ts +++ b/src/core/task-persistence/taskMetadata.ts @@ -9,7 +9,7 @@ import { findLastIndex } from "../../shared/array" import { HistoryItem } from "../../shared/HistoryItem" import { getTaskDirectoryPath } from "../../shared/storagePathManager" -const taskSizeCache = new NodeCache({ stdTTL: 5 * 60, checkperiod: 30 }) +const taskSizeCache = new NodeCache({ stdTTL: 30, checkperiod: 5 * 60 }) export type TaskMetadataOptions = { messages: ClineMessage[]