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,150 @@
|
|
|
1
|
+
import { WorkspaceError } from "../workspace.js";
|
|
2
|
+
import { MAX_TOOL_OUTPUT_BYTES, truncateUtf8 } from "./output.js";
|
|
3
|
+
const DEFAULT_START_LINE = 1;
|
|
4
|
+
const DEFAULT_LINE_COUNT = 200;
|
|
5
|
+
const MAX_LINE_COUNT = 500;
|
|
6
|
+
const MAX_CONTENT_BUDGET_BYTES = 48 * 1024;
|
|
7
|
+
const inputSchema = {
|
|
8
|
+
type: "object",
|
|
9
|
+
properties: {
|
|
10
|
+
path: {
|
|
11
|
+
type: "string",
|
|
12
|
+
description: "Path relative to the workspace root.",
|
|
13
|
+
},
|
|
14
|
+
start_line: {
|
|
15
|
+
type: "integer",
|
|
16
|
+
minimum: 1,
|
|
17
|
+
description: "First one-based line to read. Usually start with 1.",
|
|
18
|
+
},
|
|
19
|
+
line_count: {
|
|
20
|
+
type: "integer",
|
|
21
|
+
minimum: 1,
|
|
22
|
+
maximum: MAX_LINE_COUNT,
|
|
23
|
+
description: "Number of lines to read. Usually use 200.",
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
required: ["path", "start_line", "line_count"],
|
|
27
|
+
additionalProperties: false,
|
|
28
|
+
};
|
|
29
|
+
export class ReadFileTool {
|
|
30
|
+
name = "read_file";
|
|
31
|
+
description = "Read a bounded range from a UTF-8 text file inside the workspace. Use list_files or search_text first when the path is unknown.";
|
|
32
|
+
inputSchema = inputSchema;
|
|
33
|
+
async execute(argumentsValue, context) {
|
|
34
|
+
const argumentsObject = parseArguments(argumentsValue);
|
|
35
|
+
if (argumentsObject === undefined) {
|
|
36
|
+
return {
|
|
37
|
+
content: 'Invalid arguments. Expected {"path":"relative/file.ts","start_line":1,"line_count":200}; line_count must be from 1 to 500.',
|
|
38
|
+
isError: true,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const slice = await context.workspace.readTextFile(argumentsObject.path, {
|
|
43
|
+
startLine: argumentsObject.startLine,
|
|
44
|
+
lineCount: argumentsObject.lineCount,
|
|
45
|
+
});
|
|
46
|
+
return {
|
|
47
|
+
content: formatSlice(argumentsObject.path, argumentsObject.lineCount, slice),
|
|
48
|
+
isError: false,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error instanceof WorkspaceError || error instanceof TypeError) {
|
|
53
|
+
return { content: error.message, isError: true };
|
|
54
|
+
}
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function parseArguments(value) {
|
|
60
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
const record = value;
|
|
64
|
+
const keys = Object.keys(record);
|
|
65
|
+
if (keys.some((key) => key !== "path" && key !== "start_line" && key !== "line_count")) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
const startLine = record.start_line ?? DEFAULT_START_LINE;
|
|
69
|
+
const lineCount = record.line_count ?? DEFAULT_LINE_COUNT;
|
|
70
|
+
if (typeof record.path !== "string" ||
|
|
71
|
+
record.path.length === 0 ||
|
|
72
|
+
typeof startLine !== "number" ||
|
|
73
|
+
!Number.isSafeInteger(startLine) ||
|
|
74
|
+
startLine < 1 ||
|
|
75
|
+
typeof lineCount !== "number" ||
|
|
76
|
+
!Number.isSafeInteger(lineCount) ||
|
|
77
|
+
lineCount < 1 ||
|
|
78
|
+
lineCount > MAX_LINE_COUNT) {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
return { path: record.path, startLine, lineCount };
|
|
82
|
+
}
|
|
83
|
+
function formatSlice(path, requestedLineCount, slice) {
|
|
84
|
+
const provisionalHeader = `File: ${path} (lines ${slice.startLine}-${slice.endLine} of ${slice.totalLines})\n---`;
|
|
85
|
+
const provisionalFooter = [
|
|
86
|
+
`[line ${slice.endLine} truncated at the 64 KiB tool-output limit]`,
|
|
87
|
+
`[truncated: continue with ${JSON.stringify({
|
|
88
|
+
path,
|
|
89
|
+
start_line: slice.endLine + 1,
|
|
90
|
+
line_count: requestedLineCount,
|
|
91
|
+
})}]`,
|
|
92
|
+
].join("\n");
|
|
93
|
+
const contentBudgetBytes = Math.max(0, Math.min(MAX_CONTENT_BUDGET_BYTES, MAX_TOOL_OUTPUT_BYTES -
|
|
94
|
+
Buffer.byteLength(provisionalHeader, "utf8") -
|
|
95
|
+
Buffer.byteLength(provisionalFooter, "utf8") -
|
|
96
|
+
2));
|
|
97
|
+
const segments = splitLinesPreservingEndings(slice.content);
|
|
98
|
+
const accepted = [];
|
|
99
|
+
let usedBytes = 0;
|
|
100
|
+
let outputTruncated = false;
|
|
101
|
+
let partialLine = false;
|
|
102
|
+
for (const segment of segments) {
|
|
103
|
+
const segmentBytes = Buffer.byteLength(segment, "utf8");
|
|
104
|
+
if (usedBytes + segmentBytes <= contentBudgetBytes) {
|
|
105
|
+
accepted.push(segment);
|
|
106
|
+
usedBytes += segmentBytes;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
outputTruncated = true;
|
|
110
|
+
if (accepted.length === 0) {
|
|
111
|
+
accepted.push(truncateUtf8(segment, contentBudgetBytes));
|
|
112
|
+
partialLine = true;
|
|
113
|
+
}
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
const consumedLines = accepted.length;
|
|
117
|
+
const actualEndLine = slice.totalLines === 0 ? 0 : slice.startLine + consumedLines - 1;
|
|
118
|
+
const header = `File: ${path} (lines ${slice.startLine}-${actualEndLine} of ${slice.totalLines})\n---`;
|
|
119
|
+
const body = accepted.join("");
|
|
120
|
+
const footer = [];
|
|
121
|
+
if (partialLine) {
|
|
122
|
+
footer.push(`[line ${actualEndLine} truncated at the 64 KiB tool-output limit]`);
|
|
123
|
+
}
|
|
124
|
+
if ((slice.truncated || outputTruncated) && actualEndLine < slice.totalLines) {
|
|
125
|
+
footer.push(`[truncated: continue with ${JSON.stringify({
|
|
126
|
+
path,
|
|
127
|
+
start_line: actualEndLine + 1,
|
|
128
|
+
line_count: requestedLineCount,
|
|
129
|
+
})}]`);
|
|
130
|
+
}
|
|
131
|
+
let output = `${header}${body.length === 0 ? "" : `\n${body}`}`;
|
|
132
|
+
if (footer.length > 0) {
|
|
133
|
+
if (!output.endsWith("\n")) {
|
|
134
|
+
output += "\n";
|
|
135
|
+
}
|
|
136
|
+
output += footer.join("\n");
|
|
137
|
+
}
|
|
138
|
+
return truncateUtf8(output, MAX_TOOL_OUTPUT_BYTES);
|
|
139
|
+
}
|
|
140
|
+
function splitLinesPreservingEndings(contents) {
|
|
141
|
+
if (contents.length === 0) {
|
|
142
|
+
return [];
|
|
143
|
+
}
|
|
144
|
+
const lines = contents.match(/[^\r\n]*(?:\r\n|\r|\n|$)/g) ?? [];
|
|
145
|
+
if (lines.at(-1) === "") {
|
|
146
|
+
lines.pop();
|
|
147
|
+
}
|
|
148
|
+
return lines;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=read-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Tool, ToolContext, ToolOutput } from "./tool.js";
|
|
2
|
+
export declare class SearchTextTool implements Tool {
|
|
3
|
+
readonly name = "search_text";
|
|
4
|
+
readonly description = "Search discoverable UTF-8 project files for case-sensitive literal text and return file paths, line numbers, and previews.";
|
|
5
|
+
readonly inputSchema: {
|
|
6
|
+
readonly type: "object";
|
|
7
|
+
readonly properties: {
|
|
8
|
+
readonly query: {
|
|
9
|
+
readonly type: "string";
|
|
10
|
+
readonly description: "Case-sensitive literal text to find, from 1 to 256 characters without line breaks. Regular expressions are not supported.";
|
|
11
|
+
};
|
|
12
|
+
readonly path: {
|
|
13
|
+
readonly type: "string";
|
|
14
|
+
readonly description: 'File or directory relative to the workspace root. Use "." for the root.';
|
|
15
|
+
};
|
|
16
|
+
readonly max_results: {
|
|
17
|
+
readonly type: "integer";
|
|
18
|
+
readonly minimum: 1;
|
|
19
|
+
readonly maximum: 200;
|
|
20
|
+
readonly description: "Maximum matches to return. Usually use 50.";
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
readonly required: readonly ["query", "path", "max_results"];
|
|
24
|
+
readonly additionalProperties: false;
|
|
25
|
+
};
|
|
26
|
+
execute(argumentsValue: unknown, context: ToolContext): Promise<ToolOutput>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=search-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-text.d.ts","sourceRoot":"","sources":["../../src/tools/search-text.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAsC/D,qBAAa,cAAe,YAAW,IAAI;IACzC,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,WAAW,gIAC2G;IAC/H,QAAQ,CAAC,WAAW;uBAjCd,QAAQ;;qBAEZ,KAAK;yBACH,IAAI,EAAE,QAAQ;yBACd,WAAW,EACT,2HAA2H;;qBAE/H,IAAI;yBACF,IAAI,EAAE,QAAQ;yBACd,WAAW,EACT,yEAAyE;;qBAE7E,WAAW;yBACT,IAAI,EAAE,SAAS;yBACf,OAAO,EAAE,CAAC;yBACV,OAAO;yBACP,WAAW,EAAE,4CAA4C;;;qCAGlD,OAAO,EAAE,MAAM,EAAE,aAAa;;MAcN;IAE7B,OAAO,CACX,cAAc,EAAE,OAAO,EACvB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAqCrB;CACF"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { WorkspaceError } from "../workspace.js";
|
|
2
|
+
import { formatBoundedLineOutput } from "./output.js";
|
|
3
|
+
const DEFAULT_PATH = ".";
|
|
4
|
+
const DEFAULT_MAX_RESULTS = 50;
|
|
5
|
+
const MAX_RESULTS = 200;
|
|
6
|
+
const MAX_QUERY_CHARACTERS = 256;
|
|
7
|
+
const inputSchema = {
|
|
8
|
+
type: "object",
|
|
9
|
+
properties: {
|
|
10
|
+
query: {
|
|
11
|
+
type: "string",
|
|
12
|
+
description: "Case-sensitive literal text to find, from 1 to 256 characters without line breaks. Regular expressions are not supported.",
|
|
13
|
+
},
|
|
14
|
+
path: {
|
|
15
|
+
type: "string",
|
|
16
|
+
description: 'File or directory relative to the workspace root. Use "." for the root.',
|
|
17
|
+
},
|
|
18
|
+
max_results: {
|
|
19
|
+
type: "integer",
|
|
20
|
+
minimum: 1,
|
|
21
|
+
maximum: MAX_RESULTS,
|
|
22
|
+
description: "Maximum matches to return. Usually use 50.",
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
required: ["query", "path", "max_results"],
|
|
26
|
+
additionalProperties: false,
|
|
27
|
+
};
|
|
28
|
+
export class SearchTextTool {
|
|
29
|
+
name = "search_text";
|
|
30
|
+
description = "Search discoverable UTF-8 project files for case-sensitive literal text and return file paths, line numbers, and previews.";
|
|
31
|
+
inputSchema = inputSchema;
|
|
32
|
+
async execute(argumentsValue, context) {
|
|
33
|
+
const argumentsObject = parseArguments(argumentsValue);
|
|
34
|
+
if (argumentsObject === undefined) {
|
|
35
|
+
return {
|
|
36
|
+
content: 'Invalid arguments. Expected {"query":"literal text","path":".","max_results":50}; query must be one line and max_results must be from 1 to 200.',
|
|
37
|
+
isError: true,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const result = await context.workspace.searchText({
|
|
42
|
+
query: argumentsObject.query,
|
|
43
|
+
path: argumentsObject.path,
|
|
44
|
+
maxResults: argumentsObject.maxResults,
|
|
45
|
+
});
|
|
46
|
+
return {
|
|
47
|
+
content: formatBoundedLineOutput(result.matches.map((match) => `${match.path}:${match.line}:${match.preview}`), {
|
|
48
|
+
emptyMessage: "No matches found.",
|
|
49
|
+
metadata: `[scanned: ${result.scannedFiles} files; skipped: ${result.skippedFiles}]`,
|
|
50
|
+
truncated: result.truncated,
|
|
51
|
+
truncationMessage: "[truncated: narrow path or use a more specific query]",
|
|
52
|
+
}),
|
|
53
|
+
isError: false,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (error instanceof WorkspaceError || error instanceof TypeError) {
|
|
58
|
+
return { content: error.message, isError: true };
|
|
59
|
+
}
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function parseArguments(value) {
|
|
65
|
+
if (!isRecord(value)) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
const keys = Object.keys(value);
|
|
69
|
+
if (keys.some((key) => key !== "query" && key !== "path" && key !== "max_results")) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
const query = value.query;
|
|
73
|
+
const path = value.path ?? DEFAULT_PATH;
|
|
74
|
+
const maxResults = value.max_results ?? DEFAULT_MAX_RESULTS;
|
|
75
|
+
if (typeof query !== "string" ||
|
|
76
|
+
query.length === 0 ||
|
|
77
|
+
[...query].length > MAX_QUERY_CHARACTERS ||
|
|
78
|
+
query.includes("\0") ||
|
|
79
|
+
query.includes("\r") ||
|
|
80
|
+
query.includes("\n") ||
|
|
81
|
+
typeof path !== "string" ||
|
|
82
|
+
path.length === 0 ||
|
|
83
|
+
typeof maxResults !== "number" ||
|
|
84
|
+
!Number.isSafeInteger(maxResults) ||
|
|
85
|
+
maxResults < 1 ||
|
|
86
|
+
maxResults > MAX_RESULTS) {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
return { query, path, maxResults };
|
|
90
|
+
}
|
|
91
|
+
function isRecord(value) {
|
|
92
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=search-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-text.js","sourceRoot":"","sources":["../../src/tools/search-text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Workspace } from "../workspace.js";
|
|
2
|
+
export interface ToolDefinition {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly description: string;
|
|
5
|
+
readonly inputSchema: Readonly<Record<string, unknown>>;
|
|
6
|
+
}
|
|
7
|
+
export interface ToolContext {
|
|
8
|
+
readonly workspace: Workspace;
|
|
9
|
+
/**
|
|
10
|
+
* Cancels long-running tool work. Read-only tools may ignore it; tools that
|
|
11
|
+
* spawn processes or walk large trees should honour it.
|
|
12
|
+
*/
|
|
13
|
+
readonly signal?: AbortSignal;
|
|
14
|
+
}
|
|
15
|
+
export interface ToolOutput {
|
|
16
|
+
readonly content: string;
|
|
17
|
+
readonly isError: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface Tool extends ToolDefinition {
|
|
20
|
+
execute(argumentsValue: unknown, context: ToolContext): Promise<ToolOutput>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/tools/tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,IAAK,SAAQ,cAAc;IAC1C,OAAO,CACL,cAAc,EAAE,OAAO,EACvB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/tools/tool.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export type WorkspaceErrorCode = "invalid_path" | "outside_workspace" | "forbidden_path" | "not_found" | "not_a_file" | "not_a_directory" | "too_large" | "binary_file" | "invalid_utf8" | "invalid_range";
|
|
2
|
+
export declare class WorkspaceError extends Error {
|
|
3
|
+
readonly code: WorkspaceErrorCode;
|
|
4
|
+
constructor(code: WorkspaceErrorCode, message: string, options?: ErrorOptions);
|
|
5
|
+
}
|
|
6
|
+
export interface ReadTextFileOptions {
|
|
7
|
+
readonly startLine?: number;
|
|
8
|
+
readonly lineCount?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface TextFileSlice {
|
|
11
|
+
readonly content: string;
|
|
12
|
+
readonly startLine: number;
|
|
13
|
+
readonly endLine: number;
|
|
14
|
+
readonly totalLines: number;
|
|
15
|
+
readonly truncated: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface ListFilesOptions {
|
|
18
|
+
readonly path?: string;
|
|
19
|
+
readonly maxDepth?: number;
|
|
20
|
+
readonly maxEntries?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface WorkspaceEntry {
|
|
23
|
+
readonly path: string;
|
|
24
|
+
readonly type: "file" | "directory";
|
|
25
|
+
}
|
|
26
|
+
export interface ListFilesResult {
|
|
27
|
+
readonly entries: readonly WorkspaceEntry[];
|
|
28
|
+
readonly truncated: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface SearchTextOptions {
|
|
31
|
+
readonly query: string;
|
|
32
|
+
readonly path?: string;
|
|
33
|
+
readonly maxResults?: number;
|
|
34
|
+
}
|
|
35
|
+
export interface SearchMatch {
|
|
36
|
+
readonly path: string;
|
|
37
|
+
readonly line: number;
|
|
38
|
+
readonly preview: string;
|
|
39
|
+
}
|
|
40
|
+
export interface SearchTextResult {
|
|
41
|
+
readonly matches: readonly SearchMatch[];
|
|
42
|
+
readonly truncated: boolean;
|
|
43
|
+
readonly scannedFiles: number;
|
|
44
|
+
readonly skippedFiles: number;
|
|
45
|
+
}
|
|
46
|
+
export interface Workspace {
|
|
47
|
+
readonly root: string;
|
|
48
|
+
readTextFile(relativePath: string, options?: ReadTextFileOptions): Promise<TextFileSlice>;
|
|
49
|
+
listFiles(options?: ListFilesOptions): Promise<ListFilesResult>;
|
|
50
|
+
searchText(options: SearchTextOptions): Promise<SearchTextResult>;
|
|
51
|
+
}
|
|
52
|
+
export interface LocalWorkspaceOptions {
|
|
53
|
+
readonly maxFileBytes?: number;
|
|
54
|
+
readonly maxSearchFiles?: number;
|
|
55
|
+
readonly maxSearchBytes?: number;
|
|
56
|
+
}
|
|
57
|
+
export declare class LocalWorkspace implements Workspace {
|
|
58
|
+
readonly root: string;
|
|
59
|
+
private readonly maxFileBytes;
|
|
60
|
+
private readonly maxSearchFiles;
|
|
61
|
+
private readonly maxSearchBytes;
|
|
62
|
+
constructor(root: string, options?: LocalWorkspaceOptions);
|
|
63
|
+
readTextFile(relativePath: string, options?: ReadTextFileOptions): Promise<TextFileSlice>;
|
|
64
|
+
listFiles(options?: ListFilesOptions): Promise<ListFilesResult>;
|
|
65
|
+
searchText(options: SearchTextOptions): Promise<SearchTextResult>;
|
|
66
|
+
private readFullTextFile;
|
|
67
|
+
private resolveExistingPath;
|
|
68
|
+
private normalizeRelativePath;
|
|
69
|
+
private rejectExplicitDirectorySymlink;
|
|
70
|
+
private createIgnoreMatcher;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
|