项目文件夹

文件
wehub-resource-sync 98e40dac97
CLI Smoke Test / smoke-test-linux (20) (push) Has been cancelled
CLI Smoke Test / smoke-test-linux (24) (push) Has been cancelled
CLI Smoke Test / smoke-test-windows (20) (push) Has been cancelled
CLI Smoke Test / smoke-test-windows (24) (push) Has been cancelled
Expo App TypeScript typecheck / typecheck (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:40:49 +08:00

102 行
2.8 KiB
TypeScript

/**
* Checks if an error message indicates a cancellation/interruption
*
* Handles various cancellation error formats:
* - <tool_use_error>...</tool_use_error>
* - Error: [Request interrupted by user for tool use]
* - Request interrupted
* - User cancelled
* - Operation cancelled
*/
export function isCancelError(message: string): boolean {
// Check if the message is a string
if (typeof message !== 'string') {
return false;
}
// Check for tool_use_error tags
if (/<tool_use_error>.*<\/tool_use_error>/s.test(message)) {
return true;
}
// Check for common cancellation patterns
const cancelPatterns = [
/\[Request interrupted by user for tool use\]/i,
/Request interrupted/i,
/User cancelled/i,
/Operation cancelled/i,
/Cancelled by user/i,
/User aborted/i,
/Operation aborted/i,
/Interrupted by user/i,
/The user doesn't want to proceed with this tool use\. The tool use was rejected/i
];
return cancelPatterns.some(pattern => pattern.test(message));
}
/**
* Parses error messages that contain <tool_use_error> tags
*
* Example:
* Input: "<tool_use_error>File has not been read yet. Read it first before writing to it.</tool_use_error>"
* Output: { isToolUseError: true, errorMessage: "File has not been read yet. Read it first before writing to it." }
*/
export function parseToolUseError(message: string): {
isToolUseError: boolean;
errorMessage: string | null;
} {
// Check if the message is a string
if (typeof message !== 'string') {
return {
isToolUseError: false,
errorMessage: null
};
}
// Match <tool_use_error> tags with content inside
// The 's' flag allows . to match newlines
const regex = /<tool_use_error>(.*?)<\/tool_use_error>/s;
const match = message.match(regex);
if (match) {
return {
isToolUseError: true,
errorMessage: match[1] ? match[1].trim() : ''
};
}
return {
isToolUseError: false,
errorMessage: null
};
}
/**
* Extracts all tool use errors from a message that might contain multiple
*/
export function parseAllToolUseErrors(message: string): string[] {
if (typeof message !== 'string') {
return [];
}
// Global regex to find all occurrences
const regex = /<tool_use_error>(.*?)<\/tool_use_error>/gs;
const matches = message.matchAll(regex);
const errors: string[] = [];
for (const match of matches) {
if (match[1]) {
errors.push(match[1].trim());
}
}
return errors;
}
/**
* Checks if a message contains any tool use error
*/
export function hasToolUseError(message: string): boolean {
return parseToolUseError(message).isToolUseError;
}