@whispering233/ai-editor-tools 0.0.33 → 0.0.38

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.
Files changed (60) hide show
  1. package/dist/analysis/conflict.d.ts.map +1 -1
  2. package/dist/analysis/conflict.js +4 -3
  3. package/dist/analysis/conflict.js.map +1 -1
  4. package/dist/analysis/hook.d.ts +16 -8
  5. package/dist/analysis/hook.d.ts.map +1 -1
  6. package/dist/analysis/hook.js +75 -27
  7. package/dist/analysis/hook.js.map +1 -1
  8. package/dist/analysis/utils.d.ts +2 -1
  9. package/dist/analysis/utils.d.ts.map +1 -1
  10. package/dist/analysis/utils.js +9 -2
  11. package/dist/analysis/utils.js.map +1 -1
  12. package/dist/context.js +1 -1
  13. package/dist/context.js.map +1 -1
  14. package/dist/executor/delta.d.ts.map +1 -1
  15. package/dist/executor/delta.js +22 -3
  16. package/dist/executor/delta.js.map +1 -1
  17. package/dist/executor/hook.d.ts.map +1 -1
  18. package/dist/executor/hook.js +45 -33
  19. package/dist/executor/hook.js.map +1 -1
  20. package/dist/executor/index.js +2 -2
  21. package/dist/executor/index.js.map +1 -1
  22. package/dist/executor/relation.d.ts.map +1 -1
  23. package/dist/executor/relation.js +18 -3
  24. package/dist/executor/relation.js.map +1 -1
  25. package/dist/index.js +38 -25
  26. package/dist/index.js.map +1 -1
  27. package/dist/proposal/delta.d.ts +12 -0
  28. package/dist/proposal/delta.d.ts.map +1 -1
  29. package/dist/proposal/delta.js +68 -0
  30. package/dist/proposal/delta.js.map +1 -1
  31. package/dist/proposal/hook.d.ts +3 -3
  32. package/dist/proposal/hook.d.ts.map +1 -1
  33. package/dist/proposal/hook.js +9 -9
  34. package/dist/proposal/hook.js.map +1 -1
  35. package/dist/proposal/relation.d.ts.map +1 -1
  36. package/dist/proposal/relation.js +13 -1
  37. package/dist/proposal/relation.js.map +1 -1
  38. package/dist/proposal/types.d.ts +11 -0
  39. package/dist/proposal/types.d.ts.map +1 -1
  40. package/dist/proposal/types.js +17 -0
  41. package/dist/proposal/types.js.map +1 -1
  42. package/dist/query/delta.d.ts +3 -2
  43. package/dist/query/delta.d.ts.map +1 -1
  44. package/dist/query/delta.js +4 -3
  45. package/dist/query/delta.js.map +1 -1
  46. package/dist/query/entity.d.ts +2 -2
  47. package/dist/query/entity.js +2 -2
  48. package/dist/schemas/delta.d.ts +2 -1
  49. package/dist/schemas/delta.d.ts.map +1 -1
  50. package/dist/schemas/delta.js +2 -1
  51. package/dist/schemas/delta.js.map +1 -1
  52. package/dist/schemas/proposal.d.ts +3 -2
  53. package/dist/schemas/proposal.d.ts.map +1 -1
  54. package/dist/schemas/proposal.js +3 -2
  55. package/dist/schemas/proposal.js.map +1 -1
  56. package/dist/schemas/relation.d.ts +2 -1
  57. package/dist/schemas/relation.d.ts.map +1 -1
  58. package/dist/schemas/relation.js +2 -1
  59. package/dist/schemas/relation.js.map +1 -1
  60. package/package.json +3 -3
@@ -13,25 +13,28 @@
13
13
  // findExistingStatusDeltaId——避免 LIKE 误命中其他字段的 to=abandoned)。
14
14
  // **边界**:advance/resolve 幂等只查关系记录,不查 delta——关系被**手动物理删**(
15
15
  // 手动删关系不走回收站、物理删)后重复确认会再写一条 delta + relation(幂等失效但语义
16
- // 自洽:关系已不存在,重写即恢复;delta from 取当前 data.status,链条不破)。
16
+ // 自洽:关系已不存在,重写即恢复;delta op=set 的单点状态,重复写不引入陈旧 from)。
17
17
  //
18
- // 变更形态(「伏笔状态变化」):changes = [{ field: "status", op: "update",
19
- // from: 当前状态, to: 目标状态 }]——from 取 hook.data.status(缺省 planted,
20
- // 状态缺失视为 planted),保证 computeStateupdate 校验正常累积;
21
- // description proposal.args.description(delta_records.description NOT NULL)。
18
+ // 变更形态(「伏笔状态变化」,2026-09 卡 1.9 语义修订 B):changes = [{ field: "status",
19
+ // op: "set", to: 目标状态 }]——**不含 from**:data.status 是物化事实字段(写路径同步最新值),
20
+ // `update` 的「data = 初始值」前提互斥(CAS from 重放时必然对不上 → 每次查询假 conflicts);
21
+ // set 语义与落地方式自洽,from→to 的叙事留在 description(proposal.args.description
22
+ // delta_records.description NOT NULL)。契约:docs/design/10-data-model.md §4
23
+ // 「物化事实字段不用 CAS」、docs/db/schema.md(状态机字段用 set)。
24
+ // **已知边界**:at_node 落在首次转移之前时返回最新值(基座即 data,接受该近似)。
22
25
  // 终态守卫:resolved/abandoned 为生命周期终态,终态伏笔不可再推进/回收/废弃。
23
26
  //
24
27
  // **状态同步(S6.7 修复轮必须改)**:复合写事务内插入 delta 后**同步更新
25
28
  // entities.data.status**(浅合并 + 刷新 updated_at,与 快照比对语义兼容)——
26
- // 终态守卫(assertNotTerminal)、delta 的 from(currentHookStatus)与 S6.5 hookStatuses
27
- // (analysis/hook.ts collectHooks 读 entity.data.status)均以 data.status 为唯一事实来源
28
- //;不同步则 resolved/abandoned 后仍可推进、同 hook 二次推进 from 断裂
29
- // (computeState conflicts)、已回收伏笔仍计 active。**幂等命中路径不更新**(首次执行已同步)。
29
+ // 终态守卫(assertNotTerminal)、列表摘要/面板分组与 S6.5 hookStatuses
30
+ // (analysis/hook.ts collectHooks 读 entity.data.status)均以 data.status 为唯一事实来源;
31
+ // 不同步则 resolved/abandoned 后仍可推进(守卫失效)、已回收伏笔仍计 active。
32
+ // **幂等命中路径不更新**(首次执行已同步)。
30
33
  //
31
34
  // 执行类是短同步事务,不做 signal 检查(长工具才要求执行中检查;入口检查由
32
35
  // S7.5 确认路由承担)。
33
36
  import { createRelation, findOutlineNode, insertDelta, readOutlineFile, readProjectFile, updateEntity, withTransaction } from "@whispering233/ai-editor-db";
34
- import { requireHook, requireOutlineNode } from "../proposal/types.js";
37
+ import { requireChapterNode, requireHook } from "../proposal/types.js";
35
38
  import { requireString } from "./types.js";
36
39
  /** 伏笔生命周期终态(planted → progressing → resolved 或 abandoned) */
37
40
  const TERMINAL_STATUSES = ["resolved", "abandoned"];
@@ -90,24 +93,16 @@ function findExistingStatusDeltaId(db, hookId, toStatus) {
90
93
  return null;
91
94
  }
92
95
  /**
93
- * abandon delta 锚定节点:废弃是主动放弃(无指定节点,propose_abandon_hook 仅 hook_id +
94
- * description)——取 project.json current_position(「当前章节」锚点,存在且未软删);
95
- * 未设置/失效则退化取树末节点(当前写作进度末端);大纲空树 → 抛错(无锚点不可记录)。
96
+ * 树末章:先序遍历最后一个未软删 `chapter`(当前写作进度末端——`project.json current_position` 未设时的退化锚点);
97
+ * 无章 → null(调用方抛错:无锚点不可记录)。卡片 1.3:锚点仅章,故不再取「树末节点」(可能为卷/场景)。
96
98
  */
97
- function anchorNodeForAbandon(ctx) {
98
- const config = readProjectFile(ctx.outlineDir);
99
- if (config !== null && config.current_position !== null && config.current_position !== "") {
100
- const node = findOutlineNode(readOutlineFile(ctx.outlineDir), config.current_position);
101
- if (node !== undefined && node.deleted !== true)
102
- return config.current_position;
103
- }
104
- const tree = readOutlineFile(ctx.outlineDir);
105
- // 树末节点:先序遍历最后一个叶子(卷→章→场景的最深最后节点)
99
+ function lastChapterNodeId(tree) {
106
100
  let last = null;
107
101
  const visit = (node) => {
108
102
  if (node.deleted === true)
109
103
  return;
110
- last = node.id;
104
+ if (node.type === "chapter")
105
+ last = node.id;
111
106
  const kids = node.children;
112
107
  if (kids !== undefined) {
113
108
  for (const kid of kids)
@@ -116,11 +111,28 @@ function anchorNodeForAbandon(ctx) {
116
111
  };
117
112
  for (const child of tree.children)
118
113
  visit(child);
119
- if (last === null) {
120
- throw new Error("大纲无可用节点,无法记录伏笔废弃位置");
121
- }
122
114
  return last;
123
115
  }
116
+ /**
117
+ * abandon 的 delta 锚定节点:废弃是主动放弃(无指定节点,propose_abandon_hook 仅 hook_id +
118
+ * description)——取 project.json current_position(「当前章节」锚点,**须为章**且未软删);
119
+ * 未设置/失效(含存量指向场景/卷)则退化取**树末章**(当前写作进度末端);大纲无章 → 抛错。
120
+ */
121
+ function anchorNodeForAbandon(ctx) {
122
+ const tree = readOutlineFile(ctx.outlineDir);
123
+ const config = readProjectFile(ctx.outlineDir);
124
+ const currentPosition = config?.current_position ?? null;
125
+ if (currentPosition !== null && currentPosition !== "") {
126
+ const node = findOutlineNode(tree, currentPosition);
127
+ if (node !== undefined && node.deleted !== true && node.type === "chapter")
128
+ return currentPosition;
129
+ }
130
+ const lastChapter = lastChapterNodeId(tree);
131
+ if (lastChapter === null) {
132
+ throw new Error("大纲无可用章节,无法记录伏笔废弃位置");
133
+ }
134
+ return lastChapter;
135
+ }
124
136
  /**
125
137
  * 复合写公共骨架(advance/resolve/abandon 共用):
126
138
  * 幂等判重 → 校验(伏笔/节点存在且未软删 + 终态守卫)→ delta 插入 → relation 插入,
@@ -145,14 +157,14 @@ function executeHookTransition(ctx, proposal, relationType, toStatus, actionLabe
145
157
  if (existing !== null)
146
158
  return { id: existing, duplicated: true };
147
159
  }
148
- // 校验:伏笔存在且 type=hook;推进/回收节点存在且未软删
160
+ // 校验:伏笔存在且 type=hook;推进/回收节点存在且未软删且**为章**(卡片 1.3:锚点仅章)
149
161
  const hook = requireHook(ctx, hookId);
150
162
  if (nodeId !== null)
151
- requireOutlineNode(ctx, nodeId);
163
+ requireChapterNode(ctx, nodeId);
152
164
  // 终态守卫(resolved/abandoned 不可再推进/回收;废弃时不可再废弃)
153
165
  assertNotTerminal(hook, actionLabel);
154
- // delta:记 status 变化(from=当前状态,update 语义,computeState 正常累积)
155
- const changes = [{ field: "status", op: "update", from: currentHookStatus(hook), to: toStatus }];
166
+ // delta:记 status 变化(op=set——物化事实字段不声明 from,卡 1.9 裁决 a;见文件头注)
167
+ const changes = [{ field: "status", op: "set", to: toStatus }];
156
168
  const delta = insertDelta(ctx.db, {
157
169
  nodeId: nodeId ?? anchorNodeForAbandon(ctx),
158
170
  targetType: "hook",
@@ -162,9 +174,9 @@ function executeHookTransition(ctx, proposal, relationType, toStatus, actionLabe
162
174
  });
163
175
  // **状态同步(S6.7 修复轮必须改)**:同一事务内浅合并更新 entities.data.status
164
176
  // (updateEntity 内部 withTransaction → 嵌套自动升级 SAVEPOINT,整体仍一次提交):
165
- // 终态守卫 / delta 的 from / S6.5 hookStatuses 均读 data.status——不落地则 resolved 后
166
- // 仍可推进(守卫失效)、同 hook 二次推进 from 断裂(computeState conflicts)、
167
- // 已回收伏笔仍计 active。幂等命中路径(上方 early return)不更新——首次执行已同步。
177
+ // 终态守卫 / 列表摘要与面板分组 / S6.5 hookStatuses 均读 data.status——不落地则
178
+ // resolved 后仍可推进(守卫失效)、已回收伏笔仍计 active。
179
+ // 幂等命中路径(上方 early return)不更新——首次执行已同步。
168
180
  updateEntity(ctx.db, hookId, { data: { status: toStatus } });
169
181
  // relation:advances / resolves(大纲节点 → hook;方向约定)
170
182
  if (relationType !== null) {
@@ -1 +1 @@
1
- {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/executor/hook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/executor/hook.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@
18
18
  // S7.5 确认路由在调用前做取消判定)。
19
19
  import { createEntity, createRelation, withTransaction } from "@whispering233/ai-editor-db";
20
20
  import { EXECUTOR_TOOLS } from "@whispering233/ai-editor-shared";
21
- import { requireHook, requireOutlineNode } from "../proposal/types.js";
21
+ import { requireChapterNode, requireHook } from "../proposal/types.js";
22
22
  import { executeAddDelta } from "./delta.js";
23
23
  import { executeCreateEntity, executeDeleteEntity, executeUpdateEntity } from "./entity.js";
24
24
  import { executeAddRelation, executeRemoveRelation } from "./relation.js";
@@ -36,7 +36,7 @@ const executeCreateHook = (ctx, proposal) => {
36
36
  return withTransaction(ctx.db, () => {
37
37
  const row = createEntity(ctx.db, { type: "hook", name, data });
38
38
  if (plantAtNodeId !== undefined) {
39
- requireOutlineNode(ctx, plantAtNodeId); // 埋设节点存在且未软删(createRelation 亦校验)
39
+ requireChapterNode(ctx, plantAtNodeId); // 埋设章节点存在且未软删(伏笔锚点仅章);createRelation 亦校验存在性
40
40
  createRelation(ctx.db, { sourceType: "outline_node", sourceId: plantAtNodeId, targetType: "hook", targetId: row.id, relationType: "plants" }, ctx.outlineDir);
41
41
  }
42
42
  return { id: row.id };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,EAAE;AACF,+DAA+D;AAC/D,6EAA6E;AAC7E,wDAAwD;AACxD,wEAAwE;AACxE,4EAA4E;AAC5E,kDAAkD;AAClD,+EAA+E;AAC/E,uGAAuG;AACvG,iEAAiE;AACjE,EAAE;AACF,sDAAsD;AACtD,6BAA6B;AAC7B,+CAA+C;AAC/C,kDAAkD;AAClD,uCAAuC;AACvC,uBAAuB;AAEvB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAkB,MAAM,iCAAiC,CAAC;AAEjF,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAwC,MAAM,YAAY,CAAC;AAKjG,iFAAiF;AACjF,MAAM,iBAAiB,GAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;IACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAChH,OAAO,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE;QAClC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,kBAAkB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,iCAAiC;YACzE,cAAc,CACZ,GAAG,CAAC,EAAE,EACN,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,EACrH,GAAG,CAAC,UAAU,CACf,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,8EAA8E;AAC9E,MAAM,iBAAiB,GAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;IACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC/C,4DAA4D;IAC5D,oDAAoD;IACnD,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACzB,OAAO,mBAAmB,CAAC,GAAG,EAAE,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACvG,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,wBAAwB,GAAqC;IACjE,qBAAqB,EAAE,mBAAmB;IAC1C,qBAAqB,EAAE,mBAAmB;IAC1C,qBAAqB,EAAE,mBAAmB;IAC1C,oBAAoB,EAAE,kBAAkB;IACxC,uBAAuB,EAAE,qBAAqB;IAC9C,iBAAiB,EAAE,eAAe;IAClC,oBAAoB,EAAE,wBAAwB;IAC9C,iBAAiB,EAAE,eAAe;IAClC,mBAAmB,EAAE,iBAAiB;IACtC,mBAAmB,EAAE,iBAAiB;IACtC,mBAAmB,EAAE,iBAAiB;IACtC,oBAAoB,EAAE,kBAAkB;IACxC,oBAAoB,EAAE,kBAAkB;IACxC,oBAAoB,EAAE,kBAAkB;IACxC,0BAA0B,EAAE,wBAAwB,EAAE,qDAAqD;IAC3G,wBAAwB,EAAE,sBAAsB,EAAE,gCAAgC;CACnF,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,GAAgB,EAAE,QAAkB;IAClE,MAAM,EAAE,GAAG,wBAAwB,CAAC,QAAQ,CAAC,IAAoB,CAAC,CAAC;IACnE,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC3B,CAAC;AAID,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"relation.d.ts","sourceRoot":"","sources":["../../src/executor/relation.ts"],"names":[],"mappings":"AAUA,OAAO,EAAiC,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE5E,4DAA4D;AAC5D,eAAO,MAAM,kBAAkB,EAAE,UAehC,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,qBAAqB,EAAE,UAOnC,CAAC"}
1
+ {"version":3,"file":"relation.d.ts","sourceRoot":"","sources":["../../src/executor/relation.ts"],"names":[],"mappings":"AAeA,OAAO,EAAiC,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE5E,4DAA4D;AAC5D,eAAO,MAAM,kBAAkB,EAAE,UAyBhC,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,qBAAqB,EAAE,UAOnC,CAAC"}
@@ -4,19 +4,34 @@
4
4
  // - add_relation:端点类型(source_type/target_type)已由 S6.6 提案层派生规范化到 args,
5
5
  // 此处直接透传 db createRelation(判重 RELATION_EXISTS / 端点存在性校验 db 层负责);
6
6
  // 重复确认同一 add_relation 提案 → RELATION_EXISTS 抛错(幂等只保证 hook 复合写)
7
+ // - **伏笔关系源端仅章(卡片 1.3 + 5.2)**:executor **直写 db 绕过 REST 校验**,此处再拦一道
8
+ // (与 `executor/delta.ts` 的 requireChapterNode 同模式)——plants/advances/resolves 无条件要求
9
+ // 源端为章大纲节点(实体反向组合同样拒);手工构造的越权 proposal 不会落库
7
10
  // - remove_relation:手动删关系 = **物理删**(不置 deleted_at、不进回收站);
8
11
  // 0 行影响(关系不存在)→ 抛错(fail-fast,S7.5 转错误响应)
9
12
  import { createRelation, deleteRelation } from "@whispering233/ai-editor-db";
13
+ import { HOOK_RELATION_TYPES } from "@whispering233/ai-editor-shared";
14
+ import { requireChapterNode } from "../proposal/types.js";
10
15
  import { optionalRecord, requireString } from "./types.js";
11
16
  /** add_relation(add_relation(source, target, type) → id) */
12
17
  export const executeAddRelation = (ctx, proposal) => {
13
18
  const args = proposal.args;
19
+ const sourceType = requireString(args, "source_type");
20
+ const sourceId = requireString(args, "source_id");
21
+ const relationType = requireString(args, "relation_type");
22
+ // 伏笔关系源端仅章(卡片 1.3 + 5.2):executor 直写 db 绕过 REST 校验,故此处再拦一道
23
+ if (HOOK_RELATION_TYPES.includes(relationType)) {
24
+ if (sourceType !== "outline_node") {
25
+ throw new Error(`伏笔关系(${relationType})的源端须为章大纲节点,当前为 ${sourceType}: ${sourceId}`);
26
+ }
27
+ requireChapterNode(ctx, sourceId);
28
+ }
14
29
  const row = createRelation(ctx.db, {
15
- sourceType: requireString(args, "source_type"),
16
- sourceId: requireString(args, "source_id"),
30
+ sourceType,
31
+ sourceId,
17
32
  targetType: requireString(args, "target_type"),
18
33
  targetId: requireString(args, "target_id"),
19
- relationType: requireString(args, "relation_type"),
34
+ relationType,
20
35
  metadata: optionalRecord(args, "metadata"),
21
36
  }, ctx.outlineDir);
22
37
  return { id: row.id };
@@ -1 +1 @@
1
- {"version":3,"file":"relation.js","sourceRoot":"","sources":["../../src/executor/relation.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,iCAAiC;AACjC,EAAE;AACF,sEAAsE;AACtE,iEAAiE;AACjE,8DAA8D;AAC9D,0DAA0D;AAC1D,yCAAyC;AAEzC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAmB,MAAM,YAAY,CAAC;AAE5E,4DAA4D;AAC5D,MAAM,CAAC,MAAM,kBAAkB,GAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;IAC9D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,MAAM,GAAG,GAAG,cAAc,CACxB,GAAG,CAAC,EAAE,EACN;QACE,UAAU,EAAE,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC;QAC9C,QAAQ,EAAE,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC;QAC1C,UAAU,EAAE,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC;QAC9C,QAAQ,EAAE,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC;QAC1C,YAAY,EAAE,aAAa,CAAC,IAAI,EAAE,eAAe,CAAC;QAClD,QAAQ,EAAE,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC;KAC3C,EACD,GAAG,CAAC,UAAU,CACf,CAAC;IACF,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;AACxB,CAAC,CAAC;AAEF,sDAAsD;AACtD,MAAM,CAAC,MAAM,qBAAqB,GAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;IACjE,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACnD,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,UAAU,UAAU,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3C,CAAC,CAAC"}
1
+ {"version":3,"file":"relation.js","sourceRoot":"","sources":["../../src/executor/relation.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,iCAAiC;AACjC,EAAE;AACF,sEAAsE;AACtE,iEAAiE;AACjE,8DAA8D;AAC9D,oEAAoE;AACpE,mFAAmF;AACnF,4CAA4C;AAC5C,0DAA0D;AAC1D,yCAAyC;AAEzC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAmB,MAAM,YAAY,CAAC;AAE5E,4DAA4D;AAC5D,MAAM,CAAC,MAAM,kBAAkB,GAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;IAC9D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC3D,2DAA2D;IAC1D,IAAK,mBAAyC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACtE,IAAI,UAAU,KAAK,cAAc,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,QAAQ,YAAY,mBAAmB,UAAU,KAAK,QAAQ,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IACD,MAAM,GAAG,GAAG,cAAc,CACxB,GAAG,CAAC,EAAE,EACN;QACE,UAAU;QACV,QAAQ;QACR,UAAU,EAAE,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC;QAC9C,QAAQ,EAAE,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC;QAC1C,YAAY;QACZ,QAAQ,EAAE,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC;KAC3C,EACD,GAAG,CAAC,UAAU,CACf,CAAC;IACF,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;AACxB,CAAC,CAAC;AAEF,sDAAsD;AACtD,MAAM,CAAC,MAAM,qBAAqB,GAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;IACjE,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACnD,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,UAAU,UAAU,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3C,CAAC,CAAC"}
package/dist/index.js CHANGED
@@ -35,7 +35,7 @@ export * from "./proposal/reorder-timepoints.js";
35
35
  export * from "./proposal/reference.js";
36
36
  // S6.7 执行层:导出 executor 门面与 13 个执行函数(不注册工具——见文件头注释)
37
37
  export * from "./executor/index.js";
38
- import { TOOL_PERMISSION } from "@whispering233/ai-editor-shared";
38
+ import { RELATION_TYPES, TOOL_PERMISSION } from "@whispering233/ai-editor-shared";
39
39
  import { computeStateArgsSchema, getDeltaHistoryArgsSchema, getEntityArgsSchema, getEntitySummaryArgsSchema, getOutlineArgsSchema, getOutlinePathArgsSchema, queryRelationshipsArgsSchema, searchEntitiesArgsSchema, searchReferencesArgsSchema, } from "./schemas/index.js";
40
40
  import { registerTools } from "./registry.js";
41
41
  import { runGetEntity, runGetEntitySummary, runSearchEntities } from "./query/entity.js";
@@ -56,7 +56,8 @@ const queryToolDefs = [
56
56
  },
57
57
  {
58
58
  name: "search_entities",
59
- description: "实体搜索:按类型 + 名称关键词模糊匹配(可附 filters:status 精确匹配 data.status" +
59
+ description: "实体搜索:按类型 + 名称关键词模糊匹配(可附 filters:status 精确匹配 data.status——" +
60
+ "**仅伏笔(hook)生命周期有意义**(character 已无该字段);" +
60
61
  "tags 要求 data.tags 数组包含全部指定标签)。返回匹配实体列表(名称 + 类型 + 关键字段摘要)。",
61
62
  parameters: searchEntitiesArgsSchema,
62
63
  permission: TOOL_PERMISSION.AUTO,
@@ -65,9 +66,11 @@ const queryToolDefs = [
65
66
  {
66
67
  name: "query_relationships",
67
68
  description: "关系图查询:按端点/关系类型过滤(depth 1=紧邻直接关系、2=k跳路径、3=全量遍历)。" +
68
- "端点可为实体或大纲节点(outline_node);relation_type 取值限定预定义 16 种:" +
69
- "belongs_to/owns/masters/ally/rival/mentor/family/kills/appears_in/occurs_at/" +
70
- "plot_edge/plants/advances/resolves/depends_on/involves;端点软删的关系不可见。",
69
+ "端点可为实体或大纲节点(outline_node);relation_type 取值限定预定义 " +
70
+ RELATION_TYPES.length +
71
+ " 种:" +
72
+ RELATION_TYPES.join("/") +
73
+ ";端点软删的关系不可见。",
71
74
  parameters: queryRelationshipsArgsSchema,
72
75
  permission: TOOL_PERMISSION.AUTO,
73
76
  run: runQueryRelationships,
@@ -91,7 +94,9 @@ const queryToolDefs = [
91
94
  {
92
95
  name: "compute_state",
93
96
  description: "状态计算:实体(target_id)到达指定大纲节点(at_node_id)时的累积状态——" +
94
- "只沿大纲树父链累积已确认 Delta。若存在 update 冲突(from 不匹配)该 change 被跳过," +
97
+ "按**章序前缀**累积已确认 Delta(状态 = 初始 data + 章序 ≤ 目标进度章的全部章,跨卷/跨章;" +
98
+ "at_node_id 不限层级:章→自身、场景→所属章、卷→该卷最后一个未软删章)。" +
99
+ "若存在 update 冲突(from 不匹配)该 change 被跳过," +
95
100
  "结果在 conflicts 字段标注 { field, expected, actual },请据此向用户提示修复。",
96
101
  parameters: computeStateArgsSchema,
97
102
  permission: TOOL_PERMISSION.AUTO,
@@ -107,7 +112,7 @@ const queryToolDefs = [
107
112
  },
108
113
  {
109
114
  name: "get_entity_summary",
110
- description: "实体聚合统计:指定类型实体的总数与分布(character→角色/状态/能力分布、hook→状态/兑现时机分布、" +
115
+ description: "实体聚合统计:指定类型实体的总数与分布(character→角色分布/能力面板分组分布、hook→状态/兑现时机分布、" +
111
116
  "setting→分类分布、location→类型分布)。用于全局概览。",
112
117
  parameters: getEntitySummaryArgsSchema,
113
118
  permission: TOOL_PERMISSION.AUTO,
@@ -143,7 +148,7 @@ const analysisToolDefs = [
143
148
  },
144
149
  {
145
150
  name: "detect_conflicts",
146
- description: "跨实体设定矛盾检测:扫描关系图发现不一致——对称关系(ally/family)单向缺失、" +
151
+ description: "跨实体设定矛盾检测:扫描关系图发现不一致——对称关系(ally/rival/family)单向缺失、" +
147
152
  "同一对实体互斥关系并存(ally+rival)、互相击杀(双向 kills)。" +
148
153
  "types 限定实体类型、relation_filter 限定参与检测的关系类型(缺省全量)。" +
149
154
  "返回 conflicts: [{ entity_a, entity_b, field, description }]。",
@@ -206,18 +211,18 @@ const hookToolDefs = [
206
211
  },
207
212
  {
208
213
  name: "suggest_hook_payoff",
209
- description: "伏笔回收建议:基于埋设章节与半衰期(显式优先、缺省按 payoff_timing 映射)推荐理想回收场景" +
210
- "(节奏匹配 top 3,候选为当前章节之后的未回收场景)。返回 { suggestions: [{ at_node, reason }] };" +
211
- "hook 不存在/已软删返回 null,无埋设记录或大纲无候选场景返回空建议。",
214
+ description: "伏笔回收建议:基于埋设章与半衰期(显式优先、缺省按 payoff_timing 映射)推荐理想回收**章**" +
215
+ "(节奏匹配 top 3,候选为当前章节之后的未回收章;伏笔锚点仅章)。返回 { suggestions: [{ at_node, reason }] };" +
216
+ "hook 不存在/已软删返回 null,无埋设记录或大纲无候选章返回空建议。",
212
217
  parameters: suggestHookPayoffArgsSchema,
213
218
  permission: TOOL_PERMISSION.AUTO,
214
219
  run: runSuggestHookPayoff,
215
220
  },
216
221
  {
217
222
  name: "find_hook_opportunities",
218
- description: "伏笔埋设机会发现:分析指定大纲节点的叙事特征(尚无伏笔埋设、角色在场数、场景冲突层次、价值转向)" +
219
- "建议适合的伏笔类别(mystery/relationship/world_building/character_growth)。" +
220
- "返回 { opportunities: [{ category, reason }] };节点不存在或已软删返回 null。",
223
+ description: "伏笔埋设机会发现:分析指定**章**节点的叙事特征(**本章及其场景**聚合:尚无伏笔埋设、角色在场数、" +
224
+ "场景冲突层次、价值转向)建议适合的伏笔类别(mystery/relationship/world_building/character_growth)。" +
225
+ "返回 { opportunities: [{ category, reason }] };输入为卷/场景报错(仅章),章不存在或已软删返回 null。",
221
226
  parameters: findHookOpportunitiesArgsSchema,
222
227
  permission: TOOL_PERMISSION.AUTO,
223
228
  run: runFindHookOpportunities,
@@ -274,9 +279,14 @@ const proposalToolDefs = [
274
279
  {
275
280
  name: "propose_add_relation",
276
281
  description: "新增关系提案:source/target 为端点 id(实体 id 如 char-xxx,或大纲节点 id 如 ch-xxx," +
277
- "类型自动识别),type 为预定义关系类型(belongs_to/owns/masters/ally/rival/mentor/family/" +
278
- "kills/appears_in/occurs_at/plot_edge/plants/advances/resolves/depends_on/involves)," +
279
- "metadata 可选。仅生成提案,需用户确认后生效;端点不存在或已软删返回错误。",
282
+ "类型自动识别),type 为预定义关系类型(" +
283
+ RELATION_TYPES.join("/") +
284
+ ",共 " +
285
+ RELATION_TYPES.length +
286
+ " 种;**作者在界面自定义的类型 AI 不可创建**)," +
287
+ "metadata 可选。**伏笔三类关系(plants/advances/resolves)的源端必须是章大纲节点**" +
288
+ "(卷/场景报错;源端为实体等反向组合同样拒绝——无消费者属数据卫生)。" +
289
+ "仅生成提案,需用户确认后生效;端点不存在或已软删返回错误。",
280
290
  parameters: proposeAddRelationArgsSchema,
281
291
  permission: TOOL_PERMISSION.PROPOSAL,
282
292
  run: runProposeAddRelation,
@@ -291,9 +301,12 @@ const proposalToolDefs = [
291
301
  },
292
302
  {
293
303
  name: "propose_add_delta",
294
- description: "追加属性变更提案:node_id 为触发变更的大纲节点,target 为变更目标(实体 id 或大纲节点 id," +
304
+ description: "追加属性变更提案:node_id 为触发变更的大纲节点(**仅章**——卷/场景拒绝),target 为变更目标(实体 id 或大纲节点 id," +
295
305
  "类型自动识别),changes 为变更列表(op 取值 set/update/add/remove,至少一项;" +
296
- "update 需 from 旧值,add/remove 用 value)。仅生成提案,需用户确认后生效;" +
306
+ "update 需 from 旧值,add/remove 用 value)。**character 的不可变字段(role/description)不可作为变更字段**" +
307
+ "(与前端字段下拉同源;请直接编辑实体)。**hook 的 status 是写路径同步的事实字段,只能用 op=set**" +
308
+ "(用 update+from 重放会与已同步的当前值冲突,产生虚假冲突标注)。" +
309
+ "仅生成提案,需用户确认后生效;" +
297
310
  "触发节点或目标不存在/已软删返回错误。",
298
311
  parameters: proposeAddDeltaArgsSchema,
299
312
  permission: TOOL_PERMISSION.PROPOSAL,
@@ -328,8 +341,8 @@ const proposalToolDefs = [
328
341
  {
329
342
  name: "propose_create_hook",
330
343
  description: "创建伏笔提案:name 必填,data 可选(伏笔字段:payoff_timing、half_life、expected_resolve_node_id、category 等)," +
331
- "plant_at_node_id 可选指定埋设节点(确认后建立 plants 关系)。" +
332
- "仅生成提案,需用户确认后生效;埋设节点不存在/已软删返回错误。",
344
+ "plant_at_node_id 可选指定埋设**章**节点(确认后建立 plants 关系)。" +
345
+ "仅生成提案,需用户确认后生效;埋设节点非章/不存在/已软删返回错误。",
333
346
  parameters: proposeCreateHookArgsSchema,
334
347
  permission: TOOL_PERMISSION.PROPOSAL,
335
348
  run: runProposeCreateHook,
@@ -345,18 +358,18 @@ const proposalToolDefs = [
345
358
  },
346
359
  {
347
360
  name: "propose_advance_hook",
348
- description: "推进伏笔提案:hook_id 指定伏笔,node_id 为推进发生的节点,description 描述推进内容。" +
361
+ description: "推进伏笔提案:hook_id 指定伏笔,node_id 为推进发生的**章**节点,description 描述推进内容。" +
349
362
  "确认后复合写一次提交(Delta 记 status=progressing + advances 关系,幂等)。" +
350
- "仅生成提案,需用户确认后生效;伏笔或节点不存在/已软删返回错误。",
363
+ "仅生成提案,需用户确认后生效;伏笔或节点不存在/已软删/非章返回错误。",
351
364
  parameters: proposeAdvanceHookArgsSchema,
352
365
  permission: TOOL_PERMISSION.PROPOSAL,
353
366
  run: runProposeAdvanceHook,
354
367
  },
355
368
  {
356
369
  name: "propose_resolve_hook",
357
- description: "回收伏笔提案:hook_id 指定伏笔,node_id 为回收节点,description 描述回收内容。" +
370
+ description: "回收伏笔提案:hook_id 指定伏笔,node_id 为回收**章**节点,description 描述回收内容。" +
358
371
  "确认后复合写一次提交(Delta 记 status=resolved + resolves 关系,幂等)。" +
359
- "仅生成提案,需用户确认后生效;伏笔或节点不存在/已软删返回错误。",
372
+ "仅生成提案,需用户确认后生效;伏笔或节点不存在/已软删/非章返回错误。",
360
373
  parameters: proposeResolveHookArgsSchema,
361
374
  permission: TOOL_PERMISSION.PROPOSAL,
362
375
  run: runProposeResolveHook,
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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"}
@@ -1,6 +1,18 @@
1
1
  import type { ProposeAddDeltaArgs } from "../schemas/index.js";
2
2
  import type { ToolContext } from "../context.js";
3
3
  import { type Proposal, type ToolProposalResult } from "./types.js";
4
+ /**
5
+ * 事实字段守卫:`targetType` 的事实字段(shared `SET_ONLY_FIELDS`)出现非 `set` 的 op → 抛错。
6
+ * **提案层与 executor 层共用同一实现**(executor 直写 db、绕过提案层;两处白名单/文案不得漂移)。
7
+ * 防御:非对象 change 项静默跳过(与 `computeState` 的坏项防御同风格)。
8
+ */
9
+ export declare function assertFactFieldsSetOnly(targetType: string, changes: readonly unknown[]): void;
10
+ /**
11
+ * character 已移除字段守卫(卡片 5.4 / 5.5):field ∈ shared `REMOVED_CHARACTER_FIELDS` → 抛错。
12
+ * **提案层与 executor 层共用同一实现**(同 `assertFactFieldsSetOnly` 模式);
13
+ * 防御:非对象 change 项静默跳过。
14
+ */
15
+ export declare function assertRemovedCharacterFields(targetType: string, changes: readonly unknown[]): void;
4
16
  /** 产出追加 Delta 提案 */
5
17
  export declare function buildProposeAddDelta(ctx: ToolContext, args: ProposeAddDeltaArgs): Proposal;
6
18
  /** propose_add_delta run */
@@ -1 +1 @@
1
- {"version":3,"file":"delta.d.ts","sourceRoot":"","sources":["../../src/proposal/delta.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAA4F,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE9J,oBAAoB;AACpB,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,GAAG,QAAQ,CAe1F;AAED,4BAA4B;AAC5B,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,mBAAmB,EACzB,MAAM,CAAC,EAAE,WAAW,GACnB,kBAAkB,CAIpB"}
1
+ {"version":3,"file":"delta.d.ts","sourceRoot":"","sources":["../../src/proposal/delta.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,OAAO,EAA4F,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE9J;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAY7F;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CASlG;AAED,oBAAoB;AACpB,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,GAAG,QAAQ,CAmC1F;AAED,4BAA4B;AAC5B,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,mBAAmB,EACzB,MAAM,CAAC,EAAE,WAAW,GACnB,kBAAkB,CAIpB"}
@@ -6,6 +6,9 @@
6
6
  //
7
7
  // 生成时校验:
8
8
  // - 触发节点(node_id)存在且未软删(requireOutlineNode)——节点级 updated_at 快照
9
+ // - **触发节点仅章(卡片 1.2)**:卷/场景拒绝(与 REST 创建路径 server delta.ts
10
+ // assertDeltaAnchorChapter 一致)——一章一个状态变化点才是叙事粒度;
11
+ // **只限写入侧**:compute_state 的 at_node_id 不限层级
9
12
  // - 变更目标(target)存在且未软删(resolveEndpoint:实体或大纲节点)——端点 updated_at 快照
10
13
  // **target 可为大纲节点**:S13.3 收紧的是 UI 创建入口(仅实体);AI 提案通道保持大纲
11
14
  // target 是 「提案类」/get_delta_history(target_type 含 outline_node)的既有
@@ -13,19 +16,84 @@
13
16
  // - **target 不可为 event(event 不产生 Delta,oracle 审查口径)**:与 REST 创建
14
17
  // 路径(server delta.ts assertDeltaTargetType)一致拒绝;outline_node 有 S13.3 显式豁免
15
18
  // (UI 收紧、AI 通道保持),event 无豁免——resolveEndpoint 解析出 event 即抛错
19
+ // - **character 不可变字段(卡片 5.2)**:目标为 character 时,changes 不得包含
20
+ // `role`/`description`(与前端字段下拉白名单同源)——二者是列表摘要与 AI 检索的依据,
21
+ // 允许 Delta 改会与 `entities.name`/摘要读取面产生“同一人物两个值”(见
22
+ // `docs/db/schema.md`「人物 data 分层」/`docs/design/10-data-model.md` §14 不变式 1)
23
+ // - **character 已移除字段(卡片 5.4 / 5.5)**:`status`/`abilities` 已从 schema 移除(status 无展示面、
24
+ // abilities 经 007 迁为 `ability_panel`)——允许写入只是脏键残留;白名单单一事实源 = shared
25
+ // `constants/delta.ts` 的 `REMOVED_CHARACTER_FIELDS`(提案层与 executor 同源,见下)
26
+ // - **事实字段只能用 set(卡片 5.3 / 5.5)**:hook 的 `status` 是物化事实字段(写路径同步当前值、
27
+ // 终态守卫/列表分组/AI 统计直接读它)——用 `op=update`+`from` 重放必然假冲突
28
+ // (重放基座即最新值);白名单单一事实源 = shared `constants/delta.ts` 的 `SET_ONLY_FIELDS`
16
29
  // - changes 由 schema 校验(复用 deltaChangeSchema,至少一项)
17
30
  // args 规范化为执行形态 { node_id, target_type, target_id, changes }(S6.7 add_delta 直接消费);
18
31
  // delta_records.description(NOT NULL)在确认后由 S6.7 执行器取 proposal.summary 作为人类可读描述。
32
+ // 白名单单一事实源(卡片 5.5 / 5.6):client 与 tools 共消费 shared 常量,禁止各自手抄
33
+ import { IMMUTABLE_FIELDS, REMOVED_CHARACTER_FIELDS, SET_ONLY_FIELDS } from "@whispering233/ai-editor-shared";
19
34
  import { buildProposal, checkProposalAborted, refOutlineNode, requireOutlineNode, resolveEndpoint } from "./types.js";
35
+ /**
36
+ * 事实字段守卫:`targetType` 的事实字段(shared `SET_ONLY_FIELDS`)出现非 `set` 的 op → 抛错。
37
+ * **提案层与 executor 层共用同一实现**(executor 直写 db、绕过提案层;两处白名单/文案不得漂移)。
38
+ * 防御:非对象 change 项静默跳过(与 `computeState` 的坏项防御同风格)。
39
+ */
40
+ export function assertFactFieldsSetOnly(targetType, changes) {
41
+ const setOnlyFields = SET_ONLY_FIELDS[targetType];
42
+ if (setOnlyFields === undefined)
43
+ return;
44
+ for (const change of changes) {
45
+ const c = change;
46
+ const field = c === null || typeof c !== "object" ? undefined : c.field;
47
+ if (typeof field === "string" && setOnlyFields.includes(field) && c?.op !== "set") {
48
+ throw new Error(`${targetType} 的 ${field} 是写路径同步的事实字段,变更记录只能用 op=set(当前 op=${String(c?.op ?? "(缺失)")})`);
49
+ }
50
+ }
51
+ }
52
+ /**
53
+ * character 已移除字段守卫(卡片 5.4 / 5.5):field ∈ shared `REMOVED_CHARACTER_FIELDS` → 抛错。
54
+ * **提案层与 executor 层共用同一实现**(同 `assertFactFieldsSetOnly` 模式);
55
+ * 防御:非对象 change 项静默跳过。
56
+ */
57
+ export function assertRemovedCharacterFields(targetType, changes) {
58
+ if (targetType !== "character")
59
+ return;
60
+ for (const change of changes) {
61
+ const c = change;
62
+ const field = c === null || typeof c !== "object" ? undefined : c.field;
63
+ if (typeof field === "string" && REMOVED_CHARACTER_FIELDS.includes(field)) {
64
+ throw new Error(`character 的 ${field} 字段已移除(请改用可变字段/能力面板)`);
65
+ }
66
+ }
67
+ }
20
68
  /** 产出追加 Delta 提案 */
21
69
  export function buildProposeAddDelta(ctx, args) {
22
70
  const node = requireOutlineNode(ctx, args.node_id);
71
+ // 锚点仅章(卡片 1.2):卷/场景拒绝——与 REST 路径 assertDeltaAnchorChapter 同口径
72
+ if (node.type !== "chapter") {
73
+ throw new Error(`变更记录的触发节点须为章(卷/场景不承载变更记录): ${args.node_id}`);
74
+ }
23
75
  const target = resolveEndpoint(ctx, args.target);
24
76
  // event(时间轴事件)不产生 Delta——AI 提案通道与 REST 创建路径一致拒绝
25
77
  //(outline_node 有 S13.3 显式豁免,event 无豁免)
26
78
  if (target.type === "event") {
27
79
  throw new Error(`event(时间轴事件)不产生 Delta,变更目标无效: ${args.target}`);
28
80
  }
81
+ // character 不可变字段(卡片 5.2 / 5.6):role/description 不参与变更记录(请直接编辑)
82
+ // 白名单单一事实源 = shared `IMMUTABLE_FIELDS`(与前端字段下拉同源,禁止手抄)
83
+ if (target.type === "character") {
84
+ const immutable = IMMUTABLE_FIELDS.character ?? [];
85
+ for (const change of args.changes) {
86
+ const field = change?.field;
87
+ if (typeof field === "string" && immutable.includes(field)) {
88
+ throw new Error(`character 的不可变字段不参与变更记录(请直接编辑): ${field}`);
89
+ }
90
+ }
91
+ }
92
+ // character 已移除字段(卡片 5.4 / 5.5):status/abilities 已从 schema 移除——写入只是脏键残留
93
+ // (守卫实现与 executor 同源,白名单来自 shared `REMOVED_CHARACTER_FIELDS`)
94
+ assertRemovedCharacterFields(target.type, args.changes);
95
+ // 事实字段只能用 set(卡片 5.3):hook.status 用 update/from 重放必然假冲突(写路径同步了最新值)
96
+ assertFactFieldsSetOnly(target.type, args.changes);
29
97
  return buildProposal(ctx, "propose_add_delta", { node_id: args.node_id, target_type: target.type, target_id: args.target, changes: args.changes }, [refOutlineNode(node), target.ref], `为节点「${node.title}」追加 ${args.changes.length} 项属性变更(目标: ${args.target})`);
30
98
  }
31
99
  /** propose_add_delta run */
@@ -1 +1 @@
1
- {"version":3,"file":"delta.js","sourceRoot":"","sources":["../../src/proposal/delta.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,oBAAoB;AACpB,EAAE;AACF,uEAAuE;AACvE,4CAA4C;AAC5C,EAAE;AACF,SAAS;AACT,+DAA+D;AAC/D,kEAAkE;AAClE,wDAAwD;AACxD,kEAAkE;AAClE,cAAc;AACd,gEAAgE;AAChE,0EAA0E;AAC1E,2DAA2D;AAC3D,mDAAmD;AACnD,mFAAmF;AACnF,gFAAgF;AAIhF,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAA0C,MAAM,YAAY,CAAC;AAE9J,oBAAoB;AACpB,MAAM,UAAU,oBAAoB,CAAC,GAAgB,EAAE,IAAyB;IAC9E,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,gDAAgD;IAChD,uCAAuC;IACtC,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,aAAa,CAClB,GAAG,EACH,mBAAmB,EACnB,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAClG,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAClC,OAAO,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,cAAc,IAAI,CAAC,MAAM,GAAG,CACxE,CAAC;AACJ,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,kBAAkB,CAChC,GAAgB,EAChB,IAAyB,EACzB,MAAoB;IAEpB,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACjD,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;AAC1E,CAAC"}
1
+ {"version":3,"file":"delta.js","sourceRoot":"","sources":["../../src/proposal/delta.ts"],"names":[],"mappings":"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"}