@whispering233/ai-editor-db 0.0.54 → 0.0.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/migrations/009_decompose.d.ts.map +1 -1
- package/dist/migrations/009_decompose.js +4 -5
- package/dist/migrations/009_decompose.js.map +1 -1
- package/dist/migrations/010_decompose_concurrency.d.ts +4 -0
- package/dist/migrations/010_decompose_concurrency.d.ts.map +1 -0
- package/dist/migrations/010_decompose_concurrency.js +31 -0
- package/dist/migrations/010_decompose_concurrency.js.map +1 -0
- package/dist/migrations/011_drop_decompose.d.ts +4 -0
- package/dist/migrations/011_drop_decompose.d.ts.map +1 -0
- package/dist/migrations/011_drop_decompose.js +24 -0
- package/dist/migrations/011_drop_decompose.js.map +1 -0
- package/dist/migrations/index.d.ts +2 -1
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +11 -3
- package/dist/migrations/index.js.map +1 -1
- package/dist/schema.d.ts +5 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +5 -1
- package/dist/schema.js.map +1 -1
- package/dist/tables.d.ts +1 -356
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +2 -59
- package/dist/tables.js.map +1 -1
- package/package.json +2 -2
- package/dist/queries/decompose.d.ts +0 -144
- package/dist/queries/decompose.d.ts.map +0 -1
- package/dist/queries/decompose.js +0 -310
- package/dist/queries/decompose.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"decompose.d.ts","sourceRoot":"","sources":["../../src/queries/decompose.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,310 +0,0 @@
|
|
|
1
|
-
// @whispering233/ai-editor-db 拆解小说 job / 批读写(卡 21.3)
|
|
2
|
-
//
|
|
3
|
-
// 契约:docs/db/schema.md「decompose_jobs / decompose_batches」(两表 DDL + 不变式表)、
|
|
4
|
-
// docs/design/60-decompose.md §7(状态机与续拆)、§6.1(merge_written 三路比对)。
|
|
5
|
-
// - **库写入唯一入口 = 本模块**(禁止绕过直接写表);查询经 queryDb 取 drizzle 实例。
|
|
6
|
-
// - JSON 列(chapter_ids / result / merge_written)保持 **text 模式**,行映射层防御解析
|
|
7
|
-
// (坏行 → 空数组 / null,与 entity.ts parseDataColumn 同口径)——坏 JSON 不得打挂查询。
|
|
8
|
-
// - 时间约定:ISO 8601 应用层写入(`now` 由调用方传入,模块内不生成时间)。
|
|
9
|
-
// - 状态字面量单一来源 = shared API 契约(`DecomposeJobRes` / `DecomposeBatchRes` 的状态投影),
|
|
10
|
-
// 本模块不复抄清单、DDL 也不加 CHECK。
|
|
11
|
-
// - 批行只由本模块写;批结果(`result`)是 S2 的暂存中间产物,业务表只由 S3 写。
|
|
12
|
-
import { generateId } from "@whispering233/ai-editor-shared";
|
|
13
|
-
import { and, asc, desc, eq, sql } from "drizzle-orm";
|
|
14
|
-
import { withTransaction } from "../connection.js";
|
|
15
|
-
import { queryDb } from "../query-db.js";
|
|
16
|
-
import { decomposeBatches, decomposeJobs } from "../tables.js";
|
|
17
|
-
/** job id 前缀(api-public id 约定 `{前缀}-{nanoid}`;job 用 `job-`) */
|
|
18
|
-
export const DECOMPOSE_JOB_ID_PREFIX = "job-";
|
|
19
|
-
// ============ 行映射(JSON 列防御解析) ============
|
|
20
|
-
/** 解析 JSON 字符串数组(坏 JSON / 非数组 / 非字符串项 → 丢弃,返回空数组) */
|
|
21
|
-
function parseStringArray(value) {
|
|
22
|
-
if (typeof value !== "string")
|
|
23
|
-
return [];
|
|
24
|
-
try {
|
|
25
|
-
const parsed = JSON.parse(value);
|
|
26
|
-
return Array.isArray(parsed) ? parsed.filter((item) => typeof item === "string") : [];
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
return [];
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/** 单项形状守卫(坏清单项丢弃,不阻断整行读取) */
|
|
33
|
-
function isMergeWrittenEntry(value) {
|
|
34
|
-
if (typeof value !== "object" || value === null)
|
|
35
|
-
return false;
|
|
36
|
-
const entry = value;
|
|
37
|
-
return typeof entry.id === "string" && typeof entry.type === "string" && typeof entry.updated_at === "string";
|
|
38
|
-
}
|
|
39
|
-
/** 解析 merge_written 清单(坏 JSON / 非数组 → 空数组 = 从未归并) */
|
|
40
|
-
function parseMergeWritten(value) {
|
|
41
|
-
if (typeof value !== "string")
|
|
42
|
-
return [];
|
|
43
|
-
try {
|
|
44
|
-
const parsed = JSON.parse(value);
|
|
45
|
-
return Array.isArray(parsed) ? parsed.filter(isMergeWrittenEntry) : [];
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
return [];
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* 解析批抽取结果(坏 JSON / 非对象 → null = 未完成)。
|
|
53
|
-
* 形状校验归 server 的抽取层(模型原始输出在落库前已归一),本包只保证**坏 JSON 不抛错**。
|
|
54
|
-
*/
|
|
55
|
-
function parseBatchResult(value) {
|
|
56
|
-
if (typeof value !== "string")
|
|
57
|
-
return null;
|
|
58
|
-
try {
|
|
59
|
-
const parsed = JSON.parse(value);
|
|
60
|
-
return typeof parsed === "object" && parsed !== null ? parsed : null;
|
|
61
|
-
}
|
|
62
|
-
catch {
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
/** 行 → job 行(坏 JSON 防御见 parseMergeWritten) */
|
|
67
|
-
function toJobRow(row) {
|
|
68
|
-
return {
|
|
69
|
-
id: row.id,
|
|
70
|
-
status: row.status,
|
|
71
|
-
scope_start: row.scope_start,
|
|
72
|
-
scope_end: row.scope_end,
|
|
73
|
-
batch_target_chars: row.batch_target_chars,
|
|
74
|
-
model: row.model ?? null,
|
|
75
|
-
merge_written: parseMergeWritten(row.merge_written),
|
|
76
|
-
error: row.error ?? null,
|
|
77
|
-
created_at: row.created_at,
|
|
78
|
-
updated_at: row.updated_at,
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
/** 行 → 批行(不含 result) */
|
|
82
|
-
function toBatchRow(row) {
|
|
83
|
-
return {
|
|
84
|
-
job_id: row.job_id,
|
|
85
|
-
seq: row.seq,
|
|
86
|
-
chapter_ids: parseStringArray(row.chapter_ids),
|
|
87
|
-
status: row.status,
|
|
88
|
-
attempts: row.attempts,
|
|
89
|
-
error: row.error ?? null,
|
|
90
|
-
updated_at: row.updated_at,
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
// ============ job ============
|
|
94
|
-
/**
|
|
95
|
-
* 创建 job 并落全部批行(S1 的组批结果)——**同一事务**:job 与批规划要么同时存在,要么都不存在。
|
|
96
|
-
* job 初始状态 = `pending`(启动 = `updateJobStatus(status='running')`);
|
|
97
|
-
* 批行初始状态 = `pending`、`attempts = 0`、`result = NULL`。
|
|
98
|
-
*
|
|
99
|
-
* @returns 落库后的 job 行(id 由本模块生成,`job-` 前缀 + nanoid)
|
|
100
|
-
*/
|
|
101
|
-
export function createDecomposeJob(db, input) {
|
|
102
|
-
const id = generateId(DECOMPOSE_JOB_ID_PREFIX);
|
|
103
|
-
withTransaction(db, () => {
|
|
104
|
-
const q = queryDb(db);
|
|
105
|
-
q.insert(decomposeJobs)
|
|
106
|
-
.values({
|
|
107
|
-
id,
|
|
108
|
-
status: "pending",
|
|
109
|
-
scope_start: input.scopeStart,
|
|
110
|
-
scope_end: input.scopeEnd,
|
|
111
|
-
batch_target_chars: input.batchTargetChars,
|
|
112
|
-
model: input.model,
|
|
113
|
-
merge_written: null,
|
|
114
|
-
error: null,
|
|
115
|
-
created_at: input.now,
|
|
116
|
-
updated_at: input.now,
|
|
117
|
-
})
|
|
118
|
-
.run();
|
|
119
|
-
if (input.batches.length > 0) {
|
|
120
|
-
q.insert(decomposeBatches)
|
|
121
|
-
.values(input.batches.map((batch) => ({
|
|
122
|
-
job_id: id,
|
|
123
|
-
seq: batch.seq,
|
|
124
|
-
chapter_ids: JSON.stringify(batch.chapterIds),
|
|
125
|
-
status: "pending",
|
|
126
|
-
result: null,
|
|
127
|
-
attempts: 0,
|
|
128
|
-
error: null,
|
|
129
|
-
updated_at: input.now,
|
|
130
|
-
})))
|
|
131
|
-
.run();
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
const row = selectJobRow(db, id);
|
|
135
|
-
if (row === null)
|
|
136
|
-
throw new Error(`createDecomposeJob: job ${id} 落库后读取失败`);
|
|
137
|
-
return row;
|
|
138
|
-
}
|
|
139
|
-
/** 按 id 读 job 行(内部:创建后回读) */
|
|
140
|
-
function selectJobRow(db, jobId) {
|
|
141
|
-
const row = queryDb(db).select().from(decomposeJobs).where(eq(decomposeJobs.id, jobId)).get();
|
|
142
|
-
return row === undefined ? null : toJobRow(row);
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* 读当前项目的 job(进度轮询、端点解析用)。
|
|
146
|
-
* 一项目一 job 是业务层不变式(`docs/db/schema.md`);多行时取最新创建的一条。
|
|
147
|
-
* @returns 行对象;从未开始拆解 → null(端点侧 404 `DECOMPOSE_JOB_NOT_FOUND`)
|
|
148
|
-
*/
|
|
149
|
-
export function getDecomposeJob(db) {
|
|
150
|
-
const row = queryDb(db)
|
|
151
|
-
.select()
|
|
152
|
-
.from(decomposeJobs)
|
|
153
|
-
.orderBy(desc(decomposeJobs.created_at), desc(decomposeJobs.id))
|
|
154
|
-
.limit(1)
|
|
155
|
-
.get();
|
|
156
|
-
return row === undefined ? null : toJobRow(row);
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* 读**全部** job 行(创建时间升序,同时间按 id)——S3 三路比对的**跨轮 baseline** 面:
|
|
160
|
-
* 「历史全部 job 的 `merge_written` 并集(同一 id 取最新一次记录的时间戳)」按此顺序覆盖取并
|
|
161
|
-
* (`docs/design/60-decompose.md` §6.1)。
|
|
162
|
-
*/
|
|
163
|
-
export function listDecomposeJobs(db) {
|
|
164
|
-
const rows = queryDb(db)
|
|
165
|
-
.select()
|
|
166
|
-
.from(decomposeJobs)
|
|
167
|
-
.orderBy(asc(decomposeJobs.created_at), asc(decomposeJobs.id))
|
|
168
|
-
.all();
|
|
169
|
-
return rows.map(toJobRow);
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* job 状态流转(pending → running → paused/done/failed;前置状态校验归端点/runner,
|
|
173
|
-
* 状态字面量集见 `DecomposeJobStatus`)。同时推进 `updated_at`(进度轮询的时间戳)。
|
|
174
|
-
* @returns 影响行数(0 = job 不存在)
|
|
175
|
-
*/
|
|
176
|
-
export function updateJobStatus(db, jobId, status, now) {
|
|
177
|
-
return queryDb(db)
|
|
178
|
-
.update(decomposeJobs)
|
|
179
|
-
.set({ status, updated_at: now })
|
|
180
|
-
.where(eq(decomposeJobs.id, jobId))
|
|
181
|
-
.run().changes;
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* 写 job 级错误摘要(`null` = 清除,如续拆/重跑开工时)。
|
|
185
|
-
* @returns 影响行数(0 = job 不存在)
|
|
186
|
-
*/
|
|
187
|
-
export function setJobError(db, jobId, error, now) {
|
|
188
|
-
return queryDb(db)
|
|
189
|
-
.update(decomposeJobs)
|
|
190
|
-
.set({ error, updated_at: now })
|
|
191
|
-
.where(eq(decomposeJobs.id, jobId))
|
|
192
|
-
.run().changes;
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* **状态归一**(打开项目时调用):把残留的 `running` 改判为 `paused`——进程内已无在跑 job
|
|
196
|
-
* (服务端重启 / 进程崩溃),UI 提示「上次拆解中断,可续拆」(`docs/design/60-decompose.md` §7)。
|
|
197
|
-
*
|
|
198
|
-
* 批行不动:续拆从第一个未完成批继续,`startBatchAttempt` 对残留 `running` 批同样成立
|
|
199
|
-
* (重新计入一次尝试),无需单独归一。
|
|
200
|
-
*
|
|
201
|
-
* @returns 被归一的 job 条数(正常路径 0)
|
|
202
|
-
*/
|
|
203
|
-
export function pauseRunningJobs(db, now) {
|
|
204
|
-
return queryDb(db)
|
|
205
|
-
.update(decomposeJobs)
|
|
206
|
-
.set({ status: "paused", updated_at: now })
|
|
207
|
-
.where(eq(decomposeJobs.status, "running"))
|
|
208
|
-
.run().changes;
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* 写 `merge_written` 清单(上次归并写入的实体/关系/报告 id + 写入时 `updated_at`)——
|
|
212
|
-
* 重跑 S3 的三路比对快照(§6.1)。
|
|
213
|
-
* @returns 影响行数(0 = job 不存在)
|
|
214
|
-
*/
|
|
215
|
-
export function writeMergeWritten(db, jobId, entries, now) {
|
|
216
|
-
return queryDb(db)
|
|
217
|
-
.update(decomposeJobs)
|
|
218
|
-
.set({ merge_written: JSON.stringify(entries), updated_at: now })
|
|
219
|
-
.where(eq(decomposeJobs.id, jobId))
|
|
220
|
-
.run().changes;
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* 删除 job 及其全部批行(**同事务**;无外键,孤儿批行只能由本函数拦住)。
|
|
224
|
-
* 用于清场重来(重跑整套 / 重置拆解);删整本书走书目录删除、不经过本函数。
|
|
225
|
-
* @returns 删除的总行数(job 1 + 批 N;不存在 → 0,幂等)
|
|
226
|
-
*/
|
|
227
|
-
export function deleteDecomposeJob(db, jobId) {
|
|
228
|
-
return withTransaction(db, () => {
|
|
229
|
-
const q = queryDb(db);
|
|
230
|
-
const batches = q.delete(decomposeBatches).where(eq(decomposeBatches.job_id, jobId)).run().changes;
|
|
231
|
-
const jobs = q.delete(decomposeJobs).where(eq(decomposeJobs.id, jobId)).run().changes;
|
|
232
|
-
return jobs + batches;
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
// ============ 批 ============
|
|
236
|
-
/**
|
|
237
|
-
* 读某 job 的批列表(**不含 `result`**,按 `seq` 升序)。
|
|
238
|
-
* 列表口径投影:不 SELECT `result`——数百批 × 每条千级 token 的结果正文不得进列表响应。
|
|
239
|
-
*/
|
|
240
|
-
export function listDecomposeBatches(db, jobId) {
|
|
241
|
-
const rows = queryDb(db)
|
|
242
|
-
.select({
|
|
243
|
-
job_id: decomposeBatches.job_id,
|
|
244
|
-
seq: decomposeBatches.seq,
|
|
245
|
-
chapter_ids: decomposeBatches.chapter_ids,
|
|
246
|
-
status: decomposeBatches.status,
|
|
247
|
-
attempts: decomposeBatches.attempts,
|
|
248
|
-
error: decomposeBatches.error,
|
|
249
|
-
updated_at: decomposeBatches.updated_at,
|
|
250
|
-
})
|
|
251
|
-
.from(decomposeBatches)
|
|
252
|
-
.where(eq(decomposeBatches.job_id, jobId))
|
|
253
|
-
.orderBy(asc(decomposeBatches.seq))
|
|
254
|
-
.all();
|
|
255
|
-
return rows.map(toBatchRow);
|
|
256
|
-
}
|
|
257
|
-
/** 读单批(含 `result`)——进度页展开行时按需拉取;批序号越界 → null(端点侧 404) */
|
|
258
|
-
export function getDecomposeBatch(db, jobId, seq) {
|
|
259
|
-
const row = queryDb(db)
|
|
260
|
-
.select()
|
|
261
|
-
.from(decomposeBatches)
|
|
262
|
-
.where(and(eq(decomposeBatches.job_id, jobId), eq(decomposeBatches.seq, seq)))
|
|
263
|
-
.get();
|
|
264
|
-
if (row === undefined)
|
|
265
|
-
return null;
|
|
266
|
-
return { ...toBatchRow(row), result: parseBatchResult(row.result) };
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* 开始一次尝试:批状态 → `running`、`attempts` 自增、清上一条错误摘要。
|
|
270
|
-
* 对 `pending` / `failed` / 残留 `running` 同样成立(续拆重取同一批即新一轮尝试)。
|
|
271
|
-
* @returns 自增后的尝试序号;批不存在 → null
|
|
272
|
-
*/
|
|
273
|
-
export function startBatchAttempt(db, jobId, seq, now) {
|
|
274
|
-
return withTransaction(db, () => {
|
|
275
|
-
const q = queryDb(db);
|
|
276
|
-
const changes = q
|
|
277
|
-
.update(decomposeBatches)
|
|
278
|
-
.set({ status: "running", attempts: sql `${decomposeBatches.attempts} + 1`, error: null, updated_at: now })
|
|
279
|
-
.where(and(eq(decomposeBatches.job_id, jobId), eq(decomposeBatches.seq, seq)))
|
|
280
|
-
.run().changes;
|
|
281
|
-
if (changes === 0)
|
|
282
|
-
return null;
|
|
283
|
-
const row = q
|
|
284
|
-
.select({ attempts: decomposeBatches.attempts })
|
|
285
|
-
.from(decomposeBatches)
|
|
286
|
-
.where(and(eq(decomposeBatches.job_id, jobId), eq(decomposeBatches.seq, seq)))
|
|
287
|
-
.get();
|
|
288
|
-
return row?.attempts ?? null;
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
/** 批完成:抽取结果落库、状态 → `done`、清错误摘要 */
|
|
292
|
-
export function completeBatch(db, input) {
|
|
293
|
-
return queryDb(db)
|
|
294
|
-
.update(decomposeBatches)
|
|
295
|
-
.set({ status: "done", result: JSON.stringify(input.result), error: null, updated_at: input.now })
|
|
296
|
-
.where(and(eq(decomposeBatches.job_id, input.jobId), eq(decomposeBatches.seq, input.seq)))
|
|
297
|
-
.run().changes;
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* 批失败:状态 → `failed` + 失败摘要;`result` 置 **NULL**(契约口径「未完成 = NULL」——
|
|
301
|
-
* 重跑失败后不得留着上一轮结果冒充本批产物)。
|
|
302
|
-
*/
|
|
303
|
-
export function failBatch(db, input) {
|
|
304
|
-
return queryDb(db)
|
|
305
|
-
.update(decomposeBatches)
|
|
306
|
-
.set({ status: "failed", result: null, error: input.error, updated_at: input.now })
|
|
307
|
-
.where(and(eq(decomposeBatches.job_id, input.jobId), eq(decomposeBatches.seq, input.seq)))
|
|
308
|
-
.run().changes;
|
|
309
|
-
}
|
|
310
|
-
//# sourceMappingURL=decompose.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"decompose.js","sourceRoot":"","sources":["../../src/queries/decompose.ts"],"names":[],"mappings":"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"}
|