@whispering233/ai-editor-server 0.0.54 → 0.0.56
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-DMMiv-GL.js +625 -0
- package/client-dist/assets/{index-B2op0r9o.css → index-FO9svVbu.css} +1 -1
- package/client-dist/index.html +2 -2
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -15
- package/dist/index.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 +3 -4
- package/dist/middleware/project.d.ts.map +1 -1
- package/dist/middleware/project.js +2 -40
- package/dist/middleware/project.js.map +1 -1
- package/dist/routes/chat.d.ts +4 -2
- package/dist/routes/chat.d.ts.map +1 -1
- package/dist/routes/chat.js +89 -41
- package/dist/routes/chat.js.map +1 -1
- package/dist/routes/project.d.ts +1 -1
- package/dist/routes/project.d.ts.map +1 -1
- package/dist/routes/project.js +32 -8
- package/dist/routes/project.js.map +1 -1
- package/package.json +5 -5
- package/client-dist/assets/index-Bgk8dcAm.js +0 -627
- 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 -181
- 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/job.js
DELETED
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
// 拆解 S1 建档 + S1' 续拆建 job + job 骨架(卡 21.5 / 22.7):建大纲(卷→章)→ 逐章导入正文段落块 →
|
|
2
|
-
// 落 job 与批规划行(续拆只落 job 与批规划,不建大纲不导正文);续拆预览(plan)的库内读取面同在本模块。
|
|
3
|
-
// 进度轮询(GET /decompose/job)的状态投影也在这里。
|
|
4
|
-
//
|
|
5
|
-
// 契约:docs/design/60-decompose.md §2(S1 建档)/ §4(范围与组批)/ §7 / §7.1(状态机与续拆)/ §8(进度面);
|
|
6
|
-
// docs/api/120-api-decompose.md §start / §plan / §continue / §job / §batches;表不变式见 docs/db/schema.md「decompose 两表」。
|
|
7
|
-
// 口径:
|
|
8
|
-
// - **正文全量导入**(不受 scope 限制):scope 只决定批规划与 job 记录的 range(§4「范围」);
|
|
9
|
-
// - 切章文本 = `splitNovelWithSlices` 的**真实切片**(归一化文本上的 `[start, end)`)——
|
|
10
|
-
// **不得拿 `charCount` 当偏移量**:它是近似计数(正常路径 trim 掉分隔换行、退化路径不含空行分隔符),
|
|
11
|
-
// 当偏移量用会错位或丢字符(§3.4);
|
|
12
|
-
// - 段落块形态与参考资料执行器(`packages/tools/src/executor/reference.ts`)同款:每行一个 `paragraph`、
|
|
13
|
-
// 空行 = 空段落(服务端不解析块语义、不做 markdown 转换);`content_text` 由 shared `blocksToPlainMd`
|
|
14
|
-
// 从块重算(投影单一写入人,见 docs/db/schema.md「document_records」);
|
|
15
|
-
// - 大纲**一次读 + 一次写**(`readOutlineFile` / `writeOutlineFile`):节点形状与 db `createOutlineNode`
|
|
16
|
-
// 同构,但逐节点调用会让 N 章 × 原子写 fsync 变成 N+1 次落盘(导入一本数百章的书不可接受);
|
|
17
|
-
// - 时间(`now`)由调用方传入,本模块不生成时间。
|
|
18
|
-
import { blocksToPlainMd, generateOutlineNodeId } from "@whispering233/ai-editor-shared";
|
|
19
|
-
import { decomposeBatchResultSchema } from "@whispering233/ai-editor-shared/schemas";
|
|
20
|
-
import { createDecomposeJob, deriveChapterOrder, findOutlineNode, getDecomposeBatch, getDocumentTextLengths, getEntity, listDecomposeBatches, listDecomposeJobs, readOutlineFile, updateJobStatus, upsertDocument, writeOutlineFile, } from "@whispering233/ai-editor-db";
|
|
21
|
-
import { DECOMPOSE_BATCH_TARGET_CHARS, planBatches } from "./batching.js";
|
|
22
|
-
import { DECOMPOSE_REPORT_ENTITY_TYPE } from "./report.js";
|
|
23
|
-
/**
|
|
24
|
-
* 纯文本 → 段落块数组(块数组最小形态:每行一个 paragraph,空行 = 空段落——
|
|
25
|
-
* 与参考资料执行器 `paragraphBlocksOf` 同形态,保原文的段落/空行结构)。
|
|
26
|
-
* 共用面:S1 的逐章正文导入 + S4 的拆解报告正文(服务端不解析块语义)。
|
|
27
|
-
*/
|
|
28
|
-
export function paragraphBlocksOf(text) {
|
|
29
|
-
return text.split("\n").map((line) => ({
|
|
30
|
-
type: "paragraph",
|
|
31
|
-
content: line === "" ? [] : [{ type: "text", text: line }],
|
|
32
|
-
}));
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* 建大纲:卷 → 章(严格三层;`root` 仅接纳卷),章标题 = 切分清洗后的标题(§3.3.9),
|
|
36
|
-
* **`summary` 留空**(S2 抽取的章摘要由 S3 回写)。
|
|
37
|
-
* @returns 章序(1-based 文件位置序)→ 章节点 id 的映射(批行 `chapter_ids` 与正文 owner 都用它)
|
|
38
|
-
*/
|
|
39
|
-
function writeOutlineFromSplit(dir, split, now) {
|
|
40
|
-
const tree = readOutlineFile(dir); // 新项目 = initProject 写的空树;children 由本函数整体装配
|
|
41
|
-
const chapterIdByIndex = new Map();
|
|
42
|
-
const volumes = split.result.volumes.map((volume) => {
|
|
43
|
-
const chapters = split.result.chapters
|
|
44
|
-
.filter((chapter) => chapter.volumeIndex === volume.index)
|
|
45
|
-
.map((chapter) => {
|
|
46
|
-
const id = generateOutlineNodeId("chapter");
|
|
47
|
-
chapterIdByIndex.set(chapter.index, id);
|
|
48
|
-
return { id, type: "chapter", title: chapter.title, updated_at: now, children: [] };
|
|
49
|
-
});
|
|
50
|
-
return { id: generateOutlineNodeId("volume"), type: "volume", title: volume.title, updated_at: now, children: chapters };
|
|
51
|
-
});
|
|
52
|
-
tree.children = volumes;
|
|
53
|
-
writeOutlineFile(dir, tree);
|
|
54
|
-
return chapterIdByIndex;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* 逐章导入正文(**全量**:每片一个章节点文档行,不受 scope 限制)。
|
|
58
|
-
* 段落块来自该章的真实切片文本;`content_text` 从块重算。
|
|
59
|
-
* @returns 导入的章数
|
|
60
|
-
*/
|
|
61
|
-
function importChapterDocuments(db, split, chapterIdByIndex, now) {
|
|
62
|
-
let imported = 0;
|
|
63
|
-
for (const slice of split.slices) {
|
|
64
|
-
const chapterId = chapterIdByIndex.get(slice.index);
|
|
65
|
-
// 切片与章列表同源(同一份块几何)⇒ 缺映射 = 调用方传错(静默跳过会丢正文)
|
|
66
|
-
if (chapterId === undefined)
|
|
67
|
-
throw new Error(`importChapterDocuments: 章序 ${slice.index} 没有对应的大纲节点`);
|
|
68
|
-
const blocks = paragraphBlocksOf(split.text.slice(slice.start, slice.end));
|
|
69
|
-
upsertDocument(db, {
|
|
70
|
-
ownerKind: "chapter",
|
|
71
|
-
ownerId: chapterId,
|
|
72
|
-
content: JSON.stringify(blocks),
|
|
73
|
-
contentText: blocksToPlainMd(blocks),
|
|
74
|
-
now,
|
|
75
|
-
});
|
|
76
|
-
imported++;
|
|
77
|
-
}
|
|
78
|
-
return imported;
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* S1 建档(同步、不调 LLM):建大纲 → 导入正文 → 落 job 与批规划行 → job 置 `running`
|
|
82
|
-
*(契约:S1 完成后才返回,返回时 job 已进入 `running`;批执行归 S2 runner)。
|
|
83
|
-
*
|
|
84
|
-
* 批规划 = `planBatches(scopedChapters)`(与 analyze 预估同一实现,确定性);批行 `chapter_ids`
|
|
85
|
-
* 按章序映射为章节点 id。
|
|
86
|
-
*/
|
|
87
|
-
export function ingestDecomposeProject(input) {
|
|
88
|
-
const { project, split, now } = input;
|
|
89
|
-
const chapterIdByIndex = writeOutlineFromSplit(project.root, split, now);
|
|
90
|
-
importChapterDocuments(project.db, split, chapterIdByIndex, now);
|
|
91
|
-
return createRunningJob(project, {
|
|
92
|
-
batches: planBatchRows(input.scopedChapters, chapterIdByIndex),
|
|
93
|
-
scopeStart: input.scopeStart,
|
|
94
|
-
scopeEnd: input.scopeEnd,
|
|
95
|
-
model: input.model,
|
|
96
|
-
now,
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* S1'(续拆):**只**落 job 行 + 批规划行——不建大纲、不导正文、不动 `outline.json` / `document_records`
|
|
101
|
-
*(正文是 S1 全量导入的一次性产物,设计 §7.1);随后 job 置 `running`,批执行归 S2 runner(与 start 同款)。
|
|
102
|
-
*/
|
|
103
|
-
export function ingestDecomposeContinue(input) {
|
|
104
|
-
const chapterIdByIndex = new Map(deriveChapterOrder(input.project.root).map((entry) => [entry.chapterNumber, entry.chapterId]));
|
|
105
|
-
return createRunningJob(input.project, {
|
|
106
|
-
batches: planBatchRows(input.scopedChapters, chapterIdByIndex),
|
|
107
|
-
scopeStart: input.scopeStart,
|
|
108
|
-
scopeEnd: input.scopeEnd,
|
|
109
|
-
model: input.model,
|
|
110
|
-
now: input.now,
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
/** 批规划行(章序 → 批行 `chapter_ids`):缺映射 = 调用方传错(静默跳过会丢章) */
|
|
114
|
-
function planBatchRows(scopedChapters, chapterIdByIndex) {
|
|
115
|
-
return planBatches(scopedChapters).map((plan, position) => ({
|
|
116
|
-
seq: position + 1,
|
|
117
|
-
chapterIds: plan.chapterIndexes.map((chapterIndex) => {
|
|
118
|
-
const chapterId = chapterIdByIndex.get(chapterIndex);
|
|
119
|
-
if (chapterId === undefined)
|
|
120
|
-
throw new Error(`拆解批规划:章序 ${chapterIndex} 没有对应的大纲节点`);
|
|
121
|
-
return chapterId;
|
|
122
|
-
}),
|
|
123
|
-
}));
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* 落 job 行 + 全部批行(同一事务,`createDecomposeJob`)并置 `running` —— S1 与 S1' 的公共尾段
|
|
127
|
-
* (两处各写一遍必漂移)。
|
|
128
|
-
*/
|
|
129
|
-
function createRunningJob(project, input) {
|
|
130
|
-
const job = createDecomposeJob(project.db, {
|
|
131
|
-
scopeStart: input.scopeStart,
|
|
132
|
-
scopeEnd: input.scopeEnd,
|
|
133
|
-
batchTargetChars: DECOMPOSE_BATCH_TARGET_CHARS,
|
|
134
|
-
model: input.model,
|
|
135
|
-
batches: input.batches,
|
|
136
|
-
now: input.now,
|
|
137
|
-
});
|
|
138
|
-
updateJobStatus(project.db, job.id, "running", input.now);
|
|
139
|
-
return { jobId: job.id, batchCount: input.batches.length };
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* 已拆章集合 = 历史上**所有** job 的 `done` 批覆盖的章并集(设计 §7.1;`failed` / 未完成批不算)。
|
|
143
|
-
* 历史 job 全留在 `data.db`(进度面只显最新),故扫全量 job 行。
|
|
144
|
-
*/
|
|
145
|
-
function decomposedChapterIds(db) {
|
|
146
|
-
const ids = new Set();
|
|
147
|
-
for (const job of listDecomposeJobs(db)) {
|
|
148
|
-
for (const batch of listDecomposeBatches(db, job.id)) {
|
|
149
|
-
if (batch.status !== "done")
|
|
150
|
-
continue;
|
|
151
|
-
for (const chapterId of batch.chapter_ids)
|
|
152
|
-
ids.add(chapterId);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
return ids;
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* 库内章清单(顺序 = `deriveChapterOrder`:root → 卷 → 章先序遍历)+ 已拆标记 + 缺省范围。
|
|
159
|
-
* plan 与 continue **共用同一读取面**(各扫一遍必然漂移:预览说要拆的章与实际落的批不一致)。
|
|
160
|
-
* `volumeIndex` = root 下的卷序号(卷序号从 0 起、单卷与存量直挂 root 的章均为 0——与切分的口径同形)。
|
|
161
|
-
*/
|
|
162
|
-
export function readDecomposeProjectPlan(project) {
|
|
163
|
-
const decomposed = decomposedChapterIds(project.db);
|
|
164
|
-
const entries = [];
|
|
165
|
-
let volumeIndex = 0;
|
|
166
|
-
for (const child of readOutlineFile(project.root).children) {
|
|
167
|
-
if (child.type === "chapter") {
|
|
168
|
-
entries.push({ id: child.id, title: child.title, volumeIndex: 0 });
|
|
169
|
-
continue;
|
|
170
|
-
}
|
|
171
|
-
const index = volumeIndex++;
|
|
172
|
-
for (const chapter of child.children ?? []) {
|
|
173
|
-
entries.push({ id: chapter.id, title: chapter.title, volumeIndex: index });
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
const textLengthById = getDocumentTextLengths(project.db, "chapter", entries.map((entry) => entry.id));
|
|
177
|
-
const chapters = entries.map((entry, position) => ({
|
|
178
|
-
index: position + 1,
|
|
179
|
-
title: entry.title,
|
|
180
|
-
charCount: textLengthById.get(entry.id) ?? 0,
|
|
181
|
-
volumeIndex: entry.volumeIndex,
|
|
182
|
-
decomposed: decomposed.has(entry.id),
|
|
183
|
-
}));
|
|
184
|
-
const remaining = chapters.filter((chapter) => !chapter.decomposed);
|
|
185
|
-
return {
|
|
186
|
-
chapters,
|
|
187
|
-
remainingCount: remaining.length,
|
|
188
|
-
defaultScopeStart: remaining[0]?.index ?? 0,
|
|
189
|
-
defaultScopeEnd: remaining[remaining.length - 1]?.index ?? 0,
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
/** 批是否已收口(`done` / `failed` 都不再跑)——阶段推导与进度统计共用 */
|
|
193
|
-
function isSettledBatch(batch) {
|
|
194
|
-
return batch.status === "done" || batch.status === "failed";
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* 已完成批的抽取结果(续拆重建本轮累积、S3 归并都读它)。
|
|
198
|
-
* db 层不校验 `result` 形状(`[1,2]` 这类值原样透出)⇒ 此处按契约 schema 守卫。
|
|
199
|
-
*/
|
|
200
|
-
export function doneBatchResults(db, jobId, doneSeqs) {
|
|
201
|
-
const results = [];
|
|
202
|
-
for (const seq of doneSeqs) {
|
|
203
|
-
const parsed = decomposeBatchResultSchema.safeParse(getDecomposeBatch(db, jobId, seq)?.result);
|
|
204
|
-
if (parsed.success)
|
|
205
|
-
results.push(parsed.data);
|
|
206
|
-
}
|
|
207
|
-
return results;
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* 阶段推导(表里没有 stage 列 ⇒ 从 job 状态 + 批收口度 + 归并清单反推,§8 阶段条):
|
|
211
|
-
* `done` → 全流程结束;`pending` → 建档中;**还有未收口批 → 逐章抽取**(单批重跑把 job 拉回
|
|
212
|
-
* `running` 时阶段也随之回到 `extract`,§7);批全部收口但归并清单还空 → 归并;清单非空 → 报告。
|
|
213
|
-
*/
|
|
214
|
-
function deriveStage(job, batches) {
|
|
215
|
-
if (job.status === "done")
|
|
216
|
-
return "done";
|
|
217
|
-
if (job.status === "pending")
|
|
218
|
-
return "ingest";
|
|
219
|
-
if (!batches.every(isSettledBatch))
|
|
220
|
-
return "extract";
|
|
221
|
-
return job.merge_written.length > 0 ? "report" : "merge";
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* job 进度投影(GET /decompose/job):**不含批结果正文**(数百批 × 每条千级 token 会撑爆响应,
|
|
225
|
-
* 展开某批另取 `GET /job/batches/:seq`)。
|
|
226
|
-
*
|
|
227
|
-
* 批行的 `chapterIndexes` / `chapterTitles` 从章节点 id 反查(章序 = 文件位置序 = `deriveChapterOrder`;
|
|
228
|
-
* 标题取大纲节点 title,与大纲页同源);`charCount` = 该批各章正文投影长度和(与章列表 `textLength`
|
|
229
|
-
* 同口径,不存快照)。
|
|
230
|
-
*
|
|
231
|
-
* `report` 从归并清单投影(S4 落盘后非 null):报告实体 id 记在清单的 `reference` 条目上。
|
|
232
|
-
*/
|
|
233
|
-
export function buildJobResponse(project, job) {
|
|
234
|
-
const batches = listDecomposeBatches(project.db, job.id);
|
|
235
|
-
const chapterNumberById = new Map(deriveChapterOrder(project.root).map((entry) => [entry.chapterId, entry.chapterNumber]));
|
|
236
|
-
const tree = readOutlineFile(project.root);
|
|
237
|
-
const textLengthById = getDocumentTextLengths(project.db, "chapter", batches.flatMap((batch) => batch.chapter_ids));
|
|
238
|
-
return {
|
|
239
|
-
jobId: job.id,
|
|
240
|
-
status: job.status,
|
|
241
|
-
stage: deriveStage(job, batches),
|
|
242
|
-
scopeStart: job.scope_start,
|
|
243
|
-
scopeEnd: job.scope_end,
|
|
244
|
-
createdAt: job.created_at,
|
|
245
|
-
updatedAt: job.updated_at,
|
|
246
|
-
progress: {
|
|
247
|
-
done: batches.filter((batch) => batch.status === "done").length,
|
|
248
|
-
failed: batches.filter((batch) => batch.status === "failed").length,
|
|
249
|
-
total: batches.length,
|
|
250
|
-
},
|
|
251
|
-
batches: batches.map((batch) => {
|
|
252
|
-
const chapterIndexes = [];
|
|
253
|
-
const chapterTitles = [];
|
|
254
|
-
let charCount = 0;
|
|
255
|
-
for (const chapterId of batch.chapter_ids) {
|
|
256
|
-
const chapterNumber = chapterNumberById.get(chapterId);
|
|
257
|
-
// 章被物理删(回收站清除)后批行仍留着旧 id:跳过而不是报错(进度页照常显示其余章)
|
|
258
|
-
if (chapterNumber === undefined)
|
|
259
|
-
continue;
|
|
260
|
-
chapterIndexes.push(chapterNumber);
|
|
261
|
-
chapterTitles.push(findOutlineNode(tree, chapterId)?.title ?? "");
|
|
262
|
-
charCount += textLengthById.get(chapterId) ?? 0;
|
|
263
|
-
}
|
|
264
|
-
return {
|
|
265
|
-
seq: batch.seq,
|
|
266
|
-
chapterIndexes,
|
|
267
|
-
chapterTitles,
|
|
268
|
-
charCount,
|
|
269
|
-
status: batch.status,
|
|
270
|
-
attempts: batch.attempts,
|
|
271
|
-
error: batch.error,
|
|
272
|
-
};
|
|
273
|
-
}),
|
|
274
|
-
error: job.error,
|
|
275
|
-
report: reportProjection(project, job),
|
|
276
|
-
};
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* 拆解报告投影(§6.2):报告实体 id 记在 `merge_written` 的 `reference` 条目上(S4 写入;重跑更新同一条
|
|
280
|
-
* ⇒ 清单里恒至多一条)——按该 id 回读名字。实体被软删(用户丢进回收站)→ null(不报影子报告)。
|
|
281
|
-
*/
|
|
282
|
-
function reportProjection(project, job) {
|
|
283
|
-
const entry = job.merge_written.find((item) => item.type === DECOMPOSE_REPORT_ENTITY_TYPE);
|
|
284
|
-
if (entry === undefined)
|
|
285
|
-
return null;
|
|
286
|
-
const entity = getEntity(project.db, entry.id);
|
|
287
|
-
return entity === null ? null : { entityId: entity.id, name: entity.name };
|
|
288
|
-
}
|
|
289
|
-
//# sourceMappingURL=job.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"job.js","sourceRoot":"","sources":["../../src/decompose/job.ts"],"names":[],"mappings":"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"}
|
package/dist/decompose/llm.d.ts
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { type Usage } from "@earendil-works/pi-ai";
|
|
2
|
-
import { SettingsManager, type ModelRuntime } from "@earendil-works/pi-coding-agent";
|
|
3
|
-
/** 拆解管线的可注入依赖(缺省走 pi 单例;同一份依赖贯穿 S2 / S3 / S4) */
|
|
4
|
-
export interface DecomposeLlmDeps {
|
|
5
|
-
runtime?: ModelRuntime;
|
|
6
|
-
settings?: SettingsManager;
|
|
7
|
-
}
|
|
8
|
-
/** 单次补全入参(系统提示 = 角色与输出契约;用户消息 = 本次素材) */
|
|
9
|
-
export interface ModelRequest {
|
|
10
|
-
system: string;
|
|
11
|
-
user: string;
|
|
12
|
-
}
|
|
13
|
-
/** 单次补全产物:末条 assistant 文本 + 本次用量(过程条目记用量用) */
|
|
14
|
-
export interface DecomposeCompletion {
|
|
15
|
-
text: string;
|
|
16
|
-
usage: Usage;
|
|
17
|
-
}
|
|
18
|
-
/** 过程条目类别(`#/decompose` 时间线按它分组;文案由服务端渲染成单行中文,客户端直接展示) */
|
|
19
|
-
export declare const DECOMPOSE_LOG_KINDS: readonly ["session_pruned", "snapshot", "batch_start", "attempt_failed", "batch_done", "merge_done", "report_done"];
|
|
20
|
-
export type DecomposeLogKind = (typeof DECOMPOSE_LOG_KINDS)[number];
|
|
21
|
-
/** 过程条目(custom entry 的 data;不参与 LLM 上下文,只服务拆解记录时间线) */
|
|
22
|
-
export interface DecomposeLogEntry {
|
|
23
|
-
kind: DecomposeLogKind;
|
|
24
|
-
/** 单行中文文案(服务端渲染) */
|
|
25
|
-
text: string;
|
|
26
|
-
/** 落盘时刻(ISO 8601) */
|
|
27
|
-
at: string;
|
|
28
|
-
/** 所属批序号(批级条目的定位锚;归并 / 报告条目不带) */
|
|
29
|
-
batchSeq?: number;
|
|
30
|
-
}
|
|
31
|
-
/** 记一条过程条目的入参(`at` 由会话盖章,调用方不生成时间) */
|
|
32
|
-
export type DecomposeLogInput = Omit<DecomposeLogEntry, "at">;
|
|
33
|
-
/** custom entry 的 `customType`(读侧按它过滤出过程条目) */
|
|
34
|
-
export declare const DECOMPOSE_LOG_CUSTOM_TYPE = "decompose";
|
|
35
|
-
/** 一枚拆解会话(= 一个 job 的过程记录):S2 / S3 / S4 的所有调用与过程条目都写进它 */
|
|
36
|
-
export interface DecomposeSession {
|
|
37
|
-
/** pi 会话 id(= `decompose-<清洗后 jobId>`) */
|
|
38
|
-
sessionId: string;
|
|
39
|
-
/** 单轮补全:本轮 system + 本轮素材 → 末条 assistant 文本(每轮独立成根,上下文只含本轮) */
|
|
40
|
-
complete(request: ModelRequest): Promise<DecomposeCompletion>;
|
|
41
|
-
/** 记一条过程条目(不参与 LLM 上下文) */
|
|
42
|
-
log(entry: DecomposeLogInput): void;
|
|
43
|
-
}
|
|
44
|
-
/** 开会话的入参(`projectRoot` 必填:会话 cwd 与 `sessions/` 落点都由它定,避免落到进程 cwd) */
|
|
45
|
-
export interface OpenDecomposeSessionInput {
|
|
46
|
-
/** 项目根(pi 的会话身份上下文;`sessions/` 建在它下面) */
|
|
47
|
-
projectRoot: string;
|
|
48
|
-
/** job id(`decomposeSessionId` 清洗后拼进会话 id) */
|
|
49
|
-
jobId: string;
|
|
50
|
-
/** 书名(会话名 = 「《书名》拆解」);缺省回退项目目录名 */
|
|
51
|
-
bookName?: string;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* 拆解会话 id(**唯一组装点**):`decompose-` 前缀 + 清洗后的 job id。
|
|
55
|
-
* 清洗口径 = pi `SessionManager` 的 id 约束(非空、只允许 `[A-Za-z0-9._-]`、首尾必须是字母数字):
|
|
56
|
-
* 我们的 id 是 `job-<nanoid>`,而 nanoid 字母表含 `-`/`_` ⇒ **可能以 `-` 结尾**(实测踩到过),
|
|
57
|
-
* 直接当会话 id 会抛错。清不出合法 id(一个字母数字都没有)时抛错——静默交给 pi 自生成会得到一枚
|
|
58
|
-
* **不带前缀**的会话文件,chat 侧守卫与保留上限都认不出它。
|
|
59
|
-
*/
|
|
60
|
-
export declare function decomposeSessionId(jobId: string): string;
|
|
61
|
-
/**
|
|
62
|
-
* 打开一个 job 的拆解会话(缺模型 / 缺凭据 → 抛错,调用方决定落失败还是重试)。
|
|
63
|
-
* 既有会话文件(resume / 单批重跑)→ 打开续写,**不新建第二枚**。
|
|
64
|
-
*/
|
|
65
|
-
export declare function openDecomposeSession(deps: DecomposeLlmDeps, input: OpenDecomposeSessionInput): Promise<DecomposeSession>;
|
|
66
|
-
/** 取模型输出里的 JSON 对象:容忍 ```json 围栏与前后解释文字(模型常见形态);坏 JSON 抛错 → 调用方定夺 */
|
|
67
|
-
export declare function parseModelJson(text: string): unknown;
|
|
68
|
-
//# sourceMappingURL=llm.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/decompose/llm.ts"],"names":[],"mappings":"AAmCA,OAAO,EAA2D,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC5G,OAAO,EAIL,eAAe,EACf,KAAK,YAAY,EAClB,MAAM,iCAAiC,CAAC;AAKzC,iDAAiD;AACjD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,yCAAyC;AACzC,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,8CAA8C;AAC9C,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;CACd;AAED,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,qHAQtB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,gBAAgB,CAAC;IACvB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,sCAAsC;AACtC,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;AAE9D,+CAA+C;AAC/C,eAAO,MAAM,yBAAyB,cAAc,CAAC;AAErD,yDAAyD;AACzD,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC9D,2BAA2B;IAC3B,GAAG,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACrC;AAED,sEAAsE;AACtE,MAAM,WAAW,yBAAyB;IACxC,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOxD;AAqBD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,gBAAgB,CAAC,CA+D3B;AAuBD,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOpD"}
|
package/dist/decompose/llm.js
DELETED
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
// 拆解管线的模型调用底座(S2 批抽取 / S3 别名归并 / S4 报告共用)。
|
|
2
|
-
//
|
|
3
|
-
// **一律走 pi 的 Agent 路径**(2026-09 裁决):不自建 fetch、不直连 `ModelRuntime.completeSimple`。
|
|
4
|
-
// 理由:provider 特化行为(如 opencode 系的 `x-opencode-session`,缺则 400 MissingSessionID)、
|
|
5
|
-
// 重试/超时设置(`getProviderRetrySettings`)、思考档位都**只在 pi 的 Agent 包装层生效**
|
|
6
|
-
// (`pi-coding-agent` core/sdk.js 的 streamFn → `transformHeaders` → `mergeProviderAttributionHeaders`),
|
|
7
|
-
// 自己补一遍等于「无限期跟随上游」。
|
|
8
|
-
//
|
|
9
|
-
// 形态 = **每 job 一枚落盘会话,每 turn 独立成根**(docs/design/60-decompose.md §2.1):
|
|
10
|
-
// - 落点:`<项目根>/sessions/<时间戳>_decompose-<jobId>.jsonl`(与 chat 会话同目录 ⇒ 纯本地目录,不进任何 zip;
|
|
11
|
-
// 换机器/换创作根后拆解过程记录不跟随,job 状态与批结果在 data.db 内、随三文件走);
|
|
12
|
-
// - 会话 id:`decompose-<清洗后的 jobId>`(清洗与组装同一纯函数 `decomposeSessionId`;前缀常量在 shared);
|
|
13
|
-
// - 每 turn:`resetLeaf()` 后再 prompt ⇒ 本轮用户消息是**新根**(`parentId: null`),模型上下文只含本轮
|
|
14
|
-
// ——累积历史是 O(N²) 重复付费(一本 757 章的书差两个数量级),故每轮必须新根;
|
|
15
|
-
// - 自动压缩关闭(一轮一上下文,没有可压缩的东西);
|
|
16
|
-
// - 过程条目 `appendCustomEntry("decompose", …)`:**不参与 LLM 上下文**,供 `#/decompose` 时间线读;
|
|
17
|
-
// - system prompt 按调用给(S2 / S3 / S4 各一套)⇒ 每次调用新建一个 AgentSession,但**共用同一枚
|
|
18
|
-
// SessionManager**(会话文件只有一枚);`noTools: "all"`(拆解不需要任何工具,正文由服务端注入);
|
|
19
|
-
// - 既有会话文件(暂停后 resume / 单批重跑)复用同一枚:否则同一 job 会散成多枚文件(§7.2 的上限按 job 算)。
|
|
20
|
-
//
|
|
21
|
-
// 两个 pi 行为上的坑(实测):
|
|
22
|
-
// 1. `resetLeaf()` 只重置 pi 的 leaf 指针,**不清 agent 的内存消息**——若建会话时 leaf 还指着上一轮,
|
|
23
|
-
// pi 会把整段历史装回 agent 再发出去(实测第二轮请求体含第一轮原文)⇒ 建会话**前**先 resetLeaf;
|
|
24
|
-
// 2. 建会话会往会话里写 `model_change` / `thinking_level_change` 元数据条目并推进 leaf ⇒ prompt 前
|
|
25
|
-
// 再 resetLeaf 一次,本轮用户消息才是新根(元数据条目留在文件里,与 chat 会话同形态)。
|
|
26
|
-
//
|
|
27
|
-
// `setAutoCompactionEnabled(false)` 写的是 settingsManager(会落盘)⇒ 拆解用**本项目设置快照的内存副本**
|
|
28
|
-
// (`SettingsManager.inMemory`),绝不改用户全局设置(否则会把 chat 会话的自动压缩一起关掉)。
|
|
29
|
-
//
|
|
30
|
-
// 模型目录 / 凭据 / settings 全经 server 的 `getModelRuntime()` / `getSettingsManager()` 单例,
|
|
31
|
-
// 出站统一走启动时装好的全局 undici dispatcher(http-dispatcher.ts)。`deps` 可注入:测试用
|
|
32
|
-
// faux provider 离线跑通,不触网。
|
|
33
|
-
import { existsSync, readdirSync } from "node:fs";
|
|
34
|
-
import { basename, join } from "node:path";
|
|
35
|
-
import { contentText, parseJsonWithRepair } from "@earendil-works/pi-ai";
|
|
36
|
-
import { createAgentSessionFromServices, createAgentSessionServices, SessionManager, SettingsManager, } from "@earendil-works/pi-coding-agent";
|
|
37
|
-
import { DECOMPOSE_SESSION_ID_PREFIX } from "@whispering233/ai-editor-shared";
|
|
38
|
-
import { projectSessionsDir, resolveAgentDir } from "@whispering233/ai-editor-agent";
|
|
39
|
-
import { getModelRuntime, getSettingsManager, resolveActiveSelection } from "../model-runtime.js";
|
|
40
|
-
/** 过程条目类别(`#/decompose` 时间线按它分组;文案由服务端渲染成单行中文,客户端直接展示) */
|
|
41
|
-
export const DECOMPOSE_LOG_KINDS = [
|
|
42
|
-
"session_pruned",
|
|
43
|
-
"snapshot",
|
|
44
|
-
"batch_start",
|
|
45
|
-
"attempt_failed",
|
|
46
|
-
"batch_done",
|
|
47
|
-
"merge_done",
|
|
48
|
-
"report_done",
|
|
49
|
-
];
|
|
50
|
-
/** custom entry 的 `customType`(读侧按它过滤出过程条目) */
|
|
51
|
-
export const DECOMPOSE_LOG_CUSTOM_TYPE = "decompose";
|
|
52
|
-
/**
|
|
53
|
-
* 拆解会话 id(**唯一组装点**):`decompose-` 前缀 + 清洗后的 job id。
|
|
54
|
-
* 清洗口径 = pi `SessionManager` 的 id 约束(非空、只允许 `[A-Za-z0-9._-]`、首尾必须是字母数字):
|
|
55
|
-
* 我们的 id 是 `job-<nanoid>`,而 nanoid 字母表含 `-`/`_` ⇒ **可能以 `-` 结尾**(实测踩到过),
|
|
56
|
-
* 直接当会话 id 会抛错。清不出合法 id(一个字母数字都没有)时抛错——静默交给 pi 自生成会得到一枚
|
|
57
|
-
* **不带前缀**的会话文件,chat 侧守卫与保留上限都认不出它。
|
|
58
|
-
*/
|
|
59
|
-
export function decomposeSessionId(jobId) {
|
|
60
|
-
const cleaned = jobId
|
|
61
|
-
.replace(/[^A-Za-z0-9._-]/g, "")
|
|
62
|
-
.replace(/^[^A-Za-z0-9]+/, "")
|
|
63
|
-
.replace(/[^A-Za-z0-9]+$/, "");
|
|
64
|
-
if (cleaned === "")
|
|
65
|
-
throw new Error(`job id 无法适配 pi 的会话 id 约束: ${jobId}`);
|
|
66
|
-
return `${DECOMPOSE_SESSION_ID_PREFIX}${cleaned}`;
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* 拆解用的资源加载选项:四项全关(扩展 / 技能 / 提示词模板 / 上下文文件=AGENTS.md),
|
|
70
|
-
* system prompt = 本次调用的 system(拆解提示词自包含,不掺 pi 内核提示词)。
|
|
71
|
-
*/
|
|
72
|
-
function decomposeResourceOptions(systemPrompt) {
|
|
73
|
-
return {
|
|
74
|
-
noExtensions: true,
|
|
75
|
-
noSkills: true,
|
|
76
|
-
noPromptTemplates: true,
|
|
77
|
-
noContextFiles: true,
|
|
78
|
-
systemPrompt,
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* 打开一个 job 的拆解会话(缺模型 / 缺凭据 → 抛错,调用方决定落失败还是重试)。
|
|
83
|
-
* 既有会话文件(resume / 单批重跑)→ 打开续写,**不新建第二枚**。
|
|
84
|
-
*/
|
|
85
|
-
export async function openDecomposeSession(deps, input) {
|
|
86
|
-
const runtime = deps.runtime ?? (await getModelRuntime());
|
|
87
|
-
const settings = deps.settings ?? getSettingsManager();
|
|
88
|
-
const selection = await resolveActiveSelection(runtime, settings);
|
|
89
|
-
if (selection === null)
|
|
90
|
-
throw new Error("未配置可用模型:请先在设置页选择模型");
|
|
91
|
-
if (!runtime.hasConfiguredAuth(selection.provider)) {
|
|
92
|
-
throw new Error(`未配置 ${selection.provider} 的凭据:请在设置页填写 API key`);
|
|
93
|
-
}
|
|
94
|
-
const model = runtime.getModel(selection.provider, selection.modelId);
|
|
95
|
-
if (model === undefined)
|
|
96
|
-
throw new Error(`模型不可用: ${selection.provider}/${selection.modelId}`);
|
|
97
|
-
// 本项目设置的内存副本:拆解要关自动压缩,而 `setAutoCompactionEnabled` 写的是 settingsManager(会落盘)
|
|
98
|
-
// ⇒ 用副本,用户全局设置与 chat 会话的自动压缩都不受影响(重试/超时/思考档位照旧来自用户设置)
|
|
99
|
-
const sessionSettings = SettingsManager.inMemory(settings.getGlobalSettings());
|
|
100
|
-
const sessionId = decomposeSessionId(input.jobId);
|
|
101
|
-
const sessionsDir = projectSessionsDir(input.projectRoot);
|
|
102
|
-
const existing = existingSessionFile(sessionsDir, sessionId);
|
|
103
|
-
const sessionManager = existing === null
|
|
104
|
-
? SessionManager.create(input.projectRoot, sessionsDir, { id: sessionId })
|
|
105
|
-
: SessionManager.open(existing, sessionsDir);
|
|
106
|
-
if (existing === null) {
|
|
107
|
-
// 会话名(列表里显示正经名字,而不是被截断的原文);续写既有文件不重复追加
|
|
108
|
-
sessionManager.appendSessionInfo(`《${input.bookName ?? basename(input.projectRoot)}》拆解`);
|
|
109
|
-
}
|
|
110
|
-
return {
|
|
111
|
-
sessionId,
|
|
112
|
-
async complete(request) {
|
|
113
|
-
// 建会话前先清 leaf:否则 pi 会把「leaf 路径上的历史」装回 agent,本轮请求体会带上整段旧原文
|
|
114
|
-
sessionManager.resetLeaf();
|
|
115
|
-
const services = await createAgentSessionServices({
|
|
116
|
-
cwd: input.projectRoot,
|
|
117
|
-
agentDir: resolveAgentDir(),
|
|
118
|
-
settingsManager: sessionSettings,
|
|
119
|
-
modelRuntime: runtime,
|
|
120
|
-
resourceLoaderOptions: decomposeResourceOptions(request.system),
|
|
121
|
-
});
|
|
122
|
-
const { session } = await createAgentSessionFromServices({
|
|
123
|
-
services,
|
|
124
|
-
sessionManager,
|
|
125
|
-
model,
|
|
126
|
-
noTools: "all",
|
|
127
|
-
});
|
|
128
|
-
session.setAutoCompactionEnabled(false);
|
|
129
|
-
// 建会话写了 model_change / thinking_level_change 并推进 leaf ⇒ 再清一次,本轮用户消息才是新根
|
|
130
|
-
sessionManager.resetLeaf();
|
|
131
|
-
try {
|
|
132
|
-
await session.prompt(request.user);
|
|
133
|
-
const assistant = lastAssistantMessage(session.messages);
|
|
134
|
-
if (assistant === undefined)
|
|
135
|
-
throw new Error("模型没有返回 assistant 消息");
|
|
136
|
-
if (assistant.stopReason === "error" || assistant.stopReason === "aborted") {
|
|
137
|
-
throw new Error(assistant.errorMessage ?? `模型调用失败(${assistant.stopReason})`);
|
|
138
|
-
}
|
|
139
|
-
return { text: contentText(assistant.content), usage: assistant.usage };
|
|
140
|
-
}
|
|
141
|
-
finally {
|
|
142
|
-
session.dispose();
|
|
143
|
-
}
|
|
144
|
-
},
|
|
145
|
-
log(entry) {
|
|
146
|
-
sessionManager.appendCustomEntry(DECOMPOSE_LOG_CUSTOM_TYPE, { ...entry, at: new Date().toISOString() });
|
|
147
|
-
},
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* 既有拆解会话文件(同 id):pi 的落盘文件名是 `<时间戳>_<会话 id>.jsonl`(`SessionManager.newSession`),
|
|
152
|
-
* 按 id 后缀命中;命中多个(不该发生)取文件名最大的一个。pi 是 exact pin(0.85.1),命名不由本模块自造。
|
|
153
|
-
*/
|
|
154
|
-
function existingSessionFile(sessionsDir, sessionId) {
|
|
155
|
-
if (!existsSync(sessionsDir))
|
|
156
|
-
return null;
|
|
157
|
-
const suffix = `_${sessionId}.jsonl`;
|
|
158
|
-
const files = readdirSync(sessionsDir).filter((name) => name.endsWith(suffix)).sort();
|
|
159
|
-
const last = files[files.length - 1];
|
|
160
|
-
return last === undefined ? null : join(sessionsDir, last);
|
|
161
|
-
}
|
|
162
|
-
/** 末条 assistant 消息(pi 的会话消息里工具结果/用户消息可能排在后面,故从尾部找 assistant) */
|
|
163
|
-
function lastAssistantMessage(messages) {
|
|
164
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
165
|
-
const message = messages[i];
|
|
166
|
-
if (message !== undefined && message.role === "assistant")
|
|
167
|
-
return message;
|
|
168
|
-
}
|
|
169
|
-
return undefined;
|
|
170
|
-
}
|
|
171
|
-
/** 取模型输出里的 JSON 对象:容忍 ```json 围栏与前后解释文字(模型常见形态);坏 JSON 抛错 → 调用方定夺 */
|
|
172
|
-
export function parseModelJson(text) {
|
|
173
|
-
const fenced = /```(?:json)?\s*([\s\S]*?)```/i.exec(text);
|
|
174
|
-
const body = (fenced?.[1] ?? text).trim();
|
|
175
|
-
const start = body.indexOf("{");
|
|
176
|
-
const end = body.lastIndexOf("}");
|
|
177
|
-
if (start === -1 || end <= start)
|
|
178
|
-
throw new Error("模型输出里找不到 JSON 对象");
|
|
179
|
-
return parseJsonWithRepair(body.slice(start, end + 1));
|
|
180
|
-
}
|
|
181
|
-
//# sourceMappingURL=llm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/decompose/llm.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,EAAE;AACF,iFAAiF;AACjF,gFAAgF;AAChF,mEAAmE;AACnE,uGAAuG;AACvG,oBAAoB;AACpB,EAAE;AACF,uEAAuE;AACvE,qFAAqF;AACrF,qDAAqD;AACrD,kFAAkF;AAClF,+EAA+E;AAC/E,kDAAkD;AAClD,6BAA6B;AAC7B,mFAAmF;AACnF,yEAAyE;AACzE,qEAAqE;AACrE,sEAAsE;AACtE,EAAE;AACF,mBAAmB;AACnB,2EAA2E;AAC3E,kEAAkE;AAClE,iFAAiF;AACjF,yDAAyD;AACzD,EAAE;AACF,kFAAkF;AAClF,iEAAiE;AACjE,EAAE;AACF,oFAAoF;AACpF,qEAAqE;AACrE,0BAA0B;AAE1B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAqC,MAAM,uBAAuB,CAAC;AAC5G,OAAO,EACL,8BAA8B,EAC9B,0BAA0B,EAC1B,cAAc,EACd,eAAe,GAEhB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAoBlG,0DAA0D;AAC1D,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,gBAAgB;IAChB,UAAU;IACV,aAAa;IACb,gBAAgB;IAChB,YAAY;IACZ,YAAY;IACZ,aAAa;CACL,CAAC;AAkBX,+CAA+C;AAC/C,MAAM,CAAC,MAAM,yBAAyB,GAAG,WAAW,CAAC;AAsBrD;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,OAAO,GAAG,KAAK;SAClB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;SAC7B,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACjC,IAAI,OAAO,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;IAC1E,OAAO,GAAG,2BAA2B,GAAG,OAAO,EAAE,CAAC;AACpD,CAAC;AAOD;;;GAGG;AACH,SAAS,wBAAwB,CAAC,YAAoB;IACpD,OAAO;QACL,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,IAAI;QACd,iBAAiB,EAAE,IAAI;QACvB,cAAc,EAAE,IAAI;QACpB,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAsB,EACtB,KAAgC;IAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,eAAe,EAAE,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,kBAAkB,EAAE,CAAC;IACvD,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAClE,IAAI,SAAS,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC9D,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,OAAO,SAAS,CAAC,QAAQ,sBAAsB,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IACtE,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAE9F,4EAA4E;IAC5E,sDAAsD;IACtD,MAAM,eAAe,GAAG,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC/E,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC7D,MAAM,cAAc,GAClB,QAAQ,KAAK,IAAI;QACf,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;QAC1E,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACjD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,uCAAuC;QACvC,cAAc,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO;QACL,SAAS;QACT,KAAK,CAAC,QAAQ,CAAC,OAAO;YACpB,0DAA0D;YAC1D,cAAc,CAAC,SAAS,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC;gBAChD,GAAG,EAAE,KAAK,CAAC,WAAW;gBACtB,QAAQ,EAAE,eAAe,EAAE;gBAC3B,eAAe,EAAE,eAAe;gBAChC,YAAY,EAAE,OAAO;gBACrB,qBAAqB,EAAE,wBAAwB,CAAC,OAAO,CAAC,MAAM,CAAC;aAChE,CAAC,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,8BAA8B,CAAC;gBACvD,QAAQ;gBACR,cAAc;gBACd,KAAK;gBACL,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,OAAO,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;YACxC,wEAAwE;YACxE,cAAc,CAAC,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACnC,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACzD,IAAI,SAAS,KAAK,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBACpE,IAAI,SAAS,CAAC,UAAU,KAAK,OAAO,IAAI,SAAS,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;oBAC3E,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,YAAY,IAAI,UAAU,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC;gBAC/E,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC;YAC1E,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,CAAC;QACH,CAAC;QACD,GAAG,CAAC,KAAK;YACP,cAAc,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC1G,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,WAAmB,EAAE,SAAiB;IACjE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,SAAS,QAAQ,CAAC;IACrC,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtF,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,gEAAgE;AAChE,SAAS,oBAAoB,CAAC,QAAqC;IACjE,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,OAA2B,CAAC;IAChG,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,MAAM,GAAG,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtE,OAAO,mBAAmB,CAAU,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC"}
|