feat: guided light meditation + Edge TTS neural voice audio
- Add continuous guided light-body-scan meditation (16 segments, 97% coverage) - Edge TTS API endpoint with Xiaoxiao neural voice at -40% rate - Pre-generated chime WAVs and guidance MP3s in public/audio/ - Mute toggle in practice page, sequenced non-overlapping audio - Fix middleware to serve /audio and /api/audio/tts without auth - All LLM output localized to Chinese; fix blank home/settings pages - DeepSeek API compat: json_object, increased max_tokens - Analytics, cron reminders, onboarding flow fixes Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
00db3f6c96
commit
6530b20172
@@ -0,0 +1,111 @@
|
||||
-- CreateTable
|
||||
CREATE TABLE "users" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"email" TEXT NOT NULL,
|
||||
"password_hash" TEXT,
|
||||
"created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "user_states" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"user_id" TEXT NOT NULL,
|
||||
"attention_level" INTEGER NOT NULL DEFAULT 50,
|
||||
"emotion_stability" INTEGER NOT NULL DEFAULT 50,
|
||||
"stress_level" INTEGER NOT NULL DEFAULT 50,
|
||||
"practice_stage" INTEGER NOT NULL DEFAULT 0,
|
||||
"consistency_score" INTEGER NOT NULL DEFAULT 0,
|
||||
"streak_days" INTEGER NOT NULL DEFAULT 0,
|
||||
"total_sessions_completed" INTEGER NOT NULL DEFAULT 0,
|
||||
"onboarding_completed" BOOLEAN NOT NULL DEFAULT false,
|
||||
"onboarding_variant" TEXT,
|
||||
"timezone" TEXT NOT NULL DEFAULT 'Asia/Shanghai',
|
||||
"last_session_date" DATETIME,
|
||||
"updated_at" DATETIME NOT NULL,
|
||||
CONSTRAINT "user_states_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "analytics_events" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"user_id" TEXT NOT NULL,
|
||||
"event" TEXT NOT NULL,
|
||||
"metadata" TEXT NOT NULL DEFAULT '{}',
|
||||
"created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "sessions" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"user_id" TEXT NOT NULL,
|
||||
"task_type" TEXT NOT NULL,
|
||||
"task_description" TEXT NOT NULL,
|
||||
"duration_seconds" INTEGER NOT NULL DEFAULT 300,
|
||||
"completed" BOOLEAN NOT NULL DEFAULT false,
|
||||
"focus_score" INTEGER,
|
||||
"emotion_score" INTEGER,
|
||||
"notes" TEXT,
|
||||
"created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT "sessions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "tasks" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"user_id" TEXT NOT NULL,
|
||||
"type" TEXT NOT NULL,
|
||||
"difficulty" INTEGER NOT NULL DEFAULT 1,
|
||||
"duration" INTEGER NOT NULL DEFAULT 5,
|
||||
"description" TEXT NOT NULL,
|
||||
"reason_json" TEXT NOT NULL DEFAULT '{}',
|
||||
"status" TEXT NOT NULL DEFAULT 'pending',
|
||||
"created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT "tasks_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "reward_events" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"user_id" TEXT NOT NULL,
|
||||
"type" TEXT NOT NULL,
|
||||
"message" TEXT NOT NULL,
|
||||
"created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT "reward_events_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "weekly_summaries" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"user_id" TEXT NOT NULL,
|
||||
"summary" TEXT,
|
||||
"week_start" DATETIME NOT NULL,
|
||||
"created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT "weekly_summaries_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "user_states_user_id_key" ON "user_states"("user_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "analytics_events_user_id_created_at_idx" ON "analytics_events"("user_id", "created_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "analytics_events_event_created_at_idx" ON "analytics_events"("event", "created_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "sessions_user_id_created_at_idx" ON "sessions"("user_id", "created_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "tasks_user_id_created_at_idx" ON "tasks"("user_id", "created_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "tasks_user_id_status_idx" ON "tasks"("user_id", "status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "reward_events_user_id_created_at_idx" ON "reward_events"("user_id", "created_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "weekly_summaries_user_id_key" ON "weekly_summaries"("user_id");
|
||||
@@ -0,0 +1,3 @@
|
||||
# Please do not edit this file manually
|
||||
# It should be added in your version-control system (e.g., Git)
|
||||
provider = "sqlite"
|
||||
@@ -57,6 +57,8 @@ model UserState {
|
||||
streakDays Int @default(0) @map("streak_days")
|
||||
totalSessionsCompleted Int @default(0) @map("total_sessions_completed")
|
||||
onboardingCompleted Boolean @default(false) @map("onboarding_completed")
|
||||
onboardingVariant String? @map("onboarding_variant")
|
||||
timezone String @default("Asia/Shanghai")
|
||||
lastSessionDate DateTime? @map("last_session_date")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
|
||||
@@ -65,6 +67,18 @@ model UserState {
|
||||
@@map("user_states")
|
||||
}
|
||||
|
||||
model AnalyticsEvent {
|
||||
id String @id @default(uuid())
|
||||
userId String @map("user_id")
|
||||
event String
|
||||
metadata String @default("{}")
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
|
||||
@@index([userId, createdAt])
|
||||
@@index([event, createdAt])
|
||||
@@map("analytics_events")
|
||||
}
|
||||
|
||||
model Session {
|
||||
id String @id @default(uuid())
|
||||
userId String @map("user_id")
|
||||
|
||||
Reference in New Issue
Block a user