@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/index.js
CHANGED
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
//
|
|
4
4
|
// 职责(第 307-336 行「构建与部署」):
|
|
5
5
|
// - startServer(projectRoot, opts?):检测/初始化项目→ 装配 Hono(错误中间件 +
|
|
6
|
-
// 来源校验 + 项目上下文 + /api/v1/health 探活)→
|
|
6
|
+
// 来源校验 + 项目上下文 + /api/v1/health 探活)→ 端口策略监听(按形态分段,见 `PORT_RANGES`)→
|
|
7
7
|
// 可选打开浏览器(127.0.0.1,禁 localhost)
|
|
8
8
|
// - SPA 静态托管:client/dist 静态文件 + 非 /api GET fallback 到 index.html(单进程架构)
|
|
9
9
|
// - 直接执行(node packages/server/dist/index.js [projectRoot])时自动启动;业务路由(routes/)
|
|
10
10
|
// 留到切片 1 挂载(结构预留:health 旁并列注册即可)
|
|
11
11
|
// - bin 入口(打包安装):package.json "bin": {"ai-editor": "dist/index.js"}——
|
|
12
12
|
// shebang 必须是文件首行(tsc 构建保留),npm 全局/本地安装后生成 ai-editor 命令;
|
|
13
|
-
// argv[2] 为项目根(缺省 cwd),NODE_ENV 非 development
|
|
13
|
+
// argv[2] 为项目根(缺省 cwd),NODE_ENV 非 development 即生产态(端口在 web 分段内自动 +1)
|
|
14
14
|
import { execFile } from "node:child_process";
|
|
15
15
|
import { readFile } from "node:fs/promises";
|
|
16
16
|
import { existsSync, realpathSync } from "node:fs";
|
|
@@ -19,6 +19,7 @@ import { fileURLToPath } from "node:url";
|
|
|
19
19
|
import { Hono } from "hono";
|
|
20
20
|
import { logger } from "hono/logger";
|
|
21
21
|
import { createAdaptorServer } from "@hono/node-server";
|
|
22
|
+
import { PORT_RANGES } from "@whispering233/ai-editor-shared";
|
|
22
23
|
import { errorHandler, fail, ok } from "./middleware/error.js";
|
|
23
24
|
import { stopAutoBackup } from "./backup.js";
|
|
24
25
|
import { initDebugConfig, isCategoryEnabled } from "./debug.js";
|
|
@@ -39,12 +40,7 @@ import { namesRoutes } from "./routes/names.js"; // 批量名称解析(工具
|
|
|
39
40
|
import { proposalRoutes } from "./routes/proposal.js";
|
|
40
41
|
import { trashRoutes } from "./routes/trash.js";
|
|
41
42
|
import { relationRoutes } from "./routes/relation.js";
|
|
42
|
-
import { decomposeRoutes } from "./routes/decompose.js"; // 拆解小说(analyze 预览 / start 建档 / job / batches / pause / resume)
|
|
43
43
|
import { logSoftDeleteReconcile, reconcileSoftDelete } from "./consistency.js";
|
|
44
|
-
/** 默认端口(dev 态 Vite proxy 写死 3456) */
|
|
45
|
-
export const DEFAULT_PORT = 3456;
|
|
46
|
-
/** 生产态端口 +1 重试上限(占用自动 +1) */
|
|
47
|
-
const MAX_PORT_ATTEMPTS = 20;
|
|
48
44
|
/** 静态文件 MIME(client/dist 产物类型) */
|
|
49
45
|
const CONTENT_TYPES = {
|
|
50
46
|
".html": "text/html; charset=utf-8",
|
|
@@ -120,7 +116,9 @@ async function readFileSafe(filePath) {
|
|
|
120
116
|
*/
|
|
121
117
|
export async function startServer(projectRoot, options = {}) {
|
|
122
118
|
const dev = options.dev ?? process.env.NODE_ENV === "development";
|
|
123
|
-
const
|
|
119
|
+
const range = dev ? PORT_RANGES.dev : PORT_RANGES.web;
|
|
120
|
+
const port = options.port ?? range.base;
|
|
121
|
+
const attempts = options.maxAttempts ?? range.attempts;
|
|
124
122
|
const openBrowser = options.openBrowser ?? !dev;
|
|
125
123
|
const clientDist = options.clientDist ?? defaultClientDist();
|
|
126
124
|
// 创作根归一化(2026-08 修复):CLI 以相对路径启动(node packages/server/dist/index.js
|
|
@@ -191,9 +189,6 @@ export async function startServer(projectRoot, options = {}) {
|
|
|
191
189
|
app.route("/api/v1/relation", relationRoutes);
|
|
192
190
|
// 云端存档路由(卡 2):账号配置 + 连通性测试(不要求项目已打开)
|
|
193
191
|
app.route("/api/v1/cloud", cloudRoutes);
|
|
194
|
-
// 拆解小说路由:POST /api/v1/decompose/analyze(原始字节 → 切分预览,**不要求项目已打开**)/
|
|
195
|
-
// start(建档 + 起 S2 批执行)/ GET job、job/batches/:seq(进度与单批结果)/ POST job/pause、job/resume(暂停与续拆)
|
|
196
|
-
app.route("/api/v1/decompose", decomposeRoutes);
|
|
197
192
|
// Delta 路由(S5.3):追加 / 按节点查询 / compute 状态计算
|
|
198
193
|
app.route("/api/v1/delta", deltaRoutes);
|
|
199
194
|
// 对话路由(U3):会话列表 / 消息历史(按项目隔离;POST SSE 端点属后续切片)
|
|
@@ -225,8 +220,8 @@ export async function startServer(projectRoot, options = {}) {
|
|
|
225
220
|
}
|
|
226
221
|
return new Response(html, { headers: { "Content-Type": "text/html; charset=utf-8" } });
|
|
227
222
|
});
|
|
228
|
-
//
|
|
229
|
-
const maxPort =
|
|
223
|
+
// 端口策略:在形态分段内 +1 重试(`attempts` = 1 即严格单端口,被占直接报错)
|
|
224
|
+
const maxPort = port + attempts - 1;
|
|
230
225
|
let server = null;
|
|
231
226
|
let actualPort = port;
|
|
232
227
|
for (let p = port; p <= maxPort; p++) {
|
|
@@ -294,7 +289,7 @@ export async function openBrowserUrl(url) {
|
|
|
294
289
|
/**
|
|
295
290
|
* 解析 AI_EDITOR_PORT 环境变量(bin 入口用,防御非法输入):
|
|
296
291
|
* 合法范围 = 1-65535 的整数端口;未设置/空串/NaN/越界/非整数 → undefined,
|
|
297
|
-
*
|
|
292
|
+
* 调用方回退当前形态的分段起点(`PORT_RANGES`)。此前 `Number("abc")` → NaN 会传入
|
|
298
293
|
* 端口逻辑导致监听行为未定义;回退默认是文档声明端口,启动日志会打印实际端口,
|
|
299
294
|
* 无歧义且不中断启动(与生产态端口容错精神一致,不升级为启动失败)。
|
|
300
295
|
*/
|
|
@@ -331,7 +326,8 @@ if (isDirectRun) {
|
|
|
331
326
|
const projectRoot = process.argv[2] ?? process.cwd();
|
|
332
327
|
const dev = process.env.NODE_ENV === "development";
|
|
333
328
|
// AI_EDITOR_PORT 环境变量可覆盖默认端口(端口策略;测试/多实例场景用,
|
|
334
|
-
// 如打包安装冒烟与 dev server
|
|
329
|
+
// 如打包安装冒烟与 dev server 并存时指定独立端口)——覆盖即绕过分段隔离;
|
|
330
|
+
// 非法值(NaN/越界)回退当前形态的分段起点
|
|
335
331
|
const port = parsePortEnv(process.env.AI_EDITOR_PORT);
|
|
336
332
|
const handle = await startServer(projectRoot, { dev, ...(port !== undefined ? { port } : {}) });
|
|
337
333
|
console.log(handle.project === null
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import type { ContentfulStatusCode } from "hono/utils/http-status";
|
|
|
2
2
|
import type { ErrorHandler } from "hono";
|
|
3
3
|
import type { ErrorCode } from "@whispering233/ai-editor-shared";
|
|
4
4
|
/** 服务端补充错误码(不在 shared ErrorCode 枚举内) */
|
|
5
|
-
export declare const SERVER_ERROR_CODES: readonly ["INTERNAL_ERROR", "FORBIDDEN", "NOT_FOUND", "NO_PROJECT_OPEN", "PROJECT_ALREADY_EXISTS", "LLM_API_KEY_MISSING", "CLOUD_NOT_CONFIGURED", "CLOUD_AUTH_FAILED", "CLOUD_UNREACHABLE", "CLOUD_QUOTA_EXCEEDED", "CLOUD_CONFLICT", "CLOUD_BACKUP_TOO_LARGE", "CLOUD_FILE_NOT_FOUND"
|
|
5
|
+
export declare const SERVER_ERROR_CODES: readonly ["INTERNAL_ERROR", "FORBIDDEN", "NOT_FOUND", "NO_PROJECT_OPEN", "PROJECT_ALREADY_EXISTS", "LLM_API_KEY_MISSING", "CLOUD_NOT_CONFIGURED", "CLOUD_AUTH_FAILED", "CLOUD_UNREACHABLE", "CLOUD_QUOTA_EXCEEDED", "CLOUD_CONFLICT", "CLOUD_BACKUP_TOO_LARGE", "CLOUD_FILE_NOT_FOUND"];
|
|
6
6
|
export type ServerErrorCode = (typeof SERVER_ERROR_CODES)[number];
|
|
7
7
|
export type ApiErrorCode = ErrorCode | ServerErrorCode;
|
|
8
8
|
/** 成功响应包裹 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/middleware/error.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAEjE,wCAAwC;AACxC,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/middleware/error.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAEjE,wCAAwC;AACxC,eAAO,MAAM,kBAAkB,yRAgBrB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,eAAe,CAAC;AAEvD,aAAa;AACb,wBAAgB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,CAEzD;AAED,oDAAoD;AACpD,wBAAgB,IAAI,CAClB,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,EAAE,GAChB;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,CAEvF;AAED;;;GAGG;AACH,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;gBACrB,MAAM,EAAE,oBAAoB,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM;CAOvG;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,IAAI,YAAY,CAgB3C"}
|
package/dist/middleware/error.js
CHANGED
|
@@ -23,15 +23,6 @@ export const SERVER_ERROR_CODES = [
|
|
|
23
23
|
"CLOUD_CONFLICT", // 409:推送时云端 head ≠ 本机 lastPushedFileName(另一台机器写过)
|
|
24
24
|
"CLOUD_BACKUP_TOO_LARGE", // 400:备份包超过云盘单文件上限(推送前本地判定)
|
|
25
25
|
"CLOUD_FILE_NOT_FOUND", // 404:拉取指定的云端备份不存在(已被保留策略清理或手动删除)
|
|
26
|
-
// 拆解小说(码表说明见 docs/api/120-api-decompose.md「错误码」):文件 / 建档 / job 进度 / 续拆四条链路的码
|
|
27
|
-
"DECOMPOSE_FILE_TOO_LARGE", // 400:上传的小说文件超体积上限(DECOMPOSE_MAX_FILE_BYTES)
|
|
28
|
-
"DECOMPOSE_FILE_INVALID", // 400:解码后无可解析文本(空文件 / 非文本内容)
|
|
29
|
-
"DECOMPOSE_JOB_NOT_FOUND", // 404:当前项目没有 job
|
|
30
|
-
"DECOMPOSE_BATCH_NOT_FOUND", // 404:批序号越界
|
|
31
|
-
"DECOMPOSE_JOB_STATE", // 409:当前 job 状态不允许该操作(pause / resume / rerun 的前置)
|
|
32
|
-
"DECOMPOSE_NO_CHAPTERS", // 404:续拆预览——项目里没有章(没有可拆的正文)
|
|
33
|
-
"DECOMPOSE_NOTHING_TO_DO", // 400:续拆启动——范围里一章都没有(缺省且无未拆章)
|
|
34
|
-
"DECOMPOSE_JOB_RUNNING", // 409:删除拆解会话被拒——该 `decompose-` 会话所属 job 仍在跑(chat 侧守卫)
|
|
35
26
|
];
|
|
36
27
|
/** 成功响应包裹 */
|
|
37
28
|
export function ok(data) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/middleware/error.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,EAAE;AACF,6EAA6E;AAC7E,wDAAwD;AACxD,uEAAuE;AACvE,sFAAsF;AACtF,wDAAwD;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAK/B,wCAAwC;AACxC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,gBAAgB;IAChB,WAAW;IACX,WAAW;IACX,iBAAiB;IACjB,wBAAwB;IACxB,qBAAqB,EAAE,wCAAwC;IAChE,sFAAsF;IACtF,uBAAuB;IACtB,sBAAsB,EAAE,4BAA4B;IACpD,mBAAmB,EAAE,wBAAwB;IAC7C,mBAAmB,EAAE,2BAA2B;IAChD,sBAAsB,EAAE,mBAAmB;IAC3C,gBAAgB,EAAE,kDAAkD;IACpE,wBAAwB,EAAE,4BAA4B;IACtD,sBAAsB,EAAE,kCAAkC;
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/middleware/error.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,EAAE;AACF,6EAA6E;AAC7E,wDAAwD;AACxD,uEAAuE;AACvE,sFAAsF;AACtF,wDAAwD;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAK/B,wCAAwC;AACxC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,gBAAgB;IAChB,WAAW;IACX,WAAW;IACX,iBAAiB;IACjB,wBAAwB;IACxB,qBAAqB,EAAE,wCAAwC;IAChE,sFAAsF;IACtF,uBAAuB;IACtB,sBAAsB,EAAE,4BAA4B;IACpD,mBAAmB,EAAE,wBAAwB;IAC7C,mBAAmB,EAAE,2BAA2B;IAChD,sBAAsB,EAAE,mBAAmB;IAC3C,gBAAgB,EAAE,kDAAkD;IACpE,wBAAwB,EAAE,4BAA4B;IACtD,sBAAsB,EAAE,kCAAkC;CAClD,CAAC;AAKX,aAAa;AACb,MAAM,UAAU,EAAE,CAAI,IAAO;IAC3B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,IAAI,CAClB,IAAkB,EAClB,OAAe,EACf,MAAiB;IAEjB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;AACrF,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,MAAM,CAAuB;IAC7B,IAAI,CAAe;IAC5B;;;;OAIG;IACM,cAAc,CAAU;IACjC,YAAY,MAA4B,EAAE,IAAkB,EAAE,OAAe,EAAE,cAAuB;QACpG,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,cAAc,KAAK,SAAS;YAAE,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACzE,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QAChB,IAAI,GAAG,YAAY,SAAS,EAAE,CAAC;YAC7B,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YACjC,4EAA4E;YACvE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/D,OAAO,CAAC,CAAC,IAAI,CACX,IAAI,CAAC,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,CAAC,EACpE,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;QACtC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7F,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -75,12 +75,11 @@ export declare function detectProject(root: string): ProjectContext | null;
|
|
|
75
75
|
* 避免后续 open 时 ensureSchemaCompatible 触发无意义重建并留空库 data.db.v0.bak)。
|
|
76
76
|
* 注:`prompt` 已废弃——新项目不再写入该字段(项目规则改由 承载)。
|
|
77
77
|
*
|
|
78
|
-
* @param configOverride 可选覆盖 {name?, language
|
|
79
|
-
*
|
|
80
|
-
* project.json 缺 `origin` = 读侧缺省 `book`(docs/db/schema.md「project.json」)。
|
|
78
|
+
* @param configOverride 可选覆盖 {name?, language?}(create 请求的 config 字段);
|
|
79
|
+
* 传入时 updated_at 一并刷新。
|
|
81
80
|
* @returns 已打开的项目上下文(调用方负责 closeProject;create 路由创建后即关闭)
|
|
82
81
|
*/
|
|
83
|
-
export declare function initProject(root: string, configOverride?: Partial<Pick<ProjectFileConfig, "name" | "language"
|
|
82
|
+
export declare function initProject(root: string, configOverride?: Partial<Pick<ProjectFileConfig, "name" | "language">>): ProjectContext;
|
|
84
83
|
/** 关闭项目:释放数据库连接(WAL + synchronous=FULL 已即时落盘) */
|
|
85
84
|
export declare function closeProject(project: ProjectContext): void;
|
|
86
85
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/middleware/project.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,OAAO,EAA+C,KAAK,EAAE,EAAE,MAAM,6BAA6B,CAAC;AACnG,OAAO,EAA8C,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/middleware/project.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,OAAO,EAA+C,KAAK,EAAE,EAAE,MAAM,6BAA6B,CAAC;AACnG,OAAO,EAA8C,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAW/G,yBAAyB;AACzB,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAK3C,4CAA4C;AAC5C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,iBAAiB,CAAC;IAC1B,EAAE,EAAE,EAAE,CAAC;CACR;AAED,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,cAAc,CAAC;CACzB;AAED,8BAA8B;AAC9B,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,SAAS,EAAE,gBAAgB,CAAA;CAAE,CAAC,GAAG,cAAc,CAEtF;AA4BD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CActE;AAED,uBAAuB;AACvB,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAEzD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,cAAc,CAKtD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,EAAE,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAWpF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAiBjE;AAWD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,cAAc,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,GACrE,cAAc,CAoBhB;AAED,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAE1D;AAYD;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,iBAAiB,CASzD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,iBAAiB,CAQrD"}
|
|
@@ -16,7 +16,6 @@ import { mkdirSync } from "node:fs";
|
|
|
16
16
|
import { generateProjectId, DEFAULT_BACKUP_FREQUENCY_MINUTES } from "@whispering233/ai-editor-shared";
|
|
17
17
|
import { closeDatabase, openDatabase, setUserVersion } from "@whispering233/ai-editor-db";
|
|
18
18
|
import { ensureSchemaCompatible, SchemaVersionError } from "@whispering233/ai-editor-db";
|
|
19
|
-
import { getDecomposeJob, pauseRunningJobs } from "@whispering233/ai-editor-db";
|
|
20
19
|
import { readProjectFile, writeProjectFile } from "@whispering233/ai-editor-db";
|
|
21
20
|
import { writeOutlineFile } from "@whispering233/ai-editor-db";
|
|
22
21
|
import { SCHEMA_VERSION } from "@whispering233/ai-editor-db";
|
|
@@ -26,7 +25,6 @@ import { ensureParseableBackup, migratePromptToAgents, setProjectTick, startAuto
|
|
|
26
25
|
import { AUTO_PUSH_THROTTLE_MS, maybeAutoPush } from "../cloud/auto-push.js";
|
|
27
26
|
import { readAutoPush } from "../cloud/state.js";
|
|
28
27
|
import { disposeProjectRuntime } from "../chat-runtime.js";
|
|
29
|
-
import { cancelRunningDecomposeJobs } from "../decompose/runner.js";
|
|
30
28
|
/** data.db 文件名(项目根目录) */
|
|
31
29
|
export const DATA_DB_FILE_NAME = "data.db";
|
|
32
30
|
/** 来源白名单 host(仅允许本机访问;IPv6 ::1 去括号后比对) */
|
|
@@ -65,24 +63,11 @@ setProjectTick({
|
|
|
65
63
|
* 调度器 tick 内重读 config 自行跟随。
|
|
66
64
|
*/
|
|
67
65
|
export function setCurrentProject(project) {
|
|
68
|
-
// 拆解 job(设计 §7):切书 / 关项目**不做跨书后台跑** —— 旧项目上的在跑 job 在此暂停:
|
|
69
|
-
// ① 通知进程内那一轮停在批间(当前批跑完即停,结果不浪费);② job 行归一为 `paused`。
|
|
70
|
-
// `db.open` 守卫:切换路径可能已先关旧连接(start / open 路由的「新就绪再关旧的」顺序),
|
|
71
|
-
// 写不进去时由「下次打开这本书时的归一」接管(下面 open 分支)。
|
|
72
|
-
const previous = currentProject;
|
|
73
|
-
cancelRunningDecomposeJobs();
|
|
74
|
-
if (previous !== null && previous.db.open)
|
|
75
|
-
pauseRunningJobs(previous.db, nowIso());
|
|
76
66
|
// 旧项目的对话运行时在此释放:中止在途流 → dispose 会话订阅 → 清空提案仓
|
|
77
67
|
//(单点覆盖 create/open/close/restore 全部切换路径,见 chat-runtime.ts)
|
|
78
68
|
disposeProjectRuntime();
|
|
79
69
|
currentProject = project;
|
|
80
70
|
if (project !== null) {
|
|
81
|
-
// 打开项目即归一:服务端重启 / 崩溃残留的 `running` → `paused`(进程内已无在跑 job,
|
|
82
|
-
// UI 提示「上次拆解中断,可续拆」)。**只归一 job 行**:残留的 `running` 批由续拆取批承接
|
|
83
|
-
//(docs/db/schema.md「状态归一」不变式)——故本调用只改 decompose_jobs。
|
|
84
|
-
pauseRunningJobs(project.db, nowIso());
|
|
85
|
-
backfillProjectOrigin(project);
|
|
86
71
|
// 升级兜底(卡 A):旧命名份不再被解析,若磁盘上只剩旧命名且**自动备份频率关闭**,
|
|
87
72
|
// 用户点「立即备份」前列表会是空的——先补一份新格式档(best-effort,函数内部自吞异常记日志,
|
|
88
73
|
// 不阻塞打开;已有可解析份则不做任何事)
|
|
@@ -97,28 +82,6 @@ export function setCurrentProject(project) {
|
|
|
97
82
|
export function getCurrentProject() {
|
|
98
83
|
return currentProject;
|
|
99
84
|
}
|
|
100
|
-
/**
|
|
101
|
-
* 存量项目出处补标(幂等,失败不阻断打开):project.json 缺 `origin` 且库内已有拆解 job
|
|
102
|
-
* → 写一次 `origin: "decompose"` 并同步内存 config(docs/db/schema.md「project.json」的存量补标口径)。
|
|
103
|
-
*
|
|
104
|
-
* **单点理由**:本函数只在 `setCurrentProject`(打开项目的唯一入口——开机 detect 与
|
|
105
|
-
* `POST /project/open` 都经它)调用,不在两处各写一份;判据只看库内有无 job,不看目录名。
|
|
106
|
-
* 写盘失败(权限 / 磁盘)只记日志——补标只是展示分组,绝不能阻塞打开。
|
|
107
|
-
*/
|
|
108
|
-
function backfillProjectOrigin(project) {
|
|
109
|
-
if (project.config.origin !== undefined)
|
|
110
|
-
return;
|
|
111
|
-
try {
|
|
112
|
-
if (getDecomposeJob(project.db) === null)
|
|
113
|
-
return;
|
|
114
|
-
const config = { ...project.config, origin: "decompose" };
|
|
115
|
-
writeProjectFile(project.root, config);
|
|
116
|
-
project.config = config;
|
|
117
|
-
}
|
|
118
|
-
catch (err) {
|
|
119
|
-
console.error(`[server] 项目出处补标失败(不阻断打开): ${project.root}`, err);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
85
|
/**
|
|
123
86
|
* 路由内取当前项目;无已打开项目 → 409 NO_PROJECT_OPEN。
|
|
124
87
|
* (错误码为服务端补充码,不在 shared ErrorCode——记录待收敛,见 error.ts 注释)
|
|
@@ -207,9 +170,8 @@ function logStartupOpenFailure(root, err) {
|
|
|
207
170
|
* 避免后续 open 时 ensureSchemaCompatible 触发无意义重建并留空库 data.db.v0.bak)。
|
|
208
171
|
* 注:`prompt` 已废弃——新项目不再写入该字段(项目规则改由 承载)。
|
|
209
172
|
*
|
|
210
|
-
* @param configOverride 可选覆盖 {name?, language
|
|
211
|
-
*
|
|
212
|
-
* project.json 缺 `origin` = 读侧缺省 `book`(docs/db/schema.md「project.json」)。
|
|
173
|
+
* @param configOverride 可选覆盖 {name?, language?}(create 请求的 config 字段);
|
|
174
|
+
* 传入时 updated_at 一并刷新。
|
|
213
175
|
* @returns 已打开的项目上下文(调用方负责 closeProject;create 路由创建后即关闭)
|
|
214
176
|
*/
|
|
215
177
|
export function initProject(root, configOverride) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/middleware/project.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,EAAE;AACF,iDAAiD;AACjD,4DAA4D;AAC5D,8DAA8D;AAC9D,8DAA8D;AAC9D,2CAA2C;AAC3C,6DAA6D;AAC7D,wDAAwD;AACxD,mEAAmE;AACnE,2CAA2C;AAC3C,oDAAoD;AACpD,sDAAsD;AACtD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,OAAO,EAAE,iBAAiB,EAAE,gCAAgC,EAAE,MAAM,iCAAiC,CAAC;AACtG,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAW,MAAM,6BAA6B,CAAC;AACnG,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAwB,MAAM,6BAA6B,CAAC;AAC/G,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/middleware/project.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/chat.d.ts
CHANGED
|
@@ -24,9 +24,10 @@ export interface ChatRouteDeps {
|
|
|
24
24
|
/** 聚焦章注入的正文节选上限(字符;完整正文由模型调 get_chapter_text 按 offset 分页拉取) */
|
|
25
25
|
export declare const FOCUS_CHAPTER_EXCERPT_CHARS = 2000;
|
|
26
26
|
/**
|
|
27
|
-
* 聚焦上下文文本:focus_entity_id → 实体、focus_node_id →
|
|
27
|
+
* 聚焦上下文文本:focus_entity_id → 实体、focus_node_id → 大纲节点、focus_deduction → 推演节点集合,
|
|
28
|
+
* 拼成结构化文本。
|
|
28
29
|
* 查询不到(已软删/不存在/跨项目)→ 跳过该项(不报错):客户端可能携带过期 focus。
|
|
29
|
-
*
|
|
30
|
+
* 各项皆无(或均无效)→ undefined(不注入,消息原文保持干净)。
|
|
30
31
|
* 聚焦**章**:另注入正文前 `FOCUS_CHAPTER_EXCERPT_CHARS` 字符节选(带「节选」标注)——
|
|
31
32
|
* **不做整章自动入上下文**(正文预算与对话历史共享同一窗口,见 docs/design/20-context.md §2)。
|
|
32
33
|
*/
|
|
@@ -34,6 +35,7 @@ export declare function buildFocusText(project: ProjectContext, context: {
|
|
|
34
35
|
focus_entity_type?: string;
|
|
35
36
|
focus_entity_id?: string;
|
|
36
37
|
focus_node_id?: string;
|
|
38
|
+
focus_deduction?: boolean;
|
|
37
39
|
} | undefined): string | undefined;
|
|
38
40
|
/** pi 会话事件的最小结构形态(结构性类型:server 包不直接依赖 pi 的类型) */
|
|
39
41
|
interface MinimalAgentEvent {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/routes/chat.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/routes/chat.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,IAAI,EAAE,KAAK,OAAO,EAAE,MAAM,MAAM,CAAC;AAG1C,OAAO,EAgBL,KAAK,aAAa,EAClB,KAAK,cAAc,EAGpB,MAAM,gCAAgC,CAAC;AAuBxC,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAGtF,OAAO,EAQL,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAI5B,gDAAgD;AAChD,eAAO,MAAM,oBAAoB;;;CAA4C,CAAC;AAE9E,yDAAyD;AACzD,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAO/C,iCAAiC;AACjC,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,sEAAsE;IACtE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,sCAAsC;IACtC,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAID,+DAA+D;AAC/D,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,cAAc,EACvB,OAAO,EACH;IACE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GACD,SAAS,GACZ,MAAM,GAAG,SAAS,CAsBpB;AAgED,iDAAiD;AACjD,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CA4HjG;AAiCD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE,aAAkB,GAAG,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAqL3F;AAyBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,aAAkB,GAAG,IAAI,CAqF/D;AAED,0CAA0C;AAC1C,eAAO,MAAM,UAAU,4EAAqB,CAAC"}
|
package/dist/routes/chat.js
CHANGED
|
@@ -7,8 +7,6 @@
|
|
|
7
7
|
// - 无当前项目 → 409 NO_PROJECT_OPEN(与其他业务路由一致)
|
|
8
8
|
// - 请求体校验失败 → 400 VALIDATION_ERROR(JSON,非 SSE——校验在开流之前)
|
|
9
9
|
// - 单项目单在途流 → 409 CHAT_BUSY;重复会话删除 → 404 SESSION_NOT_FOUND;在途会话 → 409 SESSION_BUSY
|
|
10
|
-
// - 拆解会话(id 前缀 `decompose-`)**只读**:`POST /chat` → 409 SESSION_READONLY;其 job 在跑时禁删 → 409
|
|
11
|
-
// DECOMPOSE_JOB_RUNNING(§2.1 / §7.2;会话可见、可看、可删)
|
|
12
10
|
// - 模型/凭据缺失 → 400 LLM_API_KEY_MISSING(同样在开流之前,JSON)
|
|
13
11
|
// - 会话归属由项目目录表达:`session_id` 只经磁盘发现映射到文件(**不做路径拼接**),
|
|
14
12
|
// 缺省则新建会话(pi 生成 id,首帧 `session` 回给客户端)
|
|
@@ -19,14 +17,13 @@
|
|
|
19
17
|
import { unlinkSync } from "node:fs";
|
|
20
18
|
import { Hono } from "hono";
|
|
21
19
|
import { streamSSE } from "hono/streaming";
|
|
22
|
-
import { createPingFrame, createSessionFrame, defaultProposalStore, findProjectSession, FOCUS_TITLE, lastVisibleSessionText, listProjectSessions, NoModelConfiguredError, projectSessionMessages, readProjectSession, readSessionThinking, toSseFrame, } from "@whispering233/ai-editor-agent";
|
|
23
|
-
import { findOutlineNode, getDocument,
|
|
24
|
-
import {
|
|
20
|
+
import { contextUsageField, createPingFrame, createSessionFrame, createSpeedMeter, defaultProposalStore, findProjectSession, FOCUS_TITLE, lastVisibleSessionText, listProjectSessions, NoModelConfiguredError, projectSessionMessages, readProjectSession, readSessionThinking, sessionUsage, toSseFrame, } from "@whispering233/ai-editor-agent";
|
|
21
|
+
import { findOutlineNode, getDocument, getDocumentTextLengths, getEntity, readOutlineFile, } from "@whispering233/ai-editor-db";
|
|
22
|
+
import { buildDeductionMarks, orderVisibleChapters, truncate, } from "@whispering233/ai-editor-shared";
|
|
25
23
|
import { chatMessagesResSchema, chatSendReqSchema, chatSessionDeleteResSchema, chatSessionsResSchema, chatThinkingResSchema, } from "@whispering233/ai-editor-shared/schemas";
|
|
26
24
|
import { HttpError, ok } from "../middleware/error.js";
|
|
27
25
|
import { requireCurrentProject } from "../middleware/project.js";
|
|
28
|
-
import {
|
|
29
|
-
import { isDecomposeJobActive } from "../decompose/runner.js";
|
|
26
|
+
import { getModelRuntime, getSettingsManager, resolveActiveSelection } from "../model-runtime.js";
|
|
30
27
|
import { debugLog, isCategoryEnabled } from "../debug.js";
|
|
31
28
|
import { acquireProjectRuntime, beginActiveChat, enterInFlightSession, hasActiveChat, isSessionInFlight, leaveInFlightSession, } from "../chat-runtime.js";
|
|
32
29
|
// ============ 常量 ============
|
|
@@ -40,9 +37,10 @@ const TOOL_RESULT_TRUNCATION_MARKER = "[工具结果已截断";
|
|
|
40
37
|
/** 聚焦章注入的正文节选上限(字符;完整正文由模型调 get_chapter_text 按 offset 分页拉取) */
|
|
41
38
|
export const FOCUS_CHAPTER_EXCERPT_CHARS = 2000;
|
|
42
39
|
/**
|
|
43
|
-
* 聚焦上下文文本:focus_entity_id → 实体、focus_node_id →
|
|
40
|
+
* 聚焦上下文文本:focus_entity_id → 实体、focus_node_id → 大纲节点、focus_deduction → 推演节点集合,
|
|
41
|
+
* 拼成结构化文本。
|
|
44
42
|
* 查询不到(已软删/不存在/跨项目)→ 跳过该项(不报错):客户端可能携带过期 focus。
|
|
45
|
-
*
|
|
43
|
+
* 各项皆无(或均无效)→ undefined(不注入,消息原文保持干净)。
|
|
46
44
|
* 聚焦**章**:另注入正文前 `FOCUS_CHAPTER_EXCERPT_CHARS` 字符节选(带「节选」标注)——
|
|
47
45
|
* **不做整章自动入上下文**(正文预算与对话历史共享同一窗口,见 docs/design/20-context.md §2)。
|
|
48
46
|
*/
|
|
@@ -61,8 +59,48 @@ export function buildFocusText(project, context) {
|
|
|
61
59
|
chapterExcerptOf(project, node.type, node.id));
|
|
62
60
|
}
|
|
63
61
|
}
|
|
62
|
+
if (context?.focus_deduction === true) {
|
|
63
|
+
const deduction = deductionFocusText(project);
|
|
64
|
+
if (deduction !== undefined)
|
|
65
|
+
parts.push(deduction); // 无标记 / 全部失效 → 不注入该段(不影响其余项)
|
|
66
|
+
}
|
|
64
67
|
return parts.length > 0 ? parts.join("\n\n") : undefined;
|
|
65
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* 推演节点集合段(`context.focus_deduction`,见 `docs/design/20-context.md` §2):
|
|
71
|
+
* 三段短文本——① 口径说明 ② 有序标记清单(角色 · 章号 · 标题)③ 相邻区间摘要(跨越章数 · 已写章数)。
|
|
72
|
+
* 标记的角色 / 顺序 / 章号一律来自 shared `buildDeductionMarks`(唯一编号口径),本函数不手抄文案与章号;
|
|
73
|
+
* 标记源是**服务端现读**的 `project.json` `deduction_nodes`(客户端只发布尔,见 `docs/api/80-api-chat.md`)。
|
|
74
|
+
* **不注入**章摘要 / 区间内中间章清单 / 正文(区间明细与章清单走 `get_deduction_marks` 工具)。
|
|
75
|
+
* 无标记 / 标记全部失效(软删、非章、已 purge)→ undefined(静默省略,不报错)。
|
|
76
|
+
*/
|
|
77
|
+
function deductionFocusText(project) {
|
|
78
|
+
const tree = readOutlineFile(project.root);
|
|
79
|
+
const marks = buildDeductionMarks(tree, project.config.deduction_nodes ?? []);
|
|
80
|
+
if (marks.length === 0)
|
|
81
|
+
return undefined;
|
|
82
|
+
const lines = [
|
|
83
|
+
"推演节点集合(作者标定的推演边界):单标记 = 开放式剧情发散;多标记 = 相邻标记之间的剧情线探讨;" +
|
|
84
|
+
"明细可用 get_deduction_marks 获取。",
|
|
85
|
+
"标记(按章序):",
|
|
86
|
+
...marks.map((mark) => `${mark.index}. ${mark.label} · 第${mark.chapterNumber}章 · ${mark.title}`),
|
|
87
|
+
];
|
|
88
|
+
if (marks.length > 1) {
|
|
89
|
+
// 区间 = 相邻标记之间(**不含两端标记**,与 get_deduction_marks 的 spans 同口径):只给骨架,不给中间章清单
|
|
90
|
+
const order = orderVisibleChapters(tree);
|
|
91
|
+
lines.push("相邻区间:");
|
|
92
|
+
for (let i = 1; i < marks.length; i++) {
|
|
93
|
+
const from = marks[i - 1];
|
|
94
|
+
const to = marks[i];
|
|
95
|
+
const middle = order.slice(order.indexOf(from.nodeId) + 1, order.indexOf(to.nodeId));
|
|
96
|
+
const textLengths = getDocumentTextLengths(project.db, "chapter", middle);
|
|
97
|
+
const written = middle.filter((id) => (textLengths.get(id) ?? 0) > 0).length;
|
|
98
|
+
lines.push(`${from.label}(第${from.chapterNumber}章)→ ${to.label}(第${to.chapterNumber}章):` +
|
|
99
|
+
`跨越 ${middle.length} 章 · 已写 ${written} 章`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return lines.join("\n");
|
|
103
|
+
}
|
|
66
104
|
/** 聚焦章的正文节选段:非章 / 未写过正文 → 空串(维持现状);只取前 N 字符,完整正文由工具拉取 */
|
|
67
105
|
function chapterExcerptOf(project, nodeType, nodeId) {
|
|
68
106
|
if (nodeType !== "chapter")
|
|
@@ -214,12 +252,12 @@ function sleepAbortable(ms, signals) {
|
|
|
214
252
|
s.addEventListener("abort", onAbort, { once: true });
|
|
215
253
|
});
|
|
216
254
|
}
|
|
217
|
-
/**
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
return
|
|
255
|
+
/**
|
|
256
|
+
* 订阅判定谓词(帧与历史响应用量同源;**不用 `isUsingOAuth()`**——OAuth ≠ 订阅,口径见
|
|
257
|
+
* docs/design/20-context.md §2.1)。pi 方法名只在此处出现一次。
|
|
258
|
+
*/
|
|
259
|
+
function subscriptionPredicate(modelRuntime) {
|
|
260
|
+
return (provider) => modelRuntime.isUsingSubscription(provider);
|
|
223
261
|
}
|
|
224
262
|
// ============ POST /api/v1/chat(POST + SSE) ============
|
|
225
263
|
/**
|
|
@@ -253,10 +291,6 @@ export function chatSendHandler(deps = {}) {
|
|
|
253
291
|
// ---- 目标会话:session_id 只经磁盘发现映射(未命中 → 404) ----
|
|
254
292
|
let sessionFile;
|
|
255
293
|
if (session_id !== undefined) {
|
|
256
|
-
// 拆解会话只读(§2.1):历史里是一整本原文,当上下文续聊费用与语义均错;前缀即 kind,先于磁盘发现
|
|
257
|
-
if (session_id.startsWith(DECOMPOSE_SESSION_ID_PREFIX)) {
|
|
258
|
-
throw new HttpError(409, "SESSION_READONLY", `拆解会话只读,不可续聊: ${session_id}`);
|
|
259
|
-
}
|
|
260
294
|
const info = await findProjectSession(target.root, session_id);
|
|
261
295
|
if (info === null) {
|
|
262
296
|
throw new HttpError(404, "SESSION_NOT_FOUND", `会话不存在: ${session_id}(客户端应改为新会话重试)`);
|
|
@@ -287,6 +321,14 @@ export function chatSendHandler(deps = {}) {
|
|
|
287
321
|
const focusText = buildFocusText(project, context);
|
|
288
322
|
const promptText = focusText === undefined ? message : `${FOCUS_TITLE}\n${focusText}\n\n${message}`;
|
|
289
323
|
const logEvent = createChatDebugLogger(runtime);
|
|
324
|
+
// 状态栏投影(每流一份):占用 = pi getContextUsage(),账目 = sessionUsage(),速度 = 每流一个 meter
|
|
325
|
+
const projectionOptions = {
|
|
326
|
+
getContextUsage: () => runtime.session.getContextUsage(),
|
|
327
|
+
getSessionUsage: () => sessionUsage(runtime.session.sessionManager.getEntries(), {
|
|
328
|
+
isUsingSubscription: subscriptionPredicate(runtime.modelRuntime),
|
|
329
|
+
}),
|
|
330
|
+
speedMeter: createSpeedMeter(),
|
|
331
|
+
};
|
|
290
332
|
// 项目切换/关闭时由 chat-runtime 触发中止(占位已在,中止回调就绪即可被叫停)
|
|
291
333
|
chat.setAbort(() => {
|
|
292
334
|
void runtime.session.abort();
|
|
@@ -344,7 +386,7 @@ export function chatSendHandler(deps = {}) {
|
|
|
344
386
|
entered = true;
|
|
345
387
|
unsubscribe = runtime.session.subscribe((event) => {
|
|
346
388
|
logEvent(event);
|
|
347
|
-
const frame = toSseFrame(event,
|
|
389
|
+
const frame = toSseFrame(event, projectionOptions);
|
|
348
390
|
if (frame === null)
|
|
349
391
|
return;
|
|
350
392
|
void writeFrame(frame); // 排入 writer(FIFO 保证顺序),不阻塞循环
|
|
@@ -358,7 +400,7 @@ export function chatSendHandler(deps = {}) {
|
|
|
358
400
|
debugLog("chat", "chat", `prompt 失败:${message}`);
|
|
359
401
|
await writeFrame({
|
|
360
402
|
event: "agent_end",
|
|
361
|
-
data: { stopReason: "error", errorMessage: message, ...contextUsageField(
|
|
403
|
+
data: { stopReason: "error", errorMessage: message, ...contextUsageField(projectionOptions) },
|
|
362
404
|
});
|
|
363
405
|
}
|
|
364
406
|
finally {
|
|
@@ -400,25 +442,23 @@ export function chatSendHandler(deps = {}) {
|
|
|
400
442
|
};
|
|
401
443
|
}
|
|
402
444
|
// ============ 会话端点辅助 ============
|
|
403
|
-
/**
|
|
404
|
-
* 拆解会话删除守卫(§7.2「有在途 job 时禁删」):会话 id 与 job 用**同一纯函数**组装,故直接比对。
|
|
405
|
-
* 三种「仍在跑」都算:job 行 `pending` / `running`,或**进程内有在跑轮次**——暂停后当前批仍在飞
|
|
406
|
-
* (job 行已是 `paused`),此时删文件会被这轮原地重建。历史 job 的会话(job 行已不是它)可直接删。
|
|
407
|
-
*/
|
|
408
|
-
function assertDecomposeSessionDeletable(project, sessionId) {
|
|
409
|
-
const job = getDecomposeJob(project.db); // 一项目一 job:最新一行(db helper 口径)
|
|
410
|
-
if (job === null || decomposeSessionId(job.id) !== sessionId)
|
|
411
|
-
return;
|
|
412
|
-
const running = job.status === "pending" || job.status === "running" || isDecomposeJobActive(job.id);
|
|
413
|
-
if (!running)
|
|
414
|
-
return;
|
|
415
|
-
throw new HttpError(409, "DECOMPOSE_JOB_RUNNING", `拆解任务仍在跑,会话文件会被原地重建,暂不可删: ${sessionId}`);
|
|
416
|
-
}
|
|
417
445
|
/** 会话末条可见文本(列表摘要用)+ 50 字截断 */
|
|
418
446
|
async function lastVisibleText(target, sessionId) {
|
|
419
447
|
const opened = await readProjectSession(target.root, sessionId);
|
|
420
448
|
return opened === null ? "" : lastVisibleSessionText(opened.entries);
|
|
421
449
|
}
|
|
450
|
+
/**
|
|
451
|
+
* 历史响应的 `contextUsage`:**只带窗口,不重建占用**(占用建在 pi 未导出的估算函数上,见
|
|
452
|
+
* `docs/design/20-context.md` §2.1)。窗口取**当前激活模型**目录——与 GET /settings/llm 同一条解析
|
|
453
|
+
* (`resolveActiveSelection` + 模型目录)。无模型 / 窗口非正 → 返回 undefined(响应省该键,不给 0)。
|
|
454
|
+
*/
|
|
455
|
+
async function historyContextUsage(modelRuntime) {
|
|
456
|
+
const selection = await resolveActiveSelection(modelRuntime, getSettingsManager());
|
|
457
|
+
const contextWindow = selection === null ? undefined : modelRuntime.getModel(selection.provider, selection.modelId)?.contextWindow;
|
|
458
|
+
if (contextWindow === undefined || !Number.isFinite(contextWindow) || contextWindow <= 0)
|
|
459
|
+
return undefined;
|
|
460
|
+
return { tokens: null, percent: null, contextWindow };
|
|
461
|
+
}
|
|
422
462
|
// ============ 路由装配 ============
|
|
423
463
|
/**
|
|
424
464
|
* 创建对话路由(index.ts 挂载默认实例;测试注入 deps 构造独立实例)。
|
|
@@ -448,7 +488,12 @@ export function createChatRoutes(deps = {}) {
|
|
|
448
488
|
if (opened === null) {
|
|
449
489
|
throw new HttpError(404, "SESSION_NOT_FOUND", `会话不存在: ${sessionId}`);
|
|
450
490
|
}
|
|
451
|
-
|
|
491
|
+
const modelRuntime = await getModelRuntime(); // 历史响应侧无会话运行时:订阅判定与窗口都从进程级模型运行时取
|
|
492
|
+
const usage = sessionUsage(opened.entries, {
|
|
493
|
+
isUsingSubscription: subscriptionPredicate(modelRuntime),
|
|
494
|
+
});
|
|
495
|
+
const contextUsage = await historyContextUsage(modelRuntime);
|
|
496
|
+
return messagesResponse(c, sessionId, projectSessionMessages(opened.entries), usage, contextUsage);
|
|
452
497
|
});
|
|
453
498
|
// GET /api/v1/chat/sessions/:id/messages/:messageId/thinking —— 思维链全文(按块按需拉取)
|
|
454
499
|
routes.get("/sessions/:id/messages/:messageId/thinking", async (c) => {
|
|
@@ -471,15 +516,13 @@ export function createChatRoutes(deps = {}) {
|
|
|
471
516
|
return thinkingResponse(c, thinking);
|
|
472
517
|
});
|
|
473
518
|
// DELETE /api/v1/chat/sessions/:id —— 物理删除会话(无回收站;前端二次确认)
|
|
474
|
-
// 校验顺序:在途流(防流把文件原地重建)→
|
|
519
|
+
// 校验顺序:在途流(防流把文件原地重建)→ 文件存在性(磁盘发现未命中即 404)
|
|
475
520
|
routes.delete("/sessions/:id", async (c) => {
|
|
476
521
|
const project = requireCurrentProject();
|
|
477
522
|
const sessionId = c.req.param("id");
|
|
478
523
|
if (isSessionInFlight(sessionId)) {
|
|
479
524
|
throw new HttpError(409, "SESSION_BUSY", `会话有在途对话流,请先停止生成再删除: ${sessionId}`);
|
|
480
525
|
}
|
|
481
|
-
if (sessionId.startsWith(DECOMPOSE_SESSION_ID_PREFIX))
|
|
482
|
-
assertDecomposeSessionDeletable(project, sessionId);
|
|
483
526
|
const info = await findProjectSession(project.root, sessionId);
|
|
484
527
|
if (info === null) {
|
|
485
528
|
throw new HttpError(404, "SESSION_NOT_FOUND", `会话不存在: ${sessionId}`);
|
|
@@ -511,9 +554,14 @@ function sessionsResponse(c, sessions) {
|
|
|
511
554
|
throw new HttpError(500, "INTERNAL_ERROR", `sessions 响应不符合契约: ${err instanceof Error ? err.message : String(err)}`);
|
|
512
555
|
}
|
|
513
556
|
}
|
|
514
|
-
function messagesResponse(c, sessionId, messages) {
|
|
557
|
+
function messagesResponse(c, sessionId, messages, usage, contextUsage) {
|
|
515
558
|
try {
|
|
516
|
-
return c.json(ok(chatMessagesResSchema.parse({
|
|
559
|
+
return c.json(ok(chatMessagesResSchema.parse({
|
|
560
|
+
sessionId,
|
|
561
|
+
messages,
|
|
562
|
+
usage,
|
|
563
|
+
...(contextUsage === undefined ? {} : { contextUsage }),
|
|
564
|
+
})));
|
|
517
565
|
}
|
|
518
566
|
catch (err) {
|
|
519
567
|
throw new HttpError(500, "INTERNAL_ERROR", `messages 响应不符合契约: ${err instanceof Error ? err.message : String(err)}`);
|