@whispering233/ai-editor-tools 0.0.21 → 0.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analysis/conflict.d.ts +3 -3
- package/dist/analysis/conflict.d.ts.map +1 -1
- package/dist/analysis/conflict.js +3 -4
- package/dist/analysis/conflict.js.map +1 -1
- package/dist/analysis/consistency.d.ts +3 -3
- package/dist/analysis/consistency.d.ts.map +1 -1
- package/dist/analysis/consistency.js +7 -8
- package/dist/analysis/consistency.js.map +1 -1
- package/dist/analysis/hook.d.ts +20 -20
- package/dist/analysis/hook.d.ts.map +1 -1
- package/dist/analysis/hook.js +26 -26
- package/dist/analysis/hook.js.map +1 -1
- package/dist/analysis/orphan.d.ts +7 -7
- package/dist/analysis/orphan.d.ts.map +1 -1
- package/dist/analysis/orphan.js +18 -20
- package/dist/analysis/orphan.js.map +1 -1
- package/dist/analysis/path.d.ts +4 -4
- package/dist/analysis/path.d.ts.map +1 -1
- package/dist/analysis/path.js +9 -10
- package/dist/analysis/path.js.map +1 -1
- package/dist/analysis/suggest.d.ts +3 -3
- package/dist/analysis/suggest.d.ts.map +1 -1
- package/dist/analysis/suggest.js +5 -6
- package/dist/analysis/suggest.js.map +1 -1
- package/dist/analysis/utils.d.ts +10 -10
- package/dist/analysis/utils.d.ts.map +1 -1
- package/dist/analysis/utils.js +6 -6
- package/dist/analysis/utils.js.map +1 -1
- package/dist/context.d.ts +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +2 -2
- package/dist/context.js.map +1 -1
- package/dist/executor/delta.d.ts +1 -1
- package/dist/executor/delta.d.ts.map +1 -1
- package/dist/executor/delta.js +3 -3
- package/dist/executor/delta.js.map +1 -1
- package/dist/executor/entity.d.ts +3 -3
- package/dist/executor/entity.d.ts.map +1 -1
- package/dist/executor/entity.js +10 -10
- package/dist/executor/entity.js.map +1 -1
- package/dist/executor/hook.d.ts +3 -3
- package/dist/executor/hook.d.ts.map +1 -1
- package/dist/executor/hook.js +23 -23
- package/dist/executor/hook.js.map +1 -1
- package/dist/executor/index.d.ts +1 -1
- package/dist/executor/index.d.ts.map +1 -1
- package/dist/executor/index.js +12 -12
- package/dist/executor/index.js.map +1 -1
- package/dist/executor/outline.d.ts +3 -3
- package/dist/executor/outline.d.ts.map +1 -1
- package/dist/executor/outline.js +9 -9
- package/dist/executor/outline.js.map +1 -1
- package/dist/executor/reference.d.ts +1 -1
- package/dist/executor/reference.d.ts.map +1 -1
- package/dist/executor/reference.js +3 -3
- package/dist/executor/reference.js.map +1 -1
- package/dist/executor/relation.d.ts +2 -2
- package/dist/executor/relation.d.ts.map +1 -1
- package/dist/executor/relation.js +7 -7
- package/dist/executor/relation.js.map +1 -1
- package/dist/executor/reorder-timepoints.d.ts +1 -1
- package/dist/executor/reorder-timepoints.d.ts.map +1 -1
- package/dist/executor/reorder-timepoints.js +5 -5
- package/dist/executor/reorder-timepoints.js.map +1 -1
- package/dist/executor/types.d.ts +2 -2
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/proposal/delta.js +11 -11
- package/dist/proposal/delta.js.map +1 -1
- package/dist/proposal/entity.d.ts +2 -2
- package/dist/proposal/entity.d.ts.map +1 -1
- package/dist/proposal/entity.js +6 -6
- package/dist/proposal/entity.js.map +1 -1
- package/dist/proposal/hook.d.ts +1 -1
- package/dist/proposal/hook.d.ts.map +1 -1
- package/dist/proposal/hook.js +7 -7
- package/dist/proposal/hook.js.map +1 -1
- package/dist/proposal/outline.d.ts +4 -4
- package/dist/proposal/outline.d.ts.map +1 -1
- package/dist/proposal/outline.js +11 -11
- package/dist/proposal/outline.js.map +1 -1
- package/dist/proposal/reference.d.ts +3 -3
- package/dist/proposal/reference.d.ts.map +1 -1
- package/dist/proposal/reference.js +6 -6
- package/dist/proposal/reference.js.map +1 -1
- package/dist/proposal/relation.d.ts +1 -1
- package/dist/proposal/relation.d.ts.map +1 -1
- package/dist/proposal/relation.js +7 -7
- package/dist/proposal/relation.js.map +1 -1
- package/dist/proposal/reorder-timepoints.d.ts +3 -3
- package/dist/proposal/reorder-timepoints.d.ts.map +1 -1
- package/dist/proposal/reorder-timepoints.js +14 -14
- package/dist/proposal/reorder-timepoints.js.map +1 -1
- package/dist/proposal/types.d.ts +20 -20
- package/dist/proposal/types.d.ts.map +1 -1
- package/dist/proposal/types.js +18 -18
- package/dist/proposal/types.js.map +1 -1
- package/dist/query/delta.d.ts +5 -5
- package/dist/query/delta.d.ts.map +1 -1
- package/dist/query/delta.js +11 -13
- package/dist/query/delta.js.map +1 -1
- package/dist/query/entity.d.ts +9 -9
- package/dist/query/entity.d.ts.map +1 -1
- package/dist/query/entity.js +13 -15
- package/dist/query/entity.js.map +1 -1
- package/dist/query/outline.d.ts +6 -6
- package/dist/query/outline.d.ts.map +1 -1
- package/dist/query/outline.js +13 -15
- package/dist/query/outline.js.map +1 -1
- package/dist/query/reference.d.ts +1 -1
- package/dist/query/reference.d.ts.map +1 -1
- package/dist/query/reference.js +3 -4
- package/dist/query/reference.js.map +1 -1
- package/dist/query/relation.d.ts +1 -1
- package/dist/query/relation.d.ts.map +1 -1
- package/dist/query/relation.js +3 -5
- package/dist/query/relation.js.map +1 -1
- package/dist/registry.d.ts +5 -5
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +2 -3
- package/dist/registry.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reorder-timepoints.d.ts","sourceRoot":"","sources":["../../src/proposal/reorder-timepoints.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAkD,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAuBpH;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,4BAA4B,GAAG,QAAQ,CA8B5G;AAED,
|
|
1
|
+
{"version":3,"file":"reorder-timepoints.d.ts","sourceRoot":"","sources":["../../src/proposal/reorder-timepoints.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAkD,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAuBpH;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,4BAA4B,GAAG,QAAQ,CA8B5G;AAED,iFAAiF;AACjF,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,4BAA4B,EAClC,MAAM,CAAC,EAAE,WAAW,GACnB,kBAAkB,CAIpB"}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
// 提案类工具:时间轴时间点批量重排(G2
|
|
1
|
+
// 提案类工具:时间轴时间点批量重排(G2,「提案类」propose_reorder_timepoints)
|
|
2
2
|
//
|
|
3
|
-
//
|
|
3
|
+
// 语义( G2 修订注记 + 权限分级):AI 按时间点 name(时间标签文本,如
|
|
4
4
|
// 「第二天黄昏」「少年时」)语义识别先后 → 产出**有序时间点 id 全量序列**(args.timepoint_ids,
|
|
5
5
|
// 顺序 = 建议新序)→ 本工具只产出提案对象(buildProposal,prop_ 运行时 id),**不落盘、
|
|
6
6
|
// 不写任何数据**——排序由用户确认后 S6.7 reorder_timepoints 执行器落库(与 moveTimepoint
|
|
7
7
|
// 拖拽权威语义不变:排序结果即 timepoint.sort_order 线性序;重排时间点**不改其下事件序**——
|
|
8
|
-
//
|
|
8
|
+
// 双独立线性序, G2 修订)。
|
|
9
9
|
//
|
|
10
|
-
//
|
|
10
|
+
// 生成时校验(延伸):
|
|
11
11
|
// - args.timepoint_ids 与当前**全部未软删时间点** id 集合**完全相等**(缺/多/重复 → 抛错——
|
|
12
|
-
//
|
|
12
|
+
// LLM 幻觉漏时间点时工具报错喂回自纠;软删时间点不参与集合)
|
|
13
13
|
// - references = 每个时间点的 refEntity(自身 updated_at 快照)——确认时 S7.5 重校验
|
|
14
|
-
//
|
|
14
|
+
// 存在性 + updated_at(用户拖拽改序后 AI 提案自动失效,409 PROPOSAL_STALE)
|
|
15
15
|
// - preview = { changes: [...] }(Proposal.preview,F9 起可选字段):仅列**位置变化**的
|
|
16
|
-
//
|
|
17
|
-
//
|
|
16
|
+
// 时间点(对比当前序与新序,1-based 位置,人类可读;name 缺失/空串用 id 兜底)——
|
|
17
|
+
// 完整预览经 SSE proposal 事件推送 GUI 展示提案卡
|
|
18
18
|
//
|
|
19
|
-
// tool_result 语义(
|
|
19
|
+
// tool_result 语义( 2026-08 修订):run 只返回 { proposal_id, summary },不含预览细节。
|
|
20
20
|
import { listTimepoints } from "@whispering233/ai-editor-db";
|
|
21
21
|
import { buildProposal, checkProposalAborted, refEntity } from "./types.js";
|
|
22
22
|
/**
|
|
@@ -39,9 +39,9 @@ function assertTimepointSetMatches(orderedIds, currentIds) {
|
|
|
39
39
|
/**
|
|
40
40
|
* 产出时间轴时间点重排提案。
|
|
41
41
|
* 1. 读当前全部未软删时间点(listTimepoints:sort_order 升序,NULL 沉底——与列表/执行层
|
|
42
|
-
*
|
|
42
|
+
* 同款单一事实来源查询,排序语义一致)
|
|
43
43
|
* 2. 校验 timepoint_ids 与当前集合完全相等(缺/多/重复 → 抛错,防 LLM 幻觉漏时间点)
|
|
44
|
-
* 3. references = 全部时间点 updated_at
|
|
44
|
+
* 3. references = 全部时间点 updated_at 快照(确认时任一过期即 STALE)
|
|
45
45
|
* 4. preview.changes:仅列位置变化时间点(「「<name>」从第 X 位移到第 Y 位」,1-based)
|
|
46
46
|
*/
|
|
47
47
|
export function buildProposeReorderTimepoints(ctx, args) {
|
|
@@ -52,7 +52,7 @@ export function buildProposeReorderTimepoints(ctx, args) {
|
|
|
52
52
|
const byId = new Map(timepoints.map((t) => [t.id, t]));
|
|
53
53
|
// 当前序位置索引(preview 对比基准:oldPos = 时间点在现有时间轴上的位置)
|
|
54
54
|
const currentIndex = new Map(timepoints.map((t, i) => [t.id, i]));
|
|
55
|
-
// references 按**新序**(args.timepoint_ids
|
|
55
|
+
// references 按**新序**(args.timepoint_ids)逐时间点快照(确认时 S7.5 逐一比对
|
|
56
56
|
// 存在性 + updated_at,任一过期即 STALE)——顺序即建议新序,校验遍历顺序与执行一致
|
|
57
57
|
const references = args.timepoint_ids.map((id) => refEntity(byId.get(id)));
|
|
58
58
|
// preview.changes 按新序排列(提案卡按最终时间轴顺序从上到下展示变化,1-based);
|
|
@@ -67,10 +67,10 @@ export function buildProposeReorderTimepoints(ctx, args) {
|
|
|
67
67
|
const label = timepoint.name !== "" ? timepoint.name : id;
|
|
68
68
|
changes.push(`「${label}」从第 ${oldPos + 1} 位移到第 ${newPos + 1} 位`);
|
|
69
69
|
}
|
|
70
|
-
return buildProposal(ctx, "propose_reorder_timepoints", { timepoint_ids: args.timepoint_ids }, references, // 全部时间点 updated_at
|
|
70
|
+
return buildProposal(ctx, "propose_reorder_timepoints", { timepoint_ids: args.timepoint_ids }, references, // 全部时间点 updated_at 快照
|
|
71
71
|
`按时间标签语义排序 ${timepoints.length} 个时间点`, { changes });
|
|
72
72
|
}
|
|
73
|
-
/** propose_reorder_timepoints run:中止检查 + 产出裁剪结果(tool_result 不含预览,
|
|
73
|
+
/** propose_reorder_timepoints run:中止检查 + 产出裁剪结果(tool_result 不含预览, 2026-08 修订) */
|
|
74
74
|
export function runProposeReorderTimepoints(ctx, args, signal) {
|
|
75
75
|
checkProposalAborted(signal);
|
|
76
76
|
const proposal = buildProposeReorderTimepoints(ctx, args);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reorder-timepoints.js","sourceRoot":"","sources":["../../src/proposal/reorder-timepoints.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"reorder-timepoints.js","sourceRoot":"","sources":["../../src/proposal/reorder-timepoints.ts"],"names":[],"mappings":"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"}
|
package/dist/proposal/types.d.ts
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
import type { EntityRow, OutlineFileNode, RelationRow } from "@whispering233/ai-editor-shared";
|
|
2
2
|
import type { ToolContext } from "../context.js";
|
|
3
|
-
/**
|
|
3
|
+
/** 被引用对象种类(确认时按 kind 走对应存在性 + updated_at 重校验路径) */
|
|
4
4
|
export type ProposalReferenceKind = "entity" | "relation" | "delta" | "outline_node";
|
|
5
|
-
/** 单个引用快照:被引用对象 id + updated_at
|
|
5
|
+
/** 单个引用快照:被引用对象 id + updated_at( 快照比对) */
|
|
6
6
|
export interface ProposalReference {
|
|
7
7
|
kind: ProposalReferenceKind;
|
|
8
8
|
id: string;
|
|
9
|
-
/** 快照:实体/关系用自身 updated_at;大纲节点用节点级 updated_at
|
|
9
|
+
/** 快照:实体/关系用自身 updated_at;大纲节点用节点级 updated_at */
|
|
10
10
|
updated_at: string;
|
|
11
11
|
}
|
|
12
|
-
/**
|
|
12
|
+
/** 提案对象(仅内存;S7.4 提案仓存储,S7.5 confirm/reject 消费) */
|
|
13
13
|
export interface Proposal {
|
|
14
|
-
/** 运行时 id(prop_ 前缀,
|
|
14
|
+
/** 运行时 id(prop_ 前缀, id 约定) */
|
|
15
15
|
proposal_id: string;
|
|
16
16
|
/** 工具名(propose_*,PROPOSAL_TOOLS 一员) */
|
|
17
17
|
type: string;
|
|
18
18
|
/** 执行信息:确认后 S6.7 执行工具可直接使用的参数(含派生端点类型等规范化形态) */
|
|
19
19
|
args: Record<string, unknown>;
|
|
20
|
-
/**
|
|
20
|
+
/** 项目绑定(confirm/reject 校验与当前项目一致) */
|
|
21
21
|
project_id: string;
|
|
22
|
-
/**
|
|
22
|
+
/** 引用对象快照(存在性 + updated_at) */
|
|
23
23
|
references: ProposalReference[];
|
|
24
24
|
/** 一句话摘要(tool_result + GUI 展示) */
|
|
25
25
|
summary: string;
|
|
26
26
|
/**
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
* 结构化预览细节(F9 起可选):如 propose_reorder_timepoints 的 { changes: string[] }(顺序变化
|
|
28
|
+
* 说明,供前端提案卡 JSON 展示);经 SSE proposal 事件推送 GUI。未设置时 S7.4 executor
|
|
29
|
+
* 回退为 { type, summary, args }(既有提案工具默认预览形态,行为不变)。
|
|
30
|
+
*/
|
|
31
31
|
preview?: Record<string, unknown>;
|
|
32
32
|
/** ISO 8601 创建时间(应用层写入约定;TTL 计算基准,S7.4) */
|
|
33
33
|
createdAt: string;
|
|
34
34
|
}
|
|
35
|
-
/** propose_* tool_result(
|
|
35
|
+
/** propose_* tool_result( 2026-08 修订:仅「提案已发出」提示,不含预览细节) */
|
|
36
36
|
export interface ToolProposalResult {
|
|
37
37
|
proposal_id: string;
|
|
38
38
|
summary: string;
|
|
@@ -47,16 +47,16 @@ export interface ToolProposalResult {
|
|
|
47
47
|
* S7.4 需要完整对象时经 run 内部产出路径间接获取),直接调用方自行保证无并发取消语义。
|
|
48
48
|
*/
|
|
49
49
|
export declare function buildProposal(ctx: ToolContext, type: string, args: Record<string, unknown>, references: ProposalReference[], summary: string, preview?: Record<string, unknown>): Proposal;
|
|
50
|
-
/**
|
|
50
|
+
/** 实体引用快照(用实体自身 updated_at) */
|
|
51
51
|
export declare function refEntity(row: EntityRow): ProposalReference;
|
|
52
|
-
/**
|
|
52
|
+
/** 关系引用快照(用关系自身 updated_at) */
|
|
53
53
|
export declare function refRelation(row: RelationRow): ProposalReference;
|
|
54
|
-
/**
|
|
54
|
+
/** 大纲节点引用快照(用节点级 updated_at) */
|
|
55
55
|
export declare function refOutlineNode(node: OutlineFileNode): ProposalReference;
|
|
56
56
|
/**
|
|
57
57
|
* 解析端点(关系 source/target、Delta target 共用):id → { 类型, 引用快照 }。
|
|
58
|
-
* 判定顺序:实体表优先(getEntity
|
|
59
|
-
*
|
|
58
|
+
* 判定顺序:实体表优先(getEntity 已过滤软删),其次大纲树(存在且未软删);
|
|
59
|
+
* 两者皆不命中抛错(工具执行「抛错即失败」,executor 转结构化结果喂回 LLM 自纠)。
|
|
60
60
|
* root 是树根而非端点,直接拒绝。
|
|
61
61
|
*/
|
|
62
62
|
export declare function resolveEndpoint(ctx: ToolContext, id: string): {
|
|
@@ -64,15 +64,15 @@ export declare function resolveEndpoint(ctx: ToolContext, id: string): {
|
|
|
64
64
|
ref: ProposalReference;
|
|
65
65
|
};
|
|
66
66
|
/**
|
|
67
|
-
* 按 id
|
|
67
|
+
* 按 id 取大纲节点(存在且未软删);否则抛错。
|
|
68
68
|
* 供 propose_add_delta 触发节点 / propose_outline_node 父节点 / move / delete / hook 埋设节点复用。
|
|
69
69
|
*/
|
|
70
70
|
export declare function requireOutlineNode(ctx: ToolContext, nodeId: string): OutlineFileNode;
|
|
71
71
|
/**
|
|
72
72
|
* 按 id 取伏笔实体(type === "hook" 且未软删,类型一致性校验);否则抛错。
|
|
73
|
-
* 伏笔即 type=hook
|
|
73
|
+
* 伏笔即 type=hook 的实体(:用户手动创建或 AI 提案创建),快照用实体自身 updated_at。
|
|
74
74
|
*/
|
|
75
75
|
export declare function requireHook(ctx: ToolContext, hookId: string): EntityRow;
|
|
76
|
-
/**
|
|
76
|
+
/** 提案工具入口统一中止检查(长工具执行中检查 signal;提案生成是同步短操作,入口检查一次即可) */
|
|
77
77
|
export declare function checkProposalAborted(signal?: AbortSignal): void;
|
|
78
78
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/proposal/types.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE/F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/proposal/types.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE/F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,mDAAmD;AACnD,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,cAAc,CAAC;AAErF,0CAA0C;AAC1C,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,EAAE,EAAE,MAAM,CAAC;IACZ,iDAAiD;IAChD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,kDAAkD;AAClD,MAAM,WAAW,QAAQ;IACxB,8BAA8B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACtC,IAAI,EAAE,MAAM,CAAC;IACd,gDAAgD;IAC/C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,qCAAqC;IACpC,UAAU,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC9B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IACjC,kCAAkC;IACjC,OAAO,EAAE,MAAM,CAAC;IACjB;;;;MAIE;IACD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,2CAA2C;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,2DAA2D;AAC3D,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,EAAE,iBAAiB,EAAE,EAC/B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,QAAQ,CAWV;AAED,+BAA+B;AAC/B,wBAAgB,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,iBAAiB,CAE3D;AAED,+BAA+B;AAC/B,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,iBAAiB,CAE/D;AAED,gCAAgC;AAChC,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,iBAAiB,CAEvE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,WAAW,EAChB,EAAE,EAAE,MAAM,GACT;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,iBAAiB,CAAA;CAAE,CAa1C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAMpF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAMvE;AAED,wDAAwD;AACxD,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAE/D"}
|
package/dist/proposal/types.js
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
// 提案对象类型 + 构造辅助(S6.6,proposal/ 模块公共层)
|
|
2
2
|
//
|
|
3
|
-
//
|
|
3
|
+
// **提案是服务端运行时对象**(仅内存、不落盘、随 SSE 推送 GUI;prop_ 前缀运行时 id,
|
|
4
4
|
// 不跨 client——故定义在 tools 包而非 shared)。提案仓(TTL 10 分钟 + 条数上限 + 项目绑定)
|
|
5
5
|
// 属 S7.4 范围,本模块只负责**产出提案对象结构**。
|
|
6
6
|
//
|
|
7
|
-
//
|
|
8
|
-
// - proposal_id:prop_ 前缀(generateRuntimeId,
|
|
7
|
+
// 提案对象结构:
|
|
8
|
+
// - proposal_id:prop_ 前缀(generateRuntimeId, id 约定)
|
|
9
9
|
// - type:工具名(PROPOSAL_TOOLS 一员,S7.4 executor 按名调度)
|
|
10
10
|
// - args:**执行信息**——确认后调用 S6.7 执行工具所需的全部参数(端点类工具已把
|
|
11
|
-
//
|
|
12
|
-
// - project_id
|
|
11
|
+
// id 解析为 {source_type, source_id} 等规范化形态,执行时可直接透传)
|
|
12
|
+
// - project_id:项目绑定(confirm/reject 校验归属)
|
|
13
13
|
// - references:被引用对象 id + updated_at 快照——实体/关系用自身 updated_at、
|
|
14
|
-
//
|
|
15
|
-
//
|
|
14
|
+
// 大纲节点用节点级 updated_at;确认(S7.5)时按 kind 重校验
|
|
15
|
+
// (存在性 + updated_at 比对,失败 409 PROPOSAL_STALE)
|
|
16
16
|
// - summary:一句话摘要(tool_result + GUI 展示)
|
|
17
17
|
// - createdAt:ISO 8601(应用层写入约定;TTL 计算基准)
|
|
18
18
|
// - preview(F9 起可选):结构化预览细节(如 propose_reorder_timepoints 的 { changes: [...] })——
|
|
19
|
-
//
|
|
20
|
-
//
|
|
19
|
+
// 经 SSE proposal 事件推送 GUI 展示提案卡;未设置时 S7.4 executor 回退为
|
|
20
|
+
// { type, summary, args }(既有提案工具的默认预览形态)。
|
|
21
21
|
//
|
|
22
|
-
// tool_result
|
|
22
|
+
// tool_result 语义(「返回语义」2026-08 修订):propose_* 的 run 只返回
|
|
23
23
|
// { proposal_id, summary },**不含预览细节**——避免 LLM 误以为提案已生效而重复提案;
|
|
24
24
|
// 完整预览经 SSE proposal 事件推送 GUI(S7 实现)。
|
|
25
25
|
import { getEntity } from "@whispering233/ai-editor-db";
|
|
@@ -48,22 +48,22 @@ export function buildProposal(ctx, type, args, references, summary, preview) {
|
|
|
48
48
|
createdAt: nowIso(),
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
|
-
/**
|
|
51
|
+
/** 实体引用快照(用实体自身 updated_at) */
|
|
52
52
|
export function refEntity(row) {
|
|
53
53
|
return { kind: "entity", id: row.id, updated_at: row.updated_at };
|
|
54
54
|
}
|
|
55
|
-
/**
|
|
55
|
+
/** 关系引用快照(用关系自身 updated_at) */
|
|
56
56
|
export function refRelation(row) {
|
|
57
57
|
return { kind: "relation", id: row.id, updated_at: row.updated_at };
|
|
58
58
|
}
|
|
59
|
-
/**
|
|
59
|
+
/** 大纲节点引用快照(用节点级 updated_at) */
|
|
60
60
|
export function refOutlineNode(node) {
|
|
61
61
|
return { kind: "outline_node", id: node.id, updated_at: node.updated_at };
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
64
64
|
* 解析端点(关系 source/target、Delta target 共用):id → { 类型, 引用快照 }。
|
|
65
|
-
* 判定顺序:实体表优先(getEntity
|
|
66
|
-
*
|
|
65
|
+
* 判定顺序:实体表优先(getEntity 已过滤软删),其次大纲树(存在且未软删);
|
|
66
|
+
* 两者皆不命中抛错(工具执行「抛错即失败」,executor 转结构化结果喂回 LLM 自纠)。
|
|
67
67
|
* root 是树根而非端点,直接拒绝。
|
|
68
68
|
*/
|
|
69
69
|
export function resolveEndpoint(ctx, id) {
|
|
@@ -81,7 +81,7 @@ export function resolveEndpoint(ctx, id) {
|
|
|
81
81
|
throw new Error(`端点不存在或已软删: ${id}`);
|
|
82
82
|
}
|
|
83
83
|
/**
|
|
84
|
-
* 按 id
|
|
84
|
+
* 按 id 取大纲节点(存在且未软删);否则抛错。
|
|
85
85
|
* 供 propose_add_delta 触发节点 / propose_outline_node 父节点 / move / delete / hook 埋设节点复用。
|
|
86
86
|
*/
|
|
87
87
|
export function requireOutlineNode(ctx, nodeId) {
|
|
@@ -93,7 +93,7 @@ export function requireOutlineNode(ctx, nodeId) {
|
|
|
93
93
|
}
|
|
94
94
|
/**
|
|
95
95
|
* 按 id 取伏笔实体(type === "hook" 且未软删,类型一致性校验);否则抛错。
|
|
96
|
-
* 伏笔即 type=hook
|
|
96
|
+
* 伏笔即 type=hook 的实体(:用户手动创建或 AI 提案创建),快照用实体自身 updated_at。
|
|
97
97
|
*/
|
|
98
98
|
export function requireHook(ctx, hookId) {
|
|
99
99
|
const entity = getEntity(ctx.db, hookId);
|
|
@@ -102,7 +102,7 @@ export function requireHook(ctx, hookId) {
|
|
|
102
102
|
}
|
|
103
103
|
return entity;
|
|
104
104
|
}
|
|
105
|
-
/**
|
|
105
|
+
/** 提案工具入口统一中止检查(长工具执行中检查 signal;提案生成是同步短操作,入口检查一次即可) */
|
|
106
106
|
export function checkProposalAborted(signal) {
|
|
107
107
|
throwIfAborted(signal);
|
|
108
108
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/proposal/types.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/proposal/types.ts"],"names":[],"mappings":"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"}
|
package/dist/query/delta.d.ts
CHANGED
|
@@ -2,18 +2,18 @@ import type { ComputeStateResult, DeltaRecord } from "@whispering233/ai-editor-s
|
|
|
2
2
|
import type { ToolContext } from "../context.js";
|
|
3
3
|
import type { ComputeStateArgs, GetDeltaHistoryArgs } from "@whispering233/ai-editor-shared";
|
|
4
4
|
/**
|
|
5
|
-
* 实体到达指定节点时的累积状态(
|
|
6
|
-
* 透传 db computeState:只沿大纲树父链(根 → at_node_id)累积已确认 Delta
|
|
5
|
+
* 实体到达指定节点时的累积状态( compute_state(target_type, target_id, at_node_id))。
|
|
6
|
+
* 透传 db computeState:只沿大纲树父链(根 → at_node_id)累积已确认 Delta,
|
|
7
7
|
* 节点间按树路径序、节点内按 order 双层排序;plot_edge 不参与;op=update from 校验失败
|
|
8
8
|
* **跳过该 change 并继续累积**,结果在 conflicts 中标注 { field, expected, actual }
|
|
9
|
-
* (不返回 409——手动编辑 data
|
|
9
|
+
* (不返回 409——手动编辑 data 属正常用户行为)。
|
|
10
10
|
* 目标实体不存在/已软删 → null;at_node_id 不存在 → db 抛错(上层按工具失败处理)。
|
|
11
11
|
*/
|
|
12
12
|
export declare function runComputeState(ctx: ToolContext, args: ComputeStateArgs): ComputeStateResult | null;
|
|
13
13
|
/**
|
|
14
|
-
* 目标实体的全部属性变更记录(
|
|
14
|
+
* 目标实体的全部属性变更记录( get_delta_history(target_type, target_id))。
|
|
15
15
|
* 透传 db listDeltasByTarget:按 target_id 查询 + 全局 order ASC(时间序)排序 +
|
|
16
|
-
*
|
|
16
|
+
* 可见性三态过滤(delta 自身 / 触发节点 / 目标端点任一软删即不可见)+
|
|
17
17
|
* targetName 联表填充。target_type 仅由 db 侧用于判定目标端点类型(实体/大纲节点)。
|
|
18
18
|
*/
|
|
19
19
|
export declare function runGetDeltaHistory(ctx: ToolContext, args: GetDeltaHistoryArgs): DeltaRecord[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delta.d.ts","sourceRoot":"","sources":["../../src/query/delta.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"delta.d.ts","sourceRoot":"","sources":["../../src/query/delta.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACvF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAI7F;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,GAAG,kBAAkB,GAAG,IAAI,CAMnG;AAID;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,GAAG,WAAW,EAAE,CAE7F"}
|
package/dist/query/delta.js
CHANGED
|
@@ -1,24 +1,22 @@
|
|
|
1
1
|
// 查询类工具:Delta 侧实现(S6.3)
|
|
2
|
-
// compute_state / get_delta_history
|
|
3
|
-
// 契约来源:doc/api/tools.md;doc/api/endpoints.md Delta 端点;决策 9(父链累积、
|
|
4
|
-
// conflicts 跳过语义)、决策 12 修订(可见性三态过滤)、决策 19(严格三层路径唯一)。
|
|
2
|
+
// compute_state / get_delta_history(「状态查询(Delta 相关)」)
|
|
5
3
|
//
|
|
6
4
|
// db 层能力确认与分工(S6.3 修复轮:数据访问一律走 db 查询层,工具层无原生 SQL):
|
|
7
5
|
// - compute_state:db computeState 已封装全部语义(父链双层排序累积、op=update from
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
6
|
+
// 校验失败跳过 + conflicts 标注不返回 409、软删过滤、目标实体缺失返回 null)——
|
|
7
|
+
// 工具层参数映射透传;at_node_id 不存在时 db 抛错(视为调用方 bug,路由层前置校验
|
|
8
|
+
// 的约定),工具层不捕获——executor 统一转结构化错误喂回 LLM 自纠
|
|
11
9
|
// - get_delta_history:db listDeltasByTarget(S6.3 下沉)已实现按目标端点查询 +
|
|
12
|
-
//
|
|
13
|
-
//
|
|
10
|
+
// 可见性三态过滤(delta 自身/触发节点/目标端点软删,,与 listDeltasByNode
|
|
11
|
+
// 共享 filterVisibleDeltas 实现)——工具层一行透传
|
|
14
12
|
import { computeState as dbComputeState, listDeltasByTarget } from "@whispering233/ai-editor-db";
|
|
15
13
|
// ============ compute_state ============
|
|
16
14
|
/**
|
|
17
|
-
* 实体到达指定节点时的累积状态(
|
|
18
|
-
* 透传 db computeState:只沿大纲树父链(根 → at_node_id)累积已确认 Delta
|
|
15
|
+
* 实体到达指定节点时的累积状态( compute_state(target_type, target_id, at_node_id))。
|
|
16
|
+
* 透传 db computeState:只沿大纲树父链(根 → at_node_id)累积已确认 Delta,
|
|
19
17
|
* 节点间按树路径序、节点内按 order 双层排序;plot_edge 不参与;op=update from 校验失败
|
|
20
18
|
* **跳过该 change 并继续累积**,结果在 conflicts 中标注 { field, expected, actual }
|
|
21
|
-
* (不返回 409——手动编辑 data
|
|
19
|
+
* (不返回 409——手动编辑 data 属正常用户行为)。
|
|
22
20
|
* 目标实体不存在/已软删 → null;at_node_id 不存在 → db 抛错(上层按工具失败处理)。
|
|
23
21
|
*/
|
|
24
22
|
export function runComputeState(ctx, args) {
|
|
@@ -30,9 +28,9 @@ export function runComputeState(ctx, args) {
|
|
|
30
28
|
}
|
|
31
29
|
// ============ get_delta_history ============
|
|
32
30
|
/**
|
|
33
|
-
* 目标实体的全部属性变更记录(
|
|
31
|
+
* 目标实体的全部属性变更记录( get_delta_history(target_type, target_id))。
|
|
34
32
|
* 透传 db listDeltasByTarget:按 target_id 查询 + 全局 order ASC(时间序)排序 +
|
|
35
|
-
*
|
|
33
|
+
* 可见性三态过滤(delta 自身 / 触发节点 / 目标端点任一软删即不可见)+
|
|
36
34
|
* targetName 联表填充。target_type 仅由 db 侧用于判定目标端点类型(实体/大纲节点)。
|
|
37
35
|
*/
|
|
38
36
|
export function runGetDeltaHistory(ctx, args) {
|
package/dist/query/delta.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delta.js","sourceRoot":"","sources":["../../src/query/delta.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,
|
|
1
|
+
{"version":3,"file":"delta.js","sourceRoot":"","sources":["../../src/query/delta.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,sDAAsD;AACtD,EAAE;AACF,mDAAmD;AACnD,kEAAkE;AAClE,qDAAqD;AACrD,oDAAoD;AACpD,0CAA0C;AAC1C,iEAAiE;AACjE,mDAAmD;AACnD,sCAAsC;AAEtC,OAAO,EAAE,YAAY,IAAI,cAAc,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAKjG,0CAA0C;AAE1C;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,GAAgB,EAAE,IAAsB;IACtE,OAAO,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,UAAU,EAAE;QAC5C,UAAU,EAAE,IAAI,CAAC,WAAW;QAC5B,QAAQ,EAAE,IAAI,CAAC,SAAS;QACxB,QAAQ,EAAE,IAAI,CAAC,UAAU;KAC1B,CAAC,CAAC;AACL,CAAC;AAED,8CAA8C;AAE9C;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAgB,EAAE,IAAyB;IAC5E,OAAO,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;AACpE,CAAC"}
|
package/dist/query/entity.d.ts
CHANGED
|
@@ -3,26 +3,26 @@ import type { EntityListResult, EntitySummaryStats } from "@whispering233/ai-edi
|
|
|
3
3
|
import type { ToolContext } from "../context.js";
|
|
4
4
|
import type { GetEntityArgs, GetEntitySummaryArgs, SearchEntitiesArgs } from "@whispering233/ai-editor-shared";
|
|
5
5
|
/**
|
|
6
|
-
* 实体详情(
|
|
7
|
-
* - db 层 getEntity
|
|
6
|
+
* 实体详情( get_entity(type, id) → 实体详情,含 data JSON 解析后的字段)。
|
|
7
|
+
* - db 层 getEntity 默认过滤软删(回收站对象不可见)
|
|
8
8
|
* - type 与行内实际类型不一致 → null(参数错误,id 前缀体系下正常调用不会出现;
|
|
9
|
-
*
|
|
9
|
+
* LLM 传错类型时得到「不存在」而非脏数据)
|
|
10
10
|
* - 不存在/已软删 → null(查询无结果 ≠ 失败,LLM 据 null 自纠或向用户确认)
|
|
11
11
|
*/
|
|
12
12
|
export declare function runGetEntity(ctx: ToolContext, args: GetEntityArgs): Entity | null;
|
|
13
13
|
/** search_entities 结果:匹配实体摘要列表 + 过滤后总数(db listEntities 同构) */
|
|
14
14
|
export type SearchEntitiesResult = EntityListResult;
|
|
15
15
|
/**
|
|
16
|
-
* 实体搜索(
|
|
17
|
-
* 透传 db listEntities:type + name LIKE 模糊匹配 +
|
|
16
|
+
* 实体搜索( search_entities(type, query, filters?) → 匹配实体列表)。
|
|
17
|
+
* 透传 db listEntities:type + name LIKE 模糊匹配 + **软删过滤**
|
|
18
18
|
* + filters(tags AND / status 精确匹配,data 字段 JS 过滤)+ 摘要提取(db 单一实现)。
|
|
19
|
-
* limit 传 200(db clamp 上限):搜索结果尽量全(token
|
|
19
|
+
* limit 传 200(db clamp 上限):搜索结果尽量全(token 截断由上层按 处理)。
|
|
20
20
|
*/
|
|
21
21
|
export declare function runSearchEntities(ctx: ToolContext, args: SearchEntitiesArgs): SearchEntitiesResult;
|
|
22
22
|
/**
|
|
23
|
-
* 实体聚合统计(
|
|
24
|
-
* 透传 db getEntitySummaryStats
|
|
25
|
-
* 稀疏出现(character→byRole/byStatus/topAbilities、setting→byTags
|
|
23
|
+
* 实体聚合统计( get_entity_summary(type) → 总数、角色分布、能力分布等)。
|
|
24
|
+
* 透传 db getEntitySummaryStats:仅统计非软删实体;分布字段按类型
|
|
25
|
+
* 稀疏出现(character→byRole/byStatus/topAbilities、setting→byTags(分类由
|
|
26
26
|
* rules 标签承接)、location→byType、hook→byStatus/byPayoffTiming),缺字段不报错。
|
|
27
27
|
*/
|
|
28
28
|
export declare function runGetEntitySummary(ctx: ToolContext, args: GetEntitySummaryArgs): EntitySummaryStats;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/query/entity.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/query/entity.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACxF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAI/G;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAIjF;AAID,8DAA8D;AAC9D,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAEpD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,GAAG,oBAAoB,CAOlG;AAID;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,oBAAoB,GAAG,kBAAkB,CAEpG"}
|
package/dist/query/entity.js
CHANGED
|
@@ -1,23 +1,21 @@
|
|
|
1
1
|
// 查询类工具:实体侧实现(S6.3)
|
|
2
2
|
// get_entity / search_entities / get_entity_summary
|
|
3
|
-
// 契约来源:doc/api/tools.md「实体查询」「聚合分析」;doc/api/endpoints.md 实体端点;
|
|
4
|
-
// 决策 12 修订(查询类工具默认过滤软删对象)。
|
|
5
3
|
//
|
|
6
4
|
// db 层能力确认与分工(S6.3 修复轮:数据访问一律走 db 查询层,工具层无原生 SQL):
|
|
7
|
-
// - get_entity:db getEntity
|
|
8
|
-
//
|
|
5
|
+
// - get_entity:db getEntity 已过滤软删——工具层直接复用;
|
|
6
|
+
// type 一致性校验(id 前缀体系全局唯一,type 传错 = 参数错误,返回 null 让 LLM 自纠)
|
|
9
7
|
// - search_entities:db listEntities 已扩展 filters(tags/status data 字段 JS 过滤,
|
|
10
|
-
//
|
|
8
|
+
// S6.3 下沉)+ 软删过滤 + 摘要提取单一化(db toSummary)——工具层参数映射透传
|
|
11
9
|
// - get_entity_summary:db getEntitySummaryStats(S6.3 下沉:总数 + 类型专属分布,
|
|
12
|
-
//
|
|
10
|
+
// 稀疏字段知识归拢 db 单一位置)——工具层透传
|
|
13
11
|
import { getEntity as dbGetEntity, getEntitySummaryStats, listEntities } from "@whispering233/ai-editor-db";
|
|
14
12
|
import { mapRowToEntity } from "@whispering233/ai-editor-shared";
|
|
15
13
|
// ============ get_entity ============
|
|
16
14
|
/**
|
|
17
|
-
* 实体详情(
|
|
18
|
-
* - db 层 getEntity
|
|
15
|
+
* 实体详情( get_entity(type, id) → 实体详情,含 data JSON 解析后的字段)。
|
|
16
|
+
* - db 层 getEntity 默认过滤软删(回收站对象不可见)
|
|
19
17
|
* - type 与行内实际类型不一致 → null(参数错误,id 前缀体系下正常调用不会出现;
|
|
20
|
-
*
|
|
18
|
+
* LLM 传错类型时得到「不存在」而非脏数据)
|
|
21
19
|
* - 不存在/已软删 → null(查询无结果 ≠ 失败,LLM 据 null 自纠或向用户确认)
|
|
22
20
|
*/
|
|
23
21
|
export function runGetEntity(ctx, args) {
|
|
@@ -27,10 +25,10 @@ export function runGetEntity(ctx, args) {
|
|
|
27
25
|
return mapRowToEntity(row);
|
|
28
26
|
}
|
|
29
27
|
/**
|
|
30
|
-
* 实体搜索(
|
|
31
|
-
* 透传 db listEntities:type + name LIKE 模糊匹配 +
|
|
28
|
+
* 实体搜索( search_entities(type, query, filters?) → 匹配实体列表)。
|
|
29
|
+
* 透传 db listEntities:type + name LIKE 模糊匹配 + **软删过滤**
|
|
32
30
|
* + filters(tags AND / status 精确匹配,data 字段 JS 过滤)+ 摘要提取(db 单一实现)。
|
|
33
|
-
* limit 传 200(db clamp 上限):搜索结果尽量全(token
|
|
31
|
+
* limit 传 200(db clamp 上限):搜索结果尽量全(token 截断由上层按 处理)。
|
|
34
32
|
*/
|
|
35
33
|
export function runSearchEntities(ctx, args) {
|
|
36
34
|
return listEntities(ctx.db, {
|
|
@@ -42,9 +40,9 @@ export function runSearchEntities(ctx, args) {
|
|
|
42
40
|
}
|
|
43
41
|
// ============ get_entity_summary ============
|
|
44
42
|
/**
|
|
45
|
-
* 实体聚合统计(
|
|
46
|
-
* 透传 db getEntitySummaryStats
|
|
47
|
-
* 稀疏出现(character→byRole/byStatus/topAbilities、setting→byTags
|
|
43
|
+
* 实体聚合统计( get_entity_summary(type) → 总数、角色分布、能力分布等)。
|
|
44
|
+
* 透传 db getEntitySummaryStats:仅统计非软删实体;分布字段按类型
|
|
45
|
+
* 稀疏出现(character→byRole/byStatus/topAbilities、setting→byTags(分类由
|
|
48
46
|
* rules 标签承接)、location→byType、hook→byStatus/byPayoffTiming),缺字段不报错。
|
|
49
47
|
*/
|
|
50
48
|
export function runGetEntitySummary(ctx, args) {
|
package/dist/query/entity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.js","sourceRoot":"","sources":["../../src/query/entity.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,oDAAoD;AACpD
|
|
1
|
+
{"version":3,"file":"entity.js","sourceRoot":"","sources":["../../src/query/entity.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,oDAAoD;AACpD,EAAE;AACF,mDAAmD;AACnD,4CAA4C;AAC5C,0DAA0D;AAC1D,2EAA2E;AAC3E,oDAAoD;AACpD,qEAAqE;AACrE,2BAA2B;AAE3B,OAAO,EAAE,SAAS,IAAI,WAAW,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC5G,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAMjE,uCAAuC;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,GAAgB,EAAE,IAAmB;IAChE,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACxD,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAOD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAgB,EAAE,IAAwB;IAC1E,OAAO,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE;QAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,CAAC,EAAE,IAAI,CAAC,KAAK;QACb,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,GAAG;KACX,CAAC,CAAC;AACL,CAAC;AAED,+CAA+C;AAE/C;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAgB,EAAE,IAA0B;IAC9E,OAAO,qBAAqB,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC"}
|
package/dist/query/outline.d.ts
CHANGED
|
@@ -2,19 +2,19 @@ import type { OutlineTree } from "@whispering233/ai-editor-shared";
|
|
|
2
2
|
import type { ToolContext } from "../context.js";
|
|
3
3
|
import type { GetOutlinePathArgs } from "@whispering233/ai-editor-shared";
|
|
4
4
|
/**
|
|
5
|
-
* 完整大纲树(
|
|
5
|
+
* 完整大纲树( get_outline → 严格三层树)。
|
|
6
6
|
* - 默认不含 metadata 统计(省 token;需统计走 API GET /outline?with_metadata=)
|
|
7
|
-
* -
|
|
7
|
+
* - 软删节点过滤
|
|
8
8
|
* - 返回 API 形态 OutlineTree(camelCase;data 嵌套字段原样透传)
|
|
9
9
|
* 无参工具:签名省略 args(少参数赋值兼容 ToolDefinition.run,避免未使用参数 lint)
|
|
10
10
|
*/
|
|
11
11
|
export declare function runGetOutline(ctx: ToolContext): OutlineTree;
|
|
12
12
|
/**
|
|
13
|
-
* 根 → 目标节点的路径 ID 列表(
|
|
14
|
-
* 如 ["root", "vol-1", "ch-3", "sc-15"]
|
|
13
|
+
* 根 → 目标节点的路径 ID 列表( get_outline_path(node_id),含 root,
|
|
14
|
+
* 如 ["root", "vol-1", "ch-3", "sc-15"];严格三层下路径唯一)。
|
|
15
15
|
* - 节点不存在 → null(db getOutlinePathIds 抛错,工具层转查询无结果)
|
|
16
|
-
* - 路径上任一节点软删 → null
|
|
17
|
-
*
|
|
16
|
+
* - 路径上任一节点软删 → null(软删对象不可见——目标节点软删时
|
|
17
|
+
* 其路径对 AI 无意义;防御手改 outline.json 产生的祖先软删不一致)
|
|
18
18
|
*/
|
|
19
19
|
export declare function runGetOutlinePath(ctx: ToolContext, args: GetOutlinePathArgs): string[] | null;
|
|
20
20
|
//# sourceMappingURL=outline.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outline.d.ts","sourceRoot":"","sources":["../../src/query/outline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"outline.d.ts","sourceRoot":"","sources":["../../src/query/outline.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAmB,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAkB1E;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,WAAW,CAI3D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,GAAG,MAAM,EAAE,GAAG,IAAI,CAc7F"}
|
package/dist/query/outline.js
CHANGED
|
@@ -1,20 +1,18 @@
|
|
|
1
1
|
// 查询类工具:大纲侧实现(S6.3)
|
|
2
|
-
// get_outline / get_outline_path
|
|
3
|
-
// 契约来源:doc/api/tools.md;doc/api/endpoints.md 大纲端点;决策 12 修订(默认过滤软删)、
|
|
4
|
-
// 决策 19(严格三层,无游离节点)。
|
|
2
|
+
// get_outline / get_outline_path(「大纲查询」)
|
|
5
3
|
//
|
|
6
4
|
// db 层能力确认与分工:
|
|
7
5
|
// - get_outline:db readOutlineFile 返回存储形态 OutlineFileTree——
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
6
|
+
// 工具层 mapOutlineFileToTree 映射为 API 形态(camelCase);**默认不含 metadata**
|
|
7
|
+
// (省 token, 明确:需统计走 API with_metadata);软删节点整棵剔除
|
|
8
|
+
// (查询类工具不返回回收站中的对象)
|
|
11
9
|
// - get_outline_path:db getOutlinePathIds 返回根 → 目标节点路径(含 root);
|
|
12
|
-
//
|
|
10
|
+
// 节点不存在抛错——工具层转 null(查询无结果);路径上任一节点软删 → null(不可见)
|
|
13
11
|
import { findOutlineNode, getOutlinePathIds, readOutlineFile } from "@whispering233/ai-editor-db";
|
|
14
12
|
import { mapOutlineFileToTree } from "@whispering233/ai-editor-shared";
|
|
15
13
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
14
|
+
* 递归剔除软删节点:deleted === true 的节点整棵不可见——
|
|
15
|
+
* 级联软删保证其子树已一并软删,但防御性仍剔除整棵子树
|
|
18
16
|
* (手改 outline.json 可能产生不一致,查询层不因脏数据暴露回收站对象)。
|
|
19
17
|
* 泛型 T 保持调用处的节点联合类型(root 层 volume|chapter,递归层逐级收窄)。
|
|
20
18
|
*/
|
|
@@ -29,9 +27,9 @@ function stripDeletedNodes(nodes) {
|
|
|
29
27
|
return out;
|
|
30
28
|
}
|
|
31
29
|
/**
|
|
32
|
-
* 完整大纲树(
|
|
30
|
+
* 完整大纲树( get_outline → 严格三层树)。
|
|
33
31
|
* - 默认不含 metadata 统计(省 token;需统计走 API GET /outline?with_metadata=)
|
|
34
|
-
* -
|
|
32
|
+
* - 软删节点过滤
|
|
35
33
|
* - 返回 API 形态 OutlineTree(camelCase;data 嵌套字段原样透传)
|
|
36
34
|
* 无参工具:签名省略 args(少参数赋值兼容 ToolDefinition.run,避免未使用参数 lint)
|
|
37
35
|
*/
|
|
@@ -41,11 +39,11 @@ export function runGetOutline(ctx) {
|
|
|
41
39
|
return mapOutlineFileToTree(stripped);
|
|
42
40
|
}
|
|
43
41
|
/**
|
|
44
|
-
* 根 → 目标节点的路径 ID 列表(
|
|
45
|
-
* 如 ["root", "vol-1", "ch-3", "sc-15"]
|
|
42
|
+
* 根 → 目标节点的路径 ID 列表( get_outline_path(node_id),含 root,
|
|
43
|
+
* 如 ["root", "vol-1", "ch-3", "sc-15"];严格三层下路径唯一)。
|
|
46
44
|
* - 节点不存在 → null(db getOutlinePathIds 抛错,工具层转查询无结果)
|
|
47
|
-
* - 路径上任一节点软删 → null
|
|
48
|
-
*
|
|
45
|
+
* - 路径上任一节点软删 → null(软删对象不可见——目标节点软删时
|
|
46
|
+
* 其路径对 AI 无意义;防御手改 outline.json 产生的祖先软删不一致)
|
|
49
47
|
*/
|
|
50
48
|
export function runGetOutlinePath(ctx, args) {
|
|
51
49
|
const tree = readOutlineFile(ctx.outlineDir);
|