@thread-memory/core 0.1.1 → 1.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.
- package/dist/assets.d.ts +14 -0
- package/dist/assets.js +104 -0
- package/dist/assets.js.map +1 -0
- package/dist/assets.test.d.ts +1 -0
- package/dist/assets.test.js +88 -0
- package/dist/assets.test.js.map +1 -0
- package/dist/behavior-contract.d.ts +2 -0
- package/dist/behavior-contract.js +9 -0
- package/dist/behavior-contract.js.map +1 -0
- package/dist/closing.d.ts +11 -0
- package/dist/closing.js +37 -0
- package/dist/closing.js.map +1 -0
- package/dist/delta.d.ts +24 -0
- package/dist/delta.js +55 -0
- package/dist/delta.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/isolation.test.js +3 -5
- package/dist/isolation.test.js.map +1 -1
- package/dist/light-confirm.d.ts +3 -21
- package/dist/light-confirm.js +80 -97
- package/dist/light-confirm.js.map +1 -1
- package/dist/light-confirm.test.js +185 -103
- package/dist/light-confirm.test.js.map +1 -1
- package/dist/lineage.test.js +10 -12
- package/dist/lineage.test.js.map +1 -1
- package/dist/nav.d.ts +26 -0
- package/dist/nav.js +139 -0
- package/dist/nav.js.map +1 -0
- package/dist/nav.test.d.ts +1 -0
- package/dist/nav.test.js +100 -0
- package/dist/nav.test.js.map +1 -0
- package/dist/query-tool.d.ts +20 -0
- package/dist/query-tool.js +61 -0
- package/dist/query-tool.js.map +1 -0
- package/dist/query.test.js +8 -5
- package/dist/query.test.js.map +1 -1
- package/dist/schema.d.ts +3 -1
- package/dist/schema.js +104 -1
- package/dist/schema.js.map +1 -1
- package/dist/schema.test.js +90 -3
- package/dist/schema.test.js.map +1 -1
- package/dist/sediment.test.d.ts +1 -0
- package/dist/sediment.test.js +89 -0
- package/dist/sediment.test.js.map +1 -0
- package/dist/segment.d.ts +3 -0
- package/dist/segment.js +84 -0
- package/dist/segment.js.map +1 -0
- package/dist/segment.test.d.ts +1 -0
- package/dist/segment.test.js +37 -0
- package/dist/segment.test.js.map +1 -0
- package/dist/state-delta.test.d.ts +1 -0
- package/dist/state-delta.test.js +90 -0
- package/dist/state-delta.test.js.map +1 -0
- package/dist/status-card.d.ts +7 -0
- package/dist/status-card.js +108 -3
- package/dist/status-card.js.map +1 -1
- package/dist/status-card.test.js +76 -3
- package/dist/status-card.test.js.map +1 -1
- package/dist/store.d.ts +121 -11
- package/dist/store.js +425 -61
- package/dist/store.js.map +1 -1
- package/dist/store.test.js +120 -10
- package/dist/store.test.js.map +1 -1
- package/dist/v7.test.d.ts +1 -0
- package/dist/v7.test.js +106 -0
- package/dist/v7.test.js.map +1 -0
- package/package.json +2 -1
package/dist/light-confirm.js
CHANGED
|
@@ -1,77 +1,81 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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: []
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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":"
|
|
1
|
+
{"version":3,"file":"light-confirm.js","sourceRoot":"","sources":["../src/light-confirm.ts"],"names":[],"mappings":"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"}
|
|
@@ -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: []
|
|
100
|
-
expect(analyzeTurn({})).toEqual({ goals: []
|
|
66
|
+
expect(analyzeTurn({ user_msg: "用 A 吧" })).toEqual({ goals: [] });
|
|
67
|
+
expect(analyzeTurn({})).toEqual({ goals: [] });
|
|
101
68
|
});
|
|
102
69
|
});
|
|
103
70
|
describe("applyTurn", () => {
|
|
104
|
-
it("
|
|
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
|
-
|
|
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: "
|
|
80
|
+
kind: "user_message",
|
|
136
81
|
ts: "2026-08-13T00:00:00.000Z",
|
|
137
|
-
body: "
|
|
82
|
+
body: "帮我编写查询工具",
|
|
138
83
|
});
|
|
139
|
-
const applied = applyAnalysis(store, "s2", {
|
|
140
|
-
expect(applied.
|
|
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":"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"}
|