{"record":{"id":"45d51376f15e44c5","repo":"iflytek/astron-agent","slug":"repo-file-not-exist-45d513","errorCode":"REPO_FILE_NOT_EXIST","errorMessage":"REPO_FILE_NOT_EXIST","messagePattern":"REPO_FILE_NOT_EXIST","errorType":"error_code","errorClass":"BusinessException","httpStatus":null,"severity":"error","filePath":"console/backend/toolkit/src/main/java/com/iflytek/astron/console/toolkit/service/repo/KnowledgeService.java","lineNumber":243,"sourceCode":"     * @return knowledge ID\n     * @throws BusinessException if knowledge not found or operation fails\n     */\n    public String enableKnowledge(String id, Integer enabled) {\n        MysqlKnowledge mysqlKnowledge = knowledgeMapper.selectById(id);\n        if (mysqlKnowledge == null) {\n            throw new BusinessException(ResponseEnum.REPO_KNOWLEDGE_NOT_EXIST);\n        }\n        Knowledge knowledge = new Knowledge();\n        BeanUtils.copyProperties(mysqlKnowledge, knowledge);\n\n        Integer originEnabled = knowledge.getEnabled();\n        if (Objects.equals(originEnabled, enabled)) {\n            return knowledge.getId();\n        }\n\n        FileInfoV2 fileInfoV2 = fileInfoV2Service.getOnly(new QueryWrapper<FileInfoV2>().eq(\"uuid\", knowledge.getFileId()));\n        if (fileInfoV2 == null) {\n            throw new BusinessException(ResponseEnum.REPO_FILE_NOT_EXIST);\n        }\n\n        RepoContext repoContext = this.getRepoContext(fileInfoV2.getId());\n\n        JSONObject content = knowledge.getContent();\n        String auditSuggest = content.getString(\"auditSuggest\");\n        if (!(StringUtils.isEmpty(auditSuggest) || \"pass\".equals(auditSuggest)) && enabled == 1) {\n            return knowledge.getId();\n        }\n\n        knowledge.setEnabled(enabled);\n        knowledge.setUpdatedAt(LocalDateTime.now());\n\n        try {\n            String source = fileInfoV2.getSource();\n            if (enabled == 1) {// Enable - re-add\n                JSONArray jsonArray = new JSONArray();\n","sourceCodeStart":225,"sourceCodeEnd":261,"githubUrl":"https://github.com/iflytek/astron-agent/blob/5e758547a83371a5a4b29dadf4ac03e8dd527635/console/backend/toolkit/src/main/java/com/iflytek/astron/console/toolkit/service/repo/KnowledgeService.java#L225-L261","documentation":"BusinessException(REPO_FILE_NOT_EXIST) thrown in enableKnowledge after the knowledge row is found: getOnly(QueryWrapper uuid = knowledge.getFileId()) returns null because no FileInfoV2 row matches the knowledge's fileId uuid. The knowledge record's backing file reference is dangling, so the enable flow cannot resolve the repo context and aborts.","triggerScenarios":"Enabling a knowledge entry whose backing file was deleted (file removed but knowledge row kept), or whose fileId uuid was never correctly populated / points at another environment's files.","commonSituations":"Orphaned knowledge rows left behind after file deletion without cascade cleanup; data migrations that regenerated FileInfoV2 records with new uuids; imports between environments breaking uuid references.","solutions":["Re-upload or re-link the backing file, then retry enabling the knowledge entry.","Delete and recreate the knowledge entry if its file is permanently gone.","Run a consistency check joining knowledge.file_id against file_info_v2.uuid to find orphaned rows.","Add cascade cleanup (or a guard) so deleting a file removes/disables its dependent knowledge entries."],"exampleFix":"// before: deleting a file leaves orphaned knowledge\nawait repoApi.deleteFile(fileId);\n// after: clean up dependent knowledge entries first\nconst dependents = await knowledgeApi.listByFileId(fileId);\nfor (const k of dependents) await knowledgeApi.delete(k.id);\nawait repoApi.deleteFile(fileId);","handlingStrategy":"validation","validationCode":"const file = await repoApi.getFileByUuid(knowledge.fileId).catch(() => null);\nif (!file) throw new Error(`knowledge ${knowledge.id} references missing file ${knowledge.fileId}`);","typeGuard":"function hasBackingFile(knowledge, file) {\n  return Boolean(file) && file.uuid === knowledge.fileId;\n}","tryCatchPattern":"try {\n  await knowledgeApi.enable(id, enabled);\n} catch (e) {\n  if (e.code === 'REPO_FILE_NOT_EXIST') {\n    throw new Error('backing file missing; re-upload the source file before enabling');\n  }\n  throw e;\n}","preventionTips":["Delete dependent knowledge entries when their backing file is removed (cascade).","Run periodic orphan checks joining knowledge.file_id to file_info_v2.uuid.","Re-link knowledge entries after migrations that regenerate file uuids."],"tags":["java","not-found","data-consistency","knowledge"],"backgroundTag":"entity-not-found","analyzedSha":"5e758547a83371a5a4b29dadf4ac03e8dd527635","analyzedAt":"2026-09-12T08:03:51.356Z","contentChangedAt":"2026-09-12T08:03:51.356Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}