Files
Agent-System/internal/errcode/legacy_extra.go
T
weichen f3f23a3018 feat(errcode): 用稳定错误码记录 HTTP 与异步失败
失败响应此前不写日志,request_id 无法对照原因。注册表不覆盖处理器已经给出的 HTTP 状态。
2026-09-28 02:27:16 +00:00

166 lines
17 KiB
Go

package errcode
func init() {
register(Def{ID: "ASSET_NOT_FOUND", Status: 404, Message: "asset not found", Class: ClassFatal, Module: "server"})
register(Def{ID: "ASSET_KEY_AND_FILE_REQUIRED", Status: 400, Message: "asset_key and file required", Class: ClassFatal, Module: "server"})
register(Def{ID: "BATCH_NOT_FOUND", Status: 404, Message: "batch not found", Class: ClassFatal, Module: "server"})
register(Def{ID: "CANNOT_STORE_EMPTY_FILE", Status: 400, Message: "cannot store empty file", Class: ClassFatal, Module: "server"})
register(Def{ID: "CHAT_MESSAGES_IMPORT_ENDPOINT_IS_ONLY_AVAILABLE_IN_DEV_D", Status: 400, Message: "chat messages import endpoint is only available in dev/demo environment", Class: ClassFatal, Module: "server"})
register(Def{ID: "CLIENT_TURN_ID_AND_SESSION_ID_REQUIRED", Status: 400, Message: "client_turn_id and session_id required", Class: ClassFatal, Module: "server"})
register(Def{ID: "DECISION_NONCE_AND_DECISION_DIGEST_REQUIRED", Status: 400, Message: "decision_nonce and decision_digest required", Class: ClassFatal, Module: "server"})
register(Def{ID: "DOC_ID_CANNOT_BE_EMPTY", Status: 400, Message: "doc_id cannot be empty", Class: ClassFatal, Module: "server"})
register(Def{ID: "DOC_ID_REQUIRED", Status: 400, Message: "doc_id required", Class: ClassFatal, Module: "server"})
register(Def{ID: "FILE_REQUIRED", Status: 400, Message: "file required", Class: ClassFatal, Module: "server"})
register(Def{ID: "FILE_TYPE_NOT_SUPPORTED_BY_PARSER", Status: 400, Message: "file type not supported by parser", Class: ClassFatal, Module: "server"})
register(Def{ID: "INVALID_ACTION_MUST_BE_APPROVE_OR_REJECT", Status: 400, Message: "invalid action: must be approve or reject", Class: ClassFatal, Module: "server"})
register(Def{ID: "INVALID_ASSET_ID", Status: 400, Message: "invalid asset id", Class: ClassFatal, Module: "server"})
register(Def{ID: "INVALID_ASSET_KEY", Status: 400, Message: "invalid asset key", Class: ClassFatal, Module: "server"})
register(Def{ID: "INVALID_BATCH_ID", Status: 400, Message: "invalid batch id", Class: ClassFatal, Module: "server"})
register(Def{ID: "INVALID_COMMENT_ID", Status: 400, Message: "invalid comment id", Class: ClassFatal, Module: "server"})
register(Def{ID: "INVALID_EDGE_ID", Status: 400, Message: "invalid edge id", Class: ClassFatal, Module: "server"})
register(Def{ID: "INVALID_INSTANCE_ID", Status: 400, Message: "invalid instance id", Class: ClassFatal, Module: "server"})
register(Def{ID: "INVALID_MARK_ID", Status: 400, Message: "invalid mark id", Class: ClassFatal, Module: "server"})
register(Def{ID: "INVALID_MULTIPART", Status: 400, Message: "invalid multipart", Class: ClassFatal, Module: "server"})
register(Def{ID: "INVALID_PROJECT_ID", Status: 400, Message: "invalid project id", Class: ClassFatal, Module: "server"})
register(Def{ID: "INVALID_REPO_PATH", Status: 400, Message: "invalid repo_path", Class: ClassFatal, Module: "server"})
register(Def{ID: "INVALID_REQUEST_ID", Status: 400, Message: "invalid request id", Class: ClassFatal, Module: "server"})
register(Def{ID: "INVALID_TASK_KEY", Status: 400, Message: "invalid task key", Class: ClassFatal, Module: "server"})
register(Def{ID: "INVALID_VERSION", Status: 409, Message: "invalid version", Class: ClassResumable, Module: "server"})
register(Def{ID: "INVALID_WORKFLOW_ID", Status: 400, Message: "invalid workflow id", Class: ClassFatal, Module: "server"})
register(Def{ID: "INVALID_WORKSPACE_PATH", Status: 400, Message: "invalid workspace path", Class: ClassFatal, Module: "server"})
register(Def{ID: "KIND_MUST_BE_CONFIRM_OR_CANCEL", Status: 400, Message: "kind must be confirm or cancel", Class: ClassFatal, Module: "server"})
register(Def{ID: "LIST_EXECUTIONS_FAILED", Status: 400, Message: "list executions failed", Class: ClassFatal, Module: "server"})
register(Def{ID: "MESSAGE_CANNOT_BE_EMPTY", Status: 400, Message: "message cannot be empty", Class: ClassFatal, Module: "server"})
register(Def{ID: "MESSAGE_MUST_BE_SENT_VIA_POST_JSON_BODY_NOT_GET_QUERY_T2", Status: 400, Message: "message must be sent via POST JSON body, not GET query (T20-B11)", Class: ClassFatal, Module: "server"})
register(Def{ID: "MISSING_DATE_DAY_KEY_OR_ANCHOR_ID_QUERY_PARAM", Status: 400, Message: "missing date/day_key or anchor_id query param", Class: ClassFatal, Module: "server"})
register(Def{ID: "MISSING_DOC_ID_QUERY_PARAM", Status: 400, Message: "missing doc_id query param", Class: ClassFatal, Module: "server"})
register(Def{ID: "MISSING_OR_EMPTY_QUERY_PARAM_Q", Status: 400, Message: "missing or empty query param 'q'", Class: ClassFatal, Module: "server"})
register(Def{ID: "MISSING_OR_INVALID_PROJECT_ID_QUERY_PARAM", Status: 400, Message: "missing or invalid project_id query param", Class: ClassFatal, Module: "server"})
register(Def{ID: "MISSING_QUERY_PARAM", Status: 400, Message: "missing query param", Class: ClassFatal, Module: "server"})
register(Def{ID: "MISSING_REQUIRED_FIELDS_SESSION_ID_OR_DAY_KEY", Status: 400, Message: "missing required fields 'session_id' or 'day_key'", Class: ClassFatal, Module: "server"})
register(Def{ID: "MISSING_REQUIRED_QUERY_PARAM_SESSION_ID", Status: 400, Message: "missing required query param 'session_id'", Class: ClassFatal, Module: "server"})
register(Def{ID: "MISSING_SESSION_ID", Status: 400, Message: "missing session_id", Class: ClassFatal, Module: "server"})
register(Def{ID: "MISSING_SESSION_ID_QUERY_PARAM", Status: 400, Message: "missing session_id query param", Class: ClassFatal, Module: "server"})
register(Def{ID: "PARSE_IS_IN_PROGRESS_OR_ALREADY_COMPLETE", Status: 409, Message: "parse is in progress or already complete", Class: ClassResumable, Module: "server"})
register(Def{ID: "PROJECT_ROLE_REQUIRED_WHEN_MEMBER_DOES_NOT_EXIST", Status: 400, Message: "project_role required when member does not exist", Class: ClassFatal, Module: "server"})
register(Def{ID: "PROJECT_ROLE_REQUIRED_WITH_DOCUMENT_DUTY", Status: 400, Message: "project_role required with document_duty", Class: ClassFatal, Module: "server"})
register(Def{ID: "PROPOSAL_ID_CANNOT_BE_EMPTY", Status: 400, Message: "proposal_id cannot be empty", Class: ClassFatal, Module: "server"})
register(Def{ID: "PROPOSED_CHANGES_CANNOT_BE_EMPTY", Status: 400, Message: "proposed_changes cannot be empty", Class: ClassFatal, Module: "server"})
register(Def{ID: "READ_FILE_FAILED", Status: 400, Message: "read file failed", Class: ClassFatal, Module: "server"})
register(Def{ID: "REPO_PATH_REQUIRED", Status: 400, Message: "repo_path required", Class: ClassFatal, Module: "server"})
register(Def{ID: "RUN_NOT_FOUND", Status: 404, Message: "run not found", Class: ClassFatal, Module: "server"})
register(Def{ID: "RUN_ID_REQUIRED", Status: 400, Message: "run_id required", Class: ClassFatal, Module: "server"})
register(Def{ID: "SAVE_BINDING_FAILED", Status: 400, Message: "save binding failed", Class: ClassFatal, Module: "server"})
register(Def{ID: "SESSION_OR_PROJECT_CONTEXT_NOT_FOUND", Status: 404, Message: "session or project context not found", Class: ClassFatal, Module: "server"})
register(Def{ID: "STREAMING_UNSUPPORTED", Status: 400, Message: "streaming unsupported", Class: ClassFatal, Module: "server"})
register(Def{ID: "STREAMING_UNSUPPORTED_BY_UNDERLYING_CONNECTION", Status: 400, Message: "streaming unsupported by underlying connection", Class: ClassFatal, Module: "server"})
register(Def{ID: "TURN_NOT_FOUND", Status: 404, Message: "turn not found", Class: ClassFatal, Module: "server"})
register(Def{ID: "UNKNOWN_WORKFLOW", Status: 400, Message: "unknown workflow", Class: ClassFatal, Module: "server"})
register(Def{ID: "UNSUPPORTED_CATEGORY", Status: 400, Message: "unsupported category", Class: ClassFatal, Module: "server"})
register(Def{ID: "UPLOAD_TOO_LARGE", Status: 400, Message: "upload too large", Class: ClassFatal, Module: "server"})
register(Def{ID: "USER_ID_AND_PROJECT_ROLE_REQUIRED", Status: 400, Message: "user_id and project_role required", Class: ClassFatal, Module: "server"})
register(Def{ID: "USER_ID_QUERY_REQUIRED", Status: 400, Message: "user_id query required", Class: ClassFatal, Module: "server"})
register(Def{ID: "USER_ID_REQUIRED", Status: 400, Message: "user_id required", Class: ClassFatal, Module: "server"})
register(Def{ID: "WORKFLOW_CATALOG_UNAVAILABLE", Status: 503, Message: "workflow catalog unavailable", Class: ClassTransient, Module: "server"})
register(Def{ID: "WORKFLOW_KEY_IS_REQUIRED", Status: 400, Message: "workflow_key is required", Class: ClassFatal, Module: "server"})
register(Def{ID: "WORKSPACE_NOT_AVAILABLE_FOR_RUN", Status: 503, Message: "workspace not available for run", Class: ClassTransient, Module: "server"})
register(Def{ID: "MSG_", Status: 400, Message: "仅原批准人或(批准人缺位时)项目创建人可批准再打开", Class: ClassFatal, Module: "server"})
register(Def{ID: "MSG__2", Status: 400, Message: "只有该阶段文档职责人或创建人可以申请再打开", Class: ClassFatal, Module: "server"})
register(Def{ID: "MSG__3", Status: 400, Message: "姓名不能为空", Class: ClassFatal, Module: "server"})
register(Def{ID: "TASK_KEY", Status: 400, Message: "客户端不可覆盖 task_key", Class: ClassFatal, Module: "server"})
register(Def{ID: "IAM", Status: 400, Message: "工作流定义服务需要数据库 IAM", Class: ClassFatal, Module: "server"})
register(Def{ID: "MSG__4", Status: 400, Message: "指定的角色不存在或已停用", Class: ClassFatal, Module: "server"})
register(Def{ID: "ID", Status: 400, Message: "无效的 id", Class: ClassFatal, Module: "server"})
register(Def{ID: "LIMIT", Status: 400, Message: "无效的 limit", Class: ClassFatal, Module: "server"})
register(Def{ID: "ID_2", Status: 400, Message: "无效的用户ID", Class: ClassFatal, Module: "server"})
register(Def{ID: "ID_3", Status: 400, Message: "无效的角色 ID", Class: ClassFatal, Module: "server"})
register(Def{ID: "MSG__5", Status: 404, Message: "未找到该项目的打开标记", Class: ClassFatal, Module: "server"})
register(Def{ID: "MSG__6", Status: 400, Message: "申请不属于该项目", Class: ClassFatal, Module: "server"})
register(Def{ID: "MSG__7", Status: 400, Message: "看不见下游文档,不能裁决", Class: ClassFatal, Module: "server"})
register(Def{ID: "MSG__8", Status: 400, Message: "至少提供一个可更新字段", Class: ClassFatal, Module: "server"})
register(Def{ID: "MSG__9", Status: 400, Message: "追踪索引不可用", Class: ClassFatal, Module: "server"})
extras := map[string]string{
"asset not found": "ASSET_NOT_FOUND",
"asset_key and file required": "ASSET_KEY_AND_FILE_REQUIRED",
"batch not found": "BATCH_NOT_FOUND",
"cannot store empty file": "CANNOT_STORE_EMPTY_FILE",
"chat messages import endpoint is only available in dev/demo environment": "CHAT_MESSAGES_IMPORT_ENDPOINT_IS_ONLY_AVAILABLE_IN_DEV_D",
"client_turn_id and session_id required": "CLIENT_TURN_ID_AND_SESSION_ID_REQUIRED",
"decision_nonce and decision_digest required": "DECISION_NONCE_AND_DECISION_DIGEST_REQUIRED",
"doc_id cannot be empty": "DOC_ID_CANNOT_BE_EMPTY",
"doc_id required": "DOC_ID_REQUIRED",
"file required": "FILE_REQUIRED",
"file type not supported by parser": "FILE_TYPE_NOT_SUPPORTED_BY_PARSER",
"invalid action: must be approve or reject": "INVALID_ACTION_MUST_BE_APPROVE_OR_REJECT",
"invalid asset id": "INVALID_ASSET_ID",
"invalid asset key": "INVALID_ASSET_KEY",
"invalid batch id": "INVALID_BATCH_ID",
"invalid comment id": "INVALID_COMMENT_ID",
"invalid edge id": "INVALID_EDGE_ID",
"invalid instance id": "INVALID_INSTANCE_ID",
"invalid mark id": "INVALID_MARK_ID",
"invalid multipart": "INVALID_MULTIPART",
"invalid project id": "INVALID_PROJECT_ID",
"invalid repo_path": "INVALID_REPO_PATH",
"invalid request id": "INVALID_REQUEST_ID",
"invalid task key": "INVALID_TASK_KEY",
"invalid version": "INVALID_VERSION",
"invalid workflow id": "INVALID_WORKFLOW_ID",
"invalid workspace path": "INVALID_WORKSPACE_PATH",
"kind must be confirm or cancel": "KIND_MUST_BE_CONFIRM_OR_CANCEL",
"list executions failed": "LIST_EXECUTIONS_FAILED",
"message cannot be empty": "MESSAGE_CANNOT_BE_EMPTY",
"message must be sent via POST JSON body, not GET query (T20-B11)": "MESSAGE_MUST_BE_SENT_VIA_POST_JSON_BODY_NOT_GET_QUERY_T2",
"missing date/day_key or anchor_id query param": "MISSING_DATE_DAY_KEY_OR_ANCHOR_ID_QUERY_PARAM",
"missing doc_id query param": "MISSING_DOC_ID_QUERY_PARAM",
"missing or empty query param 'q'": "MISSING_OR_EMPTY_QUERY_PARAM_Q",
"missing or invalid project_id query param": "MISSING_OR_INVALID_PROJECT_ID_QUERY_PARAM",
"missing query param": "MISSING_QUERY_PARAM",
"missing required fields 'session_id' or 'day_key'": "MISSING_REQUIRED_FIELDS_SESSION_ID_OR_DAY_KEY",
"missing required query param 'session_id'": "MISSING_REQUIRED_QUERY_PARAM_SESSION_ID",
"missing session_id": "MISSING_SESSION_ID",
"missing session_id query param": "MISSING_SESSION_ID_QUERY_PARAM",
"parse is in progress or already complete": "PARSE_IS_IN_PROGRESS_OR_ALREADY_COMPLETE",
"project_role required when member does not exist": "PROJECT_ROLE_REQUIRED_WHEN_MEMBER_DOES_NOT_EXIST",
"project_role required with document_duty": "PROJECT_ROLE_REQUIRED_WITH_DOCUMENT_DUTY",
"proposal_id cannot be empty": "PROPOSAL_ID_CANNOT_BE_EMPTY",
"proposed_changes cannot be empty": "PROPOSED_CHANGES_CANNOT_BE_EMPTY",
"read file failed": "READ_FILE_FAILED",
"repo_path required": "REPO_PATH_REQUIRED",
"run not found": "RUN_NOT_FOUND",
"run_id required": "RUN_ID_REQUIRED",
"save binding failed": "SAVE_BINDING_FAILED",
"session or project context not found": "SESSION_OR_PROJECT_CONTEXT_NOT_FOUND",
"streaming unsupported": "STREAMING_UNSUPPORTED",
"streaming unsupported by underlying connection": "STREAMING_UNSUPPORTED_BY_UNDERLYING_CONNECTION",
"turn not found": "TURN_NOT_FOUND",
"unknown workflow": "UNKNOWN_WORKFLOW",
"unsupported category": "UNSUPPORTED_CATEGORY",
"upload too large": "UPLOAD_TOO_LARGE",
"user_id and project_role required": "USER_ID_AND_PROJECT_ROLE_REQUIRED",
"user_id query required": "USER_ID_QUERY_REQUIRED",
"user_id required": "USER_ID_REQUIRED",
"workflow catalog unavailable": "WORKFLOW_CATALOG_UNAVAILABLE",
"workflow_key is required": "WORKFLOW_KEY_IS_REQUIRED",
"workspace not available for run": "WORKSPACE_NOT_AVAILABLE_FOR_RUN",
"仅原批准人或(批准人缺位时)项目创建人可批准再打开": "MSG_",
"只有该阶段文档职责人或创建人可以申请再打开": "MSG__2",
"姓名不能为空": "MSG__3",
"客户端不可覆盖 task_key": "TASK_KEY",
"工作流定义服务需要数据库 IAM": "IAM",
"指定的角色不存在或已停用": "MSG__4",
"无效的 id": "ID",
"无效的 limit": "LIMIT",
"无效的用户ID": "ID_2",
"无效的角色 ID": "ID_3",
"未找到该项目的打开标记": "MSG__5",
"申请不属于该项目": "MSG__6",
"看不见下游文档,不能裁决": "MSG__7",
"至少提供一个可更新字段": "MSG__8",
"追踪索引不可用": "MSG__9",
}
for msg, id := range extras {
registerLegacy(msg, id)
}
}