Files
makelore/electron/api/routes/coding-route-errors.ts

92 lines
4.3 KiB
TypeScript

import type { ServerResponse } from 'node:http';
import { CodingProjectServiceError } from '../../coding-projects/project-service';
import { CodingConversationServiceError } from '../../coding-runtime/conversation-service';
import { sendJson } from '../route-utils';
const FIXED_CODING_ERROR_MESSAGES: Readonly<Record<string, string>> = {
CODING_ACTIVE_PROJECT_REQUIRED: '请先选择一个编程项目。',
CODING_ACTIVE_PROJECT_INVALID: '当前编程项目不可用,请重新打开。',
CODING_ACTIVE_PROJECT_PATH_MISMATCH: '当前编程项目路径已变化,请重新打开。',
CODING_AGENT_NOT_FOUND: '当前伙伴不可用,请重新选择。',
CODING_AGENT_ID_IMMUTABLE: '已有伙伴标识不能修改。',
CODING_CONVERSATION_NOT_FOUND: '指定的对话不存在。',
CODING_CONVERSATION_REQUEST_INVALID: '对话请求无效,请检查输入。',
CODING_FILE_NOT_FOUND: '指定的项目文件不存在。',
CODING_FILE_REQUEST_INVALID: '文件请求无效,请检查输入。',
CODING_INTERACTION_REQUEST_INVALID: '交互响应无效,请重试。',
CODING_KNOWLEDGE_ALREADY_EXISTS: '同名知识文件已存在。',
CODING_KNOWLEDGE_REQUEST_INVALID: '知识文件无效,请检查后重试。',
CODING_MIGRATION_MODEL_REQUIRED: '请先为该对话选择一个可用模型。',
CODING_MODEL_UNAVAILABLE: '所选模型当前不可用,请重新选择。',
CODING_PROJECT_ALREADY_EXISTS: '该编程项目已经存在。',
CODING_PROJECT_CONFIG_INVALID: '项目配置无效,请检查后重试。',
CODING_PROJECT_IDENTITY_IMMUTABLE: '项目创建标识不能修改。',
CODING_PROJECT_IDENTITY_CONFIRMATION_REQUIRED: '设为独立副本需要明确确认。',
CODING_PROJECT_IDENTITY_REQUIRED: '请先为该编程项目选择项目 ID。',
CODING_PROJECT_NOT_FOUND: '指定的编程项目不存在。',
CODING_PROJECT_REQUEST_INVALID: '项目请求无效,请检查输入。',
CODING_PROJECT_TYPE_IMMUTABLE: '项目类型创建后不能修改。',
CODING_PRODUCT_TOOL_FAILED: '项目工具执行失败,请重试。',
CODING_PRODUCT_TOOLS_UNAVAILABLE: '项目工具暂时不可用。',
CODING_PROVIDER_AUTH_REQUIRED: 'Provider 凭证不可用,请修复账号后重试。',
CODING_REQUEST_CAPACITY_EXCEEDED: '本地请求队列已满,请稍后重试。',
CODING_REQUEST_ID_CONFLICT: '该请求标识已用于不同内容,请使用新的标识。',
CODING_REQUEST_UNCERTAIN: '请求确认延迟,可能仍在执行。请等待结果,或中止/恢复后再重试。',
CODING_RUNTIME_PROTOCOL_ERROR: '本地 Agent 通信异常,请执行恢复。',
CODING_RUNTIME_READY_TIMEOUT: '本地 Agent 启动超时,请执行恢复。',
CODING_RUNTIME_START_FAILED: '本地 Agent 启动失败,请执行恢复。',
CODING_RUNTIME_UNAVAILABLE: '本地编程运行时暂时不可用。',
CODING_SESSION_UNREADABLE: '对话会话无法读取,原文件已保留。',
CODING_STORAGE_WRITE_FAILED: '本地数据写入失败,请检查存储后重试。',
};
function fixedMessage(code: string): string {
return FIXED_CODING_ERROR_MESSAGES[code] ?? '编程操作失败,请重试。';
}
export function sendFixedCodingError(
res: ServerResponse,
status: number,
code: string,
): void {
sendJson(res, status, {
success: false,
code,
error: fixedMessage(code),
});
}
export function sendCodingRouteError(res: ServerResponse, error: unknown): void {
if (error instanceof CodingProjectServiceError || error instanceof CodingConversationServiceError) {
sendFixedCodingError(res, error.status, error.code);
return;
}
if (error instanceof SyntaxError) {
sendJson(res, 400, {
success: false,
code: 'CODING_REQUEST_INVALID',
error: '请求内容无效,请检查后重试。',
});
return;
}
sendJson(res, 500, {
success: false,
code: 'CODING_REQUEST_FAILED',
error: '编程操作失败,请重试。',
});
}
export function decodeRouteId(value: string): string {
try {
const decoded = decodeURIComponent(value).trim();
if (!decoded || decoded.length > 128 || decoded.includes('/')) throw new Error();
return decoded;
} catch {
throw new CodingConversationServiceError(
400,
'CODING_CONVERSATION_REQUEST_INVALID',
'Route identifier is invalid',
);
}
}