@thread-memory/core 1.0.0 → 1.0.2
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/package.json +2 -2
- package/dist/assets.test.d.ts +0 -1
- package/dist/assets.test.js +0 -88
- package/dist/assets.test.js.map +0 -1
- package/dist/events.test.d.ts +0 -1
- package/dist/events.test.js +0 -46
- package/dist/events.test.js.map +0 -1
- package/dist/feedback-guard.test.d.ts +0 -1
- package/dist/feedback-guard.test.js +0 -67
- package/dist/feedback-guard.test.js.map +0 -1
- package/dist/index.test.d.ts +0 -1
- package/dist/index.test.js +0 -8
- package/dist/index.test.js.map +0 -1
- package/dist/isolation.test.d.ts +0 -1
- package/dist/isolation.test.js +0 -100
- package/dist/isolation.test.js.map +0 -1
- package/dist/light-confirm.test.d.ts +0 -1
- package/dist/light-confirm.test.js +0 -236
- package/dist/light-confirm.test.js.map +0 -1
- package/dist/lineage.test.d.ts +0 -1
- package/dist/lineage.test.js +0 -56
- package/dist/lineage.test.js.map +0 -1
- package/dist/migrate.test.d.ts +0 -1
- package/dist/migrate.test.js +0 -111
- package/dist/migrate.test.js.map +0 -1
- package/dist/nav.test.d.ts +0 -1
- package/dist/nav.test.js +0 -100
- package/dist/nav.test.js.map +0 -1
- package/dist/project-key.test.d.ts +0 -1
- package/dist/project-key.test.js +0 -29
- package/dist/project-key.test.js.map +0 -1
- package/dist/query.test.d.ts +0 -1
- package/dist/query.test.js +0 -165
- package/dist/query.test.js.map +0 -1
- package/dist/schema.test.d.ts +0 -1
- package/dist/schema.test.js +0 -167
- package/dist/schema.test.js.map +0 -1
- package/dist/sediment.test.d.ts +0 -1
- package/dist/sediment.test.js +0 -89
- package/dist/sediment.test.js.map +0 -1
- package/dist/segment.test.d.ts +0 -1
- package/dist/segment.test.js +0 -37
- package/dist/segment.test.js.map +0 -1
- package/dist/state-delta.test.d.ts +0 -1
- package/dist/state-delta.test.js +0 -90
- package/dist/state-delta.test.js.map +0 -1
- package/dist/status-card.test.d.ts +0 -1
- package/dist/status-card.test.js +0 -126
- package/dist/status-card.test.js.map +0 -1
- package/dist/store.test.d.ts +0 -1
- package/dist/store.test.js +0 -394
- package/dist/store.test.js.map +0 -1
- package/dist/v7.test.d.ts +0 -1
- package/dist/v7.test.js +0 -106
- package/dist/v7.test.js.map +0 -1
package/dist/query.test.js
DELETED
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
2
|
-
import { mkdtempSync, rmSync } from "node:fs";
|
|
3
|
-
import { tmpdir } from "node:os";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
import { queryMemory, queryEvents, queryStructured } from "./query.js";
|
|
6
|
-
import { ThreadStore } from "./store.js";
|
|
7
|
-
let dir;
|
|
8
|
-
let store;
|
|
9
|
-
beforeAll(() => {
|
|
10
|
-
dir = mkdtempSync(join(tmpdir(), "thread-query-"));
|
|
11
|
-
store = new ThreadStore({ eventsPath: join(dir, "events.db"), structuredPath: join(dir, "structured.db"), projectKey: "test-proj" });
|
|
12
|
-
store.append({
|
|
13
|
-
session_id: "q1",
|
|
14
|
-
kind: "user_message",
|
|
15
|
-
ts: "2026-08-13T00:00:00.000Z",
|
|
16
|
-
body: "帮我实现登录功能,密码用 bcrypt 加密",
|
|
17
|
-
});
|
|
18
|
-
store.append({
|
|
19
|
-
session_id: "q1",
|
|
20
|
-
kind: "tool_call",
|
|
21
|
-
ts: "2026-08-13T00:00:01.000Z",
|
|
22
|
-
body: "创建 auth 模块,使用 bcrypt 加密密码",
|
|
23
|
-
meta: { tool_name: "Write", file_path: "src/auth.ts" },
|
|
24
|
-
});
|
|
25
|
-
store.append({
|
|
26
|
-
session_id: "q1",
|
|
27
|
-
kind: "tool_result",
|
|
28
|
-
ts: "2026-08-13T00:00:02.000Z",
|
|
29
|
-
body: "auth 模块已创建,含 bcrypt 哈希函数",
|
|
30
|
-
});
|
|
31
|
-
store.append({
|
|
32
|
-
session_id: "q2",
|
|
33
|
-
kind: "user_message",
|
|
34
|
-
ts: "2026-08-13T00:00:03.000Z",
|
|
35
|
-
body: "完全无关的内容:今天天气不错",
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
afterAll(() => {
|
|
39
|
-
store.close();
|
|
40
|
-
rmSync(dir, { recursive: true, force: true });
|
|
41
|
-
});
|
|
42
|
-
describe("queryMemory", () => {
|
|
43
|
-
it("returns found with BM25 hits", () => {
|
|
44
|
-
const result = queryMemory(store, "bcrypt 加密", { sessionId: "q1" });
|
|
45
|
-
expect(result.status).toBe("found");
|
|
46
|
-
expect(result.results.length).toBeGreaterThan(0);
|
|
47
|
-
expect(result.results[0].kind).toBe("user");
|
|
48
|
-
});
|
|
49
|
-
it("returns not-found with actionable note", () => {
|
|
50
|
-
const result = queryMemory(store, "不存在的概念量子咖啡机", { sessionId: "q1" });
|
|
51
|
-
expect(result.status).toBe("not-found");
|
|
52
|
-
expect(result.results).toHaveLength(0);
|
|
53
|
-
expect(result.note).toContain("未检索到");
|
|
54
|
-
expect(result.note).toContain("建议");
|
|
55
|
-
});
|
|
56
|
-
it("filters by session and hides isolated content from others", () => {
|
|
57
|
-
// 未隔离内容跨会话可见(跨会话继承检索语义)
|
|
58
|
-
const visible = queryMemory(store, "bcrypt", { sessionId: "q2" });
|
|
59
|
-
expect(visible.status).toBe("found");
|
|
60
|
-
// 隔离内容对其他会话不可见(全链路过滤)
|
|
61
|
-
store.append({
|
|
62
|
-
session_id: "q-iso",
|
|
63
|
-
kind: "user_message",
|
|
64
|
-
ts: "2026-08-13T00:00:04.000Z",
|
|
65
|
-
body: "秘密计划代号红隼",
|
|
66
|
-
}, { isolation: true });
|
|
67
|
-
const hidden = queryMemory(store, "红隼", { sessionId: "q2" });
|
|
68
|
-
expect(hidden.status).toBe("not-found");
|
|
69
|
-
// 隔离会话自己可见
|
|
70
|
-
const self = queryMemory(store, "红隼", { sessionId: "q-iso" });
|
|
71
|
-
expect(self.status).toBe("found");
|
|
72
|
-
});
|
|
73
|
-
it("respects token budget", () => {
|
|
74
|
-
const small = queryMemory(store, "登录 模块 bcrypt auth", {
|
|
75
|
-
sessionId: "q1",
|
|
76
|
-
tokenBudget: 10,
|
|
77
|
-
});
|
|
78
|
-
const large = queryMemory(store, "登录 模块 bcrypt auth", {
|
|
79
|
-
sessionId: "q1",
|
|
80
|
-
tokenBudget: 4000,
|
|
81
|
-
});
|
|
82
|
-
const smallChars = small.results.reduce((n, r) => n + r.body.length, 0);
|
|
83
|
-
expect(smallChars).toBeLessThanOrEqual(20 * 2 + 64);
|
|
84
|
-
expect(large.results.length).toBeGreaterThanOrEqual(small.results.length);
|
|
85
|
-
});
|
|
86
|
-
it("falls through to not-found when no episode summary exists", () => {
|
|
87
|
-
const result = queryMemory(store, "summary-marker", { sessionId: "q1" });
|
|
88
|
-
expect(result.status).toBe("not-found");
|
|
89
|
-
});
|
|
90
|
-
it("trigram 兜底子串命中优先于降级摘要;完全无关查询仍 not-found", () => {
|
|
91
|
-
store.append({
|
|
92
|
-
session_id: "q1",
|
|
93
|
-
kind: "user_message",
|
|
94
|
-
ts: "2026-08-13T00:00:10.000Z",
|
|
95
|
-
body: "继续开发",
|
|
96
|
-
});
|
|
97
|
-
// "bcryp" 是 bcrypt 的连续子串 → trigram 兜底命中(优于降级摘要)
|
|
98
|
-
const subHit = queryMemory(store, "bcryp", { sessionId: "q1" });
|
|
99
|
-
expect(subHit.status).toBe("found");
|
|
100
|
-
expect(subHit.results[0].body).toContain("bcrypt");
|
|
101
|
-
// 完全无关查询 → 无任何命中 → not-found(降级摘要需 token 在摘要中,此处不满足)
|
|
102
|
-
const result = queryMemory(store, "bcrypzzq", { sessionId: "q1" });
|
|
103
|
-
expect(result.status).toBe("not-found");
|
|
104
|
-
});
|
|
105
|
-
it("queryEvents filters by kind and time range", () => {
|
|
106
|
-
const result = queryEvents(store, {
|
|
107
|
-
sessionId: "q1",
|
|
108
|
-
kind: "user_message",
|
|
109
|
-
timeRange: { since: "2026-08-13T00:00:00.000Z", until: "2026-08-13T00:00:11.000Z" },
|
|
110
|
-
order: "asc",
|
|
111
|
-
});
|
|
112
|
-
expect(result.status).toBe("found");
|
|
113
|
-
expect(result.results.length).toBeGreaterThan(0);
|
|
114
|
-
expect(result.results.every((r) => r.kind === "user")).toBe(true);
|
|
115
|
-
const first = result.results[0];
|
|
116
|
-
expect(first.ts).toBe("2026-08-13T00:00:00.000Z");
|
|
117
|
-
});
|
|
118
|
-
it("queryEvents counts events", () => {
|
|
119
|
-
const result = queryEvents(store, {
|
|
120
|
-
sessionId: "q1",
|
|
121
|
-
kind: ["tool_call", "tool_result"],
|
|
122
|
-
count: true,
|
|
123
|
-
});
|
|
124
|
-
expect(result.status).toBe("found");
|
|
125
|
-
expect(result.count).toBe(2);
|
|
126
|
-
});
|
|
127
|
-
it("queryEvents returns not-found on empty range", () => {
|
|
128
|
-
const result = queryEvents(store, {
|
|
129
|
-
sessionId: "q1",
|
|
130
|
-
timeRange: { since: "2030-01-01T00:00:00.000Z" },
|
|
131
|
-
});
|
|
132
|
-
expect(result.status).toBe("not-found");
|
|
133
|
-
expect(result.results).toHaveLength(0);
|
|
134
|
-
});
|
|
135
|
-
it("queryStructured returns table rows with ids (② 后置入口)", () => {
|
|
136
|
-
store.addGoal("q1", "登录用 JWT");
|
|
137
|
-
const fb = store.addFeedback("q1", "不要用 pwsh", "correction");
|
|
138
|
-
const goals = queryStructured(store, { sessionId: "q1", table: "goals" });
|
|
139
|
-
expect(goals.status).toBe("found");
|
|
140
|
-
expect(goals.results.some((r) => r.body === "登录用 JWT")).toBe(true);
|
|
141
|
-
const fbRes = queryStructured(store, { sessionId: "q1", table: "feedback" });
|
|
142
|
-
expect(fbRes.results[0].segment_id).toBe(fb.id);
|
|
143
|
-
expect(fbRes.results[0].body).toBe("不要用 pwsh");
|
|
144
|
-
});
|
|
145
|
-
it("queryStructured applies isolation filtering (隔离语义与事件一致)", () => {
|
|
146
|
-
store.addFeedback("q-iso", "秘密偏好", "preference", { isolation: true });
|
|
147
|
-
const other = queryStructured(store, { sessionId: "q1", table: "feedback" });
|
|
148
|
-
expect(other.results.some((r) => r.body === "秘密偏好")).toBe(false);
|
|
149
|
-
const self = queryStructured(store, { sessionId: "q-iso", table: "feedback" });
|
|
150
|
-
expect(self.results.some((r) => r.body === "秘密偏好")).toBe(true);
|
|
151
|
-
});
|
|
152
|
-
it("queryStructured supports count", () => {
|
|
153
|
-
const res = queryStructured(store, { sessionId: "q1", table: "goals", count: true });
|
|
154
|
-
expect(res.count).toBeGreaterThanOrEqual(1);
|
|
155
|
-
});
|
|
156
|
-
it("queryEvents exposes isolation flag on event rows (⑨)", () => {
|
|
157
|
-
const result = queryEvents(store, { sessionId: "q-iso", order: "desc" });
|
|
158
|
-
expect(result.status).toBe("found");
|
|
159
|
-
const hit = result.results.find((r) => r.body.includes("红隼"));
|
|
160
|
-
expect(hit?.isolation).toBe(1);
|
|
161
|
-
const shared = queryEvents(store, { sessionId: "q1", order: "desc" });
|
|
162
|
-
expect(shared.results.every((r) => r.isolation === 0)).toBe(true);
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
//# sourceMappingURL=query.test.js.map
|
package/dist/query.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"query.test.js","sourceRoot":"","sources":["../src/query.test.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/schema.test.js
DELETED
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import Database from "better-sqlite3";
|
|
3
|
-
import { mkdtempSync, rmSync } from "node:fs";
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
5
|
-
import { join } from "node:path";
|
|
6
|
-
import { ensureSchema } from "./schema.js";
|
|
7
|
-
describe("schema v2 migration (B④ 双库)", () => {
|
|
8
|
-
it("migrates a v1 events db (adds columns/tables)", () => {
|
|
9
|
-
const dir = mkdtempSync(join(tmpdir(), "thread-migrate-events-"));
|
|
10
|
-
const dbPath = join(dir, "events.db");
|
|
11
|
-
const db = new Database(dbPath);
|
|
12
|
-
db.exec(`CREATE TABLE events (
|
|
13
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
14
|
-
session_id TEXT NOT NULL,
|
|
15
|
-
kind TEXT NOT NULL,
|
|
16
|
-
ts TEXT NOT NULL,
|
|
17
|
-
seq INTEGER NOT NULL,
|
|
18
|
-
body TEXT NOT NULL,
|
|
19
|
-
meta TEXT,
|
|
20
|
-
truncated INTEGER NOT NULL DEFAULT 0
|
|
21
|
-
);
|
|
22
|
-
INSERT INTO events (session_id, kind, ts, seq, body) VALUES ('s-old', 'user_message', '2026-08-13T00:00:00.000Z', 1, 'legacy data');`);
|
|
23
|
-
ensureSchema(db, "events");
|
|
24
|
-
const count = db.prepare("SELECT COUNT(*) AS c FROM events").get();
|
|
25
|
-
expect(count.c).toBe(1);
|
|
26
|
-
const cols = new Set(db.prepare("PRAGMA table_info(events)").all().map((c) => c.name));
|
|
27
|
-
for (const col of ["project_key", "scope", "origin", "spilled", "isolation"])
|
|
28
|
-
expect(cols.has(col)).toBe(true);
|
|
29
|
-
for (const t of ["spills", "schema_version"]) {
|
|
30
|
-
expect(db.prepare(`SELECT 1 FROM sqlite_master WHERE type='table' AND name=?`).get(t), `table ${t}`).toBeTruthy();
|
|
31
|
-
}
|
|
32
|
-
expect(db.prepare("SELECT MAX(version) AS v FROM schema_version").get().v).toBe(8);
|
|
33
|
-
db.close();
|
|
34
|
-
rmSync(dir, { recursive: true, force: true });
|
|
35
|
-
});
|
|
36
|
-
it("migrates a v1 structured db (adds columns/tables)", () => {
|
|
37
|
-
const dir = mkdtempSync(join(tmpdir(), "thread-migrate-structured-"));
|
|
38
|
-
const dbPath = join(dir, "structured.db");
|
|
39
|
-
const db = new Database(dbPath);
|
|
40
|
-
db.exec(`CREATE TABLE goals (
|
|
41
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
42
|
-
session_id TEXT NOT NULL,
|
|
43
|
-
text TEXT NOT NULL,
|
|
44
|
-
status TEXT NOT NULL DEFAULT 'active',
|
|
45
|
-
source_event INTEGER,
|
|
46
|
-
created_at TEXT NOT NULL
|
|
47
|
-
);
|
|
48
|
-
CREATE TABLE decisions (
|
|
49
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
50
|
-
session_id TEXT NOT NULL,
|
|
51
|
-
text TEXT NOT NULL,
|
|
52
|
-
status TEXT NOT NULL DEFAULT 'proposed',
|
|
53
|
-
superseded_by INTEGER,
|
|
54
|
-
source_event INTEGER,
|
|
55
|
-
created_at TEXT NOT NULL,
|
|
56
|
-
updated_at TEXT NOT NULL
|
|
57
|
-
);
|
|
58
|
-
CREATE TABLE feedback (
|
|
59
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
60
|
-
session_id TEXT NOT NULL,
|
|
61
|
-
text TEXT NOT NULL,
|
|
62
|
-
kind TEXT NOT NULL DEFAULT 'preference',
|
|
63
|
-
source_event INTEGER,
|
|
64
|
-
created_at TEXT NOT NULL
|
|
65
|
-
);`);
|
|
66
|
-
ensureSchema(db, "structured");
|
|
67
|
-
for (const t of ["goals", "decisions", "feedback"]) {
|
|
68
|
-
const cols = new Set(db.prepare(`PRAGMA table_info(${t})`).all().map((c) => c.name));
|
|
69
|
-
for (const col of ["project_key", "scope", "origin", "isolation"])
|
|
70
|
-
expect(cols.has(col), `${t}.${col}`).toBe(true);
|
|
71
|
-
}
|
|
72
|
-
for (const t of ["entities", "decision_entities", "metrics", "session_isolation", "pending_candidates", "knowledge_assets", "todos", "thread_meta", "schema_version"]) {
|
|
73
|
-
expect(db.prepare(`SELECT 1 FROM sqlite_master WHERE type='table' AND name=?`).get(t), `table ${t}`).toBeTruthy();
|
|
74
|
-
}
|
|
75
|
-
expect(db.prepare("SELECT MAX(version) AS v FROM schema_version").get().v).toBe(8);
|
|
76
|
-
db.close();
|
|
77
|
-
rmSync(dir, { recursive: true, force: true });
|
|
78
|
-
});
|
|
79
|
-
it("v4 FTS 表(body 单字)→ v5 重建为 body_seg 并回填(0-e 中文检索升级)", () => {
|
|
80
|
-
const dir = mkdtempSync(join(tmpdir(), "thread-migrate-fts-"));
|
|
81
|
-
const dbPath = join(dir, "events.db");
|
|
82
|
-
const db = new Database(dbPath);
|
|
83
|
-
// 模拟 v4 库:events + 旧结构 FTS(body 列 unicode61)
|
|
84
|
-
db.exec(`CREATE TABLE events (
|
|
85
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
86
|
-
session_id TEXT NOT NULL,
|
|
87
|
-
kind TEXT NOT NULL,
|
|
88
|
-
ts TEXT NOT NULL,
|
|
89
|
-
seq INTEGER NOT NULL,
|
|
90
|
-
body TEXT NOT NULL,
|
|
91
|
-
meta TEXT,
|
|
92
|
-
truncated INTEGER NOT NULL DEFAULT 0,
|
|
93
|
-
project_key TEXT,
|
|
94
|
-
scope TEXT NOT NULL DEFAULT 'project',
|
|
95
|
-
origin TEXT,
|
|
96
|
-
spilled INTEGER NOT NULL DEFAULT 0,
|
|
97
|
-
isolation INTEGER NOT NULL DEFAULT 0
|
|
98
|
-
);
|
|
99
|
-
INSERT INTO events (session_id, kind, ts, seq, body) VALUES
|
|
100
|
-
('s1', 'user_message', '2026-08-18T00:00:00.000Z', 1, '登录方案改成JWT'),
|
|
101
|
-
('s1', 'tool_call', '2026-08-18T00:00:01.000Z', 2, 'pwsh 大块工具输出不建索引');
|
|
102
|
-
CREATE VIRTUAL TABLE events_fts USING fts5(body, content='events', content_rowid='id', tokenize='unicode61');
|
|
103
|
-
INSERT INTO events_fts(rowid, body) VALUES (1, '登 录 方 案 改 成 jwt');`);
|
|
104
|
-
ensureSchema(db, "events");
|
|
105
|
-
// 重建后:body_seg 列存在,indexable 行已分词回填,tool_call 不建索引
|
|
106
|
-
// contentless 表不能 SELECT 列值,用 MATCH 验证索引内容
|
|
107
|
-
const ftsCols = new Set(db.prepare("PRAGMA table_info(events_fts)").all().map((c) => c.name));
|
|
108
|
-
expect(ftsCols.has("body_seg")).toBe(true);
|
|
109
|
-
const hit = db.prepare("SELECT rowid FROM events_fts WHERE events_fts MATCH ?").get("登录");
|
|
110
|
-
expect(hit?.rowid).toBe(1);
|
|
111
|
-
const toolHit = db.prepare("SELECT rowid FROM events_fts WHERE events_fts MATCH ?").get("pwsh");
|
|
112
|
-
expect(toolHit).toBeUndefined();
|
|
113
|
-
expect(db.prepare("SELECT MAX(version) AS v FROM schema_version").get().v).toBe(8);
|
|
114
|
-
db.close();
|
|
115
|
-
rmSync(dir, { recursive: true, force: true });
|
|
116
|
-
});
|
|
117
|
-
it("v5 FTS 表(无 events_fts_tri)→ v6 重建主表 + 建 trigram 兜底表并回填", () => {
|
|
118
|
-
const dir = mkdtempSync(join(tmpdir(), "thread-migrate-fts6-"));
|
|
119
|
-
const dbPath = join(dir, "events.db");
|
|
120
|
-
const db = new Database(dbPath);
|
|
121
|
-
// 模拟 v5 库:events + body_seg FTS(无 events_fts_tri 兜底表)
|
|
122
|
-
db.exec(`CREATE TABLE events (
|
|
123
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
124
|
-
session_id TEXT NOT NULL,
|
|
125
|
-
kind TEXT NOT NULL,
|
|
126
|
-
ts TEXT NOT NULL,
|
|
127
|
-
seq INTEGER NOT NULL,
|
|
128
|
-
body TEXT NOT NULL,
|
|
129
|
-
meta TEXT,
|
|
130
|
-
truncated INTEGER NOT NULL DEFAULT 0,
|
|
131
|
-
project_key TEXT,
|
|
132
|
-
scope TEXT NOT NULL DEFAULT 'project',
|
|
133
|
-
origin TEXT,
|
|
134
|
-
spilled INTEGER NOT NULL DEFAULT 0,
|
|
135
|
-
isolation INTEGER NOT NULL DEFAULT 0
|
|
136
|
-
);
|
|
137
|
-
INSERT INTO events (session_id, kind, ts, seq, body) VALUES
|
|
138
|
-
('s1', 'user_message', '2026-08-18T00:00:00.000Z', 1, '模型选定 deepseek-v4-flash 作为主力'),
|
|
139
|
-
('s1', 'tool_call', '2026-08-18T00:00:01.000Z', 2, 'pwsh 工具输出不建索引');
|
|
140
|
-
CREATE VIRTUAL TABLE events_fts USING fts5(body_seg, content='', tokenize='unicode61');
|
|
141
|
-
INSERT INTO events_fts(rowid, body_seg) VALUES (1, '模型 选定 deepseek v4 flash 作为 主力');`);
|
|
142
|
-
ensureSchema(db, "events");
|
|
143
|
-
// 重建后:主表 body_seg 保留 + 兜底表 events_fts_tri 存在且回填——
|
|
144
|
-
// 子串「eepseek」可经 trigram 兜底表短语命中
|
|
145
|
-
const triExists = db
|
|
146
|
-
.prepare(`SELECT 1 FROM sqlite_master WHERE type='table' AND name='events_fts_tri'`)
|
|
147
|
-
.get() !== undefined;
|
|
148
|
-
expect(triExists).toBe(true);
|
|
149
|
-
const sub = db
|
|
150
|
-
.prepare(`SELECT rowid FROM events_fts_tri WHERE events_fts_tri MATCH '"eepseek"'`)
|
|
151
|
-
.get();
|
|
152
|
-
expect(sub?.rowid).toBe(1);
|
|
153
|
-
// 主路径表无「eepseek」token(词级)
|
|
154
|
-
const seg = db
|
|
155
|
-
.prepare(`SELECT rowid FROM events_fts WHERE events_fts MATCH '"eepseek"'`)
|
|
156
|
-
.get();
|
|
157
|
-
expect(seg).toBeUndefined();
|
|
158
|
-
// tool_call 不建索引
|
|
159
|
-
const toolHit = db
|
|
160
|
-
.prepare(`SELECT rowid FROM events_fts_tri WHERE events_fts_tri MATCH '"pwsh"'`)
|
|
161
|
-
.get();
|
|
162
|
-
expect(toolHit).toBeUndefined();
|
|
163
|
-
db.close();
|
|
164
|
-
rmSync(dir, { recursive: true, force: true });
|
|
165
|
-
});
|
|
166
|
-
});
|
|
167
|
-
//# sourceMappingURL=schema.test.js.map
|
package/dist/schema.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema.test.js","sourceRoot":"","sources":["../src/schema.test.ts"],"names":[],"mappings":"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"}
|
package/dist/sediment.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/sediment.test.js
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { mkdtempSync, rmSync } from "node:fs";
|
|
3
|
-
import { tmpdir } from "node:os";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
import { PENDING_TODO_BASIS, sedimentClosingTodos } from "./closing.js";
|
|
6
|
-
import { ThreadStore } from "./store.js";
|
|
7
|
-
function makeStore() {
|
|
8
|
-
const dir = mkdtempSync(join(tmpdir(), "thread-sediment-"));
|
|
9
|
-
const store = new ThreadStore({ eventsPath: join(dir, "events.db"), structuredPath: join(dir, "structured.db"), projectKey: "demo" });
|
|
10
|
-
return { store, dir };
|
|
11
|
-
}
|
|
12
|
-
describe("sedimentClosingTodos(收尾自动沉淀,1.2)", () => {
|
|
13
|
-
it("active goals → todos(text 带未完成标记,basis=goal:<id>)", () => {
|
|
14
|
-
const { store, dir } = makeStore();
|
|
15
|
-
try {
|
|
16
|
-
store.addGoal("s1", "完成批 2", { projectKey: "demo" });
|
|
17
|
-
const result = sedimentClosingTodos(store, "s1", { projectKey: "demo" });
|
|
18
|
-
expect(result.goalTodosCreated).toBe(1);
|
|
19
|
-
const todos = store.listTodos({ sessionId: "s1" });
|
|
20
|
-
expect(todos).toHaveLength(1);
|
|
21
|
-
expect(todos[0].text).toBe("完成批 2(未完成)");
|
|
22
|
-
expect(todos[0].basis).toBe("goal:1");
|
|
23
|
-
}
|
|
24
|
-
finally {
|
|
25
|
-
store.close();
|
|
26
|
-
rmSync(dir, { recursive: true, force: true });
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
it("幂等:重复沉淀不产生重复 todo", () => {
|
|
30
|
-
const { store, dir } = makeStore();
|
|
31
|
-
try {
|
|
32
|
-
store.addGoal("s1", "目标 A", { projectKey: "demo" });
|
|
33
|
-
sedimentClosingTodos(store, "s1", { projectKey: "demo" });
|
|
34
|
-
const again = sedimentClosingTodos(store, "s1", { projectKey: "demo" });
|
|
35
|
-
expect(again.goalTodosCreated).toBe(0);
|
|
36
|
-
expect(again.goalTodosSkipped).toBe(1);
|
|
37
|
-
expect(store.listTodos({ sessionId: "s1" })).toHaveLength(1);
|
|
38
|
-
}
|
|
39
|
-
finally {
|
|
40
|
-
store.close();
|
|
41
|
-
rmSync(dir, { recursive: true, force: true });
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
it("pending 候选归集 todo(每会话一条,basis=/thread-pending)", () => {
|
|
45
|
-
const { store, dir } = makeStore();
|
|
46
|
-
try {
|
|
47
|
-
store.addPendingCandidate({ sessionId: "s1", text: "候选决策", kind: "decision", projectKey: "demo" });
|
|
48
|
-
const result = sedimentClosingTodos(store, "s1", { projectKey: "demo" });
|
|
49
|
-
expect(result.pendingTodoCreated).toBe(true);
|
|
50
|
-
const todo = store.listTodos({ sessionId: "s1", basis: PENDING_TODO_BASIS });
|
|
51
|
-
expect(todo).toHaveLength(1);
|
|
52
|
-
expect(todo[0].text).toContain("1 条");
|
|
53
|
-
// 重复沉淀:pending todo 已存在 → 不再创建
|
|
54
|
-
const again = sedimentClosingTodos(store, "s1", { projectKey: "demo" });
|
|
55
|
-
expect(again.pendingTodoCreated).toBe(false);
|
|
56
|
-
}
|
|
57
|
-
finally {
|
|
58
|
-
store.close();
|
|
59
|
-
rmSync(dir, { recursive: true, force: true });
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
it("无候选 → 不产生 pending todo", () => {
|
|
63
|
-
const { store, dir } = makeStore();
|
|
64
|
-
try {
|
|
65
|
-
const result = sedimentClosingTodos(store, "s1", { projectKey: "demo" });
|
|
66
|
-
expect(result.pendingTodoCreated).toBe(false);
|
|
67
|
-
expect(store.listTodos({ sessionId: "s1" })).toHaveLength(0);
|
|
68
|
-
}
|
|
69
|
-
finally {
|
|
70
|
-
store.close();
|
|
71
|
-
rmSync(dir, { recursive: true, force: true });
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
it("目标完成 → todo 同步 done(关闭即沉淀的自愈,2026-08-20)", () => {
|
|
75
|
-
const { store, dir } = makeStore();
|
|
76
|
-
try {
|
|
77
|
-
const g = store.addGoal("s1", "目标 X", { projectKey: "demo" });
|
|
78
|
-
sedimentClosingTodos(store, "s1", { projectKey: "demo" });
|
|
79
|
-
expect(store.listTodos({ sessionId: "s1" })[0].status).toBe("pending");
|
|
80
|
-
store.updateGoalStatus("s1", g.id, "completed");
|
|
81
|
-
expect(store.listTodos({ sessionId: "s1" })[0].status).toBe("done");
|
|
82
|
-
}
|
|
83
|
-
finally {
|
|
84
|
-
store.close();
|
|
85
|
-
rmSync(dir, { recursive: true, force: true });
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
//# sourceMappingURL=sediment.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sediment.test.js","sourceRoot":"","sources":["../src/sediment.test.ts"],"names":[],"mappings":"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"}
|
package/dist/segment.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/segment.test.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { cjkSpace, segment, segmentQuery } from "./segment.js";
|
|
3
|
-
describe("segment(0-e:jieba 预分词 shadow 列)", () => {
|
|
4
|
-
it("中文按词切分(词级,非单字)", () => {
|
|
5
|
-
const out = segment("登录方案改成JWT部署到周五");
|
|
6
|
-
expect(out).toContain("登录");
|
|
7
|
-
expect(out).toContain("方案");
|
|
8
|
-
expect(out).not.toContain("登 录"); // 不再是单字空格
|
|
9
|
-
});
|
|
10
|
-
it("过滤纯标点 token(、,:等不进索引)", () => {
|
|
11
|
-
const out = segment("决策不丢、目标不漂移、不重复提问");
|
|
12
|
-
expect(out.split(/\s+/)).not.toContain("、");
|
|
13
|
-
});
|
|
14
|
-
it("英文/数字保持空格分词", () => {
|
|
15
|
-
const out = segment("run the full test suite with JWT");
|
|
16
|
-
expect(out).toContain("JWT");
|
|
17
|
-
});
|
|
18
|
-
it("降级路径:cjkSpace 单字空格(jieba 不可用时兜底)", () => {
|
|
19
|
-
expect(cjkSpace("登录方案")).toBe("登 录 方 案");
|
|
20
|
-
expect(segment("")).toBe("");
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
describe("segmentQuery(查询侧对称分词)", () => {
|
|
24
|
-
it("中文查询切为词 token", () => {
|
|
25
|
-
const tokens = segmentQuery("登录方案怎么定的");
|
|
26
|
-
expect(tokens).toContain("登录");
|
|
27
|
-
expect(tokens.length).toBeGreaterThan(0);
|
|
28
|
-
});
|
|
29
|
-
it("英文查询保持词级", () => {
|
|
30
|
-
expect(segmentQuery("how does auth work")).toContain("auth");
|
|
31
|
-
});
|
|
32
|
-
it("空查询 → 空 token 列表", () => {
|
|
33
|
-
expect(segmentQuery("")).toEqual([]);
|
|
34
|
-
expect(segmentQuery(" ")).toEqual([]);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
//# sourceMappingURL=segment.test.js.map
|
package/dist/segment.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"segment.test.js","sourceRoot":"","sources":["../src/segment.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE/D,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;QACrB,MAAM,GAAG,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;QACvB,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE;QAClB,MAAM,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/state-delta.test.js
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { mkdtempSync, rmSync } from "node:fs";
|
|
3
|
-
import { tmpdir } from "node:os";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
import { getStateDelta, renderStateDelta } from "./delta.js";
|
|
6
|
-
import { ThreadStore } from "./store.js";
|
|
7
|
-
function makeStore() {
|
|
8
|
-
const dir = mkdtempSync(join(tmpdir(), "thread-delta-"));
|
|
9
|
-
const store = new ThreadStore({ eventsPath: join(dir, "events.db"), structuredPath: join(dir, "structured.db"), projectKey: "demo" });
|
|
10
|
-
return { store, dir };
|
|
11
|
-
}
|
|
12
|
-
describe("getStateDelta (G5 cross-session state delta)", () => {
|
|
13
|
-
it("other-session decisions/goals/feedback/candidates hit; own rows excluded", () => {
|
|
14
|
-
const { store, dir } = makeStore();
|
|
15
|
-
try {
|
|
16
|
-
store.proposeDecision("s-a", "decision A", { projectKey: "demo" });
|
|
17
|
-
store.addGoal("s-b", "goal B", { projectKey: "demo" });
|
|
18
|
-
store.addFeedback("s-b", "pref B", "preference", { projectKey: "demo" });
|
|
19
|
-
store.addPendingCandidate({ sessionId: "s-a", text: "candidate C", kind: "decision", projectKey: "demo" });
|
|
20
|
-
store.addGoal("s-me", "my own goal", { projectKey: "demo" });
|
|
21
|
-
const delta = getStateDelta(store, { projectKey: "demo", since: "2020-01-01T00:00:00.000Z", excludeSessionId: "s-me", viewerSessionId: "s-me" });
|
|
22
|
-
expect(delta.decisions.map((d) => d.text)).toEqual(["decision A"]);
|
|
23
|
-
expect(delta.goals.map((g) => g.text)).toEqual(["goal B"]);
|
|
24
|
-
expect(delta.feedback.map((f) => f.text)).toEqual(["pref B"]);
|
|
25
|
-
expect(delta.pending.map((p) => p.text)).toEqual(["candidate C"]);
|
|
26
|
-
}
|
|
27
|
-
finally {
|
|
28
|
-
store.close();
|
|
29
|
-
rmSync(dir, { recursive: true, force: true });
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
it("since watermark: older rows don't hit", () => {
|
|
33
|
-
const { store, dir } = makeStore();
|
|
34
|
-
try {
|
|
35
|
-
store.proposeDecision("s-a", "old decision", { projectKey: "demo", ts: "2026-08-19T00:00:00.000Z" });
|
|
36
|
-
const delta = getStateDelta(store, { projectKey: "demo", since: "2026-08-20T00:00:00.000Z", excludeSessionId: "s-me", viewerSessionId: "s-me" });
|
|
37
|
-
expect(delta.decisions).toHaveLength(0);
|
|
38
|
-
}
|
|
39
|
-
finally {
|
|
40
|
-
store.close();
|
|
41
|
-
rmSync(dir, { recursive: true, force: true });
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
it("isolation: isolated rows invisible to others (isolated viewer skip is caller-side)", () => {
|
|
45
|
-
const { store, dir } = makeStore();
|
|
46
|
-
try {
|
|
47
|
-
store.proposeDecision("s-iso", "isolated decision", { projectKey: "demo", isolation: true });
|
|
48
|
-
const delta = getStateDelta(store, { projectKey: "demo", since: "2020-01-01T00:00:00.000Z", excludeSessionId: "s-me", viewerSessionId: "s-me" });
|
|
49
|
-
expect(delta.decisions).toHaveLength(0);
|
|
50
|
-
// 隔离查看方的"无跨会话 delta"由调用方判定(viewer 隔离 → 不注入);本函数只负责写入方过滤
|
|
51
|
-
const viewerIsolated = store.getSessionIsolation("s-iso");
|
|
52
|
-
expect(viewerIsolated).toBe(false);
|
|
53
|
-
}
|
|
54
|
-
finally {
|
|
55
|
-
store.close();
|
|
56
|
-
rmSync(dir, { recursive: true, force: true });
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
it("status transitions surface via updated_at (goal completed)", () => {
|
|
60
|
-
const { store, dir } = makeStore();
|
|
61
|
-
try {
|
|
62
|
-
const g = store.addGoal("s-a", "goal X", { projectKey: "demo" });
|
|
63
|
-
store.updateGoalStatus("s-a", g.id, "completed");
|
|
64
|
-
const delta = getStateDelta(store, { projectKey: "demo", since: "2020-01-01T00:00:00.000Z", excludeSessionId: "s-me", viewerSessionId: "s-me" });
|
|
65
|
-
expect(delta.goals).toHaveLength(1);
|
|
66
|
-
expect(delta.goals[0].status).toBe("completed");
|
|
67
|
-
}
|
|
68
|
-
finally {
|
|
69
|
-
store.close();
|
|
70
|
-
rmSync(dir, { recursive: true, force: true });
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
describe("renderStateDelta (2.3.2 format)", () => {
|
|
75
|
-
it("with changes -> headed block", () => {
|
|
76
|
-
const text = renderStateDelta({
|
|
77
|
-
goals: [],
|
|
78
|
-
decisions: [{ id: 3, text: "plan A", session_id: "session-abc12345", updated_at: "t", status: "active" }],
|
|
79
|
-
feedback: [],
|
|
80
|
-
pending: [],
|
|
81
|
-
});
|
|
82
|
-
expect(text).toContain("[Thread");
|
|
83
|
-
expect(text).toContain("plan A");
|
|
84
|
-
expect(text).toContain("abc1234");
|
|
85
|
-
});
|
|
86
|
-
it("empty -> undefined (zero injection)", () => {
|
|
87
|
-
expect(renderStateDelta({ goals: [], decisions: [], feedback: [], pending: [] })).toBeUndefined();
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
//# sourceMappingURL=state-delta.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state-delta.test.js","sourceRoot":"","sources":["../src/state-delta.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|