feat(遊戲化): 新增大廳、附身、時間流、後日談進度等遊戲化系統功能
新增角色大廳(lobby)邀約與通話、附身(possession)、時鐘(clock)抽象、 時間流與睡眠負債、後日談進度、行為選擇與旁觀反應等模組,並補齊對應冒煙 測試(R~V)與單元測試;同步調整 web/mobile 對應頁面與元件。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,159 @@
|
||||
-- CreateTable
|
||||
CREATE TABLE "rooms" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"userId" TEXT NOT NULL,
|
||||
"mode" TEXT NOT NULL,
|
||||
"status" TEXT NOT NULL DEFAULT 'ACTIVE',
|
||||
"topicSeed" TEXT,
|
||||
"autoAdvanceEnabled" BOOLEAN NOT NULL DEFAULT true,
|
||||
"muted" BOOLEAN NOT NULL DEFAULT false,
|
||||
"lastAdvancedAt" DATETIME,
|
||||
"closedAt" DATETIME,
|
||||
"closeReason" TEXT,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "rooms_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "room_members" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"roomId" TEXT NOT NULL,
|
||||
"characterId" TEXT NOT NULL,
|
||||
"activeCharacterId" TEXT,
|
||||
"joinedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"leftAt" DATETIME,
|
||||
"leaveReason" TEXT,
|
||||
CONSTRAINT "room_members_roomId_fkey" FOREIGN KEY ("roomId") REFERENCES "rooms" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "room_members_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "room_turns" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"roomId" TEXT NOT NULL,
|
||||
"seq" INTEGER NOT NULL,
|
||||
"kind" TEXT NOT NULL DEFAULT 'TALK',
|
||||
"speakerCharacterId" TEXT,
|
||||
"content" TEXT NOT NULL,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT "room_turns_roomId_fkey" FOREIGN KEY ("roomId") REFERENCES "rooms" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "room_turns_speakerCharacterId_fkey" FOREIGN KEY ("speakerCharacterId") REFERENCES "characters" ("id") ON DELETE SET NULL ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "room_read_states" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"roomId" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"lastReadSeq" INTEGER NOT NULL DEFAULT 0,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "room_read_states_roomId_fkey" FOREIGN KEY ("roomId") REFERENCES "rooms" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "room_read_states_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "room_usage_logs" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"roomId" TEXT NOT NULL,
|
||||
"model" TEXT NOT NULL,
|
||||
"promptTokens" INTEGER NOT NULL,
|
||||
"completionTokens" INTEGER NOT NULL,
|
||||
"turnSeq" INTEGER NOT NULL,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT "room_usage_logs_roomId_fkey" FOREIGN KEY ("roomId") REFERENCES "rooms" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "call_attempt_logs" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"userId" TEXT NOT NULL,
|
||||
"characterId" TEXT NOT NULL,
|
||||
"accepted" BOOLEAN NOT NULL,
|
||||
"reason" TEXT,
|
||||
"delegatedByCharacterId" TEXT,
|
||||
"resultingRoomId" TEXT,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT "call_attempt_logs_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "call_attempt_logs_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "call_attempt_logs_delegatedByCharacterId_fkey" FOREIGN KEY ("delegatedByCharacterId") REFERENCES "characters" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
|
||||
CONSTRAINT "call_attempt_logs_resultingRoomId_fkey" FOREIGN KEY ("resultingRoomId") REFERENCES "rooms" ("id") ON DELETE SET NULL ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "room_invitations" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"roomId" TEXT NOT NULL,
|
||||
"characterId" TEXT NOT NULL,
|
||||
"invitedByCharacterId" TEXT,
|
||||
"status" TEXT NOT NULL DEFAULT 'PENDING',
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"respondedAt" DATETIME,
|
||||
CONSTRAINT "room_invitations_roomId_fkey" FOREIGN KEY ("roomId") REFERENCES "rooms" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "room_invitations_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "room_invitations_invitedByCharacterId_fkey" FOREIGN KEY ("invitedByCharacterId") REFERENCES "characters" ("id") ON DELETE SET NULL ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "ending_detection_logs" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"sceneId" TEXT NOT NULL,
|
||||
"evidence" TEXT NOT NULL,
|
||||
"resolution" TEXT NOT NULL DEFAULT 'PENDING',
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"respondedAt" DATETIME,
|
||||
CONSTRAINT "ending_detection_logs_sceneId_fkey" FOREIGN KEY ("sceneId") REFERENCES "scenes" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "character_emotion_baselines" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"characterId" TEXT NOT NULL,
|
||||
"emotionTag" TEXT NOT NULL,
|
||||
"intensity" REAL NOT NULL,
|
||||
"sourceSceneId" TEXT,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT "character_emotion_baselines_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "character_emotion_baselines_sourceSceneId_fkey" FOREIGN KEY ("sourceSceneId") REFERENCES "scenes" ("id") ON DELETE SET NULL ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- RedefineTables
|
||||
PRAGMA defer_foreign_keys=ON;
|
||||
PRAGMA foreign_keys=OFF;
|
||||
CREATE TABLE "new_tasks" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"characterId" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"type" TEXT NOT NULL,
|
||||
"content" TEXT NOT NULL,
|
||||
"rawText" TEXT NOT NULL,
|
||||
"triggerAt" DATETIME,
|
||||
"cronExpression" TEXT,
|
||||
"condition" TEXT,
|
||||
"status" TEXT NOT NULL DEFAULT 'PENDING',
|
||||
"triggeredAt" DATETIME,
|
||||
"triggerMessage" TEXT,
|
||||
"overdueNudgeCount" INTEGER NOT NULL DEFAULT 0,
|
||||
"lastNudgeAt" DATETIME,
|
||||
"sourceRoomId" TEXT,
|
||||
"completedAt" DATETIME,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "tasks_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "tasks_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "tasks_sourceRoomId_fkey" FOREIGN KEY ("sourceRoomId") REFERENCES "rooms" ("id") ON DELETE SET NULL ON UPDATE CASCADE
|
||||
);
|
||||
INSERT INTO "new_tasks" ("characterId", "completedAt", "condition", "content", "createdAt", "cronExpression", "id", "lastNudgeAt", "overdueNudgeCount", "rawText", "status", "triggerAt", "triggerMessage", "triggeredAt", "type", "updatedAt", "userId") SELECT "characterId", "completedAt", "condition", "content", "createdAt", "cronExpression", "id", "lastNudgeAt", "overdueNudgeCount", "rawText", "status", "triggerAt", "triggerMessage", "triggeredAt", "type", "updatedAt", "userId" FROM "tasks";
|
||||
DROP TABLE "tasks";
|
||||
ALTER TABLE "new_tasks" RENAME TO "tasks";
|
||||
PRAGMA foreign_keys=ON;
|
||||
PRAGMA defer_foreign_keys=OFF;
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "room_members_activeCharacterId_key" ON "room_members"("activeCharacterId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "room_turns_roomId_seq_key" ON "room_turns"("roomId", "seq");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "room_read_states_roomId_userId_key" ON "room_read_states"("roomId", "userId");
|
||||
Reference in New Issue
Block a user