{"record":{"id":"3c6b7dce447a371e","repo":"TencentCloud/TencentDB-Agent-Memory","slug":"already-initialized","errorCode":"already_initialized","errorMessage":"system already has users; init-admin requires empty database","messagePattern":"system already has users; init-admin requires empty database","errorType":"error_code","errorClass":"MetadataError","httpStatus":null,"severity":"error","filePath":"MemoryCore/src/metadata/service/metadata-service.ts","lineNumber":380,"sourceCode":"  private async assertTeamQuota(): Promise<void> {\n    const count = await this.store.countTeams();\n    const limit = this._configParams\n      ? await this._configParams.getEffectiveInt(\"quota\", \"max_teams_per_instance\")\n      : this.quota.maxTeamsPerInstance;\n    if (count >= limit) {\n      throw new MetadataError(\n        \"team_limit_exceeded\",\n        `team limit ${limit} reached for instance ${this.instanceId} (current: ${count})`,\n      );\n    }\n  }\n\n  // ============================================================\n  // User（含 user_key 生成/刷新）\n  // ============================================================\n  async initAdminUser(input: InitAdminInput): Promise<InitAdminResult> {\n    if ((await this.store.countUsers()) > 0) {\n      throw new MetadataError(\"already_initialized\", \"system already has users; init-admin requires empty database\");\n    }\n    if ((await this.store.countSystemAdmins()) > 0) {\n      throw new MetadataError(\"already_initialized\", \"system_admin already exists\");\n    }\n\n    // 核心操作：创建 admin 用户\n    const created = await this.createUserWithType(\n      { username: input.username, default_key_value: input.user_key },\n      \"system_admin\",\n    );\n\n    // 辅助操作：自动创建默认 Team 和 Agent（失败不阻塞核心流程）\n    try {\n      const team = await this.createTeam({\n        name: DEFAULT_TEAM_NAME,\n        description: DEFAULT_TEAM_DESCRIPTION,\n        owner_user_id: created.user_id,\n      });","sourceCodeStart":362,"sourceCodeEnd":398,"githubUrl":"https://github.com/TencentCloud/TencentDB-Agent-Memory/blob/3efcd317b84146d6a08518ac0f7ee7c8a8d200ec/MemoryCore/src/metadata/service/metadata-service.ts#L362-L398","documentation":"MetadataError code 'already_initialized' from initAdminUser means the database is not empty, so the one-time bootstrap of the initial admin cannot proceed. init-admin is designed to run exactly once, on an empty user table. This protects against overwriting or racing bootstrap flows.","triggerScenarios":"Calling initAdminUser when store.countUsers() > 0 — i.e. any user (not just an admin) already exists.","commonSituations":"Re-running an init-admin migration/startup script against an already-bootstrapped database; pointing a fresh init script at a shared/prod database instead of a clean one; leftover test users in a dev DB.","solutions":["Skip initAdminUser if users already exist — check countUsers() first or treat this error as 'already done'","Run init-admin against a clean/empty database (fresh volume or wiped metadata store)","If re-bootstrap is truly required, clear all users first, then call initAdminUser"],"exampleFix":"// before\nawait service.initAdminUser({ username: 'admin', user_key: key }); // throws already_initialized\n// after\nif ((await service.getUserById('admin')) === null) {\n  await service.initAdminUser({ username: 'admin', user_key: key });\n}","handlingStrategy":"try-catch","validationCode":"const existingUsers = await store.countUsers();\nif (existingUsers > 0) return; // already bootstrapped, skip init-admin","typeGuard":null,"tryCatchPattern":"try {\n  await svc.initAdminUser(input);\n} catch (e) {\n  if (e instanceof MetadataError && e.code === 'already_initialized') {\n    // normal on re-run; treat as success\n  } else throw e;\n}","preventionTips":["Run init-admin only as a one-time bootstrap step","Make bootstrap scripts idempotent by ignoring already_initialized","Never point init scripts at shared production databases"],"tags":["bootstrap","init","idempotency"],"backgroundTag":"already-initialized","analyzedSha":"3efcd317b84146d6a08518ac0f7ee7c8a8d200ec","analyzedAt":"2026-09-01T05:44:22.276Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}