3c9b65d982
- Nuxt 4 + Nuxt UI 4 + AI SDK 7 + Drizzle/SQLite - 主编规划大纲与章节简报、选派作家;作家流式写入章节文件并实时推送前端 - 逐章确认模式(默认)与自动模式;摘要与故事记忆 - 酒馆角色卡(PNG/JSON,V1-V3)与世界书导入 - 自定义最高优先级系统提示词、审稿/修改/多版本、任务日志与提示词检视 - 模拟 LLM 服务与端到端测试脚本 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
59 lines
2.8 KiB
TypeScript
59 lines
2.8 KiB
TypeScript
import { and, asc, eq } from 'drizzle-orm'
|
|
|
|
export type ProjectRow = typeof tables.projects.$inferSelect
|
|
export type CharacterRow = typeof tables.characters.$inferSelect
|
|
export type LoreRow = typeof tables.loreEntries.$inferSelect
|
|
export type AgentRow = typeof tables.agents.$inferSelect
|
|
export type ChapterRow = typeof tables.chapters.$inferSelect
|
|
export type VersionRow = typeof tables.chapterVersions.$inferSelect
|
|
export type ModelRow = typeof tables.models.$inferSelect
|
|
|
|
export function getProject(projectId: string): ProjectRow {
|
|
const p = useDb().select().from(tables.projects).where(eq(tables.projects.id, projectId)).get()
|
|
if (!p) throw createError({ statusCode: 404, message: '项目不存在' })
|
|
return p
|
|
}
|
|
|
|
export function getChapter(chapterId: string): ChapterRow {
|
|
const c = useDb().select().from(tables.chapters).where(eq(tables.chapters.id, chapterId)).get()
|
|
if (!c) throw createError({ statusCode: 404, message: '章节不存在' })
|
|
return c
|
|
}
|
|
|
|
export function getAgent(agentId: string | null | undefined): AgentRow | undefined {
|
|
if (!agentId) return undefined
|
|
return useDb().select().from(tables.agents).where(eq(tables.agents.id, agentId)).get()
|
|
}
|
|
|
|
export function getRoleAgent(projectId: string, role: 'editor' | 'summarizer'): AgentRow | undefined {
|
|
return useDb().select().from(tables.agents)
|
|
.where(and(eq(tables.agents.projectId, projectId), eq(tables.agents.role, role)))
|
|
.get()
|
|
}
|
|
|
|
export function listChapters(projectId: string) {
|
|
return useDb().select().from(tables.chapters).where(eq(tables.chapters.projectId, projectId)).orderBy(asc(tables.chapters.index)).all()
|
|
}
|
|
|
|
export function getVersion(versionId: string | null | undefined): VersionRow | undefined {
|
|
if (!versionId) return undefined
|
|
return useDb().select().from(tables.chapterVersions).where(eq(tables.chapterVersions.id, versionId)).get()
|
|
}
|
|
|
|
/** 一次性加载生成提示词所需的全部项目数据 */
|
|
export function loadProjectContext(projectId: string) {
|
|
const db = useDb()
|
|
const project = getProject(projectId)
|
|
return {
|
|
project,
|
|
characters: db.select().from(tables.characters).where(eq(tables.characters.projectId, projectId)).orderBy(asc(tables.characters.sortOrder), asc(tables.characters.createdAt)).all(),
|
|
lore: db.select().from(tables.loreEntries).where(eq(tables.loreEntries.projectId, projectId)).orderBy(asc(tables.loreEntries.sortOrder)).all(),
|
|
agents: db.select().from(tables.agents).where(eq(tables.agents.projectId, projectId)).orderBy(asc(tables.agents.createdAt)).all(),
|
|
chapters: listChapters(projectId),
|
|
models: db.select({ id: tables.models.id, label: tables.models.label, modelId: tables.models.modelId, providerName: tables.providers.name })
|
|
.from(tables.models).innerJoin(tables.providers, eq(tables.models.providerId, tables.providers.id)).all()
|
|
}
|
|
}
|
|
|
|
export type ProjectContext = ReturnType<typeof loadProjectContext>
|