@zmzai/agent-framework 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -0
- package/dist/adapters/openai-provider.d.ts +31 -2
- package/dist/adapters/openai-provider.d.ts.map +1 -1
- package/dist/adapters/openai-provider.js +118 -74
- package/dist/adapters/openai-provider.js.map +1 -1
- package/dist/adapters/subprocess-sandbox.d.ts +4 -5
- package/dist/adapters/subprocess-sandbox.d.ts.map +1 -1
- package/dist/adapters/subprocess-sandbox.js +106 -18
- package/dist/adapters/subprocess-sandbox.js.map +1 -1
- package/dist/adapters/terminal-backend.d.ts +5 -0
- package/dist/adapters/terminal-backend.d.ts.map +1 -0
- package/dist/adapters/terminal-backend.js +153 -0
- package/dist/adapters/terminal-backend.js.map +1 -0
- package/dist/cli.js +0 -0
- package/dist/core/agent/registry.d.ts +3 -0
- package/dist/core/agent/registry.d.ts.map +1 -1
- package/dist/core/agent/registry.js +9 -2
- package/dist/core/agent/registry.js.map +1 -1
- package/dist/core/events/manifest.d.ts +29 -4
- package/dist/core/events/manifest.d.ts.map +1 -1
- package/dist/core/events/manifest.js +21 -0
- package/dist/core/events/manifest.js.map +1 -1
- package/dist/core/mcp/client.d.ts +46 -0
- package/dist/core/mcp/client.d.ts.map +1 -0
- package/dist/core/mcp/client.js +286 -0
- package/dist/core/mcp/client.js.map +1 -0
- package/dist/core/mcp/http-client.d.ts +54 -0
- package/dist/core/mcp/http-client.d.ts.map +1 -0
- package/dist/core/mcp/http-client.js +385 -0
- package/dist/core/mcp/http-client.js.map +1 -0
- package/dist/core/mcp/servers.d.ts +30 -0
- package/dist/core/mcp/servers.d.ts.map +1 -0
- package/dist/core/mcp/servers.js +104 -0
- package/dist/core/mcp/servers.js.map +1 -0
- package/dist/core/permission/ruleset.d.ts +1 -1
- package/dist/core/permission/ruleset.d.ts.map +1 -1
- package/dist/core/permission/ruleset.js +4 -0
- package/dist/core/permission/ruleset.js.map +1 -1
- package/dist/core/permission/write-path.d.ts +27 -0
- package/dist/core/permission/write-path.d.ts.map +1 -0
- package/dist/core/permission/write-path.js +52 -0
- package/dist/core/permission/write-path.js.map +1 -0
- package/dist/core/repomap/cache.d.ts +24 -0
- package/dist/core/repomap/cache.d.ts.map +1 -0
- package/dist/core/repomap/cache.js +59 -0
- package/dist/core/repomap/cache.js.map +1 -0
- package/dist/core/repomap/graph.d.ts +14 -0
- package/dist/core/repomap/graph.d.ts.map +1 -0
- package/dist/core/repomap/graph.js +89 -0
- package/dist/core/repomap/graph.js.map +1 -0
- package/dist/core/repomap/render.d.ts +10 -0
- package/dist/core/repomap/render.d.ts.map +1 -0
- package/dist/core/repomap/render.js +33 -0
- package/dist/core/repomap/render.js.map +1 -0
- package/dist/core/repomap/repomap.d.ts +38 -0
- package/dist/core/repomap/repomap.d.ts.map +1 -0
- package/dist/core/repomap/repomap.js +116 -0
- package/dist/core/repomap/repomap.js.map +1 -0
- package/dist/core/repomap/tags.d.ts +26 -0
- package/dist/core/repomap/tags.d.ts.map +1 -0
- package/dist/core/repomap/tags.js +191 -0
- package/dist/core/repomap/tags.js.map +1 -0
- package/dist/core/runtime/compaction.d.ts +26 -14
- package/dist/core/runtime/compaction.d.ts.map +1 -1
- package/dist/core/runtime/compaction.js +46 -34
- package/dist/core/runtime/compaction.js.map +1 -1
- package/dist/core/runtime/lifecycle.d.ts +79 -0
- package/dist/core/runtime/lifecycle.d.ts.map +1 -0
- package/dist/core/runtime/lifecycle.js +71 -0
- package/dist/core/runtime/lifecycle.js.map +1 -0
- package/dist/core/runtime/pi-bridge.d.ts +4 -1
- package/dist/core/runtime/pi-bridge.d.ts.map +1 -1
- package/dist/core/runtime/pi-bridge.js +15 -1
- package/dist/core/runtime/pi-bridge.js.map +1 -1
- package/dist/core/runtime/run-transcript.d.ts +14 -0
- package/dist/core/runtime/run-transcript.d.ts.map +1 -0
- package/dist/core/runtime/run-transcript.js +35 -0
- package/dist/core/runtime/run-transcript.js.map +1 -0
- package/dist/core/runtime/runner.d.ts +38 -9
- package/dist/core/runtime/runner.d.ts.map +1 -1
- package/dist/core/runtime/runner.js +140 -20
- package/dist/core/runtime/runner.js.map +1 -1
- package/dist/core/session/sqlite-store.d.ts +18 -0
- package/dist/core/session/sqlite-store.d.ts.map +1 -0
- package/dist/core/session/sqlite-store.js +159 -0
- package/dist/core/session/sqlite-store.js.map +1 -0
- package/dist/core/session/types.d.ts +12 -0
- package/dist/core/session/types.d.ts.map +1 -1
- package/dist/core/tools/adapter.d.ts +11 -4
- package/dist/core/tools/adapter.d.ts.map +1 -1
- package/dist/core/tools/adapter.js +167 -8
- package/dist/core/tools/adapter.js.map +1 -1
- package/dist/core/tools/builtins.d.ts.map +1 -1
- package/dist/core/tools/builtins.js +5 -2
- package/dist/core/tools/builtins.js.map +1 -1
- package/dist/core/tools/context.d.ts +2 -0
- package/dist/core/tools/context.d.ts.map +1 -1
- package/dist/core/tools/def.d.ts +25 -0
- package/dist/core/tools/def.d.ts.map +1 -1
- package/dist/core/tools/def.js +3 -1
- package/dist/core/tools/def.js.map +1 -1
- package/dist/core/tools/git.d.ts +12 -0
- package/dist/core/tools/git.d.ts.map +1 -0
- package/dist/core/tools/git.js +189 -0
- package/dist/core/tools/git.js.map +1 -0
- package/dist/core/tools/patch.d.ts +45 -0
- package/dist/core/tools/patch.d.ts.map +1 -0
- package/dist/core/tools/patch.js +224 -0
- package/dist/core/tools/patch.js.map +1 -0
- package/dist/core/tools/qa-check.d.ts.map +1 -1
- package/dist/core/tools/qa-check.js +9 -2
- package/dist/core/tools/qa-check.js.map +1 -1
- package/dist/core/tools/repomap.d.ts +8 -0
- package/dist/core/tools/repomap.d.ts.map +1 -0
- package/dist/core/tools/repomap.js +34 -0
- package/dist/core/tools/repomap.js.map +1 -0
- package/dist/core/tools/terminal.d.ts +80 -0
- package/dist/core/tools/terminal.d.ts.map +1 -0
- package/dist/core/tools/terminal.js +265 -0
- package/dist/core/tools/terminal.js.map +1 -0
- package/dist/core/tools/trim.d.ts +31 -0
- package/dist/core/tools/trim.d.ts.map +1 -0
- package/dist/core/tools/trim.js +98 -0
- package/dist/core/tools/trim.js.map +1 -0
- package/dist/core/tools/webfetch.d.ts +10 -0
- package/dist/core/tools/webfetch.d.ts.map +1 -0
- package/dist/core/tools/webfetch.js +104 -0
- package/dist/core/tools/webfetch.js.map +1 -0
- package/dist/core/tools/websearch.d.ts +19 -0
- package/dist/core/tools/websearch.d.ts.map +1 -0
- package/dist/core/tools/websearch.js +132 -0
- package/dist/core/tools/websearch.js.map +1 -0
- package/dist/index.d.ts +30 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -1
- package/dist/index.js.map +1 -1
- package/dist/server/create-agent-runtime.d.ts +68 -0
- package/dist/server/create-agent-runtime.d.ts.map +1 -0
- package/dist/server/create-agent-runtime.js +67 -0
- package/dist/server/create-agent-runtime.js.map +1 -0
- package/dist/server/create-server.d.ts +5 -0
- package/dist/server/create-server.d.ts.map +1 -1
- package/dist/server/create-server.js +2 -0
- package/dist/server/create-server.js.map +1 -1
- package/package.json +23 -9
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** 子代理写路径隔离(tutorial-advanced 07-subagent retrofit / WritePathSet):
|
|
2
|
+
*
|
|
3
|
+
* 子代理默认继承父代理的全部写权限——信任边界与父级相同。声明式白名单
|
|
4
|
+
* (AgentInfo.writePaths)让 preset 自己声明"这个代理只允许写哪里",
|
|
5
|
+
* 未声明则行为完全不变(opt-in,不破坏既有 preset 与 e2e)。
|
|
6
|
+
*
|
|
7
|
+
* 双层防御:
|
|
8
|
+
* 1. 权限层(writePathGuardRules):利用 LAST matching rule wins——白名单
|
|
9
|
+
* allow 规则在前、全局 edit deny 兜底排在规则集末尾,越界写被规则拒绝。
|
|
10
|
+
* 2. 结构层(confineWorkspaceFiles):包住 workspace 门面,越界 write/edit
|
|
11
|
+
* 直接抛错——权限层管的是"审批",结构层管的是"不可达":即使未来新增
|
|
12
|
+
* 工具绕过权限引擎直接调 workspace,也无法越界写。
|
|
13
|
+
*
|
|
14
|
+
* 读/list 不受限:探索型子代理需要全库视野,只圈写。路径是 workspace 相对
|
|
15
|
+
* 字符串(与 WorkspaceFiles 契约一致),匹配复用规则集同款通配符,保证
|
|
16
|
+
* 权限层与结构层对"越界"的判定逐字节一致。 */
|
|
17
|
+
import { wildcardMatch } from "./ruleset.js";
|
|
18
|
+
/** 路径是否落在写路径白名单内:等于白名单根,或位于其子树。 */
|
|
19
|
+
export function pathInWritePaths(p, writePaths) {
|
|
20
|
+
return writePaths.some((root) => p === root || wildcardMatch(`${root}/**`, p));
|
|
21
|
+
}
|
|
22
|
+
/** 写路径守卫规则:白名单 allow 在前,全局 edit deny 兜底在后。
|
|
23
|
+
* LAST matching rule wins——兜底必须排在规则集最后才生效。 */
|
|
24
|
+
export function writePathGuardRules(writePaths) {
|
|
25
|
+
if (writePaths.length === 0)
|
|
26
|
+
return [];
|
|
27
|
+
return [
|
|
28
|
+
...writePaths.map((root) => ({ permission: "edit", pattern: `${root}/**`, action: "allow" })),
|
|
29
|
+
{ permission: "edit", pattern: "**", action: "deny" },
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
/** 结构层圈禁:包住 workspace 门面,越界 write/edit 直接抛错(不可绕过)。
|
|
33
|
+
* read/list 保持原样——探索型子代理需要全库视野,只圈写。 */
|
|
34
|
+
export function confineWorkspaceFiles(workspace, writePaths) {
|
|
35
|
+
const guard = (p) => {
|
|
36
|
+
if (!pathInWritePaths(p, writePaths)) {
|
|
37
|
+
throw new Error(`写路径越界:${p} 不在允许的写路径内(${writePaths.join("、")})`);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
return {
|
|
41
|
+
...workspace,
|
|
42
|
+
async write(input) {
|
|
43
|
+
guard(input.path);
|
|
44
|
+
return workspace.write(input);
|
|
45
|
+
},
|
|
46
|
+
async edit(input) {
|
|
47
|
+
guard(input.path);
|
|
48
|
+
return workspace.edit(input);
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=write-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-path.js","sourceRoot":"","sources":["../../../src/core/permission/write-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;4BAe4B;AAG5B,OAAO,EAAE,aAAa,EAAa,MAAM,cAAc,CAAC;AAExD,mCAAmC;AACnC,MAAM,UAAU,gBAAgB,CAAC,CAAS,EAAE,UAAoB;IAC9D,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,aAAa,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AACjF,CAAC;AAED;+CAC+C;AAC/C,MAAM,UAAU,mBAAmB,CAAC,UAAoB;IACtD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO;QACL,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,KAAK,EAAE,MAAM,EAAE,OAAgB,EAAE,CAAC,CAAC;QACtG,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAe,EAAE;KAC/D,CAAC;AACJ,CAAC;AAED;wCACwC;AACxC,MAAM,UAAU,qBAAqB,CAAC,SAAyB,EAAE,UAAoB;IACnF,MAAM,KAAK,GAAG,CAAC,CAAS,EAAQ,EAAE;QAChC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,cAAc,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,CAAC;IACF,OAAO;QACL,GAAG,SAAS;QACZ,KAAK,CAAC,KAAK,CAAC,KAAK;YACf,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK;YACd,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Tag } from "./tags.js";
|
|
2
|
+
export type TagCache = {
|
|
3
|
+
version: number;
|
|
4
|
+
entries: Record<string, {
|
|
5
|
+
mtimeMs: number;
|
|
6
|
+
size: number;
|
|
7
|
+
tags: Tag[];
|
|
8
|
+
}>;
|
|
9
|
+
};
|
|
10
|
+
export declare function loadTagCache(root: string): Promise<TagCache>;
|
|
11
|
+
/** 返回 (需要重析的文件, 未变文件标签)。 */
|
|
12
|
+
export declare function splitByFreshness(cache: TagCache, files: string[], infos: Map<string, {
|
|
13
|
+
mtimeMs: number;
|
|
14
|
+
size: number;
|
|
15
|
+
}>): {
|
|
16
|
+
stale: string[];
|
|
17
|
+
freshTags: Tag[];
|
|
18
|
+
};
|
|
19
|
+
export declare function saveTagCache(root: string, cache: TagCache): Promise<void>;
|
|
20
|
+
export declare function statFiles(root: string, files: string[]): Promise<Map<string, {
|
|
21
|
+
mtimeMs: number;
|
|
22
|
+
size: number;
|
|
23
|
+
}>>;
|
|
24
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/core/repomap/cache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAOrC,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC,CAAC;CACzE,CAAC;AAMF,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAQlE;AAED,4BAA4B;AAC5B,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GACpD;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,GAAG,EAAE,CAAA;CAAE,CAavC;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/E;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAatH"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
/** 标签缓存:mtime 失效(Aider 同款策略),JSON 落 <root>/.zmzai/cache/。
|
|
4
|
+
* 只重析改动文件——Repo Map 的二次调用接近零成本。 */
|
|
5
|
+
const CACHE_VERSION = 1;
|
|
6
|
+
function cachePath(root) {
|
|
7
|
+
return path.join(root, ".zmzai", "cache", "repomap-tags.json");
|
|
8
|
+
}
|
|
9
|
+
export async function loadTagCache(root) {
|
|
10
|
+
try {
|
|
11
|
+
const raw = JSON.parse(await readFile(cachePath(root), "utf8"));
|
|
12
|
+
if (raw.version === CACHE_VERSION && typeof raw.entries === "object")
|
|
13
|
+
return raw;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// 首次/损坏:重建
|
|
17
|
+
}
|
|
18
|
+
return { version: CACHE_VERSION, entries: {} };
|
|
19
|
+
}
|
|
20
|
+
/** 返回 (需要重析的文件, 未变文件标签)。 */
|
|
21
|
+
export function splitByFreshness(cache, files, infos) {
|
|
22
|
+
const stale = [];
|
|
23
|
+
const freshTags = [];
|
|
24
|
+
for (const file of files) {
|
|
25
|
+
const info = infos.get(file);
|
|
26
|
+
const entry = cache.entries[file];
|
|
27
|
+
if (info && entry && entry.mtimeMs === info.mtimeMs && entry.size === info.size) {
|
|
28
|
+
freshTags.push(...entry.tags);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
stale.push(file);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return { stale, freshTags };
|
|
35
|
+
}
|
|
36
|
+
export async function saveTagCache(root, cache) {
|
|
37
|
+
try {
|
|
38
|
+
const file = cachePath(root);
|
|
39
|
+
await mkdir(path.dirname(file), { recursive: true });
|
|
40
|
+
await writeFile(file, JSON.stringify(cache), "utf8");
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// 缓存写失败不影响主流程(只读能力)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export async function statFiles(root, files) {
|
|
47
|
+
const infos = new Map();
|
|
48
|
+
await Promise.all(files.map(async (file) => {
|
|
49
|
+
try {
|
|
50
|
+
const info = await stat(path.join(root, file));
|
|
51
|
+
infos.set(file, { mtimeMs: info.mtimeMs, size: info.size });
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// 已消失的文件:不入 map(调用方按 stale 处理后 extract 会返回空)
|
|
55
|
+
}
|
|
56
|
+
}));
|
|
57
|
+
return infos;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/core/repomap/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Tag } from "./tags.js";
|
|
2
|
+
/** 引用图 + personalized PageRank(Aider repomap.py 的核心算法,
|
|
3
|
+
* power iteration 实现约 60 行,O(边数) 每轮)。 */
|
|
4
|
+
export type RefGraph = Map<string, Map<string, number>>;
|
|
5
|
+
/** 构建「引用文件 → 定义文件」加权有向图。同名符号被任务提及(focus)
|
|
6
|
+
* 时边权重 ×10——把当前任务关注的符号所在文件拉进个人化种子。 */
|
|
7
|
+
export declare function buildGraph(tags: Tag[], mentioned: Set<string>): RefGraph;
|
|
8
|
+
/** personalized PageRank。personalization 缺省均匀分布。 */
|
|
9
|
+
export declare function pagerank(graph: RefGraph, opts?: {
|
|
10
|
+
damping?: number;
|
|
11
|
+
iterations?: number;
|
|
12
|
+
personalization?: Map<string, number>;
|
|
13
|
+
}): Map<string, number>;
|
|
14
|
+
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../src/core/repomap/graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAErC;0CAC0C;AAE1C,MAAM,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAExD;uCACuC;AACvC,wBAAgB,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,QAAQ,CAuBxE;AAED,oDAAoD;AACpD,wBAAgB,QAAQ,CACtB,KAAK,EAAE,QAAQ,EACf,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAC1F,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAkDrB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/** 构建「引用文件 → 定义文件」加权有向图。同名符号被任务提及(focus)
|
|
2
|
+
* 时边权重 ×10——把当前任务关注的符号所在文件拉进个人化种子。 */
|
|
3
|
+
export function buildGraph(tags, mentioned) {
|
|
4
|
+
const defIndex = new Map(); // symbol -> defFile -> count
|
|
5
|
+
for (const tag of tags) {
|
|
6
|
+
if (tag.kind !== "def")
|
|
7
|
+
continue;
|
|
8
|
+
let files = defIndex.get(tag.name);
|
|
9
|
+
if (!files)
|
|
10
|
+
defIndex.set(tag.name, (files = new Map()));
|
|
11
|
+
files.set(tag.file, (files.get(tag.file) ?? 0) + 1);
|
|
12
|
+
}
|
|
13
|
+
const graph = new Map();
|
|
14
|
+
for (const tag of tags) {
|
|
15
|
+
if (tag.kind !== "ref")
|
|
16
|
+
continue;
|
|
17
|
+
const targets = defIndex.get(tag.name);
|
|
18
|
+
if (!targets)
|
|
19
|
+
continue;
|
|
20
|
+
let out = graph.get(tag.file);
|
|
21
|
+
if (!out)
|
|
22
|
+
graph.set(tag.file, (out = new Map()));
|
|
23
|
+
// mentioned 存小写(任务描述与 def 名大小写常不一致),比对时统一小写
|
|
24
|
+
const weight = mentioned.has(tag.name.toLowerCase()) ? 10 : 1;
|
|
25
|
+
for (const [defFile] of targets) {
|
|
26
|
+
if (defFile === tag.file)
|
|
27
|
+
continue; // 自引用不计边
|
|
28
|
+
out.set(defFile, (out.get(defFile) ?? 0) + weight);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return graph;
|
|
32
|
+
}
|
|
33
|
+
/** personalized PageRank。personalization 缺省均匀分布。 */
|
|
34
|
+
export function pagerank(graph, opts = {}) {
|
|
35
|
+
const damping = opts.damping ?? 0.85;
|
|
36
|
+
const iterations = opts.iterations ?? 64;
|
|
37
|
+
// 节点全集 = 出边源 ∪ 入边目标(只有引用方的文件也要参与随机游走)
|
|
38
|
+
const nodes = new Set();
|
|
39
|
+
for (const [src, outs] of graph) {
|
|
40
|
+
nodes.add(src);
|
|
41
|
+
for (const dst of outs.keys())
|
|
42
|
+
nodes.add(dst);
|
|
43
|
+
}
|
|
44
|
+
const nodeList = [...nodes];
|
|
45
|
+
const count = nodeList.length;
|
|
46
|
+
if (count === 0)
|
|
47
|
+
return new Map();
|
|
48
|
+
const pers = new Map();
|
|
49
|
+
if (opts.personalization?.size) {
|
|
50
|
+
const total = [...opts.personalization.values()].reduce((a, b) => a + b, 0);
|
|
51
|
+
if (total > 0)
|
|
52
|
+
for (const [node, weight] of opts.personalization)
|
|
53
|
+
pers.set(node, weight / total);
|
|
54
|
+
}
|
|
55
|
+
const persDefault = pers.size ? 0 : 1 / count;
|
|
56
|
+
let rank = new Map(nodeList.map((node) => [node, 1 / count]));
|
|
57
|
+
for (let step = 0; step < iterations; step++) {
|
|
58
|
+
const next = new Map();
|
|
59
|
+
let dangling = 0;
|
|
60
|
+
for (const node of nodeList) {
|
|
61
|
+
const outs = graph.get(node);
|
|
62
|
+
const r = rank.get(node);
|
|
63
|
+
if (!outs?.size) {
|
|
64
|
+
dangling += r;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
let outTotal = 0;
|
|
68
|
+
for (const weight of outs.values())
|
|
69
|
+
outTotal += weight;
|
|
70
|
+
for (const [dst, weight] of outs) {
|
|
71
|
+
next.set(dst, (next.get(dst) ?? 0) + (r * weight) / outTotal);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const base = (1 - damping) / count + (damping * dangling) / count;
|
|
75
|
+
for (const node of nodeList) {
|
|
76
|
+
const value = base + damping * (next.get(node) ?? 0) + damping * (pers.get(node) ?? persDefault);
|
|
77
|
+
next.set(node, value);
|
|
78
|
+
}
|
|
79
|
+
// 收敛检测:最大增量小于阈值提前退出
|
|
80
|
+
let delta = 0;
|
|
81
|
+
for (const node of nodeList)
|
|
82
|
+
delta = Math.max(delta, Math.abs((next.get(node) ?? 0) - rank.get(node)));
|
|
83
|
+
rank = next;
|
|
84
|
+
if (delta < 1e-6)
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
return rank;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/core/repomap/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Tag } from "./tags.js";
|
|
2
|
+
/** 预算渲染:按 PageRank 降序装文件,每文件列定义行(line: name),
|
|
3
|
+
* token 估算超预算即止(chars/4 估算,与 compaction 同口径)。 */
|
|
4
|
+
export declare function renderMapText(rankedFiles: string[], tags: Tag[], tokenBudget: number): {
|
|
5
|
+
text: string;
|
|
6
|
+
tokens: number;
|
|
7
|
+
fileCount: number;
|
|
8
|
+
symbolCount: number;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/core/repomap/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAErC;kDACkD;AAElD,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CA0B/J"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** 预算渲染:按 PageRank 降序装文件,每文件列定义行(line: name),
|
|
2
|
+
* token 估算超预算即止(chars/4 估算,与 compaction 同口径)。 */
|
|
3
|
+
export function renderMapText(rankedFiles, tags, tokenBudget) {
|
|
4
|
+
const defsByFile = new Map();
|
|
5
|
+
for (const tag of tags) {
|
|
6
|
+
if (tag.kind !== "def")
|
|
7
|
+
continue;
|
|
8
|
+
let list = defsByFile.get(tag.file);
|
|
9
|
+
if (!list)
|
|
10
|
+
defsByFile.set(tag.file, (list = []));
|
|
11
|
+
list.push(tag);
|
|
12
|
+
}
|
|
13
|
+
const lines = [];
|
|
14
|
+
let tokens = 0;
|
|
15
|
+
let fileCount = 0;
|
|
16
|
+
let symbolCount = 0;
|
|
17
|
+
for (const file of rankedFiles) {
|
|
18
|
+
const defs = defsByFile.get(file);
|
|
19
|
+
if (!defs?.length)
|
|
20
|
+
continue;
|
|
21
|
+
const sorted = [...defs].sort((a, b) => a.line - b.line);
|
|
22
|
+
const block = [file, ...sorted.map((tag) => ` ${tag.line}: ${tag.name}`)].join("\n");
|
|
23
|
+
const blockTokens = Math.ceil(block.length / 4);
|
|
24
|
+
if (lines.length && tokens + blockTokens > tokenBudget)
|
|
25
|
+
break; // 至少装一个文件
|
|
26
|
+
lines.push(block);
|
|
27
|
+
tokens += blockTokens;
|
|
28
|
+
fileCount += 1;
|
|
29
|
+
symbolCount += sorted.length;
|
|
30
|
+
}
|
|
31
|
+
return { text: lines.join("\n"), tokens, fileCount, symbolCount };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/core/repomap/render.ts"],"names":[],"mappings":"AAEA;kDACkD;AAElD,MAAM,UAAU,aAAa,CAAC,WAAqB,EAAE,IAAW,EAAE,WAAmB;IACnF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK;YAAE,SAAS;QACjC,IAAI,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI;YAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,MAAM;YAAE,SAAS;QAC5B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChD,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM,GAAG,WAAW,GAAG,WAAW;YAAE,MAAM,CAAC,UAAU;QACzE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,MAAM,IAAI,WAAW,CAAC;QACtB,SAAS,IAAI,CAAC,CAAC;QACf,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC;IAC/B,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export { setWasmDirs } from "./tags.js";
|
|
2
|
+
/** Repo Map 编排(Aider 的完整管线):文件发现 → mtime 缓存抽取 → 引用图 →
|
|
3
|
+
* personalized PageRank → 预算渲染。给模型一张「代码库导航图」,
|
|
4
|
+
* 让它不靠盲目 glob/grep 就知道项目结构和该先读哪里。 */
|
|
5
|
+
export type RepoMapOptions = {
|
|
6
|
+
root: string;
|
|
7
|
+
/** 任务描述:提到的符号成为 personalization 种子(边权 ×10) */
|
|
8
|
+
focus?: string;
|
|
9
|
+
/** 只索引这些前缀下的文件(相对路径,"/" 分隔) */
|
|
10
|
+
paths?: string[];
|
|
11
|
+
/** 渲染 token 预算(默认 1024,约等于 4KB 文本) */
|
|
12
|
+
tokenBudget?: number;
|
|
13
|
+
maxFiles?: number;
|
|
14
|
+
/** bundler 环境(Next 等)下注入 wasm 资源目录;Node 直跑无需传 */
|
|
15
|
+
vendorDirs?: {
|
|
16
|
+
runtime?: string;
|
|
17
|
+
grammar?: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export type RepoMapResult = {
|
|
21
|
+
text: string;
|
|
22
|
+
stats: {
|
|
23
|
+
fileCount: number;
|
|
24
|
+
symbolCount: number;
|
|
25
|
+
tokenEstimate: number;
|
|
26
|
+
indexedFiles: number;
|
|
27
|
+
hitCap: boolean;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
/** bundler 环境(Next 等)下定位 framework 依赖的 wasm 资源目录:从 framework
|
|
31
|
+
* 包真实磁盘位置出发(穿透 symlink),只需 Node 运行时,不依赖 bundler 的模块
|
|
32
|
+
* 解析。非 Node 运行时或无法定位时抛错——调用方应捕获并 fallback setWasmDirs。 */
|
|
33
|
+
export declare function resolveFrameworkVendorDirs(): {
|
|
34
|
+
runtime: string;
|
|
35
|
+
grammar: string;
|
|
36
|
+
};
|
|
37
|
+
export declare function renderRepoMap(opts: RepoMapOptions): Promise<RepoMapResult>;
|
|
38
|
+
//# sourceMappingURL=repomap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repomap.d.ts","sourceRoot":"","sources":["../../../src/core/repomap/repomap.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC;;sCAEsC;AAEtC,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,UAAU,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;CACjH,CAAC;AAEF;;2DAE2D;AAC3D,wBAAgB,0BAA0B,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAuBjF;AAgBD,wBAAsB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAkEhF"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { realpathSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { loadTagCache, saveTagCache, splitByFreshness, statFiles } from "./cache.js";
|
|
4
|
+
import { buildGraph, pagerank } from "./graph.js";
|
|
5
|
+
import { renderMapText } from "./render.js";
|
|
6
|
+
import { extractTags, listCodeFiles, setWasmDirs } from "./tags.js";
|
|
7
|
+
export { setWasmDirs } from "./tags.js";
|
|
8
|
+
/** bundler 环境(Next 等)下定位 framework 依赖的 wasm 资源目录:从 framework
|
|
9
|
+
* 包真实磁盘位置出发(穿透 symlink),只需 Node 运行时,不依赖 bundler 的模块
|
|
10
|
+
* 解析。非 Node 运行时或无法定位时抛错——调用方应捕获并 fallback setWasmDirs。 */
|
|
11
|
+
export function resolveFrameworkVendorDirs() {
|
|
12
|
+
const mod = process.getBuiltinModule?.("node:module");
|
|
13
|
+
const createRequireFn = mod?.createRequire;
|
|
14
|
+
if (typeof createRequireFn !== "function")
|
|
15
|
+
throw new Error("node:module.createRequire 不可用(非 Node 运行时)");
|
|
16
|
+
const req = createRequireFn(path.join(process.cwd(), "package.json"));
|
|
17
|
+
// 三个锚点按序尝试:package.json / 主入口(ESM-only 时两个都会被 exports 挡)/
|
|
18
|
+
// node_modules 硬拼(link 包必存在,last resort)
|
|
19
|
+
let entry;
|
|
20
|
+
try {
|
|
21
|
+
entry = req.resolve("@zmzai/agent-framework/package.json");
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
try {
|
|
25
|
+
entry = req.resolve("@zmzai/agent-framework");
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
entry = path.join(process.cwd(), "node_modules", "@zmzai", "agent-framework", "package.json");
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const real = realpathSync(entry);
|
|
32
|
+
const frameworkRoot = real.endsWith("package.json") ? path.dirname(real) : path.dirname(path.dirname(real));
|
|
33
|
+
return {
|
|
34
|
+
runtime: path.join(frameworkRoot, "node_modules", "web-tree-sitter"),
|
|
35
|
+
grammar: path.join(frameworkRoot, "node_modules", "tree-sitter-wasms", "out"),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const STOPWORDS = new Set([
|
|
39
|
+
"the", "and", "for", "with", "from", "that", "this", "then", "into", "when", "what", "where", "which", "how",
|
|
40
|
+
"function", "class", "return", "const", "let", "var", "import", "export", "type", "interface", "extends",
|
|
41
|
+
"async", "await", "error", "string", "number", "boolean", "object", "array", "value", "file", "files",
|
|
42
|
+
"def", "self", "none", "true", "false", "null", "undefined", "new", "test", "tests", "code",
|
|
43
|
+
]);
|
|
44
|
+
function mentionedIdents(focus) {
|
|
45
|
+
if (!focus)
|
|
46
|
+
return new Set();
|
|
47
|
+
const idents = focus.match(/[A-Za-z_$][\w$]{2,}/g) ?? [];
|
|
48
|
+
// 统一小写:任务里常写 PageRank 而 def 名是 pagerank
|
|
49
|
+
return new Set(idents.filter((name) => !STOPWORDS.has(name.toLowerCase())).map((name) => name.toLowerCase()));
|
|
50
|
+
}
|
|
51
|
+
export async function renderRepoMap(opts) {
|
|
52
|
+
if (opts.vendorDirs)
|
|
53
|
+
setWasmDirs(opts.vendorDirs);
|
|
54
|
+
const root = path.resolve(opts.root);
|
|
55
|
+
const tokenBudget = opts.tokenBudget ?? 1024;
|
|
56
|
+
const { files, skipped } = await listCodeFiles(root, {
|
|
57
|
+
maxFiles: opts.maxFiles ?? 5000,
|
|
58
|
+
filter: opts.paths?.length ? (rel) => opts.paths.some((prefix) => rel === prefix || rel.startsWith(prefix.endsWith("/") ? prefix : `${prefix}/`)) : undefined,
|
|
59
|
+
});
|
|
60
|
+
const cache = await loadTagCache(root);
|
|
61
|
+
const infos = await statFiles(root, files);
|
|
62
|
+
const { stale, freshTags } = splitByFreshness(cache, files, infos);
|
|
63
|
+
// 重析 stale 文件并回填缓存。抽取失败(如 bundler 环境下 wasm 不可达)
|
|
64
|
+
// 的文件跳过且不写缓存——下次调用自动重试,坏结果不会被记住。
|
|
65
|
+
const staleTags = [];
|
|
66
|
+
for (const file of stale) {
|
|
67
|
+
let tags;
|
|
68
|
+
try {
|
|
69
|
+
tags = await extractTags(file, path.join(root, file));
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
staleTags.push(...tags);
|
|
75
|
+
const info = infos.get(file);
|
|
76
|
+
if (info)
|
|
77
|
+
cache.entries[file] = { mtimeMs: info.mtimeMs, size: info.size, tags };
|
|
78
|
+
}
|
|
79
|
+
if (stale.length)
|
|
80
|
+
await saveTagCache(root, cache);
|
|
81
|
+
const allTags = [...freshTags, ...staleTags];
|
|
82
|
+
const mentioned = mentionedIdents(opts.focus);
|
|
83
|
+
const graph = buildGraph(allTags, mentioned);
|
|
84
|
+
// personalization:包含被提及定义的文件作为随机游走种子
|
|
85
|
+
const personalization = new Map();
|
|
86
|
+
if (mentioned.size) {
|
|
87
|
+
for (const tag of allTags) {
|
|
88
|
+
if (tag.kind === "def" && mentioned.has(tag.name.toLowerCase())) {
|
|
89
|
+
personalization.set(tag.file, (personalization.get(tag.file) ?? 0) + 1);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const rank = pagerank(graph, { personalization });
|
|
94
|
+
const defsFiles = new Set(allTags.filter((tag) => tag.kind === "def").map((tag) => tag.file));
|
|
95
|
+
const ranked = [...rank.entries()].sort((a, b) => b[1] - a[1]).map(([file]) => file);
|
|
96
|
+
// focus 种子文件置顶(PageRank 图只含有边节点——被提及但无人引用的文件
|
|
97
|
+
// 进不了图,必须显式加入);其后 PageRank 序;最后追加其余无边文件。
|
|
98
|
+
const seeded = new Set(personalization.keys());
|
|
99
|
+
const rankedFiles = [
|
|
100
|
+
...[...seeded].sort(),
|
|
101
|
+
...ranked.filter((file) => !seeded.has(file)),
|
|
102
|
+
...[...defsFiles].filter((file) => !rank.has(file) && !seeded.has(file)).sort(),
|
|
103
|
+
];
|
|
104
|
+
const rendered = renderMapText(rankedFiles, allTags, tokenBudget);
|
|
105
|
+
return {
|
|
106
|
+
text: rendered.text,
|
|
107
|
+
stats: {
|
|
108
|
+
fileCount: rendered.fileCount,
|
|
109
|
+
symbolCount: rendered.symbolCount,
|
|
110
|
+
tokenEstimate: rendered.tokens,
|
|
111
|
+
indexedFiles: files.length,
|
|
112
|
+
hitCap: skipped > 0,
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=repomap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repomap.js","sourceRoot":"","sources":["../../../src/core/repomap/repomap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** 符号标签(Aider Repo Map 的 tree-sitter 层):
|
|
2
|
+
* - def:定义(函数/类/方法/接口…),来自各语言 AST 节点类型 + name 字段;
|
|
3
|
+
* - ref:引用(identifier 系节点),用于构建「引用文件 → 定义文件」图。
|
|
4
|
+
* 不用 .scm query 文件——按语言写节点类型映射更少魔法,且 web-tree-sitter
|
|
5
|
+
* 运行时编译 query 的行为跨版本不稳。 */
|
|
6
|
+
export type Tag = {
|
|
7
|
+
file: string;
|
|
8
|
+
line: number;
|
|
9
|
+
name: string;
|
|
10
|
+
kind: "def" | "ref";
|
|
11
|
+
};
|
|
12
|
+
export declare function setWasmDirs(dirs: {
|
|
13
|
+
runtime?: string;
|
|
14
|
+
grammar?: string;
|
|
15
|
+
}): void;
|
|
16
|
+
/** 解析单文件为标签(缓存未命中路径)。语言不支持或解析失败返回空。 */
|
|
17
|
+
export declare function extractTags(relFile: string, absFile: string): Promise<Tag[]>;
|
|
18
|
+
/** 递归列出工作区内的代码文件(跳重目录,cap 防爆)。 */
|
|
19
|
+
export declare function listCodeFiles(root: string, opts?: {
|
|
20
|
+
maxFiles?: number;
|
|
21
|
+
filter?: (rel: string) => boolean;
|
|
22
|
+
}): Promise<{
|
|
23
|
+
files: string[];
|
|
24
|
+
skipped: number;
|
|
25
|
+
}>;
|
|
26
|
+
//# sourceMappingURL=tags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../../src/core/repomap/tags.ts"],"names":[],"mappings":"AAKA;;;;4BAI4B;AAE5B,MAAM,MAAM,GAAG,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,GAAG,KAAK,CAAA;CAAE,CAAC;AAOpF,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAI9E;AA8GD,uCAAuC;AACvC,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CA8BlF;AAED,kCAAkC;AAClC,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA6BpK"}
|