- 導入 Prisma 7.9.1 + SQLite(better-sqlite3 driver adapter),prisma.config.ts 管理連線設定 - 完整資料模型:User/Work/Character/CharacterAlias/EpisodicMemory/SemanticMemory/ ProceduralRule/EmotionState/Relationship/SentimentLedgerEntry - packages/db:Prisma Client 存取層(ESM,因 Prisma 7 產出的 generated client 僅支援 ESM) - apps/api 隨之改為 ESM 以相容 packages/db - packages/shared:新增角色/記憶/情緒/關係共用型別,api 與 web 皆從此匯入 - prisma/seed.ts:建立測試使用者與元氣型測試角色,含完整關係帳本與記憶種子資料 - apps/api:新增 GET /characters - scripts/smoke/B.mjs:驗證資料表齊全、API 讀出種子角色、關係與記憶可寫入讀出 - 保留 Prisma 官方隨 CLI 附的 agent skill 文件(.agents/skills 等),供後續群組查閱 npm run restart && npm run smoke -- B 皆通過(B-V),A 群組冒煙測試無回歸。
134 lines
4.8 KiB
SQL
134 lines
4.8 KiB
SQL
-- CreateTable
|
|
CREATE TABLE "users" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"name" TEXT NOT NULL,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" DATETIME NOT NULL
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "works" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"title" TEXT NOT NULL,
|
|
"volumeProgress" TEXT,
|
|
"worldview" TEXT,
|
|
"progressAnchor" TEXT,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" DATETIME NOT NULL
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "characters" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"workId" TEXT,
|
|
"source" TEXT NOT NULL,
|
|
"buildStatus" TEXT NOT NULL DEFAULT 'CANDIDATE',
|
|
"basicInfo" TEXT NOT NULL,
|
|
"backgroundStory" TEXT NOT NULL,
|
|
"personalityArchetype" TEXT NOT NULL,
|
|
"likesDislikes" TEXT NOT NULL,
|
|
"goalsObsessions" TEXT NOT NULL,
|
|
"speechStyle" TEXT NOT NULL,
|
|
"initialRelationValue" TEXT,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" DATETIME NOT NULL,
|
|
CONSTRAINT "characters_workId_fkey" FOREIGN KEY ("workId") REFERENCES "works" ("id") ON DELETE SET NULL ON UPDATE CASCADE
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "character_aliases" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"characterId" TEXT NOT NULL,
|
|
"formalName" TEXT NOT NULL,
|
|
"nickname" TEXT,
|
|
"calledByOthers" TEXT,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT "character_aliases_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "episodic_memories" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"characterId" TEXT NOT NULL,
|
|
"content" TEXT NOT NULL,
|
|
"occurredAt" DATETIME NOT NULL,
|
|
"emotionTag" TEXT NOT NULL,
|
|
"emotionIntensity" REAL NOT NULL,
|
|
"retrievalCount" INTEGER NOT NULL DEFAULT 0,
|
|
"lastRetrievedAt" DATETIME,
|
|
"source" TEXT NOT NULL,
|
|
"weight" REAL NOT NULL DEFAULT 1,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT "episodic_memories_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "semantic_memories" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"characterId" TEXT NOT NULL,
|
|
"fact" TEXT NOT NULL,
|
|
"about" TEXT NOT NULL,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT "semantic_memories_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "procedural_rules" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"characterId" TEXT NOT NULL,
|
|
"situation" TEXT NOT NULL,
|
|
"responsePattern" TEXT NOT NULL,
|
|
"weight" REAL NOT NULL DEFAULT 1,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" DATETIME NOT NULL,
|
|
CONSTRAINT "procedural_rules_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "emotion_states" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"characterId" TEXT NOT NULL,
|
|
"calm" REAL NOT NULL DEFAULT 100,
|
|
"joy" REAL NOT NULL DEFAULT 0,
|
|
"sad" REAL NOT NULL DEFAULT 0,
|
|
"alert" REAL NOT NULL DEFAULT 0,
|
|
"shy" REAL NOT NULL DEFAULT 0,
|
|
"grumpy" REAL NOT NULL DEFAULT 0,
|
|
"updatedAt" DATETIME NOT NULL,
|
|
CONSTRAINT "emotion_states_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "relationships" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"characterId" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"intimacy" INTEGER NOT NULL DEFAULT 0,
|
|
"trust" INTEGER NOT NULL DEFAULT 0,
|
|
"firstMet" DATETIME,
|
|
"lastInteraction" DATETIME,
|
|
"interactionCount" INTEGER NOT NULL DEFAULT 0,
|
|
"stage" TEXT NOT NULL DEFAULT 'STRANGER',
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" DATETIME NOT NULL,
|
|
CONSTRAINT "relationships_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
|
|
CONSTRAINT "relationships_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "sentiment_ledger_entries" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"relationshipId" TEXT NOT NULL,
|
|
"date" DATETIME NOT NULL,
|
|
"event" TEXT NOT NULL,
|
|
"weight" REAL NOT NULL,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT "sentiment_ledger_entries_relationshipId_fkey" FOREIGN KEY ("relationshipId") REFERENCES "relationships" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "emotion_states_characterId_key" ON "emotion_states"("characterId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "relationships_characterId_userId_key" ON "relationships"("characterId", "userId");
|