From 1d7da38a66cb66093028aa7fbac8f1d9b3b4ffce Mon Sep 17 00:00:00 2001 From: Patrick Erichsen Date: Tue, 14 Oct 2025 14:40:09 -0700 Subject: [PATCH 1/7] fix: log correct tool call error from gui --- core/protocol/core.ts | 2 +- core/tools/callTool.ts | 11 ++++++++++- core/tools/implementations/readFile.ts | 1 + gui/src/redux/thunks/callToolById.ts | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/core/protocol/core.ts b/core/protocol/core.ts index 28e617f798f..7bf103f85eb 100644 --- a/core/protocol/core.ts +++ b/core/protocol/core.ts @@ -307,7 +307,7 @@ export type ToCoreFromIdeOrWebviewProtocol = { "auth/getAuthUrl": [{ useOnboarding: boolean }, { url: string }]; "tools/call": [ { toolCall: ToolCall }, - { contextItems: ContextItem[]; errorMessage?: string }, + { contextItems: ContextItem[]; errorMessage?: string; errorReason?: string }, ]; "tools/evaluatePolicy": [ { toolName: string; basePolicy: ToolPolicy; args: Record }, diff --git a/core/tools/callTool.ts b/core/tools/callTool.ts index faec8a94b8c..0d19d62a836 100644 --- a/core/tools/callTool.ts +++ b/core/tools/callTool.ts @@ -1,6 +1,7 @@ import { CallToolResultSchema } from "@modelcontextprotocol/sdk/types.js"; import { ContextItem, Tool, ToolCall, ToolExtras } from ".."; import { MCPManagerSingleton } from "../context/mcp/MCPManagerSingleton"; +import { ContinueError } from "../util/errors"; import { canParseUrl } from "../util/url"; import { BuiltInToolNames } from "./builtIn"; @@ -197,6 +198,7 @@ export async function callTool( ): Promise<{ contextItems: ContextItem[]; errorMessage: string | undefined; + errorReason?: string; }> { try { const args = safeParseToolCallArgs(toolCall); @@ -214,12 +216,19 @@ export async function callTool( }; } catch (e) { let errorMessage = `${e}`; - if (e instanceof Error) { + let errorReason: string | undefined; + + if (e instanceof ContinueError) { + errorMessage = e.message; + errorReason = e.reason; + } else if (e instanceof Error) { errorMessage = e.message; } + return { contextItems: [], errorMessage, + errorReason, }; } } diff --git a/core/tools/implementations/readFile.ts b/core/tools/implementations/readFile.ts index afa6495ad08..2ab5af19e83 100644 --- a/core/tools/implementations/readFile.ts +++ b/core/tools/implementations/readFile.ts @@ -5,6 +5,7 @@ import { ToolImpl } from "."; import { throwIfFileIsSecurityConcern } from "../../indexing/ignore"; import { getStringArg } from "../parseArgs"; import { throwIfFileExceedsHalfOfContext } from "./readFileLimit"; +import { ContinueError, ContinueErrorReason } from "../../util/errors"; export const readFileImpl: ToolImpl = async (args, extras) => { const filepath = getStringArg(args, "filepath"); diff --git a/gui/src/redux/thunks/callToolById.ts b/gui/src/redux/thunks/callToolById.ts index 9c9689b87aa..894952dce65 100644 --- a/gui/src/redux/thunks/callToolById.ts +++ b/gui/src/redux/thunks/callToolById.ts @@ -94,7 +94,7 @@ export const callToolById = createAsyncThunk< output = result.content.contextItems; error = result.content.errorMessage ? new ContinueError( - ContinueErrorReason.Unspecified, + (result.content.errorReason as ContinueErrorReason) || ContinueErrorReason.Unspecified, result.content.errorMessage, ) : undefined; From 77a8db7f635404fde73a982c5bd2142fbc6c8e98 Mon Sep 17 00:00:00 2001 From: Patrick Erichsen Date: Tue, 14 Oct 2025 14:55:00 -0700 Subject: [PATCH 2/7] use specific `ConitnueError` for tool calls --- core/tools/implementations/createNewFile.ts | 9 +++++++-- core/tools/implementations/grepSearch.ts | 6 +++++- core/tools/implementations/lsTool.ts | 4 +++- core/tools/implementations/readFile.ts | 3 ++- core/tools/implementations/readFileLimit.ts | 4 +++- core/tools/implementations/readFileRange.ts | 13 +++++++++---- core/tools/implementations/requestRule.ts | 6 +++++- core/tools/implementations/runTerminalCommand.ts | 4 +++- core/tools/implementations/viewSubdirectory.ts | 6 +++++- core/util/errors.ts | 14 ++++++++++++++ 10 files changed, 56 insertions(+), 13 deletions(-) diff --git a/core/tools/implementations/createNewFile.ts b/core/tools/implementations/createNewFile.ts index 0677e7dcd0f..dca307d99d6 100644 --- a/core/tools/implementations/createNewFile.ts +++ b/core/tools/implementations/createNewFile.ts @@ -3,6 +3,7 @@ import { inferResolvedUriFromRelativePath } from "../../util/ideUtils"; import { ToolImpl } from "."; import { getCleanUriPath, getUriPathBasename } from "../../util/uri"; import { getStringArg } from "../parseArgs"; +import { ContinueError, ContinueErrorReason } from "../../util/errors"; export const createNewFileImpl: ToolImpl = async (args, extras) => { const filepath = getStringArg(args, "filepath"); @@ -15,7 +16,8 @@ export const createNewFileImpl: ToolImpl = async (args, extras) => { if (resolvedFileUri) { const exists = await extras.ide.fileExists(resolvedFileUri); if (exists) { - throw new Error( + throw new ContinueError( + ContinueErrorReason.FileAlreadyExists, `File ${filepath} already exists. Use the edit tool to edit this file`, ); } @@ -37,6 +39,9 @@ export const createNewFileImpl: ToolImpl = async (args, extras) => { }, ]; } else { - throw new Error("Failed to resolve path"); + throw new ContinueError( + ContinueErrorReason.PathResolutionFailed, + "Failed to resolve path", + ); } }; diff --git a/core/tools/implementations/grepSearch.ts b/core/tools/implementations/grepSearch.ts index 727b5c560bf..a94836f8c4e 100644 --- a/core/tools/implementations/grepSearch.ts +++ b/core/tools/implementations/grepSearch.ts @@ -3,6 +3,7 @@ import { ContextItem } from "../.."; import { formatGrepSearchResults } from "../../util/grepSearch"; import { prepareQueryForRipgrep } from "../../util/regexValidator"; import { getStringArg } from "../parseArgs"; +import { ContinueError, ContinueErrorReason } from "../../util/errors"; const DEFAULT_GREP_SEARCH_RESULTS_LIMIT = 100; const DEFAULT_GREP_SEARCH_CHAR_LIMIT = 7500; // ~1500 tokens, will keep truncation simply for now @@ -63,7 +64,10 @@ export const grepSearchImpl: ToolImpl = async (args, extras) => { ]; } - throw error; + throw new ContinueError( + ContinueErrorReason.SearchExecutionFailed, + errorMessage + ); } const { formatted, numResults, truncated } = formatGrepSearchResults( diff --git a/core/tools/implementations/lsTool.ts b/core/tools/implementations/lsTool.ts index 67122f082be..67e0bb1718d 100644 --- a/core/tools/implementations/lsTool.ts +++ b/core/tools/implementations/lsTool.ts @@ -3,6 +3,7 @@ import ignore from "ignore"; import { ToolImpl } from "."; import { walkDir } from "../../indexing/walkDir"; import { resolveRelativePathInDir } from "../../util/ideUtils"; +import { ContinueError, ContinueErrorReason } from "../../util/errors"; export function resolveLsToolDirPath(dirPath: string | undefined) { if (!dirPath || dirPath === ".") { @@ -20,7 +21,8 @@ export const lsToolImpl: ToolImpl = async (args, extras) => { const dirPath = resolveLsToolDirPath(args?.dirPath); const uri = await resolveRelativePathInDir(dirPath, extras.ide); if (!uri) { - throw new Error( + throw new ContinueError( + ContinueErrorReason.DirectoryNotFound, `Directory ${args.dirPath} not found. Make sure to use forward-slash paths`, ); } diff --git a/core/tools/implementations/readFile.ts b/core/tools/implementations/readFile.ts index 2ab5af19e83..8daee746212 100644 --- a/core/tools/implementations/readFile.ts +++ b/core/tools/implementations/readFile.ts @@ -13,7 +13,8 @@ export const readFileImpl: ToolImpl = async (args, extras) => { const firstUriMatch = await resolveRelativePathInDir(filepath, extras.ide); if (!firstUriMatch) { - throw new Error( + throw new ContinueError( + ContinueErrorReason.FileNotFound, `File "${filepath}" does not exist. You might want to check the path and try again.`, ); } diff --git a/core/tools/implementations/readFileLimit.ts b/core/tools/implementations/readFileLimit.ts index e2af14d5665..48f4b9f860b 100644 --- a/core/tools/implementations/readFileLimit.ts +++ b/core/tools/implementations/readFileLimit.ts @@ -1,5 +1,6 @@ import { ILLM } from "../.."; import { countTokensAsync } from "../../llm/countTokens"; +import { ContinueError, ContinueErrorReason } from "../../util/errors"; export async function throwIfFileExceedsHalfOfContext( filepath: string, @@ -10,7 +11,8 @@ export async function throwIfFileExceedsHalfOfContext( const tokens = await countTokensAsync(content, model.title); const tokenLimit = model.contextLength / 2; if (tokens > tokenLimit) { - throw new Error( + throw new ContinueError( + ContinueErrorReason.FileTooLarge, `File ${filepath} is too large (${tokens} tokens vs ${tokenLimit} token limit). Try another approach`, ); } diff --git a/core/tools/implementations/readFileRange.ts b/core/tools/implementations/readFileRange.ts index c313f4bff14..0ff97d18991 100644 --- a/core/tools/implementations/readFileRange.ts +++ b/core/tools/implementations/readFileRange.ts @@ -4,6 +4,7 @@ import { getUriPathBasename } from "../../util/uri"; import { ToolImpl } from "."; import { getNumberArg, getStringArg } from "../parseArgs"; import { throwIfFileExceedsHalfOfContext } from "./readFileLimit"; +import { ContinueError, ContinueErrorReason } from "../../util/errors"; export const readFileRangeImpl: ToolImpl = async (args, extras) => { const filepath = getStringArg(args, "filepath"); @@ -12,24 +13,28 @@ export const readFileRangeImpl: ToolImpl = async (args, extras) => { // Validate that line numbers are positive integers if (startLine < 1) { - throw new Error( + throw new ContinueError( + ContinueErrorReason.InvalidLineNumber, "startLine must be 1 or greater. Negative line numbers are not supported - use the terminal tool with 'tail' command for reading from file end.", ); } if (endLine < 1) { - throw new Error( + throw new ContinueError( + ContinueErrorReason.InvalidLineNumber, "endLine must be 1 or greater. Negative line numbers are not supported - use the terminal tool with 'tail' command for reading from file end.", ); } if (endLine < startLine) { - throw new Error( + throw new ContinueError( + ContinueErrorReason.InvalidLineNumber, `endLine (${endLine}) must be greater than or equal to startLine (${startLine})`, ); } const firstUriMatch = await resolveRelativePathInDir(filepath, extras.ide); if (!firstUriMatch) { - throw new Error( + throw new ContinueError( + ContinueErrorReason.FileNotFound, `File "${filepath}" does not exist. You might want to check the path and try again.`, ); } diff --git a/core/tools/implementations/requestRule.ts b/core/tools/implementations/requestRule.ts index c5c312e7087..7113cf7a5f8 100644 --- a/core/tools/implementations/requestRule.ts +++ b/core/tools/implementations/requestRule.ts @@ -1,5 +1,6 @@ import { ToolImpl } from "."; import { getStringArg } from "../parseArgs"; +import { ContinueError, ContinueErrorReason } from "../../util/errors"; export const requestRuleImpl: ToolImpl = async (args, extras) => { const name = getStringArg(args, "name"); @@ -8,7 +9,10 @@ export const requestRuleImpl: ToolImpl = async (args, extras) => { const rule = extras.config.rules.find((r) => r.name === name); if (!rule || !rule.sourceFile) { - throw new Error(`Rule with name "${name}" not found or has no file path`); + throw new ContinueError( + ContinueErrorReason.RuleNotFound, + `Rule with name "${name}" not found or has no file path` + ); } return [ diff --git a/core/tools/implementations/runTerminalCommand.ts b/core/tools/implementations/runTerminalCommand.ts index cccf3353b18..15b1dc1bffb 100644 --- a/core/tools/implementations/runTerminalCommand.ts +++ b/core/tools/implementations/runTerminalCommand.ts @@ -2,6 +2,7 @@ import iconv from "iconv-lite"; import childProcess from "node:child_process"; import os from "node:os"; import util from "node:util"; +import { ContinueError, ContinueErrorReason } from "../../util/errors"; // Automatically decode the buffer according to the platform to avoid garbled Chinese function getDecodedOutput(data: Buffer): string { if (process.platform === "win32") { @@ -337,7 +338,8 @@ export const runTerminalCommandImpl: ToolImpl = async (args, extras) => { if (code === 0) { resolve({ stdout, stderr }); } else { - const error = new Error( + const error = new ContinueError( + ContinueErrorReason.CommandExecutionFailed, `Command failed with exit code ${code}`, ); (error as any).stderr = stderr; diff --git a/core/tools/implementations/viewSubdirectory.ts b/core/tools/implementations/viewSubdirectory.ts index b7897aae8a4..b8bb52bf0e1 100644 --- a/core/tools/implementations/viewSubdirectory.ts +++ b/core/tools/implementations/viewSubdirectory.ts @@ -3,6 +3,7 @@ import { resolveRelativePathInDir } from "../../util/ideUtils"; import { ToolImpl } from "."; import { getStringArg } from "../parseArgs"; +import { ContinueError, ContinueErrorReason } from "../../util/errors"; export const viewSubdirectoryImpl: ToolImpl = async (args: any, extras) => { const directory_path = getStringArg(args, "directory_path"); @@ -10,7 +11,10 @@ export const viewSubdirectoryImpl: ToolImpl = async (args: any, extras) => { const uri = await resolveRelativePathInDir(directory_path, extras.ide); if (!uri) { - throw new Error(`Directory path "${directory_path}" does not exist.`); + throw new ContinueError( + ContinueErrorReason.DirectoryNotFound, + `Directory path "${directory_path}" does not exist.` + ); } const repoMap = await generateRepoMap(extras.llm, extras.ide, { diff --git a/core/util/errors.ts b/core/util/errors.ts index 4c6cfb16d32..69df7c81423 100644 --- a/core/util/errors.ts +++ b/core/util/errors.ts @@ -47,6 +47,20 @@ export enum ContinueErrorReason { FileWriteError = "file_write_error", FileIsSecurityConcern = "file_is_security_concern", ParentDirectoryNotFound = "parent_directory_not_found", + FileTooLarge = "file_too_large", + PathResolutionFailed = "path_resolution_failed", + InvalidLineNumber = "invalid_line_number", + DirectoryNotFound = "directory_not_found", + + // Terminal/Command execution + CommandExecutionFailed = "command_execution_failed", + CommandNotAvailableInRemote = "command_not_available_in_remote", + + // Search + SearchExecutionFailed = "search_execution_failed", + + // Rules + RuleNotFound = "rule_not_found", // Other Unspecified = "unspecified", // I.e. a known error but no specific code for it From 88ef07eb23234a53a304d97dcc8a47830e49cd13 Mon Sep 17 00:00:00 2001 From: Patrick Erichsen Date: Tue, 14 Oct 2025 15:25:46 -0700 Subject: [PATCH 3/7] dallin's feedback --- core/protocol/core.ts | 2 +- core/tools/callTool.ts | 4 ++-- extensions/cli/src/telemetry/telemetryService.ts | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/core/protocol/core.ts b/core/protocol/core.ts index 7bf103f85eb..6b733788a9e 100644 --- a/core/protocol/core.ts +++ b/core/protocol/core.ts @@ -307,7 +307,7 @@ export type ToCoreFromIdeOrWebviewProtocol = { "auth/getAuthUrl": [{ useOnboarding: boolean }, { url: string }]; "tools/call": [ { toolCall: ToolCall }, - { contextItems: ContextItem[]; errorMessage?: string; errorReason?: string }, + { contextItems: ContextItem[]; errorMessage?: string; errorReason?: ContinueErrorReason }, ]; "tools/evaluatePolicy": [ { toolName: string; basePolicy: ToolPolicy; args: Record }, diff --git a/core/tools/callTool.ts b/core/tools/callTool.ts index 0d19d62a836..999b7235428 100644 --- a/core/tools/callTool.ts +++ b/core/tools/callTool.ts @@ -1,7 +1,7 @@ import { CallToolResultSchema } from "@modelcontextprotocol/sdk/types.js"; import { ContextItem, Tool, ToolCall, ToolExtras } from ".."; import { MCPManagerSingleton } from "../context/mcp/MCPManagerSingleton"; -import { ContinueError } from "../util/errors"; +import { ContinueError, ContinueErrorReason } from "../util/errors"; import { canParseUrl } from "../util/url"; import { BuiltInToolNames } from "./builtIn"; @@ -198,7 +198,7 @@ export async function callTool( ): Promise<{ contextItems: ContextItem[]; errorMessage: string | undefined; - errorReason?: string; + errorReason?: ContinueErrorReason; }> { try { const args = safeParseToolCallArgs(toolCall); diff --git a/extensions/cli/src/telemetry/telemetryService.ts b/extensions/cli/src/telemetry/telemetryService.ts index f8121129850..39152c499e8 100644 --- a/extensions/cli/src/telemetry/telemetryService.ts +++ b/extensions/cli/src/telemetry/telemetryService.ts @@ -17,6 +17,7 @@ import { } from "@opentelemetry/semantic-conventions"; import { v4 as uuidv4 } from "uuid"; +import { ContinueErrorReason } from "../../../core/util/errors.js"; import { isHeadlessMode } from "../util/cli.js"; import { isContinueRemoteAgent, isGitHubActions } from "../util/git.js"; import { logger } from "../util/logger.js"; @@ -498,7 +499,7 @@ class TelemetryService { success: boolean; durationMs: number; error?: string; - errorReason?: string; + errorReason?: ContinueErrorReason; decision?: "accept" | "reject"; source?: string; toolParameters?: string; From 33bec4922ffb42bf04f74bc58d05531ab28bd4f0 Mon Sep 17 00:00:00 2001 From: Patrick Erichsen Date: Tue, 14 Oct 2025 15:31:12 -0700 Subject: [PATCH 4/7] Update callTool.ts --- core/tools/callTool.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/tools/callTool.ts b/core/tools/callTool.ts index 999b7235428..8d695e1e192 100644 --- a/core/tools/callTool.ts +++ b/core/tools/callTool.ts @@ -216,7 +216,7 @@ export async function callTool( }; } catch (e) { let errorMessage = `${e}`; - let errorReason: string | undefined; + let errorReason: ContinueErrorReason | undefined; if (e instanceof ContinueError) { errorMessage = e.message; From 640eb030685a2f9a806a2c31459c855be82d657e Mon Sep 17 00:00:00 2001 From: Patrick Erichsen Date: Tue, 14 Oct 2025 15:45:25 -0700 Subject: [PATCH 5/7] Update callToolById.ts --- gui/src/redux/thunks/callToolById.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/src/redux/thunks/callToolById.ts b/gui/src/redux/thunks/callToolById.ts index 894952dce65..d0da3465fca 100644 --- a/gui/src/redux/thunks/callToolById.ts +++ b/gui/src/redux/thunks/callToolById.ts @@ -94,7 +94,7 @@ export const callToolById = createAsyncThunk< output = result.content.contextItems; error = result.content.errorMessage ? new ContinueError( - (result.content.errorReason as ContinueErrorReason) || ContinueErrorReason.Unspecified, + result.content.errorReason || ContinueErrorReason.Unspecified, result.content.errorMessage, ) : undefined; From 9b908d8ecdf6b7c5ed496fe11553e300db8ae9ff Mon Sep 17 00:00:00 2001 From: Patrick Erichsen Date: Tue, 14 Oct 2025 15:48:35 -0700 Subject: [PATCH 6/7] prettier --- core/protocol/core.ts | 6 +++++- core/tools/implementations/grepSearch.ts | 4 ++-- core/tools/implementations/requestRule.ts | 4 ++-- core/tools/implementations/viewSubdirectory.ts | 4 ++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/core/protocol/core.ts b/core/protocol/core.ts index 6b733788a9e..f23666165bf 100644 --- a/core/protocol/core.ts +++ b/core/protocol/core.ts @@ -307,7 +307,11 @@ export type ToCoreFromIdeOrWebviewProtocol = { "auth/getAuthUrl": [{ useOnboarding: boolean }, { url: string }]; "tools/call": [ { toolCall: ToolCall }, - { contextItems: ContextItem[]; errorMessage?: string; errorReason?: ContinueErrorReason }, + { + contextItems: ContextItem[]; + errorMessage?: string; + errorReason?: ContinueErrorReason; + }, ]; "tools/evaluatePolicy": [ { toolName: string; basePolicy: ToolPolicy; args: Record }, diff --git a/core/tools/implementations/grepSearch.ts b/core/tools/implementations/grepSearch.ts index a94836f8c4e..69ccf6aacc3 100644 --- a/core/tools/implementations/grepSearch.ts +++ b/core/tools/implementations/grepSearch.ts @@ -1,9 +1,9 @@ import { ToolImpl } from "."; import { ContextItem } from "../.."; +import { ContinueError, ContinueErrorReason } from "../../util/errors"; import { formatGrepSearchResults } from "../../util/grepSearch"; import { prepareQueryForRipgrep } from "../../util/regexValidator"; import { getStringArg } from "../parseArgs"; -import { ContinueError, ContinueErrorReason } from "../../util/errors"; const DEFAULT_GREP_SEARCH_RESULTS_LIMIT = 100; const DEFAULT_GREP_SEARCH_CHAR_LIMIT = 7500; // ~1500 tokens, will keep truncation simply for now @@ -66,7 +66,7 @@ export const grepSearchImpl: ToolImpl = async (args, extras) => { throw new ContinueError( ContinueErrorReason.SearchExecutionFailed, - errorMessage + errorMessage, ); } diff --git a/core/tools/implementations/requestRule.ts b/core/tools/implementations/requestRule.ts index 7113cf7a5f8..21ee86af852 100644 --- a/core/tools/implementations/requestRule.ts +++ b/core/tools/implementations/requestRule.ts @@ -1,6 +1,6 @@ import { ToolImpl } from "."; -import { getStringArg } from "../parseArgs"; import { ContinueError, ContinueErrorReason } from "../../util/errors"; +import { getStringArg } from "../parseArgs"; export const requestRuleImpl: ToolImpl = async (args, extras) => { const name = getStringArg(args, "name"); @@ -11,7 +11,7 @@ export const requestRuleImpl: ToolImpl = async (args, extras) => { if (!rule || !rule.sourceFile) { throw new ContinueError( ContinueErrorReason.RuleNotFound, - `Rule with name "${name}" not found or has no file path` + `Rule with name "${name}" not found or has no file path`, ); } diff --git a/core/tools/implementations/viewSubdirectory.ts b/core/tools/implementations/viewSubdirectory.ts index b8bb52bf0e1..de546833852 100644 --- a/core/tools/implementations/viewSubdirectory.ts +++ b/core/tools/implementations/viewSubdirectory.ts @@ -2,8 +2,8 @@ import generateRepoMap from "../../util/generateRepoMap"; import { resolveRelativePathInDir } from "../../util/ideUtils"; import { ToolImpl } from "."; -import { getStringArg } from "../parseArgs"; import { ContinueError, ContinueErrorReason } from "../../util/errors"; +import { getStringArg } from "../parseArgs"; export const viewSubdirectoryImpl: ToolImpl = async (args: any, extras) => { const directory_path = getStringArg(args, "directory_path"); @@ -13,7 +13,7 @@ export const viewSubdirectoryImpl: ToolImpl = async (args: any, extras) => { if (!uri) { throw new ContinueError( ContinueErrorReason.DirectoryNotFound, - `Directory path "${directory_path}" does not exist.` + `Directory path "${directory_path}" does not exist.`, ); } From 2d861bf3975dd6019ed26ae8ed72430e7b4296ce Mon Sep 17 00:00:00 2001 From: Patrick Erichsen Date: Tue, 14 Oct 2025 16:30:34 -0700 Subject: [PATCH 7/7] Update telemetryService.ts --- extensions/cli/src/telemetry/telemetryService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/cli/src/telemetry/telemetryService.ts b/extensions/cli/src/telemetry/telemetryService.ts index 39152c499e8..910c82f59ed 100644 --- a/extensions/cli/src/telemetry/telemetryService.ts +++ b/extensions/cli/src/telemetry/telemetryService.ts @@ -17,7 +17,7 @@ import { } from "@opentelemetry/semantic-conventions"; import { v4 as uuidv4 } from "uuid"; -import { ContinueErrorReason } from "../../../core/util/errors.js"; +import { ContinueErrorReason } from "../../../../core/util/errors.js"; import { isHeadlessMode } from "../util/cli.js"; import { isContinueRemoteAgent, isGitHubActions } from "../util/git.js"; import { logger } from "../util/logger.js";