@whispering233/ai-editor-tools 0.0.1

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 (109) hide show
  1. package/dist/analysis/conflict.d.ts +20 -0
  2. package/dist/analysis/conflict.d.ts.map +1 -0
  3. package/dist/analysis/conflict.js +116 -0
  4. package/dist/analysis/conflict.js.map +1 -0
  5. package/dist/analysis/consistency.d.ts +28 -0
  6. package/dist/analysis/consistency.d.ts.map +1 -0
  7. package/dist/analysis/consistency.js +108 -0
  8. package/dist/analysis/consistency.js.map +1 -0
  9. package/dist/analysis/hook.d.ts +157 -0
  10. package/dist/analysis/hook.d.ts.map +1 -0
  11. package/dist/analysis/hook.js +381 -0
  12. package/dist/analysis/hook.js.map +1 -0
  13. package/dist/analysis/orphan.d.ts +60 -0
  14. package/dist/analysis/orphan.d.ts.map +1 -0
  15. package/dist/analysis/orphan.js +153 -0
  16. package/dist/analysis/orphan.js.map +1 -0
  17. package/dist/analysis/path.d.ts +23 -0
  18. package/dist/analysis/path.d.ts.map +1 -0
  19. package/dist/analysis/path.js +114 -0
  20. package/dist/analysis/path.js.map +1 -0
  21. package/dist/analysis/suggest.d.ts +19 -0
  22. package/dist/analysis/suggest.d.ts.map +1 -0
  23. package/dist/analysis/suggest.js +92 -0
  24. package/dist/analysis/suggest.js.map +1 -0
  25. package/dist/analysis/utils.d.ts +54 -0
  26. package/dist/analysis/utils.d.ts.map +1 -0
  27. package/dist/analysis/utils.js +123 -0
  28. package/dist/analysis/utils.js.map +1 -0
  29. package/dist/context.d.ts +10 -0
  30. package/dist/context.d.ts.map +1 -0
  31. package/dist/context.js +11 -0
  32. package/dist/context.js.map +1 -0
  33. package/dist/executor/delta.d.ts +4 -0
  34. package/dist/executor/delta.d.ts.map +1 -0
  35. package/dist/executor/delta.js +22 -0
  36. package/dist/executor/delta.js.map +1 -0
  37. package/dist/executor/entity.d.ts +8 -0
  38. package/dist/executor/entity.d.ts.map +1 -0
  39. package/dist/executor/entity.js +47 -0
  40. package/dist/executor/entity.js.map +1 -0
  41. package/dist/executor/hook.d.ts +8 -0
  42. package/dist/executor/hook.d.ts.map +1 -0
  43. package/dist/executor/hook.js +183 -0
  44. package/dist/executor/hook.js.map +1 -0
  45. package/dist/executor/index.d.ts +22 -0
  46. package/dist/executor/index.d.ts.map +1 -0
  47. package/dist/executor/index.js +89 -0
  48. package/dist/executor/index.js.map +1 -0
  49. package/dist/executor/outline.d.ts +8 -0
  50. package/dist/executor/outline.d.ts.map +1 -0
  51. package/dist/executor/outline.js +39 -0
  52. package/dist/executor/outline.js.map +1 -0
  53. package/dist/executor/relation.d.ts +6 -0
  54. package/dist/executor/relation.d.ts.map +1 -0
  55. package/dist/executor/relation.js +33 -0
  56. package/dist/executor/relation.js.map +1 -0
  57. package/dist/executor/types.d.ts +25 -0
  58. package/dist/executor/types.d.ts.map +1 -0
  59. package/dist/executor/types.js +54 -0
  60. package/dist/executor/types.js.map +1 -0
  61. package/dist/index.d.ts +23 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +359 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/proposal/delta.d.ts +8 -0
  66. package/dist/proposal/delta.d.ts.map +1 -0
  67. package/dist/proposal/delta.js +29 -0
  68. package/dist/proposal/delta.js.map +1 -0
  69. package/dist/proposal/entity.d.ts +16 -0
  70. package/dist/proposal/entity.d.ts.map +1 -0
  71. package/dist/proposal/entity.js +54 -0
  72. package/dist/proposal/entity.js.map +1 -0
  73. package/dist/proposal/hook.d.ts +24 -0
  74. package/dist/proposal/hook.d.ts.map +1 -0
  75. package/dist/proposal/hook.js +81 -0
  76. package/dist/proposal/hook.js.map +1 -0
  77. package/dist/proposal/outline.d.ts +24 -0
  78. package/dist/proposal/outline.d.ts.map +1 -0
  79. package/dist/proposal/outline.js +78 -0
  80. package/dist/proposal/outline.js.map +1 -0
  81. package/dist/proposal/relation.d.ts +12 -0
  82. package/dist/proposal/relation.d.ts.map +1 -0
  83. package/dist/proposal/relation.js +50 -0
  84. package/dist/proposal/relation.js.map +1 -0
  85. package/dist/proposal/types.d.ts +72 -0
  86. package/dist/proposal/types.d.ts.map +1 -0
  87. package/dist/proposal/types.js +105 -0
  88. package/dist/proposal/types.js.map +1 -0
  89. package/dist/query/delta.d.ts +20 -0
  90. package/dist/query/delta.d.ts.map +1 -0
  91. package/dist/query/delta.js +41 -0
  92. package/dist/query/delta.js.map +1 -0
  93. package/dist/query/entity.d.ts +29 -0
  94. package/dist/query/entity.d.ts.map +1 -0
  95. package/dist/query/entity.js +53 -0
  96. package/dist/query/entity.js.map +1 -0
  97. package/dist/query/outline.d.ts +20 -0
  98. package/dist/query/outline.d.ts.map +1 -0
  99. package/dist/query/outline.js +68 -0
  100. package/dist/query/outline.js.map +1 -0
  101. package/dist/query/relation.d.ts +12 -0
  102. package/dist/query/relation.d.ts.map +1 -0
  103. package/dist/query/relation.js +30 -0
  104. package/dist/query/relation.js.map +1 -0
  105. package/dist/registry.d.ts +41 -0
  106. package/dist/registry.d.ts.map +1 -0
  107. package/dist/registry.js +46 -0
  108. package/dist/registry.js.map +1 -0
  109. package/package.json +35 -0
package/dist/index.js ADDED
@@ -0,0 +1,359 @@
1
+ // @whispering233/ai-editor-tools 入口:导出工具上下文 / 注册表 / 查询类与分析类工具实现
2
+ // S6.3 查询类工具(自动权限,8 个)+ S6.4 分析类工具(自动权限,5 个)在此注册;
3
+ // S6.5 伏笔 / S6.6 提案通过 registry.registerTool(s) 继续挂载(注册表是唯一事实来源)。
4
+ // S6.7 执行类 12 个**不注册 registry**(LLM 不可见,tools.md「核心设计原则」)——
5
+ // 仅经 executor 门面(executeProposal)导出,S7.5 提案确认后调用。
6
+ //
7
+ // 注册语义:模块副作用注册(import 即挂载)——S7.4 executor 直接 getTool(name) 调度;
8
+ // 工具定义集中在各 query/analysis 模块(name/description/argsSchema/permission/run),
9
+ // 本入口统一注册并导出全部 API。
10
+ // 包标识常量(与 shared/llm 包风格一致:SHARED_PKG_NAME/LLM_PKG_NAME;agent 冒烟依赖)
11
+ export const TOOLS_PKG_NAME = "@whispering233/ai-editor-tools";
12
+ export const TOOLS_PKG_VERSION = "0.1.0";
13
+ export * from "./context.js";
14
+ export * from "./registry.js";
15
+ export * from "./query/entity.js";
16
+ export * from "./query/relation.js";
17
+ export * from "./query/outline.js";
18
+ export * from "./query/delta.js";
19
+ export * from "./analysis/utils.js";
20
+ export * from "./analysis/consistency.js";
21
+ export * from "./analysis/conflict.js";
22
+ export * from "./analysis/path.js";
23
+ export * from "./analysis/orphan.js";
24
+ export * from "./analysis/suggest.js";
25
+ export * from "./analysis/hook.js";
26
+ export * from "./proposal/types.js";
27
+ export * from "./proposal/entity.js";
28
+ export * from "./proposal/relation.js";
29
+ export * from "./proposal/delta.js";
30
+ export * from "./proposal/outline.js";
31
+ export * from "./proposal/hook.js";
32
+ // S6.7 执行层:导出 executor 门面与 12 个执行函数(不注册工具——见文件头注释)
33
+ export * from "./executor/index.js";
34
+ import { TOOL_PERMISSION } from "@whispering233/ai-editor-shared";
35
+ import { computeStateArgsSchema, getDeltaHistoryArgsSchema, getEntityArgsSchema, getEntitySummaryArgsSchema, getOutlineArgsSchema, getOutlinePathArgsSchema, queryRelationshipsArgsSchema, searchEntitiesArgsSchema, } from "@whispering233/ai-editor-shared/schemas/tools";
36
+ import { registerTools } from "./registry.js";
37
+ import { runGetEntity, runGetEntitySummary, runSearchEntities } from "./query/entity.js";
38
+ import { runQueryRelationships } from "./query/relation.js";
39
+ import { runGetOutline, runGetOutlinePath } from "./query/outline.js";
40
+ import { runComputeState, runGetDeltaHistory } from "./query/delta.js";
41
+ /** 查询类工具定义(S6.3,tools.md「查询类(自动)」8 个;权限全为 AUTO) */
42
+ const queryToolDefs = [
43
+ {
44
+ name: "get_entity",
45
+ description: "实体详情查询:按类型与 id 获取单个实体(含 data 字段完整内容)。" +
46
+ "type 取值 character|setting|location|hook;id 为实体 id(char-/set-/loc-/hook- 前缀)。" +
47
+ "不存在或已软删返回 null。",
48
+ argsSchema: getEntityArgsSchema,
49
+ permission: TOOL_PERMISSION.AUTO,
50
+ run: runGetEntity,
51
+ },
52
+ {
53
+ name: "search_entities",
54
+ description: "实体搜索:按类型 + 名称关键词模糊匹配(可附 filters:status 精确匹配 data.status、" +
55
+ "tags 要求 data.tags 数组包含全部指定标签)。返回匹配实体列表(名称 + 类型 + 关键字段摘要)。",
56
+ argsSchema: searchEntitiesArgsSchema,
57
+ permission: TOOL_PERMISSION.AUTO,
58
+ run: runSearchEntities,
59
+ },
60
+ {
61
+ name: "query_relationships",
62
+ description: "关系图查询:按端点/关系类型过滤(depth 1=紧邻直接关系、2=k跳路径、3=全量遍历)。" +
63
+ "端点可为实体或大纲节点(outline_node);relation_type 取值限定预定义 16 种:" +
64
+ "belongs_to/owns/masters/ally/rival/mentor/family/kills/appears_in/occurs_at/" +
65
+ "plot_edge/plants/advances/resolves/depends_on/involves;端点软删的关系不可见。",
66
+ argsSchema: queryRelationshipsArgsSchema,
67
+ permission: TOOL_PERMISSION.AUTO,
68
+ run: runQueryRelationships,
69
+ },
70
+ {
71
+ name: "get_outline",
72
+ description: "完整大纲树查询(严格三层:卷→章→场景)。默认不含 metadata 统计(省 token);" +
73
+ "软删节点不返回。用于了解作品整体结构。",
74
+ argsSchema: getOutlineArgsSchema,
75
+ permission: TOOL_PERMISSION.AUTO,
76
+ run: runGetOutline,
77
+ },
78
+ {
79
+ name: "get_outline_path",
80
+ description: "大纲节点路径查询:返回从根到指定节点的路径 ID 列表(含 root,如 [root, vol-1, ch-3, sc-15])。" +
81
+ "节点不存在或已软删返回 null。",
82
+ argsSchema: getOutlinePathArgsSchema,
83
+ permission: TOOL_PERMISSION.AUTO,
84
+ run: runGetOutlinePath,
85
+ },
86
+ {
87
+ name: "compute_state",
88
+ description: "状态计算:实体(target_id)到达指定大纲节点(at_node_id)时的累积状态——" +
89
+ "只沿大纲树父链累积已确认 Delta。若存在 update 冲突(from 不匹配)该 change 被跳过," +
90
+ "结果在 conflicts 字段标注 { field, expected, actual },请据此向用户提示修复。",
91
+ argsSchema: computeStateArgsSchema,
92
+ permission: TOOL_PERMISSION.AUTO,
93
+ run: runComputeState,
94
+ },
95
+ {
96
+ name: "get_delta_history",
97
+ description: "Delta 历史查询:目标实体的全部属性变更记录(按时间/节点排序)。" +
98
+ "target_type 为实体类型或 outline_node;软删相关记录自动过滤。",
99
+ argsSchema: getDeltaHistoryArgsSchema,
100
+ permission: TOOL_PERMISSION.AUTO,
101
+ run: runGetDeltaHistory,
102
+ },
103
+ {
104
+ name: "get_entity_summary",
105
+ description: "实体聚合统计:指定类型实体的总数与分布(character→角色/状态/能力分布、hook→状态/兑现时机分布、" +
106
+ "setting→分类分布、location→类型分布)。用于全局概览。",
107
+ argsSchema: getEntitySummaryArgsSchema,
108
+ permission: TOOL_PERMISSION.AUTO,
109
+ run: runGetEntitySummary,
110
+ },
111
+ ];
112
+ registerTools(queryToolDefs);
113
+ import { analyzeConsistencyArgsSchema, detectConflictsArgsSchema, findOrphanElementsArgsSchema, suggestConnectionsArgsSchema, tracePlotPathsArgsSchema, } from "@whispering233/ai-editor-shared/schemas/tools";
114
+ import { runAnalyzeConsistency } from "./analysis/consistency.js";
115
+ import { runDetectConflicts } from "./analysis/conflict.js";
116
+ import { runTracePlotPaths } from "./analysis/path.js";
117
+ import { runFindOrphanElements } from "./analysis/orphan.js";
118
+ import { runSuggestConnections } from "./analysis/suggest.js";
119
+ /** 分析类工具定义(S6.4,tools.md「分析类(自动)」5 个;权限全为 AUTO,长任务执行中检查 signal) */
120
+ const analysisToolDefs = [
121
+ {
122
+ name: "analyze_consistency",
123
+ description: "实体档案一致性检查:检查单个实体 data 内部的矛盾(如性格反义词对并存、负年龄、" +
124
+ "伏笔已兑现但未标注兑现节点、expected_resolve_node_id/parent_id 悬空引用)。" +
125
+ "返回 issues: [{ severity: error|warning, field, description }];实体不存在或已软删返回 null。",
126
+ argsSchema: analyzeConsistencyArgsSchema,
127
+ permission: TOOL_PERMISSION.AUTO,
128
+ run: runAnalyzeConsistency,
129
+ },
130
+ {
131
+ name: "detect_conflicts",
132
+ description: "跨实体设定矛盾检测:扫描关系图发现不一致——对称关系(ally/family)单向缺失、" +
133
+ "同一对实体互斥关系并存(ally+rival)、互相击杀(双向 kills)。" +
134
+ "types 限定实体类型、relation_filter 限定参与检测的关系类型(缺省全量)。" +
135
+ "返回 conflicts: [{ entity_a, entity_b, field, description }]。",
136
+ argsSchema: detectConflictsArgsSchema,
137
+ permission: TOOL_PERMISSION.AUTO,
138
+ run: runDetectConflicts,
139
+ },
140
+ {
141
+ name: "trace_plot_paths",
142
+ description: "剧情路径推演:从 from_node_id 到 to_node_id 推演可能的推进路径——沿大纲树的直接链" +
143
+ "(祖先后裔)与沿 plot_edge 剧情连线的 k 跳路径。每条路径含 nodes/description/risk_factors" +
144
+ "(过长路径、场景缺目标、章节缺反转等风险)。节点不存在或已软删返回 null。",
145
+ argsSchema: tracePlotPathsArgsSchema,
146
+ permission: TOOL_PERMISSION.AUTO,
147
+ run: runTracePlotPaths,
148
+ },
149
+ {
150
+ name: "find_orphan_elements",
151
+ description: "全项目孤立元素诊断(无参):unused_characters(从未出场或最后活跃章早于当前最新章的角色)、" +
152
+ "unresolved_deltas(触发节点缺失/目标端点软删或缺失的永不生效变更)、" +
153
+ "dangling_relations(端点已物理删除的悬空关系)、" +
154
+ "inconsistent_soft_deletes(大纲节点已软删但关联 relation/delta 未级联软删的跨存储不一致,诊断用途)。",
155
+ argsSchema: findOrphanElementsArgsSchema,
156
+ permission: TOOL_PERMISSION.AUTO,
157
+ run: runFindOrphanElements,
158
+ },
159
+ {
160
+ name: "suggest_connections",
161
+ description: "潜在关系发现:为指定实体建议同类型实体的潜在关联——共同出现于同一场景(同场戏)、" +
162
+ "共享关联实体(朋友的朋友)。返回 suggestions: [{ target_id, relation_type: ally, reason }]" +
163
+ "(已有直接关系的候选跳过)。实体不存在或已软删返回 null。",
164
+ argsSchema: suggestConnectionsArgsSchema,
165
+ permission: TOOL_PERMISSION.AUTO,
166
+ run: runSuggestConnections,
167
+ },
168
+ ];
169
+ registerTools(analysisToolDefs);
170
+ import { analyzeHookHealthArgsSchema, detectHookConflictsArgsSchema, findHookOpportunitiesArgsSchema, suggestHookPayoffArgsSchema, traceHookLifecycleArgsSchema, } from "@whispering233/ai-editor-shared/schemas/tools";
171
+ import { runAnalyzeHookHealth, runDetectHookConflicts, runFindHookOpportunities, runSuggestHookPayoff, runTraceHookLifecycle } from "./analysis/hook.js";
172
+ /** 伏笔分析工具定义(S6.5,hooks.md「工具扩展」+ 决策 21;权限全为 AUTO) */
173
+ const hookToolDefs = [
174
+ {
175
+ name: "analyze_hook_health",
176
+ description: "伏笔健康总览(无参):统计全部活跃伏笔(planted/progressing)——stale(休眠超过半衰期)、" +
177
+ "overdue(埋设超过两倍半衰期)、blocked(依赖尚未回收)及人类可读 warnings。" +
178
+ "返回 { current_chapter, active_count, stale, overdue, blocked_chains, warnings };" +
179
+ "半衰期显式 half_life 优先、缺省按 payoff_timing 映射(immediate=3/near_term=8/mid_arc=15/slow_burn=25/endgame=40,决策 21)。",
180
+ argsSchema: analyzeHookHealthArgsSchema,
181
+ permission: TOOL_PERMISSION.AUTO,
182
+ run: runAnalyzeHookHealth,
183
+ },
184
+ {
185
+ name: "trace_hook_lifecycle",
186
+ description: "伏笔生命周期追踪:返回 hook 详情 + 埋设节点(plant,最早埋设)+ 全部推进节点(advances,按章节序)+ " +
187
+ "回收节点(resolve,最新)+ 当前休眠章数(dormancy)+ 时间线图(timeline_graph.events 按章节序合并)。" +
188
+ "hook 不存在或已软删返回 null。",
189
+ argsSchema: traceHookLifecycleArgsSchema,
190
+ permission: TOOL_PERMISSION.AUTO,
191
+ run: runTraceHookLifecycle,
192
+ },
193
+ {
194
+ name: "suggest_hook_payoff",
195
+ description: "伏笔回收建议:基于埋设章节与半衰期(显式优先、缺省按 payoff_timing 映射)推荐理想回收场景" +
196
+ "(节奏匹配 top 3,候选为当前章节之后的未回收场景)。返回 { suggestions: [{ at_node, reason }] };" +
197
+ "hook 不存在/已软删返回 null,无埋设记录或大纲无候选场景返回空建议。",
198
+ argsSchema: suggestHookPayoffArgsSchema,
199
+ permission: TOOL_PERMISSION.AUTO,
200
+ run: runSuggestHookPayoff,
201
+ },
202
+ {
203
+ name: "find_hook_opportunities",
204
+ description: "伏笔埋设机会发现:分析指定大纲节点的叙事特征(尚无伏笔埋设、角色在场数、场景冲突层次、价值转向)" +
205
+ "建议适合的伏笔类别(mystery/relationship/world_building/character_growth)。" +
206
+ "返回 { opportunities: [{ category, reason }] };节点不存在或已软删返回 null。",
207
+ argsSchema: findHookOpportunitiesArgsSchema,
208
+ permission: TOOL_PERMISSION.AUTO,
209
+ run: runFindHookOpportunities,
210
+ },
211
+ {
212
+ name: "detect_hook_conflicts",
213
+ description: "伏笔矛盾检测(无参):依赖循环(A↔B 互相 depends_on)、依赖已废弃(depends_on 指向 abandoned 伏笔)、" +
214
+ "时间悖论(推进/回收节点章节早于埋设节点章节)。返回 { conflicts: [{ hook_a, hook_b, field, description }] }。",
215
+ argsSchema: detectHookConflictsArgsSchema,
216
+ permission: TOOL_PERMISSION.AUTO,
217
+ run: runDetectHookConflicts,
218
+ },
219
+ ];
220
+ registerTools(hookToolDefs);
221
+ import { proposeAbandonHookArgsSchema, proposeAddDeltaArgsSchema, proposeAddRelationArgsSchema, proposeAdvanceHookArgsSchema, proposeCreateEntityArgsSchema, proposeCreateHookArgsSchema, proposeDeleteEntityArgsSchema, proposeDeleteNodeArgsSchema, proposeMoveNodeArgsSchema, proposeOutlineNodeArgsSchema, proposeRemoveRelationArgsSchema, proposeResolveHookArgsSchema, proposeUpdateEntityArgsSchema, proposeUpdateHookArgsSchema, } from "@whispering233/ai-editor-shared/schemas/tools";
222
+ import { runProposeAbandonHook, runProposeAdvanceHook, runProposeCreateHook, runProposeResolveHook, runProposeUpdateHook, } from "./proposal/hook.js";
223
+ import { runProposeCreateEntity, runProposeDeleteEntity, runProposeUpdateEntity, } from "./proposal/entity.js";
224
+ import { runProposeAddRelation, runProposeRemoveRelation, } from "./proposal/relation.js";
225
+ import { runProposeAddDelta } from "./proposal/delta.js";
226
+ import { runProposeDeleteNode, runProposeMoveNode, runProposeOutlineNode, } from "./proposal/outline.js";
227
+ /** 提案类工具定义(S6.6,tools.md「提案类」+ hooks.md「工具扩展」提案类,共 14 个;权限全为 PROPOSAL)
228
+ * 语义:AI 不能直接修改数据——propose_* 仅产出提案(tool_result 只有 proposal_id + 一句话摘要,
229
+ * 不含预览细节,2026-08 修订;完整预览经 SSE proposal 事件推送 GUI);用户确认后由 S7.5 路由
230
+ * 快照重校验并调用 S6.7 执行工具落库。 */
231
+ const proposalToolDefs = [
232
+ {
233
+ name: "propose_create_entity",
234
+ description: "创建实体提案:向用户提议新建实体。type 取值 character|setting|location|hook,name 必填," +
235
+ "data 可选(自定义字段,如角色 role/status、伏笔 payoff_timing)。" +
236
+ "仅生成提案(返回 proposal_id + 一句话摘要),需用户在界面确认后才生效——请勿重复提案或视为已创建。",
237
+ argsSchema: proposeCreateEntityArgsSchema,
238
+ permission: TOOL_PERMISSION.PROPOSAL,
239
+ run: runProposeCreateEntity,
240
+ },
241
+ {
242
+ name: "propose_update_entity",
243
+ description: "更新实体提案:entity_id 指定实体,patches 为要修改的 data 字段(至少一项,浅合并——未传字段保留)。" +
244
+ "仅生成提案,需用户确认后生效;确认时服务端校验实体未被他人改动(updated_at 快照比对)," +
245
+ "实体不存在或已软删返回错误。",
246
+ argsSchema: proposeUpdateEntityArgsSchema,
247
+ permission: TOOL_PERMISSION.PROPOSAL,
248
+ run: runProposeUpdateEntity,
249
+ },
250
+ {
251
+ name: "propose_delete_entity",
252
+ description: "删除实体提案:软删指定实体及其关联关系与 Delta(可回收站还原,非物理清除)。" +
253
+ "仅生成提案,需用户确认后生效;实体不存在或已软删返回错误。",
254
+ argsSchema: proposeDeleteEntityArgsSchema,
255
+ permission: TOOL_PERMISSION.PROPOSAL,
256
+ run: runProposeDeleteEntity,
257
+ },
258
+ {
259
+ name: "propose_add_relation",
260
+ description: "新增关系提案:source/target 为端点 id(实体 id 如 char-xxx,或大纲节点 id 如 ch-xxx," +
261
+ "类型自动识别),type 为预定义关系类型(belongs_to/owns/masters/ally/rival/mentor/family/" +
262
+ "kills/appears_in/occurs_at/plot_edge/plants/advances/resolves/depends_on/involves)," +
263
+ "metadata 可选。仅生成提案,需用户确认后生效;端点不存在或已软删返回错误。",
264
+ argsSchema: proposeAddRelationArgsSchema,
265
+ permission: TOOL_PERMISSION.PROPOSAL,
266
+ run: runProposeAddRelation,
267
+ },
268
+ {
269
+ name: "propose_remove_relation",
270
+ description: "移除关系提案:relation_id 指定要移除的关系(确认后物理删除,不进回收站)。" +
271
+ "仅生成提案,需用户确认后生效;关系不存在或端点已软删返回错误。",
272
+ argsSchema: proposeRemoveRelationArgsSchema,
273
+ permission: TOOL_PERMISSION.PROPOSAL,
274
+ run: runProposeRemoveRelation,
275
+ },
276
+ {
277
+ name: "propose_add_delta",
278
+ description: "追加属性变更提案:node_id 为触发变更的大纲节点,target 为变更目标(实体 id 或大纲节点 id," +
279
+ "类型自动识别),changes 为变更列表(op 取值 set/update/add/remove,至少一项;" +
280
+ "update 需 from 旧值,add/remove 用 value)。仅生成提案,需用户确认后生效;" +
281
+ "触发节点或目标不存在/已软删返回错误。",
282
+ argsSchema: proposeAddDeltaArgsSchema,
283
+ permission: TOOL_PERMISSION.PROPOSAL,
284
+ run: runProposeAddDelta,
285
+ },
286
+ {
287
+ name: "propose_outline_node",
288
+ description: "新增大纲节点提案:type 取值 volume|chapter|scene(严格三层:卷挂根、章挂卷或根、" +
289
+ "场景必须挂章),title 必填,parent_id 指定父节点(缺省挂根)。" +
290
+ "仅生成提案,需用户确认后生效;父节点不存在/已软删或层级非法返回错误。",
291
+ argsSchema: proposeOutlineNodeArgsSchema,
292
+ permission: TOOL_PERMISSION.PROPOSAL,
293
+ run: runProposeOutlineNode,
294
+ },
295
+ {
296
+ name: "propose_move_node",
297
+ description: "移动大纲节点提案:node_id 移到 parent_id 下的 order 位置(0 起计数)。" +
298
+ "仅生成提案,需用户确认后生效;目标父层级非法(严格三层,决策 19)、" +
299
+ "节点或父不存在/已软删返回错误。",
300
+ argsSchema: proposeMoveNodeArgsSchema,
301
+ permission: TOOL_PERMISSION.PROPOSAL,
302
+ run: runProposeMoveNode,
303
+ },
304
+ {
305
+ name: "propose_delete_node",
306
+ description: "删除大纲节点提案:软删指定节点及其整棵子树(可回收站还原,非物理清除)。" +
307
+ "仅生成提案,需用户确认后生效;节点不存在或已软删返回错误。",
308
+ argsSchema: proposeDeleteNodeArgsSchema,
309
+ permission: TOOL_PERMISSION.PROPOSAL,
310
+ run: runProposeDeleteNode,
311
+ },
312
+ {
313
+ name: "propose_create_hook",
314
+ description: "创建伏笔提案:name 必填,data 可选(伏笔字段:payoff_timing、half_life、expected_resolve_node_id、category 等)," +
315
+ "plant_at_node_id 可选指定埋设节点(确认后建立 plants 关系)。" +
316
+ "仅生成提案,需用户确认后生效;埋设节点不存在/已软删返回错误。",
317
+ argsSchema: proposeCreateHookArgsSchema,
318
+ permission: TOOL_PERMISSION.PROPOSAL,
319
+ run: runProposeCreateHook,
320
+ },
321
+ {
322
+ name: "propose_update_hook",
323
+ description: "更新伏笔提案:hook_id 指定伏笔,patches 为要修改的 data 字段(至少一项,浅合并——未传字段保留)。" +
324
+ "仅生成提案,需用户确认后生效;确认时服务端校验伏笔未被改动(updated_at 快照比对)," +
325
+ "伏笔不存在或已软删返回错误。",
326
+ argsSchema: proposeUpdateHookArgsSchema,
327
+ permission: TOOL_PERMISSION.PROPOSAL,
328
+ run: runProposeUpdateHook,
329
+ },
330
+ {
331
+ name: "propose_advance_hook",
332
+ description: "推进伏笔提案:hook_id 指定伏笔,node_id 为推进发生的节点,description 描述推进内容。" +
333
+ "确认后复合写一次提交(Delta 记 status=progressing + advances 关系,幂等)。" +
334
+ "仅生成提案,需用户确认后生效;伏笔或节点不存在/已软删返回错误。",
335
+ argsSchema: proposeAdvanceHookArgsSchema,
336
+ permission: TOOL_PERMISSION.PROPOSAL,
337
+ run: runProposeAdvanceHook,
338
+ },
339
+ {
340
+ name: "propose_resolve_hook",
341
+ description: "回收伏笔提案:hook_id 指定伏笔,node_id 为回收节点,description 描述回收内容。" +
342
+ "确认后复合写一次提交(Delta 记 status=resolved + resolves 关系,幂等)。" +
343
+ "仅生成提案,需用户确认后生效;伏笔或节点不存在/已软删返回错误。",
344
+ argsSchema: proposeResolveHookArgsSchema,
345
+ permission: TOOL_PERMISSION.PROPOSAL,
346
+ run: runProposeResolveHook,
347
+ },
348
+ {
349
+ name: "propose_abandon_hook",
350
+ description: "废弃伏笔提案:hook_id 指定伏笔,description 说明废弃原因。" +
351
+ "确认后复合写一次提交(Delta 记 status=abandoned)。" +
352
+ "仅生成提案,需用户确认后生效;伏笔不存在或已软删返回错误。",
353
+ argsSchema: proposeAbandonHookArgsSchema,
354
+ permission: TOOL_PERMISSION.PROPOSAL,
355
+ run: runProposeAbandonHook,
356
+ },
357
+ ];
358
+ registerTools(proposalToolDefs);
359
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ProposeAddDeltaArgs } from "@whispering233/ai-editor-shared";
2
+ import type { ToolContext } from "../context.js";
3
+ import { type Proposal, type ToolProposalResult } from "./types.js";
4
+ /** 产出追加 Delta 提案 */
5
+ export declare function buildProposeAddDelta(ctx: ToolContext, args: ProposeAddDeltaArgs): Proposal;
6
+ /** propose_add_delta run */
7
+ export declare function runProposeAddDelta(ctx: ToolContext, args: ProposeAddDeltaArgs, signal?: AbortSignal): ToolProposalResult;
8
+ //# sourceMappingURL=delta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta.d.ts","sourceRoot":"","sources":["../../src/proposal/delta.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,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,CAU1F;AAED,4BAA4B;AAC5B,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,mBAAmB,EACzB,MAAM,CAAC,EAAE,WAAW,GACnB,kBAAkB,CAIpB"}
@@ -0,0 +1,29 @@
1
+ // 提案类工具:Delta(S6.6,tools.md「提案类」1 个)
2
+ // propose_add_delta
3
+ //
4
+ // 语义:只产出提案对象并返回 { proposal_id, summary }(2026-08 修订:tool_result 不含预览);
5
+ // **不落盘、不写任何数据**(与 S6.7 add_delta 对比的核心差异)。
6
+ //
7
+ // 生成时校验(决策 14/19):
8
+ // - 触发节点(node_id)存在且未软删(requireOutlineNode,决策 12)——节点级 updated_at 快照
9
+ // - 变更目标(target)存在且未软删(resolveEndpoint:实体或大纲节点)——端点 updated_at 快照
10
+ // **target 可为大纲节点**:S13.3 收紧的是 UI 创建入口(仅实体);AI 提案通道保持大纲
11
+ // target 是 tools.md「提案类」/get_delta_history(target_type 含 outline_node)的既有契约
12
+ // 能力,本卡维持,非回归
13
+ // - changes 由 schema 校验(复用 deltaChangeSchema,至少一项)
14
+ // args 规范化为执行形态 { node_id, target_type, target_id, changes }(S6.7 add_delta 直接消费);
15
+ // delta_records.description(NOT NULL)在确认后由 S6.7 执行器取 proposal.summary 作为人类可读描述。
16
+ import { buildProposal, checkProposalAborted, refOutlineNode, requireOutlineNode, resolveEndpoint } from "./types.js";
17
+ /** 产出追加 Delta 提案 */
18
+ export function buildProposeAddDelta(ctx, args) {
19
+ const node = requireOutlineNode(ctx, args.node_id);
20
+ const target = resolveEndpoint(ctx, args.target);
21
+ 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})`);
22
+ }
23
+ /** propose_add_delta run */
24
+ export function runProposeAddDelta(ctx, args, signal) {
25
+ checkProposalAborted(signal);
26
+ const proposal = buildProposeAddDelta(ctx, args);
27
+ return { proposal_id: proposal.proposal_id, summary: proposal.summary };
28
+ }
29
+ //# sourceMappingURL=delta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta.js","sourceRoot":"","sources":["../../src/proposal/delta.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,oBAAoB;AACpB,EAAE;AACF,uEAAuE;AACvE,4CAA4C;AAC5C,EAAE;AACF,mBAAmB;AACnB,qEAAqE;AACrE,kEAAkE;AAClE,0DAA0D;AAC1D,8EAA8E;AAC9E,gBAAgB;AAChB,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;IACjD,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"}
@@ -0,0 +1,16 @@
1
+ import type { ProposeCreateEntityArgs, ProposeDeleteEntityArgs, ProposeUpdateEntityArgs } from "@whispering233/ai-editor-shared";
2
+ import type { ToolContext } from "../context.js";
3
+ import { type Proposal, type ToolProposalResult } from "./types.js";
4
+ /** 产出创建实体提案(无引用对象——新实体 id 由 S6.7 执行时生成) */
5
+ export declare function buildProposeCreateEntity(ctx: ToolContext, args: ProposeCreateEntityArgs): Proposal;
6
+ /** propose_create_entity run:中止检查 + 产出裁剪结果 */
7
+ export declare function runProposeCreateEntity(ctx: ToolContext, args: ProposeCreateEntityArgs, signal?: AbortSignal): ToolProposalResult;
8
+ /** 产出更新实体提案(引用实体存在 + updated_at 快照,决策 14) */
9
+ export declare function buildProposeUpdateEntity(ctx: ToolContext, args: ProposeUpdateEntityArgs): Proposal;
10
+ /** propose_update_entity run */
11
+ export declare function runProposeUpdateEntity(ctx: ToolContext, args: ProposeUpdateEntityArgs, signal?: AbortSignal): ToolProposalResult;
12
+ /** 产出删除实体提案(软删 + 级联关系与 Delta,可回收站还原,决策 12) */
13
+ export declare function buildProposeDeleteEntity(ctx: ToolContext, args: ProposeDeleteEntityArgs): Proposal;
14
+ /** propose_delete_entity run */
15
+ export declare function runProposeDeleteEntity(ctx: ToolContext, args: ProposeDeleteEntityArgs, signal?: AbortSignal): ToolProposalResult;
16
+ //# sourceMappingURL=entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/proposal/entity.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AACjI,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAkD,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEpH,2CAA2C;AAC3C,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,uBAAuB,GAAG,QAAQ,CASlG;AAED,8CAA8C;AAC9C,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,uBAAuB,EAC7B,MAAM,CAAC,EAAE,WAAW,GACnB,kBAAkB,CAIpB;AAED,6CAA6C;AAC7C,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,uBAAuB,GAAG,QAAQ,CAalG;AAED,gCAAgC;AAChC,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,uBAAuB,EAC7B,MAAM,CAAC,EAAE,WAAW,GACnB,kBAAkB,CAIpB;AAED,8CAA8C;AAC9C,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,uBAAuB,GAAG,QAAQ,CAYlG;AAED,gCAAgC;AAChC,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,uBAAuB,EAC7B,MAAM,CAAC,EAAE,WAAW,GACnB,kBAAkB,CAIpB"}
@@ -0,0 +1,54 @@
1
+ // 提案类工具:实体(S6.6,tools.md「提案类」3 个)
2
+ // propose_create_entity / propose_update_entity / propose_delete_entity
3
+ //
4
+ // 语义:AI 不能直接修改数据——build 函数只**产出提案对象**(buildProposal,prop_ 运行时 id),
5
+ // run 返回 { proposal_id, summary }(tools.md 2026-08 修订:tool_result 不含预览细节,
6
+ // 防 LLM 误以为提案已生效而重复提案);**不落盘、不写任何数据**(与 S6.7 执行工具的核心差异——
7
+ // 本模块零写操作)。
8
+ // 生成时校验(决策 14/19):引用实体存在且未软删(getEntity 已过滤软删,决策 12),
9
+ // 采集实体自身 updated_at 快照供确认时比对。
10
+ //
11
+ // 参数契约:packages/shared/src/types/tool.ts propose*ArgsSchema(snake_case 与 tools.md 对齐)
12
+ import { getEntity } from "@whispering233/ai-editor-db";
13
+ import { buildProposal, checkProposalAborted, refEntity } from "./types.js";
14
+ /** 产出创建实体提案(无引用对象——新实体 id 由 S6.7 执行时生成) */
15
+ export function buildProposeCreateEntity(ctx, args) {
16
+ // 引用为空:不依赖任何现存对象(type/name/data 已由 schema 校验)
17
+ return buildProposal(ctx, "propose_create_entity", { type: args.type, name: args.name, ...(args.data === undefined ? {} : { data: args.data }) }, [], `创建实体「${args.name}」(${args.type})`);
18
+ }
19
+ /** propose_create_entity run:中止检查 + 产出裁剪结果 */
20
+ export function runProposeCreateEntity(ctx, args, signal) {
21
+ checkProposalAborted(signal);
22
+ const proposal = buildProposeCreateEntity(ctx, args);
23
+ return { proposal_id: proposal.proposal_id, summary: proposal.summary };
24
+ }
25
+ /** 产出更新实体提案(引用实体存在 + updated_at 快照,决策 14) */
26
+ export function buildProposeUpdateEntity(ctx, args) {
27
+ const entity = getEntity(ctx.db, args.entity_id);
28
+ if (entity === null) {
29
+ throw new Error(`实体不存在或已软删: ${args.entity_id}`);
30
+ }
31
+ const fieldCount = Object.keys(args.patches).length;
32
+ return buildProposal(ctx, "propose_update_entity", { entity_id: args.entity_id, patches: args.patches }, [refEntity(entity)], `更新实体「${entity.name}」的 ${fieldCount} 个字段`);
33
+ }
34
+ /** propose_update_entity run */
35
+ export function runProposeUpdateEntity(ctx, args, signal) {
36
+ checkProposalAborted(signal);
37
+ const proposal = buildProposeUpdateEntity(ctx, args);
38
+ return { proposal_id: proposal.proposal_id, summary: proposal.summary };
39
+ }
40
+ /** 产出删除实体提案(软删 + 级联关系与 Delta,可回收站还原,决策 12) */
41
+ export function buildProposeDeleteEntity(ctx, args) {
42
+ const entity = getEntity(ctx.db, args.entity_id);
43
+ if (entity === null) {
44
+ throw new Error(`实体不存在或已软删: ${args.entity_id}`);
45
+ }
46
+ return buildProposal(ctx, "propose_delete_entity", { entity_id: args.entity_id }, [refEntity(entity)], `删除实体「${entity.name}」(${entity.type},软删可还原)`);
47
+ }
48
+ /** propose_delete_entity run */
49
+ export function runProposeDeleteEntity(ctx, args, signal) {
50
+ checkProposalAborted(signal);
51
+ const proposal = buildProposeDeleteEntity(ctx, args);
52
+ return { proposal_id: proposal.proposal_id, summary: proposal.summary };
53
+ }
54
+ //# sourceMappingURL=entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.js","sourceRoot":"","sources":["../../src/proposal/entity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ProposeAbandonHookArgs, ProposeAdvanceHookArgs, ProposeCreateHookArgs, ProposeResolveHookArgs, ProposeUpdateHookArgs } from "@whispering233/ai-editor-shared";
2
+ import type { ToolContext } from "../context.js";
3
+ import { type Proposal, type ToolProposalResult } from "./types.js";
4
+ /** 产出创建伏笔提案(plant_at_node_id 可选指定埋设节点) */
5
+ export declare function buildProposeCreateHook(ctx: ToolContext, args: ProposeCreateHookArgs): Proposal;
6
+ /** propose_create_hook run */
7
+ export declare function runProposeCreateHook(ctx: ToolContext, args: ProposeCreateHookArgs, signal?: AbortSignal): ToolProposalResult;
8
+ /** 产出更新伏笔提案(引用伏笔实体 updated_at 快照,决策 14) */
9
+ export declare function buildProposeUpdateHook(ctx: ToolContext, args: ProposeUpdateHookArgs): Proposal;
10
+ /** propose_update_hook run */
11
+ export declare function runProposeUpdateHook(ctx: ToolContext, args: ProposeUpdateHookArgs, signal?: AbortSignal): ToolProposalResult;
12
+ /** 产出推进伏笔提案(确认后复合写:delta 记 status=progressing + advances 关系) */
13
+ export declare function buildProposeAdvanceHook(ctx: ToolContext, args: ProposeAdvanceHookArgs): Proposal;
14
+ /** propose_advance_hook run */
15
+ export declare function runProposeAdvanceHook(ctx: ToolContext, args: ProposeAdvanceHookArgs, signal?: AbortSignal): ToolProposalResult;
16
+ /** 产出回收伏笔提案(确认后复合写:delta 记 status=resolved + resolves 关系) */
17
+ export declare function buildProposeResolveHook(ctx: ToolContext, args: ProposeResolveHookArgs): Proposal;
18
+ /** propose_resolve_hook run */
19
+ export declare function runProposeResolveHook(ctx: ToolContext, args: ProposeResolveHookArgs, signal?: AbortSignal): ToolProposalResult;
20
+ /** 产出废弃伏笔提案(确认后复合写:delta 记 status=abandoned) */
21
+ export declare function buildProposeAbandonHook(ctx: ToolContext, args: ProposeAbandonHookArgs): Proposal;
22
+ /** propose_abandon_hook run */
23
+ export declare function runProposeAbandonHook(ctx: ToolContext, args: ProposeAbandonHookArgs, signal?: AbortSignal): ToolProposalResult;
24
+ //# sourceMappingURL=hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/proposal/hook.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAmG,KAAK,QAAQ,EAA0B,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE7L,0CAA0C;AAC1C,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,qBAAqB,GAAG,QAAQ,CAgB9F;AAED,8BAA8B;AAC9B,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,qBAAqB,EAC3B,MAAM,CAAC,EAAE,WAAW,GACnB,kBAAkB,CAIpB;AAED,2CAA2C;AAC3C,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,qBAAqB,GAAG,QAAQ,CAU9F;AAED,8BAA8B;AAC9B,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,qBAAqB,EAC3B,MAAM,CAAC,EAAE,WAAW,GACnB,kBAAkB,CAIpB;AAED,gEAAgE;AAChE,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,sBAAsB,GAAG,QAAQ,CAUhG;AAED,+BAA+B;AAC/B,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,sBAAsB,EAC5B,MAAM,CAAC,EAAE,WAAW,GACnB,kBAAkB,CAIpB;AAED,6DAA6D;AAC7D,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,sBAAsB,GAAG,QAAQ,CAUhG;AAED,+BAA+B;AAC/B,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,sBAAsB,EAC5B,MAAM,CAAC,EAAE,WAAW,GACnB,kBAAkB,CAIpB;AAED,gDAAgD;AAChD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,sBAAsB,GAAG,QAAQ,CAShG;AAED,+BAA+B;AAC/B,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,sBAAsB,EAC5B,MAAM,CAAC,EAAE,WAAW,GACnB,kBAAkB,CAIpB"}
@@ -0,0 +1,81 @@
1
+ // 提案类工具:伏笔(S6.6,hooks.md「工具扩展」提案类 5 个)
2
+ // propose_create_hook / propose_update_hook / propose_advance_hook /
3
+ // propose_resolve_hook / propose_abandon_hook
4
+ //
5
+ // 语义:只产出提案对象并返回 { proposal_id, summary }(2026-08 修订:tool_result 不含预览);
6
+ // **不落盘、不写任何数据**(与 S6.7 advance_hook/resolve_hook/abandon_hook 复合写对比的核心差异)。
7
+ //
8
+ // 生成时校验(决策 14/19/12):
9
+ // - 伏笔即 type=hook 的实体(hooks.md:用户手动创建或 AI 提案创建)——requireHook 校验
10
+ // 存在、未软删且类型一致,采集实体自身 updated_at 快照(决策 14)
11
+ // - 推进/回收的节点(node_id)与埋设节点(plant_at_node_id)存在且未软删——
12
+ // 节点级 updated_at 快照(决策 19)
13
+ // - 确认后的复合写(delta_records 记 status + relation_records 插 advances/resolves,
14
+ // 一次提交、幂等)由 S6.7 执行工具承担,本模块只产出提案
15
+ import { buildProposal, checkProposalAborted, refEntity, refOutlineNode, requireHook, requireOutlineNode } from "./types.js";
16
+ /** 产出创建伏笔提案(plant_at_node_id 可选指定埋设节点) */
17
+ export function buildProposeCreateHook(ctx, args) {
18
+ const references = [];
19
+ if (args.plant_at_node_id !== undefined) {
20
+ references.push(refOutlineNode(requireOutlineNode(ctx, args.plant_at_node_id)));
21
+ }
22
+ return buildProposal(ctx, "propose_create_hook", {
23
+ name: args.name,
24
+ ...(args.data === undefined ? {} : { data: args.data }),
25
+ ...(args.plant_at_node_id === undefined ? {} : { plant_at_node_id: args.plant_at_node_id }),
26
+ }, references, `创建伏笔「${args.name}」`);
27
+ }
28
+ /** propose_create_hook run */
29
+ export function runProposeCreateHook(ctx, args, signal) {
30
+ checkProposalAborted(signal);
31
+ const proposal = buildProposeCreateHook(ctx, args);
32
+ return { proposal_id: proposal.proposal_id, summary: proposal.summary };
33
+ }
34
+ /** 产出更新伏笔提案(引用伏笔实体 updated_at 快照,决策 14) */
35
+ export function buildProposeUpdateHook(ctx, args) {
36
+ const hook = requireHook(ctx, args.hook_id);
37
+ const fieldCount = Object.keys(args.patches).length;
38
+ return buildProposal(ctx, "propose_update_hook", { hook_id: args.hook_id, patches: args.patches }, [refEntity(hook)], `更新伏笔「${hook.name}」的 ${fieldCount} 个字段`);
39
+ }
40
+ /** propose_update_hook run */
41
+ export function runProposeUpdateHook(ctx, args, signal) {
42
+ checkProposalAborted(signal);
43
+ const proposal = buildProposeUpdateHook(ctx, args);
44
+ return { proposal_id: proposal.proposal_id, summary: proposal.summary };
45
+ }
46
+ /** 产出推进伏笔提案(确认后复合写:delta 记 status=progressing + advances 关系) */
47
+ export function buildProposeAdvanceHook(ctx, args) {
48
+ const hook = requireHook(ctx, args.hook_id);
49
+ const node = requireOutlineNode(ctx, args.node_id);
50
+ return buildProposal(ctx, "propose_advance_hook", { hook_id: args.hook_id, node_id: args.node_id, description: args.description }, [refEntity(hook), refOutlineNode(node)], `推进伏笔「${hook.name}」到节点 ${args.node_id}`);
51
+ }
52
+ /** propose_advance_hook run */
53
+ export function runProposeAdvanceHook(ctx, args, signal) {
54
+ checkProposalAborted(signal);
55
+ const proposal = buildProposeAdvanceHook(ctx, args);
56
+ return { proposal_id: proposal.proposal_id, summary: proposal.summary };
57
+ }
58
+ /** 产出回收伏笔提案(确认后复合写:delta 记 status=resolved + resolves 关系) */
59
+ export function buildProposeResolveHook(ctx, args) {
60
+ const hook = requireHook(ctx, args.hook_id);
61
+ const node = requireOutlineNode(ctx, args.node_id);
62
+ return buildProposal(ctx, "propose_resolve_hook", { hook_id: args.hook_id, node_id: args.node_id, description: args.description }, [refEntity(hook), refOutlineNode(node)], `回收伏笔「${hook.name}」于节点 ${args.node_id}`);
63
+ }
64
+ /** propose_resolve_hook run */
65
+ export function runProposeResolveHook(ctx, args, signal) {
66
+ checkProposalAborted(signal);
67
+ const proposal = buildProposeResolveHook(ctx, args);
68
+ return { proposal_id: proposal.proposal_id, summary: proposal.summary };
69
+ }
70
+ /** 产出废弃伏笔提案(确认后复合写:delta 记 status=abandoned) */
71
+ export function buildProposeAbandonHook(ctx, args) {
72
+ const hook = requireHook(ctx, args.hook_id);
73
+ return buildProposal(ctx, "propose_abandon_hook", { hook_id: args.hook_id, description: args.description }, [refEntity(hook)], `废弃伏笔「${hook.name}」`);
74
+ }
75
+ /** propose_abandon_hook run */
76
+ export function runProposeAbandonHook(ctx, args, signal) {
77
+ checkProposalAborted(signal);
78
+ const proposal = buildProposeAbandonHook(ctx, args);
79
+ return { proposal_id: proposal.proposal_id, summary: proposal.summary };
80
+ }
81
+ //# sourceMappingURL=hook.js.map