@downcity/plugins 1.0.253 → 1.0.254
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/bin/memory/Action.d.ts +27 -36
- package/bin/memory/Action.d.ts.map +1 -1
- package/bin/memory/Action.js +71 -311
- package/bin/memory/Action.js.map +1 -1
- package/bin/memory/Index.d.ts +3 -1
- package/bin/memory/Index.d.ts.map +1 -1
- package/bin/memory/Index.js +3 -1
- package/bin/memory/Index.js.map +1 -1
- package/bin/memory/MemoryPlugin.d.ts +20 -37
- package/bin/memory/MemoryPlugin.d.ts.map +1 -1
- package/bin/memory/MemoryPlugin.js +231 -233
- package/bin/memory/MemoryPlugin.js.map +1 -1
- package/bin/memory/adapters/FileMemoryStorageAdapter.d.ts +43 -0
- package/bin/memory/adapters/FileMemoryStorageAdapter.d.ts.map +1 -0
- package/bin/memory/adapters/FileMemoryStorageAdapter.js +163 -0
- package/bin/memory/adapters/FileMemoryStorageAdapter.js.map +1 -0
- package/bin/memory/providers/BuiltinMemoryProvider.d.ts +63 -0
- package/bin/memory/providers/BuiltinMemoryProvider.d.ts.map +1 -0
- package/bin/memory/providers/BuiltinMemoryProvider.js +772 -0
- package/bin/memory/providers/BuiltinMemoryProvider.js.map +1 -0
- package/bin/memory/runtime/SystemProvider.d.ts +7 -12
- package/bin/memory/runtime/SystemProvider.d.ts.map +1 -1
- package/bin/memory/runtime/SystemProvider.js +30 -89
- package/bin/memory/runtime/SystemProvider.js.map +1 -1
- package/bin/memory/types/BuiltinMemoryProvider.d.ts +88 -0
- package/bin/memory/types/BuiltinMemoryProvider.d.ts.map +1 -0
- package/bin/memory/types/BuiltinMemoryProvider.js +9 -0
- package/bin/memory/types/BuiltinMemoryProvider.js.map +1 -0
- package/bin/memory/types/Memory.d.ts +249 -408
- package/bin/memory/types/Memory.d.ts.map +1 -1
- package/bin/memory/types/Memory.js +4 -4
- package/bin/memory/types/MemoryStorage.d.ts +35 -0
- package/bin/memory/types/MemoryStorage.d.ts.map +1 -0
- package/bin/memory/types/MemoryStorage.js +10 -0
- package/bin/memory/types/MemoryStorage.js.map +1 -0
- package/bin/memory.d.ts +6 -2
- package/bin/memory.d.ts.map +1 -1
- package/bin/memory.js +3 -1
- package/bin/memory.js.map +1 -1
- package/package.json +3 -2
- package/scripts/memory-plugin.test.mjs +227 -0
- package/scripts/plugin-subpaths.test.mjs +8 -0
- package/src/memory/Action.ts +106 -377
- package/src/memory/Index.ts +6 -1
- package/src/memory/MemoryPlugin.ts +254 -246
- package/src/memory/adapters/FileMemoryStorageAdapter.ts +197 -0
- package/src/memory/providers/BuiltinMemoryProvider.ts +905 -0
- package/src/memory/runtime/SystemProvider.ts +32 -95
- package/src/memory/types/BuiltinMemoryProvider.ts +121 -0
- package/src/memory/types/Memory.ts +322 -456
- package/src/memory/types/MemoryStorage.ts +44 -0
- package/src/memory.ts +48 -24
- package/bin/memory/runtime/Search.d.ts +0 -19
- package/bin/memory/runtime/Search.d.ts.map +0 -1
- package/bin/memory/runtime/Search.js +0 -262
- package/bin/memory/runtime/Search.js.map +0 -1
- package/bin/memory/runtime/Store.d.ts +0 -42
- package/bin/memory/runtime/Store.d.ts.map +0 -1
- package/bin/memory/runtime/Store.js +0 -94
- package/bin/memory/runtime/Store.js.map +0 -1
- package/bin/memory/runtime/Writer.d.ts +0 -61
- package/bin/memory/runtime/Writer.d.ts.map +0 -1
- package/bin/memory/runtime/Writer.js +0 -274
- package/bin/memory/runtime/Writer.js.map +0 -1
- package/src/memory/runtime/Search.ts +0 -327
- package/src/memory/runtime/Store.ts +0 -158
- package/src/memory/runtime/Writer.ts +0 -351
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builtin Memory Provider 使用的低层存储 Adapter 协议。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - Adapter 只处理 Provider 内部的逻辑 key 与文本,不表达 Memory 领域语义。
|
|
6
|
+
* - 文件、SQLite、对象存储或远程 KV 都可以实现该协议。
|
|
7
|
+
* - MemoryPlugin 和 Agent SDK 不得直接依赖本接口。
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** 存储 Adapter 返回的文本条目。 */
|
|
11
|
+
export interface MemoryStorageEntry {
|
|
12
|
+
/** Provider 内部使用的稳定逻辑 key。 */
|
|
13
|
+
key: string;
|
|
14
|
+
|
|
15
|
+
/** 当前条目的完整 UTF-8 文本。 */
|
|
16
|
+
content: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Builtin Memory Provider 的最小文本存储能力。 */
|
|
20
|
+
export interface MemoryStorageAdapter {
|
|
21
|
+
/** 当前存储实现的稳定名称。 */
|
|
22
|
+
readonly name: string;
|
|
23
|
+
|
|
24
|
+
/** 初始化存储根与必要结构。 */
|
|
25
|
+
initialize(): Promise<void>;
|
|
26
|
+
|
|
27
|
+
/** 判断指定逻辑 key 是否存在。 */
|
|
28
|
+
has(key: string): Promise<boolean>;
|
|
29
|
+
|
|
30
|
+
/** 读取指定逻辑 key;不存在时返回空。 */
|
|
31
|
+
read(key: string): Promise<string | null>;
|
|
32
|
+
|
|
33
|
+
/** 原子创建或替换指定逻辑 key 的完整内容。 */
|
|
34
|
+
write(key: string, content: string): Promise<void>;
|
|
35
|
+
|
|
36
|
+
/** 列出指定逻辑前缀下的全部文本条目。 */
|
|
37
|
+
list(prefix: string): Promise<MemoryStorageEntry[]>;
|
|
38
|
+
|
|
39
|
+
/** 删除指定逻辑 key;不存在时保持幂等。 */
|
|
40
|
+
delete(key: string): Promise<void>;
|
|
41
|
+
|
|
42
|
+
/** 释放 Adapter 持有的资源。 */
|
|
43
|
+
dispose(): Promise<void>;
|
|
44
|
+
}
|
package/src/memory.ts
CHANGED
|
@@ -1,34 +1,58 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `@downcity/plugins/memory` 独立公开入口。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 关键点(中文):汇总 provider-neutral MemoryPlugin、Provider 与内建 Adapter。
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
export { MemoryPlugin } from "./memory/MemoryPlugin.js";
|
|
8
|
+
export { BuiltinMemoryProvider } from "./memory/providers/BuiltinMemoryProvider.js";
|
|
9
|
+
export {
|
|
10
|
+
FileMemoryStorageAdapter,
|
|
11
|
+
get_default_file_memory_root_path,
|
|
12
|
+
} from "./memory/adapters/FileMemoryStorageAdapter.js";
|
|
8
13
|
export type {
|
|
9
14
|
MemoryActionPayload,
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
MemoryDigestPayload,
|
|
15
|
-
MemoryDigestResponse,
|
|
15
|
+
MemoryDigestInput,
|
|
16
|
+
MemoryDigestResult,
|
|
17
|
+
MemoryForgetInput,
|
|
18
|
+
MemoryForgetResult,
|
|
16
19
|
MemoryPluginOptions,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
20
|
+
MemoryProvider,
|
|
21
|
+
MemoryProviderCapabilities,
|
|
22
|
+
MemoryProviderInitializeInput,
|
|
23
|
+
MemoryProviderState,
|
|
24
|
+
MemoryReadInput,
|
|
25
|
+
MemoryReadResult,
|
|
26
|
+
MemoryRecallInput,
|
|
27
|
+
MemoryRecallItem,
|
|
28
|
+
MemoryRecallResult,
|
|
29
|
+
MemoryRecord,
|
|
30
|
+
MemoryRememberInput,
|
|
31
|
+
MemoryRememberResult,
|
|
32
|
+
MemoryReviseInput,
|
|
33
|
+
MemoryReviseResult,
|
|
34
|
+
MemoryScope,
|
|
35
|
+
MemorySourceReference,
|
|
36
|
+
MemoryStatusResult,
|
|
37
|
+
MemorySystemContextInput,
|
|
38
|
+
MemorySystemContextItem,
|
|
39
|
+
MemorySystemContextResult,
|
|
40
|
+
MemoryType,
|
|
34
41
|
} from "./memory/types/Memory.js";
|
|
42
|
+
export type {
|
|
43
|
+
BuiltinMemoryDigestHandler,
|
|
44
|
+
BuiltinMemoryDigestHandlerInput,
|
|
45
|
+
BuiltinMemoryDigestHandlerOutput,
|
|
46
|
+
BuiltinMemoryProjectionDraft,
|
|
47
|
+
BuiltinMemoryProviderOptions,
|
|
48
|
+
BuiltinMemoryReviseHandler,
|
|
49
|
+
BuiltinMemoryReviseHandlerInput,
|
|
50
|
+
BuiltinMemoryReviseHandlerOutput,
|
|
51
|
+
BuiltinMemoryStorageFactory,
|
|
52
|
+
DefaultFileMemoryRootInput,
|
|
53
|
+
FileMemoryStorageAdapterOptions,
|
|
54
|
+
} from "./memory/types/BuiltinMemoryProvider.js";
|
|
55
|
+
export type {
|
|
56
|
+
MemoryStorageAdapter,
|
|
57
|
+
MemoryStorageEntry,
|
|
58
|
+
} from "./memory/types/MemoryStorage.js";
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Search 运行时。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 直接扫描 LLM Wiki Markdown 文件,不依赖额外索引库。
|
|
6
|
-
* - 统一收敛检索、分块、打分与状态统计逻辑。
|
|
7
|
-
*/
|
|
8
|
-
import type { PluginContext } from "@downcity/agent";
|
|
9
|
-
import type { MemorySearchPayload, MemorySearchResponse, MemoryStatusResponse } from "../../memory/types/Memory.js";
|
|
10
|
-
import { type MemoryRuntimeState } from "./Store.js";
|
|
11
|
-
/**
|
|
12
|
-
* 收集当前 memory Markdown 状态。
|
|
13
|
-
*/
|
|
14
|
-
export declare function collectMemoryStatus(context: PluginContext, state: MemoryRuntimeState): Promise<MemoryStatusResponse>;
|
|
15
|
-
/**
|
|
16
|
-
* 执行检索。
|
|
17
|
-
*/
|
|
18
|
-
export declare function searchMemory(context: PluginContext, state: MemoryRuntimeState, payload: MemorySearchPayload): Promise<MemorySearchResponse>;
|
|
19
|
-
//# sourceMappingURL=Search.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Search.d.ts","sourceRoot":"","sources":["../../../src/memory/runtime/Search.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EAGpB,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,YAAY,CAAC;AAiKpB;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAgC/B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CAiG/B"}
|
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Search 运行时。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 直接扫描 LLM Wiki Markdown 文件,不依赖额外索引库。
|
|
6
|
-
* - 统一收敛检索、分块、打分与状态统计逻辑。
|
|
7
|
-
*/
|
|
8
|
-
import fs from "node:fs/promises";
|
|
9
|
-
import { listMemorySourceFiles, MEMORY_DEFAULTS, } from "./Store.js";
|
|
10
|
-
const SNIPPET_MAX_CHARS = 700;
|
|
11
|
-
const CHUNK_MAX_CHARS = 1600;
|
|
12
|
-
const CHUNK_OVERLAP_CHARS = 240;
|
|
13
|
-
function clampNumber(value, min, max) {
|
|
14
|
-
if (!Number.isFinite(value))
|
|
15
|
-
return min;
|
|
16
|
-
return Math.max(min, Math.min(max, value));
|
|
17
|
-
}
|
|
18
|
-
function normalizeText(input) {
|
|
19
|
-
return String(input || "").replace(/\r\n/g, "\n");
|
|
20
|
-
}
|
|
21
|
-
function truncateText(value, maxChars) {
|
|
22
|
-
if (value.length <= maxChars) {
|
|
23
|
-
return value;
|
|
24
|
-
}
|
|
25
|
-
return value.slice(0, maxChars);
|
|
26
|
-
}
|
|
27
|
-
function tokenizeQuery(raw) {
|
|
28
|
-
return String(raw || "")
|
|
29
|
-
.toLowerCase()
|
|
30
|
-
.replace(/[^\p{L}\p{N}_-]+/gu, " ")
|
|
31
|
-
.split(/\s+/)
|
|
32
|
-
.map((item) => item.trim())
|
|
33
|
-
.filter(Boolean)
|
|
34
|
-
.slice(0, 12);
|
|
35
|
-
}
|
|
36
|
-
function countTokenOccurrences(text, token) {
|
|
37
|
-
if (!token)
|
|
38
|
-
return 0;
|
|
39
|
-
let hits = 0;
|
|
40
|
-
let start = 0;
|
|
41
|
-
while (start < text.length) {
|
|
42
|
-
const index = text.indexOf(token, start);
|
|
43
|
-
if (index < 0)
|
|
44
|
-
break;
|
|
45
|
-
hits += 1;
|
|
46
|
-
start = index + token.length;
|
|
47
|
-
}
|
|
48
|
-
return hits;
|
|
49
|
-
}
|
|
50
|
-
function buildSnippetScore(text, tokens) {
|
|
51
|
-
if (tokens.length === 0)
|
|
52
|
-
return 0;
|
|
53
|
-
const normalized = normalizeText(text).toLowerCase();
|
|
54
|
-
let matchedTokens = 0;
|
|
55
|
-
let totalHits = 0;
|
|
56
|
-
for (const token of tokens) {
|
|
57
|
-
const hits = countTokenOccurrences(normalized, token);
|
|
58
|
-
if (hits > 0) {
|
|
59
|
-
matchedTokens += 1;
|
|
60
|
-
totalHits += Math.min(hits, 4);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
if (matchedTokens === 0) {
|
|
64
|
-
return 0;
|
|
65
|
-
}
|
|
66
|
-
const coverageScore = matchedTokens / tokens.length;
|
|
67
|
-
const densityScore = Math.min(totalHits, tokens.length * 3) / (tokens.length * 3);
|
|
68
|
-
return Number((coverageScore * 0.75 + densityScore * 0.25).toFixed(4));
|
|
69
|
-
}
|
|
70
|
-
function chunkMarkdown(content) {
|
|
71
|
-
const lines = normalizeText(content).split("\n");
|
|
72
|
-
if (lines.length === 0) {
|
|
73
|
-
return [];
|
|
74
|
-
}
|
|
75
|
-
const out = [];
|
|
76
|
-
let bucket = [];
|
|
77
|
-
let chars = 0;
|
|
78
|
-
const flush = () => {
|
|
79
|
-
if (bucket.length === 0)
|
|
80
|
-
return;
|
|
81
|
-
const startLine = bucket[0]?.lineNo ?? 1;
|
|
82
|
-
const endLine = bucket[bucket.length - 1]?.lineNo ?? startLine;
|
|
83
|
-
const text = bucket.map((item) => item.line).join("\n").trim();
|
|
84
|
-
if (!text)
|
|
85
|
-
return;
|
|
86
|
-
out.push({
|
|
87
|
-
startLine,
|
|
88
|
-
endLine,
|
|
89
|
-
text,
|
|
90
|
-
});
|
|
91
|
-
};
|
|
92
|
-
const carryOverlap = () => {
|
|
93
|
-
if (bucket.length === 0 || CHUNK_OVERLAP_CHARS <= 0) {
|
|
94
|
-
bucket = [];
|
|
95
|
-
chars = 0;
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
let acc = 0;
|
|
99
|
-
const next = [];
|
|
100
|
-
for (let i = bucket.length - 1; i >= 0; i -= 1) {
|
|
101
|
-
const row = bucket[i];
|
|
102
|
-
if (!row)
|
|
103
|
-
continue;
|
|
104
|
-
acc += row.line.length + 1;
|
|
105
|
-
next.unshift(row);
|
|
106
|
-
if (acc >= CHUNK_OVERLAP_CHARS)
|
|
107
|
-
break;
|
|
108
|
-
}
|
|
109
|
-
bucket = next;
|
|
110
|
-
chars = bucket.reduce((sum, item) => sum + item.line.length + 1, 0);
|
|
111
|
-
};
|
|
112
|
-
for (let i = 0; i < lines.length; i += 1) {
|
|
113
|
-
const line = lines[i] ?? "";
|
|
114
|
-
const rowSize = line.length + 1;
|
|
115
|
-
if (bucket.length > 0 && chars + rowSize > CHUNK_MAX_CHARS) {
|
|
116
|
-
flush();
|
|
117
|
-
carryOverlap();
|
|
118
|
-
}
|
|
119
|
-
bucket.push({ line, lineNo: i + 1 });
|
|
120
|
-
chars += rowSize;
|
|
121
|
-
}
|
|
122
|
-
flush();
|
|
123
|
-
return out;
|
|
124
|
-
}
|
|
125
|
-
async function readMemoryChunks(context, options) {
|
|
126
|
-
const files = await listMemorySourceFiles(context.workspace_path, options);
|
|
127
|
-
const out = [];
|
|
128
|
-
for (const file of files) {
|
|
129
|
-
const content = String(await fs.readFile(file.absPath, "utf-8"));
|
|
130
|
-
for (const chunk of chunkMarkdown(content)) {
|
|
131
|
-
out.push({
|
|
132
|
-
path: file.relPath,
|
|
133
|
-
source: file.source,
|
|
134
|
-
startLine: chunk.startLine,
|
|
135
|
-
endLine: chunk.endLine,
|
|
136
|
-
text: chunk.text,
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
return out;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* 收集当前 memory Markdown 状态。
|
|
144
|
-
*/
|
|
145
|
-
export async function collectMemoryStatus(context, state) {
|
|
146
|
-
void state;
|
|
147
|
-
const files = await listMemorySourceFiles(context.workspace_path, {
|
|
148
|
-
includeSources: true,
|
|
149
|
-
});
|
|
150
|
-
const sourceCounts = [
|
|
151
|
-
{ source: "wiki", files: 0, chunks: 0 },
|
|
152
|
-
{ source: "source", files: 0, chunks: 0 },
|
|
153
|
-
{ source: "working", files: 0, chunks: 0 },
|
|
154
|
-
];
|
|
155
|
-
let totalChunks = 0;
|
|
156
|
-
for (const file of files) {
|
|
157
|
-
const bucket = sourceCounts.find((item) => item.source === file.source);
|
|
158
|
-
if (bucket) {
|
|
159
|
-
bucket.files += 1;
|
|
160
|
-
}
|
|
161
|
-
const content = String(await fs.readFile(file.absPath, "utf-8"));
|
|
162
|
-
const chunks = chunkMarkdown(content).length;
|
|
163
|
-
totalChunks += chunks;
|
|
164
|
-
if (bucket) {
|
|
165
|
-
bucket.chunks += chunks;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
return {
|
|
169
|
-
backend: "builtin",
|
|
170
|
-
mode: "scan",
|
|
171
|
-
files: files.length,
|
|
172
|
-
chunks: totalChunks,
|
|
173
|
-
sourceCounts,
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* 执行检索。
|
|
178
|
-
*/
|
|
179
|
-
export async function searchMemory(context, state, payload) {
|
|
180
|
-
void state;
|
|
181
|
-
const query = String(payload.query || "").trim();
|
|
182
|
-
if (!query) {
|
|
183
|
-
return {
|
|
184
|
-
backend: "builtin",
|
|
185
|
-
mode: "scan",
|
|
186
|
-
results: [],
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
const tokens = tokenizeQuery(query);
|
|
190
|
-
if (tokens.length === 0) {
|
|
191
|
-
return {
|
|
192
|
-
backend: "builtin",
|
|
193
|
-
mode: "scan",
|
|
194
|
-
results: [],
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
const maxResults = Math.floor(clampNumber(Number(payload.maxResults ?? MEMORY_DEFAULTS.maxResults), 1, 20));
|
|
198
|
-
const minScore = clampNumber(Number(payload.minScore ?? MEMORY_DEFAULTS.minScore), 0, 1);
|
|
199
|
-
try {
|
|
200
|
-
const results = (await readMemoryChunks(context, {
|
|
201
|
-
includeSources: payload.includeSources,
|
|
202
|
-
}))
|
|
203
|
-
.map((chunk) => {
|
|
204
|
-
const score = buildSnippetScore(chunk.text, tokens);
|
|
205
|
-
const citation = chunk.startLine === chunk.endLine
|
|
206
|
-
? `${chunk.path}#L${chunk.startLine}`
|
|
207
|
-
: `${chunk.path}#L${chunk.startLine}-L${chunk.endLine}`;
|
|
208
|
-
return {
|
|
209
|
-
path: chunk.path,
|
|
210
|
-
source: chunk.source,
|
|
211
|
-
startLine: chunk.startLine,
|
|
212
|
-
endLine: chunk.endLine,
|
|
213
|
-
score,
|
|
214
|
-
snippet: truncateText(chunk.text, SNIPPET_MAX_CHARS),
|
|
215
|
-
citation,
|
|
216
|
-
};
|
|
217
|
-
})
|
|
218
|
-
.filter((item) => item.score >= minScore)
|
|
219
|
-
.sort((left, right) => {
|
|
220
|
-
if (right.score !== left.score) {
|
|
221
|
-
return right.score - left.score;
|
|
222
|
-
}
|
|
223
|
-
if (left.path !== right.path) {
|
|
224
|
-
return left.path.localeCompare(right.path);
|
|
225
|
-
}
|
|
226
|
-
return left.startLine - right.startLine;
|
|
227
|
-
})
|
|
228
|
-
.slice(0, maxResults * 3);
|
|
229
|
-
let remain = Math.max(0, MEMORY_DEFAULTS.maxInjectedChars);
|
|
230
|
-
const clamped = [];
|
|
231
|
-
for (const item of results) {
|
|
232
|
-
if (remain <= 0 || clamped.length >= maxResults)
|
|
233
|
-
break;
|
|
234
|
-
if (item.snippet.length <= remain) {
|
|
235
|
-
clamped.push(item);
|
|
236
|
-
remain -= item.snippet.length;
|
|
237
|
-
continue;
|
|
238
|
-
}
|
|
239
|
-
clamped.push({
|
|
240
|
-
...item,
|
|
241
|
-
snippet: item.snippet.slice(0, remain),
|
|
242
|
-
});
|
|
243
|
-
break;
|
|
244
|
-
}
|
|
245
|
-
return {
|
|
246
|
-
backend: "builtin",
|
|
247
|
-
mode: "scan",
|
|
248
|
-
results: clamped,
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
catch (error) {
|
|
252
|
-
const message = String(error);
|
|
253
|
-
return {
|
|
254
|
-
backend: "builtin",
|
|
255
|
-
mode: "scan",
|
|
256
|
-
results: [],
|
|
257
|
-
error: message,
|
|
258
|
-
action: "Check the Markdown memory files under `.downcity/memory/`.",
|
|
259
|
-
};
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
//# sourceMappingURL=Search.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Search.js","sourceRoot":"","sources":["../../../src/memory/runtime/Search.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Store(文件枚举与轻量运行态)。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - MemoryPlugin 使用 LLM Wiki 结构:`wiki/` 是知识层,`sources/` 是证据层。
|
|
6
|
-
* - 当前实现不维护后台索引,扫描 Markdown 即可工作。
|
|
7
|
-
* - 运行态只保存 rootPath,避免伪装成有后台 worker 的复杂 runtime。
|
|
8
|
-
*/
|
|
9
|
-
import type { PluginContext } from "@downcity/agent";
|
|
10
|
-
import type { MemoryDefaults, MemorySourceType } from "../../memory/types/Memory.js";
|
|
11
|
-
export declare const MEMORY_DEFAULTS: MemoryDefaults;
|
|
12
|
-
export type MemorySourceFile = {
|
|
13
|
-
/**
|
|
14
|
-
* 来源分类。
|
|
15
|
-
*/
|
|
16
|
-
source: MemorySourceType;
|
|
17
|
-
/**
|
|
18
|
-
* 绝对路径。
|
|
19
|
-
*/
|
|
20
|
-
absPath: string;
|
|
21
|
-
/**
|
|
22
|
-
* 相对项目根目录路径。
|
|
23
|
-
*/
|
|
24
|
-
relPath: string;
|
|
25
|
-
};
|
|
26
|
-
export type MemoryRuntimeState = {
|
|
27
|
-
/**
|
|
28
|
-
* 项目根目录。
|
|
29
|
-
*/
|
|
30
|
-
rootPath: string;
|
|
31
|
-
};
|
|
32
|
-
/**
|
|
33
|
-
* 枚举 memory Markdown 文件。
|
|
34
|
-
*/
|
|
35
|
-
export declare function listMemorySourceFiles(rootPath: string, options?: {
|
|
36
|
-
includeSources?: boolean;
|
|
37
|
-
}): Promise<MemorySourceFile[]>;
|
|
38
|
-
/**
|
|
39
|
-
* 创建一个新的 memory plugin state。
|
|
40
|
-
*/
|
|
41
|
-
export declare function createMemoryRuntimeState(context: PluginContext): MemoryRuntimeState;
|
|
42
|
-
//# sourceMappingURL=Store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Store.d.ts","sourceRoot":"","sources":["../../../src/memory/runtime/Store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAElC,eAAO,MAAM,eAAe,EAAE,cAI7B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,MAAM,EAAE,gBAAgB,CAAC;IAEzB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AA2DF;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GACzC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAmC7B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,aAAa,GACrB,kBAAkB,CAIpB"}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Store(文件枚举与轻量运行态)。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - MemoryPlugin 使用 LLM Wiki 结构:`wiki/` 是知识层,`sources/` 是证据层。
|
|
6
|
-
* - 当前实现不维护后台索引,扫描 Markdown 即可工作。
|
|
7
|
-
* - 运行态只保存 rootPath,避免伪装成有后台 worker 的复杂 runtime。
|
|
8
|
-
*/
|
|
9
|
-
import fsp from "node:fs/promises";
|
|
10
|
-
import path from "node:path";
|
|
11
|
-
export const MEMORY_DEFAULTS = {
|
|
12
|
-
maxResults: 6,
|
|
13
|
-
minScore: 0.35,
|
|
14
|
-
maxInjectedChars: 4000,
|
|
15
|
-
};
|
|
16
|
-
function normalizeRelPath(rootPath, absPath) {
|
|
17
|
-
return path.relative(rootPath, absPath).replace(/\\/g, "/");
|
|
18
|
-
}
|
|
19
|
-
function isMarkdownPath(filePath) {
|
|
20
|
-
return filePath.toLowerCase().endsWith(".md");
|
|
21
|
-
}
|
|
22
|
-
async function pathExists(absPath) {
|
|
23
|
-
try {
|
|
24
|
-
await fsp.access(absPath);
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
async function listMarkdownFilesRecursively(dirPath) {
|
|
32
|
-
const out = [];
|
|
33
|
-
let entries = [];
|
|
34
|
-
try {
|
|
35
|
-
entries = await fsp.readdir(dirPath, { withFileTypes: true });
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
return out;
|
|
39
|
-
}
|
|
40
|
-
for (const entry of entries) {
|
|
41
|
-
const abs = path.join(dirPath, entry.name);
|
|
42
|
-
if (entry.isSymbolicLink()) {
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
if (entry.isDirectory()) {
|
|
46
|
-
out.push(...(await listMarkdownFilesRecursively(abs)));
|
|
47
|
-
continue;
|
|
48
|
-
}
|
|
49
|
-
if (!entry.isFile() || !isMarkdownPath(abs)) {
|
|
50
|
-
continue;
|
|
51
|
-
}
|
|
52
|
-
out.push(abs);
|
|
53
|
-
}
|
|
54
|
-
return out;
|
|
55
|
-
}
|
|
56
|
-
async function pushMarkdownTree(out, rootPath, dirPath, source) {
|
|
57
|
-
for (const absPath of await listMarkdownFilesRecursively(dirPath)) {
|
|
58
|
-
out.push({
|
|
59
|
-
source,
|
|
60
|
-
absPath,
|
|
61
|
-
relPath: normalizeRelPath(rootPath, absPath),
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* 枚举 memory Markdown 文件。
|
|
67
|
-
*/
|
|
68
|
-
export async function listMemorySourceFiles(rootPath, options = {}) {
|
|
69
|
-
const out = [];
|
|
70
|
-
await pushMarkdownTree(out, rootPath, path.join(rootPath, ".downcity", "memory", "wiki"), "wiki");
|
|
71
|
-
if (options.includeSources) {
|
|
72
|
-
await pushMarkdownTree(out, rootPath, path.join(rootPath, ".downcity", "memory", "sources"), "source");
|
|
73
|
-
// 旧版 daily / MEMORY.md 被当作 source 层读取,避免已有文件突然不可检索。
|
|
74
|
-
const longterm = path.join(rootPath, ".downcity", "memory", "MEMORY.md");
|
|
75
|
-
if (await pathExists(longterm)) {
|
|
76
|
-
out.push({
|
|
77
|
-
source: "source",
|
|
78
|
-
absPath: longterm,
|
|
79
|
-
relPath: normalizeRelPath(rootPath, longterm),
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
await pushMarkdownTree(out, rootPath, path.join(rootPath, ".downcity", "memory", "daily"), "source");
|
|
83
|
-
}
|
|
84
|
-
return out;
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* 创建一个新的 memory plugin state。
|
|
88
|
-
*/
|
|
89
|
-
export function createMemoryRuntimeState(context) {
|
|
90
|
-
return {
|
|
91
|
-
rootPath: context.workspace_path,
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
//# sourceMappingURL=Store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Store.js","sourceRoot":"","sources":["../../../src/memory/runtime/Store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Writer(LLM Wiki 文件读写与路径安全)。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - `sources/` 保存原始证据,`wiki/` 保存整理后的长期记忆。
|
|
6
|
-
* - 所有外部传入路径都必须限制在 Memory Plugin 自己的 `.downcity/memory` 目录内。
|
|
7
|
-
* - 无 LLM 注入时使用 append fallback,保证 MemoryPlugin 仍然可用。
|
|
8
|
-
*/
|
|
9
|
-
import type { PluginContext } from "@downcity/agent";
|
|
10
|
-
import type { MemoryReadPayload, MemoryReadResponse, MemoryRevisePayload, MemoryReviseResponse, MemoryWikiPageDraft } from "../../memory/types/Memory.js";
|
|
11
|
-
/**
|
|
12
|
-
* 初始化 memory wiki 目录结构(幂等)。
|
|
13
|
-
*/
|
|
14
|
-
export declare function ensureMemoryDirectories(rootPath: string): Promise<void>;
|
|
15
|
-
/**
|
|
16
|
-
* 读取指定记忆文件(支持行区间)。
|
|
17
|
-
*/
|
|
18
|
-
export declare function readMemory(context: PluginContext, payload: MemoryReadPayload): Promise<MemoryReadResponse>;
|
|
19
|
-
/**
|
|
20
|
-
* 读取 wiki index 内容。
|
|
21
|
-
*/
|
|
22
|
-
export declare function readWikiIndex(context: PluginContext): Promise<string>;
|
|
23
|
-
/**
|
|
24
|
-
* 归档手动 source。
|
|
25
|
-
*/
|
|
26
|
-
export declare function appendManualSource(context: PluginContext, content: string, source?: string): Promise<{
|
|
27
|
-
path: string;
|
|
28
|
-
writtenChars: number;
|
|
29
|
-
}>;
|
|
30
|
-
/**
|
|
31
|
-
* 写入 session source。
|
|
32
|
-
*/
|
|
33
|
-
export declare function writeSessionSource(context: PluginContext, session_id: string, content: string): Promise<{
|
|
34
|
-
path: string;
|
|
35
|
-
writtenChars: number;
|
|
36
|
-
}>;
|
|
37
|
-
/**
|
|
38
|
-
* 写入完整 wiki page。
|
|
39
|
-
*/
|
|
40
|
-
export declare function writeWikiPage(context: PluginContext, draft: MemoryWikiPageDraft): Promise<{
|
|
41
|
-
path: string;
|
|
42
|
-
writtenChars: number;
|
|
43
|
-
}>;
|
|
44
|
-
/**
|
|
45
|
-
* 追加写入 wiki page。
|
|
46
|
-
*/
|
|
47
|
-
export declare function appendWikiPage(context: PluginContext, payload: {
|
|
48
|
-
path?: string;
|
|
49
|
-
title?: string;
|
|
50
|
-
content: string;
|
|
51
|
-
sourcePath?: string;
|
|
52
|
-
instruction?: string;
|
|
53
|
-
}): Promise<{
|
|
54
|
-
path: string;
|
|
55
|
-
writtenChars: number;
|
|
56
|
-
}>;
|
|
57
|
-
/**
|
|
58
|
-
* 使用 fallback 方式修订 wiki page。
|
|
59
|
-
*/
|
|
60
|
-
export declare function appendMemoryRevision(context: PluginContext, payload: MemoryRevisePayload): Promise<MemoryReviseResponse>;
|
|
61
|
-
//# sourceMappingURL=Writer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Writer.d.ts","sourceRoot":"","sources":["../../../src/memory/runtime/Writer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAgIlC;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B7E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAyB7B;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAG3E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBjD;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CA4BjD;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CASjD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACA,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBjD;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CAW/B"}
|