-
Notifications
You must be signed in to change notification settings - Fork 3.2k
Expand file tree
/
Copy pathmessage.ts
More file actions
316 lines (278 loc) · 10.1 KB
/
message.ts
File metadata and controls
316 lines (278 loc) · 10.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
import { z } from "zod"
/**
* ClineAsk
*/
/**
* Array of possible ask types that the LLM can use to request user interaction or approval.
* These represent different scenarios where the assistant needs user input to proceed.
*
* @constant
* @readonly
*
* Ask type descriptions:
* - `followup`: LLM asks a clarifying question to gather more information needed to complete the task
* - `command`: Permission to execute a terminal/shell command
* - `command_output`: Permission to read the output from a previously executed command
* - `completion_result`: Task has been completed, awaiting user feedback or a new task
* - `tool`: Permission to use a tool for file operations (read, write, search, etc.)
* - `api_req_failed`: API request failed, asking user whether to retry
* - `resume_task`: Confirmation needed to resume a previously paused task
* - `resume_completed_task`: Confirmation needed to resume a task that was already marked as completed
* - `mistake_limit_reached`: Too many errors encountered, needs user guidance on how to proceed
* - `browser_action_launch`: Permission to open or interact with a browser
* - `use_mcp_server`: Permission to use Model Context Protocol (MCP) server functionality
* - `auto_approval_max_req_reached`: Auto-approval limit has been reached, manual approval required
*/
export const clineAsks = [
"followup",
"command",
"command_output",
"completion_result",
"tool",
"api_req_failed",
"resume_task",
"resume_completed_task",
"mistake_limit_reached",
"browser_action_launch",
"use_mcp_server",
"auto_approval_max_req_reached",
] as const
export const clineAskSchema = z.enum(clineAsks)
export type ClineAsk = z.infer<typeof clineAskSchema>
/**
* IdleAsk
*
* Asks that put the task into an "idle" state.
*/
export const idleAsks = [
"completion_result",
"api_req_failed",
"resume_completed_task",
"mistake_limit_reached",
"auto_approval_max_req_reached",
] as const satisfies readonly ClineAsk[]
export type IdleAsk = (typeof idleAsks)[number]
export function isIdleAsk(ask: ClineAsk): ask is IdleAsk {
return (idleAsks as readonly ClineAsk[]).includes(ask)
}
/**
* ResumableAsk
*
* Asks that put the task into an "resumable" state.
*/
export const resumableAsks = ["resume_task"] as const satisfies readonly ClineAsk[]
export type ResumableAsk = (typeof resumableAsks)[number]
export function isResumableAsk(ask: ClineAsk): ask is ResumableAsk {
return (resumableAsks as readonly ClineAsk[]).includes(ask)
}
/**
* InteractiveAsk
*
* Asks that put the task into an "user interaction required" state.
*/
export const interactiveAsks = [
"followup",
"command",
"tool",
"browser_action_launch",
"use_mcp_server",
] as const satisfies readonly ClineAsk[]
export type InteractiveAsk = (typeof interactiveAsks)[number]
export function isInteractiveAsk(ask: ClineAsk): ask is InteractiveAsk {
return (interactiveAsks as readonly ClineAsk[]).includes(ask)
}
/**
* NonBlockingAsk
*
* Asks that are not associated with an actual approval, and are only used
* to update chat messages.
*/
export const nonBlockingAsks = ["command_output"] as const satisfies readonly ClineAsk[]
export type NonBlockingAsk = (typeof nonBlockingAsks)[number]
export function isNonBlockingAsk(ask: ClineAsk): ask is NonBlockingAsk {
return (nonBlockingAsks as readonly ClineAsk[]).includes(ask)
}
/**
* ClineSay
*/
/**
* Array of possible say types that represent different kinds of messages the assistant can send.
* These are used to categorize and handle various types of communication from the LLM to the user.
*
* @constant
* @readonly
*
* Say type descriptions:
* - `error`: General error message
* - `api_req_started`: Indicates an API request has been initiated
* - `api_req_finished`: Indicates an API request has completed successfully
* - `api_req_retried`: Indicates an API request is being retried after a failure
* - `api_req_retry_delayed`: Indicates an API request retry has been delayed
* - `api_req_rate_limit_wait`: Indicates a configured rate-limit wait (not an error)
* - `api_req_deleted`: Indicates an API request has been deleted/cancelled
* - `text`: General text message or assistant response
* - `reasoning`: Assistant's reasoning or thought process (often hidden from user)
* - `completion_result`: Final result of task completion
* - `user_feedback`: Message containing user feedback
* - `user_feedback_diff`: Diff-formatted feedback from user showing requested changes
* - `command_output`: Output from an executed command
* - `shell_integration_warning`: Warning about shell integration issues or limitations
* - `browser_action`: Action performed in the browser
* - `browser_action_result`: Result of a browser action
* - `mcp_server_request_started`: MCP server request has been initiated
* - `mcp_server_response`: Response received from MCP server
* - `subtask_result`: Result of a completed subtask
* - `checkpoint_saved`: Indicates a checkpoint has been saved
* - `rooignore_error`: Error related to .rooignore file processing
* - `diff_error`: Error occurred while applying a diff/patch
* - `condense_context`: Context condensation/summarization has started
* - `condense_context_error`: Error occurred during context condensation
* - `codebase_search_result`: Results from searching the codebase
* - `too_many_tools_warning`: Warning that too many MCP tools are enabled, which may confuse the LLM
*/
export const clineSays = [
"error",
"api_req_started",
"api_req_finished",
"api_req_retried",
"api_req_retry_delayed",
"api_req_rate_limit_wait",
"api_req_deleted",
"text",
"image",
"reasoning",
"completion_result",
"user_feedback",
"user_feedback_diff",
"command_output",
"shell_integration_warning",
"browser_action",
"browser_action_result",
"browser_session_status",
"mcp_server_request_started",
"mcp_server_response",
"subtask_result",
"checkpoint_saved",
"rooignore_error",
"diff_error",
"condense_context",
"condense_context_error",
"sliding_window_truncation",
"codebase_search_result",
"user_edit_todos",
"too_many_tools_warning",
] as const
export const clineSaySchema = z.enum(clineSays)
export type ClineSay = z.infer<typeof clineSaySchema>
/**
* ToolProgressStatus
*/
export const toolProgressStatusSchema = z.object({
icon: z.string().optional(),
text: z.string().optional(),
})
export type ToolProgressStatus = z.infer<typeof toolProgressStatusSchema>
/**
* ContextCondense
*
* Data associated with a successful context condensation event.
* This is attached to messages with `say: "condense_context"` when
* the condensation operation completes successfully.
*
* @property cost - The API cost incurred for the condensation operation
* @property prevContextTokens - Token count before condensation
* @property newContextTokens - Token count after condensation
* @property summary - The condensed summary that replaced the original context
* @property condenseId - Optional unique identifier for this condensation operation
*/
export const contextCondenseSchema = z.object({
cost: z.number(),
prevContextTokens: z.number(),
newContextTokens: z.number(),
summary: z.string(),
condenseId: z.string().optional(),
})
export type ContextCondense = z.infer<typeof contextCondenseSchema>
/**
* ContextTruncation
*
* Data associated with a sliding window truncation event.
* This is attached to messages with `say: "sliding_window_truncation"` when
* messages are removed from the conversation history to stay within token limits.
*
* Unlike condensation, truncation simply removes older messages without
* summarizing them. This is a faster but less context-preserving approach.
*
* @property truncationId - Unique identifier for this truncation operation
* @property messagesRemoved - Number of conversation messages that were removed
* @property prevContextTokens - Token count before truncation occurred
* @property newContextTokens - Token count after truncation occurred
*/
export const contextTruncationSchema = z.object({
truncationId: z.string(),
messagesRemoved: z.number(),
prevContextTokens: z.number(),
newContextTokens: z.number(),
})
export type ContextTruncation = z.infer<typeof contextTruncationSchema>
/**
* ClineMessage
*
* The main message type used for communication between the extension and webview.
* Messages can either be "ask" (requiring user response) or "say" (informational).
*
* Context Management Fields:
* - `contextCondense`: Present when `say: "condense_context"` and condensation succeeded
* - `contextTruncation`: Present when `say: "sliding_window_truncation"` and truncation occurred
*
* Note: These fields are mutually exclusive - a message will have at most one of them.
*/
export const clineMessageSchema = z.object({
ts: z.number(),
type: z.union([z.literal("ask"), z.literal("say")]),
ask: clineAskSchema.optional(),
say: clineSaySchema.optional(),
text: z.string().optional(),
images: z.array(z.string()).optional(),
partial: z.boolean().optional(),
reasoning: z.string().optional(),
conversationHistoryIndex: z.number().optional(),
checkpoint: z.record(z.string(), z.unknown()).optional(),
progressStatus: toolProgressStatusSchema.optional(),
/**
* Data for successful context condensation.
* Present when `say: "condense_context"` and `partial: false`.
*/
contextCondense: contextCondenseSchema.optional(),
/**
* Data for sliding window truncation.
* Present when `say: "sliding_window_truncation"`.
*/
contextTruncation: contextTruncationSchema.optional(),
isProtected: z.boolean().optional(),
apiProtocol: z.union([z.literal("openai"), z.literal("anthropic")]).optional(),
isAnswered: z.boolean().optional(),
})
export type ClineMessage = z.infer<typeof clineMessageSchema>
/**
* TokenUsage
*/
export const tokenUsageSchema = z.object({
totalTokensIn: z.number(),
totalTokensOut: z.number(),
totalCacheWrites: z.number().optional(),
totalCacheReads: z.number().optional(),
totalCost: z.number(),
contextTokens: z.number(),
})
export type TokenUsage = z.infer<typeof tokenUsageSchema>
/**
* QueuedMessage
*/
export const queuedMessageSchema = z.object({
timestamp: z.number(),
id: z.string(),
text: z.string(),
images: z.array(z.string()).optional(),
})
export type QueuedMessage = z.infer<typeof queuedMessageSchema>