@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.
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
@@ -0,0 +1,14 @@
1
+ export interface AssetClassification {
2
+ isAsset: boolean;
3
+ kind: "document" | "report";
4
+ /** 文档路径(原样保留,Windows 反斜杠不动);报告为合成路径 reports/<tool>-<callId>.md */
5
+ path: string;
6
+ /** 首行 # 标题(截 80);兜底 = 文件 basename / 报告名 */
7
+ title: string;
8
+ /** 标题提取来源(write 的 content / edit 的 new_string / report 的 output) */
9
+ content?: string;
10
+ }
11
+ export declare function parseToolArgs(argumentsRaw: unknown): Record<string, unknown> | undefined;
12
+ export declare function extractTitleFromContent(content: string | undefined, fallback: string): string;
13
+ export declare function classifyWriteEvent(toolName: string, args: unknown): AssetClassification | undefined;
14
+ export declare function classifyReportEvent(toolName: string, args: unknown, callId?: string): AssetClassification | undefined;
package/dist/assets.js ADDED
@@ -0,0 +1,104 @@
1
+ // 产出识别(max 详细设计 0.2):采集链确定性规则,零 LLM。
2
+ // 判定 = 工具名 × 文件路径 × 内容首行;产出 → knowledge_assets 登记(store.registerAsset 写时建边)。
3
+ // 解析失败降级:file_path 缺失 → undefined(旁路可失败不阻塞主路径)。
4
+ const WRITE_TOOLS = new Set([
5
+ "write",
6
+ "edit",
7
+ "create_file",
8
+ "write_to_file",
9
+ "replace_in_file",
10
+ "apply_patch",
11
+ "str_replace_editor",
12
+ ]);
13
+ const REPORT_TOOLS = new Set(["report", "subagent-report", "subagent_report"]);
14
+ const TITLE_MAX = 80;
15
+ export function parseToolArgs(argumentsRaw) {
16
+ if (typeof argumentsRaw === "string") {
17
+ try {
18
+ return JSON.parse(argumentsRaw);
19
+ }
20
+ catch {
21
+ return undefined;
22
+ }
23
+ }
24
+ if (argumentsRaw && typeof argumentsRaw === "object") {
25
+ return argumentsRaw;
26
+ }
27
+ return undefined;
28
+ }
29
+ export function extractTitleFromContent(content, fallback) {
30
+ if (content) {
31
+ const m = content.match(/^\s*#+\s+(.+)$/m);
32
+ if (m) {
33
+ const t = m[1].trim().replace(/\s+/g, " ");
34
+ if (t) {
35
+ return t.length > TITLE_MAX ? `${t.slice(0, TITLE_MAX)}…` : t;
36
+ }
37
+ }
38
+ }
39
+ const base = fallback.replace(/\\/g, "/").split("/").pop() ?? fallback;
40
+ return base.length > TITLE_MAX ? `${base.slice(0, TITLE_MAX)}…` : base;
41
+ }
42
+ // 文档产出:write/edit 类工具 + 目标为 .md 文件(路径归一化后判定,存储保留原路径)。
43
+ // 隐藏目录排除(2026-08-21 狗粮实证):.changeset/.git 等隐藏目录下的 md 是工程记录不是产出——
44
+ // 模型常反复编辑它们,自动登记既制造噪音又推高重复行。
45
+ export function classifyWriteEvent(toolName, args) {
46
+ if (!WRITE_TOOLS.has(toolName)) {
47
+ return undefined;
48
+ }
49
+ const parsed = parseToolArgs(args);
50
+ const filePath = typeof parsed?.file_path === "string" ? parsed.file_path : undefined;
51
+ if (!filePath || !/\.md$/i.test(filePath.replace(/\\/g, "/"))) {
52
+ return undefined;
53
+ }
54
+ if (isHiddenPath(filePath)) {
55
+ return undefined;
56
+ }
57
+ const content = typeof parsed?.content === "string"
58
+ ? parsed.content
59
+ : typeof parsed?.new_string === "string"
60
+ ? parsed.new_string
61
+ : undefined;
62
+ return { isAsset: true, kind: "document", path: filePath, title: extractTitleFromContent(content, filePath), content };
63
+ }
64
+ // 隐藏目录判定:任一路径段以 . 开头(. 与 .. 除外)——与 expandAssetPaths 的目录递归跳过策略一致
65
+ function isHiddenPath(p) {
66
+ return p
67
+ .replace(/\\/g, "/")
68
+ .split("/")
69
+ .some((seg) => seg.startsWith(".") && seg !== "." && seg !== "..");
70
+ }
71
+ // 报告标题:output 首个非空行(去 markdown # 前缀),兜底工具名
72
+ function firstLineTitle(output, fallback) {
73
+ if (output) {
74
+ const line = output.split("\n").find((l) => l.trim() !== "")?.trim().replace(/\s+/g, " ").replace(/^#+\s*/, "");
75
+ if (line) {
76
+ return line.length > TITLE_MAX ? `${line.slice(0, TITLE_MAX)}…` : line;
77
+ }
78
+ }
79
+ const base = fallback.replace(/\\/g, "/").split("/").pop() ?? fallback;
80
+ return base.length > TITLE_MAX ? `${base.slice(0, TITLE_MAX)}…` : base;
81
+ }
82
+ // 报告产出:report/subagent-report 工具,标题 = 参数 output 首行
83
+ export function classifyReportEvent(toolName, args, callId) {
84
+ if (!REPORT_TOOLS.has(toolName)) {
85
+ return undefined;
86
+ }
87
+ const parsed = parseToolArgs(args);
88
+ const output = typeof parsed?.output === "string"
89
+ ? parsed.output
90
+ : typeof parsed?.content === "string"
91
+ ? parsed.content
92
+ : typeof args === "string"
93
+ ? args
94
+ : undefined;
95
+ const syntheticPath = `reports/${toolName}${callId ? `-${callId}` : ""}.md`;
96
+ return {
97
+ isAsset: true,
98
+ kind: "report",
99
+ path: syntheticPath,
100
+ title: firstLineTitle(output, `${toolName}${callId ? ` ${callId}` : ""}`),
101
+ content: output,
102
+ };
103
+ }
104
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../src/assets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,88 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { classifyReportEvent, classifyWriteEvent, extractTitleFromContent, parseToolArgs } from "./assets.js";
3
+ describe("parseToolArgs(dsh 字符串 / Qoder 对象双形态)", () => {
4
+ it("JSON 字符串 → 对象", () => {
5
+ expect(parseToolArgs('{"file_path": "a.md"}')).toEqual({ file_path: "a.md" });
6
+ });
7
+ it("非 JSON 字符串 → undefined(解析失败降级)", () => {
8
+ expect(parseToolArgs("not json")).toBeUndefined();
9
+ });
10
+ it("对象原样返回", () => {
11
+ const obj = { file_path: "a.md" };
12
+ expect(parseToolArgs(obj)).toBe(obj);
13
+ });
14
+ it("undefined/null → undefined", () => {
15
+ expect(parseToolArgs(undefined)).toBeUndefined();
16
+ expect(parseToolArgs(null)).toBeUndefined();
17
+ });
18
+ });
19
+ describe("extractTitleFromContent(首行 # 标题,截 80)", () => {
20
+ it("取首个 markdown 标题", () => {
21
+ expect(extractTitleFromContent("说明\n# 我的标题\n正文", "x.md")).toBe("我的标题");
22
+ });
23
+ it("多级 # 与多余空白", () => {
24
+ expect(extractTitleFromContent("### 压缩治理 \n", "x.md")).toBe("压缩治理");
25
+ });
26
+ it("无标题 → basename 兜底", () => {
27
+ expect(extractTitleFromContent("没有标题", "docs/a/b.md")).toBe("b.md");
28
+ expect(extractTitleFromContent("", "D:\\x\\y.md")).toBe("y.md");
29
+ });
30
+ it("超长截断 80", () => {
31
+ const long = "# " + "长".repeat(100);
32
+ const t = extractTitleFromContent(long, "x.md");
33
+ expect(t.length).toBeLessThanOrEqual(81);
34
+ expect(t.endsWith("…")).toBe(true);
35
+ });
36
+ });
37
+ describe("classifyWriteEvent(文档产出:write/edit 类 × .md 路径)", () => {
38
+ it("write docs/**/*.md → document asset,标题 = content 首行", () => {
39
+ const c = classifyWriteEvent("write", JSON.stringify({ file_path: "docs/local/design/v2/x.md", content: "# 设计 v3\n正文" }));
40
+ expect(c?.isAsset).toBe(true);
41
+ expect(c?.kind).toBe("document");
42
+ expect(c?.path).toBe("docs/local/design/v2/x.md");
43
+ expect(c?.title).toBe("设计 v3");
44
+ });
45
+ it("Windows 反斜杠路径可识别,存储保留原路径", () => {
46
+ const c = classifyWriteEvent("write", { file_path: "D:\\work\\docs\\a.md" });
47
+ expect(c?.isAsset).toBe(true);
48
+ expect(c?.path).toBe("D:\\work\\docs\\a.md");
49
+ });
50
+ it("edit 工具取 new_string 首行", () => {
51
+ const c = classifyWriteEvent("edit", { file_path: "README.md", new_string: "# 新标题\n内容" });
52
+ expect(c?.title).toBe("新标题");
53
+ });
54
+ it("非 .md 路径 → 不识别", () => {
55
+ expect(classifyWriteEvent("write", { file_path: "src/index.ts", content: "# x" })).toBeUndefined();
56
+ });
57
+ it("缺 file_path → 不识别(采集缺陷降级)", () => {
58
+ expect(classifyWriteEvent("write", { content: "# x" })).toBeUndefined();
59
+ });
60
+ it("非 write 类工具 → 不识别", () => {
61
+ expect(classifyWriteEvent("read", { file_path: "docs/a.md" })).toBeUndefined();
62
+ });
63
+ it("隐藏目录下的 md → 不识别(2026-08-21 狗粮实证:.changeset 噪音)", () => {
64
+ expect(classifyWriteEvent("write", { file_path: ".changeset/feature.md", content: "# 变更" })).toBeUndefined();
65
+ expect(classifyWriteEvent("write", { file_path: "repo/.changeset/x.md", content: "# 变更" })).toBeUndefined();
66
+ expect(classifyWriteEvent("write", { file_path: "D:\\work\\.changeset\\x.md", content: "# 变更" })).toBeUndefined();
67
+ // 正常目录不受影响
68
+ expect(classifyWriteEvent("write", { file_path: "docs/design.md", content: "# 正常" })?.isAsset).toBe(true);
69
+ });
70
+ });
71
+ describe("classifyReportEvent(报告产出:report/subagent-report)", () => {
72
+ it("report 工具 → report asset,标题 = output 首行", () => {
73
+ const c = classifyReportEvent("report", { output: "调研报告\n正文" }, "call-1");
74
+ expect(c?.isAsset).toBe(true);
75
+ expect(c?.kind).toBe("report");
76
+ expect(c?.path).toBe("reports/report-call-1.md");
77
+ expect(c?.title).toBe("调研报告");
78
+ });
79
+ it("subagent-report 无 callId", () => {
80
+ const c = classifyReportEvent("subagent-report", { content: "# 子代理结论" });
81
+ expect(c?.path).toBe("reports/subagent-report.md");
82
+ expect(c?.title).toBe("子代理结论");
83
+ });
84
+ it("非报告工具 → 不识别", () => {
85
+ expect(classifyReportEvent("pwsh", { output: "x" })).toBeUndefined();
86
+ });
87
+ });
88
+ //# sourceMappingURL=assets.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.test.js","sourceRoot":"","sources":["../src/assets.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const THREAD_NORTH_STAR = "Thread \u5B9A\u4F4D\u5317\u6781\u661F\uFF1A\u8BA9\u6A21\u578B\u5DE5\u4F5C\u8D28\u91CF\u66F4\u9AD8\uFF08\u53EF\u9760\u6027\u5411\uFF09\uFF0C\u4E0D\u662F\u8BA9\u7528\u6237\u66F4\u8212\u670D\uFF08\u4F53\u9A8C\u5411\uFF09";
2
+ export declare const THREAD_BEHAVIOR_CONTRACT = "# thread\uFF08Thread \u4F1A\u8BDD\u8BB0\u5FC6\u884C\u4E3A\u5951\u7EA6\uFF09\n- \u9700\u8981\u5386\u53F2\u7EC6\u8282/\u5176\u4ED6\u4F1A\u8BDD\u8FDB\u5C55\u65F6\uFF1A\u8C03\u7528 query_session_memory \u5DE5\u5177\u67E5\u8BE2\uFF08ls/cd/cat/grep \u5BFC\u822A\uFF09\uFF0C\u4E0D\u8981\u76F4\u67E5\u5E93\u6587\u4EF6\u3001\u4E0D\u8981\u7F16\u9020\n- \u7528\u6237\u5B9A\u6848\u6216\u4F60\u505A\u51FA\u5F71\u54CD\u540E\u7EED\u7684\u51B3\u7B56\u65F6\uFF1A\u8C03\u7528 record_decision \u5DE5\u5177\u8BB0\u5F55\uFF08\u6587\u672C = \u51B3\u7B56\u672C\u8EAB\uFF0C\u4E0D\u5E26\u8BBA\u8BC1\uFF1B\u53D6\u4EE3\u65E7\u51B3\u7B56\u65F6\u5E26 supersedes_id\uFF09\n- \u6536\u5C3E\u65F6\uFF1A\u786E\u8BA4\u8FDB\u884C\u4E2D\u76EE\u6807\u6C89\u6DC0\u4E3A\u5F85\u529E\uFF08\u5F85\u5904\u7406\u4E8B\u9879\u7ECF /thread-cfm do \u5B8C\u6210/\u8F6C\u6B63\u3001cnl \u4E22\u5F03\uFF09\n- \u6536\u5230\u53EA\u6709\u72B6\u6001\u5361\u65E0\u771F\u5B9E\u63D0\u95EE\u7684\u6D88\u606F\uFF1A\u4E00\u53E5\u8BDD\u786E\u8BA4\u72B6\u6001\uFF0C\u4E0D\u5F53\u63D0\u95EE\u4F5C\u7B54";
@@ -0,0 +1,9 @@
1
+ // 行为契约(MAX 设计 2.1 SOP 正文)——单一来源:批 2 首轮锚定组合包注入 + 批 3 动态 SKILL 注册共用,
2
+ // 防两处漂移。per-model 适配(2.1):初版 default 变体,适配表按狗粮观察增量。
3
+ export const THREAD_NORTH_STAR = "Thread 定位北极星:让模型工作质量更高(可靠性向),不是让用户更舒服(体验向)";
4
+ export const THREAD_BEHAVIOR_CONTRACT = `# thread(Thread 会话记忆行为契约)
5
+ - 需要历史细节/其他会话进展时:调用 query_session_memory 工具查询(ls/cd/cat/grep 导航),不要直查库文件、不要编造
6
+ - 用户定案或你做出影响后续的决策时:调用 record_decision 工具记录(文本 = 决策本身,不带论证;取代旧决策时带 supersedes_id)
7
+ - 收尾时:确认进行中目标沉淀为待办(待处理事项经 /thread-cfm do 完成/转正、cnl 丢弃)
8
+ - 收到只有状态卡无真实提问的消息:一句话确认状态,不当提问作答`;
9
+ //# sourceMappingURL=behavior-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behavior-contract.js","sourceRoot":"","sources":["../src/behavior-contract.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,oDAAoD;AACpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,4CAA4C,CAAC;AAE9E,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;iCAIP,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ThreadStore } from "./store.js";
2
+ export interface ClosingSedimentResult {
3
+ goalTodosCreated: number;
4
+ goalTodosSkipped: number;
5
+ pendingTodoCreated: boolean;
6
+ }
7
+ export declare const PENDING_TODO_BASIS = "/thread-pending";
8
+ export declare function sedimentClosingTodos(store: ThreadStore, sessionId: string, opts?: {
9
+ projectKey?: string;
10
+ isolation?: boolean;
11
+ }): ClosingSedimentResult;
@@ -0,0 +1,37 @@
1
+ export const PENDING_TODO_BASIS = "/thread-pending";
2
+ export function sedimentClosingTodos(store, sessionId, opts = {}) {
3
+ const goals = store.getActiveGoals(sessionId);
4
+ let goalTodosCreated = 0;
5
+ let goalTodosSkipped = 0;
6
+ for (const goal of goals) {
7
+ const basis = `goal:${goal.id}`;
8
+ const existing = store.listTodos({ sessionId, basis }).length > 0;
9
+ if (existing) {
10
+ goalTodosSkipped += 1;
11
+ continue;
12
+ }
13
+ store.addTodo({
14
+ sessionId,
15
+ text: `${goal.text}(未完成)`,
16
+ basis,
17
+ projectKey: opts.projectKey,
18
+ isolation: opts.isolation,
19
+ });
20
+ goalTodosCreated += 1;
21
+ }
22
+ let pendingTodoCreated = false;
23
+ const pending = store.pendingCount({ sessionId });
24
+ const pendingTodoExists = store.listTodos({ sessionId, basis: PENDING_TODO_BASIS }).length > 0;
25
+ if (pending > 0 && !pendingTodoExists) {
26
+ store.addTodo({
27
+ sessionId,
28
+ text: `待确认候选 ${pending} 条待处理`,
29
+ basis: PENDING_TODO_BASIS,
30
+ projectKey: opts.projectKey,
31
+ isolation: opts.isolation,
32
+ });
33
+ pendingTodoCreated = true;
34
+ }
35
+ return { goalTodosCreated, goalTodosSkipped, pendingTodoCreated };
36
+ }
37
+ //# sourceMappingURL=closing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"closing.js","sourceRoot":"","sources":["../src/closing.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AAEpD,MAAM,UAAU,oBAAoB,CAClC,KAAkB,EAClB,SAAiB,EACjB,OAAqD,EAAE;IAEvD,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,QAAQ,IAAI,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAClE,IAAI,QAAQ,EAAE,CAAC;YACb,gBAAgB,IAAI,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;QACD,KAAK,CAAC,OAAO,CAAC;YACZ,SAAS;YACT,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,OAAO;YACzB,KAAK;YACL,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QACH,gBAAgB,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAClD,MAAM,iBAAiB,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/F,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACtC,KAAK,CAAC,OAAO,CAAC;YACZ,SAAS;YACT,IAAI,EAAE,SAAS,OAAO,OAAO;YAC7B,KAAK,EAAE,kBAAkB;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QACH,kBAAkB,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,CAAC;AACpE,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { ThreadStore } from "./store.js";
2
+ export interface StateDeltaItem {
3
+ id: number;
4
+ text: string;
5
+ session_id: string;
6
+ updated_at: string;
7
+ status?: string;
8
+ kind?: string;
9
+ }
10
+ export interface StateDelta {
11
+ goals: StateDeltaItem[];
12
+ decisions: StateDeltaItem[];
13
+ feedback: StateDeltaItem[];
14
+ pending: StateDeltaItem[];
15
+ }
16
+ export interface StateDeltaOptions {
17
+ projectKey?: string;
18
+ since: string;
19
+ excludeSessionId: string;
20
+ viewerSessionId: string;
21
+ limit?: number;
22
+ }
23
+ export declare function getStateDelta(store: ThreadStore, opts: StateDeltaOptions): StateDelta;
24
+ export declare function renderStateDelta(delta: StateDelta): string | undefined;
package/dist/delta.js ADDED
@@ -0,0 +1,55 @@
1
+ export function getStateDelta(store, opts) {
2
+ const limit = opts.limit ?? 5;
3
+ const read = (table, tsCol, extraCols) => {
4
+ const select = extraCols.map((c) => c).join(", ");
5
+ const rows = store.structuredDb
6
+ .prepare(`SELECT id, text, session_id, COALESCE(${tsCol}, created_at) AS updated_at${select ? `, ${select}` : ""}
7
+ FROM ${table}
8
+ WHERE COALESCE(${tsCol}, created_at) > ?
9
+ AND session_id != ?
10
+ AND (isolation = 0 OR session_id = ?)
11
+ AND (? IS NULL OR project_key = ?)
12
+ ORDER BY COALESCE(${tsCol}, created_at) DESC
13
+ LIMIT ?`)
14
+ .all(opts.since, opts.excludeSessionId, opts.viewerSessionId, opts.projectKey ?? null, opts.projectKey ?? null, limit);
15
+ return rows;
16
+ };
17
+ return {
18
+ goals: read("goals", "updated_at", ["status"]),
19
+ decisions: read("decisions", "updated_at", ["status"]),
20
+ feedback: read("feedback", "updated_at", ["kind"]),
21
+ pending: read("pending_candidates", "updated_at", ["status", "kind"]),
22
+ };
23
+ }
24
+ // delta 块渲染(2.3.2 格式):无变更返回 undefined(零注入)。
25
+ // 条目截断为单行 80 字符(2026-08-21 狗粮:目标全文含嵌入叙事 → 被误读为实时活动)
26
+ function clip(text) {
27
+ const single = text.replace(/\s+/g, " ").trim();
28
+ return single.length > 80 ? `${single.slice(0, 80)}…` : single;
29
+ }
30
+ export function renderStateDelta(delta) {
31
+ const lines = [];
32
+ for (const d of delta.decisions) {
33
+ const status = d.status === "active" ? "生效" : d.status === "proposed" ? "提议" : d.status ?? "";
34
+ lines.push(`▸ 新决策: ${clip(d.text)}(${shortSession(d.session_id)} #${d.id}${status ? ` ${status}` : ""})`);
35
+ }
36
+ for (const g of delta.goals) {
37
+ const status = g.status && g.status !== "active" ? ` ${g.status}` : "";
38
+ lines.push(`▸ 目标变更: ${clip(g.text)}(${shortSession(g.session_id)}${status})`);
39
+ }
40
+ for (const f of delta.feedback) {
41
+ lines.push(`▸ 新偏好: ${clip(f.text)}(${shortSession(f.session_id)})`);
42
+ }
43
+ for (const p of delta.pending) {
44
+ lines.push(`▸ 待确认候选: ${clip(p.text)}(${shortSession(p.session_id)} ${p.status ?? "pending"})`);
45
+ }
46
+ if (lines.length === 0) {
47
+ return undefined;
48
+ }
49
+ return `[Thread 状态更新(来自其他会话)]\n${lines.join("\n")}`;
50
+ }
51
+ function shortSession(sessionId) {
52
+ const cleaned = sessionId.replace(/^session-/, "");
53
+ return cleaned.slice(0, 7);
54
+ }
55
+ //# sourceMappingURL=delta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta.js","sourceRoot":"","sources":["../src/delta.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,12 @@ export declare const THREAD_VERSION = "0.0.0";
2
2
  export * from "./events.js";
3
3
  export * from "./state.js";
4
4
  export * from "./store.js";
5
+ export * from "./assets.js";
6
+ export * from "./closing.js";
7
+ export * from "./behavior-contract.js";
8
+ export * from "./delta.js";
9
+ export * from "./nav.js";
10
+ export * from "./query-tool.js";
5
11
  export * from "./light-confirm.js";
6
12
  export * from "./query.js";
7
13
  export * from "./governor.js";
package/dist/index.js CHANGED
@@ -2,6 +2,12 @@ export const THREAD_VERSION = "0.0.0";
2
2
  export * from "./events.js";
3
3
  export * from "./state.js";
4
4
  export * from "./store.js";
5
+ export * from "./assets.js";
6
+ export * from "./closing.js";
7
+ export * from "./behavior-contract.js";
8
+ export * from "./delta.js";
9
+ export * from "./nav.js";
10
+ export * from "./query-tool.js";
5
11
  export * from "./light-confirm.js";
6
12
  export * from "./query.js";
7
13
  export * from "./governor.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC"}
@@ -33,13 +33,12 @@ describe("会话隔离(B⑧)", () => {
33
33
  isolation: true,
34
34
  ts: "2026-08-15T00:00:02.000Z",
35
35
  });
36
- store.proposeDecision("iso-s1", "隔离决策:改用 yarn", {
36
+ store.addDecision("iso-s1", "隔离决策:改用 yarn", {
37
37
  scope: "project",
38
38
  projectKey: "proj-iso",
39
39
  isolation: true,
40
40
  ts: "2026-08-15T00:00:03.000Z",
41
41
  });
42
- store.confirmLatestProposed("iso-s1", { ts: "2026-08-15T00:00:04.000Z" });
43
42
  // 本会话自己可见
44
43
  expect(store.getActiveDecisions("iso-s1").some((d) => d.text.includes("yarn"))).toBe(true);
45
44
  // 其他会话(未隔离)看不到隔离内容
@@ -78,14 +77,13 @@ describe("会话隔离(B⑧)", () => {
78
77
  expect(ok).toBe(true);
79
78
  expect(store.getActiveDecisionsMerged("other-s1", "proj-iso").some((x) => x.text.includes("yarn"))).toBe(true);
80
79
  // supersede replacement 继承被 supersede 行的隔离标记
81
- store.proposeDecision("iso-s1", "待替换的隔离决策", {
80
+ const target = store.addDecision("iso-s1", "待替换的隔离决策", {
82
81
  scope: "project",
83
82
  projectKey: "proj-iso",
84
83
  isolation: true,
85
84
  ts: "2026-08-15T00:00:09.000Z",
86
85
  });
87
- store.confirmLatestProposed("iso-s1", { ts: "2026-08-15T00:00:10.000Z" });
88
- const r = store.supersedeLatestActive("iso-s1", "替换后决策", { ts: "2026-08-15T00:00:11.000Z" });
86
+ const r = store.supersedeDecisionById("iso-s1", target.id, "替换后决策", { ts: "2026-08-15T00:00:11.000Z" });
89
87
  expect(r?.replacement.isolation).toBe(1);
90
88
  });
91
89
  it("状态卡:隔离模式只显示本会话内容并标注", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"isolation.test.js","sourceRoot":"","sources":["../src/isolation.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"isolation.test.js","sourceRoot":"","sources":["../src/isolation.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { Decision, FeedbackRow, Goal, StructuredWriteOptions, ThreadStore } from "./store.js";
1
+ import type { Goal, StructuredWriteOptions, ThreadStore } from "./store.js";
2
2
  export interface TurnInput {
3
3
  user_msg?: string;
4
4
  assistant_msg?: string;
@@ -7,31 +7,13 @@ export interface GoalAction {
7
7
  text: string;
8
8
  action: "add";
9
9
  }
10
- export type DecisionAction = {
11
- action: "propose";
12
- text: string;
13
- } | {
14
- action: "confirm";
15
- } | {
16
- action: "revoke";
17
- } | {
18
- action: "supersede";
19
- text: string;
20
- };
21
- export interface FeedbackAction {
22
- text: string;
23
- kind: "preference" | "correction";
24
- }
25
10
  export interface TurnAnalysis {
26
11
  goals: GoalAction[];
27
- decisions: DecisionAction[];
28
- feedback: FeedbackAction[];
29
12
  }
30
- export declare function analyzeTurn(input: TurnInput): TurnAnalysis;
31
13
  export interface AppliedTurn {
32
14
  goals: Goal[];
33
- decisions: Decision[];
34
- feedback: FeedbackRow[];
35
15
  }
16
+ export declare function detectGoalCompletion(userMsg: string, goals: Goal[]): Goal | undefined;
17
+ export declare function analyzeTurn(input: TurnInput): TurnAnalysis;
36
18
  export declare function applyTurn(store: ThreadStore, sessionId: string, input: TurnInput, opts?: StructuredWriteOptions): AppliedTurn;
37
19
  export declare function applyAnalysis(store: ThreadStore, sessionId: string, input: TurnInput, opts?: StructuredWriteOptions): AppliedTurn;