kimi-code-memory-mcp-server 0.1.0 → 0.1.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/CHANGELOG.md +29 -1
- package/README.en.md +342 -0
- package/README.md +267 -125
- package/assets/contextFlow.svg +144 -0
- package/assets/user-agents.md +111 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.js +13 -0
- package/dist/config.js.map +1 -1
- package/dist/context/wire-context.d.ts +3 -0
- package/dist/context/wire-context.js +20 -50
- package/dist/context/wire-context.js.map +1 -1
- package/dist/dao/constants.d.ts +33 -0
- package/dist/dao/constants.js +17 -0
- package/dist/dao/constants.js.map +1 -0
- package/dist/dao/index-catalog.d.ts +19 -0
- package/dist/dao/index-catalog.js +94 -0
- package/dist/dao/index-catalog.js.map +1 -0
- package/dist/dao/index-reconciler.d.ts +13 -0
- package/dist/dao/index-reconciler.js +162 -0
- package/dist/dao/index-reconciler.js.map +1 -0
- package/dist/dao/index-store.d.ts +31 -0
- package/dist/dao/index-store.js +128 -0
- package/dist/dao/index-store.js.map +1 -0
- package/dist/dao/index.d.ts +12 -31
- package/dist/dao/index.js +50 -404
- package/dist/dao/index.js.map +1 -1
- package/dist/dao/memory-store.js +2 -10
- package/dist/dao/memory-store.js.map +1 -1
- package/dist/dao/memory-tree-renderer.d.ts +22 -0
- package/dist/dao/memory-tree-renderer.js +75 -0
- package/dist/dao/memory-tree-renderer.js.map +1 -0
- package/dist/prompts/index.d.ts +26 -0
- package/dist/prompts/index.js +103 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/refine/adapter.d.ts +6 -0
- package/dist/refine/adapter.js +28 -0
- package/dist/refine/adapter.js.map +1 -0
- package/dist/refine/constants.d.ts +35 -0
- package/dist/refine/constants.js +107 -0
- package/dist/refine/constants.js.map +1 -0
- package/dist/refine/extractor.d.ts +12 -0
- package/dist/refine/extractor.js +122 -0
- package/dist/refine/extractor.js.map +1 -0
- package/dist/refine/store.d.ts +19 -0
- package/dist/refine/store.js +139 -0
- package/dist/refine/store.js.map +1 -0
- package/dist/refine/types.d.ts +56 -0
- package/dist/refine/types.js +5 -0
- package/dist/refine/types.js.map +1 -0
- package/dist/refined-manager.d.ts +10 -56
- package/dist/refined-manager.js +22 -341
- package/dist/refined-manager.js.map +1 -1
- package/dist/resources/index.d.ts +15 -0
- package/dist/resources/index.js +134 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server.js +46 -2
- package/dist/server.js.map +1 -1
- package/dist/setup-cli.d.ts +11 -0
- package/dist/setup-cli.js +84 -0
- package/dist/setup-cli.js.map +1 -0
- package/dist/setup.d.ts +33 -0
- package/dist/setup.js +206 -0
- package/dist/setup.js.map +1 -0
- package/dist/tools/context-tools.d.ts +16 -51
- package/dist/tools/context-tools.js +247 -55
- package/dist/tools/context-tools.js.map +1 -1
- package/dist/tools/index.d.ts +5 -827
- package/dist/tools/index.js +23 -354
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/memory-tools.d.ts +4 -60
- package/dist/tools/memory-tools.js +129 -79
- package/dist/tools/memory-tools.js.map +1 -1
- package/dist/tools/system-tools.d.ts +3 -34
- package/dist/tools/system-tools.js +86 -32
- package/dist/tools/system-tools.js.map +1 -1
- package/dist/tools/theme-tools.d.ts +3 -31
- package/dist/tools/theme-tools.js +78 -22
- package/dist/tools/theme-tools.js.map +1 -1
- package/dist/tools/types.d.ts +21 -0
- package/dist/tools/types.js +13 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/types.d.ts +4 -2
- package/dist/utils/action-entities.d.ts +16 -0
- package/dist/utils/action-entities.js +35 -0
- package/dist/utils/action-entities.js.map +1 -0
- package/dist/utils/date.d.ts +11 -0
- package/dist/utils/date.js +13 -0
- package/dist/utils/date.js.map +1 -0
- package/dist/utils/file-helpers.d.ts +10 -0
- package/dist/utils/file-helpers.js +28 -0
- package/dist/utils/file-helpers.js.map +1 -0
- package/dist/utils/headings.d.ts +5 -0
- package/dist/utils/headings.js +21 -0
- package/dist/utils/headings.js.map +1 -0
- package/dist/utils/search.d.ts +17 -0
- package/dist/utils/search.js +60 -0
- package/dist/utils/search.js.map +1 -0
- package/dist/utils/tools.d.ts +5 -0
- package/dist/utils/tools.js +10 -0
- package/dist/utils/tools.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/vis/api.d.ts +82 -0
- package/dist/vis/api.js +212 -0
- package/dist/vis/api.js.map +1 -0
- package/dist/vis/auto-start.d.ts +12 -0
- package/dist/vis/auto-start.js +87 -0
- package/dist/vis/auto-start.js.map +1 -0
- package/dist/vis/server.d.ts +14 -0
- package/dist/vis/server.js +103 -0
- package/dist/vis/server.js.map +1 -0
- package/dist/vis/static/app.js +395 -0
- package/dist/vis/static/index.html +95 -0
- package/dist/vis/static/style.css +707 -0
- package/dist/vis-cli.d.ts +7 -0
- package/dist/vis-cli.js +140 -0
- package/dist/vis-cli.js.map +1 -0
- package/docs/0.agent-memory-market-research.md +354 -0
- package/docs/1.memory-system-proposal-for-kimi-code.md +688 -0
- package/docs/2.memory-architecture-overview.md +417 -0
- package/docs/3.memory-skill-prompt-design.md +430 -0
- package/docs/4.kimi-code-native-evolution-roadmap.md +559 -0
- package/docs/5.decision-guard-design-notes.md +500 -0
- package/docs/ARCHITECTURE.md +2 -2
- package/docs/design-story.md +350 -0
- package/docs/three-layer-memory-model.md +153 -0
- package/docs/three-layer-memory-model.zh-CN.md +153 -0
- package/package.json +14 -6
- package/README.zh-CN.md +0 -227
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure renderer: turns a TreeNode data structure into an ASCII memory index tree.
|
|
3
|
+
*
|
|
4
|
+
* This module performs no file I/O; callers are responsible for building the
|
|
5
|
+
* TreeNode (including timestamps used for `[new]` markers).
|
|
6
|
+
*/
|
|
7
|
+
export class MemoryIndexTreeRenderer {
|
|
8
|
+
render(root, recentLimit = 5) {
|
|
9
|
+
const timeEntries = [];
|
|
10
|
+
const collectTimes = (node, nodePath) => {
|
|
11
|
+
for (const file of node.files) {
|
|
12
|
+
timeEntries.push({
|
|
13
|
+
fullPath: `${nodePath}/${file.key}`,
|
|
14
|
+
updatedAt: file.updatedAt || '',
|
|
15
|
+
createdAt: file.createdAt || '',
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
for (const [name, child] of node.children.entries()) {
|
|
19
|
+
collectTimes(child, `${nodePath}/${name}`);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
collectTimes(root, root.name);
|
|
23
|
+
const recentKeys = new Set(timeEntries
|
|
24
|
+
.sort((a, b) => {
|
|
25
|
+
const aUpdated = a.updatedAt ? new Date(a.updatedAt).getTime() : 0;
|
|
26
|
+
const bUpdated = b.updatedAt ? new Date(b.updatedAt).getTime() : 0;
|
|
27
|
+
if (bUpdated !== aUpdated)
|
|
28
|
+
return bUpdated - aUpdated;
|
|
29
|
+
const aCreated = a.createdAt ? new Date(a.createdAt).getTime() : 0;
|
|
30
|
+
const bCreated = b.createdAt ? new Date(b.createdAt).getTime() : 0;
|
|
31
|
+
return bCreated - aCreated;
|
|
32
|
+
})
|
|
33
|
+
.slice(0, recentLimit)
|
|
34
|
+
.map((e) => e.fullPath));
|
|
35
|
+
const renderNode = (node, nodePath, prefix = '', isLast = true, isRoot = false) => {
|
|
36
|
+
const lines = [];
|
|
37
|
+
const comment = node.comment;
|
|
38
|
+
if (isRoot) {
|
|
39
|
+
lines.push(`${node.name}/${comment ? ` — ${comment}` : ''}`);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
const connector = prefix === '' ? '' : isLast ? '└── ' : '├── ';
|
|
43
|
+
lines.push(`${prefix}${connector}${node.name}/${comment ? ` — ${comment}` : ''}`);
|
|
44
|
+
}
|
|
45
|
+
const childEntries = Array.from(node.children.entries()).sort((a, b) => a[0].localeCompare(b[0]));
|
|
46
|
+
const allFiles = [...node.files].sort((a, b) => a.key.localeCompare(b.key));
|
|
47
|
+
const items = [
|
|
48
|
+
...childEntries.map(([name, childNode]) => ({
|
|
49
|
+
type: 'folder',
|
|
50
|
+
name,
|
|
51
|
+
data: childNode,
|
|
52
|
+
})),
|
|
53
|
+
...allFiles.map((file) => ({ type: 'file', name: file.key, data: file })),
|
|
54
|
+
];
|
|
55
|
+
for (let i = 0; i < items.length; i++) {
|
|
56
|
+
const item = items[i];
|
|
57
|
+
const isLastItem = i === items.length - 1;
|
|
58
|
+
const childPrefix = isRoot ? '' : prefix + (isLast ? ' ' : '│ ');
|
|
59
|
+
if (item.type === 'folder') {
|
|
60
|
+
lines.push(...renderNode(item.data, `${nodePath}/${item.name}`, childPrefix, isLastItem, false));
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
const file = item.data;
|
|
64
|
+
const fileConnector = isLastItem ? '└── ' : '├── ';
|
|
65
|
+
const tagStr = file.tags.length > 0 ? ` [${file.tags.join(', ')}]` : '';
|
|
66
|
+
const newMark = recentKeys.has(`${nodePath}/${file.key}`) ? ' [new]' : '';
|
|
67
|
+
lines.push(`${childPrefix}${fileConnector}${file.key} — ${file.title}${tagStr}${newMark}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return lines;
|
|
71
|
+
};
|
|
72
|
+
return renderNode(root, root.name, '', true, true).join('\n');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=memory-tree-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-tree-renderer.js","sourceRoot":"","sources":["../../src/dao/memory-tree-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Prompts for the Kimi Code Memory server.
|
|
3
|
+
*
|
|
4
|
+
* Prompts provide reusable instruction templates that clients can fetch
|
|
5
|
+
* before asking the model to perform memory-aware tasks.
|
|
6
|
+
*/
|
|
7
|
+
export interface PromptArgument {
|
|
8
|
+
name: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
required?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface PromptDefinition {
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
arguments?: PromptArgument[];
|
|
16
|
+
}
|
|
17
|
+
export declare const prompts: PromptDefinition[];
|
|
18
|
+
export declare function getPrompt(name: string, args?: Record<string, string>): {
|
|
19
|
+
messages: Array<{
|
|
20
|
+
role: 'user' | 'assistant';
|
|
21
|
+
content: {
|
|
22
|
+
type: 'text';
|
|
23
|
+
text: string;
|
|
24
|
+
};
|
|
25
|
+
}>;
|
|
26
|
+
};
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Prompts for the Kimi Code Memory server.
|
|
3
|
+
*
|
|
4
|
+
* Prompts provide reusable instruction templates that clients can fetch
|
|
5
|
+
* before asking the model to perform memory-aware tasks.
|
|
6
|
+
*/
|
|
7
|
+
export const prompts = [
|
|
8
|
+
{
|
|
9
|
+
name: 'memory-decision-check',
|
|
10
|
+
description: 'Before modifying a file, check historical decisions related to it.',
|
|
11
|
+
arguments: [
|
|
12
|
+
{
|
|
13
|
+
name: 'filePath',
|
|
14
|
+
description: 'Path of the file you are about to modify.',
|
|
15
|
+
required: false,
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'memory-theme-trace',
|
|
21
|
+
description: 'Trace the evolution of a theme across sessions.',
|
|
22
|
+
arguments: [
|
|
23
|
+
{
|
|
24
|
+
name: 'theme',
|
|
25
|
+
description: 'Theme identifier to trace.',
|
|
26
|
+
required: false,
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'memory-session-summary',
|
|
32
|
+
description: 'Summarize the current session and suggest themes to tag.',
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
export function getPrompt(name, args = {}) {
|
|
36
|
+
switch (name) {
|
|
37
|
+
case 'memory-decision-check': {
|
|
38
|
+
const filePath = args.filePath || '<file-path>';
|
|
39
|
+
return {
|
|
40
|
+
messages: [
|
|
41
|
+
{
|
|
42
|
+
role: 'user',
|
|
43
|
+
content: {
|
|
44
|
+
type: 'text',
|
|
45
|
+
text: `I am about to modify ${filePath}. Before I make any changes, please check our historical decisions and rules related to this file or feature.`,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
role: 'assistant',
|
|
50
|
+
content: {
|
|
51
|
+
type: 'text',
|
|
52
|
+
text: `I'll search the workspace memory for decisions, rules, and knowledge related to ${filePath}. If relevant themes exist, I'll trace their evolution across sessions before you edit.`,
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
case 'memory-theme-trace': {
|
|
59
|
+
const theme = args.theme || '<theme>';
|
|
60
|
+
return {
|
|
61
|
+
messages: [
|
|
62
|
+
{
|
|
63
|
+
role: 'user',
|
|
64
|
+
content: {
|
|
65
|
+
type: 'text',
|
|
66
|
+
text: `Please trace the evolution of the "${theme}" theme across sessions and memories.`,
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
role: 'assistant',
|
|
71
|
+
content: {
|
|
72
|
+
type: 'text',
|
|
73
|
+
text: `I'll look up the "${theme}" theme, list its associated memories and refined turns, and summarize how it evolved over time.`,
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
case 'memory-session-summary': {
|
|
80
|
+
return {
|
|
81
|
+
messages: [
|
|
82
|
+
{
|
|
83
|
+
role: 'user',
|
|
84
|
+
content: {
|
|
85
|
+
type: 'text',
|
|
86
|
+
text: 'Please summarize the current session and suggest any themes worth tagging for future traceability.',
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
role: 'assistant',
|
|
91
|
+
content: {
|
|
92
|
+
type: 'text',
|
|
93
|
+
text: "I'll review the current session's turns, extract key decisions and open questions, and propose themes that connect this session to related work.",
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
default:
|
|
100
|
+
throw new Error(`Unknown prompt: ${name}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,MAAM,CAAC,MAAM,OAAO,GAAuB;IACzC;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EAAE,oEAAoE;QACjF,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,UAAU;gBAChB,WAAW,EAAE,2CAA2C;gBACxD,QAAQ,EAAE,KAAK;aAChB;SACF;KACF;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,iDAAiD;QAC9D,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,4BAA4B;gBACzC,QAAQ,EAAE,KAAK;aAChB;SACF;KACF;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,0DAA0D;KACxE;CACF,CAAC;AAEF,MAAM,UAAU,SAAS,CACvB,IAAY,EACZ,OAA+B,EAAE;IAEjC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,uBAAuB,CAAC,CAAC,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,aAAa,CAAC;YAChD,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,wBAAwB,QAAQ,+GAA+G;yBACtJ;qBACF;oBACD;wBACE,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,mFAAmF,QAAQ,yFAAyF;yBAC3L;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QACD,KAAK,oBAAoB,CAAC,CAAC,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC;YACtC,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,sCAAsC,KAAK,uCAAuC;yBACzF;qBACF;oBACD;wBACE,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,qBAAqB,KAAK,kGAAkG;yBACnI;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QACD,KAAK,wBAAwB,CAAC,CAAC,CAAC;YAC9B,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,oGAAoG;yBAC3G;qBACF;oBACD;wBACE,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,kJAAkJ;yBACzJ;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Row <-> domain mapping for refined turns.
|
|
3
|
+
*/
|
|
4
|
+
export function rowToTurn(row) {
|
|
5
|
+
return {
|
|
6
|
+
sessionId: row.session_id,
|
|
7
|
+
turnId: row.turn_id,
|
|
8
|
+
timestamp: row.timestamp ?? undefined,
|
|
9
|
+
summary: row.summary,
|
|
10
|
+
facts: JSON.parse(row.facts || '[]'),
|
|
11
|
+
notes: JSON.parse(row.notes || '[]'),
|
|
12
|
+
entities: JSON.parse(row.entities || '{"files":[],"tools":[],"errors":[]}'),
|
|
13
|
+
categories: JSON.parse(row.categories || '{}'),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function turnToRow(turn) {
|
|
17
|
+
return {
|
|
18
|
+
session_id: turn.sessionId,
|
|
19
|
+
turn_id: turn.turnId,
|
|
20
|
+
timestamp: turn.timestamp ?? null,
|
|
21
|
+
summary: turn.summary,
|
|
22
|
+
facts: JSON.stringify(turn.facts),
|
|
23
|
+
notes: JSON.stringify(turn.notes),
|
|
24
|
+
entities: JSON.stringify(turn.entities),
|
|
25
|
+
categories: JSON.stringify(turn.categories),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/refine/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,SAAS,CAAC,GAAe;IACvC,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,SAAS;QACrC,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC;QACpC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC;QACpC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,IAAI,qCAAqC,CAAC;QAC3E,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAiB;IACzC,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,SAAS;QAC1B,OAAO,EAAE,IAAI,CAAC,MAAM;QACpB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;QACjC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QACjC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QACjC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;QACvC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;KAC5C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants for the turn refinement layer.
|
|
3
|
+
*/
|
|
4
|
+
/** Action / conclusion keywords in both English and Chinese. */
|
|
5
|
+
export declare const ACTION_KEYWORDS: string[];
|
|
6
|
+
/** Markdown headings that group the following list items into categories. */
|
|
7
|
+
export declare const CATEGORY_HEADINGS: Record<string, string[]>;
|
|
8
|
+
/** Slicing limits used during extraction and search. */
|
|
9
|
+
export declare const LIMITS: {
|
|
10
|
+
/** Max length of the user text snippet included in the summary. */
|
|
11
|
+
userText: number;
|
|
12
|
+
/** Max length of the agent lead sentence included in the summary. */
|
|
13
|
+
agentLead: number;
|
|
14
|
+
/** Max number of extracted facts stored per turn. */
|
|
15
|
+
facts: number;
|
|
16
|
+
/** Max number of fallback notes stored per turn. */
|
|
17
|
+
notes: number;
|
|
18
|
+
/** Max number of file entities stored per turn. */
|
|
19
|
+
files: number;
|
|
20
|
+
/** Max number of tool entities stored per turn. */
|
|
21
|
+
tools: number;
|
|
22
|
+
/** Max number of error entities stored per turn. */
|
|
23
|
+
errors: number;
|
|
24
|
+
/** Max length of a single error snippet. */
|
|
25
|
+
errorSnippet: number;
|
|
26
|
+
/** Default max number of search matches returned. */
|
|
27
|
+
searchResultLimit: number;
|
|
28
|
+
/** Multiplier used to fetch extra candidates before ranking search results. */
|
|
29
|
+
searchCandidateMultiplier: number;
|
|
30
|
+
};
|
|
31
|
+
/** Helpers for ISO date boundary formatting used in SQL queries. */
|
|
32
|
+
export declare const DATE_FORMAT: {
|
|
33
|
+
dayStart: (date: string) => string;
|
|
34
|
+
dayEnd: (date: string) => string;
|
|
35
|
+
};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants for the turn refinement layer.
|
|
3
|
+
*/
|
|
4
|
+
/** Action / conclusion keywords in both English and Chinese. */
|
|
5
|
+
export const ACTION_KEYWORDS = [
|
|
6
|
+
// English - past tense / conclusions
|
|
7
|
+
'Implemented',
|
|
8
|
+
'Refactored',
|
|
9
|
+
'Confirmed',
|
|
10
|
+
'Completed',
|
|
11
|
+
'Decided',
|
|
12
|
+
'Changed',
|
|
13
|
+
'Updated',
|
|
14
|
+
'Removed',
|
|
15
|
+
'Fixed',
|
|
16
|
+
'Added',
|
|
17
|
+
'Done',
|
|
18
|
+
// English - planning / status
|
|
19
|
+
'Next step',
|
|
20
|
+
'Next',
|
|
21
|
+
'Blocker',
|
|
22
|
+
'Blocked by',
|
|
23
|
+
'Blocked',
|
|
24
|
+
'Result',
|
|
25
|
+
'Results',
|
|
26
|
+
'Summary',
|
|
27
|
+
'Status',
|
|
28
|
+
'Objective',
|
|
29
|
+
'Plan',
|
|
30
|
+
'Goal',
|
|
31
|
+
'Action',
|
|
32
|
+
'Actions',
|
|
33
|
+
'Note',
|
|
34
|
+
'Notes',
|
|
35
|
+
// Chinese - past tense / conclusions
|
|
36
|
+
'已完成',
|
|
37
|
+
'完成',
|
|
38
|
+
'修复了',
|
|
39
|
+
'修复',
|
|
40
|
+
'添加了',
|
|
41
|
+
'添加',
|
|
42
|
+
'删除了',
|
|
43
|
+
'删除',
|
|
44
|
+
'更新了',
|
|
45
|
+
'更新',
|
|
46
|
+
'决定了',
|
|
47
|
+
'决定',
|
|
48
|
+
'确认了',
|
|
49
|
+
'确认',
|
|
50
|
+
'实现了',
|
|
51
|
+
'实现',
|
|
52
|
+
'重构了',
|
|
53
|
+
'重构',
|
|
54
|
+
// Chinese - planning / status
|
|
55
|
+
'下一步',
|
|
56
|
+
'阻塞项',
|
|
57
|
+
'阻塞',
|
|
58
|
+
'被阻塞',
|
|
59
|
+
'原因',
|
|
60
|
+
'结果',
|
|
61
|
+
'状态',
|
|
62
|
+
'注意',
|
|
63
|
+
'计划',
|
|
64
|
+
'目标',
|
|
65
|
+
'行动',
|
|
66
|
+
'备注',
|
|
67
|
+
];
|
|
68
|
+
/** Markdown headings that group the following list items into categories. */
|
|
69
|
+
export const CATEGORY_HEADINGS = {
|
|
70
|
+
focus: ['Current Focus', '当前任务', '当前聚焦', 'Focus'],
|
|
71
|
+
completed: ['Completed', 'Done', '已完成', '完成'],
|
|
72
|
+
next: ['Next Steps', 'Next', '下一步', '后续'],
|
|
73
|
+
blockers: ['Blockers', 'Blocked', '阻塞', '阻塞项', 'Blocked by'],
|
|
74
|
+
status: ['Status', '当前状态', '状态'],
|
|
75
|
+
summary: ['Summary', '总结', '摘要'],
|
|
76
|
+
decisions: ['Decisions', '决定', '决策'],
|
|
77
|
+
notes: ['Notes', '备注', 'Note'],
|
|
78
|
+
};
|
|
79
|
+
/** Slicing limits used during extraction and search. */
|
|
80
|
+
export const LIMITS = {
|
|
81
|
+
/** Max length of the user text snippet included in the summary. */
|
|
82
|
+
userText: 200,
|
|
83
|
+
/** Max length of the agent lead sentence included in the summary. */
|
|
84
|
+
agentLead: 120,
|
|
85
|
+
/** Max number of extracted facts stored per turn. */
|
|
86
|
+
facts: 8,
|
|
87
|
+
/** Max number of fallback notes stored per turn. */
|
|
88
|
+
notes: 8,
|
|
89
|
+
/** Max number of file entities stored per turn. */
|
|
90
|
+
files: 10,
|
|
91
|
+
/** Max number of tool entities stored per turn. */
|
|
92
|
+
tools: 10,
|
|
93
|
+
/** Max number of error entities stored per turn. */
|
|
94
|
+
errors: 5,
|
|
95
|
+
/** Max length of a single error snippet. */
|
|
96
|
+
errorSnippet: 200,
|
|
97
|
+
/** Default max number of search matches returned. */
|
|
98
|
+
searchResultLimit: 100,
|
|
99
|
+
/** Multiplier used to fetch extra candidates before ranking search results. */
|
|
100
|
+
searchCandidateMultiplier: 4,
|
|
101
|
+
};
|
|
102
|
+
/** Helpers for ISO date boundary formatting used in SQL queries. */
|
|
103
|
+
export const DATE_FORMAT = {
|
|
104
|
+
dayStart: (date) => `${date}T00:00:00.000Z`,
|
|
105
|
+
dayEnd: (date) => `${date}T23:59:59.999Z`,
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/refine/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gEAAgE;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,qCAAqC;IACrC,aAAa;IACb,YAAY;IACZ,WAAW;IACX,WAAW;IACX,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,OAAO;IACP,OAAO;IACP,MAAM;IACN,8BAA8B;IAC9B,WAAW;IACX,MAAM;IACN,SAAS;IACT,YAAY;IACZ,SAAS;IACT,QAAQ;IACR,SAAS;IACT,SAAS;IACT,QAAQ;IACR,WAAW;IACX,MAAM;IACN,MAAM;IACN,QAAQ;IACR,SAAS;IACT,MAAM;IACN,OAAO;IACP,qCAAqC;IACrC,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,8BAA8B;IAC9B,KAAK;IACL,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;CACL,CAAC;AAEF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,iBAAiB,GAA6B;IACzD,KAAK,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;IACjD,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC;IAC7C,IAAI,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC;IACzC,QAAQ,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC;IAC5D,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC;IAChC,OAAO,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC;IAChC,SAAS,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC;IACpC,KAAK,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,wDAAwD;AACxD,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,mEAAmE;IACnE,QAAQ,EAAE,GAAG;IACb,qEAAqE;IACrE,SAAS,EAAE,GAAG;IACd,qDAAqD;IACrD,KAAK,EAAE,CAAC;IACR,oDAAoD;IACpD,KAAK,EAAE,CAAC;IACR,mDAAmD;IACnD,KAAK,EAAE,EAAE;IACT,mDAAmD;IACnD,KAAK,EAAE,EAAE;IACT,oDAAoD;IACpD,MAAM,EAAE,CAAC;IACT,4CAA4C;IAC5C,YAAY,EAAE,GAAG;IACjB,qDAAqD;IACrD,iBAAiB,EAAE,GAAG;IACtB,+EAA+E;IAC/E,yBAAyB,EAAE,CAAC;CAC7B,CAAC;AAEF,oEAAoE;AACpE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,QAAQ,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,GAAG,IAAI,gBAAgB;IAC3D,MAAM,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,GAAG,IAAI,gBAAgB;CAC1D,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure turn extraction logic.
|
|
3
|
+
*
|
|
4
|
+
* Converts a RawTurn into a RefinedTurn using deterministic, local rules:
|
|
5
|
+
* action keywords, category headings, list items, and lightweight entity
|
|
6
|
+
* extraction. No LLM is involved.
|
|
7
|
+
*/
|
|
8
|
+
import type { RawTurn, RefinedTurn } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Extract a RefinedTurn from a RawTurn.
|
|
11
|
+
*/
|
|
12
|
+
export declare function extract(turn: RawTurn, sessionId: string): RefinedTurn;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure turn extraction logic.
|
|
3
|
+
*
|
|
4
|
+
* Converts a RawTurn into a RefinedTurn using deterministic, local rules:
|
|
5
|
+
* action keywords, category headings, list items, and lightweight entity
|
|
6
|
+
* extraction. No LLM is involved.
|
|
7
|
+
*/
|
|
8
|
+
import { ACTION_KEYWORDS, LIMITS } from './constants.js';
|
|
9
|
+
import { extractEntitiesFromAction } from '../utils/action-entities.js';
|
|
10
|
+
import { matchCategory } from '../utils/headings.js';
|
|
11
|
+
function buildActionRegex() {
|
|
12
|
+
// Sort longer phrases first so "Next step" wins over "Next".
|
|
13
|
+
const sorted = [...ACTION_KEYWORDS].sort((a, b) => b.length - a.length);
|
|
14
|
+
const escaped = sorted.map((k) => k.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
|
|
15
|
+
// Support both English colon and Chinese full-width colon, optional whitespace.
|
|
16
|
+
return new RegExp(`^(?:${escaped.join('|')})(:|:)?\\s*`, 'i');
|
|
17
|
+
}
|
|
18
|
+
const ACTION_REGEX = buildActionRegex();
|
|
19
|
+
const HEADING_REGEX = /^(#{1,6})\s+(.+?)(?:\s+[::])?\s*$/;
|
|
20
|
+
function isSentenceLike(text) {
|
|
21
|
+
if (text.length < 10 || text.length > LIMITS.userText)
|
|
22
|
+
return false;
|
|
23
|
+
// End with sentence terminator or colon.
|
|
24
|
+
return /[.。!!??::]$/.test(text);
|
|
25
|
+
}
|
|
26
|
+
function pickAgentLead(agentText) {
|
|
27
|
+
const first = agentText.split(/\r?\n/).find((line) => line.trim().length > 0);
|
|
28
|
+
if (!first)
|
|
29
|
+
return null;
|
|
30
|
+
const trimmed = first.trim();
|
|
31
|
+
return trimmed.length > 0 && trimmed.length <= LIMITS.agentLead && !trimmed.startsWith('#')
|
|
32
|
+
? trimmed
|
|
33
|
+
: null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Extract a RefinedTurn from a RawTurn.
|
|
37
|
+
*/
|
|
38
|
+
export function extract(turn, sessionId) {
|
|
39
|
+
const files = new Set();
|
|
40
|
+
const tools = new Set();
|
|
41
|
+
const errors = new Set();
|
|
42
|
+
for (const action of turn.actions || []) {
|
|
43
|
+
const { files: actionFiles, tools: actionTools, errors: actionErrors } = extractEntitiesFromAction(action);
|
|
44
|
+
for (const file of actionFiles)
|
|
45
|
+
files.add(file);
|
|
46
|
+
for (const tool of actionTools)
|
|
47
|
+
tools.add(tool);
|
|
48
|
+
for (const error of actionErrors)
|
|
49
|
+
errors.add(error);
|
|
50
|
+
}
|
|
51
|
+
const userText = (turn.user || '').slice(0, LIMITS.userText).trim();
|
|
52
|
+
const toolNames = Array.from(tools);
|
|
53
|
+
const agentText = turn.agentText || turn.agent || '';
|
|
54
|
+
const agentLead = pickAgentLead(agentText);
|
|
55
|
+
let summary = userText;
|
|
56
|
+
if (toolNames.length > 0) {
|
|
57
|
+
summary = `${userText ? `${userText} · ` : ''}${toolNames.join(', ')}`;
|
|
58
|
+
}
|
|
59
|
+
if (agentLead && agentLead !== userText) {
|
|
60
|
+
summary = summary ? `${summary} · ${agentLead}` : agentLead;
|
|
61
|
+
}
|
|
62
|
+
const facts = [];
|
|
63
|
+
const notes = [];
|
|
64
|
+
const categories = {};
|
|
65
|
+
let currentCategory = null;
|
|
66
|
+
const lines = String(agentText).split(/\r?\n/);
|
|
67
|
+
for (const rawLine of lines) {
|
|
68
|
+
const line = rawLine.trim();
|
|
69
|
+
if (!line) {
|
|
70
|
+
currentCategory = null;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
// Markdown / Chinese heading detection.
|
|
74
|
+
const headingMatch = line.match(HEADING_REGEX);
|
|
75
|
+
if (headingMatch) {
|
|
76
|
+
currentCategory = matchCategory(headingMatch[2]);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
let extracted = null;
|
|
80
|
+
// List item.
|
|
81
|
+
if (line.startsWith('- ') || line.startsWith('* ')) {
|
|
82
|
+
extracted = line.slice(2).trim();
|
|
83
|
+
}
|
|
84
|
+
// Numbered list item like "1. xxx" or "1) xxx".
|
|
85
|
+
else if (/^(\d+)[.)]\s+/.test(line)) {
|
|
86
|
+
extracted = line.replace(/^\d+[.)]\s+/, '').trim();
|
|
87
|
+
}
|
|
88
|
+
// Action / conclusion sentence.
|
|
89
|
+
else {
|
|
90
|
+
const actionMatch = line.match(ACTION_REGEX);
|
|
91
|
+
if (actionMatch) {
|
|
92
|
+
extracted = line.slice(actionMatch[0].length).trim();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (extracted) {
|
|
96
|
+
const item = extracted;
|
|
97
|
+
if (currentCategory) {
|
|
98
|
+
(categories[currentCategory] ||= []).push(item);
|
|
99
|
+
}
|
|
100
|
+
facts.push(item);
|
|
101
|
+
}
|
|
102
|
+
else if (isSentenceLike(line)) {
|
|
103
|
+
// Fallback: keep short declarative sentences that did not match keywords.
|
|
104
|
+
notes.push(line);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
sessionId,
|
|
109
|
+
turnId: parseInt(String(turn.turnId), 10),
|
|
110
|
+
timestamp: turn.timestamp,
|
|
111
|
+
summary,
|
|
112
|
+
facts: facts.slice(0, LIMITS.facts),
|
|
113
|
+
notes: notes.slice(0, LIMITS.notes),
|
|
114
|
+
entities: {
|
|
115
|
+
files: Array.from(files).slice(0, LIMITS.files),
|
|
116
|
+
tools: toolNames.slice(0, LIMITS.tools),
|
|
117
|
+
errors: Array.from(errors).slice(0, LIMITS.errors),
|
|
118
|
+
},
|
|
119
|
+
categories,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/refine/extractor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,SAAS,gBAAgB;IACvB,6DAA6D;IAC7D,MAAM,MAAM,GAAG,CAAC,GAAG,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5E,gFAAgF;IAChF,OAAO,IAAI,MAAM,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,YAAY,GAAG,gBAAgB,EAAE,CAAC;AACxC,MAAM,aAAa,GAAG,mCAAmC,CAAC;AAE1D,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACpE,yCAAyC;IACzC,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB;IACtC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9E,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QACzF,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAa,EAAE,SAAiB;IACtD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACxC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,GACpE,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,WAAW;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChD,KAAK,MAAM,IAAI,IAAI,WAAW;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChD,KAAK,MAAM,KAAK,IAAI,YAAY;YAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IACrD,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAE3C,IAAI,OAAO,GAAG,QAAQ,CAAC;IACvB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACzE,CAAC;IACD,IAAI,SAAS,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,MAAM,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,UAAU,GAA6B,EAAE,CAAC;IAChD,IAAI,eAAe,GAAkB,IAAI,CAAC;IAE1C,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/C,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,eAAe,GAAG,IAAI,CAAC;YACvB,SAAS;QACX,CAAC;QAED,wCAAwC;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,YAAY,EAAE,CAAC;YACjB,eAAe,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,SAAS;QACX,CAAC;QAED,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,aAAa;QACb,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;QACD,gDAAgD;aAC3C,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrD,CAAC;QACD,gCAAgC;aAC3B,CAAC;YACJ,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC7C,IAAI,WAAW,EAAE,CAAC;gBAChB,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACvD,CAAC;QACH,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,SAAS,CAAC;YACvB,IAAI,eAAe,EAAE,CAAC;gBACpB,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,0EAA0E;YAC1E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS;QACT,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACzC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO;QACP,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;QACnC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;QACnC,QAAQ,EAAE;YACR,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;YAC/C,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;YACvC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC;SACnD;QACD,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite storage for refined turns.
|
|
3
|
+
*/
|
|
4
|
+
import type { RefinedSearchOptions, RefinedSearchMatch, RefinedTurn } from './types.js';
|
|
5
|
+
export declare class RefinedStore {
|
|
6
|
+
refinedRoot: string;
|
|
7
|
+
private dbPath;
|
|
8
|
+
private db;
|
|
9
|
+
constructor(refinedRoot: string);
|
|
10
|
+
private initDb;
|
|
11
|
+
getDbPath(): string;
|
|
12
|
+
saveRefinedTurns(sessionId: string, refinedTurns: RefinedTurn[]): void;
|
|
13
|
+
loadRefinedTurns(sessionId: string): RefinedTurn[];
|
|
14
|
+
loadRefinedTurn(sessionId: string, turnId: number): RefinedTurn | undefined;
|
|
15
|
+
searchRefinedTurns(options: RefinedSearchOptions): RefinedSearchMatch[];
|
|
16
|
+
countAll(): number;
|
|
17
|
+
listRecentTurns(limit: number): RefinedTurn[];
|
|
18
|
+
close(): void;
|
|
19
|
+
}
|