trove-cli 0.0.0-stage → 0.3.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/LICENSE +21 -0
- package/README.md +202 -2
- package/dist/adapters/file-source.d.ts +31 -0
- package/dist/adapters/file-source.js +97 -0
- package/dist/adapters/file-source.js.map +1 -0
- package/dist/adapters/index.d.ts +34 -0
- package/dist/adapters/index.js +146 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/opencode.d.ts +30 -0
- package/dist/adapters/opencode.js +135 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/cli.d.ts +58 -0
- package/dist/cli.js +974 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +81 -0
- package/dist/config.js +99 -0
- package/dist/config.js.map +1 -0
- package/dist/core/archive.d.ts +27 -0
- package/dist/core/archive.js +101 -0
- package/dist/core/archive.js.map +1 -0
- package/dist/core/chunker.d.ts +28 -0
- package/dist/core/chunker.js +67 -0
- package/dist/core/chunker.js.map +1 -0
- package/dist/core/clean.d.ts +36 -0
- package/dist/core/clean.js +182 -0
- package/dist/core/clean.js.map +1 -0
- package/dist/core/collect.d.ts +39 -0
- package/dist/core/collect.js +194 -0
- package/dist/core/collect.js.map +1 -0
- package/dist/core/concurrency.d.ts +2 -0
- package/dist/core/concurrency.js +16 -0
- package/dist/core/concurrency.js.map +1 -0
- package/dist/core/cursor.d.ts +31 -0
- package/dist/core/cursor.js +31 -0
- package/dist/core/cursor.js.map +1 -0
- package/dist/core/events/claude.d.ts +7 -0
- package/dist/core/events/claude.js +287 -0
- package/dist/core/events/claude.js.map +1 -0
- package/dist/core/events/codex.d.ts +6 -0
- package/dist/core/events/codex.js +149 -0
- package/dist/core/events/codex.js.map +1 -0
- package/dist/core/events/doubao.d.ts +9 -0
- package/dist/core/events/doubao.js +151 -0
- package/dist/core/events/doubao.js.map +1 -0
- package/dist/core/events/index.d.ts +6 -0
- package/dist/core/events/index.js +20 -0
- package/dist/core/events/index.js.map +1 -0
- package/dist/core/events/opencode.d.ts +7 -0
- package/dist/core/events/opencode.js +189 -0
- package/dist/core/events/opencode.js.map +1 -0
- package/dist/core/events/schema.d.ts +83 -0
- package/dist/core/events/schema.js +35 -0
- package/dist/core/events/schema.js.map +1 -0
- package/dist/core/layout.d.ts +26 -0
- package/dist/core/layout.js +122 -0
- package/dist/core/layout.js.map +1 -0
- package/dist/core/lessons/analyze.d.ts +40 -0
- package/dist/core/lessons/analyze.js +107 -0
- package/dist/core/lessons/analyze.js.map +1 -0
- package/dist/core/lessons/audit.d.ts +51 -0
- package/dist/core/lessons/audit.js +57 -0
- package/dist/core/lessons/audit.js.map +1 -0
- package/dist/core/lessons/compaction.d.ts +5 -0
- package/dist/core/lessons/compaction.js +58 -0
- package/dist/core/lessons/compaction.js.map +1 -0
- package/dist/core/lessons/config.d.ts +15 -0
- package/dist/core/lessons/config.js +31 -0
- package/dist/core/lessons/config.js.map +1 -0
- package/dist/core/lessons/existing.d.ts +4 -0
- package/dist/core/lessons/existing.js +22 -0
- package/dist/core/lessons/existing.js.map +1 -0
- package/dist/core/lessons/extract.d.ts +21 -0
- package/dist/core/lessons/extract.js +106 -0
- package/dist/core/lessons/extract.js.map +1 -0
- package/dist/core/lessons/frontmatter.d.ts +29 -0
- package/dist/core/lessons/frontmatter.js +87 -0
- package/dist/core/lessons/frontmatter.js.map +1 -0
- package/dist/core/lessons/graph.d.ts +256 -0
- package/dist/core/lessons/graph.js +86 -0
- package/dist/core/lessons/graph.js.map +1 -0
- package/dist/core/lessons/jev.d.ts +36 -0
- package/dist/core/lessons/jev.js +100 -0
- package/dist/core/lessons/jev.js.map +1 -0
- package/dist/core/lessons/layout.d.ts +2 -0
- package/dist/core/lessons/layout.js +56 -0
- package/dist/core/lessons/layout.js.map +1 -0
- package/dist/core/lessons/learn.d.ts +38 -0
- package/dist/core/lessons/learn.js +190 -0
- package/dist/core/lessons/learn.js.map +1 -0
- package/dist/core/lessons/llm.d.ts +42 -0
- package/dist/core/lessons/llm.js +106 -0
- package/dist/core/lessons/llm.js.map +1 -0
- package/dist/core/lessons/memo.d.ts +19 -0
- package/dist/core/lessons/memo.js +170 -0
- package/dist/core/lessons/memo.js.map +1 -0
- package/dist/core/lessons/merge.d.ts +39 -0
- package/dist/core/lessons/merge.js +79 -0
- package/dist/core/lessons/merge.js.map +1 -0
- package/dist/core/lessons/queue.d.ts +6 -0
- package/dist/core/lessons/queue.js +52 -0
- package/dist/core/lessons/queue.js.map +1 -0
- package/dist/core/lessons/recent.d.ts +21 -0
- package/dist/core/lessons/recent.js +111 -0
- package/dist/core/lessons/recent.js.map +1 -0
- package/dist/core/lessons/schema.d.ts +26 -0
- package/dist/core/lessons/schema.js +64 -0
- package/dist/core/lessons/schema.js.map +1 -0
- package/dist/core/lessons/select.d.ts +19 -0
- package/dist/core/lessons/select.js +55 -0
- package/dist/core/lessons/select.js.map +1 -0
- package/dist/core/lessons/sidecar.d.ts +23 -0
- package/dist/core/lessons/sidecar.js +171 -0
- package/dist/core/lessons/sidecar.js.map +1 -0
- package/dist/core/lessons/storage.d.ts +21 -0
- package/dist/core/lessons/storage.js +65 -0
- package/dist/core/lessons/storage.js.map +1 -0
- package/dist/core/lessons/usage.d.ts +31 -0
- package/dist/core/lessons/usage.js +91 -0
- package/dist/core/lessons/usage.js.map +1 -0
- package/dist/core/lessons/write.d.ts +18 -0
- package/dist/core/lessons/write.js +131 -0
- package/dist/core/lessons/write.js.map +1 -0
- package/dist/core/library/build.d.ts +22 -0
- package/dist/core/library/build.js +163 -0
- package/dist/core/library/build.js.map +1 -0
- package/dist/core/library/group.d.ts +14 -0
- package/dist/core/library/group.js +129 -0
- package/dist/core/library/group.js.map +1 -0
- package/dist/core/library/index-file.d.ts +7 -0
- package/dist/core/library/index-file.js +250 -0
- package/dist/core/library/index-file.js.map +1 -0
- package/dist/core/library/schema.d.ts +78 -0
- package/dist/core/library/schema.js +37 -0
- package/dist/core/library/schema.js.map +1 -0
- package/dist/core/library/skills.d.ts +26 -0
- package/dist/core/library/skills.js +168 -0
- package/dist/core/library/skills.js.map +1 -0
- package/dist/core/library/sync.d.ts +48 -0
- package/dist/core/library/sync.js +271 -0
- package/dist/core/library/sync.js.map +1 -0
- package/dist/core/lock.d.ts +6 -0
- package/dist/core/lock.js +56 -0
- package/dist/core/lock.js.map +1 -0
- package/dist/core/pull.d.ts +23 -0
- package/dist/core/pull.js +147 -0
- package/dist/core/pull.js.map +1 -0
- package/dist/core/push.d.ts +29 -0
- package/dist/core/push.js +170 -0
- package/dist/core/push.js.map +1 -0
- package/dist/core/remote-layout.d.ts +67 -0
- package/dist/core/remote-layout.js +94 -0
- package/dist/core/remote-layout.js.map +1 -0
- package/dist/core/sessions.d.ts +29 -0
- package/dist/core/sessions.js +96 -0
- package/dist/core/sessions.js.map +1 -0
- package/dist/core/state.d.ts +94 -0
- package/dist/core/state.js +62 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/sync.d.ts +48 -0
- package/dist/core/sync.js +140 -0
- package/dist/core/sync.js.map +1 -0
- package/dist/core/time-window.d.ts +8 -0
- package/dist/core/time-window.js +36 -0
- package/dist/core/time-window.js.map +1 -0
- package/dist/daemon.d.ts +73 -0
- package/dist/daemon.js +272 -0
- package/dist/daemon.js.map +1 -0
- package/dist/format.d.ts +4 -0
- package/dist/format.js +28 -0
- package/dist/format.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +9 -0
- package/dist/main.js.map +1 -0
- package/dist/paths.d.ts +19 -0
- package/dist/paths.js +19 -0
- package/dist/paths.js.map +1 -0
- package/dist/progress-console.d.ts +12 -0
- package/dist/progress-console.js +42 -0
- package/dist/progress-console.js.map +1 -0
- package/dist/progress.d.ts +7 -0
- package/dist/progress.js +6 -0
- package/dist/progress.js.map +1 -0
- package/dist/remote/create-remote.d.ts +20 -0
- package/dist/remote/create-remote.js +86 -0
- package/dist/remote/create-remote.js.map +1 -0
- package/dist/remote/prompt.d.ts +17 -0
- package/dist/remote/prompt.js +111 -0
- package/dist/remote/prompt.js.map +1 -0
- package/dist/remote/s3-sigv4.d.ts +28 -0
- package/dist/remote/s3-sigv4.js +100 -0
- package/dist/remote/s3-sigv4.js.map +1 -0
- package/dist/remote/s3-store.d.ts +75 -0
- package/dist/remote/s3-store.js +438 -0
- package/dist/remote/s3-store.js.map +1 -0
- package/dist/remote/s3-vendors.d.ts +31 -0
- package/dist/remote/s3-vendors.js +47 -0
- package/dist/remote/s3-vendors.js.map +1 -0
- package/dist/remote/store.d.ts +44 -0
- package/dist/remote/store.js +2 -0
- package/dist/remote/store.js.map +1 -0
- package/dist/remote/webdav-store.d.ts +41 -0
- package/dist/remote/webdav-store.js +285 -0
- package/dist/remote/webdav-store.js.map +1 -0
- package/dist/sqlite.d.ts +3 -0
- package/dist/sqlite.js +12 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/status.d.ts +82 -0
- package/dist/status.js +162 -0
- package/dist/status.js.map +1 -0
- package/package.json +43 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memo.js","sourceRoot":"","sources":["../../../src/core/lessons/memo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** 阶段 6:合并与冲突处理。把候选记忆与现有记忆比对,产出 add/patch/append/skip 四种操作。 */
|
|
2
|
+
import type { MemoryCandidate } from './extract.js';
|
|
3
|
+
import type { LlmProvider } from './llm.js';
|
|
4
|
+
export interface ExistingMemory {
|
|
5
|
+
type: string;
|
|
6
|
+
path: string;
|
|
7
|
+
title: string;
|
|
8
|
+
content: string;
|
|
9
|
+
}
|
|
10
|
+
export type MemoryOp = {
|
|
11
|
+
op: 'add';
|
|
12
|
+
type: string;
|
|
13
|
+
path: string;
|
|
14
|
+
title: string;
|
|
15
|
+
content: string;
|
|
16
|
+
supersedePath?: string;
|
|
17
|
+
evidence: number[];
|
|
18
|
+
} | {
|
|
19
|
+
op: 'patch';
|
|
20
|
+
type: string;
|
|
21
|
+
path: string;
|
|
22
|
+
title: string;
|
|
23
|
+
content: string;
|
|
24
|
+
before: string;
|
|
25
|
+
} | {
|
|
26
|
+
op: 'append';
|
|
27
|
+
type: string;
|
|
28
|
+
path: string;
|
|
29
|
+
content: string;
|
|
30
|
+
} | {
|
|
31
|
+
op: 'skip';
|
|
32
|
+
type: string;
|
|
33
|
+
title: string;
|
|
34
|
+
reason: string;
|
|
35
|
+
};
|
|
36
|
+
export interface MergeDeps {
|
|
37
|
+
llm: LlmProvider;
|
|
38
|
+
}
|
|
39
|
+
export declare function mergeMemories(candidates: MemoryCandidate[], existing: ExistingMemory[], deps: MergeDeps): Promise<MemoryOp[]>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { buildFilename, getMemoryType } from './schema.js';
|
|
2
|
+
const TITLE_MIN = 10;
|
|
3
|
+
export async function mergeMemories(candidates, existing, deps) {
|
|
4
|
+
const ops = [];
|
|
5
|
+
for (const c of candidates) {
|
|
6
|
+
const op = await resolve(c, existing, deps);
|
|
7
|
+
if (op)
|
|
8
|
+
ops.push(op);
|
|
9
|
+
}
|
|
10
|
+
return ops;
|
|
11
|
+
}
|
|
12
|
+
async function resolve(c, existing, deps) {
|
|
13
|
+
const title = c.title.trim();
|
|
14
|
+
if (title.length < TITLE_MIN)
|
|
15
|
+
return { op: 'skip', type: c.type, title, reason: 'title_too_short' };
|
|
16
|
+
const schema = getMemoryType(c.type);
|
|
17
|
+
if (!schema)
|
|
18
|
+
return { op: 'skip', type: c.type, title, reason: 'unknown_type' };
|
|
19
|
+
const path = buildFilename(schema, { title, slug: c.slug });
|
|
20
|
+
const sameType = existing.filter((e) => e.type === c.type);
|
|
21
|
+
const samePath = sameType.find((e) => e.path === path);
|
|
22
|
+
if (schema.mergeOp === 'append') {
|
|
23
|
+
if (samePath) {
|
|
24
|
+
// 幂等:相同正文已存在则跳过,不重复追加(重跑/重复学习不翻倍)
|
|
25
|
+
if (samePath.content.includes(c.content.trim()))
|
|
26
|
+
return null;
|
|
27
|
+
return { op: 'append', type: c.type, path, content: c.content };
|
|
28
|
+
}
|
|
29
|
+
return { op: 'add', type: c.type, path, title, content: c.content, evidence: c.evidence };
|
|
30
|
+
}
|
|
31
|
+
if (schema.mergeOp === 'patch') {
|
|
32
|
+
if (samePath) {
|
|
33
|
+
const merged = await mergeContent(c, samePath, deps.llm);
|
|
34
|
+
return { op: 'patch', type: c.type, path, title, content: merged, before: samePath.content };
|
|
35
|
+
}
|
|
36
|
+
return { op: 'add', type: c.type, path, title, content: c.content, evidence: c.evidence };
|
|
37
|
+
}
|
|
38
|
+
// mergeOp === 'add':每条独立新建;仅结论冲突时归档旧记忆。
|
|
39
|
+
if (samePath)
|
|
40
|
+
return null; // 同类型同路径 = 重复记忆,幂等跳过(重跑不翻倍)
|
|
41
|
+
if (sameType.length > 0) {
|
|
42
|
+
const conflict = await detectConflict(c, sameType, deps.llm);
|
|
43
|
+
if (conflict)
|
|
44
|
+
return { op: 'add', type: c.type, path, title, content: c.content, supersedePath: conflict.path, evidence: c.evidence };
|
|
45
|
+
}
|
|
46
|
+
return { op: 'add', type: c.type, path, title, content: c.content, evidence: c.evidence };
|
|
47
|
+
}
|
|
48
|
+
const MERGE_SCHEMA = {
|
|
49
|
+
type: 'object',
|
|
50
|
+
properties: { content: { type: 'string' } },
|
|
51
|
+
required: ['content'],
|
|
52
|
+
};
|
|
53
|
+
async function mergeContent(c, existing, llm) {
|
|
54
|
+
const prompt = (getMemoryType(c.type)?.mergePrompt ?? '')
|
|
55
|
+
.replace('{summary}', `标题:${c.title}\n正文:${c.content}`)
|
|
56
|
+
.replace('{existing}', existing.content);
|
|
57
|
+
const raw = await llm.generate(prompt, MERGE_SCHEMA, 'learn:merge');
|
|
58
|
+
return typeof raw?.content === 'string' ? raw.content : c.content;
|
|
59
|
+
}
|
|
60
|
+
const CONFLICT_SCHEMA = {
|
|
61
|
+
type: 'object',
|
|
62
|
+
properties: { conflict: { type: 'boolean' }, path: { type: 'string' } },
|
|
63
|
+
required: ['conflict'],
|
|
64
|
+
};
|
|
65
|
+
async function detectConflict(c, sameType, llm) {
|
|
66
|
+
const prompt = [
|
|
67
|
+
`判断新记忆是否与现有记忆结论冲突。`,
|
|
68
|
+
`新记忆:标题:${c.title}\n正文:${c.content}`,
|
|
69
|
+
'现有记忆:',
|
|
70
|
+
sameType.map((e) => `- ${e.path}: ${e.content}`).join('\n'),
|
|
71
|
+
].join('\n');
|
|
72
|
+
const raw = await llm.generate(prompt, CONFLICT_SCHEMA, 'learn:conflict');
|
|
73
|
+
if (raw?.conflict !== true)
|
|
74
|
+
return null;
|
|
75
|
+
const p = typeof raw.path === 'string' ? raw.path : undefined;
|
|
76
|
+
const matched = p ? sameType.find((e) => e.path === p) : undefined;
|
|
77
|
+
return matched ?? sameType[0] ?? null;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../../src/core/lessons/merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** 读队列;文件缺失或损坏按空队处理,不拖垮调用方。 */
|
|
2
|
+
export declare function readLearnQueue(path: string): Promise<string[]>;
|
|
3
|
+
/** 追加 ids 到队尾,去重(已存在的不动);sync 每轮入队与 learn 每 tick 出队互斥。 */
|
|
4
|
+
export declare function enqueueLearn(path: string, ids: string[]): Promise<void>;
|
|
5
|
+
/** 移除指定 ids(处理完/失败都算「已处理」),保留其余。 */
|
|
6
|
+
export declare function removeLearn(path: string, ids: string[]): Promise<void>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** learn 待办队列:sync 把「本轮新会话」追加进来,learn 循环按批取出并移除。崩溃重启后不丢。 */
|
|
2
|
+
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { dirname } from 'node:path';
|
|
4
|
+
import { acquireLock } from '../lock.js';
|
|
5
|
+
/** 读队列;文件缺失或损坏按空队处理,不拖垮调用方。 */
|
|
6
|
+
export async function readLearnQueue(path) {
|
|
7
|
+
try {
|
|
8
|
+
const raw = await readFile(path, 'utf8');
|
|
9
|
+
const v = JSON.parse(raw);
|
|
10
|
+
return Array.isArray(v) ? v.filter((x) => typeof x === 'string') : [];
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async function writeLearnQueue(path, ids) {
|
|
17
|
+
await mkdir(dirname(path), { recursive: true });
|
|
18
|
+
const tmp = `${path}.tmp-${Math.random().toString(36).slice(2)}`;
|
|
19
|
+
await writeFile(tmp, JSON.stringify(ids, null, 2) + '\n', 'utf8');
|
|
20
|
+
await rename(tmp, path);
|
|
21
|
+
}
|
|
22
|
+
/** 追加 ids 到队尾,去重(已存在的不动);sync 每轮入队与 learn 每 tick 出队互斥。 */
|
|
23
|
+
export async function enqueueLearn(path, ids) {
|
|
24
|
+
if (ids.length === 0)
|
|
25
|
+
return;
|
|
26
|
+
const release = await acquireLock(`${path}.lock`);
|
|
27
|
+
try {
|
|
28
|
+
const existing = await readLearnQueue(path);
|
|
29
|
+
const seen = new Set(existing);
|
|
30
|
+
for (const id of ids)
|
|
31
|
+
seen.add(id);
|
|
32
|
+
await writeLearnQueue(path, [...seen]);
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
await release();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** 移除指定 ids(处理完/失败都算「已处理」),保留其余。 */
|
|
39
|
+
export async function removeLearn(path, ids) {
|
|
40
|
+
if (ids.length === 0)
|
|
41
|
+
return;
|
|
42
|
+
const release = await acquireLock(`${path}.lock`);
|
|
43
|
+
try {
|
|
44
|
+
const existing = await readLearnQueue(path);
|
|
45
|
+
const drop = new Set(ids);
|
|
46
|
+
await writeLearnQueue(path, existing.filter((id) => !drop.has(id)));
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
await release();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/core/lessons/queue.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,+BAA+B;AAC/B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QACrC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,GAAa;IACxD,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,GAAG,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAClE,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,GAAa;IAC5D,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC7B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,KAAK,MAAM,EAAE,IAAI,GAAG;YAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED,oCAAoC;AACpC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,GAAa;IAC3D,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC7B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { LibraryIndex, MergedSession } from '../library/schema.js';
|
|
2
|
+
import type { LessonProviderDeps, ExtractionOutcome } from './learn.js';
|
|
3
|
+
/** 按 startedAt 降序取最近 limit 个会话;缺 startedAt 的排到末尾(视为最旧)。 */
|
|
4
|
+
export declare function pickRecentSessions(index: LibraryIndex, limit?: number): MergedSession[];
|
|
5
|
+
/** 项目聚类统计:同类(cwd 尾两段)会话的频繁度与规模,供「近期方向」区分一次性 vs 常驻。 */
|
|
6
|
+
export interface ProjectStat {
|
|
7
|
+
count: number;
|
|
8
|
+
first?: string;
|
|
9
|
+
last?: string;
|
|
10
|
+
events: number;
|
|
11
|
+
}
|
|
12
|
+
/** 全量索引按项目聚类:会话数、首次/最近时间、累计事件数。无 cwd 不聚类(视为一次性)。 */
|
|
13
|
+
export declare function buildProjectStats(index: LibraryIndex): Map<string, ProjectStat>;
|
|
14
|
+
/** 渲染最近会话清单:每行 日期 | 项目 | 主题 | 频繁度,交给 mergePrompt 让 LLM 分档总结方向。 */
|
|
15
|
+
export declare function renderRecentList(sessions: MergedSession[], stats?: Map<string, ProjectStat>): string;
|
|
16
|
+
/** 输入指纹:最近会话的身份+时间+事件规模,新会话、排序或规模变化即变;用于滚动幂等,输入不变不重跑 LLM。 */
|
|
17
|
+
export declare function recentInputHash(sessions: MergedSession[]): string;
|
|
18
|
+
/** recent 渠道编排:幂等键 audit/recent-matters.json 的 inputHash 字段,hash 不变则 skip(滚动不无谓烧 token)。 */
|
|
19
|
+
export declare function learnRecentMatters(vaultRoot: string, deps?: LessonProviderDeps, opts?: {
|
|
20
|
+
force?: boolean;
|
|
21
|
+
}): Promise<ExtractionOutcome>;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/** 「近期方向」跨会话聚合:从统一索引取最近 N 个会话的时间/项目(cwd)/主题(firstText),
|
|
2
|
+
* 渲染成清单交给 merge 层用 recent_matters 的 mergePrompt 重写全文,落盘 preferences/recent_matters.md。
|
|
3
|
+
* 与单会话 extract(recent_matters 已从中移除)互补:后者抽「当下这个会话」,这里总结「最近整体方向」。 */
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
5
|
+
import { libraryLessonsDir } from '../layout.js';
|
|
6
|
+
import { loadLibraryIndex, rebuildUnifiedIndex } from '../library/index-file.js';
|
|
7
|
+
import { ensureLessonsLayout } from './layout.js';
|
|
8
|
+
import { LocalStorageAdapter } from './storage.js';
|
|
9
|
+
import { readLlmConfig } from './config.js';
|
|
10
|
+
import { DeepSeekLlm } from './llm.js';
|
|
11
|
+
import { loadExistingMemories } from './existing.js';
|
|
12
|
+
import { mergeMemories } from './merge.js';
|
|
13
|
+
import { applyOperations } from './write.js';
|
|
14
|
+
import { buildMemoryDiff, readSessionDiff, writeMemoryDiff } from './audit.js';
|
|
15
|
+
/** 聚合窗口:最近多少个会话参与「近期方向」总结。shortcut: 要调再抽配置。 */
|
|
16
|
+
const RECENT_SESSION_LIMIT = 30;
|
|
17
|
+
/** 按 startedAt 降序取最近 limit 个会话;缺 startedAt 的排到末尾(视为最旧)。 */
|
|
18
|
+
export function pickRecentSessions(index, limit = RECENT_SESSION_LIMIT) {
|
|
19
|
+
return Object.values(index.sessions)
|
|
20
|
+
.sort((a, b) => ((b.startedAt ?? '') > (a.startedAt ?? '') ? 1 : -1))
|
|
21
|
+
.slice(0, limit);
|
|
22
|
+
}
|
|
23
|
+
/** 项目标识:cwd 取最后两段(如 orca/trove、du/teamwork-repos),去掉 /Users/admin 等前缀噪音;无 cwd 返回空串。 */
|
|
24
|
+
function projectOf(cwd) {
|
|
25
|
+
if (!cwd)
|
|
26
|
+
return '';
|
|
27
|
+
return cwd.split('/').filter(Boolean).slice(-2).join('/');
|
|
28
|
+
}
|
|
29
|
+
/** 主题:firstText 优先,按码点截断到 100 字(不切断 emoji 代理对);空则回退 title。 */
|
|
30
|
+
function topicOf(s) {
|
|
31
|
+
const t = (s.firstText ?? s.title ?? '').trim().replace(/\s+/g, ' ');
|
|
32
|
+
return t.length > 100 ? `${[...t].slice(0, 100).join('')}…` : t;
|
|
33
|
+
}
|
|
34
|
+
/** 会话事件总数:variants 求和,作为「投入规模」信号(讨论深浅)。 */
|
|
35
|
+
function totalEvents(s) {
|
|
36
|
+
return s.variants.reduce((n, v) => n + v.events, 0);
|
|
37
|
+
}
|
|
38
|
+
/** 全量索引按项目聚类:会话数、首次/最近时间、累计事件数。无 cwd 不聚类(视为一次性)。 */
|
|
39
|
+
export function buildProjectStats(index) {
|
|
40
|
+
const map = new Map();
|
|
41
|
+
for (const s of Object.values(index.sessions)) {
|
|
42
|
+
const project = projectOf(s.cwd);
|
|
43
|
+
if (!project)
|
|
44
|
+
continue;
|
|
45
|
+
const st = map.get(project) ?? { count: 0, events: 0 };
|
|
46
|
+
st.count += 1;
|
|
47
|
+
st.events += totalEvents(s);
|
|
48
|
+
const t = s.startedAt;
|
|
49
|
+
if (t) {
|
|
50
|
+
if (!st.first || t < st.first)
|
|
51
|
+
st.first = t;
|
|
52
|
+
if (!st.last || t > st.last)
|
|
53
|
+
st.last = t;
|
|
54
|
+
}
|
|
55
|
+
map.set(project, st);
|
|
56
|
+
}
|
|
57
|
+
return map;
|
|
58
|
+
}
|
|
59
|
+
/** 单行第 4 段:频繁度(同类次数·首末时间)与事件规模;无 stats 时只标事件数。 */
|
|
60
|
+
function freqLabel(s, stats) {
|
|
61
|
+
const project = projectOf(s.cwd);
|
|
62
|
+
const st = project ? stats?.get(project) : undefined;
|
|
63
|
+
const parts = [];
|
|
64
|
+
if (st && st.count > 1) {
|
|
65
|
+
parts.push(`同类 ${st.count} 次`);
|
|
66
|
+
if (st.first && st.last && st.first !== st.last)
|
|
67
|
+
parts.push(`${st.first.slice(0, 10)}~${st.last.slice(0, 10)}`);
|
|
68
|
+
}
|
|
69
|
+
parts.push(`事件 ${totalEvents(s)} 条`);
|
|
70
|
+
return parts.join(' · ');
|
|
71
|
+
}
|
|
72
|
+
/** 渲染最近会话清单:每行 日期 | 项目 | 主题 | 频繁度,交给 mergePrompt 让 LLM 分档总结方向。 */
|
|
73
|
+
export function renderRecentList(sessions, stats) {
|
|
74
|
+
const lines = sessions.map((s) => {
|
|
75
|
+
const date = (s.startedAt ?? '').slice(0, 10) || '(无时间)';
|
|
76
|
+
const project = projectOf(s.cwd) || '(项目未知)';
|
|
77
|
+
const topic = topicOf(s) || '(无主题)';
|
|
78
|
+
return `- ${date} | ${project} | ${topic} | ${freqLabel(s, stats)}`;
|
|
79
|
+
});
|
|
80
|
+
return ['以下为最近会话清单(按时间倒序):', ...lines].join('\n');
|
|
81
|
+
}
|
|
82
|
+
/** 输入指纹:最近会话的身份+时间+事件规模,新会话、排序或规模变化即变;用于滚动幂等,输入不变不重跑 LLM。 */
|
|
83
|
+
export function recentInputHash(sessions) {
|
|
84
|
+
const body = sessions.map((s) => `${s.harness}:${s.session}@${s.startedAt ?? ''}#${totalEvents(s)}`).join('\n');
|
|
85
|
+
return createHash('sha256').update(body).digest('hex');
|
|
86
|
+
}
|
|
87
|
+
/** recent 渠道编排:幂等键 audit/recent-matters.json 的 inputHash 字段,hash 不变则 skip(滚动不无谓烧 token)。 */
|
|
88
|
+
export async function learnRecentMatters(vaultRoot, deps = {}, opts = {}) {
|
|
89
|
+
await ensureLessonsLayout(vaultRoot);
|
|
90
|
+
const storage = new LocalStorageAdapter(libraryLessonsDir(vaultRoot));
|
|
91
|
+
const index = (await loadLibraryIndex(vaultRoot)) ?? (await rebuildUnifiedIndex(vaultRoot));
|
|
92
|
+
const sessions = pickRecentSessions(index);
|
|
93
|
+
if (sessions.length === 0)
|
|
94
|
+
return { skipReason: 'no_sessions' };
|
|
95
|
+
const hash = recentInputHash(sessions);
|
|
96
|
+
const prev = await readSessionDiff(storage, 'recent-matters');
|
|
97
|
+
if (!opts.force && prev?.inputHash === hash)
|
|
98
|
+
return { skipReason: 'unchanged' };
|
|
99
|
+
const llm = deps.llm ?? new DeepSeekLlm(readLlmConfig(deps.config));
|
|
100
|
+
const candidates = [
|
|
101
|
+
{ type: 'preferences/recent_matters', title: '用户近期工作方向聚合', content: renderRecentList(sessions, buildProjectStats(index)), evidence: [] },
|
|
102
|
+
];
|
|
103
|
+
const existing = await loadExistingMemories(storage);
|
|
104
|
+
const ops = await mergeMemories(candidates, existing, { llm });
|
|
105
|
+
await applyOperations(ops, { storage, now: deps.now, source: 'recent-matters' });
|
|
106
|
+
const diff = buildMemoryDiff(ops, { sessionId: 'recent-matters', project: 'cross-session' });
|
|
107
|
+
const withHash = { ...diff, inputHash: hash };
|
|
108
|
+
await writeMemoryDiff(withHash, storage);
|
|
109
|
+
return { diff: withHash };
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=recent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recent.js","sourceRoot":"","sources":["../../../src/core/lessons/recent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** 17 类记忆类型的 Schema 定义与校验。类型标识 key 统一用复数目录前缀(0.2 口径)。 */
|
|
2
|
+
export type MergeOp = 'add' | 'patch' | 'append';
|
|
3
|
+
export interface MemoryTypeSchema {
|
|
4
|
+
/** 唯一标识,如 `experiences/debug_pattern`。 */
|
|
5
|
+
key: string;
|
|
6
|
+
/** 一级目录,用于 INDEX 分区:preferences/entities/experiences/events/resources。 */
|
|
7
|
+
category: string;
|
|
8
|
+
/** 相对 lessons 根的文件名模板,含 `{slug}`/`{name}` 占位符或 `YYYY-MM-DD`。 */
|
|
9
|
+
filename: string;
|
|
10
|
+
mergeOp: MergeOp;
|
|
11
|
+
/** 提取提示词,引用 `{summary}`/`{events}` 占位符。 */
|
|
12
|
+
extractionPrompt: string;
|
|
13
|
+
/** 合并提示词,仅 patch 类需要,引用 `{summary}`/`{existing}`。 */
|
|
14
|
+
mergePrompt?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function validateMemoryTypes(defs: MemoryTypeSchema[]): void;
|
|
17
|
+
export declare function listMemoryTypes(): MemoryTypeSchema[];
|
|
18
|
+
export declare function getMemoryType(key: string): MemoryTypeSchema | undefined;
|
|
19
|
+
/** 语义化 slug:小写、非法字符折成 `-`,保留 Unicode 字母数字(中文)。 */
|
|
20
|
+
export declare function slugify(title: string): string;
|
|
21
|
+
export declare function buildFilename(schema: MemoryTypeSchema, opts?: {
|
|
22
|
+
title?: string;
|
|
23
|
+
slug?: string;
|
|
24
|
+
name?: string;
|
|
25
|
+
date?: string;
|
|
26
|
+
}): string;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/** 17 类记忆类型的 Schema 定义与校验。类型标识 key 统一用复数目录前缀(0.2 口径)。 */
|
|
2
|
+
function ex(kind) {
|
|
3
|
+
return `从会话 {summary} 与事件 {events} 中提取 ${kind} 相关记忆。`;
|
|
4
|
+
}
|
|
5
|
+
function merge(kind) {
|
|
6
|
+
return `把新提取的 ${kind} 相关 {summary} 合并进现有 {existing},去重、冲突以新为准、保留 evidence。`;
|
|
7
|
+
}
|
|
8
|
+
const DEFS = [
|
|
9
|
+
// 偏好 5 类(patch 合并到固定文件):画像聚焦「当前使用用户」,其余各司其职
|
|
10
|
+
{ key: 'preferences/profile', category: 'preferences', filename: 'preferences/profile.md', mergeOp: 'patch', extractionPrompt: '围绕「当前使用用户」做用户画像:提取用户信息,覆盖 我是谁(姓名/身份)、年龄、职责(岗位/角色)、工作背景(经历/技术方向)、人际关系(同事/上下级/合作方)。只写会话中真实出现且确定的信息,推断或空值不写。', mergePrompt: '把新提取的用户画像 {summary} 合并进现有 {existing}:按 我是谁/年龄/职责/工作背景/人际关系 补齐缺失维度,同维度以新为准,去重并保留 evidence,不丢既有有效信息。' },
|
|
11
|
+
{ key: 'preferences/coding_style', category: 'preferences', filename: 'preferences/coding_style.md', mergeOp: 'patch', extractionPrompt: '编码风格:用户偏好的代码规范、命名、注释、语言/框架取舍与工程习惯(测试、类型、目录结构等)。', mergePrompt: merge('编码风格') },
|
|
12
|
+
{ key: 'preferences/writing_style', category: 'preferences', filename: 'preferences/writing_style.md', mergeOp: 'patch', extractionPrompt: '写作风格:用户偏好的语言(简体中文等)、语气、排版、用词与行文习惯。', mergePrompt: merge('写作风格') },
|
|
13
|
+
{ key: 'preferences/dialogue_style', category: 'preferences', filename: 'preferences/dialogue_style.md', mergeOp: 'patch', extractionPrompt: '对话风格:用户对 AI 回复的称呼、口吻、详略与格式(列表/代码块、是否解释步骤)等偏好。', mergePrompt: merge('对话风格') },
|
|
14
|
+
{ key: 'preferences/recent_matters', category: 'preferences', filename: 'preferences/recent_matters.md', mergeOp: 'patch', extractionPrompt: '最近事项:由跨会话聚合(recent.ts)按时间+项目+主题生成,不走单会话提取。', mergePrompt: '根据最近会话清单 {summary} 重写用户近期工作方向 {existing}。清单按会话时间倒序,每行含 日期|项目(cwd)|主题|频繁度(同类会话数·首次~最近时间·事件条数)。据此把近期事项分三档组织:①持续方向(同项目反复出现,同类≥2次或时间跨度长,长期推进);②近期一次性(仅1次、规模小,临时问题);③高优先级(对公司业务或个人很重要:上线、事故、决策、面试、健康、家庭等,结合主题文本判断重要性)。每档内按讨论频繁度与最近时间排序;已完成或久未出现的旧方向可移除,保持「近期」时效。' },
|
|
15
|
+
// 实体 5 类(卡片式,同名合并)
|
|
16
|
+
{ key: 'entities/project', category: 'entities', filename: 'entities/projects/{slug}/overview.md', mergeOp: 'patch', extractionPrompt: ex('项目'), mergePrompt: merge('项目') },
|
|
17
|
+
{ key: 'entities/people', category: 'entities', filename: 'entities/people/{name}.md', mergeOp: 'patch', extractionPrompt: ex('人物'), mergePrompt: merge('人物') },
|
|
18
|
+
{ key: 'entities/organization', category: 'entities', filename: 'entities/organizations/{name}.md', mergeOp: 'patch', extractionPrompt: ex('组织'), mergePrompt: merge('组织') },
|
|
19
|
+
{ key: 'entities/tool', category: 'entities', filename: 'entities/tools/{name}.md', mergeOp: 'patch', extractionPrompt: ex('工具'), mergePrompt: merge('工具') },
|
|
20
|
+
{ key: 'entities/tech', category: 'entities', filename: 'entities/tech/{name}.md', mergeOp: 'patch', extractionPrompt: ex('技术栈'), mergePrompt: merge('技术栈') },
|
|
21
|
+
// 经验 4 类(debug/gotcha/correction 独立 add;workflow 合并 patch)
|
|
22
|
+
{ key: 'experiences/debug_pattern', category: 'experiences', filename: 'experiences/debug-{slug}.md', mergeOp: 'add', extractionPrompt: ex('调试模式(错误现象→根因→解法)') },
|
|
23
|
+
{ key: 'experiences/workflow', category: 'experiences', filename: 'experiences/workflow-{slug}.md', mergeOp: 'patch', extractionPrompt: ex('操作流程'), mergePrompt: merge('操作流程') },
|
|
24
|
+
{ key: 'experiences/gotcha', category: 'experiences', filename: 'experiences/gotcha-{slug}.md', mergeOp: 'add', extractionPrompt: ex('陷阱坑') },
|
|
25
|
+
{ key: 'experiences/correction', category: 'experiences', filename: 'experiences/correction-{slug}.md', mergeOp: 'add', extractionPrompt: ex('纠正教训(用户纠正了 AI 什么)') },
|
|
26
|
+
// 决策 1 类(add 独立,不合并)
|
|
27
|
+
{ key: 'events/decision', category: 'events', filename: 'events/YYYY-MM-DD-decided-{slug}.md', mergeOp: 'add', extractionPrompt: ex('决策(用户拍板的方向/取舍)') },
|
|
28
|
+
// 资源 3 类(append 追加,不去重)
|
|
29
|
+
{ key: 'resources/doc', category: 'resources', filename: 'resources/docs/{slug}.md', mergeOp: 'append', extractionPrompt: ex('文档资源') },
|
|
30
|
+
{ key: 'resources/repo', category: 'resources', filename: 'resources/repos/{slug}.md', mergeOp: 'append', extractionPrompt: ex('代码仓库资源') },
|
|
31
|
+
{ key: 'resources/link', category: 'resources', filename: 'resources/links/{slug}.md', mergeOp: 'append', extractionPrompt: ex('链接资源') },
|
|
32
|
+
];
|
|
33
|
+
export function validateMemoryTypes(defs) {
|
|
34
|
+
for (const d of defs) {
|
|
35
|
+
if (!d.key || !d.category || !d.filename || !d.mergeOp) {
|
|
36
|
+
throw new Error(`Memory Schema 缺字段:${JSON.stringify(d)}`);
|
|
37
|
+
}
|
|
38
|
+
if (!d.extractionPrompt)
|
|
39
|
+
throw new Error(`缺少提取提示词:${d.key}`);
|
|
40
|
+
if (d.mergeOp === 'patch' && !d.mergePrompt)
|
|
41
|
+
throw new Error(`缺少合并提示词:${d.key}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function listMemoryTypes() {
|
|
45
|
+
validateMemoryTypes(DEFS);
|
|
46
|
+
return DEFS;
|
|
47
|
+
}
|
|
48
|
+
export function getMemoryType(key) {
|
|
49
|
+
return listMemoryTypes().find((t) => t.key === key);
|
|
50
|
+
}
|
|
51
|
+
/** 语义化 slug:小写、非法字符折成 `-`,保留 Unicode 字母数字(中文)。 */
|
|
52
|
+
export function slugify(title) {
|
|
53
|
+
const s = title.toLowerCase().replace(/[^\p{L}\p{N}]+/gu, '-').replace(/^-+|-+$/g, '');
|
|
54
|
+
return s || 'item';
|
|
55
|
+
}
|
|
56
|
+
export function buildFilename(schema, opts = {}) {
|
|
57
|
+
const slug = opts.slug ?? slugify(opts.title ?? '');
|
|
58
|
+
const date = opts.date ?? new Date().toISOString().slice(0, 10);
|
|
59
|
+
return schema.filename
|
|
60
|
+
.replace(/\{slug\}/g, slug)
|
|
61
|
+
.replace(/\{name\}/g, opts.name ?? slug)
|
|
62
|
+
.replace(/YYYY-MM-DD/g, date);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/core/lessons/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** 会话选择(Stage 3):只排除「仍在进行中」的会话;然后过滤掉噪音事件,保留完整对话内容(文字永不删),瘦身交给后续 Jev 压缩。纯确定性,不调模型。 */
|
|
2
|
+
import type { Event } from '../events/schema.js';
|
|
3
|
+
export type SkipReason = 'in_progress';
|
|
4
|
+
export type SessionSelection = {
|
|
5
|
+
status: 'selected';
|
|
6
|
+
events: Event[];
|
|
7
|
+
} | {
|
|
8
|
+
status: 'skipped';
|
|
9
|
+
reason: SkipReason;
|
|
10
|
+
};
|
|
11
|
+
export declare function selectSession(events: Event[], now?: Date): SessionSelection;
|
|
12
|
+
/** 超长文本截断:前 600 + `...` + 后 600;省略标记 3 字符,叠在 1200 内容预算之上。按码点切,emoji 等代理对不会被劈开(按码元切会产生孤立代理项,导致 JSON.stringify 输出非法 \udXXX 转义)。 */
|
|
13
|
+
export declare function truncateText(text: string): string;
|
|
14
|
+
/** 有内容事件:user/assistant 文字消息、tool_call、tool_result(成功与失败都保留)。system/reasoning/meta 等模板噪音在此丢弃。 */
|
|
15
|
+
export declare function isContentfulEvent(e: Event): boolean;
|
|
16
|
+
export declare function filterEvents(events: Event[]): Event[];
|
|
17
|
+
/** 按 seq 排序后取首尾各 40(≤80 条);≤80 时原样返回(已排序)。 */
|
|
18
|
+
export declare function truncateEvents(events: Event[]): Event[];
|
|
19
|
+
export declare function truncateEvent(e: Event): Event;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export function selectSession(events, now = new Date()) {
|
|
2
|
+
if (now.getTime() - updatedAtMs(events) < 5 * 60 * 1000) {
|
|
3
|
+
return { status: 'skipped', reason: 'in_progress' };
|
|
4
|
+
}
|
|
5
|
+
return { status: 'selected', events: filterEvents(events) };
|
|
6
|
+
}
|
|
7
|
+
/** 会话最后活动时间 = 事件里最大的可解析 ts(毫秒);无有效 ts 记为 0,视为早就结束。 */
|
|
8
|
+
function updatedAtMs(events) {
|
|
9
|
+
let max = 0;
|
|
10
|
+
for (const e of events) {
|
|
11
|
+
const t = Date.parse(e.ts ?? '');
|
|
12
|
+
if (Number.isFinite(t) && t > max)
|
|
13
|
+
max = t;
|
|
14
|
+
}
|
|
15
|
+
return max;
|
|
16
|
+
}
|
|
17
|
+
const TRUNCATE_MAX = 1200;
|
|
18
|
+
/** 超长文本截断:前 600 + `...` + 后 600;省略标记 3 字符,叠在 1200 内容预算之上。按码点切,emoji 等代理对不会被劈开(按码元切会产生孤立代理项,导致 JSON.stringify 输出非法 \udXXX 转义)。 */
|
|
19
|
+
export function truncateText(text) {
|
|
20
|
+
if (text.length <= TRUNCATE_MAX)
|
|
21
|
+
return text;
|
|
22
|
+
const chars = [...text];
|
|
23
|
+
return chars.length <= TRUNCATE_MAX ? text : `${chars.slice(0, 600).join('')}...${chars.slice(-600).join('')}`;
|
|
24
|
+
}
|
|
25
|
+
/** 有内容事件:user/assistant 文字消息、tool_call、tool_result(成功与失败都保留)。system/reasoning/meta 等模板噪音在此丢弃。 */
|
|
26
|
+
export function isContentfulEvent(e) {
|
|
27
|
+
if (e.kind === 'message')
|
|
28
|
+
return e.role === 'user' || e.role === 'assistant';
|
|
29
|
+
if (e.kind === 'tool_call')
|
|
30
|
+
return true;
|
|
31
|
+
if (e.kind === 'tool_result')
|
|
32
|
+
return true;
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
export function filterEvents(events) {
|
|
36
|
+
return events.filter(isContentfulEvent);
|
|
37
|
+
}
|
|
38
|
+
/** 按 seq 排序后取首尾各 40(≤80 条);≤80 时原样返回(已排序)。 */
|
|
39
|
+
export function truncateEvents(events) {
|
|
40
|
+
const sorted = [...events].sort((a, b) => a.seq - b.seq);
|
|
41
|
+
if (sorted.length <= 80)
|
|
42
|
+
return sorted;
|
|
43
|
+
return [...sorted.slice(0, 40), ...sorted.slice(-40)];
|
|
44
|
+
}
|
|
45
|
+
// shortcut: 只截断顶层 text 与字符串 result.output,parts/tool.input 不截,等阶段 5 需要时再补。
|
|
46
|
+
export function truncateEvent(e) {
|
|
47
|
+
const out = { ...e };
|
|
48
|
+
if (out.text)
|
|
49
|
+
out.text = truncateText(out.text);
|
|
50
|
+
if (typeof out.result?.output === 'string') {
|
|
51
|
+
out.result = { ...out.result, output: truncateText(out.result.output) };
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../../src/core/lessons/select.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Sidecar 分层存储(L0/L1/L2):为 lessons 各目录生成 .abstract.md(L0) 与 .overview.md(L1),自底向上刷新。 */
|
|
2
|
+
import type { StorageAdapter } from './storage.js';
|
|
3
|
+
export interface SidecarDir {
|
|
4
|
+
/** 相对 lessons 根的目录路径;根为 ''。 */
|
|
5
|
+
path: string;
|
|
6
|
+
/** H1 标题(也是该目录的中文名)。 */
|
|
7
|
+
name: string;
|
|
8
|
+
/** 一句话简介(= L0 正文,亦为 L1 的 Brief)。 */
|
|
9
|
+
brief: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const SIDECAR_DIRS: SidecarDir[];
|
|
12
|
+
/** 从 L1 提取 Brief(H1 之后、首个 ## 之前的那段话),作为 L0 正文的唯一来源。 */
|
|
13
|
+
export declare function extractBrief(overviewText: string): string;
|
|
14
|
+
/** 强制重建根 + 5 大类目录的 sidecar;返回写入的相对路径。 */
|
|
15
|
+
export declare function refreshSidecars(storage: StorageAdapter, opts?: {
|
|
16
|
+
trigger?: string;
|
|
17
|
+
now?: () => Date;
|
|
18
|
+
}): Promise<string[]>;
|
|
19
|
+
/** 写入记忆后标记目录变脏:L0/L1 未跨 10% 阈值时只递增 pending,否则整目录刷新。 */
|
|
20
|
+
export declare function touchSidecars(storage: StorageAdapter, dirPaths: string[], opts?: {
|
|
21
|
+
trigger?: string;
|
|
22
|
+
now?: () => Date;
|
|
23
|
+
}): Promise<string[]>;
|