@whispering233/ai-editor-db 0.0.56 → 0.0.58
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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/migrations/012_practice.d.ts +4 -0
- package/dist/migrations/012_practice.d.ts.map +1 -0
- package/dist/migrations/012_practice.js +47 -0
- package/dist/migrations/012_practice.js.map +1 -0
- package/dist/migrations/013_author_practice.d.ts +4 -0
- package/dist/migrations/013_author_practice.d.ts.map +1 -0
- package/dist/migrations/013_author_practice.js +60 -0
- package/dist/migrations/013_author_practice.js.map +1 -0
- package/dist/migrations/index.d.ts +3 -1
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +14 -3
- package/dist/migrations/index.js.map +1 -1
- package/dist/queries/practice.d.ts +168 -0
- package/dist/queries/practice.d.ts.map +1 -0
- package/dist/queries/practice.js +339 -0
- package/dist/queries/practice.js.map +1 -0
- package/dist/schema.d.ts +7 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +7 -1
- package/dist/schema.js.map +1 -1
- package/dist/storage/project.d.ts +2 -0
- package/dist/storage/project.d.ts.map +1 -1
- package/dist/storage/project.js +11 -1
- package/dist/storage/project.js.map +1 -1
- package/dist/tables.d.ts +397 -1
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +70 -0
- package/dist/tables.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,4EAA4E;AAC5E,EAAE;AACF,sEAAsE;AACtE,gFAAgF;AAChF,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,4EAA4E;AAC5E,EAAE;AACF,sEAAsE;AACtE,gFAAgF;AAChF,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"012_practice.d.ts","sourceRoot":"","sources":["../../src/migrations/012_practice.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAyB5C,QAAA,MAAM,YAAY,EAAE,SAKnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// 迁移 012:练习两表——新增 practice_targets / practice_samples(2026-10)
|
|
2
|
+
//
|
|
3
|
+
// 文风仿写练习是**独立工作区**(`kind = "practice"`),数据落在专属两表(语义与不变式见
|
|
4
|
+
// docs/design/60-practice.md §3、docs/design/10-data-model.md §16)。
|
|
5
|
+
//
|
|
6
|
+
// 纯 DDL 迁移(无数据搬移):v11 库补建两张新表,既有表与数据一概不动——旧项目没有练习行,
|
|
7
|
+
// **无需回填**。本文件的 DDL 与**当时的**建库声明(`tables.ts` 的 `CREATE_TABLES_SQL`)逐字同形;
|
|
8
|
+
// 两张旧表(`practice_targets` / 旧形状 `practice_samples`)已随 013 整表拆除,当前形状见 013。
|
|
9
|
+
//
|
|
10
|
+
// 幂等:CREATE TABLE IF NOT EXISTS——手工回退版本号后重跑(异常重试路径)不报错;
|
|
11
|
+
// 正常路径由 user_version 门控(版本已到 12 不再执行)。事务由 runMigrations 保证
|
|
12
|
+
// (up + setUserVersion 原子提交)。
|
|
13
|
+
//
|
|
14
|
+
// **不再建 `idx_practice_samples_target`**(2026-10 修订):该索引服务于旧的按目标列样本,
|
|
15
|
+
// 而 013 已整表拆除旧模型(建索引语句会先于 013 执行)。保留它会与「回退版本号后重跑」冲突:
|
|
16
|
+
// v13 库(新形状的 `practice_samples`)重跑 012 时 `CREATE INDEX ... (target_id)` 报
|
|
17
|
+
// “no such column: target_id”——而索引的存在对升级链终态没有影响(013 反正要删),故直接不建。
|
|
18
|
+
/** v12 练习两表 DDL(列序与 CREATE_TABLES_SQL 一致) */
|
|
19
|
+
const PRACTICE_TABLES_DDL = `
|
|
20
|
+
CREATE TABLE IF NOT EXISTS practice_targets (
|
|
21
|
+
id TEXT PRIMARY KEY, -- 'pt-*'
|
|
22
|
+
name TEXT NOT NULL, -- 文风目标名(上限 = 当时的常量 MAX_PRACTICE_TARGET_NAME_CHARS,已随旧模型删除)
|
|
23
|
+
observation TEXT, -- 用户自己观察到的文风特点(可选;上限 = 当时的常量 MAX_PRACTICE_OBSERVATION_CHARS,已删除)
|
|
24
|
+
created_at TEXT NOT NULL, -- ISO 8601,应用层写入
|
|
25
|
+
updated_at TEXT NOT NULL
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
CREATE TABLE IF NOT EXISTS practice_samples (
|
|
29
|
+
id TEXT PRIMARY KEY, -- 'ps-*'
|
|
30
|
+
target_id TEXT NOT NULL, -- 'pt-*'(无 FK,存在性由写入侧守卫)
|
|
31
|
+
source_kind TEXT NOT NULL, -- 'paste'(MVP 唯一值,不加 CHECK)
|
|
32
|
+
source_label TEXT NOT NULL, -- 快照来源说明(用户手填)
|
|
33
|
+
text TEXT NOT NULL, -- 范文快照(不可变)
|
|
34
|
+
draft TEXT NOT NULL DEFAULT '', -- 用户仿写稿(只有用户能写)
|
|
35
|
+
feedback TEXT, -- 点评卡 JSON(AI 产出;NULL = 未点评)
|
|
36
|
+
created_at TEXT NOT NULL,
|
|
37
|
+
updated_at TEXT NOT NULL
|
|
38
|
+
);
|
|
39
|
+
`;
|
|
40
|
+
const migration012 = {
|
|
41
|
+
version: 12,
|
|
42
|
+
up(db) {
|
|
43
|
+
db.exec(PRACTICE_TABLES_DDL);
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
export default migration012;
|
|
47
|
+
//# sourceMappingURL=012_practice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"012_practice.js","sourceRoot":"","sources":["../../src/migrations/012_practice.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,EAAE;AACF,yDAAyD;AACzD,mEAAmE;AACnE,EAAE;AACF,oDAAoD;AACpD,yEAAyE;AACzE,0EAA0E;AAC1E,EAAE;AACF,wDAAwD;AACxD,2DAA2D;AAC3D,8BAA8B;AAC9B,EAAE;AACF,oEAAoE;AACpE,qDAAqD;AACrD,0EAA0E;AAC1E,iEAAiE;AAKjE,6CAA6C;AAC7C,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;CAoB3B,CAAC;AAEF,MAAM,YAAY,GAAc;IAC9B,OAAO,EAAE,EAAE;IACX,EAAE,CAAC,EAAM;QACP,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC/B,CAAC;CACF,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"013_author_practice.d.ts","sourceRoot":"","sources":["../../src/migrations/013_author_practice.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAwC5C,QAAA,MAAM,YAAY,EAAE,SAMnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// 迁移 013:作家文风练习模型重建——旧两表(practice_targets / practice_samples)换为三表
|
|
2
|
+
// (practice_samples / practice_free_pieces / practice_style_packs),2026-10
|
|
3
|
+
//
|
|
4
|
+
// 语义与不变式见 `docs/db/schema.md`「练习三表」、`docs/design/60-practice.md` §5-6:
|
|
5
|
+
// 一位预置作家 = 一个练习工作区,故旧「文风目标(practice_targets)+ 目标下 N 个样本」的
|
|
6
|
+
// 模型被整体替换——样本改为挂工作区(`work_id` 只是作品清单引用,可为 NULL),
|
|
7
|
+
// 新增自由练习篇与风格说明素材包两表。
|
|
8
|
+
//
|
|
9
|
+
// 纯 DDL 迁移(**无数据搬移**):旧行随旧表一并丢弃——旧模型的目标/样本没有对应的新归属
|
|
10
|
+
// (一个目标 ≠ 一个工作区的作家身份,无法机械映射),且练习数据是可重录的用户草稿。
|
|
11
|
+
// 顺序:drop 旧索引 → drop 旧样本表 → drop 旧目标表 → 建三张新表(幂等 DDL)。
|
|
12
|
+
//
|
|
13
|
+
// 幂等:DROP ... IF EXISTS / CREATE ... IF NOT EXISTS——手工回退版本号后重跑(异常重试路径)
|
|
14
|
+
// 不报错;正常路径由 user_version 门控(版本已到 13 不再执行)。事务由 runMigrations 保证
|
|
15
|
+
// (up + setUserVersion 原子提交)。
|
|
16
|
+
/** v12 旧练习两表的拆除(索引先于表;表已不存在时同样安全) */
|
|
17
|
+
const DROP_LEGACY_PRACTICE_DDL = `
|
|
18
|
+
DROP INDEX IF EXISTS idx_practice_samples_target;
|
|
19
|
+
DROP TABLE IF EXISTS practice_samples;
|
|
20
|
+
DROP TABLE IF EXISTS practice_targets;
|
|
21
|
+
`;
|
|
22
|
+
/** v13 练习三表 DDL(列序与 CREATE_TABLES_SQL / docs/db/schema.md 逐字同形;三表无外键、无索引) */
|
|
23
|
+
const PRACTICE_TABLES_DDL = `
|
|
24
|
+
CREATE TABLE IF NOT EXISTS practice_samples (
|
|
25
|
+
id TEXT PRIMARY KEY, -- 'ps-*'
|
|
26
|
+
work_id TEXT, -- 关联预置作品 id(NULL = 「其他」;无 FK,存在性由写入侧守卫)
|
|
27
|
+
excerpt_label TEXT NOT NULL DEFAULT '', -- 片段说明(空串 = 未填;上限 = 常量 MAX_PRACTICE_EXCERPT_LABEL_CHARS)
|
|
28
|
+
text TEXT NOT NULL, -- 范文快照(不可变;上限 = 常量 MAX_PRACTICE_SAMPLE_CHARS)
|
|
29
|
+
draft TEXT NOT NULL DEFAULT '', -- 用户仿写稿(**只有用户能写**)
|
|
30
|
+
feedback TEXT, -- 点评卡 JSON(AI 产出;NULL = 未点评)
|
|
31
|
+
created_at TEXT NOT NULL,
|
|
32
|
+
updated_at TEXT NOT NULL
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
CREATE TABLE IF NOT EXISTS practice_free_pieces (
|
|
36
|
+
id TEXT PRIMARY KEY, -- 'pf-*'
|
|
37
|
+
topic TEXT NOT NULL DEFAULT '', -- 题目(空串 = 待出题;上限 = 常量 MAX_PRACTICE_TOPIC_CHARS)
|
|
38
|
+
brief TEXT NOT NULL DEFAULT '', -- 写作要求(空串 = 无;上限 = 常量 MAX_PRACTICE_BRIEF_CHARS)
|
|
39
|
+
topic_source TEXT NOT NULL, -- 'user' | 'ai'(出题来源;也是「待出题」状态的判据)
|
|
40
|
+
draft TEXT NOT NULL DEFAULT '', -- 用户稿件(**只有用户能写**;上限同仿写稿常量)
|
|
41
|
+
feedback TEXT, -- 点评卡 JSON(AI 产出;NULL = 未点评)
|
|
42
|
+
created_at TEXT NOT NULL,
|
|
43
|
+
updated_at TEXT NOT NULL
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
CREATE TABLE IF NOT EXISTS practice_style_packs (
|
|
47
|
+
author_id TEXT PRIMARY KEY, -- 预置作家 id(shared AUTHOR_CATALOG 的键)
|
|
48
|
+
content TEXT NOT NULL, -- 用户对作家风格说明的覆盖(上限 = 常量 MAX_PRACTICE_STYLE_PACK_CHARS)
|
|
49
|
+
updated_at TEXT NOT NULL -- 无覆盖 = 无行(读侧回退 shared 常量里的预置文本)
|
|
50
|
+
);
|
|
51
|
+
`;
|
|
52
|
+
const migration013 = {
|
|
53
|
+
version: 13,
|
|
54
|
+
up(db) {
|
|
55
|
+
db.exec(DROP_LEGACY_PRACTICE_DDL);
|
|
56
|
+
db.exec(PRACTICE_TABLES_DDL);
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
export default migration013;
|
|
60
|
+
//# sourceMappingURL=013_author_practice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"013_author_practice.js","sourceRoot":"","sources":["../../src/migrations/013_author_practice.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,2EAA2E;AAC3E,EAAE;AACF,uEAAuE;AACvE,0DAA0D;AAC1D,iDAAiD;AACjD,qBAAqB;AACrB,EAAE;AACF,mDAAmD;AACnD,6CAA6C;AAC7C,uDAAuD;AACvD,EAAE;AACF,uEAAuE;AACvE,+DAA+D;AAC/D,8BAA8B;AAK9B,qCAAqC;AACrC,MAAM,wBAAwB,GAAG;;;;CAIhC,CAAC;AAEF,6EAA6E;AAC7E,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4B3B,CAAC;AAEF,MAAM,YAAY,GAAc;IAC9B,OAAO,EAAE,EAAE;IACX,EAAE,CAAC,EAAM;QACP,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAClC,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC/B,CAAC;CACF,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -14,6 +14,8 @@ export interface Migration {
|
|
|
14
14
|
* 004 设定分类字段 tags(K2 修订)、005 参考资料 reference、006 对话历史出库、
|
|
15
15
|
* 007 角色能力面板(旧 abilities 标签迁为 ability_panel)、008 块文档表(document_records)、
|
|
16
16
|
* 009 拆解两表(decompose_jobs / decompose_batches)、010 拆解并发快照列(decompose_jobs.concurrency)、
|
|
17
|
-
* 011 移除拆解两表(拆解功能已整功能移除;009/010
|
|
17
|
+
* 011 移除拆解两表(拆解功能已整功能移除;009/010 保留仅为旧库升级链连续)、
|
|
18
|
+
* 012 练习两表(practice_targets / practice_samples,2026-10)、
|
|
19
|
+
* 013 练习模型重建(旧两表 → practice_samples / practice_free_pieces / practice_style_packs 三表,2026-10)) */
|
|
18
20
|
export declare const MIGRATIONS: readonly Migration[];
|
|
19
21
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAc3C,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAChC,0DAA0D;IACzD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qDAAqD;AACrD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC9C,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC7C;AAED;;;;;;kGAMkG;AAClG,eAAO,MAAM,UAAU,EAAE,SAAS,SAAS,EAa1C,CAAC"}
|
package/dist/migrations/index.js
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
// - 失败 → 该迁移回滚 + 版本停在前一迁移后,下次 open 重试
|
|
17
17
|
// - 无迁移路径的旧版本(如 v0 且无 0→1 条目)保持删库重建兜底
|
|
18
18
|
//
|
|
19
|
-
// **当前状态**:SCHEMA_VERSION =
|
|
19
|
+
// **当前状态**:SCHEMA_VERSION = 13;真实迁移 002(v1→v2:entities 表 CHECK 扩为 5 种 +
|
|
20
20
|
// sort_order 列,时间轴)、003(v2→v3:entities CHECK 扩 6 种含 timepoint +
|
|
21
21
|
// event.data.time_label 迁移为 timepoint 实体 + occurs_at 挂载关系,G2)、
|
|
22
22
|
// 004(v3→v4:setting 旧 rules 分类值 → data.tags,仅 data JSON)、005(v4→v5:CHECK 扩
|
|
@@ -26,7 +26,12 @@
|
|
|
26
26
|
// 009(v8→v9:新增 decompose_jobs / decompose_batches 拆解两表,纯 DDL)、
|
|
27
27
|
// 010(v9→v10:decompose_jobs 新增 concurrency 列(并发段数快照),纯 DDL 且存量行回填 1)、
|
|
28
28
|
// 011(v10→v11:DROP 拆解两表——拆解功能已整功能移除,见 CHANGELOG;009/010 保留仅为
|
|
29
|
-
// 旧库升级链连续,纯 DDL
|
|
29
|
+
// 旧库升级链连续,纯 DDL)、
|
|
30
|
+
// 012(v11→v12:新增 practice_targets / practice_samples 练习两表,纯 DDL——旧项目没有
|
|
31
|
+
// 练习行,无需回填)、
|
|
32
|
+
// 013(v12→v13:作家文风练习模型重建——DROP 旧 practice_targets / 旧 practice_samples
|
|
33
|
+
// (含 idx_practice_samples_target),建 practice_samples 新形状 / practice_free_pieces /
|
|
34
|
+
// practice_style_packs 三表;纯 DDL,无数据搬移)。
|
|
30
35
|
// v0 库无 0→1 迁移条目,仍走删库重建兜底。
|
|
31
36
|
import migration002 from "./002_event_timeline.js";
|
|
32
37
|
import migration003 from "./003_timepoint.js";
|
|
@@ -38,11 +43,15 @@ import migration008 from "./008_document_records.js";
|
|
|
38
43
|
import migration009 from "./009_decompose.js";
|
|
39
44
|
import migration010 from "./010_decompose_concurrency.js";
|
|
40
45
|
import migration011 from "./011_drop_decompose.js";
|
|
46
|
+
import migration012 from "./012_practice.js";
|
|
47
|
+
import migration013 from "./013_author_practice.js";
|
|
41
48
|
/** 全量迁移集(按 version 升序:002 时间轴事件、003 时间标签点实体化(G2)、
|
|
42
49
|
* 004 设定分类字段 tags(K2 修订)、005 参考资料 reference、006 对话历史出库、
|
|
43
50
|
* 007 角色能力面板(旧 abilities 标签迁为 ability_panel)、008 块文档表(document_records)、
|
|
44
51
|
* 009 拆解两表(decompose_jobs / decompose_batches)、010 拆解并发快照列(decompose_jobs.concurrency)、
|
|
45
|
-
* 011 移除拆解两表(拆解功能已整功能移除;009/010
|
|
52
|
+
* 011 移除拆解两表(拆解功能已整功能移除;009/010 保留仅为旧库升级链连续)、
|
|
53
|
+
* 012 练习两表(practice_targets / practice_samples,2026-10)、
|
|
54
|
+
* 013 练习模型重建(旧两表 → practice_samples / practice_free_pieces / practice_style_packs 三表,2026-10)) */
|
|
46
55
|
export const MIGRATIONS = [
|
|
47
56
|
migration002,
|
|
48
57
|
migration003,
|
|
@@ -54,5 +63,7 @@ export const MIGRATIONS = [
|
|
|
54
63
|
migration009,
|
|
55
64
|
migration010,
|
|
56
65
|
migration011,
|
|
66
|
+
migration012,
|
|
67
|
+
migration013,
|
|
57
68
|
];
|
|
58
69
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,EAAE;AACF,yEAAyE;AACzE,uEAAuE;AACvE,yDAAyD;AACzD,uCAAuC;AACvC,EAAE;AACF,4EAA4E;AAC5E,8DAA8D;AAC9D,EAAE;AACF,8DAA8D;AAC9D,EAAE;AACF,kDAAkD;AAClD,wDAAwD;AACxD,uDAAuD;AACvD,sCAAsC;AACtC,sCAAsC;AACtC,EAAE;AACF,wEAAwE;AACxE,gEAAgE;AAChE,+DAA+D;AAC/D,2EAA2E;AAC3E,kFAAkF;AAClF,kEAAkE;AAClE,6CAA6C;AAC7C,+DAA+D;AAC/D,sEAAsE;AACtE,6DAA6D;AAC7D,kBAAkB;AAClB,2BAA2B;AAG3B,OAAO,YAAY,MAAM,yBAAyB,CAAC;AACnD,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,YAAY,MAAM,yBAAyB,CAAC;AACnD,OAAO,YAAY,MAAM,kCAAkC,CAAC;AAC5D,OAAO,YAAY,MAAM,2BAA2B,CAAC;AACrD,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,YAAY,MAAM,gCAAgC,CAAC;AAC1D,OAAO,YAAY,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,EAAE;AACF,yEAAyE;AACzE,uEAAuE;AACvE,yDAAyD;AACzD,uCAAuC;AACvC,EAAE;AACF,4EAA4E;AAC5E,8DAA8D;AAC9D,EAAE;AACF,8DAA8D;AAC9D,EAAE;AACF,kDAAkD;AAClD,wDAAwD;AACxD,uDAAuD;AACvD,sCAAsC;AACtC,sCAAsC;AACtC,EAAE;AACF,wEAAwE;AACxE,gEAAgE;AAChE,+DAA+D;AAC/D,2EAA2E;AAC3E,kFAAkF;AAClF,kEAAkE;AAClE,6CAA6C;AAC7C,+DAA+D;AAC/D,sEAAsE;AACtE,6DAA6D;AAC7D,kBAAkB;AAClB,uEAAuE;AACvE,aAAa;AACb,uEAAuE;AACvE,kFAAkF;AAClF,wCAAwC;AACxC,2BAA2B;AAG3B,OAAO,YAAY,MAAM,yBAAyB,CAAC;AACnD,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,YAAY,MAAM,yBAAyB,CAAC;AACnD,OAAO,YAAY,MAAM,kCAAkC,CAAC;AAC5D,OAAO,YAAY,MAAM,2BAA2B,CAAC;AACrD,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,YAAY,MAAM,gCAAgC,CAAC;AAC1D,OAAO,YAAY,MAAM,yBAAyB,CAAC;AACnD,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAC7C,OAAO,YAAY,MAAM,0BAA0B,CAAC;AAepD;;;;;;kGAMkG;AAClG,MAAM,CAAC,MAAM,UAAU,GAAyB;IAC9C,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,YAAY;CACb,CAAC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { type Db } from "../connection.js";
|
|
2
|
+
/** 自由练习篇的题目来源(用户自拟 / AI 出题;空题目 + `ai` = 待出题状态) */
|
|
3
|
+
export type PracticeTopicSource = "user" | "ai";
|
|
4
|
+
/** 点评卡(AI 产出;结构见 docs/design/60-practice.md §6)——本层不校验卡体,只做 JSON 防御解析 */
|
|
5
|
+
export type PracticeFeedback = Record<string, unknown>;
|
|
6
|
+
/** practice_samples 行(存储形态;`work_id` 为 NULL = 「其他」,`feedback` 已防御解析) */
|
|
7
|
+
export interface PracticeSampleRow {
|
|
8
|
+
id: string;
|
|
9
|
+
work_id: string | null;
|
|
10
|
+
excerpt_label: string;
|
|
11
|
+
text: string;
|
|
12
|
+
draft: string;
|
|
13
|
+
feedback: PracticeFeedback | null;
|
|
14
|
+
created_at: string;
|
|
15
|
+
updated_at: string;
|
|
16
|
+
}
|
|
17
|
+
/** practice_free_pieces 行(存储形态;空 `topic` = 待出题) */
|
|
18
|
+
export interface PracticePieceRow {
|
|
19
|
+
id: string;
|
|
20
|
+
topic: string;
|
|
21
|
+
brief: string;
|
|
22
|
+
topic_source: PracticeTopicSource;
|
|
23
|
+
draft: string;
|
|
24
|
+
feedback: PracticeFeedback | null;
|
|
25
|
+
created_at: string;
|
|
26
|
+
updated_at: string;
|
|
27
|
+
}
|
|
28
|
+
/** practice_style_packs 行(存储形态;无行 = 无用户覆盖) */
|
|
29
|
+
export interface PracticeStylePackRow {
|
|
30
|
+
author_id: string;
|
|
31
|
+
content: string;
|
|
32
|
+
updated_at: string;
|
|
33
|
+
}
|
|
34
|
+
/** 样本列表项(API 投影形状:与 `GET /practice/samples` 响应一致,**不含正文与卡体**) */
|
|
35
|
+
export interface PracticeSampleSummary {
|
|
36
|
+
id: string;
|
|
37
|
+
workId: string | null;
|
|
38
|
+
excerptLabel: string;
|
|
39
|
+
charCount: number;
|
|
40
|
+
hasDraft: boolean;
|
|
41
|
+
hasFeedback: boolean;
|
|
42
|
+
createdAt: string;
|
|
43
|
+
updatedAt: string;
|
|
44
|
+
}
|
|
45
|
+
/** 自由练习列表项(API 投影形状:与 `GET /practice/free` 响应一致,**不含稿件与卡体**) */
|
|
46
|
+
export interface PracticePieceSummary {
|
|
47
|
+
id: string;
|
|
48
|
+
topic: string;
|
|
49
|
+
brief: string;
|
|
50
|
+
topicSource: PracticeTopicSource;
|
|
51
|
+
charCount: number;
|
|
52
|
+
hasDraft: boolean;
|
|
53
|
+
hasFeedback: boolean;
|
|
54
|
+
createdAt: string;
|
|
55
|
+
updatedAt: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 全工作区样本列表(`GET /practice/samples`):按 `updated_at` 倒序(同值用 id 升序作稳定次序,
|
|
59
|
+
* 避免同毫秒写入的列表顺序不稳定)、**只出投影列**——范文正文与卡体不进内存(charCount 走 SQL)。
|
|
60
|
+
*
|
|
61
|
+
* `hasDraft` = `draft <> ''`(SQL 判定);`hasFeedback` = 点评卡**防御解析后非 null**——
|
|
62
|
+
* 与详情同口径:坏 JSON 行在列表与详情一致地呈现为「未点评」(故本查询读出 `feedback` 列但不进返回值)。
|
|
63
|
+
*/
|
|
64
|
+
export declare function listPracticeSamples(db: Db): PracticeSampleSummary[];
|
|
65
|
+
/** 按 id 取样本详情(`GET /practice/samples/:id`;含范文全文、稿件与防御解析后的点评卡);不存在返回 null */
|
|
66
|
+
export declare function getPracticeSample(db: Db, id: string): PracticeSampleRow | null;
|
|
67
|
+
/**
|
|
68
|
+
* 新建样本(`POST /practice/samples`):id = `ps-` + nanoid、`draft` = 空串、`feedback` = NULL、
|
|
69
|
+
* created_at = updated_at = 写入时刻。`work_id` 缺省 / null = 「其他」(存在性校验在写入侧 = 路由 schema);
|
|
70
|
+
* `excerpt_label` 缺省 = 空串。**范文 `text` 落库后不可变**(无更新入口)。
|
|
71
|
+
* @returns 新行(存储形态)
|
|
72
|
+
*/
|
|
73
|
+
export declare function createPracticeSample(db: Db, input: {
|
|
74
|
+
workId?: string | null;
|
|
75
|
+
excerptLabel?: string;
|
|
76
|
+
text: string;
|
|
77
|
+
}): PracticeSampleRow;
|
|
78
|
+
/**
|
|
79
|
+
* 保存仿写稿(`PUT /practice/samples/:id`)——样本侧**唯一的用户写稿入口**(AI 工具面没有写稿工具)。
|
|
80
|
+
* 整体覆盖 `draft`(允许空串 = 清空稿件),推进 `updated_at`;范文 `text` 与 `feedback` 一概不动。
|
|
81
|
+
* 并发口径 = 后写覆盖(不带版本戳,同结构化数据/参考资料)。
|
|
82
|
+
* @returns `{ updatedAt }`(版本戳);样本不存在返回 null(路由层映射 404)
|
|
83
|
+
*/
|
|
84
|
+
export declare function updatePracticeSampleDraft(db: Db, id: string, draft: string): {
|
|
85
|
+
updatedAt: string;
|
|
86
|
+
} | null;
|
|
87
|
+
/**
|
|
88
|
+
* 写入仿写点评卡(`submit_style_feedback` 工具的唯一落库入口)——**只写 `feedback`**(JSON 序列化写入),
|
|
89
|
+
* 推进 `updated_at`;范文 `text` 与用户稿 `draft` 一概不动(**AI 能写它自己的产出,不能写用户的产出**)。
|
|
90
|
+
* 卡内形状(字段/引用子串校验)在写入侧 = 提交点评工具,本层只序列化(同 document 先例:库层不校验块体)。
|
|
91
|
+
* @returns `{ updatedAt }`(版本戳);样本不存在返回 null
|
|
92
|
+
*/
|
|
93
|
+
export declare function updatePracticeFeedback(db: Db, id: string, feedback: PracticeFeedback): {
|
|
94
|
+
updatedAt: string;
|
|
95
|
+
} | null;
|
|
96
|
+
/**
|
|
97
|
+
* 删除样本(`DELETE /practice/samples/:id`):物理删(练习数据无回收站),行随工作区存续独立。
|
|
98
|
+
* @returns 是否删掉了行(false = 样本不存在,路由层映射 404;重复删除仍返回 false 而不抛错)
|
|
99
|
+
*/
|
|
100
|
+
export declare function deletePracticeSample(db: Db, id: string): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* 全工作区自由练习列表(`GET /practice/free`):按 `updated_at` 倒序(同值用 id 升序作稳定次序)、
|
|
103
|
+
* **只出投影列**(`charCount` 走 SQL `length(draft)`,稿件不进内存);`hasFeedback` 口径同样本列表。
|
|
104
|
+
*/
|
|
105
|
+
export declare function listPracticePieces(db: Db): PracticePieceSummary[];
|
|
106
|
+
/** 按 id 取自由练习详情(`GET /practice/free/:id`;含稿件与防御解析后的点评卡);不存在返回 null */
|
|
107
|
+
export declare function getPracticePiece(db: Db, id: string): PracticePieceRow | null;
|
|
108
|
+
/**
|
|
109
|
+
* 新建自由练习篇(`POST /practice/free`):id = `pf-` + nanoid、`draft` = 空串、`feedback` = NULL、
|
|
110
|
+
* created_at = updated_at = 写入时刻。`topic` / `brief` 缺省 = 空串(`topic_source = "ai"` 的空题目行
|
|
111
|
+
* 正是「待出题」状态,题目由出题工具补写);`topic` 与 `topic_source` 的一致性校验在写入侧 = 路由 schema。
|
|
112
|
+
* @returns 新行(存储形态)
|
|
113
|
+
*/
|
|
114
|
+
export declare function createPracticePiece(db: Db, input: {
|
|
115
|
+
topicSource: PracticeTopicSource;
|
|
116
|
+
topic?: string;
|
|
117
|
+
brief?: string;
|
|
118
|
+
}): PracticePieceRow;
|
|
119
|
+
/**
|
|
120
|
+
* 保存自由练习稿(`PUT /practice/free/:id`)——自由练习侧**唯一的用户写稿入口**。
|
|
121
|
+
* 口径与仿写稿完全一致(整体覆盖、允许空串、后写覆盖):`topic` / `brief` / `feedback` 一概不动。
|
|
122
|
+
* @returns `{ updatedAt }`(版本戳);篇不存在返回 null(路由层映射 404)
|
|
123
|
+
*/
|
|
124
|
+
export declare function updatePracticePieceDraft(db: Db, id: string, draft: string): {
|
|
125
|
+
updatedAt: string;
|
|
126
|
+
} | null;
|
|
127
|
+
/**
|
|
128
|
+
* 写入题目与写作要求(`submit_practice_topic` 工具的唯一落库入口)——**只写 `topic` / `brief`**,
|
|
129
|
+
* 推进 `updated_at`;用户稿 `draft` 与 `feedback` 一概不动。
|
|
130
|
+
* `brief` 省略 = 不改(工具 schema 里 brief 可选;部分更新口径:省略的字段保持原值)。
|
|
131
|
+
* 「题目非空 → 抛错拒写」的守卫在工具层(写入侧),本层只落库。
|
|
132
|
+
* @returns `{ updatedAt }`(版本戳);篇不存在返回 null
|
|
133
|
+
*/
|
|
134
|
+
export declare function updatePracticePieceTopic(db: Db, id: string, patch: {
|
|
135
|
+
topic: string;
|
|
136
|
+
brief?: string;
|
|
137
|
+
}): {
|
|
138
|
+
updatedAt: string;
|
|
139
|
+
} | null;
|
|
140
|
+
/**
|
|
141
|
+
* 写入自由练习点评卡(`submit_free_feedback` 工具的唯一落库入口)——**只写 `feedback`**,
|
|
142
|
+
* 推进 `updated_at`;`topic` / `brief` / `draft` 一概不动。卡体形状校验同仿写(在写入侧)。
|
|
143
|
+
* @returns `{ updatedAt }`(版本戳);篇不存在返回 null
|
|
144
|
+
*/
|
|
145
|
+
export declare function updatePracticePieceFeedback(db: Db, id: string, feedback: PracticeFeedback): {
|
|
146
|
+
updatedAt: string;
|
|
147
|
+
} | null;
|
|
148
|
+
/**
|
|
149
|
+
* 删除自由练习篇(`DELETE /practice/free/:id`):物理删(不满意的 AI 出题 = 删掉重建,不做覆盖式换题)。
|
|
150
|
+
* @returns 是否删掉了行(false = 篇不存在,路由层映射 404;重复删除仍返回 false 而不抛错)
|
|
151
|
+
*/
|
|
152
|
+
export declare function deletePracticePiece(db: Db, id: string): boolean;
|
|
153
|
+
/**
|
|
154
|
+
* 取某作家的用户覆盖(`GET /practice/style-pack` 的 `customized` / `updatedAt` 与生效内容来源)。
|
|
155
|
+
* **生效内容 = 覆盖 `??` shared 预置**(回退逻辑在调用侧)。无覆盖返回 null。
|
|
156
|
+
*/
|
|
157
|
+
export declare function getStylePack(db: Db, authorId: string): PracticeStylePackRow | null;
|
|
158
|
+
/**
|
|
159
|
+
* 写入用户覆盖(`PUT /practice/style-pack`):一作家一行,存在即覆盖,`updated_at` 推进。
|
|
160
|
+
* @returns 写入后的行(存储形态)
|
|
161
|
+
*/
|
|
162
|
+
export declare function upsertStylePack(db: Db, authorId: string, content: string): PracticeStylePackRow;
|
|
163
|
+
/**
|
|
164
|
+
* 删除用户覆盖(`DELETE /practice/style-pack`)= **恢复预置**。
|
|
165
|
+
* @returns 是否删掉了行(false = 本来就没有覆盖——幂等口径,路由层照常返回 200 与预置内容)
|
|
166
|
+
*/
|
|
167
|
+
export declare function deleteStylePack(db: Db, authorId: string): boolean;
|
|
168
|
+
//# sourceMappingURL=practice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"practice.d.ts","sourceRoot":"","sources":["../../src/queries/practice.ts"],"names":[],"mappings":"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"}
|