@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.
- 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/assets.d.ts
ADDED
|
@@ -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;
|
package/dist/closing.js
ADDED
|
@@ -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"}
|
package/dist/delta.d.ts
ADDED
|
@@ -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":"AA8BA,MAAM,UAAU,aAAa,CAAC,KAAkB,EAAE,IAAuB;IACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,KAAa,EAAE,SAAmB,EAAoB,EAAE;QACnF,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY;aAC5B,OAAO,CACN,yCAAyC,KAAK,8BAA8B,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;gBAC/F,KAAK;0BACK,KAAK;;;;6BAIF,KAAK;iBACjB,CACV;aACA,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,KAAK,CAAqB,CAAC;QAC7I,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC9C,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC,QAAQ,CAAC,CAAC;QACtD,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC;QAClD,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;KACtE,CAAC;AACJ,CAAC;AAED,4CAA4C;AAC5C,oDAAoD;AACpD,SAAS,IAAI,CAAC,IAAY;IACxB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,OAAO,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAiB;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;QAC9F,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5G,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;IAChF,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACtE,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,SAAS,GAAG,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,0BAA0B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,YAAY,CAAC,SAAiB;IACrC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACnD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7B,CAAC"}
|
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"}
|
package/dist/isolation.test.js
CHANGED
|
@@ -33,13 +33,12 @@ describe("会话隔离(B⑧)", () => {
|
|
|
33
33
|
isolation: true,
|
|
34
34
|
ts: "2026-08-15T00:00:02.000Z",
|
|
35
35
|
});
|
|
36
|
-
store.
|
|
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.
|
|
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.
|
|
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":"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,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,IAAI,GAAW,CAAC;AAChB,IAAI,KAAkB,CAAC;AAEvB,SAAS,CAAC,GAAG,EAAE;IACb,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACvD,KAAK,GAAG,IAAI,WAAW,CAAC;QACtB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC;QAClC,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC;QAC1C,UAAU,EAAE,UAAU;KACvB,CAAC,CAAC;AACL,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,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CACtB,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,0BAA0B,EAAE,IAAI,EAAE,QAAQ,EAAE,EAC9F,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CACvB,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,0BAA0B,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EACzI,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE;YACzD,KAAK,EAAE,SAAS;YAChB,UAAU,EAAE,UAAU;YACtB,SAAS,EAAE,IAAI;YACf,EAAE,EAAE,0BAA0B;SAC/B,CAAC,CAAC;QACH,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"isolation.test.js","sourceRoot":"","sources":["../src/isolation.test.ts"],"names":[],"mappings":"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"}
|
package/dist/light-confirm.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
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;
|