@thread-memory/core 0.1.1 → 1.0.0

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 (69) hide show
  1. package/dist/assets.d.ts +14 -0
  2. package/dist/assets.js +104 -0
  3. package/dist/assets.js.map +1 -0
  4. package/dist/assets.test.d.ts +1 -0
  5. package/dist/assets.test.js +88 -0
  6. package/dist/assets.test.js.map +1 -0
  7. package/dist/behavior-contract.d.ts +2 -0
  8. package/dist/behavior-contract.js +9 -0
  9. package/dist/behavior-contract.js.map +1 -0
  10. package/dist/closing.d.ts +11 -0
  11. package/dist/closing.js +37 -0
  12. package/dist/closing.js.map +1 -0
  13. package/dist/delta.d.ts +24 -0
  14. package/dist/delta.js +55 -0
  15. package/dist/delta.js.map +1 -0
  16. package/dist/index.d.ts +6 -0
  17. package/dist/index.js +6 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/isolation.test.js +3 -5
  20. package/dist/isolation.test.js.map +1 -1
  21. package/dist/light-confirm.d.ts +3 -21
  22. package/dist/light-confirm.js +80 -97
  23. package/dist/light-confirm.js.map +1 -1
  24. package/dist/light-confirm.test.js +185 -103
  25. package/dist/light-confirm.test.js.map +1 -1
  26. package/dist/lineage.test.js +10 -12
  27. package/dist/lineage.test.js.map +1 -1
  28. package/dist/nav.d.ts +26 -0
  29. package/dist/nav.js +139 -0
  30. package/dist/nav.js.map +1 -0
  31. package/dist/nav.test.d.ts +1 -0
  32. package/dist/nav.test.js +100 -0
  33. package/dist/nav.test.js.map +1 -0
  34. package/dist/query-tool.d.ts +20 -0
  35. package/dist/query-tool.js +61 -0
  36. package/dist/query-tool.js.map +1 -0
  37. package/dist/query.test.js +8 -5
  38. package/dist/query.test.js.map +1 -1
  39. package/dist/schema.d.ts +3 -1
  40. package/dist/schema.js +104 -1
  41. package/dist/schema.js.map +1 -1
  42. package/dist/schema.test.js +90 -3
  43. package/dist/schema.test.js.map +1 -1
  44. package/dist/sediment.test.d.ts +1 -0
  45. package/dist/sediment.test.js +89 -0
  46. package/dist/sediment.test.js.map +1 -0
  47. package/dist/segment.d.ts +3 -0
  48. package/dist/segment.js +84 -0
  49. package/dist/segment.js.map +1 -0
  50. package/dist/segment.test.d.ts +1 -0
  51. package/dist/segment.test.js +37 -0
  52. package/dist/segment.test.js.map +1 -0
  53. package/dist/state-delta.test.d.ts +1 -0
  54. package/dist/state-delta.test.js +90 -0
  55. package/dist/state-delta.test.js.map +1 -0
  56. package/dist/status-card.d.ts +7 -0
  57. package/dist/status-card.js +108 -3
  58. package/dist/status-card.js.map +1 -1
  59. package/dist/status-card.test.js +76 -3
  60. package/dist/status-card.test.js.map +1 -1
  61. package/dist/store.d.ts +121 -11
  62. package/dist/store.js +425 -61
  63. package/dist/store.js.map +1 -1
  64. package/dist/store.test.js +120 -10
  65. package/dist/store.test.js.map +1 -1
  66. package/dist/v7.test.d.ts +1 -0
  67. package/dist/v7.test.js +106 -0
  68. package/dist/v7.test.js.map +1 -0
  69. package/package.json +2 -1
@@ -1,77 +1,81 @@
1
- const ACCEPT_SHORT = new Set([
2
- "嗯",
3
- "恩",
4
- "好",
5
- "好的",
6
- "可以",
7
- "行",
8
- "没问题",
9
- "ok",
10
- "okay",
11
- "确认",
12
- "同意",
13
- "就这样",
14
- "不错",
15
- "对",
16
- "是",
17
- "收到",
18
- "明白",
19
- ]);
20
- const ACCEPT_RE = /^(嗯+|好+|行+|可以|没问题|OK|ok|Okay|收到|明白|确认|同意)$/;
21
- const SUPERSEDE_RE = /(?:改成|改用|换成|改为|换用)[::,,\s]*([^。!!??]+)/;
22
- const REVOKE_RE = /(?:算了|撤销|放弃|不要(?:用|做|要)?了|不要用|别(?:用|做|要)|不用了|回退|改回|别用了)/;
23
- const DECLARE_RE = [
24
- /(?<![忘标登])(?:我|我们)?(?:已|已经)?记下(?:了)?[::,,\s]*([^。!!??]+)/,
25
- /(?:方案定为|就采用|决定采用)[::,,\s]*([^。!!??]+)/,
26
- /(?:我|我们)(?:已|已经)?(?:决定(?!性)|确定(?!性))[::,,\s]*([^。!!??]+)/,
27
- ];
1
+ // 2026-08-21 结构通道化(用户定案):决策/偏好/确认/撤销/取代的自然语言判定全部停用——
2
+ // 用户侧无锚定正则对粘贴文本零防御(生产实证:9 条候选 5 条碎片误报 + 目标 #1 为多行粘贴转写)。
3
+ // 决策/偏好只走显式通道:命令(/thread-decision、/thread-feedback)与模型工具(record_decision)。
4
+ // 事件流水无损保留 = 未显式记录的决策仍可经 query_session_memory 回拉(下限不丢)。
5
+ // 系统提醒/指令注入噪声(机制 1 附带):system-reminder / AGENTS.md 变更等不是用户任务,跳过
6
+ const SYSTEM_NOISE_RE = /^<system-reminder>|^Updated instructions from|^Instructions from|AGENTS\.md/;
28
7
  const GOAL_RE = /^(?:帮我|请|再帮我|然后帮我|接着帮我|帮我再|还要帮我|麻烦帮我)?(?:实现|修复|重构|添加|新增|完成|构建|创建|删除|优化|升级|接入|验证|设计|规划|开发|搭建|编写|整理|部署|迁移|拆分|合并|安装|配置|生成)/;
29
- const PREFERENCE_RE = /(?:以后|下次|永远|总是|记得|优先|别再|不要再)/;
30
- const CORRECTION_RE = /(?:不要|别|别再|不要再)/;
31
- const MAX_DECISION_TEXT = 200;
32
- const MAX_GOAL_TEXT = 500;
33
- export function analyzeTurn(input) {
34
- const analysis = { goals: [], decisions: [], feedback: [] };
35
- const userRaw = (input.user_msg ?? "").trim();
36
- const user = stripPunct(userRaw);
37
- const assistantRaw = (input.assistant_msg ?? "").trim();
38
- const assistant = stripPunct(assistantRaw);
39
- if (user) {
40
- if (GOAL_RE.test(user)) {
41
- analysis.goals.push({ text: userRaw.slice(0, MAX_GOAL_TEXT), action: "add" });
42
- }
43
- const isPreference = PREFERENCE_RE.test(user);
44
- if (isPreference) {
45
- analysis.feedback.push({
46
- text: userRaw.slice(0, MAX_GOAL_TEXT),
47
- kind: CORRECTION_RE.test(user) ? "correction" : "preference",
48
- });
49
- }
50
- const supersede = userRaw.match(SUPERSEDE_RE);
51
- if (supersede) {
52
- analysis.decisions.push({ action: "supersede", text: supersede[1].trim().slice(0, MAX_DECISION_TEXT) });
53
- }
54
- else if (!isPreference) {
55
- if (REVOKE_RE.test(user)) {
56
- analysis.decisions.push({ action: "revoke" });
57
- }
58
- else if (ACCEPT_SHORT.has(user) || ACCEPT_RE.test(user)) {
59
- analysis.decisions.push({ action: "confirm" });
8
+ // 目标粘贴守卫(2026-08-21 用户场景:别处用自然语言描述 → 模型输出 md 提示词 → 用户粘贴过来):
9
+ // 粘贴物与用户自然语言任务的稳定区别 = 多行 / 长文。生产实证:真实目标 = 单行 ≤ ~105 字符;
10
+ // 误报目标 #1 = 多行粘贴转写 500+ 字符。守卫:含换行不判定;>200 字符不判定
11
+ // (单行短提示 ≤200 且以祈使动词开头 = 语义上就是任务描述,保留无害)。
12
+ const MAX_GOAL_TEXT = 200;
13
+ // 目标完成检测(2026-08-20 收口,零 LLM 高精度规则):用户消息含完成标记 + 否定/疑问守卫 +
14
+ // 与某 active 目标文本的 ≥4 连续字符重叠 → 判定完成。命中率问题的确定性解法 = 只认"明确说完成且点中目标"。
15
+ const COMPLETION_RE = /(?:完成|搞定|做完|结束|交付)(?:了|啦|咯)?/;
16
+ const COMPLETION_NEGATION_RE = /(?:还没|尚未|没|未)\s*(?:完成|搞定|做完)/;
17
+ export function detectGoalCompletion(userMsg, goals) {
18
+ const text = normalizeCompletionText(userMsg);
19
+ // 短消息守卫(2026-08-21 狗粮假阳性实锤):完成宣告是短句;长粘贴文本(跨会话转写等)
20
+ // 含完成词 + 目标重叠时会误触发(粘贴新会话转写 → 误 completed 弹窗收尾目标)。>100 字符不判定。
21
+ if (text.length > 100) {
22
+ return undefined;
23
+ }
24
+ if (COMPLETION_NEGATION_RE.test(text)) {
25
+ return undefined;
26
+ }
27
+ if (!COMPLETION_RE.test(text)) {
28
+ return undefined;
29
+ }
30
+ // 疑问句不算完成宣告
31
+ if (/[吗呢]$/.test(text.trim())) {
32
+ return undefined;
33
+ }
34
+ for (const g of goals) {
35
+ const goalText = normalizeCompletionText(g.text);
36
+ // 重叠窗口规则(2026-08-21 狗粮误报修复):中文窗口 ≥4 连续字符(≈两个词,有意义);
37
+ // 纯 ASCII 窗口要求 ≥8 连字符——4 字符英文只是半个单词(北极星"Thread"被消息里
38
+ // "thread-reg"命中"read"/"hrea"窗口 = 误 completed,生产实证)。
39
+ for (let i = 0; i + 4 <= goalText.length; i++) {
40
+ const win = goalText.slice(i, i + 4);
41
+ if (/[^\x21-\x7E]/.test(win) && text.includes(win)) {
42
+ return g;
60
43
  }
61
44
  }
62
- }
63
- if (assistant) {
64
- for (const re of DECLARE_RE) {
65
- const m = assistantRaw.match(re);
66
- if (m && m[1]?.trim()) {
67
- const text = m[1].trim().slice(0, MAX_DECISION_TEXT);
68
- if (!/[吗呢吧]$/.test(text)) {
69
- analysis.decisions.push({ action: "propose", text });
45
+ const asciiRuns = goalText.match(/[\x21-\x7E]{8,}/g) ?? [];
46
+ for (const run of asciiRuns) {
47
+ for (let i = 0; i + 8 <= run.length; i++) {
48
+ if (text.includes(run.slice(i, i + 8))) {
49
+ return g;
70
50
  }
71
- break;
72
51
  }
73
52
  }
74
53
  }
54
+ return undefined;
55
+ }
56
+ // 完成判定归一化:去中文标点 + 去空白("Thread 定位"与"Thread定位"等价,防空格断匹配)
57
+ function normalizeCompletionText(t) {
58
+ return stripPunct(t).replace(/\s+/g, "");
59
+ }
60
+ export function analyzeTurn(input) {
61
+ const analysis = { goals: [] };
62
+ const userRaw = (input.user_msg ?? "").trim();
63
+ if (!userRaw) {
64
+ return analysis;
65
+ }
66
+ // 机制 1 保留:系统提醒/指令注入不抽任何结构化行(噪声过滤)
67
+ if (SYSTEM_NOISE_RE.test(userRaw)) {
68
+ return analysis;
69
+ }
70
+ const user = stripPunct(userRaw);
71
+ // 粘贴守卫:多行(md 提示词/转写粘贴)与长文不判目标
72
+ if (user.includes("\n") || user.length > MAX_GOAL_TEXT) {
73
+ return analysis;
74
+ }
75
+ if (GOAL_RE.test(user) && !(COMPLETION_RE.test(user) && !COMPLETION_NEGATION_RE.test(user))) {
76
+ // 完成宣告句不当作新目标("整理研究笔记搞定了"是收尾,不是新任务——2026-08-20 收口防误报)
77
+ analysis.goals.push({ text: userRaw.slice(0, MAX_GOAL_TEXT), action: "add" });
78
+ }
75
79
  return analysis;
76
80
  }
77
81
  export function applyTurn(store, sessionId, input, opts = {}) {
@@ -105,41 +109,20 @@ export function applyAnalysis(store, sessionId, input, opts = {}) {
105
109
  const sourceEvent = opts.sourceEvent;
106
110
  const structuredOpts = { sourceEvent, ts, scope: opts.scope, projectKey: opts.projectKey, origin: opts.origin, isolation: opts.isolation };
107
111
  return store.transact(() => {
108
- const applied = { goals: [], decisions: [], feedback: [] };
112
+ const applied = { goals: [] };
109
113
  for (const g of analysis.goals) {
110
114
  applied.goals.push(store.addGoal(sessionId, g.text, structuredOpts));
111
115
  }
112
- for (const d of analysis.decisions) {
113
- switch (d.action) {
114
- case "propose":
115
- applied.decisions.push(store.proposeDecision(sessionId, d.text, structuredOpts));
116
- break;
117
- case "confirm": {
118
- const confirmed = store.confirmLatestProposed(sessionId, { ts });
119
- if (confirmed) {
120
- applied.decisions.push(confirmed);
121
- }
122
- break;
123
- }
124
- case "revoke": {
125
- const revoked = store.revokeLatestActive(sessionId, { ts });
126
- if (revoked) {
127
- applied.decisions.push(revoked);
128
- }
129
- break;
130
- }
131
- case "supersede": {
132
- const result = store.supersedeLatestActive(sessionId, d.text, structuredOpts);
133
- if (result) {
134
- applied.decisions.push(result.superseded, result.replacement);
135
- }
136
- break;
137
- }
116
+ // 目标完成检测(2026-08-20 收口;2026-08-21 狗粮修复):跨会话合并视图判定——状态卡/接续块
117
+ // 展示的是 getActiveGoalsMerged(项目+全局+会话),用户指认"X 完成"的目标常来自旧会话;
118
+ // 更新必须传目标自己的 session_id(updateGoalStatus 按 session_id 过滤,传当前会话 = 0 行更新)。
119
+ // 狗粮实证:新会话说"验证链全绿那条已完成了",目标在旧会话 → getActiveGoals(本会话)=0 → 漏判。
120
+ if (input.user_msg) {
121
+ const completed = detectGoalCompletion(input.user_msg, store.getActiveGoalsMerged(sessionId, opts.projectKey));
122
+ if (completed) {
123
+ store.updateGoalStatus(completed.session_id, completed.id, "completed");
138
124
  }
139
125
  }
140
- for (const f of analysis.feedback) {
141
- applied.feedback.push(store.addFeedback(sessionId, f.text, f.kind, structuredOpts));
142
- }
143
126
  return applied;
144
127
  });
145
128
  }
@@ -1 +1 @@
1
- {"version":3,"file":"light-confirm.js","sourceRoot":"","sources":["../src/light-confirm.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"light-confirm.js","sourceRoot":"","sources":["../src/light-confirm.ts"],"names":[],"mappings":"AAoBA,qDAAqD;AACrD,wDAAwD;AACxD,2EAA2E;AAC3E,wDAAwD;AAExD,gEAAgE;AAChE,MAAM,eAAe,GAAG,6EAA6E,CAAC;AAEtG,MAAM,OAAO,GAAG,yHAAyH,CAAC;AAE1I,4DAA4D;AAC5D,wDAAwD;AACxD,gDAAgD;AAChD,0CAA0C;AAC1C,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B,0DAA0D;AAC1D,iEAAiE;AACjE,MAAM,aAAa,GAAG,8BAA8B,CAAC;AACrD,MAAM,sBAAsB,GAAG,8BAA8B,CAAC;AAE9D,MAAM,UAAU,oBAAoB,CAAC,OAAe,EAAE,KAAa;IACjE,MAAM,IAAI,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAC9C,kDAAkD;IAClD,6DAA6D;IAC7D,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,YAAY;IACZ,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjD,oDAAoD;QACpD,oDAAoD;QACpD,qDAAqD;QACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACrC,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnD,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;QAC3D,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvC,OAAO,CAAC,CAAC;gBACX,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,uDAAuD;AACvD,SAAS,uBAAuB,CAAC,CAAS;IACxC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAgB;IAC1C,MAAM,QAAQ,GAAiB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,kCAAkC;IAClC,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,8BAA8B;IAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;QACvD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC5F,sDAAsD;QACtD,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,KAAkB,EAClB,SAAiB,EACjB,KAAgB,EAChB,OAA+B,EAAE;IAEjC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,IAAI,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACnC,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;YACtB,UAAU,EAAE,SAAS;YACrB,IAAI,EAAE,cAAc;YACpB,EAAE;YACF,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;QACH,WAAW,KAAK,EAAE,CAAC,EAAE,CAAC;IACxB,CAAC;IACD,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;YACtB,UAAU,EAAE,SAAS;YACrB,IAAI,EAAE,mBAAmB;YACzB,EAAE;YACF,IAAI,EAAE,YAAY;SACnB,CAAC,CAAC;QACH,WAAW,KAAK,EAAE,CAAC,EAAE,CAAC;IACxB,CAAC;IAED,OAAO,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,KAAkB,EAClB,SAAiB,EACjB,KAAgB,EAChB,OAA+B,EAAE;IAEjC,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACrC,MAAM,cAAc,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IAE3I,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE;QACzB,MAAM,OAAO,GAAgB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,2DAA2D;QAC3D,2DAA2D;QAC3D,yEAAyE;QACzE,8DAA8D;QAC9D,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAC/G,IAAI,SAAS,EAAE,CAAC;gBACd,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/C,CAAC"}
@@ -2,7 +2,8 @@ import { afterAll, beforeAll, describe, expect, it } from "vitest";
2
2
  import { mkdtempSync, rmSync } from "node:fs";
3
3
  import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
- import { analyzeTurn, applyAnalysis, applyTurn } from "./light-confirm.js";
5
+ import { analyzeTurn, applyAnalysis, applyTurn, detectGoalCompletion } from "./light-confirm.js";
6
+ import { sedimentClosingTodos } from "./closing.js";
6
7
  import { ThreadStore } from "./store.js";
7
8
  import { canTransition } from "./state.js";
8
9
  let dir;
@@ -15,131 +16,80 @@ afterAll(() => {
15
16
  store.close();
16
17
  rmSync(dir, { recursive: true, force: true });
17
18
  });
18
- describe("analyzeTurn", () => {
19
- it("detects assistant decision declarations", () => {
20
- expect(analyzeTurn({ assistant_msg: "我记下了方案 A" }).decisions).toEqual([
21
- { action: "propose", text: "方案 A" },
22
- ]);
23
- expect(analyzeTurn({ assistant_msg: "我决定采用 Vite 构建" }).decisions).toEqual([
24
- { action: "propose", text: "Vite 构建" },
25
- ]);
26
- });
27
- it("detects pure acceptance short replies", () => {
28
- for (const msg of ["嗯", "好的", "没问题", "收到", "就这样"]) {
29
- expect(analyzeTurn({ user_msg: msg }).decisions).toEqual([{ action: "confirm" }]);
30
- }
31
- });
32
- it("does not treat qualified replies as acceptance", () => {
33
- expect(analyzeTurn({ user_msg: "好的,不过我还要想想" }).decisions).toEqual([]);
34
- });
35
- it("detects revocations", () => {
36
- for (const msg of ["不要用 A 库了", "算了", "别用了", "放弃吧", "不用了"]) {
37
- expect(analyzeTurn({ user_msg: msg }).decisions).toEqual([{ action: "revoke" }]);
38
- }
39
- });
40
- it("detects supersede with replacement text", () => {
41
- expect(analyzeTurn({ user_msg: "改用 B 库" }).decisions).toEqual([
42
- { action: "supersede", text: "B 库" },
43
- ]);
44
- expect(analyzeTurn({ user_msg: "改成方案 C。" }).decisions).toEqual([
45
- { action: "supersede", text: "方案 C" },
46
- ]);
47
- });
19
+ describe("analyzeTurn(2026-08-21 结构通道化:仅目标判定保留,决策/偏好 NL 停用)", () => {
48
20
  it("detects goals from imperative messages", () => {
49
21
  const analysis = analyzeTurn({ user_msg: "帮我实现登录功能" });
50
22
  expect(analysis.goals).toEqual([{ text: "帮我实现登录功能", action: "add" }]);
51
23
  });
52
- it("treats preference sentences as feedback, not revocation", () => {
53
- const analysis = analyzeTurn({ user_msg: "以后不要用 jQuery" });
54
- expect(analysis.decisions).toEqual([]);
55
- expect(analysis.feedback).toEqual([
56
- { text: "以后不要用 jQuery", kind: "correction" },
57
- ]);
58
- const pref = analyzeTurn({ user_msg: "以后优先用 pnpm" });
59
- expect(pref.feedback).toEqual([{ text: "以后优先用 pnpm", kind: "preference" }]);
60
- });
61
- it("captures supersede and preference in the same message", () => {
62
- const analysis = analyzeTurn({ user_msg: "改成用 Redis,以后都别用 Memcached" });
63
- expect(analysis.decisions).toEqual([
64
- { action: "supersede", text: "用 Redis,以后都别用 Memcached" },
65
- ]);
66
- expect(analysis.feedback).toEqual([
67
- { text: "改成用 Redis,以后都别用 Memcached", kind: "correction" },
68
- ]);
69
- });
70
- it("does not declare decisions from negated or unrelated phrases", () => {
71
- expect(analyzeTurn({ assistant_msg: "我不确定这个方案是否可行" }).decisions).toEqual([]);
72
- expect(analyzeTurn({ assistant_msg: "我忘记下载依赖包" }).decisions).toEqual([]);
73
- expect(analyzeTurn({ assistant_msg: "我们还在讨论中" }).decisions).toEqual([]);
74
- });
75
- it("does not declare decisions from questions or technical terms", () => {
76
- expect(analyzeTurn({ assistant_msg: "要我记下这个决策吗?" }).decisions).toEqual([]);
77
- expect(analyzeTurn({ assistant_msg: "写入确定性摘要,degraded 可达" }).decisions).toEqual([]);
78
- expect(analyzeTurn({ assistant_msg: "怎么确定当前是哪个项目?" }).decisions).toEqual([]);
79
- expect(analyzeTurn({ assistant_msg: "这是一个决定性的因素" }).decisions).toEqual([]);
80
- });
81
- it("requires first-person subject for bare 决定/确定", () => {
82
- expect(analyzeTurn({ assistant_msg: "产出直接决定 B/C 怎么做" }).decisions).toEqual([]);
83
- expect(analyzeTurn({ assistant_msg: "调研结论确定下一步" }).decisions).toEqual([]);
84
- expect(analyzeTurn({ assistant_msg: "我确定用 Vite" }).decisions).toEqual([
85
- { action: "propose", text: "用 Vite" },
86
- ]);
87
- expect(analyzeTurn({ assistant_msg: "我们已经决定用 pnpm" }).decisions).toEqual([
88
- { action: "propose", text: "用 pnpm" },
89
- ]);
90
- expect(analyzeTurn({ assistant_msg: "我决定采用 Vite 构建" }).decisions).toEqual([
91
- { action: "propose", text: "Vite 构建" },
92
- ]);
93
- });
94
24
  it("does not treat questions as goals", () => {
95
25
  expect(analyzeTurn({ user_msg: "请问登录怎么做" }).goals).toEqual([]);
96
26
  expect(analyzeTurn({ user_msg: "帮我查一下这个错误" }).goals).toEqual([]);
97
27
  });
28
+ it("does not treat completion declarations as new goals", () => {
29
+ expect(analyzeTurn({ user_msg: "整理研究笔记搞定了" }).goals).toEqual([]);
30
+ });
31
+ it("system-reminder/指令注入不抽任何结构化行", () => {
32
+ const a = analyzeTurn({ user_msg: "<system-reminder>\nUpdated instructions from: AGENTS.md\nThis file changed" });
33
+ expect(a.goals).toEqual([]);
34
+ });
35
+ it("多行粘贴不判目标(md 提示词粘贴守卫,2026-08-21 用户场景)", () => {
36
+ const mdPrompt = [
37
+ "# 角色",
38
+ "你是一个资深工程师",
39
+ "帮我实现登录模块",
40
+ "## 要求",
41
+ "- 支持 JWT",
42
+ "- 以后优先用 pnpm",
43
+ ].join("\n");
44
+ expect(analyzeTurn({ user_msg: mdPrompt }).goals).toEqual([]);
45
+ // 附件内联 = 同一入口:单行守卫对多行内容同样生效
46
+ expect(analyzeTurn({ user_msg: "文件内容如下:\n帮我修复缓存模块\n(来自 spec.md)" }).goals).toEqual([]);
47
+ });
48
+ it("长文不判目标(>200 字符守卫)", () => {
49
+ const long = `帮我实现一个登录系统具体要求如下${"支持手机号邮箱用户名三种登录方式".repeat(15)}`;
50
+ expect(long.length).toBeGreaterThan(200);
51
+ expect(analyzeTurn({ user_msg: long }).goals).toEqual([]);
52
+ });
53
+ it("单行短祈使句正常判目标(守卫不误伤真实指令)", () => {
54
+ expect(analyzeTurn({ user_msg: "帮我修复缓存模块" }).goals).toHaveLength(1);
55
+ expect(analyzeTurn({ user_msg: "实现一个 BM25 检索模块,支持中文分词和增量索引" }).goals).toHaveLength(1);
56
+ });
57
+ it("决策/偏好自然语言不再产生任何结构化动作(只留显式通道)", () => {
58
+ expect(analyzeTurn({ user_msg: "就按方案 A 吧" })).toEqual({ goals: [] });
59
+ expect(analyzeTurn({ user_msg: "以后不要用 jQuery" })).toEqual({ goals: [] });
60
+ expect(analyzeTurn({ user_msg: "改成用 Redis" })).toEqual({ goals: [] });
61
+ expect(analyzeTurn({ user_msg: "好的" })).toEqual({ goals: [] });
62
+ expect(analyzeTurn({ assistant_msg: "我记下了方案 A" })).toEqual({ goals: [] });
63
+ expect(analyzeTurn({ assistant_msg: "我决定采用 Vite 构建" })).toEqual({ goals: [] });
64
+ });
98
65
  it("ignores unrelated messages", () => {
99
- expect(analyzeTurn({ user_msg: "用 A 吧" })).toEqual({ goals: [], decisions: [], feedback: [] });
100
- expect(analyzeTurn({})).toEqual({ goals: [], decisions: [], feedback: [] });
66
+ expect(analyzeTurn({ user_msg: "用 A 吧" })).toEqual({ goals: [] });
67
+ expect(analyzeTurn({})).toEqual({ goals: [] });
101
68
  });
102
69
  });
103
70
  describe("applyTurn", () => {
104
- it("propose -> confirm -> active", () => {
105
- applyTurn(store, "s1", { assistant_msg: "我记下了用 Vite" });
106
- const proposed = store.getLatestProposed("s1");
107
- expect(proposed?.status).toBe("proposed");
108
- applyTurn(store, "s1", { user_msg: "嗯" });
109
- const active = store.getActiveDecisions("s1");
110
- expect(active).toHaveLength(1);
111
- expect(active[0].text).toBe("用 Vite");
112
- expect(active[0].status).toBe("active");
113
- });
114
- it("supersede marks the old decision and replaces it", () => {
115
- const applied = applyTurn(store, "s1", { user_msg: "改用 Webpack" });
116
- expect(applied.decisions.map((d) => d.text)).toEqual(["用 Vite", "Webpack"]);
117
- expect(applied.decisions[0].status).toBe("superseded");
118
- expect(applied.decisions[0].superseded_by).toBe(applied.decisions[1].id);
119
- expect(applied.decisions[1].status).toBe("active");
120
- });
121
- it("revoke ends the latest decision", () => {
122
- applyTurn(store, "s1", { user_msg: "不要了" });
123
- expect(store.getActiveDecisions("s1")).toHaveLength(0);
124
- });
125
- it("records goals and feedback", () => {
71
+ it("records goals and appends events", () => {
126
72
  applyTurn(store, "s1", { user_msg: "帮我重构配置模块" });
127
73
  expect(store.getActiveGoals("s1")).toHaveLength(1);
128
- applyTurn(store, "s1", { user_msg: "以后别用回调" });
129
- expect(store.getActiveGoals("s1")).toHaveLength(1);
74
+ expect(store.getRecentEvents("s1", 10).some((e) => e.kind === "user_message")).toBe(true);
130
75
  });
131
76
  it("applyAnalysis writes structured rows without appending events", () => {
132
77
  const before = store.getRecentEvents("s2", 100).length;
133
78
  const ev = store.append({
134
79
  session_id: "s2",
135
- kind: "assistant_message",
80
+ kind: "user_message",
136
81
  ts: "2026-08-13T00:00:00.000Z",
137
- body: "我记下了用 pnpm 管理依赖",
82
+ body: "帮我编写查询工具",
138
83
  });
139
- const applied = applyAnalysis(store, "s2", { assistant_msg: "我记下了用 pnpm 管理依赖" }, { sourceEvent: ev.id });
140
- expect(applied.decisions).toHaveLength(1);
84
+ const applied = applyAnalysis(store, "s2", { user_msg: "帮我编写查询工具" }, { sourceEvent: ev.id });
85
+ expect(applied.goals).toHaveLength(1);
141
86
  expect(store.getRecentEvents("s2", 100).length).toBe(before + 1);
142
87
  });
88
+ it("assistant 文本不再进入判定(模型通道 = record_decision 工具)", () => {
89
+ const before = store.getDecisions("s2").length;
90
+ applyTurn(store, "s2", { assistant_msg: "我决定采用 Webpack 构建" });
91
+ expect(store.getDecisions("s2").length).toBe(before);
92
+ });
143
93
  });
144
94
  describe("decision state machine", () => {
145
95
  it("allows documented transitions only", () => {
@@ -151,4 +101,136 @@ describe("decision state machine", () => {
151
101
  expect(canTransition("revoked", "revoked")).toBe(false);
152
102
  });
153
103
  });
104
+ describe("显式决策通道(2026-08-21 结构通道化)", () => {
105
+ it("addDecision:命令/工具创建直接落 active", () => {
106
+ const d = store.addDecision("s-d1", "用 pnpm 管理依赖", { projectKey: "test-proj" });
107
+ expect(d.status).toBe("active");
108
+ expect(store.getActiveDecisions("s-d1").map((x) => x.text)).toContain("用 pnpm 管理依赖");
109
+ // 同文本幂等:重复创建返回既有行,不产生重复 active 决策
110
+ const dup = store.addDecision("s-d1", "用 pnpm 管理依赖", { projectKey: "test-proj" });
111
+ expect(dup.id).toBe(d.id);
112
+ expect(store.getActiveDecisions("s-d1")).toHaveLength(1);
113
+ });
114
+ it("supersedeDecisionById:旧决策转 superseded + 血缘边 + 字段继承", () => {
115
+ const old = store.addDecision("s-d2", "JWT 认证", { projectKey: "test-proj", scope: "project" });
116
+ const r = store.supersedeDecisionById("s-d2", old.id, "Session 认证", { ts: "2026-08-13T00:00:05.000Z" });
117
+ expect(r).toBeDefined();
118
+ expect(r?.superseded.status).toBe("superseded");
119
+ expect(r?.superseded.superseded_by).toBe(r?.replacement.id);
120
+ expect(r?.replacement.status).toBe("active");
121
+ expect(r?.replacement.project_key).toBe("test-proj");
122
+ const edges = store.getRelatedEdges("s-d2", "decision", old.id);
123
+ expect(edges.some((e) => e.edge_type === "supersedes")).toBe(true);
124
+ // 非本会话/非 active 行不可取代
125
+ expect(store.supersedeDecisionById("other", old.id, "X")).toBeUndefined();
126
+ });
127
+ it("deleteDecision:硬删除 + 血缘边清理,事件流水保留", () => {
128
+ const d = store.addDecision("s-d3", "临时决策", { projectKey: "test-proj", sourceEvent: 1 });
129
+ expect(store.deleteDecision(d.id)).toBe(true);
130
+ expect(store.getDecisions("s-d3")).toHaveLength(0);
131
+ expect(store.deleteDecision(d.id)).toBe(false);
132
+ });
133
+ it("promoteCandidate:候选转正为 active 决策(可带修正文本)", () => {
134
+ const c = store.addPendingCandidate({ sessionId: "s-d4", text: "开发基线:标准模式为主", kind: "decision", projectKey: "test-proj" });
135
+ const d = store.promoteCandidate(c.id);
136
+ expect(d?.status).toBe("active");
137
+ expect(d?.text).toBe("开发基线:标准模式为主");
138
+ expect(store.listPendingCandidates({ sessionId: "s-d4" })).toHaveLength(0);
139
+ // 带修正文本转正
140
+ const c2 = store.addPendingCandidate({ sessionId: "s-d4", text: "碎片候选文本", kind: "decision", projectKey: "test-proj" });
141
+ const d2 = store.promoteCandidate(c2.id, "修正后的决策文本");
142
+ expect(d2?.text).toBe("修正后的决策文本");
143
+ // 已处理候选不可再转正
144
+ expect(store.promoteCandidate(c2.id)).toBeUndefined();
145
+ });
146
+ });
147
+ describe("轻确认候选(§1.5.3d:粗筛-候选,不污染正式表)", () => {
148
+ it("候选待处理期不入正式表;转正后进 decisions", () => {
149
+ const c = store.addPendingCandidate({ sessionId: "s-p1", text: "用 pnpm", kind: "decision", projectKey: "test-proj" });
150
+ expect(store.getDecisions("s-p1")).toHaveLength(0);
151
+ store.promoteCandidate(c.id);
152
+ expect(store.getDecisions("s-p1").map((d) => d.text)).toContain("用 pnpm");
153
+ });
154
+ it("忽略候选 → ignored", () => {
155
+ const c = store.addPendingCandidate({ sessionId: "s-p3", text: "别用 yarn", kind: "preference", projectKey: "test-proj" });
156
+ const ignored = store.ignoreCandidate(c.id);
157
+ expect(ignored?.status).toBe("ignored");
158
+ expect(store.listPendingCandidates({ sessionId: "s-p3" })).toHaveLength(0);
159
+ });
160
+ it("提示计数与超时过期", () => {
161
+ const c = store.addPendingCandidate({ sessionId: "s-p4", text: "缓存用 LRU", kind: "decision", projectKey: "test-proj" });
162
+ store.markCandidatePrompted(c.id);
163
+ store.markCandidatePrompted(c.id);
164
+ const listed = store.listPendingCandidates({ projectKey: "test-proj" }).find((x) => x.id === c.id);
165
+ expect(listed?.prompt_count).toBe(2);
166
+ store.structuredDb.prepare(`UPDATE pending_candidates SET last_prompt_ts = ? WHERE id = ?`).run("2026-01-01T00:00:00.000Z", c.id);
167
+ const expired = store.expireCandidates({ before: new Date().toISOString(), projectKey: "test-proj" });
168
+ expect(expired).toBeGreaterThanOrEqual(1);
169
+ expect(store.listPendingCandidates({ projectKey: "test-proj" }).find((x) => x.id === c.id)).toBeUndefined();
170
+ });
171
+ it("从未被提示的候选(headless 堆积场景)超龄也过期(2026-08-20 收口)", () => {
172
+ const c = store.addPendingCandidate({ sessionId: "s-p5", text: "碎片误报候选", kind: "decision", projectKey: "test-proj" });
173
+ store.structuredDb.prepare(`UPDATE pending_candidates SET created_at = ? WHERE id = ?`).run("2026-01-01T00:00:00.000Z", c.id);
174
+ store.expireCandidates({ before: new Date().toISOString(), projectKey: "test-proj" });
175
+ expect(store.listPendingCandidates({ sessionId: "s-p5" })).toHaveLength(0);
176
+ });
177
+ });
178
+ describe("detectGoalCompletion(2026-08-20 收口:明确完成宣告 + 目标命中)", () => {
179
+ it("完成宣告命中 active 目标", () => {
180
+ const goals = store.addGoal("s-c1", "完成批 5 验证", { projectKey: "test-proj" });
181
+ const hit = detectGoalCompletion("批 5 验证完成了", [goals]);
182
+ expect(hit?.id).toBe(goals.id);
183
+ });
184
+ it("否定/疑问不误判", () => {
185
+ const goals = store.addGoal("s-c2", "接入弹窗", { projectKey: "test-proj" });
186
+ expect(detectGoalCompletion("接入弹窗还没完成", [goals])).toBeUndefined();
187
+ expect(detectGoalCompletion("接入弹窗完成了吗", [goals])).toBeUndefined();
188
+ });
189
+ it("无目标命中不误判", () => {
190
+ const goals = store.addGoal("s-c3", "迁移到 monorepo", { projectKey: "test-proj" });
191
+ expect(detectGoalCompletion("午饭吃完了", [goals])).toBeUndefined();
192
+ });
193
+ it("长粘贴文本不触发完成(2026-08-21 狗粮假阳性守卫)", () => {
194
+ const goals = store.addGoal("s-c5", "接入弹窗收尾", { projectKey: "test-proj" });
195
+ const paste = "以下是 web 界面看到的内容:收到——验证任务那条也标记完成。当前待办还剩两条:接入弹窗收尾(确认/取消/推迟)和 5 条待确认候选的处理。需要继续哪个说一声即可。上下文注入 dsh-thread:收到状态卡——其他会话正在排查清单改动的问题,本会话不介入。";
196
+ expect(paste.length).toBeGreaterThan(100);
197
+ expect(detectGoalCompletion(paste, [goals])).toBeUndefined();
198
+ expect(detectGoalCompletion("接入弹窗收尾完成了", [goals])?.id).toBe(goals.id);
199
+ });
200
+ it("applyAnalysis 全链:完成宣告 → 目标 completed + todo 自愈 done", () => {
201
+ const g = store.addGoal("s-c4", "整理研究笔记", { projectKey: "test-proj" });
202
+ sedimentClosingTodos(store, "s-c4", { projectKey: "test-proj" });
203
+ expect(store.listTodos({ sessionId: "s-c4" })[0].status).toBe("pending");
204
+ applyAnalysis(store, "s-c4", { user_msg: "整理研究笔记搞定了" }, { projectKey: "test-proj" });
205
+ expect(store.getActiveGoals("s-c4")).toHaveLength(0);
206
+ const completed = store.structuredDb
207
+ .prepare(`SELECT id, status FROM goals WHERE session_id = ? AND status = 'completed'`)
208
+ .all("s-c4");
209
+ expect(completed.map((r) => r.id)).toContain(g.id);
210
+ expect(store.listTodos({ sessionId: "s-c4" })[0].status).toBe("done");
211
+ });
212
+ it("applyAnalysis 跨会话完成(2026-08-21 狗粮修复):目标在旧会话,新会话指认完成", () => {
213
+ const g = store.addGoal("s-old", "验证链全绿 110/110 提交", { projectKey: "test-proj" });
214
+ sedimentClosingTodos(store, "s-old", { projectKey: "test-proj" });
215
+ applyAnalysis(store, "s-new", { user_msg: "验证链全绿(110/110 提交)那条已完成了" }, { projectKey: "test-proj" });
216
+ const row = store.structuredDb.prepare(`SELECT status FROM goals WHERE id = ?`).get(g.id);
217
+ expect(row.status).toBe("completed");
218
+ expect(store.listTodos({ sessionId: "s-old" })[0].status).toBe("done");
219
+ expect(store.getActiveGoals("s-new")).toHaveLength(0);
220
+ });
221
+ it("英文 4 字符窗口不判完成(2026-08-21 狗粮误报:北极星 Thread 被 thread-reg 命中 read)", () => {
222
+ const goals = store.addGoal("s-c6", "Thread 定位北极星:让模型工作质量更高(可靠性向),不是让用户更舒服(体验向)——任何功能决策拿它对齐", { projectKey: "test-proj" });
223
+ const msg = "重启完成了,我试了一下thread-reg ast,发现两个问题:\n1.changeset记录也在里面\n2.大量的重复";
224
+ expect(detectGoalCompletion(msg, [goals])).toBeUndefined();
225
+ // 合法中文窗口仍命中(空格归一化)
226
+ expect(detectGoalCompletion("Thread定位北极星那条已经完成了", [goals])?.id).toBe(goals.id);
227
+ });
228
+ it("纯 ASCII 目标需 ≥8 连字符窗口;短英文目标不误判不误伤", () => {
229
+ const en = store.addGoal("s-c7", "Ship the MVP by end of August", { projectKey: "test-proj" });
230
+ expect(detectGoalCompletion("Ship the MVP by end of August 已经交付了", [en])?.id).toBe(en.id);
231
+ // 短英文片段(<8 连字符)不构成重叠——宁可漏判不误判
232
+ const short = store.addGoal("s-c8", "MVP", { projectKey: "test-proj" });
233
+ expect(detectGoalCompletion("MVP 完成了", [short])).toBeUndefined();
234
+ });
235
+ });
154
236
  //# sourceMappingURL=light-confirm.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"light-confirm.test.js","sourceRoot":"","sources":["../src/light-confirm.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"light-confirm.test.js","sourceRoot":"","sources":["../src/light-confirm.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,IAAI,GAAW,CAAC;AAChB,IAAI,KAAkB,CAAC;AAEvB,SAAS,CAAC,GAAG,EAAE;IACb,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACrD,KAAK,GAAG,IAAI,WAAW,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;AACvI,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,GAAG,EAAE;IACZ,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;IACjE,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,QAAQ,EAAE,4EAA4E,EAAE,CAAC,CAAC;QAClH,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,QAAQ,GAAG;YACf,MAAM;YACN,WAAW;YACX,UAAU;YACV,OAAO;YACP,UAAU;YACV,cAAc;SACf,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9D,4BAA4B;QAC5B,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,iCAAiC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,IAAI,GAAG,mBAAmB,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,4BAA4B,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACtE,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,WAAW,CAAC,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1E,MAAM,CAAC,WAAW,CAAC,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,MAAM,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;QACvD,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;YACtB,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,cAAc;YACpB,EAAE,EAAE,0BAA0B;YAC9B,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7F,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QAC/C,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QAChF,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACrF,kCAAkC;QAClC,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QAClF,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/F,MAAM,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACxG,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAA4B,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/F,sBAAsB;QACtB,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QACzF,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,KAAK,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3H,MAAM,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC3E,UAAU;QACV,MAAM,EAAE,GAAG,KAAK,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QACvH,MAAM,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,aAAa;QACb,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,KAAK,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QACtH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnD,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QACzH,MAAM,OAAO,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;QACnB,MAAM,CAAC,GAAG,KAAK,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QACvH,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,KAAK,CAAC,qBAAqB,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACnG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,+DAA+D,CAAC,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAClI,MAAM,OAAO,GAAG,KAAK,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QACtG,MAAM,CAAC,OAAO,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC9G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,GAAG,KAAK,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QACtH,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9H,KAAK,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QACtF,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;IACjE,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QAC7E,MAAM,GAAG,GAAG,oBAAoB,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE;QAClB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,oBAAoB,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAClE,MAAM,CAAC,oBAAoB,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE;QAClB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QACjF,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3E,MAAM,KAAK,GAAG,oIAAoI,CAAC;QACnJ,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC7D,MAAM,CAAC,oBAAoB,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QACvE,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QACrF,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY;aACjC,OAAO,CAAC,4EAA4E,CAAC;aACrF,GAAG,CAAC,MAAM,CAA0C,CAAC;QACxD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QAClF,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QAClE,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,yBAAyB,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QACpG,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAuB,CAAC;QAChH,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,wDAAwD,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3H,MAAM,GAAG,GAAG,+DAA+D,CAAC;QAC5E,MAAM,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC3D,mBAAmB;QACnB,MAAM,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,+BAA+B,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QAC/F,MAAM,CAAC,oBAAoB,CAAC,qCAAqC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1F,8BAA8B;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}