chivgent 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +359 -0
- package/README.zh-CN.md +345 -0
- package/dist/agent.d.ts +58 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +281 -0
- package/dist/agent.js.map +1 -0
- package/dist/cli-options.d.ts +33 -0
- package/dist/cli-options.d.ts.map +1 -0
- package/dist/cli-options.js +151 -0
- package/dist/cli-options.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +233 -0
- package/dist/cli.js.map +1 -0
- package/dist/events.d.ts +79 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +12 -0
- package/dist/events.js.map +1 -0
- package/dist/llm.d.ts +38 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +17 -0
- package/dist/llm.js.map +1 -0
- package/dist/messages.d.ts +23 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +2 -0
- package/dist/messages.js.map +1 -0
- package/dist/providers/deepseek.d.ts +12 -0
- package/dist/providers/deepseek.d.ts.map +1 -0
- package/dist/providers/deepseek.js +15 -0
- package/dist/providers/deepseek.js.map +1 -0
- package/dist/providers/openai-compatible-chat.d.ts +25 -0
- package/dist/providers/openai-compatible-chat.d.ts.map +1 -0
- package/dist/providers/openai-compatible-chat.js +293 -0
- package/dist/providers/openai-compatible-chat.js.map +1 -0
- package/dist/providers/openai.d.ts +16 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +183 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/render.d.ts +26 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +95 -0
- package/dist/render.js.map +1 -0
- package/dist/repl.d.ts +29 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +119 -0
- package/dist/repl.js.map +1 -0
- package/dist/retry.d.ts +42 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +186 -0
- package/dist/retry.js.map +1 -0
- package/dist/session-store.d.ts +66 -0
- package/dist/session-store.d.ts.map +1 -0
- package/dist/session-store.js +183 -0
- package/dist/session-store.js.map +1 -0
- package/dist/session.d.ts +49 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +115 -0
- package/dist/session.js.map +1 -0
- package/dist/tools/list-files.d.ts +24 -0
- package/dist/tools/list-files.d.ts.map +1 -0
- package/dist/tools/list-files.js +80 -0
- package/dist/tools/list-files.js.map +1 -0
- package/dist/tools/output.d.ts +10 -0
- package/dist/tools/output.d.ts.map +1 -0
- package/dist/tools/output.js +44 -0
- package/dist/tools/output.js.map +1 -0
- package/dist/tools/read-file.d.ts +29 -0
- package/dist/tools/read-file.d.ts.map +1 -0
- package/dist/tools/read-file.js +150 -0
- package/dist/tools/read-file.js.map +1 -0
- package/dist/tools/search-text.d.ts +28 -0
- package/dist/tools/search-text.d.ts.map +1 -0
- package/dist/tools/search-text.js +94 -0
- package/dist/tools/search-text.js.map +1 -0
- package/dist/tools/tool.d.ts +22 -0
- package/dist/tools/tool.d.ts.map +1 -0
- package/dist/tools/tool.js +2 -0
- package/dist/tools/tool.js.map +1 -0
- package/dist/workspace.d.ts +72 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +504 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
import { lstat, readFile, readdir, realpath } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import createIgnore, {} from "ignore";
|
|
4
|
+
const DEFAULT_MAX_FILE_BYTES = 256 * 1024;
|
|
5
|
+
const DEFAULT_READ_LINE_COUNT = 200;
|
|
6
|
+
const MAX_READ_LINE_COUNT = 500;
|
|
7
|
+
const DEFAULT_LIST_DEPTH = 4;
|
|
8
|
+
const MAX_LIST_DEPTH = 8;
|
|
9
|
+
const DEFAULT_LIST_ENTRIES = 200;
|
|
10
|
+
const MAX_LIST_ENTRIES = 1_000;
|
|
11
|
+
const DEFAULT_SEARCH_RESULTS = 50;
|
|
12
|
+
const MAX_SEARCH_RESULTS = 200;
|
|
13
|
+
const DEFAULT_MAX_SEARCH_FILES = 2_000;
|
|
14
|
+
const DEFAULT_MAX_SEARCH_BYTES = 10 * 1024 * 1024;
|
|
15
|
+
const MAX_QUERY_CHARACTERS = 256;
|
|
16
|
+
const MAX_PREVIEW_CHARACTERS = 300;
|
|
17
|
+
const MAX_RELATIVE_PATH_CHARACTERS = 4_096;
|
|
18
|
+
const DEFAULT_IGNORE_PATTERNS = [
|
|
19
|
+
".git/",
|
|
20
|
+
"node_modules/",
|
|
21
|
+
"dist/",
|
|
22
|
+
"build/",
|
|
23
|
+
"coverage/",
|
|
24
|
+
".next/",
|
|
25
|
+
".cache/",
|
|
26
|
+
];
|
|
27
|
+
const ALLOWED_ENV_FILES = new Set([
|
|
28
|
+
".env.example",
|
|
29
|
+
".env.sample",
|
|
30
|
+
".env.template",
|
|
31
|
+
]);
|
|
32
|
+
const FORBIDDEN_DIRECTORY_NAMES = new Set([".git", ".ssh", ".aws"]);
|
|
33
|
+
const FORBIDDEN_FILE_NAMES = new Set([
|
|
34
|
+
".npmrc",
|
|
35
|
+
".pypirc",
|
|
36
|
+
"id_rsa",
|
|
37
|
+
"id_ed25519",
|
|
38
|
+
]);
|
|
39
|
+
const FORBIDDEN_FILE_EXTENSIONS = new Set([".pem", ".key", ".p12", ".pfx"]);
|
|
40
|
+
export class WorkspaceError extends Error {
|
|
41
|
+
code;
|
|
42
|
+
constructor(code, message, options) {
|
|
43
|
+
super(message, options);
|
|
44
|
+
this.code = code;
|
|
45
|
+
this.name = "WorkspaceError";
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export class LocalWorkspace {
|
|
49
|
+
root;
|
|
50
|
+
maxFileBytes;
|
|
51
|
+
maxSearchFiles;
|
|
52
|
+
maxSearchBytes;
|
|
53
|
+
constructor(root, options = {}) {
|
|
54
|
+
this.root = path.resolve(root);
|
|
55
|
+
this.maxFileBytes = boundedPositiveInteger(options.maxFileBytes ?? DEFAULT_MAX_FILE_BYTES, "maxFileBytes", DEFAULT_MAX_FILE_BYTES);
|
|
56
|
+
this.maxSearchFiles = boundedPositiveInteger(options.maxSearchFiles ?? DEFAULT_MAX_SEARCH_FILES, "maxSearchFiles", DEFAULT_MAX_SEARCH_FILES);
|
|
57
|
+
this.maxSearchBytes = boundedPositiveInteger(options.maxSearchBytes ?? DEFAULT_MAX_SEARCH_BYTES, "maxSearchBytes", DEFAULT_MAX_SEARCH_BYTES);
|
|
58
|
+
}
|
|
59
|
+
async readTextFile(relativePath, options = {}) {
|
|
60
|
+
const startLine = boundedPositiveInteger(options.startLine ?? 1, "startLine", Number.MAX_SAFE_INTEGER);
|
|
61
|
+
const lineCount = boundedPositiveInteger(options.lineCount ?? DEFAULT_READ_LINE_COUNT, "lineCount", MAX_READ_LINE_COUNT);
|
|
62
|
+
const contents = await this.readFullTextFile(relativePath);
|
|
63
|
+
const lines = splitLinesPreservingEndings(contents);
|
|
64
|
+
if (lines.length === 0) {
|
|
65
|
+
if (startLine !== 1) {
|
|
66
|
+
throw invalidRange(relativePath, startLine, 0);
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
content: "",
|
|
70
|
+
startLine: 1,
|
|
71
|
+
endLine: 0,
|
|
72
|
+
totalLines: 0,
|
|
73
|
+
truncated: false,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
if (startLine > lines.length) {
|
|
77
|
+
throw invalidRange(relativePath, startLine, lines.length);
|
|
78
|
+
}
|
|
79
|
+
const endLine = Math.min(lines.length, startLine + lineCount - 1);
|
|
80
|
+
return {
|
|
81
|
+
content: lines.slice(startLine - 1, endLine).join(""),
|
|
82
|
+
startLine,
|
|
83
|
+
endLine,
|
|
84
|
+
totalLines: lines.length,
|
|
85
|
+
truncated: endLine < lines.length,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
async listFiles(options = {}) {
|
|
89
|
+
const relativePath = options.path ?? ".";
|
|
90
|
+
const maxDepth = boundedPositiveInteger(options.maxDepth ?? DEFAULT_LIST_DEPTH, "maxDepth", MAX_LIST_DEPTH);
|
|
91
|
+
const maxEntries = boundedPositiveInteger(options.maxEntries ?? DEFAULT_LIST_ENTRIES, "maxEntries", MAX_LIST_ENTRIES);
|
|
92
|
+
const start = await this.resolveExistingPath(relativePath);
|
|
93
|
+
const stats = await lstat(start.realTarget);
|
|
94
|
+
if (!stats.isDirectory()) {
|
|
95
|
+
throw new WorkspaceError("not_a_directory", `Path is not a directory: ${relativePath}`);
|
|
96
|
+
}
|
|
97
|
+
await this.rejectExplicitDirectorySymlink(start, relativePath);
|
|
98
|
+
const matcher = await this.createIgnoreMatcher();
|
|
99
|
+
if (isDiscoveryIgnored(start.relativePath, true, matcher)) {
|
|
100
|
+
return { entries: [], truncated: false };
|
|
101
|
+
}
|
|
102
|
+
const entries = [];
|
|
103
|
+
let truncated = false;
|
|
104
|
+
const visit = async (absoluteDirectory, workspaceRelativeDirectory, depth) => {
|
|
105
|
+
let directoryEntries;
|
|
106
|
+
try {
|
|
107
|
+
directoryEntries = await readdir(absoluteDirectory, {
|
|
108
|
+
withFileTypes: true,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
directoryEntries.sort((left, right) => compareCodePoints(left.name, right.name));
|
|
115
|
+
for (const directoryEntry of directoryEntries) {
|
|
116
|
+
const entryPath = joinWorkspacePath(workspaceRelativeDirectory, directoryEntry.name);
|
|
117
|
+
const isDirectory = directoryEntry.isDirectory();
|
|
118
|
+
if (directoryEntry.isSymbolicLink() ||
|
|
119
|
+
(!isDirectory && !directoryEntry.isFile()) ||
|
|
120
|
+
isForbiddenRelativePath(entryPath) ||
|
|
121
|
+
isDiscoveryIgnored(entryPath, isDirectory, matcher)) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (entries.length >= maxEntries) {
|
|
125
|
+
truncated = true;
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
entries.push({
|
|
129
|
+
path: isDirectory ? `${entryPath}/` : entryPath,
|
|
130
|
+
type: isDirectory ? "directory" : "file",
|
|
131
|
+
});
|
|
132
|
+
if (isDirectory && depth < maxDepth) {
|
|
133
|
+
const shouldContinue = await visit(path.join(absoluteDirectory, directoryEntry.name), entryPath, depth + 1);
|
|
134
|
+
if (!shouldContinue) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return true;
|
|
140
|
+
};
|
|
141
|
+
await visit(start.realTarget, rootRelativeDirectory(start.relativePath), 1);
|
|
142
|
+
return { entries, truncated };
|
|
143
|
+
}
|
|
144
|
+
async searchText(options) {
|
|
145
|
+
validateSearchQuery(options.query);
|
|
146
|
+
const relativePath = options.path ?? ".";
|
|
147
|
+
const maxResults = boundedPositiveInteger(options.maxResults ?? DEFAULT_SEARCH_RESULTS, "maxResults", MAX_SEARCH_RESULTS);
|
|
148
|
+
const start = await this.resolveExistingPath(relativePath);
|
|
149
|
+
const stats = await lstat(start.realTarget);
|
|
150
|
+
const matcher = await this.createIgnoreMatcher();
|
|
151
|
+
const startIsDirectory = stats.isDirectory();
|
|
152
|
+
if (!startIsDirectory && !stats.isFile()) {
|
|
153
|
+
throw new WorkspaceError("not_a_file", `Path is not a regular file or directory: ${relativePath}`);
|
|
154
|
+
}
|
|
155
|
+
if (startIsDirectory) {
|
|
156
|
+
await this.rejectExplicitDirectorySymlink(start, relativePath);
|
|
157
|
+
}
|
|
158
|
+
if (isDiscoveryIgnored(start.relativePath, startIsDirectory, matcher)) {
|
|
159
|
+
return emptySearchResult();
|
|
160
|
+
}
|
|
161
|
+
const state = {
|
|
162
|
+
matches: [],
|
|
163
|
+
scannedFiles: 0,
|
|
164
|
+
skippedFiles: 0,
|
|
165
|
+
examinedFiles: 0,
|
|
166
|
+
scannedBytes: 0,
|
|
167
|
+
truncated: false,
|
|
168
|
+
};
|
|
169
|
+
const scanFile = async (absoluteFile, workspaceRelativeFile) => {
|
|
170
|
+
if (state.examinedFiles >= this.maxSearchFiles) {
|
|
171
|
+
state.truncated = true;
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
state.examinedFiles += 1;
|
|
175
|
+
let resolved;
|
|
176
|
+
let fileStats;
|
|
177
|
+
try {
|
|
178
|
+
resolved = await this.resolveExistingPath(workspaceRelativeFile);
|
|
179
|
+
fileStats = await lstat(resolved.realTarget);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
state.skippedFiles += 1;
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
if (!fileStats.isFile() || fileStats.size > this.maxFileBytes) {
|
|
186
|
+
state.skippedFiles += 1;
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
if (state.scannedBytes + fileStats.size > this.maxSearchBytes) {
|
|
190
|
+
state.truncated = true;
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
let contents;
|
|
194
|
+
try {
|
|
195
|
+
contents = await readUtf8File(absoluteFile === resolved.realTarget
|
|
196
|
+
? absoluteFile
|
|
197
|
+
: resolved.realTarget, workspaceRelativeFile, this.maxFileBytes);
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
state.skippedFiles += 1;
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
state.scannedBytes += Buffer.byteLength(contents, "utf8");
|
|
204
|
+
state.scannedFiles += 1;
|
|
205
|
+
const lines = splitLines(contents);
|
|
206
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
207
|
+
const line = lines[index];
|
|
208
|
+
if (line === undefined || !line.includes(options.query)) {
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
if (state.matches.length >= maxResults) {
|
|
212
|
+
state.truncated = true;
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
state.matches.push({
|
|
216
|
+
path: workspaceRelativeFile,
|
|
217
|
+
line: index + 1,
|
|
218
|
+
preview: createMatchPreview(line, options.query),
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
return true;
|
|
222
|
+
};
|
|
223
|
+
if (stats.isFile()) {
|
|
224
|
+
await scanFile(start.realTarget, start.relativePath);
|
|
225
|
+
return searchResult(state);
|
|
226
|
+
}
|
|
227
|
+
const visit = async (absoluteDirectory, workspaceRelativeDirectory) => {
|
|
228
|
+
let directoryEntries;
|
|
229
|
+
try {
|
|
230
|
+
directoryEntries = await readdir(absoluteDirectory, {
|
|
231
|
+
withFileTypes: true,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
directoryEntries.sort((left, right) => compareCodePoints(left.name, right.name));
|
|
238
|
+
for (const directoryEntry of directoryEntries) {
|
|
239
|
+
const entryPath = joinWorkspacePath(workspaceRelativeDirectory, directoryEntry.name);
|
|
240
|
+
const isDirectory = directoryEntry.isDirectory();
|
|
241
|
+
if (directoryEntry.isSymbolicLink() ||
|
|
242
|
+
(!isDirectory && !directoryEntry.isFile()) ||
|
|
243
|
+
isForbiddenRelativePath(entryPath) ||
|
|
244
|
+
isDiscoveryIgnored(entryPath, isDirectory, matcher)) {
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
const absoluteEntry = path.join(absoluteDirectory, directoryEntry.name);
|
|
248
|
+
const shouldContinue = isDirectory
|
|
249
|
+
? await visit(absoluteEntry, entryPath)
|
|
250
|
+
: await scanFile(absoluteEntry, entryPath);
|
|
251
|
+
if (!shouldContinue) {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return true;
|
|
256
|
+
};
|
|
257
|
+
await visit(start.realTarget, rootRelativeDirectory(start.relativePath));
|
|
258
|
+
return searchResult(state);
|
|
259
|
+
}
|
|
260
|
+
async readFullTextFile(relativePath) {
|
|
261
|
+
const resolved = await this.resolveExistingPath(relativePath);
|
|
262
|
+
return readUtf8File(resolved.realTarget, relativePath, this.maxFileBytes);
|
|
263
|
+
}
|
|
264
|
+
async resolveExistingPath(relativePath) {
|
|
265
|
+
const normalized = this.normalizeRelativePath(relativePath);
|
|
266
|
+
let realRoot;
|
|
267
|
+
let realTarget;
|
|
268
|
+
try {
|
|
269
|
+
[realRoot, realTarget] = await Promise.all([
|
|
270
|
+
realpath(this.root),
|
|
271
|
+
realpath(normalized.lexicalTarget),
|
|
272
|
+
]);
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
throw new WorkspaceError("not_found", `Path does not exist: ${relativePath}`, { cause: error });
|
|
276
|
+
}
|
|
277
|
+
if (!isPathInside(realRoot, realTarget)) {
|
|
278
|
+
throw new WorkspaceError("outside_workspace", `Path escapes the workspace: ${relativePath}`);
|
|
279
|
+
}
|
|
280
|
+
return {
|
|
281
|
+
lexicalTarget: normalized.lexicalTarget,
|
|
282
|
+
realRoot,
|
|
283
|
+
realTarget,
|
|
284
|
+
relativePath: normalized.relativePath,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
normalizeRelativePath(relativePath) {
|
|
288
|
+
if (typeof relativePath !== "string" ||
|
|
289
|
+
relativePath.length === 0 ||
|
|
290
|
+
relativePath.length > MAX_RELATIVE_PATH_CHARACTERS ||
|
|
291
|
+
relativePath.includes("\0") ||
|
|
292
|
+
path.isAbsolute(relativePath)) {
|
|
293
|
+
throw new WorkspaceError("invalid_path", "Workspace tools require a non-empty path relative to the workspace.");
|
|
294
|
+
}
|
|
295
|
+
const lexicalTarget = path.resolve(this.root, relativePath);
|
|
296
|
+
if (!isPathInside(this.root, lexicalTarget)) {
|
|
297
|
+
throw new WorkspaceError("outside_workspace", `Path escapes the workspace: ${relativePath}`);
|
|
298
|
+
}
|
|
299
|
+
const normalizedRelativePath = toWorkspacePath(path.relative(this.root, lexicalTarget));
|
|
300
|
+
if (isForbiddenRelativePath(normalizedRelativePath)) {
|
|
301
|
+
throw new WorkspaceError("forbidden_path", "Access to this sensitive workspace path is not allowed.");
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
lexicalTarget,
|
|
305
|
+
relativePath: normalizedRelativePath,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
async rejectExplicitDirectorySymlink(resolved, requestedPath) {
|
|
309
|
+
if (resolved.relativePath === ".") {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
let currentPath = this.root;
|
|
313
|
+
for (const segment of resolved.relativePath.split("/")) {
|
|
314
|
+
currentPath = path.join(currentPath, segment);
|
|
315
|
+
let lexicalStats;
|
|
316
|
+
try {
|
|
317
|
+
lexicalStats = await lstat(currentPath);
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
throw new WorkspaceError("not_found", `Path does not exist: ${requestedPath}`, { cause: error });
|
|
321
|
+
}
|
|
322
|
+
if (lexicalStats.isSymbolicLink()) {
|
|
323
|
+
throw new WorkspaceError("invalid_path", `Directory symlinks are not followed: ${requestedPath}`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
async createIgnoreMatcher() {
|
|
328
|
+
const matcher = createIgnore();
|
|
329
|
+
const ignorePath = path.join(this.root, ".gitignore");
|
|
330
|
+
try {
|
|
331
|
+
const stats = await lstat(ignorePath);
|
|
332
|
+
if (stats.isFile() &&
|
|
333
|
+
!stats.isSymbolicLink() &&
|
|
334
|
+
stats.size <= this.maxFileBytes) {
|
|
335
|
+
matcher.add(await readFile(ignorePath, "utf8"));
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
// A missing or unreadable root .gitignore does not prevent discovery.
|
|
340
|
+
}
|
|
341
|
+
return matcher.add(DEFAULT_IGNORE_PATTERNS);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
async function readUtf8File(absolutePath, displayPath, maxFileBytes) {
|
|
345
|
+
const stats = await lstat(absolutePath);
|
|
346
|
+
if (!stats.isFile()) {
|
|
347
|
+
throw new WorkspaceError("not_a_file", `Path is not a regular file: ${displayPath}`);
|
|
348
|
+
}
|
|
349
|
+
if (stats.size > maxFileBytes) {
|
|
350
|
+
throw new WorkspaceError("too_large", `File exceeds the ${maxFileBytes}-byte limit: ${displayPath}`);
|
|
351
|
+
}
|
|
352
|
+
const contents = await readFile(absolutePath);
|
|
353
|
+
if (contents.byteLength > maxFileBytes) {
|
|
354
|
+
throw new WorkspaceError("too_large", `File exceeds the ${maxFileBytes}-byte limit: ${displayPath}`);
|
|
355
|
+
}
|
|
356
|
+
if (contents.includes(0)) {
|
|
357
|
+
throw new WorkspaceError("binary_file", `File appears to be binary: ${displayPath}`);
|
|
358
|
+
}
|
|
359
|
+
try {
|
|
360
|
+
return new TextDecoder("utf-8", { fatal: true }).decode(contents);
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
throw new WorkspaceError("invalid_utf8", `File is not valid UTF-8: ${displayPath}`, { cause: error });
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
function validateSearchQuery(query) {
|
|
367
|
+
if (typeof query !== "string" ||
|
|
368
|
+
query.length === 0 ||
|
|
369
|
+
[...query].length > MAX_QUERY_CHARACTERS ||
|
|
370
|
+
query.includes("\0") ||
|
|
371
|
+
query.includes("\r") ||
|
|
372
|
+
query.includes("\n")) {
|
|
373
|
+
throw new TypeError("query must contain 1 to 256 characters without NUL or line breaks.");
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
function positiveSafeInteger(value, name) {
|
|
377
|
+
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
378
|
+
throw new TypeError(`${name} must be a positive safe integer.`);
|
|
379
|
+
}
|
|
380
|
+
return value;
|
|
381
|
+
}
|
|
382
|
+
function boundedPositiveInteger(value, name, maximum) {
|
|
383
|
+
const validated = positiveSafeInteger(value, name);
|
|
384
|
+
if (validated > maximum) {
|
|
385
|
+
throw new TypeError(`${name} must be at most ${maximum}.`);
|
|
386
|
+
}
|
|
387
|
+
return validated;
|
|
388
|
+
}
|
|
389
|
+
function invalidRange(relativePath, startLine, totalLines) {
|
|
390
|
+
return new WorkspaceError("invalid_range", `start_line ${startLine} is outside ${relativePath}, which has ${totalLines} lines.`);
|
|
391
|
+
}
|
|
392
|
+
function splitLinesPreservingEndings(contents) {
|
|
393
|
+
if (contents.length === 0) {
|
|
394
|
+
return [];
|
|
395
|
+
}
|
|
396
|
+
const lines = contents.match(/[^\r\n]*(?:\r\n|\r|\n|$)/g) ?? [];
|
|
397
|
+
if (lines.at(-1) === "") {
|
|
398
|
+
lines.pop();
|
|
399
|
+
}
|
|
400
|
+
return lines;
|
|
401
|
+
}
|
|
402
|
+
function splitLines(contents) {
|
|
403
|
+
return splitLinesPreservingEndings(contents).map((line) => line.replace(/(?:\r\n|\r|\n)$/, ""));
|
|
404
|
+
}
|
|
405
|
+
function createMatchPreview(line, query) {
|
|
406
|
+
const characters = [...line];
|
|
407
|
+
if (characters.length <= MAX_PREVIEW_CHARACTERS) {
|
|
408
|
+
return line;
|
|
409
|
+
}
|
|
410
|
+
const matchIndex = line.indexOf(query);
|
|
411
|
+
const prefixCharacters = [...line.slice(0, matchIndex)].length;
|
|
412
|
+
const queryCharacters = [...query].length;
|
|
413
|
+
const initialContext = Math.max(0, MAX_PREVIEW_CHARACTERS - queryCharacters - 2);
|
|
414
|
+
let start = Math.max(0, prefixCharacters - Math.floor(initialContext / 2));
|
|
415
|
+
let hasPrefix = start > 0;
|
|
416
|
+
let hasSuffix = true;
|
|
417
|
+
let contentBudget = MAX_PREVIEW_CHARACTERS - Number(hasPrefix) - Number(hasSuffix);
|
|
418
|
+
let end = Math.min(characters.length, start + contentBudget);
|
|
419
|
+
hasSuffix = end < characters.length;
|
|
420
|
+
contentBudget =
|
|
421
|
+
MAX_PREVIEW_CHARACTERS - Number(hasPrefix) - Number(hasSuffix);
|
|
422
|
+
end = Math.min(characters.length, start + contentBudget);
|
|
423
|
+
if (end === characters.length) {
|
|
424
|
+
start = Math.max(0, end - (MAX_PREVIEW_CHARACTERS - Number(start > 0)));
|
|
425
|
+
hasPrefix = start > 0;
|
|
426
|
+
}
|
|
427
|
+
return `${hasPrefix ? "…" : ""}${characters
|
|
428
|
+
.slice(start, end)
|
|
429
|
+
.join("")}${end < characters.length ? "…" : ""}`;
|
|
430
|
+
}
|
|
431
|
+
function isForbiddenRelativePath(relativePath) {
|
|
432
|
+
if (relativePath === ".") {
|
|
433
|
+
return false;
|
|
434
|
+
}
|
|
435
|
+
const segments = relativePath
|
|
436
|
+
.split("/")
|
|
437
|
+
.filter((segment) => segment.length > 0);
|
|
438
|
+
const lowerSegments = segments.map((segment) => segment.toLowerCase());
|
|
439
|
+
if (lowerSegments.some((segment) => FORBIDDEN_DIRECTORY_NAMES.has(segment))) {
|
|
440
|
+
return true;
|
|
441
|
+
}
|
|
442
|
+
const basename = lowerSegments.at(-1);
|
|
443
|
+
if (basename === undefined) {
|
|
444
|
+
return false;
|
|
445
|
+
}
|
|
446
|
+
if (basename === ".env" || basename.startsWith(".env.")) {
|
|
447
|
+
return !ALLOWED_ENV_FILES.has(basename);
|
|
448
|
+
}
|
|
449
|
+
return (FORBIDDEN_FILE_NAMES.has(basename) ||
|
|
450
|
+
FORBIDDEN_FILE_EXTENSIONS.has(path.posix.extname(basename)));
|
|
451
|
+
}
|
|
452
|
+
function isDiscoveryIgnored(relativePath, isDirectory, matcher) {
|
|
453
|
+
if (relativePath === ".") {
|
|
454
|
+
return false;
|
|
455
|
+
}
|
|
456
|
+
return matcher.ignores(isDirectory ? `${relativePath}/` : relativePath);
|
|
457
|
+
}
|
|
458
|
+
function rootRelativeDirectory(relativePath) {
|
|
459
|
+
return relativePath === "." ? "" : relativePath;
|
|
460
|
+
}
|
|
461
|
+
function joinWorkspacePath(directory, name) {
|
|
462
|
+
return directory.length === 0 ? name : `${directory}/${name}`;
|
|
463
|
+
}
|
|
464
|
+
function toWorkspacePath(relativePath) {
|
|
465
|
+
return relativePath.length === 0
|
|
466
|
+
? "."
|
|
467
|
+
: relativePath.split(path.sep).join("/");
|
|
468
|
+
}
|
|
469
|
+
function compareCodePoints(left, right) {
|
|
470
|
+
const leftPoints = [...left].map((character) => character.codePointAt(0) ?? 0);
|
|
471
|
+
const rightPoints = [...right].map((character) => character.codePointAt(0) ?? 0);
|
|
472
|
+
const sharedLength = Math.min(leftPoints.length, rightPoints.length);
|
|
473
|
+
for (let index = 0; index < sharedLength; index += 1) {
|
|
474
|
+
const difference = (leftPoints[index] ?? 0) - (rightPoints[index] ?? 0);
|
|
475
|
+
if (difference !== 0) {
|
|
476
|
+
return difference;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
return leftPoints.length - rightPoints.length;
|
|
480
|
+
}
|
|
481
|
+
function isPathInside(root, candidate) {
|
|
482
|
+
const relative = path.relative(root, candidate);
|
|
483
|
+
return (relative === "" ||
|
|
484
|
+
(!relative.startsWith(`..${path.sep}`) &&
|
|
485
|
+
relative !== ".." &&
|
|
486
|
+
!path.isAbsolute(relative)));
|
|
487
|
+
}
|
|
488
|
+
function emptySearchResult() {
|
|
489
|
+
return {
|
|
490
|
+
matches: [],
|
|
491
|
+
truncated: false,
|
|
492
|
+
scannedFiles: 0,
|
|
493
|
+
skippedFiles: 0,
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
function searchResult(state) {
|
|
497
|
+
return {
|
|
498
|
+
matches: state.matches,
|
|
499
|
+
truncated: state.truncated,
|
|
500
|
+
scannedFiles: state.scannedFiles,
|
|
501
|
+
skippedFiles: state.skippedFiles,
|
|
502
|
+
};
|
|
503
|
+
}
|
|
504
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,YAAY,EAAE,EAAe,MAAM,QAAQ,CAAC;AAEnD,MAAM,sBAAsB,GAAG,GAAG,GAAG,IAAI,CAAC;AAC1C,MAAM,uBAAuB,GAAG,GAAG,CAAC;AACpC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAClC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,wBAAwB,GAAG,KAAK,CAAC;AACvC,MAAM,wBAAwB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAClD,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAE3C,MAAM,uBAAuB,GAAG;IAC9B,OAAO;IACP,eAAe;IACf,OAAO;IACP,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,SAAS;CACD,CAAC;AAEX,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,cAAc;IACd,aAAa;IACb,eAAe;CAChB,CAAC,CAAC;AACH,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AACpE,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,YAAY;CACb,CAAC,CAAC;AACH,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAc5E,MAAM,OAAO,cAAe,SAAQ,KAAK;IAE5B,IAAI;IADf,YACW,IAAwB,EACjC,OAAe,EACf,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBAJf,IAAI;QAKb,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAkFD,MAAM,OAAO,cAAc;IAChB,IAAI,CAAS;IACL,YAAY,CAAS;IACrB,cAAc,CAAS;IACvB,cAAc,CAAS;IAExC,YAAY,IAAY,EAAE,OAAO,GAA0B,EAAE;QAC3D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,sBAAsB,CACxC,OAAO,CAAC,YAAY,IAAI,sBAAsB,EAC9C,cAAc,EACd,sBAAsB,CACvB,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,sBAAsB,CAC1C,OAAO,CAAC,cAAc,IAAI,wBAAwB,EAClD,gBAAgB,EAChB,wBAAwB,CACzB,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,sBAAsB,CAC1C,OAAO,CAAC,cAAc,IAAI,wBAAwB,EAClD,gBAAgB,EAChB,wBAAwB,CACzB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,YAAoB,EACpB,OAAO,GAAwB,EAAE;QAEjC,MAAM,SAAS,GAAG,sBAAsB,CACtC,OAAO,CAAC,SAAS,IAAI,CAAC,EACtB,WAAW,EACX,MAAM,CAAC,gBAAgB,CACxB,CAAC;QACF,MAAM,SAAS,GAAG,sBAAsB,CACtC,OAAO,CAAC,SAAS,IAAI,uBAAuB,EAC5C,WAAW,EACX,mBAAmB,CACpB,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QAEpD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACpB,MAAM,YAAY,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YACjD,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,EAAE;gBACX,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,CAAC;gBACV,UAAU,EAAE,CAAC;gBACb,SAAS,EAAE,KAAK;aACjB,CAAC;QACJ,CAAC;QAED,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,YAAY,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC;QAClE,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACrD,SAAS;YACT,OAAO;YACP,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,SAAS,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM;SAClC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CACb,OAAO,GAAqB,EAAE;QAE9B,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC;QACzC,MAAM,QAAQ,GAAG,sBAAsB,CACrC,OAAO,CAAC,QAAQ,IAAI,kBAAkB,EACtC,UAAU,EACV,cAAc,CACf,CAAC;QACF,MAAM,UAAU,GAAG,sBAAsB,CACvC,OAAO,CAAC,UAAU,IAAI,oBAAoB,EAC1C,YAAY,EACZ,gBAAgB,CACjB,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,MAAM,IAAI,cAAc,CACtB,iBAAiB,EACjB,4BAA4B,YAAY,EAAE,CAC3C,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,CAAC,8BAA8B,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAE/D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACjD,IAAI,kBAAkB,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;YAC1D,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC3C,CAAC;QAED,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,MAAM,KAAK,GAAG,KAAK,EACjB,iBAAyB,EACzB,0BAAkC,EAClC,KAAa,EACK,EAAE;YACpB,IAAI,gBAAgB,CAAC;YACrB,IAAI,CAAC;gBACH,gBAAgB,GAAG,MAAM,OAAO,CAAC,iBAAiB,EAAE;oBAClD,aAAa,EAAE,IAAI;iBACpB,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;YACD,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CACzC,CAAC;YAEF,KAAK,MAAM,cAAc,IAAI,gBAAgB,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAG,iBAAiB,CACjC,0BAA0B,EAC1B,cAAc,CAAC,IAAI,CACpB,CAAC;gBACF,MAAM,WAAW,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;gBACjD,IACE,cAAc,CAAC,cAAc,EAAE;oBAC/B,CAAC,CAAC,WAAW,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;oBAC1C,uBAAuB,CAAC,SAAS,CAAC;oBAClC,kBAAkB,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,EACnD,CAAC;oBACD,SAAS;gBACX,CAAC;gBAED,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;oBACjC,SAAS,GAAG,IAAI,CAAC;oBACjB,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,SAAS;oBAC/C,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;iBACzC,CAAC,CAAC;gBAEH,IAAI,WAAW,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;oBACpC,MAAM,cAAc,GAAG,MAAM,KAAK,CAChC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,EACjD,SAAS,EACT,KAAK,GAAG,CAAC,CACV,CAAC;oBACF,IAAI,CAAC,cAAc,EAAE,CAAC;wBACpB,OAAO,KAAK,CAAC;oBACf,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAA0B;QACzC,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC;QACzC,MAAM,UAAU,GAAG,sBAAsB,CACvC,OAAO,CAAC,UAAU,IAAI,sBAAsB,EAC5C,YAAY,EACZ,kBAAkB,CACnB,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACjD,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAE7C,IAAI,CAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,MAAM,IAAI,cAAc,CACtB,YAAY,EACZ,4CAA4C,YAAY,EAAE,CAC3D,CAAC;QACJ,CAAC;QACD,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,8BAA8B,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,kBAAkB,CAAC,KAAK,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,CAAC;YACtE,OAAO,iBAAiB,EAAE,CAAC;QAC7B,CAAC;QAED,MAAM,KAAK,GAAgB;YACzB,OAAO,EAAE,EAAE;YACX,YAAY,EAAE,CAAC;YACf,YAAY,EAAE,CAAC;YACf,aAAa,EAAE,CAAC;YAChB,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,KAAK;SACjB,CAAC;QAEF,MAAM,QAAQ,GAAG,KAAK,EACpB,YAAoB,EACpB,qBAA6B,EACX,EAAE;YACpB,IAAI,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC/C,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;gBACvB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;YAEzB,IAAI,QAAsB,CAAC;YAC3B,IAAI,SAAS,CAAC;YACd,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;gBACjE,SAAS,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;gBACxB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC9D,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;gBACxB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,KAAK,CAAC,YAAY,GAAG,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC9D,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;gBACvB,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,QAAgB,CAAC;YACrB,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,YAAY,CAC3B,YAAY,KAAK,QAAQ,CAAC,UAAU;oBAClC,CAAC,CAAC,YAAY;oBACd,CAAC,CAAC,QAAQ,CAAC,UAAU,EACvB,qBAAqB,EACrB,IAAI,CAAC,YAAY,CAClB,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;gBACxB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,KAAK,CAAC,YAAY,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC1D,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;YACxB,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;YACnC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBACrD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1B,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACxD,SAAS;gBACX,CAAC;gBACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;oBACvC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;oBACvB,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,qBAAqB;oBAC3B,IAAI,EAAE,KAAK,GAAG,CAAC;oBACf,OAAO,EAAE,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC;iBACjD,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,MAAM,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;YACrD,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,EACjB,iBAAyB,EACzB,0BAAkC,EAChB,EAAE;YACpB,IAAI,gBAAgB,CAAC;YACrB,IAAI,CAAC;gBACH,gBAAgB,GAAG,MAAM,OAAO,CAAC,iBAAiB,EAAE;oBAClD,aAAa,EAAE,IAAI;iBACpB,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;YACD,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CACzC,CAAC;YAEF,KAAK,MAAM,cAAc,IAAI,gBAAgB,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAG,iBAAiB,CACjC,0BAA0B,EAC1B,cAAc,CAAC,IAAI,CACpB,CAAC;gBACF,MAAM,WAAW,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;gBACjD,IACE,cAAc,CAAC,cAAc,EAAE;oBAC/B,CAAC,CAAC,WAAW,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;oBAC1C,uBAAuB,CAAC,SAAS,CAAC;oBAClC,kBAAkB,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,EACnD,CAAC;oBACD,SAAS;gBACX,CAAC;gBAED,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,iBAAiB,EACjB,cAAc,CAAC,IAAI,CACpB,CAAC;gBACF,MAAM,cAAc,GAAG,WAAW;oBAChC,CAAC,CAAC,MAAM,KAAK,CAAC,aAAa,EAAE,SAAS,CAAC;oBACvC,CAAC,CAAC,MAAM,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;gBAC7C,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QACzE,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,YAAoB;QACjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAC9D,OAAO,YAAY,CACjB,QAAQ,CAAC,UAAU,EACnB,YAAY,EACZ,IAAI,CAAC,YAAY,CAClB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,YAAoB;QACpD,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;QAC5D,IAAI,QAAgB,CAAC;QACrB,IAAI,UAAkB,CAAC;QACvB,IAAI,CAAC;YACH,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACzC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;gBACnB,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,cAAc,CACtB,WAAW,EACX,wBAAwB,YAAY,EAAE,EACtC,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,cAAc,CACtB,mBAAmB,EACnB,+BAA+B,YAAY,EAAE,CAC9C,CAAC;QACJ,CAAC;QACD,OAAO;YACL,aAAa,EAAE,UAAU,CAAC,aAAa;YACvC,QAAQ;YACR,UAAU;YACV,YAAY,EAAE,UAAU,CAAC,YAAY;SACtC,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAAC,YAAoB;QAIhD,IACE,OAAO,YAAY,KAAK,QAAQ;YAChC,YAAY,CAAC,MAAM,KAAK,CAAC;YACzB,YAAY,CAAC,MAAM,GAAG,4BAA4B;YAClD,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAC7B,CAAC;YACD,MAAM,IAAI,cAAc,CACtB,cAAc,EACd,qEAAqE,CACtE,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC5D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,cAAc,CACtB,mBAAmB,EACnB,+BAA+B,YAAY,EAAE,CAC9C,CAAC;QACJ,CAAC;QACD,MAAM,sBAAsB,GAAG,eAAe,CAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CACxC,CAAC;QACF,IAAI,uBAAuB,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,cAAc,CACtB,gBAAgB,EAChB,yDAAyD,CAC1D,CAAC;QACJ,CAAC;QACD,OAAO;YACL,aAAa;YACb,YAAY,EAAE,sBAAsB;SACrC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,8BAA8B,CAC1C,QAAsB,EACtB,aAAqB;QAErB,IAAI,QAAQ,CAAC,YAAY,KAAK,GAAG,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QACD,IAAI,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;QAC5B,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC9C,IAAI,YAAY,CAAC;YACjB,IAAI,CAAC;gBACH,YAAY,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,cAAc,CACtB,WAAW,EACX,wBAAwB,aAAa,EAAE,EACvC,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;YACJ,CAAC;YACD,IAAI,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC;gBAClC,MAAM,IAAI,cAAc,CACtB,cAAc,EACd,wCAAwC,aAAa,EAAE,CACxD,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC/B,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;YACtC,IACE,KAAK,CAAC,MAAM,EAAE;gBACd,CAAC,KAAK,CAAC,cAAc,EAAE;gBACvB,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,EAC/B,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;QACxE,CAAC;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC9C,CAAC;CACF;AAED,KAAK,UAAU,YAAY,CACzB,YAAoB,EACpB,WAAmB,EACnB,YAAoB;IAEpB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACpB,MAAM,IAAI,cAAc,CACtB,YAAY,EACZ,+BAA+B,WAAW,EAAE,CAC7C,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,cAAc,CACtB,WAAW,EACX,oBAAoB,YAAY,gBAAgB,WAAW,EAAE,CAC9D,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC9C,IAAI,QAAQ,CAAC,UAAU,GAAG,YAAY,EAAE,CAAC;QACvC,MAAM,IAAI,cAAc,CACtB,WAAW,EACX,oBAAoB,YAAY,gBAAgB,WAAW,EAAE,CAC9D,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,cAAc,CACtB,aAAa,EACb,8BAA8B,WAAW,EAAE,CAC5C,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,cAAc,CACtB,cAAc,EACd,4BAA4B,WAAW,EAAE,EACzC,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,GAAG,oBAAoB;QACxC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QACpB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QACpB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EACpB,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,oEAAoE,CACrE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa,EAAE,IAAY;IACtD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,mCAAmC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAa,EACb,IAAY,EACZ,OAAe;IAEf,MAAM,SAAS,GAAG,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnD,IAAI,SAAS,GAAG,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,oBAAoB,OAAO,GAAG,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CACnB,YAAoB,EACpB,SAAiB,EACjB,UAAkB;IAElB,OAAO,IAAI,cAAc,CACvB,eAAe,EACf,cAAc,SAAS,eAAe,YAAY,eAAe,UAAU,SAAS,CACrF,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAAC,QAAgB;IACnD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAC;IAChE,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACxB,KAAK,CAAC,GAAG,EAAE,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB;IAClC,OAAO,2BAA2B,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACxD,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CACpC,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,KAAa;IACrD,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7B,IAAI,UAAU,CAAC,MAAM,IAAI,sBAAsB,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/D,MAAM,eAAe,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC;IAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAC7B,CAAC,EACD,sBAAsB,GAAG,eAAe,GAAG,CAAC,CAC7C,CAAC;IACF,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAClB,CAAC,EACD,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAClD,CAAC;IACF,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;IAC1B,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,aAAa,GACf,sBAAsB,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACjE,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,GAAG,aAAa,CAAC,CAAC;IAC7D,SAAS,GAAG,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC;IACpC,aAAa;QACX,sBAAsB,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACjE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,GAAG,aAAa,CAAC,CAAC;IACzD,IAAI,GAAG,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;QAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,CACd,CAAC,EACD,GAAG,GAAG,CAAC,sBAAsB,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CACnD,CAAC;QACF,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU;SACxC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;SACjB,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,uBAAuB,CAAC,YAAoB;IACnD,IAAI,YAAY,KAAK,GAAG,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,QAAQ,GAAG,YAAY;SAC1B,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACvE,IACE,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,yBAAyB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EACvE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,CACL,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClC,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAC5D,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,YAAoB,EACpB,WAAoB,EACpB,OAAe;IAEf,IAAI,YAAY,KAAK,GAAG,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,qBAAqB,CAAC,YAAoB;IACjD,OAAO,YAAY,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;AAClD,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB,EAAE,IAAY;IACxD,OAAO,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,eAAe,CAAC,YAAoB;IAC3C,OAAO,YAAY,CAAC,MAAM,KAAK,CAAC;QAC9B,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,KAAa;IACpD,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/E,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAChC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAC7C,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACrE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,YAAY,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,UAAU,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACxE,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;AAChD,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,SAAiB;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAChD,OAAO,CACL,QAAQ,KAAK,EAAE;QACf,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;YACpC,QAAQ,KAAK,IAAI;YACjB,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAC9B,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO;QACL,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAkB;IACtC,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,YAAY,EAAE,KAAK,CAAC,YAAY;KACjC,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "chivgent",
|
|
3
|
+
"version": "0.6.0",
|
|
4
|
+
"description": "A minimal coding agent CLI built to learn agent harness architecture.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/chivopic/chivgent.git"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/chivopic/chivgent#readme",
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/chivopic/chivgent/issues"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"agent",
|
|
16
|
+
"cli",
|
|
17
|
+
"coding-agent",
|
|
18
|
+
"deepseek",
|
|
19
|
+
"openai",
|
|
20
|
+
"tool-calling"
|
|
21
|
+
],
|
|
22
|
+
"type": "module",
|
|
23
|
+
"bin": {
|
|
24
|
+
"chivgent": "./dist/cli.js"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist",
|
|
28
|
+
"README.md",
|
|
29
|
+
"README.zh-CN.md"
|
|
30
|
+
],
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"access": "public"
|
|
33
|
+
},
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=20"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsc -p tsconfig.build.json",
|
|
39
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
40
|
+
"test": "vitest run",
|
|
41
|
+
"test:watch": "vitest",
|
|
42
|
+
"release:check": "npm run check && npm test && npm run build && npm pack --dry-run",
|
|
43
|
+
"prepublishOnly": "npm run check && npm test",
|
|
44
|
+
"prepack": "npm run build"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"ignore": "7.0.6",
|
|
48
|
+
"openai": "7.5.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/node": "26.2.0",
|
|
52
|
+
"typescript": "7.0.2",
|
|
53
|
+
"vitest": "4.1.11"
|
|
54
|
+
}
|
|
55
|
+
}
|