aws-runtime-bridge 1.9.51 → 1.9.55
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/package/acode/README.md +26 -0
- package/package/acode/dist/built-in-file-tools.d.ts +11 -0
- package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
- package/package/acode/dist/built-in-file-tools.js +4 -2
- package/package/acode/dist/built-in-symbols-tool.d.ts +7 -0
- package/package/acode/dist/built-in-symbols-tool.d.ts.map +1 -0
- package/package/acode/dist/built-in-symbols-tool.js +117 -0
- package/package/acode/dist/grammars/grammars/tree-sitter-bash.wasm +0 -0
- package/package/acode/dist/grammars/grammars/tree-sitter-c-sharp.wasm +0 -0
- package/package/acode/dist/grammars/grammars/tree-sitter-c.wasm +0 -0
- package/package/acode/dist/grammars/grammars/tree-sitter-cpp.wasm +0 -0
- package/package/acode/dist/grammars/grammars/tree-sitter-go.wasm +0 -0
- package/package/acode/dist/grammars/grammars/tree-sitter-java.wasm +0 -0
- package/package/acode/dist/grammars/grammars/tree-sitter-javascript.wasm +0 -0
- package/package/acode/dist/grammars/grammars/tree-sitter-jsx.wasm +0 -0
- package/package/acode/dist/grammars/grammars/tree-sitter-lua.wasm +0 -0
- package/package/acode/dist/grammars/grammars/tree-sitter-php.wasm +0 -0
- package/package/acode/dist/grammars/grammars/tree-sitter-python.wasm +0 -0
- package/package/acode/dist/grammars/grammars/tree-sitter-ruby.wasm +0 -0
- package/package/acode/dist/grammars/grammars/tree-sitter-rust.wasm +0 -0
- package/package/acode/dist/grammars/grammars/tree-sitter-tsx.wasm +0 -0
- package/package/acode/dist/grammars/grammars/tree-sitter-typescript.wasm +0 -0
- package/package/acode/dist/index.d.ts +7 -0
- package/package/acode/dist/index.d.ts.map +1 -1
- package/package/acode/dist/index.js +8 -0
- package/package/acode/dist/parsers/ast-cache.d.ts +33 -0
- package/package/acode/dist/parsers/ast-cache.d.ts.map +1 -0
- package/package/acode/dist/parsers/ast-cache.js +76 -0
- package/package/acode/dist/parsers/language-detector.d.ts +7 -0
- package/package/acode/dist/parsers/language-detector.d.ts.map +1 -0
- package/package/acode/dist/parsers/language-detector.js +44 -0
- package/package/acode/dist/parsers/language-queries.d.ts +5 -0
- package/package/acode/dist/parsers/language-queries.d.ts.map +1 -0
- package/package/acode/dist/parsers/language-queries.js +640 -0
- package/package/acode/dist/parsers/symbol-extractor.d.ts +8 -0
- package/package/acode/dist/parsers/symbol-extractor.d.ts.map +1 -0
- package/package/acode/dist/parsers/symbol-extractor.js +164 -0
- package/package/acode/dist/parsers/tree-sitter-loader.d.ts +18 -0
- package/package/acode/dist/parsers/tree-sitter-loader.d.ts.map +1 -0
- package/package/acode/dist/parsers/tree-sitter-loader.js +64 -0
- package/package/acode/dist/parsers/types.d.ts +61 -0
- package/package/acode/dist/parsers/types.d.ts.map +1 -0
- package/package/acode/dist/parsers/types.js +7 -0
- package/package/acode/dist/runtime.d.ts.map +1 -1
- package/package/acode/dist/runtime.js +75 -20
- package/package/acode/dist/sub-agent-manager.d.ts +16 -0
- package/package/acode/dist/sub-agent-manager.d.ts.map +1 -1
- package/package/acode/dist/sub-agent-manager.js +196 -15
- package/package/acode/dist/types.d.ts +1 -1
- package/package/acode/dist/types.d.ts.map +1 -1
- package/package/acode/package.json +4 -1
- package/package/aws-client-agent-mcp/dist/agent-client.test.js +64 -50
- package/package/aws-client-agent-mcp/dist/agent-client.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +3 -12
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +192 -115
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +38 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js +7 -7
- package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.test.js +22 -0
- package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js +3 -2
- package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +24 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js +61 -2
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.test.js +54 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.test.js.map +1 -1
- package/package.json +5 -3
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import { resolveWorkspaceTarget, ensureInsideWorkspace, } from "../built-in-file-tools.js";
|
|
3
|
+
import { astCache } from "./ast-cache.js";
|
|
4
|
+
import { detectLanguage } from "./language-detector.js";
|
|
5
|
+
import { LANGUAGE_QUERIES } from "./language-queries.js";
|
|
6
|
+
import { getParser, loadLanguage } from "./tree-sitter-loader.js";
|
|
7
|
+
// ── 常量 ────────────────────────────────────────────────────────────────
|
|
8
|
+
const MAX_SYMBOLS_FILE_SIZE = 1024 * 1024; // 1 MB(同 grep MAX_GREP_FILE_SIZE)
|
|
9
|
+
const MAX_SYMBOLS_OUTPUT_BYTES = 256 * 1024; // 256 KB
|
|
10
|
+
const DEFAULT_MAX_RESULTS = 100;
|
|
11
|
+
const ABSOLUTE_MAX_RESULTS = 500;
|
|
12
|
+
// ── Query 编译缓存(language:mode:queryText) ────────────────────────────
|
|
13
|
+
const queryCompileCache = new Map();
|
|
14
|
+
function hashString(s) {
|
|
15
|
+
let h = 0;
|
|
16
|
+
for (let i = 0; i < s.length; i++) {
|
|
17
|
+
h = ((h << 5) - h + s.charCodeAt(i)) | 0;
|
|
18
|
+
}
|
|
19
|
+
return h.toString(16);
|
|
20
|
+
}
|
|
21
|
+
async function getCompiledQuery(language, mode, queryText) {
|
|
22
|
+
const cacheKey = `${language.name}:${mode}:${hashString(queryText)}`;
|
|
23
|
+
const cached = queryCompileCache.get(cacheKey);
|
|
24
|
+
if (cached)
|
|
25
|
+
return cached;
|
|
26
|
+
const { Query } = await import("web-tree-sitter");
|
|
27
|
+
const q = new Query(language, queryText);
|
|
28
|
+
queryCompileCache.set(cacheKey, q);
|
|
29
|
+
return q;
|
|
30
|
+
}
|
|
31
|
+
// ── 辅助函数 ──────────────────────────────────────────────────────────────
|
|
32
|
+
function toDisplayPath(p) {
|
|
33
|
+
return p.replace(/\\/g, "/");
|
|
34
|
+
}
|
|
35
|
+
function buildSymbolResult(node, name, pattern, sourceLines) {
|
|
36
|
+
const result = {
|
|
37
|
+
kind: pattern.kind,
|
|
38
|
+
name,
|
|
39
|
+
line: node.startPosition.row + 1, // AST 是 0-based,对外 1-based
|
|
40
|
+
};
|
|
41
|
+
if (pattern.hasEndLine) {
|
|
42
|
+
result.endLine = node.endPosition.row + 1;
|
|
43
|
+
}
|
|
44
|
+
result.column = node.startPosition.column + 1;
|
|
45
|
+
// signature:definitions/outline 提取节点首行文本
|
|
46
|
+
if (pattern.hasEndLine || pattern.kind === "import") {
|
|
47
|
+
const firstLine = sourceLines[node.startPosition.row] ?? "";
|
|
48
|
+
result.signature = firstLine.trim();
|
|
49
|
+
}
|
|
50
|
+
// context:references 模式提取所在行
|
|
51
|
+
if (!pattern.hasEndLine && pattern.kind !== "import") {
|
|
52
|
+
const lineText = sourceLines[node.startPosition.row] ?? "";
|
|
53
|
+
result.context = lineText;
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
export async function extractSymbols(workingDirectory, filePath, mode, options) {
|
|
58
|
+
// 0. 参数默认值
|
|
59
|
+
const maxResults = Math.min(options.maxResults ?? DEFAULT_MAX_RESULTS, ABSOLUTE_MAX_RESULTS);
|
|
60
|
+
const kindFilter = options.kind ?? "all";
|
|
61
|
+
// 1. 解析 workspace 相对路径 + 安全校验(复用 grep 同款逻辑)
|
|
62
|
+
const target = await resolveWorkspaceTarget(workingDirectory, filePath);
|
|
63
|
+
const realPath = ensureInsideWorkspace(target.workspaceRoot, await fs.realpath(target.targetPath));
|
|
64
|
+
const stat = await fs.stat(realPath);
|
|
65
|
+
if (!stat.isFile()) {
|
|
66
|
+
throw new Error(`Path is not a file: ${filePath}`);
|
|
67
|
+
}
|
|
68
|
+
// 2. 大小上限校验
|
|
69
|
+
if (stat.size > MAX_SYMBOLS_FILE_SIZE) {
|
|
70
|
+
return {
|
|
71
|
+
ok: true, tool: "symbols", path: toDisplayPath(filePath), mode,
|
|
72
|
+
language: "unknown", symbols: [], truncated: false,
|
|
73
|
+
error: "file too large",
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// 3. 语言检测
|
|
77
|
+
const language = detectLanguage(realPath);
|
|
78
|
+
if (!language) {
|
|
79
|
+
return {
|
|
80
|
+
ok: true, tool: "symbols", path: toDisplayPath(filePath), mode,
|
|
81
|
+
language: "unknown", symbols: [], truncated: false,
|
|
82
|
+
error: "unsupported language",
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// 4. 加载 grammar
|
|
86
|
+
const langObj = await loadLanguage(language);
|
|
87
|
+
if (!langObj) {
|
|
88
|
+
return {
|
|
89
|
+
ok: true, tool: "symbols", path: toDisplayPath(filePath), mode,
|
|
90
|
+
language, symbols: [], truncated: false,
|
|
91
|
+
error: "grammar load failed",
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// 5. 取/建 AST(cache hit 时跳过 parse)
|
|
95
|
+
let tree = astCache.get(realPath, stat.mtimeMs, stat.size);
|
|
96
|
+
if (!tree) {
|
|
97
|
+
const parser = await getParser();
|
|
98
|
+
parser.setLanguage(langObj);
|
|
99
|
+
const source = await fs.readFile(realPath, "utf-8");
|
|
100
|
+
tree = parser.parse(source);
|
|
101
|
+
if (!tree) {
|
|
102
|
+
return {
|
|
103
|
+
ok: true, tool: "symbols", path: toDisplayPath(filePath), mode,
|
|
104
|
+
language, symbols: [], truncated: false,
|
|
105
|
+
error: "parse failed",
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
astCache.set(realPath, tree, language, stat.mtimeMs, stat.size);
|
|
109
|
+
}
|
|
110
|
+
// 6. 执行 query
|
|
111
|
+
const patterns = LANGUAGE_QUERIES[language]?.[mode] ?? [];
|
|
112
|
+
const results = [];
|
|
113
|
+
const sourceLines = tree.rootNode.text.split("\n");
|
|
114
|
+
let truncated = false;
|
|
115
|
+
let outputBytes = 0;
|
|
116
|
+
// pattern 编译(提前编译一次,无效正则立即报错)
|
|
117
|
+
let nameRegex = null;
|
|
118
|
+
if (options.pattern) {
|
|
119
|
+
try {
|
|
120
|
+
nameRegex = new RegExp(options.pattern);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
throw new Error(`Invalid pattern regex: ${error instanceof Error ? error.message : String(error)}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
for (const pattern of patterns) {
|
|
127
|
+
if (results.length >= maxResults) {
|
|
128
|
+
truncated = true;
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
if (kindFilter !== "all" && pattern.kind !== kindFilter)
|
|
132
|
+
continue;
|
|
133
|
+
const query = await getCompiledQuery(langObj, mode, pattern.query);
|
|
134
|
+
const matches = query.matches(tree.rootNode);
|
|
135
|
+
for (const match of matches) {
|
|
136
|
+
if (results.length >= maxResults) {
|
|
137
|
+
truncated = true;
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
const nameCapture = match.captures.find(c => c.name === "name");
|
|
141
|
+
const nodeCapture = match.captures.find(c => c.name === "node");
|
|
142
|
+
if (!nameCapture || !nodeCapture)
|
|
143
|
+
continue;
|
|
144
|
+
const name = nameCapture.node.text;
|
|
145
|
+
if (nameRegex && !nameRegex.test(name))
|
|
146
|
+
continue;
|
|
147
|
+
const sym = buildSymbolResult(nodeCapture.node, name, pattern, sourceLines);
|
|
148
|
+
// 输出字节上限
|
|
149
|
+
const symBytes = Buffer.byteLength(JSON.stringify(sym), "utf-8") + 64;
|
|
150
|
+
if (outputBytes + symBytes > MAX_SYMBOLS_OUTPUT_BYTES) {
|
|
151
|
+
truncated = true;
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
outputBytes += symBytes;
|
|
155
|
+
results.push(sym);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
ok: true, tool: "symbols",
|
|
160
|
+
path: toDisplayPath(filePath),
|
|
161
|
+
mode, language,
|
|
162
|
+
symbols: results, truncated,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Parser, Language } from "web-tree-sitter";
|
|
2
|
+
/**
|
|
3
|
+
* 懒初始化 Parser 单例。
|
|
4
|
+
* web-tree-sitter v0.25 要求在 new Parser() 之前显式 await Parser.init()
|
|
5
|
+
* 完成 WASM 运行时初始化,否则抛 "cannot construct a Parser before calling init()"。
|
|
6
|
+
*/
|
|
7
|
+
export declare function getParser(): Promise<Parser>;
|
|
8
|
+
/**
|
|
9
|
+
* 懒加载语言 grammar。
|
|
10
|
+
* 已加载的 language 直接复用 Map 缓存。
|
|
11
|
+
* WASM 损坏或不存在返回 null(不抛异常,由 extractor 决定回退)。
|
|
12
|
+
*/
|
|
13
|
+
export declare function loadLanguage(language: string): Promise<Language | null>;
|
|
14
|
+
/** 查询某语言 grammar 是否已加载(测试用) */
|
|
15
|
+
export declare function isLanguageLoaded(language: string): boolean;
|
|
16
|
+
/** 重置 loader 状态(仅测试用:清空 parser 和 language 缓存) */
|
|
17
|
+
export declare function resetLoader(): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=tree-sitter-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-sitter-loader.d.ts","sourceRoot":"","sources":["../../src/parsers/tree-sitter-loader.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAMnD;;;;GAIG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CASjD;AAcD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAe7E;AAED,+BAA+B;AAC/B,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,iDAAiD;AACjD,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAGjD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { Parser, Language } from "web-tree-sitter";
|
|
5
|
+
// 进程级单例:避免重复初始化(~50ms)
|
|
6
|
+
let parserPromise = null;
|
|
7
|
+
const loadedLanguages = new Map();
|
|
8
|
+
/**
|
|
9
|
+
* 懒初始化 Parser 单例。
|
|
10
|
+
* web-tree-sitter v0.25 要求在 new Parser() 之前显式 await Parser.init()
|
|
11
|
+
* 完成 WASM 运行时初始化,否则抛 "cannot construct a Parser before calling init()"。
|
|
12
|
+
*/
|
|
13
|
+
export async function getParser() {
|
|
14
|
+
if (!parserPromise) {
|
|
15
|
+
parserPromise = (async () => {
|
|
16
|
+
await Parser.init();
|
|
17
|
+
const parser = new Parser();
|
|
18
|
+
return parser;
|
|
19
|
+
})();
|
|
20
|
+
}
|
|
21
|
+
return parserPromise;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 解析 grammar wasm 文件路径。
|
|
25
|
+
*
|
|
26
|
+
* 当前文件位置:
|
|
27
|
+
* - 开发态:src/parsers/tree-sitter-loader.ts → ../../grammars/
|
|
28
|
+
* - 生产态:dist/parsers/tree-sitter-loader.js → ../../grammars/(cpy 复制到 dist/grammars/)
|
|
29
|
+
*/
|
|
30
|
+
function resolveGrammarPath(language) {
|
|
31
|
+
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
32
|
+
return path.resolve(moduleDir, "../../grammars", `tree-sitter-${language}.wasm`);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 懒加载语言 grammar。
|
|
36
|
+
* 已加载的 language 直接复用 Map 缓存。
|
|
37
|
+
* WASM 损坏或不存在返回 null(不抛异常,由 extractor 决定回退)。
|
|
38
|
+
*/
|
|
39
|
+
export async function loadLanguage(language) {
|
|
40
|
+
const cached = loadedLanguages.get(language);
|
|
41
|
+
if (cached)
|
|
42
|
+
return cached;
|
|
43
|
+
const wasmPath = resolveGrammarPath(language);
|
|
44
|
+
try {
|
|
45
|
+
const parser = await getParser();
|
|
46
|
+
const languageData = await fs.readFile(wasmPath);
|
|
47
|
+
const lang = await Language.load(languageData);
|
|
48
|
+
parser.setLanguage(lang);
|
|
49
|
+
loadedLanguages.set(language, lang);
|
|
50
|
+
return lang;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** 查询某语言 grammar 是否已加载(测试用) */
|
|
57
|
+
export function isLanguageLoaded(language) {
|
|
58
|
+
return loadedLanguages.has(language);
|
|
59
|
+
}
|
|
60
|
+
/** 重置 loader 状态(仅测试用:清空 parser 和 language 缓存) */
|
|
61
|
+
export async function resetLoader() {
|
|
62
|
+
parserPromise = null;
|
|
63
|
+
loadedLanguages.clear();
|
|
64
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tree-sitter symbols 工具的共享类型定义。
|
|
3
|
+
*
|
|
4
|
+
* SymbolKind 统一映射 13 种语言的 AST 节点类型,
|
|
5
|
+
* 让 agent 不需要关心具体语言的节点名差异。
|
|
6
|
+
*/
|
|
7
|
+
/** 符号类型(跨语言统一映射) */
|
|
8
|
+
export type SymbolKind = "function" | "class" | "method" | "variable" | "import" | "error";
|
|
9
|
+
/** 查询模式 */
|
|
10
|
+
export type SymbolMode = "definitions" | "references" | "outline";
|
|
11
|
+
/**
|
|
12
|
+
* 单个符号结果。
|
|
13
|
+
*
|
|
14
|
+
* kind 语义:
|
|
15
|
+
* - definitions/outline 模式下:声明类型
|
|
16
|
+
* - references 模式下:被引用符号的类型(如对函数的调用 kind="function")
|
|
17
|
+
*/
|
|
18
|
+
export interface SymbolResult {
|
|
19
|
+
kind: SymbolKind;
|
|
20
|
+
name: string;
|
|
21
|
+
/** 1-based 起始行 */
|
|
22
|
+
line: number;
|
|
23
|
+
/** 1-based 结束行(definitions/outline 才有) */
|
|
24
|
+
endLine?: number;
|
|
25
|
+
/** 1-based 起始列 */
|
|
26
|
+
column?: number;
|
|
27
|
+
/** 函数签名/类声明头部(definitions/outline 才有) */
|
|
28
|
+
signature?: string;
|
|
29
|
+
/** 引用所在行的源码文本(references 模式才有) */
|
|
30
|
+
context?: string;
|
|
31
|
+
}
|
|
32
|
+
/** outline 模式下的嵌套节点 */
|
|
33
|
+
export interface OutlineNode extends SymbolResult {
|
|
34
|
+
children?: OutlineNode[];
|
|
35
|
+
}
|
|
36
|
+
/** symbols 工具的统一响应外壳 */
|
|
37
|
+
export interface SymbolsResponse {
|
|
38
|
+
ok: boolean;
|
|
39
|
+
tool: "symbols";
|
|
40
|
+
/** workspace-relative 路径 */
|
|
41
|
+
path: string;
|
|
42
|
+
mode: SymbolMode;
|
|
43
|
+
/** "typescript" | "python" | ... | "unknown" */
|
|
44
|
+
language: string;
|
|
45
|
+
symbols: SymbolResult[];
|
|
46
|
+
truncated: boolean;
|
|
47
|
+
/** 解析失败/不支持时的错误说明 */
|
|
48
|
+
error?: string;
|
|
49
|
+
}
|
|
50
|
+
/** 单条 query 模板定义 */
|
|
51
|
+
export interface QueryPattern {
|
|
52
|
+
/** S-expression 查询字符串 */
|
|
53
|
+
query: string;
|
|
54
|
+
/** 匹配节点的 kind */
|
|
55
|
+
kind: SymbolKind;
|
|
56
|
+
/** 是否带 endLine(definitions/outline 才有) */
|
|
57
|
+
hasEndLine?: boolean;
|
|
58
|
+
}
|
|
59
|
+
/** 每语言的 query 模板集合 */
|
|
60
|
+
export type LanguageQueryPack = Record<SymbolMode, QueryPattern[]>;
|
|
61
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/parsers/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oBAAoB;AACpB,MAAM,MAAM,UAAU,GAClB,UAAU,GACV,OAAO,GACP,QAAQ,GACR,UAAU,GACV,QAAQ,GACR,OAAO,CAAC;AAEZ,WAAW;AACX,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,CAAC;AAElE;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,uBAAuB;AACvB,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC/C,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED,wBAAwB;AACxB,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,SAAS,CAAC;IAChB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,oBAAoB;AACpB,MAAM,WAAW,YAAY;IAC3B,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,sBAAsB;AACtB,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAInE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAE/E,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,0BAA0B,CAAC;AA+BlC,OAAO,KAAK,EAOV,kBAAkB,EAGnB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,KAAK,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,UAAU,CAAC;CACzB;AAiyCD,qBAAa,YAAa,SAAQ,YAAY;IAiGhC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAhGnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,mBAAmB,CAAqB;IAEhD,OAAO,CAAC,KAAK,CAwBX;IAEF,OAAO,CAAC,eAAe,CAAgC;IAEvD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAkC;IAEzE;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAkC;IAE9E,OAAO,CAAC,WAAW,CAAoC;IAEvD,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,cAAc,CAAS;IAE/B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,oBAAoB,CAA0B;IAEtD,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;IACrD,4BAA4B;IAC5B,OAAO,CAAC,oBAAoB,CAA+C;IAC3E,0DAA0D;IAC1D,OAAO,CAAC,SAAS,CAA+B;IAChD,mCAAmC;IACnC,OAAO,CAAC,aAAa,CAAsB;IAC3C,oCAAoC;IACpC,OAAO,CAAC,iBAAiB,CAA8C;IACvE,uBAAuB;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAO;IAExD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAOlB;gBAEe,MAAM,EAAE,kBAAkB;IAevD,2CAA2C;IAC3C,iBAAiB,IAAI,MAAM,EAAE;IAI7B,OAAO,CAAC,cAAc;IAatB;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAqB7B;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1118,6 +1118,13 @@ export class ACodeRuntime extends EventEmitter {
|
|
|
1118
1118
|
* 如有初始 prompt 则执行一轮响应。
|
|
1119
1119
|
*/
|
|
1120
1120
|
async start() {
|
|
1121
|
+
// ★ 可见性:start() 早期阶段标记。子 agent(尤其 memory auto-delegate)在
|
|
1122
|
+
// emit session_started 之前若卡住(loadAcodeConfig/loadAllSkills/loadAcodeCommands
|
|
1123
|
+
// 读盘挂起、fetchProfilePrompt/hookBus.dispatch 调用无响应),前端 modal 会显示
|
|
1124
|
+
// "运行中 + 0消息 + 0tokens + 当前工具 -",与"从未运行"无法区分。
|
|
1125
|
+
// 在每个可能卡住的异步步骤前 emit startup_phase,让 SubAgentManager 据此更新
|
|
1126
|
+
// contextSnapshot.currentTool,前端可精确定位卡点。
|
|
1127
|
+
this.emitAcodeEvent("startup_phase", { phase: "loading_config" });
|
|
1121
1128
|
const acodeConfig = await loadAcodeConfig(this.config.configPath);
|
|
1122
1129
|
// Skills 来源(按优先级,后加载的覆盖先加载的同名 skill):
|
|
1123
1130
|
// 1. 全局目录(~/.acode/skills,由 config.skillsDir 指定)
|
|
@@ -1125,6 +1132,7 @@ export class ACodeRuntime extends EventEmitter {
|
|
|
1125
1132
|
// 3. 项目目录(<workingDirectory>/.agentswork/skills)
|
|
1126
1133
|
// 各目录的 skills 合并后供 SkillTool / prompt 使用;分组信息供前端按目录展示。
|
|
1127
1134
|
// 即使目录不存在也会作为空节点返回,前端按目录展示。
|
|
1135
|
+
this.emitAcodeEvent("startup_phase", { phase: "loading_skills" });
|
|
1128
1136
|
const { skills, skillGroups, watchedDirs } = await this.loadAllSkills();
|
|
1129
1137
|
const provider = resolveProviderConfig(this.config, acodeConfig);
|
|
1130
1138
|
// [DEBUG] ACode Runtime 最终解析的 provider 配置(写入 stdout,bridge 会捕获)
|
|
@@ -1140,6 +1148,7 @@ export class ACodeRuntime extends EventEmitter {
|
|
|
1140
1148
|
: await this.connectMcpServers(acodeConfig.mcpServers ?? {}, provider.mcpToolTimeoutMs);
|
|
1141
1149
|
const ownsMcpConnections = !this.config.sharedMcpConnections;
|
|
1142
1150
|
// 获取用户 profile 信息并拼接在 rolePrompt 下方
|
|
1151
|
+
this.emitAcodeEvent("startup_phase", { phase: "fetching_profile" });
|
|
1143
1152
|
const profilePrompt = await this.fetchProfilePrompt(mcpConnections);
|
|
1144
1153
|
const agentId = this.config.agentId || "unknown";
|
|
1145
1154
|
// 重启时清理旧 spillover 输出
|
|
@@ -1164,6 +1173,7 @@ export class ACodeRuntime extends EventEmitter {
|
|
|
1164
1173
|
...mcpConnections.flatMap((connection) => connection.tools),
|
|
1165
1174
|
];
|
|
1166
1175
|
const commandDirs = this.resolveCommandDirs(acodeConfig);
|
|
1176
|
+
this.emitAcodeEvent("startup_phase", { phase: "loading_commands" });
|
|
1167
1177
|
const commands = await loadAcodeCommands(commandDirs);
|
|
1168
1178
|
const commandRegistry = new ACodeCommandRegistry(commands);
|
|
1169
1179
|
const skillPrompt = buildSkillPrompt(skills);
|
|
@@ -1211,6 +1221,7 @@ export class ACodeRuntime extends EventEmitter {
|
|
|
1211
1221
|
accumulatedInputTokens: 0,
|
|
1212
1222
|
accumulatedOutputTokens: 0,
|
|
1213
1223
|
};
|
|
1224
|
+
this.emitAcodeEvent("startup_phase", { phase: "session_start_hook" });
|
|
1214
1225
|
await this.hookBus.dispatch("SessionStart", {
|
|
1215
1226
|
workingDirectory: this.config.workingDirectory,
|
|
1216
1227
|
model: provider.model,
|
|
@@ -2146,30 +2157,66 @@ export class ACodeRuntime extends EventEmitter {
|
|
|
2146
2157
|
};
|
|
2147
2158
|
const abortController = new AbortController();
|
|
2148
2159
|
this.abortController = abortController;
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
+
// ★ 安全修复:用外层 withTimeout(requestTotalTimeoutMs) 兜底整个摘要请求,
|
|
2161
|
+
// 防止 provider 持续发送 SSE keep-alive 或 chunk 间隔 < 60s 导致 idle timeout
|
|
2162
|
+
// 永不触发、摘要请求永久挂起。与 requestChatCompletion 的安全模式一致。
|
|
2163
|
+
// 否则子 agent 触发主动压缩时,requestChatCompletion 卡在 performCompaction →
|
|
2164
|
+
// summarizeConversationWithLLM → fetch 永久挂起,ai_request 事件不发射,
|
|
2165
|
+
// 前端 snapshot 全 0(当前工具"-" / 消息数 0 / Tokens 0/0)。
|
|
2166
|
+
let timedOut = false;
|
|
2167
|
+
try {
|
|
2168
|
+
return await withTimeout((async () => {
|
|
2169
|
+
const response = await withTimeout(fetch(normalizeChatCompletionsUrl(baseURL), {
|
|
2170
|
+
method: "POST",
|
|
2171
|
+
headers,
|
|
2172
|
+
body: JSON.stringify(requestBody),
|
|
2173
|
+
signal: abortController.signal,
|
|
2174
|
+
}), provider.requestTimeoutMs, "ACode LLM summarization", () => {
|
|
2175
|
+
timedOut = true;
|
|
2176
|
+
abortController.abort();
|
|
2177
|
+
});
|
|
2178
|
+
if (!response.ok) {
|
|
2179
|
+
// ★ 防御修复:用 withTimeout 包裹 response.text(),防止错误响应 body stream 挂起
|
|
2180
|
+
const errorBody = await withTimeout(response.text(), provider.requestTimeoutMs, "ACode LLM summarization error response body", () => {
|
|
2181
|
+
timedOut = true;
|
|
2182
|
+
abortController.abort();
|
|
2183
|
+
});
|
|
2184
|
+
const truncatedBody = errorBody.length > 500
|
|
2185
|
+
? `${errorBody.slice(0, 500)}...(truncated, total ${errorBody.length} chars)`
|
|
2186
|
+
: errorBody;
|
|
2187
|
+
throw new Error(`ACode LLM summarization request failed: ${response.status} ${truncatedBody}`);
|
|
2188
|
+
}
|
|
2189
|
+
// ★ 防御修复:用 withTimeout 包裹 response.json(),防止成功响应 body stream
|
|
2190
|
+
// 挂起(provider 返回 200 但 body 永不结束)导致摘要永久阻塞。
|
|
2191
|
+
// 此前缺失此包裹,是子 agent 卡死的核心原因之一。
|
|
2192
|
+
const payload = (await withTimeout(response.json(), provider.requestTimeoutMs, "ACode LLM summarization response body", () => {
|
|
2193
|
+
timedOut = true;
|
|
2194
|
+
abortController.abort();
|
|
2195
|
+
}));
|
|
2196
|
+
const content = payload.choices?.[0]?.message?.content;
|
|
2197
|
+
if (!content || content.trim().length === 0) {
|
|
2198
|
+
throw new Error("ACode LLM summarization returned empty content");
|
|
2199
|
+
}
|
|
2200
|
+
return content;
|
|
2201
|
+
})(), provider.requestTotalTimeoutMs, "ACode LLM summarization total", () => {
|
|
2202
|
+
// 总预算超时:abort 底层 fetch / body reader,避免泄漏
|
|
2160
2203
|
abortController.abort();
|
|
2161
2204
|
});
|
|
2162
|
-
const truncatedBody = errorBody.length > 500
|
|
2163
|
-
? `${errorBody.slice(0, 500)}...(truncated, total ${errorBody.length} chars)`
|
|
2164
|
-
: errorBody;
|
|
2165
|
-
throw new Error(`ACode LLM summarization request failed: ${response.status} ${truncatedBody}`);
|
|
2166
2205
|
}
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
|
|
2170
|
-
|
|
2206
|
+
catch (error) {
|
|
2207
|
+
// 区分 abort 原因:idle 超时 / 总预算超时 / 主动 abort,给出明确错误信息
|
|
2208
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
2209
|
+
throw timedOut
|
|
2210
|
+
? new Error(`ACode LLM summarization timed out after ${provider.requestTimeoutMs}ms`)
|
|
2211
|
+
: new Error("ACode LLM summarization aborted");
|
|
2212
|
+
}
|
|
2213
|
+
throw error;
|
|
2214
|
+
}
|
|
2215
|
+
finally {
|
|
2216
|
+
if (this.abortController === abortController) {
|
|
2217
|
+
this.abortController = null;
|
|
2218
|
+
}
|
|
2171
2219
|
}
|
|
2172
|
-
return content;
|
|
2173
2220
|
}
|
|
2174
2221
|
async requestChatCompletion(commandAllowedTools) {
|
|
2175
2222
|
const provider = this.state.provider;
|
|
@@ -3233,6 +3280,14 @@ ${urisText}
|
|
|
3233
3280
|
runtimeDebugLog(`[ACodeRuntime] Auto-delegated memory ${delegate.type} to sub-agent ${subId} (${newUris.length} URIs, ${delegate.uris.length - newUris.length} already in progress)`);
|
|
3234
3281
|
}
|
|
3235
3282
|
catch (e) {
|
|
3283
|
+
// 委托失败:解除本批 URI 的锁,避免下次 poll 因 pendingMemorySubAgents 仍含该 URI
|
|
3284
|
+
// 而永久跳过、永不重试(否则该 memory 的文件变更通知会被一直抑制)。
|
|
3285
|
+
// newUris 在进入本迭代前已过滤掉已在锁中的 URI,所以这里清除的只可能是本次刚加的锁。
|
|
3286
|
+
// 若子 agent 已 spawn 但从未真正启动,由 SubAgentManager 的僵尸看门狗回收为 failed,
|
|
3287
|
+
// 经订阅回调清除冷却后,下次 poll 可重新委托。
|
|
3288
|
+
for (const uri of newUris) {
|
|
3289
|
+
this.pendingMemorySubAgents.delete(uri);
|
|
3290
|
+
}
|
|
3236
3291
|
// 委托失败时不返回给主 agent:memory 通知不应打断主 agent 的主线任务,
|
|
3237
3292
|
// 下次 poll_message 会重新检测并重试委托
|
|
3238
3293
|
runtimeDebugLog(`[ACodeRuntime] Failed to auto-delegate memory ${delegate.type} (suppressed, will retry next poll): ${e instanceof Error ? e.message : String(e)}`);
|
|
@@ -252,6 +252,22 @@ export declare class SubAgentManager {
|
|
|
252
252
|
* 释放内存,store 仍保留历史记录供查询。
|
|
253
253
|
*/
|
|
254
254
|
private cleanupCompletedEntries;
|
|
255
|
+
/**
|
|
256
|
+
* 存活期僵尸回收:扫描卡在 pending / running 过久的子 agent 并标记为 failed。
|
|
257
|
+
*
|
|
258
|
+
* 背景:runEntryToCompletion* 会在启动后数秒内把状态翻成 running;若长时间保持
|
|
259
|
+
* pending,说明 startWithRecheck 抛错被调用方静默吞掉、或启动函数从未真正执行,
|
|
260
|
+
* 子 agent 成了孤儿却仍占着 runtime.pendingMemorySubAgents 的 URI 锁,导致该
|
|
261
|
+
* memory 的文件变更通知被永久抑制、永不重试(reconcileZombies 仅在 bridge 启动时跑)。
|
|
262
|
+
* running 卡死则多因 runtime.start()/submit() 挂起。
|
|
263
|
+
*
|
|
264
|
+
* 回收时复用与正常终态一致的处理(store 落盘 failed + emit failed 事件 +
|
|
265
|
+
* 释放 completion + 停 runtime)。runtime 订阅了 failed 事件,会据此清除
|
|
266
|
+
* pendingMemorySubAgents 中的 URI 并进入冷却,从而解除死锁、允许下次重新委托。
|
|
267
|
+
*/
|
|
268
|
+
private recoverZombieEntries;
|
|
269
|
+
/** 将孤儿/卡死子 agent 标记为 failed 并走正常终态流程(不依赖 LLM 自报) */
|
|
270
|
+
private recoverZombie;
|
|
255
271
|
/** 从 store 中查找记录(entry 已从内存清理时使用) */
|
|
256
272
|
private findRecordInStore;
|
|
257
273
|
private handleRuntimeEvent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sub-agent-manager.d.ts","sourceRoot":"","sources":["../src/sub-agent-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EACV,uBAAuB,EACvB,aAAa,EAEb,cAAc,EACd,YAAY,EACb,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"sub-agent-manager.d.ts","sourceRoot":"","sources":["../src/sub-agent-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EACV,uBAAuB,EACvB,aAAa,EAEb,cAAc,EACd,YAAY,EACb,MAAM,sBAAsB,CAAC;AA2C9B;;;GAGG;AACH,MAAM,WAAW,8BAA8B;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,KACT,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE1D,eAAe;AACf,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,YAAY,EAAE,kBAAkB,CAAC;IACjC,+EAA+E;IAC/E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,mCAAmC;AACnC,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,YAAY,CAAC;IACtB,eAAe,EAAE,eAAe,CAAC;IACjC,eAAe,EAAE,uBAAuB,CAAC;IACzC,0CAA0C;IAC1C,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,0DAA0D;IAC1D,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACzE,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IACtC,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,kEAAkE;IAClE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,2BAA2B;AAC3B,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,aAAa,CAAC;IACrB,gBAAgB;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,KAAK,eAAe,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IACnE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuC;IACpE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgD;IAC5E,uBAAuB;IACvB,OAAO,CAAC,YAAY,CAA+C;IAEnE;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwC;IACxE;;;OAGG;IACH,OAAO,CAAC,uBAAuB,CAAkE;gBAErF,IAAI,EAAE,sBAAsB;IAexC,sCAAsC;IAChC,KAAK,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;IA0ExD;;;;;;;OAOG;IACG,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBzC;;;;;;;;;OASG;IACG,gBAAgB,CACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,iBAAiB,EAC1B,UAAU,GAAE,MAAU,GACrB,OAAO,CAAC,IAAI,CAAC;IAqBhB;;;;;;;;OAQG;IACG,eAAe,CACnB,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,GAAE,MAAU,GACpB,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC;IA+E5F;;;;;;;;;;;;;OAaG;YACW,oBAAoB;IAgGlC;;;;;;;;;;;OAWG;YACW,+BAA+B;IA0K7C;;;OAGG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAgBjF,uBAAuB;IACjB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BzC,mBAAmB;IACnB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIrD,8CAA8C;IAC9C,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,aAAa,EAAE;IAQpD;;;;;OAKG;IACH,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,aAAa,EAAE;IAM1D;;;;;;OAMG;IACH,sBAAsB,IAAI,8BAA8B,EAAE;IAM1D;;;;;;;;;;OAUG;IACH,oBAAoB,IAAI;QACtB,OAAO,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;QACjD,MAAM,EAAE,MAAM,IAAI,CAAC;KACpB;IAyBD,sCAAsC;IACtC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe,GAAG,MAAM,IAAI;IAazD,uCAAuC;IACjC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAc9B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IA+BzB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,mBAAmB;IAQ3B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAc/B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,oBAAoB;IAW5B,oDAAoD;YACtC,aAAa;IAiC3B,qCAAqC;YACvB,iBAAiB;IAW/B,OAAO,CAAC,kBAAkB;IA4F1B,OAAO,CAAC,SAAS;IA2CjB,OAAO,CAAC,QAAQ;IAmBhB,6BAA6B;IAC7B,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS;CAGvE"}
|