Files
Agent-System/internal/errcode/codes_domain.go
T
weichen 4f581306d7 fix(agent): 拒绝把工作区发给数据目录不一致的 PI runner
test 启动时根 .env 的 dev runner URL 盖过了 18866,sidecar 把 test 工作区重写到 dev 空目录,模型因读不到材料报 MISSING_TARGET。端口约定优先,并在调用前核对 runner data_dir。
2026-09-28 03:16:27 +00:00

235 lines
20 KiB
Go

package errcode
func init() {
rows := []Def{
{ID: "REQUEST_INVALID", Status: 400, Message: "请求参数无效", Module: "server"},
{ID: "REQUEST_JSON_INVALID", Status: 400, Message: "无效的 JSON 请求体", Module: "server"},
{ID: "REQUEST_BODY_INVALID", Status: 400, Message: "无效的请求体", Module: "server"},
{ID: "REQUEST_METHOD_NOT_ALLOWED", Status: 405, Message: "不支持的请求方法", Module: "server"},
{ID: "AUTH_UNAUTHENTICATED", Status: 401, Message: "未登录或登录已过期", Module: "auth"},
{ID: "AUTH_FORBIDDEN", Status: 403, Message: "无权访问", Module: "auth"},
{ID: "AUTH_SESSION_EXPIRED", Status: 401, Message: "未登录或登录已过期", Module: "auth"},
{ID: "AUTH_LOGIN_REQUIRED", Status: 401, Message: "请先登录", Module: "auth"},
{ID: "AUTH_USERNAME_EXISTS", Status: 409, Message: "用户名已存在", Module: "auth"},
{ID: "AUTH_BAD_CREDENTIALS", Status: 401, Message: "用户名或密码错误", Module: "auth"},
{ID: "RESOURCE_NOT_FOUND", Status: 404, Message: "资源不存在", Module: "server"},
{ID: "RESOURCE_CONFLICT", Status: 409, Message: "资源版本冲突", Module: "server", Class: ClassResumable},
{ID: "VERSION_CONFLICT", Status: 409, Message: "资源版本冲突", Module: "server", Class: ClassResumable},
{ID: "IDEMPOTENCY_CONFLICT", Status: 409, Message: "重复提交", Module: "server", Class: ClassResumable},
{ID: "SERVICE_UNAVAILABLE", Status: 503, Message: "服务暂不可用", Module: "server", Class: ClassTransient},
{ID: "INTERNAL", Status: 500, Message: "请求无法完成", Module: "server"},
{ID: "INTERNAL_ERROR", Status: 500, Message: "系统内部错误,请重新开始会话", Module: "server", Actions: []string{"restart"}},
{ID: "RATE_LIMITED", Status: 429, Message: "请求过于频繁,请稍后重试", Module: "server", Class: ClassTransient, Actions: []string{"retry"}},
{ID: "DOCUMENT_NOT_FOUND", Status: 404, Message: "文档不存在", Module: "docgov"},
{ID: "DOCUMENT_LOCKED", Status: 409, Message: "文档已锁定", Module: "docgov", Class: ClassResumable},
{ID: "DOC_BUSY", Status: 409, Message: "该文档正在编辑中,请等待现有任务完成", Module: "docgov", Class: ClassFatal, Actions: []string{}},
{ID: "DOC_LEDGER_ERROR", Status: 500, Message: "文档职责账本写入失败,请重新开始会话", Module: "docgov", Actions: []string{"restart"}},
{ID: "DOC_TASK_BUSY", Status: 409, Message: "文档任务正在执行,暂不能改派", Module: "projectinstance", Class: ClassResumable},
{ID: "LEASE_NOT_HELD", Status: 409, Message: "当前没有文档编辑租约", Module: "docgov", Class: ClassResumable},
{ID: "LEASE_EXPIRED", Status: 409, Message: "文档编辑租约已过期", Module: "docgov", Class: ClassResumable},
{ID: "LEASE_STALE", Status: 409, Message: "文档编辑租约已失效", Module: "docgov", Class: ClassResumable},
{ID: "FORCE_EDIT_NOT_ALLOWED", Status: 409, Message: "当前不允许强制直接编辑", Module: "docgov"},
{ID: "PROPOSAL_NOT_FOUND", Status: 404, Message: "变更提案不存在", Module: "docgov"},
{ID: "UNAUTHORIZED_ACTOR", Status: 403, Message: "当前身份不能执行该文档动作", Module: "docgov"},
{ID: "AUTHOR_ONLY_EDIT", Status: 403, Message: "只有编制人可以修改文档内容", Module: "docgov"},
{ID: "REVIEWER_CANNOT_EDIT", Status: 403, Message: "审核人不能修改文档内容", Module: "docgov"},
{ID: "APPROVER_CANNOT_EDIT", Status: 403, Message: "批准人不能修改文档内容", Module: "docgov"},
{ID: "INVALID_STATE_TRANSITION", Status: 409, Message: "文档状态不能这样流转", Module: "docgov"},
{ID: "REJECT_REASON_REQUIRED", Status: 400, Message: "驳回必须填写原因", Module: "docgov"},
{ID: "PROPOSAL_ALREADY_DECIDED", Status: 409, Message: "变更提案已裁决", Module: "docgov"},
{ID: "CHANGE_PROPOSAL_PENDING", Status: 409, Message: "文档仍有待编制人确认的变更提案", Module: "docgov", Class: ClassResumable},
{ID: "DOCUMENT_CONTENT_PROJECTION_MISSING", Status: 409, Message: "文档内容投影缺失", Module: "docgov"},
{ID: "DOCUMENT_CONTENT_PROJECTION_EMPTY", Status: 409, Message: "文档内容投影为空", Module: "docgov"},
{ID: "DOCUMENT_CONTENT_INTEGRITY_MISMATCH", Status: 409, Message: "文档内容校验不一致", Module: "docgov"},
{ID: "DOCUMENT_CONTENT_PROJECTION_DRIFT", Status: 409, Message: "文档内容投影与账本不一致", Module: "docgov"},
{ID: "DOCUMENT_CONTENT_ERROR", Status: 409, Message: "文档内容读取失败", Module: "docgov"},
{ID: "CHAT_TIMEOUT", Status: 504, Message: "生成回复超时,请稍后重试", Module: "stream", Class: ClassTransient, Actions: []string{"retry"}},
{ID: "NETWORK_ERROR", Status: 502, Message: "网络连接异常,请稍后重试", Module: "stream", Class: ClassTransient, Actions: []string{"retry"}},
{ID: "RUNNER_RESULT_REJECTED", Status: 502, Message: "助手执行结果校验失败,请重新开始任务", Module: "stream", Actions: []string{"restart"}},
{ID: "RUNNER_MISMATCH", Status: 500, Message: "模型执行环境与数据目录不一致,请联系管理员检查部署配置", Module: "stream"},
{ID: "TASK_INTERRUPTED", Status: 409, Message: "任务执行中断,可继续或重新开始", Module: "taskrun", Class: ClassResumable, Actions: []string{"continue", "restart"}},
{ID: "TASK_SCOPE_UNRESOLVED", Status: 400, Message: "无法确定任务所属阶段", Module: "projectinstance"},
{ID: "FREEDOC_NOT_FOUND", Status: 404, Message: "自由文档不存在", Module: "freedoc"},
{ID: "FREEDOC_FORBIDDEN", Status: 403, Message: "无权访问该自由文档", Module: "freedoc"},
{ID: "FREEDOC_CONFLICT", Status: 409, Message: "自由文档版本冲突", Module: "freedoc", Class: ClassResumable},
{ID: "FREEDOC_INVALID_PARAM", Status: 400, Message: "自由文档参数无效", Module: "freedoc"},
{ID: "FREEDOC_NOT_EXPORTABLE", Status: 400, Message: "该消息不能导出为文档", Module: "freedoc"},
{ID: "SETTING_UNKNOWN", Status: 400, Message: "未知的设置键", Module: "sysadmin"},
{ID: "SETTING_READ_ONLY", Status: 403, Message: "该设置为只读", Module: "sysadmin"},
{ID: "SETTING_INVALID_VALUE", Status: 400, Message: "设置值类型不匹配", Module: "sysadmin"},
{ID: "SETTING_STORE_UNAVAILABLE", Status: 503, Message: "设置存储不可用", Module: "sysadmin", Class: ClassTransient},
{ID: "SETTING_REVISION_REQUIRED", Status: 400, Message: "该设置需要 expected_revision", Module: "sysadmin"},
{ID: "SETTING_REVISION_CONFLICT", Status: 409, Message: "设置版本冲突,请刷新后重试", Module: "sysadmin", Class: ClassResumable},
{ID: "SETTING_NOT_FOUND", Status: 404, Message: "设置不存在", Module: "sysadmin"},
{ID: "WORKFLOW_UNAUTHENTICATED", Status: 401, Message: "需要登录后操作工作流", Module: "projectworkflow"},
{ID: "WORKFLOW_FORBIDDEN_NOT_CREATOR", Status: 403, Message: "仅项目创建人有权切换激活工作流", Module: "projectworkflow"},
{ID: "PROJECT_NOT_FOUND", Status: 404, Message: "项目不存在", Module: "projectworkflow"},
{ID: "WORKFLOW_NOT_FOUND", Status: 404, Message: "工作流定义不存在或未在项目启用", Module: "projectworkflow"},
{ID: "WORKFLOW_CONCURRENT_CONFLICT", Status: 409, Message: "工作流选择版本落后或并发冲突,请刷新后重试", Module: "projectworkflow", Class: ClassResumable},
{ID: "WORKFLOW_PREREQUISITE", Status: 400, Message: "上游文档尚未满足,不能继续", Module: "projectworkflow"},
{ID: "WORKFLOW_INVALID_INPUT", Status: 400, Message: "工作流参数无效", Module: "projectworkflow"},
{ID: "PROJECT_NAME_DUPLICATE", Status: 409, Message: "项目名称已存在", Module: "projectworkflow"},
{ID: "WORKFLOW_LEGACY_SWITCH_BLOCKED", Status: 409, Message: "请通过项目设置完成工作流规划与激活", Module: "projectworkflow"},
{ID: "TASKRUN_NOT_RESUMABLE", Status: 409, Message: "该任务不能继续", Module: "taskrun"},
{ID: "TASKRUN_ALREADY_ACTIVE", Status: 409, Message: "任务已在执行", Module: "taskrun", Class: ClassResumable},
{ID: "TASKRUN_TERMINAL_CONFLICT", Status: 409, Message: "任务已结束,不能再次收口", Module: "taskrun"},
{ID: "TASKRUN_CLEANUP_BLOCKED", Status: 409, Message: "任务清理尚未满足核对条件", Module: "taskrun"},
{ID: "TASKRUN_UNAUTHORIZED_BACKEND", Status: 403, Message: "任务执行器未授权", Module: "taskrun"},
{ID: "TASKRUN_SENSITIVE_PAYLOAD", Status: 400, Message: "任务输入包含不允许的内容", Module: "taskrun"},
{ID: "TASKRUN_STORE_UNAVAILABLE", Status: 503, Message: "任务存储不可用", Module: "taskrun", Class: ClassTransient},
{ID: "TASKRUN_IDEMPOTENCY_CONFLICT", Status: 409, Message: "重复的任务提交", Module: "taskrun", Class: ClassResumable},
{ID: "SESSION_OWNER_MISMATCH", Status: 403, Message: "无权访问该会话", Module: "ctxmgr"},
{ID: "CHAT_TURN_NOT_FOUND", Status: 404, Message: "对话回合不存在", Module: "ctxmgr"},
{ID: "IDEMPOTENCY_KEY_REUSED", Status: 409, Message: "重复提交的内容不一致", Module: "ctxmgr"},
{ID: "CTXMGR_BACKGROUND", Status: 500, Message: "上下文后台任务失败", Module: "ctxmgr", Class: ClassTransient},
{ID: "MAINTENANCE_NOT_FOUND", Status: 404, Message: "维护窗口不存在", Module: "maintenance"},
{ID: "MAINTENANCE_CONFLICT_OPEN", Status: 409, Message: "已有未结束的维护窗口", Module: "maintenance", Class: ClassResumable},
{ID: "MAINTENANCE_INVALID_WINDOW", Status: 400, Message: "维护窗口参数无效", Module: "maintenance"},
{ID: "MAINTENANCE_BAD_STATUS", Status: 409, Message: "当前状态不可取消", Module: "maintenance"},
{ID: "SWBOOT_MERGE_FORBIDDEN", Status: 403, Message: "受控执行不会合并、推送或部署", Module: "swboot"},
{ID: "SWBOOT_REPO_NOT_ALLOWLISTED", Status: 403, Message: "仓库路径不在允许列表", Module: "swboot"},
{ID: "SWBOOT_PATCH_DISABLED", Status: 403, Message: "受控补丁执行未开启", Module: "swboot"},
{ID: "SWBOOT_PATCH_UNIMPLEMENTED", Status: 501, Message: "受控补丁执行尚未放量", Module: "swboot"},
{ID: "EVENTS_QUARANTINE", Status: 500, Message: "事件已隔离,不会自动重试", Module: "events"},
{ID: "EVENTS_DEAD", Status: 500, Message: "事件投递已进入死信", Module: "events"},
{ID: "EVENTS_AUTH_FAILURE", Status: 403, Message: "事件未通过授权", Module: "events"},
{ID: "EVENTS_INTEGRITY", Status: 500, Message: "事件完整性校验失败", Module: "events"},
{ID: "EVENTS_STALE_FENCING", Status: 409, Message: "事件租约令牌已过期", Module: "events", Class: ClassResumable},
{ID: "REMINDER_SCAN_FAILED", Status: 500, Message: "阶段提醒扫描失败", Module: "notification", Class: ClassTransient},
{ID: "INSTANCE_NOT_AVAILABLE", Status: 503, Message: "项目实例服务不可用", Module: "projectinstance", Class: ClassTransient},
{ID: "INSTANCE_FORBIDDEN_NOT_CREATOR", Status: 403, Message: "仅项目创建人可配置工作流", Module: "projectinstance"},
{ID: "INSTANCE_PLAN_FROZEN", Status: 409, Message: "工作流已激活,规划已冻结", Module: "projectinstance"},
{ID: "INSTANCE_SWITCH_FROZEN", Status: 409, Message: "运行中不能切换工作流,只能调整职责、审批和文档启用", Module: "projectinstance"},
{ID: "INSTANCE_ALREADY_ACTIVE", Status: 409, Message: "项目已有运行中的工作流实例", Module: "projectinstance", Class: ClassResumable},
{ID: "INSTANCE_PLAN_RECONFIRM", Status: 409, Message: "规划已变更,请重新预览并确认", Module: "projectinstance", Class: ClassResumable},
{ID: "INSTANCE_VALIDATION_FAILED", Status: 400, Message: "工作流配置校验未通过", Module: "projectinstance"},
{ID: "INSTANCE_ACTIVATION_INVALID", Status: 400, Message: "激活令牌无效或已过期", Module: "projectinstance"},
{ID: "INSTANCE_CONFLICT", Status: 409, Message: "项目版本冲突,请刷新后重试", Module: "projectinstance", Class: ClassResumable},
{ID: "INSTANCE_PLAN_CONFLICT", Status: 409, Message: "规划版本冲突,请刷新后重试", Module: "projectinstance", Class: ClassResumable},
{ID: "INSTANCE_NOT_FOUND", Status: 404, Message: "工作流实例不存在", Module: "projectinstance"},
{ID: "INSTANCE_STAGE_GATE", Status: 400, Message: "阶段门禁未满足,必需文档尚未全部批准", Module: "projectinstance"},
{ID: "INSTANCE_STAGE_NOT_ACTIVE", Status: 409, Message: "目标阶段不是当前活动阶段", Module: "projectinstance"},
{ID: "INSTANCE_STAGE_NOT_COMPLETED", Status: 400, Message: "只能再打开已完成的阶段", Module: "projectinstance"},
{ID: "INSTANCE_RECHECK_REQUIRED", Status: 409, Message: "该阶段有待复核标记,推进前须确认已知悉", Module: "projectinstance"},
{ID: "INSTANCE_INVALID_STAGE", Status: 400, Message: "无效的阶段", Module: "projectinstance"},
{ID: "INSTANCE_REVISION_CONFLICT", Status: 409, Message: "实例版本冲突,请刷新后重试", Module: "projectinstance", Class: ClassResumable},
{ID: "INSTANCE_TERMINATION_DENIED", Status: 409, Message: "当前状态不允许终止", Module: "projectinstance"},
{ID: "INSTANCE_AUTHOR_ONLY_DISABLED", Status: 403, Message: "系统未授权编制人兼任审核批准", Module: "projectinstance"},
{ID: "INSTANCE_AUTHOR_ONLY_UNAVAILABLE", Status: 503, Message: "兼任总授权存储不可用", Module: "projectinstance", Class: ClassTransient},
{ID: "INSTANCE_AUTHOR_ONLY_CHANGED", Status: 409, Message: "兼任总授权已变更,请重新预览并确认激活", Module: "projectinstance", Class: ClassResumable},
{ID: "INSTANCE_DUTY_FORBIDDEN", Status: 403, Message: "无权改派文档职责", Module: "projectinstance"},
{ID: "INSTANCE_DOC_TASK_NOT_FOUND", Status: 404, Message: "文档任务不存在或已禁用", Module: "projectinstance"},
{ID: "INSTANCE_LEGACY_SWITCH_BLOCKED", Status: 409, Message: "新项目请通过项目设置完成工作流激活", Module: "projectinstance"},
{ID: "TASKRUN_BACKGROUND", Status: 500, Message: "任务后台处理失败", Module: "taskrun", Class: ClassTransient},
}
for _, d := range rows {
if d.Actions != nil && len(d.Actions) == 0 {
d.Actions = []string{}
}
register(d)
}
aliases := map[string]string{
"无效的 JSON 请求体": "REQUEST_JSON_INVALID",
"无效的 JSON": "REQUEST_JSON_INVALID",
"invalid json": "REQUEST_JSON_INVALID",
"无效的请求体": "REQUEST_BODY_INVALID",
"invalid request body": "REQUEST_BODY_INVALID",
"invalid body": "REQUEST_BODY_INVALID",
"不支持的请求方法": "REQUEST_METHOD_NOT_ALLOWED",
"不支持的方法": "REQUEST_METHOD_NOT_ALLOWED",
"method not allowed": "REQUEST_METHOD_NOT_ALLOWED",
"Method Not Allowed": "REQUEST_METHOD_NOT_ALLOWED",
"未登录或登录已过期": "AUTH_SESSION_EXPIRED",
"请先登录": "AUTH_LOGIN_REQUIRED",
"用户名或密码错误": "AUTH_BAD_CREDENTIALS",
"用户名已存在": "AUTH_USERNAME_EXISTS",
"未知的设置键": "SETTING_UNKNOWN",
"该设置为只读": "SETTING_READ_ONLY",
"设置值类型不匹配": "SETTING_INVALID_VALUE",
"设置存储不可用": "SETTING_STORE_UNAVAILABLE",
"该设置需要 expected_revision": "SETTING_REVISION_REQUIRED",
"设置版本冲突,请刷新后重试": "SETTING_REVISION_CONFLICT",
"已有未结束的维护窗口": "MAINTENANCE_CONFLICT_OPEN",
"当前状态不可取消": "MAINTENANCE_BAD_STATUS",
"无权改派文档职责": "INSTANCE_DUTY_FORBIDDEN",
"项目实例服务不可用": "INSTANCE_NOT_AVAILABLE",
"项目实例服务不可用,请先执行数据库迁移": "INSTANCE_NOT_AVAILABLE",
"仅项目创建人可配置工作流": "INSTANCE_FORBIDDEN_NOT_CREATOR",
"仅项目创建人有权切换激活工作流": "WORKFLOW_FORBIDDEN_NOT_CREATOR",
"工作流已激活,规划已冻结": "INSTANCE_PLAN_FROZEN",
"运行中不能切换工作流,只能调整职责、审批和文档启用": "INSTANCE_SWITCH_FROZEN",
"项目已有运行中的工作流实例": "INSTANCE_ALREADY_ACTIVE",
"项目已有运行中的工作流实例,请使用项目设置查看流程": "INSTANCE_ALREADY_ACTIVE",
"规划已变更,请重新预览并确认": "INSTANCE_PLAN_RECONFIRM",
"工作流配置校验未通过": "INSTANCE_VALIDATION_FAILED",
"激活令牌无效或已过期": "INSTANCE_ACTIVATION_INVALID",
"项目版本冲突,请刷新后重试": "INSTANCE_CONFLICT",
"工作流选择版本落后或并发冲突,请刷新后重试": "WORKFLOW_CONCURRENT_CONFLICT",
"规划版本冲突,请刷新后重试": "INSTANCE_PLAN_CONFLICT",
"工作流实例不存在": "INSTANCE_NOT_FOUND",
"阶段门禁未满足,必需文档尚未全部批准": "INSTANCE_STAGE_GATE",
"目标阶段不是当前活动阶段": "INSTANCE_STAGE_NOT_ACTIVE",
"只能再打开已完成的阶段": "INSTANCE_STAGE_NOT_COMPLETED",
"该阶段有待复核标记,推进前须确认已知悉": "INSTANCE_RECHECK_REQUIRED",
"无效的阶段": "INSTANCE_INVALID_STAGE",
"实例版本冲突,请刷新后重试": "INSTANCE_REVISION_CONFLICT",
"系统未授权编制人兼任审核批准": "INSTANCE_AUTHOR_ONLY_DISABLED",
"兼任总授权已变更,请重新预览并确认激活": "INSTANCE_AUTHOR_ONLY_CHANGED",
"兼任总授权存储不可用": "INSTANCE_AUTHOR_ONLY_UNAVAILABLE",
"文档任务不存在或已禁用": "INSTANCE_DOC_TASK_NOT_FOUND",
"新项目请通过项目设置完成工作流激活": "INSTANCE_LEGACY_SWITCH_BLOCKED",
"请通过项目设置完成工作流规划与激活": "WORKFLOW_LEGACY_SWITCH_BLOCKED",
"工作流定义不存在或未在项目启用": "WORKFLOW_NOT_FOUND",
"项目不存在": "PROJECT_NOT_FOUND",
"项目不存在或无权限访问": "PROJECT_NOT_FOUND",
"document not found": "DOCUMENT_NOT_FOUND",
"proposal not found": "PROPOSAL_NOT_FOUND",
"ERR_INVALID_PARAM": "REQUEST_INVALID",
"ERR_UNAUTHENTICATED": "AUTH_LOGIN_REQUIRED",
"ERR_NOT_FOUND": "RESOURCE_NOT_FOUND",
"ERR_FORBIDDEN": "AUTH_FORBIDDEN",
"ERR_NOT_AVAILABLE": "SERVICE_UNAVAILABLE",
"ERR_TERMINATION_NOT_ALLOWED": "INSTANCE_TERMINATION_DENIED",
"会话不存在或已失效": "CHAT_TURN_NOT_FOUND",
"无效的会话 ID": "REQUEST_INVALID",
"context manager not initialized": "SERVICE_UNAVAILABLE",
"context manager unavailable": "SERVICE_UNAVAILABLE",
"docgov engine not initialized": "SERVICE_UNAVAILABLE",
"freeform doc service not initialized": "SERVICE_UNAVAILABLE",
"sysadmin service unavailable": "SETTING_STORE_UNAVAILABLE",
"maintenance service unavailable": "SERVICE_UNAVAILABLE",
"storage unavailable": "SERVICE_UNAVAILABLE",
"notification service unavailable": "SERVICE_UNAVAILABLE",
"workspace registry unavailable": "SERVICE_UNAVAILABLE",
"workspace resolver unavailable": "SERVICE_UNAVAILABLE",
"parse engine unavailable": "SERVICE_UNAVAILABLE",
"supplement impact service unavailable": "SERVICE_UNAVAILABLE",
"成员已保存,但受控文档职责同步失败": "INTERNAL",
"无权管理项目成员": "AUTH_FORBIDDEN",
"not a project member": "AUTH_FORBIDDEN",
}
for msg, id := range aliases {
registerLegacy(msg, id)
}
for _, p := range []prefixRule{
{"invalid request body:", "REQUEST_BODY_INVALID"},
{"invalid request json body:", "REQUEST_JSON_INVALID"},
{"invalid multipart form:", "REQUEST_BODY_INVALID"},
{"invalid request body: ", "REQUEST_BODY_INVALID"},
} {
registerPrefix(p.prefix, p.id)
}
}