Refactor ClineMessage

This commit is contained in:
Saoud Rizwan
2024-10-06 00:19:44 -04:00
parent 7dd9abda46
commit d67523596b
7 changed files with 23 additions and 23 deletions

View File

@@ -25,7 +25,7 @@ import {
ClaudeApiReqCancelReason, ClaudeApiReqCancelReason,
ClaudeApiReqInfo, ClaudeApiReqInfo,
ClaudeAsk, ClaudeAsk,
ClaudeMessage, ClineMessage,
ClaudeSay, ClaudeSay,
ClaudeSayTool, ClaudeSayTool,
} from "../shared/ExtensionMessage" } from "../shared/ExtensionMessage"
@@ -60,7 +60,7 @@ export class Cline {
customInstructions?: string customInstructions?: string
alwaysAllowReadOnly: boolean alwaysAllowReadOnly: boolean
apiConversationHistory: Anthropic.MessageParam[] = [] apiConversationHistory: Anthropic.MessageParam[] = []
claudeMessages: ClaudeMessage[] = [] claudeMessages: ClineMessage[] = []
private askResponse?: ClaudeAskResponse private askResponse?: ClaudeAskResponse
private askResponseText?: string private askResponseText?: string
private askResponseImages?: string[] private askResponseImages?: string[]
@@ -150,7 +150,7 @@ export class Cline {
} }
} }
private async getSavedClaudeMessages(): Promise<ClaudeMessage[]> { private async getSavedClaudeMessages(): Promise<ClineMessage[]> {
const filePath = path.join(await this.ensureTaskDirectoryExists(), GlobalFileNames.claudeMessages) const filePath = path.join(await this.ensureTaskDirectoryExists(), GlobalFileNames.claudeMessages)
const fileExists = await fileExistsAtPath(filePath) const fileExists = await fileExistsAtPath(filePath)
if (fileExists) { if (fileExists) {
@@ -159,12 +159,12 @@ export class Cline {
return [] return []
} }
private async addToClaudeMessages(message: ClaudeMessage) { private async addToClaudeMessages(message: ClineMessage) {
this.claudeMessages.push(message) this.claudeMessages.push(message)
await this.saveClaudeMessages() await this.saveClaudeMessages()
} }
private async overwriteClaudeMessages(newMessages: ClaudeMessage[]) { private async overwriteClaudeMessages(newMessages: ClineMessage[]) {
this.claudeMessages = newMessages this.claudeMessages = newMessages
await this.saveClaudeMessages() await this.saveClaudeMessages()
} }

View File

@@ -22,7 +22,7 @@ export interface ExtensionMessage {
images?: string[] images?: string[]
ollamaModels?: string[] ollamaModels?: string[]
filePaths?: string[] filePaths?: string[]
partialMessage?: ClaudeMessage partialMessage?: ClineMessage
openRouterModels?: Record<string, ModelInfo> openRouterModels?: Record<string, ModelInfo>
} }
@@ -32,12 +32,12 @@ export interface ExtensionState {
customInstructions?: string customInstructions?: string
alwaysAllowReadOnly?: boolean alwaysAllowReadOnly?: boolean
uriScheme?: string uriScheme?: string
claudeMessages: ClaudeMessage[] claudeMessages: ClineMessage[]
taskHistory: HistoryItem[] taskHistory: HistoryItem[]
shouldShowAnnouncement: boolean shouldShowAnnouncement: boolean
} }
export interface ClaudeMessage { export interface ClineMessage {
ts: number ts: number
type: "ask" | "say" type: "ask" | "say"
ask?: ClaudeAsk ask?: ClaudeAsk

View File

@@ -1,4 +1,4 @@
import { ClaudeMessage } from "./ExtensionMessage" import { ClineMessage } from "./ExtensionMessage"
/** /**
* Combines API request start and finish messages in an array of ClaudeMessages. * Combines API request start and finish messages in an array of ClaudeMessages.
@@ -18,8 +18,8 @@ import { ClaudeMessage } from "./ExtensionMessage"
* const result = combineApiRequests(messages); * const result = combineApiRequests(messages);
* // Result: [{ type: "say", say: "api_req_started", text: '{"request":"GET /api/data","cost":0.005}', ts: 1000 }] * // Result: [{ type: "say", say: "api_req_started", text: '{"request":"GET /api/data","cost":0.005}', ts: 1000 }]
*/ */
export function combineApiRequests(messages: ClaudeMessage[]): ClaudeMessage[] { export function combineApiRequests(messages: ClineMessage[]): ClineMessage[] {
const combinedApiRequests: ClaudeMessage[] = [] const combinedApiRequests: ClineMessage[] = []
for (let i = 0; i < messages.length; i++) { for (let i = 0; i < messages.length; i++) {
if (messages[i].type === "say" && messages[i].say === "api_req_started") { if (messages[i].type === "say" && messages[i].say === "api_req_started") {

View File

@@ -1,4 +1,4 @@
import { ClaudeMessage } from "./ExtensionMessage" import { ClineMessage } from "./ExtensionMessage"
/** /**
* Combines sequences of command and command_output messages in an array of ClaudeMessages. * Combines sequences of command and command_output messages in an array of ClaudeMessages.
@@ -20,8 +20,8 @@ import { ClaudeMessage } from "./ExtensionMessage"
* const result = simpleCombineCommandSequences(messages); * const result = simpleCombineCommandSequences(messages);
* // Result: [{ type: 'ask', ask: 'command', text: 'ls\nfile1.txt\nfile2.txt', ts: 1625097600000 }] * // Result: [{ type: 'ask', ask: 'command', text: 'ls\nfile1.txt\nfile2.txt', ts: 1625097600000 }]
*/ */
export function combineCommandSequences(messages: ClaudeMessage[]): ClaudeMessage[] { export function combineCommandSequences(messages: ClineMessage[]): ClineMessage[] {
const combinedCommands: ClaudeMessage[] = [] const combinedCommands: ClineMessage[] = []
// First pass: combine commands with their outputs // First pass: combine commands with their outputs
for (let i = 0; i < messages.length; i++) { for (let i = 0; i < messages.length; i++) {

View File

@@ -1,4 +1,4 @@
import { ClaudeMessage } from "./ExtensionMessage" import { ClineMessage } from "./ExtensionMessage"
interface ApiMetrics { interface ApiMetrics {
totalTokensIn: number totalTokensIn: number
@@ -9,13 +9,13 @@ interface ApiMetrics {
} }
/** /**
* Calculates API metrics from an array of ClaudeMessages. * Calculates API metrics from an array of ClineMessages.
* *
* This function processes 'api_req_started' messages that have been combined with their * This function processes 'api_req_started' messages that have been combined with their
* corresponding 'api_req_finished' messages by the combineApiRequests function. * corresponding 'api_req_finished' messages by the combineApiRequests function.
* It extracts and sums up the tokensIn, tokensOut, cacheWrites, cacheReads, and cost from these messages. * It extracts and sums up the tokensIn, tokensOut, cacheWrites, cacheReads, and cost from these messages.
* *
* @param messages - An array of ClaudeMessage objects to process. * @param messages - An array of ClineMessage objects to process.
* @returns An ApiMetrics object containing totalTokensIn, totalTokensOut, totalCacheWrites, totalCacheReads, and totalCost. * @returns An ApiMetrics object containing totalTokensIn, totalTokensOut, totalCacheWrites, totalCacheReads, and totalCost.
* *
* @example * @example
@@ -25,7 +25,7 @@ interface ApiMetrics {
* const { totalTokensIn, totalTokensOut, totalCost } = getApiMetrics(messages); * const { totalTokensIn, totalTokensOut, totalCost } = getApiMetrics(messages);
* // Result: { totalTokensIn: 10, totalTokensOut: 20, totalCost: 0.005 } * // Result: { totalTokensIn: 10, totalTokensOut: 20, totalCost: 0.005 }
*/ */
export function getApiMetrics(messages: ClaudeMessage[]): ApiMetrics { export function getApiMetrics(messages: ClineMessage[]): ApiMetrics {
const result: ApiMetrics = { const result: ApiMetrics = {
totalTokensIn: 0, totalTokensIn: 0,
totalTokensOut: 0, totalTokensOut: 0,

View File

@@ -1,7 +1,7 @@
import { VSCodeBadge, VSCodeProgressRing } from "@vscode/webview-ui-toolkit/react" import { VSCodeBadge, VSCodeProgressRing } from "@vscode/webview-ui-toolkit/react"
import deepEqual from "fast-deep-equal" import deepEqual from "fast-deep-equal"
import React, { memo, useEffect, useMemo, useRef } from "react" import React, { memo, useEffect, useMemo, useRef } from "react"
import { ClaudeApiReqInfo, ClaudeMessage, ClaudeSayTool } from "../../../../src/shared/ExtensionMessage" import { ClaudeApiReqInfo, ClineMessage, ClaudeSayTool } from "../../../../src/shared/ExtensionMessage"
import { COMMAND_OUTPUT_STRING } from "../../../../src/shared/combineCommandSequences" import { COMMAND_OUTPUT_STRING } from "../../../../src/shared/combineCommandSequences"
import { vscode } from "../../utils/vscode" import { vscode } from "../../utils/vscode"
import CodeAccordian, { removeLeadingNonAlphanumeric } from "../common/CodeAccordian" import CodeAccordian, { removeLeadingNonAlphanumeric } from "../common/CodeAccordian"
@@ -12,10 +12,10 @@ import { highlightMentions } from "./TaskHeader"
import { useSize } from "react-use" import { useSize } from "react-use"
interface ChatRowProps { interface ChatRowProps {
message: ClaudeMessage message: ClineMessage
isExpanded: boolean isExpanded: boolean
onToggleExpand: () => void onToggleExpand: () => void
lastModifiedMessage?: ClaudeMessage lastModifiedMessage?: ClineMessage
isLast: boolean isLast: boolean
onHeightChange: (isTaller: boolean) => void onHeightChange: (isTaller: boolean) => void
} }

View File

@@ -1,7 +1,7 @@
import { VSCodeButton } from "@vscode/webview-ui-toolkit/react" import { VSCodeButton } from "@vscode/webview-ui-toolkit/react"
import React, { memo, useEffect, useMemo, useRef, useState } from "react" import React, { memo, useEffect, useMemo, useRef, useState } from "react"
import { useWindowSize } from "react-use" import { useWindowSize } from "react-use"
import { ClaudeMessage } from "../../../../src/shared/ExtensionMessage" import { ClineMessage } from "../../../../src/shared/ExtensionMessage"
import { useExtensionState } from "../../context/ExtensionStateContext" import { useExtensionState } from "../../context/ExtensionStateContext"
import { vscode } from "../../utils/vscode" import { vscode } from "../../utils/vscode"
import Thumbnails from "../common/Thumbnails" import Thumbnails from "../common/Thumbnails"
@@ -9,7 +9,7 @@ import { mentionRegexGlobal } from "../../../../src/shared/context-mentions"
import { formatLargeNumber } from "../../utils/format" import { formatLargeNumber } from "../../utils/format"
interface TaskHeaderProps { interface TaskHeaderProps {
task: ClaudeMessage task: ClineMessage
tokensIn: number tokensIn: number
tokensOut: number tokensOut: number
doesModelSupportPromptCache: boolean doesModelSupportPromptCache: boolean