@whispering233/ai-editor-server 0.0.53 → 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/client-dist/assets/{index-DBshOA8W.css → index-FO9svVbu.css} +1 -1
- package/client-dist/assets/index-ntCd3_tm.js +625 -0
- package/client-dist/index.html +2 -2
- package/dist/backup.d.ts +37 -44
- package/dist/backup.d.ts.map +1 -1
- package/dist/backup.js +55 -201
- package/dist/backup.js.map +1 -1
- package/dist/cloud/auto-push.d.ts +3 -3
- package/dist/cloud/auto-push.d.ts.map +1 -1
- package/dist/cloud/auto-push.js +7 -6
- package/dist/cloud/auto-push.js.map +1 -1
- package/dist/cloud/state.d.ts +6 -0
- package/dist/cloud/state.d.ts.map +1 -1
- package/dist/cloud/state.js +25 -0
- package/dist/cloud/state.js.map +1 -1
- package/dist/cloud/sync.d.ts +4 -6
- package/dist/cloud/sync.d.ts.map +1 -1
- package/dist/cloud/sync.js +8 -23
- package/dist/cloud/sync.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -4
- package/dist/index.js.map +1 -1
- package/dist/last-project.d.ts +5 -0
- package/dist/last-project.d.ts.map +1 -1
- package/dist/last-project.js +18 -0
- package/dist/last-project.js.map +1 -1
- package/dist/middleware/error.d.ts +1 -1
- package/dist/middleware/error.d.ts.map +1 -1
- package/dist/middleware/error.js +0 -9
- package/dist/middleware/error.js.map +1 -1
- package/dist/middleware/project.d.ts +1 -1
- package/dist/middleware/project.d.ts.map +1 -1
- package/dist/middleware/project.js +1 -15
- package/dist/middleware/project.js.map +1 -1
- package/dist/routes/chat.d.ts.map +1 -1
- package/dist/routes/chat.js +46 -39
- package/dist/routes/chat.js.map +1 -1
- package/dist/routes/cloud.d.ts.map +1 -1
- package/dist/routes/cloud.js +168 -11
- package/dist/routes/cloud.js.map +1 -1
- package/dist/routes/project.d.ts +21 -1
- package/dist/routes/project.d.ts.map +1 -1
- package/dist/routes/project.js +138 -10
- package/dist/routes/project.js.map +1 -1
- package/package.json +5 -5
- package/client-dist/assets/index-DnBMudDZ.js +0 -624
- package/dist/decompose/batching.d.ts +0 -20
- package/dist/decompose/batching.d.ts.map +0 -1
- package/dist/decompose/batching.js +0 -29
- package/dist/decompose/batching.js.map +0 -1
- package/dist/decompose/extract.d.ts +0 -44
- package/dist/decompose/extract.d.ts.map +0 -1
- package/dist/decompose/extract.js +0 -246
- package/dist/decompose/extract.js.map +0 -1
- package/dist/decompose/job.d.ts +0 -91
- package/dist/decompose/job.d.ts.map +0 -1
- package/dist/decompose/job.js +0 -289
- package/dist/decompose/job.js.map +0 -1
- package/dist/decompose/llm.d.ts +0 -68
- package/dist/decompose/llm.d.ts.map +0 -1
- package/dist/decompose/llm.js +0 -180
- package/dist/decompose/llm.js.map +0 -1
- package/dist/decompose/merge-write.d.ts +0 -75
- package/dist/decompose/merge-write.d.ts.map +0 -1
- package/dist/decompose/merge-write.js +0 -670
- package/dist/decompose/merge-write.js.map +0 -1
- package/dist/decompose/merge.d.ts +0 -156
- package/dist/decompose/merge.d.ts.map +0 -1
- package/dist/decompose/merge.js +0 -266
- package/dist/decompose/merge.js.map +0 -1
- package/dist/decompose/report.d.ts +0 -57
- package/dist/decompose/report.d.ts.map +0 -1
- package/dist/decompose/report.js +0 -127
- package/dist/decompose/report.js.map +0 -1
- package/dist/decompose/runner.d.ts +0 -143
- package/dist/decompose/runner.d.ts.map +0 -1
- package/dist/decompose/runner.js +0 -520
- package/dist/decompose/runner.js.map +0 -1
- package/dist/decompose/split.d.ts +0 -89
- package/dist/decompose/split.d.ts.map +0 -1
- package/dist/decompose/split.js +0 -556
- package/dist/decompose/split.js.map +0 -1
- package/dist/routes/decompose.d.ts +0 -26
- package/dist/routes/decompose.d.ts.map +0 -1
- package/dist/routes/decompose.js +0 -453
- package/dist/routes/decompose.js.map +0 -1
package/dist/decompose/report.js
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
// 拆解 S4:报告内容(六段)与全书剧情摘要的一次聚合调用。
|
|
2
|
-
//
|
|
3
|
-
// 契约:docs/design/60-decompose.md §6.2(六段结构)/ §2(S4 = 一次调用,输入 = 各章摘要)。
|
|
4
|
-
// 分工:本模块只**产文本 + 调一次模型**——报告实体与块文档的落库归 `merge-write.ts`。
|
|
5
|
-
// 正文 = 纯文本小标题 + 段落(服务端按行拆段落块,不做 markdown 语义转换,与参考资料导入同口径)。
|
|
6
|
-
// 数值上限与文案单一定义在本模块并导出;散文与注释只引用常量名,不复述数字。
|
|
7
|
-
import { SPLIT_LONG_BLOCK_FACTOR } from "./split.js";
|
|
8
|
-
/** 报告实体的落点口径:`entities.type`(第 7 种实体)+ `data.type` / `tags` / 名字后缀共用这个词 */
|
|
9
|
-
export const DECOMPOSE_REPORT_ENTITY_TYPE = "reference";
|
|
10
|
-
export const DECOMPOSE_REPORT_KIND = "拆解报告";
|
|
11
|
-
/** 全书剧情摘要长度上限(提示词按常量插值,落库前同口径截断) */
|
|
12
|
-
export const DECOMPOSE_REPORT_PLOT_MAX_CHARS = 1200;
|
|
13
|
-
/** 报告六段标题(顺序即正文顺序;§6.2 的六段) */
|
|
14
|
-
export const DECOMPOSE_REPORT_SECTIONS = [
|
|
15
|
-
"一、作品概览",
|
|
16
|
-
"二、全书剧情摘要",
|
|
17
|
-
"三、人物小传汇总",
|
|
18
|
-
"四、结构与节奏",
|
|
19
|
-
"五、已合并的别名组",
|
|
20
|
-
"六、被阈值滤掉的单章线索",
|
|
21
|
-
];
|
|
22
|
-
/** 报告实体名(`name` = 《书名》拆解报告;`data.type` / `tags` 用 DECOMPOSE_REPORT_KIND) */
|
|
23
|
-
export function decomposeReportName(bookName) {
|
|
24
|
-
return `《${bookName}》${DECOMPOSE_REPORT_KIND}`;
|
|
25
|
-
}
|
|
26
|
-
/** 报告正文(六段;纯文本小标题 + 段落,由调用方按行拆块) */
|
|
27
|
-
export function buildDecomposeReportText(facts, plotSummary) {
|
|
28
|
-
return [
|
|
29
|
-
DECOMPOSE_REPORT_SECTIONS[0],
|
|
30
|
-
`《${facts.bookName}》共 ${facts.chapters.length} 章,正文 ${totalCharsOf(facts)} 字,落库人物 ${facts.characters.length} 位,拆解批数 ${facts.batchCount} 批。`,
|
|
31
|
-
"",
|
|
32
|
-
DECOMPOSE_REPORT_SECTIONS[1],
|
|
33
|
-
plotSummary === "" ? "(无章摘要可聚合)" : plotSummary,
|
|
34
|
-
"",
|
|
35
|
-
DECOMPOSE_REPORT_SECTIONS[2],
|
|
36
|
-
...(facts.characters.length === 0 ? ["(无落库人物)"] : facts.characters.map(characterLine)),
|
|
37
|
-
"",
|
|
38
|
-
DECOMPOSE_REPORT_SECTIONS[3],
|
|
39
|
-
rhythmLine(facts),
|
|
40
|
-
longChapterLine(facts),
|
|
41
|
-
"",
|
|
42
|
-
DECOMPOSE_REPORT_SECTIONS[4],
|
|
43
|
-
...(facts.aliasGroups.length === 0 ? ["(本轮未合并别名组)"] : facts.aliasGroups.map(aliasGroupLine)),
|
|
44
|
-
"",
|
|
45
|
-
DECOMPOSE_REPORT_SECTIONS[5],
|
|
46
|
-
`人物:${listOrNone(facts.filteredCharacters)}`,
|
|
47
|
-
`关系:${listOrNone(facts.filteredRelations)}`,
|
|
48
|
-
...(facts.keptUserEdited.length === 0
|
|
49
|
-
? []
|
|
50
|
-
: [`未改动(用户手工编辑过,重跑不覆盖):${facts.keptUserEdited.join(";")}`]),
|
|
51
|
-
].join("\n");
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* 全书剧情摘要调用(S4 的**唯一**模型调用):输入 = 各章摘要(不是原文,成本与总字数无关)。
|
|
55
|
-
* 无章摘要时不调用模型(无输入可聚合),由调用方按空文本落报告。
|
|
56
|
-
*/
|
|
57
|
-
export async function completeReportPlot(session, chapters) {
|
|
58
|
-
const withSummary = chapters.filter((chapter) => chapter.summary !== "");
|
|
59
|
-
if (withSummary.length === 0)
|
|
60
|
-
return "";
|
|
61
|
-
const request = {
|
|
62
|
-
system: [
|
|
63
|
-
"你是小说拆解流水线的全书报告员。输入是各章摘要,输出是**一段连贯的全书剧情摘要**(纯文本,不要 JSON、不要标题、不要分点符号)。",
|
|
64
|
-
`按剧情推进顺序串起主线:起因、关键转折、高潮、结局;不要逐章复述,不要编造摘要里没有的情节。不超过 ${DECOMPOSE_REPORT_PLOT_MAX_CHARS} 字。`,
|
|
65
|
-
].join("\n"),
|
|
66
|
-
user: withSummary.map((chapter) => `第${chapter.index}章 ${chapter.title}:${chapter.summary}`).join("\n"),
|
|
67
|
-
};
|
|
68
|
-
const { text: raw } = await session.complete(request);
|
|
69
|
-
const text = raw.trim();
|
|
70
|
-
return text.length <= DECOMPOSE_REPORT_PLOT_MAX_CHARS ? text : text.slice(0, DECOMPOSE_REPORT_PLOT_MAX_CHARS);
|
|
71
|
-
}
|
|
72
|
-
// ── 模块私有 ─────────────────────────────────────────────────────────────────
|
|
73
|
-
function totalCharsOf(facts) {
|
|
74
|
-
return facts.chapterLengths.reduce((sum, chapter) => sum + chapter.length, 0);
|
|
75
|
-
}
|
|
76
|
-
function characterLine(character) {
|
|
77
|
-
const role = character.role === "" ? "" : `(${character.role})`;
|
|
78
|
-
const description = character.description === "" ? "" : `:${character.description}`;
|
|
79
|
-
return `- ${character.name}${role}${description}(出现第 ${chapterRangeText(character.chapters)} 章)`;
|
|
80
|
-
}
|
|
81
|
-
/** 出现章范围:首–末(单章 = 同一个数) */
|
|
82
|
-
function chapterRangeText(chapters) {
|
|
83
|
-
if (chapters.length === 0)
|
|
84
|
-
return "—";
|
|
85
|
-
const first = Math.min(...chapters);
|
|
86
|
-
const last = Math.max(...chapters);
|
|
87
|
-
return first === last ? String(first) : `${first}–${last}`;
|
|
88
|
-
}
|
|
89
|
-
/** 第 4 段前半:章字数分布(最短 / 中位 / 最长,带章号与标题) */
|
|
90
|
-
function rhythmLine(facts) {
|
|
91
|
-
if (facts.chapterLengths.length === 0)
|
|
92
|
-
return "章字数:无已导入正文。";
|
|
93
|
-
const lengths = facts.chapterLengths.map((chapter) => chapter.length).sort((left, right) => left - right);
|
|
94
|
-
const shortest = facts.chapterLengths.find((chapter) => chapter.length === lengths[0]);
|
|
95
|
-
const longest = facts.chapterLengths.find((chapter) => chapter.length === lengths[lengths.length - 1]);
|
|
96
|
-
return `章字数:最短 ${lengths[0]} 字(第 ${shortest?.index ?? 0} 章 ${shortest?.title ?? ""})、中位 ${median(lengths)} 字、最长 ${lengths[lengths.length - 1]} 字(第 ${longest?.index ?? 0} 章 ${longest?.title ?? ""})。`;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* 第 4 段后半:疑似合并章——按章正文长度与中位数的**同一倍数阈值**(`SPLIT_LONG_BLOCK_FACTOR`)重新判定
|
|
100
|
-
* (切分阶段的警告不落库、S3 时也没有原文可重切 ⇒ 只能按章节字数重导,
|
|
101
|
-
* 与切分阶段基于段长的判定可能略有差异;口径写进报告,不静默)。
|
|
102
|
-
*/
|
|
103
|
-
function longChapterLine(facts) {
|
|
104
|
-
const lengths = facts.chapterLengths.map((chapter) => chapter.length).sort((left, right) => left - right);
|
|
105
|
-
if (lengths.length === 0) {
|
|
106
|
-
return `疑似合并章:无(判据:章正文长度 > 中位数 × ${SPLIT_LONG_BLOCK_FACTOR})。`;
|
|
107
|
-
}
|
|
108
|
-
const threshold = median(lengths) * SPLIT_LONG_BLOCK_FACTOR;
|
|
109
|
-
const suspected = facts.chapterLengths.filter((chapter) => chapter.length > threshold);
|
|
110
|
-
const criterion = `判据:章正文长度 > 中位数 × ${SPLIT_LONG_BLOCK_FACTOR}(与切分阶段的判定可能略有差异)`;
|
|
111
|
-
return suspected.length === 0
|
|
112
|
-
? `疑似合并章:无(${criterion})。`
|
|
113
|
-
: `疑似合并章:${suspected.map((chapter) => `第 ${chapter.index} 章 ${chapter.title}(${chapter.length} 字)`).join("、")}(${criterion})。`;
|
|
114
|
-
}
|
|
115
|
-
function aliasGroupLine(group) {
|
|
116
|
-
const reason = group.reason === "" ? "" : `(依据:${group.reason})`;
|
|
117
|
-
return `- ${group.canonical} ← ${group.aliases.join("、")}${reason}`;
|
|
118
|
-
}
|
|
119
|
-
function listOrNone(items) {
|
|
120
|
-
return items.length === 0 ? "无" : items.join("、");
|
|
121
|
-
}
|
|
122
|
-
/** 中位数(偶数个取中间两数均值;与切分预览的 stats.median 同口径) */
|
|
123
|
-
function median(sorted) {
|
|
124
|
-
const middle = Math.floor(sorted.length / 2);
|
|
125
|
-
return sorted.length % 2 === 1 ? sorted[middle] : (sorted[middle - 1] + sorted[middle]) / 2;
|
|
126
|
-
}
|
|
127
|
-
//# sourceMappingURL=report.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/decompose/report.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,EAAE;AACF,sEAAsE;AACtE,yDAAyD;AACzD,2DAA2D;AAC3D,wCAAwC;AAGxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAErD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,4BAA4B,GAAG,WAAW,CAAC;AACxD,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAE5C,oCAAoC;AACpC,MAAM,CAAC,MAAM,+BAA+B,GAAG,IAAI,CAAC;AAEpD,+BAA+B;AAC/B,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,QAAQ;IACR,UAAU;IACV,UAAU;IACV,SAAS;IACT,WAAW;IACX,cAAc;CACN,CAAC;AAEX,4EAA4E;AAC5E,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,OAAO,IAAI,QAAQ,IAAI,qBAAqB,EAAE,CAAC;AACjD,CAAC;AAyCD,oCAAoC;AACpC,MAAM,UAAU,wBAAwB,CAAC,KAA2B,EAAE,WAAmB;IACvF,OAAO;QACL,yBAAyB,CAAC,CAAC,CAAC;QAC5B,IAAI,KAAK,CAAC,QAAQ,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,SAAS,YAAY,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,UAAU,CAAC,MAAM,WAAW,KAAK,CAAC,UAAU,KAAK;QAC3I,EAAE;QACF,yBAAyB,CAAC,CAAC,CAAC;QAC5B,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW;QAC9C,EAAE;QACF,yBAAyB,CAAC,CAAC,CAAC;QAC5B,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACtF,EAAE;QACF,yBAAyB,CAAC,CAAC,CAAC;QAC5B,UAAU,CAAC,KAAK,CAAC;QACjB,eAAe,CAAC,KAAK,CAAC;QACtB,EAAE;QACF,yBAAyB,CAAC,CAAC,CAAC;QAC5B,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5F,EAAE;QACF,yBAAyB,CAAC,CAAC,CAAC;QAC5B,MAAM,UAAU,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE;QAC5C,MAAM,UAAU,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE;QAC3C,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC;YACnC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,sBAAsB,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;KAC9D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAyB,EACzB,QAAkC;IAElC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;IACzE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG;QACd,MAAM,EAAE;YACN,sEAAsE;YACtE,qDAAqD,+BAA+B,KAAK;SAC1F,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KACxG,CAAC;IACF,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACxB,OAAO,IAAI,CAAC,MAAM,IAAI,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,+BAA+B,CAAC,CAAC;AAChH,CAAC;AAED,4EAA4E;AAE5E,SAAS,YAAY,CAAC,KAA2B;IAC/C,OAAO,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,aAAa,CAAC,SAA0B;IAC/C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC;IAChE,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;IACpF,OAAO,KAAK,SAAS,CAAC,IAAI,GAAG,IAAI,GAAG,WAAW,QAAQ,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;AACnG,CAAC;AAED,2BAA2B;AAC3B,SAAS,gBAAgB,CAAC,QAA2B;IACnD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IACnC,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;AAC7D,CAAC;AAED,yCAAyC;AACzC,SAAS,UAAU,CAAC,KAA2B;IAC7C,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC;IAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IAC1G,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACvG,OAAO,UAAU,OAAO,CAAC,CAAC,CAAC,QAAQ,QAAQ,EAAE,KAAK,IAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,IAAI,EAAE,QAAQ,MAAM,CAAC,OAAO,CAAC,SAAS,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,OAAO,EAAE,KAAK,IAAI,CAAC,MAAM,OAAO,EAAE,KAAK,IAAI,EAAE,IAAI,CAAC;AACzM,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,KAA2B;IAClD,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IAC1G,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,4BAA4B,uBAAuB,IAAI,CAAC;IACjE,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,uBAAuB,CAAC;IAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACvF,MAAM,SAAS,GAAG,oBAAoB,uBAAuB,kBAAkB,CAAC;IAChF,OAAO,SAAS,CAAC,MAAM,KAAK,CAAC;QAC3B,CAAC,CAAC,WAAW,SAAS,IAAI;QAC1B,CAAC,CAAC,SAAS,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,KAAK,MAAM,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,IAAI,CAAC;AACnI,CAAC;AAED,SAAS,cAAc,CAAC,KAAuB;IAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC;IACjE,OAAO,KAAK,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC;AACtE,CAAC;AAED,SAAS,UAAU,CAAC,KAAwB;IAC1C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpD,CAAC;AAED,8CAA8C;AAC9C,SAAS,MAAM,CAAC,MAAyB;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AAC9F,CAAC"}
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import type { DecomposeBatchResult, OutlineFileTree } from "@whispering233/ai-editor-shared";
|
|
2
|
-
import { type ChapterOrderInfo } from "@whispering233/ai-editor-db";
|
|
3
|
-
import type { ProjectContext } from "../middleware/project.js";
|
|
4
|
-
import { type DecomposeLlmDeps } from "./llm.js";
|
|
5
|
-
/** 批并发度:串行是既定口径(§4——不在 pi 的重试链里,429 / 限流要自己兜,后台任务慢比失败好)。
|
|
6
|
-
* 单点可调:改成 N 即按 N 批一组并发跑;同组共用一份项目数据快照(组内后批看不到同组前批的产出)。 */
|
|
7
|
-
export declare const DECOMPOSE_CONCURRENCY = 1;
|
|
8
|
-
/** 单批尝试上限(含首次):缺章 → 整批重试;超上限标 `failed` 并继续后续批(不阻塞整个 job) */
|
|
9
|
-
export declare const DECOMPOSE_BATCH_MAX_ATTEMPTS = 3;
|
|
10
|
-
/** 起始快照回溯的章数(§4.1:只取紧邻范围起点的连续若干章——续拆 / 有范围时的前置连续性) */
|
|
11
|
-
export declare const DECOMPOSE_SNAPSHOT_PREV_CHAPTERS = 3;
|
|
12
|
-
/** 项目数据快照长度上限(§4.1:起始快照 + 本轮累积的总预算)——`routes/decompose.ts` 的每批固定开销
|
|
13
|
-
* 预估由它派生(改这里预估跟着变) */
|
|
14
|
-
export declare const DECOMPOSE_SNAPSHOT_MAX_CHARS = 2000;
|
|
15
|
-
/** 人物 `role` 的展示权重(§4.1:主角 → … → 龙套,词表外的 role 归末位)——同时是批提示词的建议词表 */
|
|
16
|
-
export declare const DECOMPOSE_ROLE_ORDER: readonly ["主角", "主要配角", "配角", "反派", "龙套"];
|
|
17
|
-
/** 拆解会话保留上限(§7.2):按 job `created_at` 保留最近这么多枚,超出的在新一轮拆解创建会话之前清掉 */
|
|
18
|
-
export declare const DECOMPOSE_KEPT_SESSIONS = 5;
|
|
19
|
-
/** 拆解 runner 可注入依赖(测试注入内存运行时 + faux provider 离线跑通;缺省走 pi 单例) */
|
|
20
|
-
export type DecomposeRunnerDeps = DecomposeLlmDeps;
|
|
21
|
-
/** 本轮累积:跨批携带「已出现的实体名 + 关系 + 上一批摘要」——**不带上文原文** */
|
|
22
|
-
export interface StoryBible {
|
|
23
|
-
/** 人物 / 设定 / 地点的名字(按 `normalizeEntityName` 去重、保持出现顺序) */
|
|
24
|
-
names: string[];
|
|
25
|
-
/** 已出现的关系(`源→靶(类型)`,去重) */
|
|
26
|
-
relations: string[];
|
|
27
|
-
/** **上一批**各章摘要(整批替换:跨批只需最近一批,不占预算) */
|
|
28
|
-
summaries: string[];
|
|
29
|
-
}
|
|
30
|
-
export declare function emptyStoryBible(): StoryBible;
|
|
31
|
-
/**
|
|
32
|
-
* 归并一批抽取结果进本轮累积(纯函数,返回新对象):名字与关系累计去重,摘要整批替换。
|
|
33
|
-
* 名字集合同时是 `normalizeExtraction` 的 `knownNames`——跨批关系端点靠它才不被当成幻觉丢弃。
|
|
34
|
-
*/
|
|
35
|
-
export declare function extendStoryBible(bible: StoryBible, result: DecomposeBatchResult): StoryBible;
|
|
36
|
-
/**
|
|
37
|
-
* 起始快照(§4.1 第 1 层):**job 开始时读库一次**——已有实体名 / 已有关系 / 范围起点前的章摘要。
|
|
38
|
-
* 与「本轮累积」合起来渲染成一份项目数据快照(`snapshotText`)。
|
|
39
|
-
*/
|
|
40
|
-
export interface DecomposeStartSnapshot {
|
|
41
|
-
/** 已有的人物(带 `role`;顺序 = `DECOMPOSE_ROLE_ORDER` 权重) */
|
|
42
|
-
characters: Array<{
|
|
43
|
-
name: string;
|
|
44
|
-
role: string;
|
|
45
|
-
}>;
|
|
46
|
-
/** 已有的设定名(§4.1:只给名字——这两类没有关系端点判据要保) */
|
|
47
|
-
settings: string[];
|
|
48
|
-
/** 已有的地点名(与设定同款只给名字;分列存是为了「快照组成」条目能报各自计数,渲染时仍合成一块) */
|
|
49
|
-
locations: string[];
|
|
50
|
-
/** 已有的关系(「源→靶(类型)」) */
|
|
51
|
-
relations: string[];
|
|
52
|
-
/** 范围起点前 `DECOMPOSE_SNAPSHOT_PREV_CHAPTERS` 章的摘要(紧邻起点者在最前;范围从第 1 章开始 → 空) */
|
|
53
|
-
prevSummaries: Array<{
|
|
54
|
-
chapterNumber: number;
|
|
55
|
-
summary: string;
|
|
56
|
-
}>;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* 起始快照读取(一轮一次,不随批刷新):实体 / 关系走 db 查询层(禁止绕过 `queryDb`),
|
|
60
|
-
* 前置章摘要走 `outline.json`(章序 = `deriveChapterOrder`,节点 `summary` = S3 回写的章摘要)。
|
|
61
|
-
*/
|
|
62
|
-
export declare function readStartSnapshot(input: {
|
|
63
|
-
project: ProjectContext;
|
|
64
|
-
scopeStart: number;
|
|
65
|
-
chapterOrder: readonly ChapterOrderInfo[];
|
|
66
|
-
tree: OutlineFileTree;
|
|
67
|
-
}): DecomposeStartSnapshot;
|
|
68
|
-
/**
|
|
69
|
-
* 快照里的全部名字(**校验用全集**:起始快照 + 本轮累积)——`normalizeExtraction` 的 `knownNames` 输入。
|
|
70
|
-
*
|
|
71
|
-
* **不变式(§4.1):这里必须是未裁剪的全集,预算只作用于提示词渲染。**
|
|
72
|
-
* 反向改(拿渲染后的文本当校验集合)会把「本批没重提、但库里 / 前几批已存在」的角色误判成幻觉,
|
|
73
|
-
* 连带把它的关系整条丢掉——名字数组与渲染文本是两套东西,不得合并。
|
|
74
|
-
*/
|
|
75
|
-
export declare function snapshotKnownNames(start: DecomposeStartSnapshot, bible: StoryBible): string[];
|
|
76
|
-
/**
|
|
77
|
-
* 项目数据快照文本(§4.1:起始快照 + 本轮累积合并成一份;受 `DECOMPOSE_SNAPSHOT_MAX_CHARS` 约束)。
|
|
78
|
-
* 超预算按块丢弃(顺序见 `snapshotBlocks`),**每次丢弃都在文本里显式告知**——
|
|
79
|
-
* 静默截断会让模型以为自己看到了全部。空快照 → 空文本(提示词走「尚无上文」)。
|
|
80
|
-
*/
|
|
81
|
-
export declare function snapshotText(start: DecomposeStartSnapshot, bible: StoryBible): string;
|
|
82
|
-
/** 快照组成(§8 拆解记录时间线:条目只报计数与省略告知,不塞全文) */
|
|
83
|
-
export interface SnapshotComposition {
|
|
84
|
-
/** 起始快照(job 开始时读库一次)各块计数 = 条目文案的「人物 N / 设定 N / 地点 N / 关系 N / 前置摘要 N 条」 */
|
|
85
|
-
start: {
|
|
86
|
-
characters: number;
|
|
87
|
-
settings: number;
|
|
88
|
-
locations: number;
|
|
89
|
-
relations: number;
|
|
90
|
-
prevSummaries: number;
|
|
91
|
-
};
|
|
92
|
-
/** 当轮快照规模(起始快照 + 本轮累积;= 提示词里实际渲染的那份的条数) */
|
|
93
|
-
merged: {
|
|
94
|
-
names: number;
|
|
95
|
-
relations: number;
|
|
96
|
-
};
|
|
97
|
-
/** 预算丢弃告知(与渲染同源;空数组 = 没丢) */
|
|
98
|
-
omitted: string[];
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* 快照组成**与 `snapshotText` 共用同一份分块 + 预算**(`fitSnapshot`)——所以条目里的「已省略」
|
|
102
|
-
* 与提示词里模型看到的告知逐字一致;两处各算一遍必然漂移(数值单源)。
|
|
103
|
-
*/
|
|
104
|
-
export declare function snapshotComposition(start: DecomposeStartSnapshot, bible: StoryBible): SnapshotComposition;
|
|
105
|
-
/**
|
|
106
|
-
* 中止一个 job 的在跑轮次(pause 路由用):当前批跑完即停,**已发出的模型调用不 abort**。
|
|
107
|
-
* 状态写入归调用方(pause 路由 / `setCurrentProject` 的归一)。
|
|
108
|
-
* @returns 是否有在跑的一轮
|
|
109
|
-
*/
|
|
110
|
-
export declare function pauseDecomposeJob(jobId: string): boolean;
|
|
111
|
-
/** 中止全部在跑轮次(切书 / 关项目挂点:不做跨书后台跑) */
|
|
112
|
-
export declare function cancelRunningDecomposeJobs(): void;
|
|
113
|
-
/**
|
|
114
|
-
* 该 job 是否有在跑(或排队)的一轮(chat 侧的删除守卫用):
|
|
115
|
-
* **暂停后当前批仍在飞**——job 行已是 `paused`,但会话文件还会被这轮原地重建,同样不能删(§7.2)。
|
|
116
|
-
*/
|
|
117
|
-
export declare function isDecomposeJobActive(jobId: string): boolean;
|
|
118
|
-
/**
|
|
119
|
-
* 清理超出保留上限的拆解会话(§7.2):按 job `created_at` 保留最近 `DECOMPOSE_KEPT_SESSIONS` 枚
|
|
120
|
-
* (`job-<nanoid>` 里没有可解析时间 ⇒ 排序依据只能是 job 行,不是文件名),更早的会话文件物理删除
|
|
121
|
-
* (与 `DELETE /chat/sessions/:id` 同款:pi 磁盘发现拿路径 → `unlinkSync`)。
|
|
122
|
-
*
|
|
123
|
-
* - **只碰会话 id 为 `decompose-` 前缀的记录**:候选集 = 历史 job 行,会话 id 由 `decomposeSessionId`
|
|
124
|
-
* 组装、查找走 pi 的磁盘发现 + 会话 id 命中(文件名带时间戳前缀,**不得**按文件名 glob)
|
|
125
|
-
* ⇒ chat 会话结构上不可能参与(用户资产);
|
|
126
|
-
* - **在跑的一律不删**:job 行 `pending` / `running`,或进程内有在跑轮次(暂停后当前批仍在飞,
|
|
127
|
-
* 删了会被这轮原地重建);
|
|
128
|
-
* - 单个文件删不掉只记日志(同 `pruneBackups` 口径),整段失败也不阻塞拆解。
|
|
129
|
-
*
|
|
130
|
-
* @returns 实际删除的会话枚数(无需清理 / 失败 → 0)
|
|
131
|
-
*/
|
|
132
|
-
export declare function pruneDecomposeSessions(project: ProjectContext): Promise<number>;
|
|
133
|
-
/** 单批重跑选项(§7:`done` 与 `failed` 都可重跑,跑完重建 S3/S4) */
|
|
134
|
-
export interface DecomposeRunOptions {
|
|
135
|
-
rerunSeq?: number;
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* 启动 job 的批执行(**调用方不 await**:长任务)。状态前置校验归调用方(start / resume / rerun 各自置 `running`)。
|
|
139
|
-
* 同一 job 已有在跑或排队的一轮时,本轮排在它后面(见上方「排队」);批全部收口后接 S3 + S4 并把 job 置 `done`。
|
|
140
|
-
* @returns 本轮收尾的 promise(调用方不 await;测试可 await)
|
|
141
|
-
*/
|
|
142
|
-
export declare function startDecomposeJob(project: ProjectContext, deps?: DecomposeRunnerDeps, options?: DecomposeRunOptions): Promise<void>;
|
|
143
|
-
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/decompose/runner.ts"],"names":[],"mappings":"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"}
|