{"record":{"id":"062a8d3ee469b4b1","repo":"TencentCloud/TencentDB-Agent-Memory","slug":"tag-tcvdb-backend-requires-tcvdb-database-ple","errorCode":null,"errorMessage":"${TAG} TCVDB backend requires tcvdb.database — please set a unique database name in your openclaw.json plugin config","messagePattern":"(.+?) TCVDB backend requires tcvdb\\.database — please set a unique database name in your openclaw\\.json plugin config","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"MemoryCore/src/core/store/factory.ts","lineNumber":61,"sourceCode":" * @param options.logger     Logger instance.\n */\nexport function createStoreBundle(\n  config: MemoryTdaiConfig,\n  options: { dataDir: string; logger?: StoreLogger },\n): StoreBundle {\n  const { logger } = options;\n\n  // ── BM25 local encoder ──\n  const bm25Encoder = createBM25Encoder(config.bm25, logger);\n\n  switch (config.storeBackend) {\n    case \"tcvdb\": {\n      const tcvdbCfg = config.tcvdb;\n      if (!tcvdbCfg.url || !tcvdbCfg.apiKey) {\n        throw new Error(`${TAG} TCVDB backend requires tcvdb.url and tcvdb.apiKey`);\n      }\n      if (!tcvdbCfg.database) {\n        throw new Error(`${TAG} TCVDB backend requires tcvdb.database — please set a unique database name in your openclaw.json plugin config`);\n      }\n      const database = tcvdbCfg.database;\n\n      const store = new TcvdbMemoryStore({\n        url: tcvdbCfg.url,\n        username: tcvdbCfg.username,\n        apiKey: tcvdbCfg.apiKey,\n        database,\n        embeddingEnabled: tcvdbCfg.embeddingEnabled,\n        embeddingModel: tcvdbCfg.embeddingModel,\n        timeout: tcvdbCfg.timeout,\n        caPemPath: tcvdbCfg.caPemPath,\n        logger,\n        bm25Encoder: bm25Encoder ?? undefined,\n      });\n\n      logger?.debug?.(\n        `${TAG} Store created: backend=tcvdb, database=${database}, ` +","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/TencentCloud/TencentDB-Agent-Memory/blob/3efcd317b84146d6a08518ac0f7ee7c8a8d200ec/MemoryCore/src/core/store/factory.ts#L43-L79","documentation":"For isolation, each TCVDB backend instance must target a unique database name. createStoreBundle requires tcvdb.database after checking url/apiKey and throws this error if it is missing, telling the user exactly where to set it.","triggerScenarios":"createStoreBundle/bundle with storeBackend 'tcvdb', url and apiKey set, but config.tcvdb.database undefined or empty.","commonSituations":"Adding TCVDB credentials but forgetting the database field, upgrading to a version that started requiring database for isolation, sharing one database name across environments by accident (the error exists to prevent that).","solutions":["Add a unique tcvdb.database value in openclaw.json plugin config","Use distinct database names per environment/team to avoid cross-isolation of memories","Re-run after confirming the config file actually reloaded"],"exampleFix":"// before\n{ \"tcvdb\": { \"url\": \"https://tcvdb.example.com\", \"apiKey\": \"<key>\" } }\n// after\n{ \"tcvdb\": { \"url\": \"https://tcvdb.example.com\", \"apiKey\": \"<key>\", \"database\": \"memory-prod-team-a\" } }","handlingStrategy":"validation","validationCode":"if (config.storeBackend === 'tcvdb' && !config.tcvdb?.database) {\n  throw new Error('tcvdb.database is required — set a unique database name in openclaw.json');\n}","typeGuard":"function hasTcvdbDatabase(c): c is typeof c & { tcvdb: { database: string } } {\n  return typeof c?.tcvdb?.database === 'string' && c.tcvdb.database.trim().length > 0;\n}","tryCatchPattern":"try {\n  bundle = createStoreBundle(config, logger);\n} catch (e) {\n  if (String(e.message).includes('tcvdb.database')) {\n    throw new ConfigError('Add tcvdb.database to openclaw.json plugin config');\n  }\n  throw e;\n}","preventionTips":["Use distinct database names per environment/team in config templates","Include tcvdb.database in your config schema with required:true","Document the isolation implications of sharing a database name"],"tags":["configuration","database","tcvdb","isolation"],"backgroundTag":"missing-config-field","analyzedSha":"3efcd317b84146d6a08518ac0f7ee7c8a8d200ec","analyzedAt":"2026-09-01T05:44:22.276Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}