@datename/fastcode-termux 0.1.6 → 0.1.8-beta.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 +4 -0
- package/README.md +67 -16
- package/dist/agent/approval-json.d.ts +43 -0
- package/dist/agent/approval-json.js +69 -0
- package/dist/agent/approval-native.d.ts +3 -0
- package/dist/agent/approval-native.js +165 -0
- package/dist/agent/approval-store.d.ts +16 -0
- package/dist/agent/approval-store.js +21 -0
- package/dist/agent/approval.d.ts +83 -0
- package/dist/agent/approval.js +42 -0
- package/dist/agent/compaction.d.ts +41 -0
- package/dist/agent/compaction.js +270 -0
- package/dist/agent/context.d.ts +29 -0
- package/dist/agent/context.js +62 -0
- package/dist/agent/guards.d.ts +24 -16
- package/dist/agent/guards.js +1167 -18
- package/dist/agent/ignore.d.ts +11 -0
- package/dist/agent/ignore.js +129 -0
- package/dist/agent/policy/defaults.d.ts +16 -0
- package/dist/agent/policy/defaults.js +17 -0
- package/dist/agent/policy/egress.d.ts +32 -0
- package/dist/agent/policy/egress.js +280 -0
- package/dist/agent/process-tree.d.ts +22 -0
- package/dist/agent/process-tree.js +102 -0
- package/dist/agent/protocol-mode.d.ts +6 -0
- package/dist/agent/protocol-mode.js +51 -0
- package/dist/agent/protocol.d.ts +20 -1
- package/dist/agent/protocol.js +169 -39
- package/dist/agent/registry.d.ts +19 -0
- package/dist/agent/registry.js +247 -0
- package/dist/agent/runner.d.ts +127 -0
- package/dist/agent/runner.js +391 -0
- package/dist/agent/shell-ast.d.ts +11 -0
- package/dist/agent/shell-ast.js +204 -0
- package/dist/agent/shell-session.d.ts +51 -0
- package/dist/agent/shell-session.js +611 -0
- package/dist/agent/stream.d.ts +29 -0
- package/dist/agent/stream.js +103 -0
- package/dist/agent/tool-schemas.d.ts +2 -0
- package/dist/agent/tool-schemas.js +82 -0
- package/dist/agent/tools/append_file.d.ts +2 -0
- package/dist/agent/tools/append_file.js +28 -0
- package/dist/agent/tools/apply_patch.d.ts +10 -0
- package/dist/agent/tools/apply_patch.js +92 -0
- package/dist/agent/tools/copy_file.d.ts +2 -0
- package/dist/agent/tools/copy_file.js +53 -0
- package/dist/agent/tools/delete_file.d.ts +2 -0
- package/dist/agent/tools/delete_file.js +43 -0
- package/dist/agent/tools/grep.d.ts +2 -0
- package/dist/agent/tools/grep.js +54 -0
- package/dist/agent/tools/index.d.ts +2 -0
- package/dist/agent/tools/index.js +32 -0
- package/dist/agent/tools/list_files.d.ts +2 -0
- package/dist/agent/tools/list_files.js +17 -0
- package/dist/agent/tools/make_dir.d.ts +2 -0
- package/dist/agent/tools/make_dir.js +26 -0
- package/dist/agent/tools/move_path.d.ts +9 -0
- package/dist/agent/tools/move_path.js +73 -0
- package/dist/agent/tools/paths.d.ts +7 -0
- package/dist/agent/tools/paths.js +84 -0
- package/dist/agent/tools/pwd.d.ts +2 -0
- package/dist/agent/tools/pwd.js +10 -0
- package/dist/agent/tools/read_file.d.ts +2 -0
- package/dist/agent/tools/read_file.js +81 -0
- package/dist/agent/tools/read_many.d.ts +2 -0
- package/dist/agent/tools/read_many.js +43 -0
- package/dist/agent/tools/readers.d.ts +58 -0
- package/dist/agent/tools/readers.js +426 -0
- package/dist/agent/tools/replace_in_file.d.ts +2 -0
- package/dist/agent/tools/replace_in_file.js +63 -0
- package/dist/agent/tools/shell.d.ts +2 -0
- package/dist/agent/tools/shell.js +48 -0
- package/dist/agent/tools/stat_path.d.ts +2 -0
- package/dist/agent/tools/stat_path.js +31 -0
- package/dist/agent/tools/types.d.ts +65 -0
- package/dist/agent/tools/types.js +1 -0
- package/dist/agent/tools/validate.d.ts +19 -0
- package/dist/agent/tools/validate.js +92 -0
- package/dist/agent/tools/write_file.d.ts +2 -0
- package/dist/agent/tools/write_file.js +28 -0
- package/dist/agent/tools.d.ts +3 -1
- package/dist/agent/tools.js +2 -377
- package/dist/app.d.ts +2 -1
- package/dist/app.js +846 -173
- package/dist/cli-main.js +363 -0
- package/dist/cli.js +444 -333
- package/dist/commands/about.js +1 -1
- package/dist/commands/attach.d.ts +9 -0
- package/dist/commands/attach.js +15 -0
- package/dist/commands/bg.d.ts +7 -0
- package/dist/commands/bg.js +9 -0
- package/dist/commands/cancel.d.ts +10 -0
- package/dist/commands/cancel.js +10 -0
- package/dist/commands/clear.d.ts +1 -0
- package/dist/commands/clear.js +1 -1
- package/dist/commands/compact.d.ts +22 -0
- package/dist/commands/compact.js +34 -0
- package/dist/commands/context.d.ts +7 -0
- package/dist/commands/context.js +25 -0
- package/dist/commands/edit.d.ts +10 -0
- package/dist/commands/edit.js +36 -0
- package/dist/commands/effort.d.ts +25 -0
- package/dist/commands/effort.js +48 -0
- package/dist/commands/expand.d.ts +10 -0
- package/dist/commands/expand.js +8 -0
- package/dist/commands/index.js +24 -0
- package/dist/commands/jobs.d.ts +7 -0
- package/dist/commands/jobs.js +17 -0
- package/dist/commands/kill.d.ts +7 -0
- package/dist/commands/kill.js +13 -0
- package/dist/commands/login.d.ts +6 -4
- package/dist/commands/login.js +24 -22
- package/dist/commands/logout.js +8 -16
- package/dist/commands/model.d.ts +1 -0
- package/dist/commands/model.js +10 -22
- package/dist/commands/provider.d.ts +1 -2
- package/dist/commands/provider.js +4 -11
- package/dist/commands/skills.js +34 -4
- package/dist/commands/steer.d.ts +11 -0
- package/dist/commands/steer.js +13 -0
- package/dist/commands/threads.d.ts +9 -0
- package/dist/commands/threads.js +26 -0
- package/dist/commands/whoami.js +6 -5
- package/dist/config/store.d.ts +53 -12
- package/dist/config/store.js +163 -73
- package/dist/config/trust.d.ts +30 -8
- package/dist/config/trust.js +139 -14
- package/dist/headless.d.ts +7 -0
- package/dist/headless.js +213 -0
- package/dist/index.js +19 -3
- package/dist/lib/debug.d.ts +2 -0
- package/dist/lib/debug.js +22 -0
- package/dist/lib/diagnostics.d.ts +48 -4
- package/dist/lib/diagnostics.js +90 -8
- package/dist/lib/highlight-subset.d.ts +21 -0
- package/dist/lib/highlight-subset.js +88 -0
- package/dist/lib/http.d.ts +11 -1
- package/dist/lib/http.js +62 -4
- package/dist/lib/lifecycle.d.ts +5 -0
- package/dist/lib/lifecycle.js +62 -0
- package/dist/lib/markdown.js +22 -4
- package/dist/lib/model-meta.d.ts +19 -0
- package/dist/lib/model-meta.js +113 -0
- package/dist/lib/native-tools.d.ts +12 -0
- package/dist/lib/native-tools.js +21 -0
- package/dist/lib/net.d.ts +33 -0
- package/dist/lib/net.js +168 -0
- package/dist/patch/apply.d.ts +15 -0
- package/dist/patch/apply.js +172 -0
- package/dist/patch/parse.d.ts +29 -0
- package/dist/patch/parse.js +112 -0
- package/dist/patch/plan.d.ts +49 -0
- package/dist/patch/plan.js +273 -0
- package/dist/providers/anthropic.d.ts +1 -0
- package/dist/providers/anthropic.js +12 -0
- package/dist/providers/custom.d.ts +9 -0
- package/dist/providers/deepseek.d.ts +10 -0
- package/dist/providers/deepseek.js +3 -2
- package/dist/providers/google.d.ts +9 -0
- package/dist/providers/groq.d.ts +10 -0
- package/dist/providers/groq.js +2 -1
- package/dist/providers/index.d.ts +10 -201
- package/dist/providers/index.js +30 -0
- package/dist/providers/mistral.d.ts +10 -0
- package/dist/providers/mistral.js +2 -1
- package/dist/providers/moonshot.d.ts +10 -0
- package/dist/providers/moonshot.js +2 -1
- package/dist/providers/ollama.d.ts +9 -0
- package/dist/providers/openai.d.ts +10 -0
- package/dist/providers/openai.js +2 -1
- package/dist/providers/openaiCompatible.d.ts +33 -2
- package/dist/providers/openaiCompatible.js +78 -16
- package/dist/providers/openrouter.d.ts +10 -0
- package/dist/providers/openrouter.js +2 -1
- package/dist/providers/qwen.d.ts +10 -0
- package/dist/providers/qwen.js +2 -1
- package/dist/providers/spec.d.ts +12 -0
- package/dist/providers/spec.js +29 -0
- package/dist/providers/xai.d.ts +10 -0
- package/dist/providers/xai.js +2 -1
- package/dist/providers/zhipu.d.ts +10 -0
- package/dist/providers/zhipu.js +2 -1
- package/dist/session/log.d.ts +49 -14
- package/dist/session/log.js +236 -11
- package/dist/session/projection.d.ts +76 -0
- package/dist/session/projection.js +526 -0
- package/dist/skills/manager.d.ts +15 -0
- package/dist/skills/manager.js +135 -18
- package/dist/types.d.ts +75 -1
- package/dist/ui/Message.d.ts +1 -7
- package/dist/ui/Message.js +13 -2
- package/dist/ui/Picker.d.ts +8 -0
- package/dist/ui/Picker.js +24 -0
- package/dist/ui/Prompt.d.ts +1 -2
- package/dist/ui/Prompt.js +2 -2
- package/dist/ui/Spinner.js +11 -5
- package/dist/ui/StatusBar.d.ts +2 -1
- package/dist/ui/StatusBar.js +6 -5
- package/package.json +3 -2
- package/src/agent/approval-json.ts +103 -0
- package/src/agent/approval-native.ts +168 -0
- package/src/agent/approval-store.ts +38 -0
- package/src/agent/approval.ts +94 -0
- package/src/agent/compaction.ts +321 -0
- package/src/agent/context.ts +97 -0
- package/src/agent/guards.ts +1239 -19
- package/src/agent/ignore.ts +147 -0
- package/src/agent/policy/defaults.ts +34 -0
- package/src/agent/policy/egress.ts +335 -0
- package/src/agent/process-tree.ts +114 -0
- package/src/agent/protocol-mode.ts +59 -0
- package/src/agent/protocol.ts +191 -40
- package/src/agent/registry.ts +270 -0
- package/src/agent/runner.ts +486 -0
- package/src/agent/shell-ast.ts +227 -0
- package/src/agent/shell-session.ts +673 -0
- package/src/agent/stream.ts +143 -0
- package/src/agent/tool-schemas.ts +86 -0
- package/src/agent/tools/append_file.ts +30 -0
- package/src/agent/tools/apply_patch.ts +95 -0
- package/src/agent/tools/copy_file.ts +56 -0
- package/src/agent/tools/delete_file.ts +45 -0
- package/src/agent/tools/grep.ts +57 -0
- package/src/agent/tools/index.ts +34 -0
- package/src/agent/tools/list_files.ts +19 -0
- package/src/agent/tools/make_dir.ts +28 -0
- package/src/agent/tools/move_path.ts +83 -0
- package/src/agent/tools/paths.ts +92 -0
- package/src/agent/tools/pwd.ts +12 -0
- package/src/agent/tools/read_file.ts +84 -0
- package/src/agent/tools/read_many.ts +45 -0
- package/src/agent/tools/readers.ts +491 -0
- package/src/agent/tools/replace_in_file.ts +66 -0
- package/src/agent/tools/shell.ts +53 -0
- package/src/agent/tools/stat_path.ts +33 -0
- package/src/agent/tools/types.ts +84 -0
- package/src/agent/tools/validate.ts +104 -0
- package/src/agent/tools/write_file.ts +30 -0
- package/src/agent/tools.ts +3 -377
- package/src/app.ts +853 -170
- package/src/{cli.ts → cli-main.ts} +64 -9
- package/src/commands/about.ts +1 -1
- package/src/commands/attach.ts +16 -0
- package/src/commands/bg.ts +9 -0
- package/src/commands/cancel.ts +10 -0
- package/src/commands/clear.ts +1 -1
- package/src/commands/compact.ts +35 -0
- package/src/commands/context.ts +26 -0
- package/src/commands/edit.ts +37 -0
- package/src/commands/effort.ts +49 -0
- package/src/commands/expand.ts +8 -0
- package/src/commands/index.ts +24 -0
- package/src/commands/jobs.ts +18 -0
- package/src/commands/kill.ts +14 -0
- package/src/commands/login.ts +24 -22
- package/src/commands/logout.ts +8 -16
- package/src/commands/model.ts +10 -22
- package/src/commands/provider.ts +4 -11
- package/src/commands/skills.ts +34 -4
- package/src/commands/steer.ts +13 -0
- package/src/commands/threads.ts +28 -0
- package/src/commands/whoami.ts +6 -5
- package/src/config/store.ts +168 -77
- package/src/config/trust.ts +181 -22
- package/src/headless.ts +225 -0
- package/src/index.ts +19 -3
- package/src/lib/debug.ts +24 -0
- package/src/lib/diagnostics.ts +90 -8
- package/src/lib/highlight-subset.ts +93 -0
- package/src/lib/http.ts +66 -4
- package/src/lib/lifecycle.ts +69 -0
- package/src/lib/markdown.ts +22 -4
- package/src/lib/model-meta.ts +138 -0
- package/src/lib/native-tools.ts +32 -0
- package/src/lib/net.ts +204 -0
- package/src/patch/apply.ts +194 -0
- package/src/patch/parse.ts +131 -0
- package/src/patch/plan.ts +317 -0
- package/src/providers/anthropic.ts +13 -1
- package/src/providers/deepseek.ts +3 -2
- package/src/providers/groq.ts +2 -1
- package/src/providers/index.ts +32 -1
- package/src/providers/mistral.ts +2 -1
- package/src/providers/moonshot.ts +2 -1
- package/src/providers/openai.ts +2 -1
- package/src/providers/openaiCompatible.ts +104 -19
- package/src/providers/openrouter.ts +2 -1
- package/src/providers/qwen.ts +2 -1
- package/src/providers/spec.ts +42 -0
- package/src/providers/xai.ts +2 -1
- package/src/providers/zhipu.ts +2 -1
- package/src/session/log.ts +311 -29
- package/src/session/projection.ts +621 -0
- package/src/skills/manager.ts +140 -18
- package/src/types/highlight-shims.d.ts +14 -0
- package/src/types.ts +79 -2
- package/src/ui/Message.ts +13 -2
- package/src/ui/Picker.ts +24 -0
- package/src/ui/Prompt.ts +2 -2
- package/src/ui/Spinner.ts +11 -5
- package/src/ui/StatusBar.ts +6 -5
- package/tsconfig.json +1 -0
- /package/dist/{cli.d.ts → cli-main.d.ts} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ToolCall } from "./types.js";
|
|
2
|
+
export declare function allowedRoots(cwd: string): string[];
|
|
3
|
+
export declare function resolveSharedDir(cwd: string, entry: string): string;
|
|
4
|
+
export declare function isInsideAny(child: string, roots: string[]): boolean;
|
|
5
|
+
export declare function resolvePath(cwd: string, call: ToolCall, fallback?: string): string;
|
|
6
|
+
export declare function sandboxPath(cwd: string, raw: string): string;
|
|
7
|
+
export declare function realpathOf(input: string): string | undefined;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { existsSync, realpathSync } from "node:fs";
|
|
2
|
+
import { basename, delimiter, dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
3
|
+
import { detectPlatform, safeHome } from "../../lib/platform.js";
|
|
4
|
+
import { loadConfig } from "../../config/store.js";
|
|
5
|
+
export function allowedRoots(cwd) {
|
|
6
|
+
const roots = [resolve(cwd)];
|
|
7
|
+
const configured = (process.env["FASTCODE_ALLOW_PATHS"] ?? "")
|
|
8
|
+
.split(delimiter)
|
|
9
|
+
.map((entry) => entry.trim())
|
|
10
|
+
.filter(Boolean);
|
|
11
|
+
for (const entry of configured)
|
|
12
|
+
roots.push(resolve(entry));
|
|
13
|
+
const sharedDirs = loadConfig().sharedDirs;
|
|
14
|
+
if (Array.isArray(sharedDirs)) {
|
|
15
|
+
for (const entry of sharedDirs) {
|
|
16
|
+
if (typeof entry !== "string" || !entry.trim())
|
|
17
|
+
continue;
|
|
18
|
+
roots.push(resolveSharedDir(cwd, entry.trim()));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (detectPlatform() === "termux" && !isDisabled(process.env["FASTCODE_ALLOW_SHARED_STORAGE"])) {
|
|
22
|
+
const home = process.env["HOME"];
|
|
23
|
+
if (home) {
|
|
24
|
+
const shared = join(home, "storage", "shared");
|
|
25
|
+
if (existsSync(shared))
|
|
26
|
+
roots.push(shared);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return roots;
|
|
30
|
+
}
|
|
31
|
+
export function resolveSharedDir(cwd, entry) {
|
|
32
|
+
const expanded = entry === "~" || entry.startsWith("~/") || entry.startsWith("~\\")
|
|
33
|
+
? join(safeHome(), entry.slice(1))
|
|
34
|
+
: entry;
|
|
35
|
+
return isAbsolute(expanded) ? resolve(expanded) : resolve(cwd, expanded);
|
|
36
|
+
}
|
|
37
|
+
function isDisabled(value) {
|
|
38
|
+
if (value === undefined)
|
|
39
|
+
return false;
|
|
40
|
+
return ["0", "false", "no", "off"].includes(value.trim().toLowerCase());
|
|
41
|
+
}
|
|
42
|
+
export function isInsideAny(child, roots) {
|
|
43
|
+
return roots.some((root) => {
|
|
44
|
+
const rel = relative(root, child);
|
|
45
|
+
return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
export function resolvePath(cwd, call, fallback = "") {
|
|
49
|
+
const raw = typeof call.path === "string" ? call.path : fallback;
|
|
50
|
+
return sandboxPath(cwd, raw);
|
|
51
|
+
}
|
|
52
|
+
export function sandboxPath(cwd, raw) {
|
|
53
|
+
const target = resolve(cwd, raw);
|
|
54
|
+
const roots = allowedRoots(cwd);
|
|
55
|
+
const realRoots = roots.map((root) => realpathOf(root)).filter(Boolean);
|
|
56
|
+
const realTarget = realpathOf(target);
|
|
57
|
+
if (realTarget) {
|
|
58
|
+
if (isInsideAny(realTarget, realRoots))
|
|
59
|
+
return target;
|
|
60
|
+
throw new Error("path outside sandbox: " + raw);
|
|
61
|
+
}
|
|
62
|
+
if (isInsideAny(target, roots))
|
|
63
|
+
return target;
|
|
64
|
+
throw new Error("path outside sandbox: " + raw);
|
|
65
|
+
}
|
|
66
|
+
export function realpathOf(input) {
|
|
67
|
+
let current = resolve(input);
|
|
68
|
+
const missing = [];
|
|
69
|
+
for (;;) {
|
|
70
|
+
if (existsSync(current)) {
|
|
71
|
+
try {
|
|
72
|
+
return join(realpathSync(current), ...missing.slice().reverse());
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const parent = dirname(current);
|
|
79
|
+
if (parent === current)
|
|
80
|
+
return undefined;
|
|
81
|
+
missing.push(basename(current));
|
|
82
|
+
current = parent;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { readFileRange, readTextFileResult } from "./readers.js";
|
|
2
|
+
import { resolvePath } from "./paths.js";
|
|
3
|
+
import { clampInt, invalid, optionalNumber, preparePath, requiredString } from "./validate.js";
|
|
4
|
+
const MAX_READ_LINES = 2000;
|
|
5
|
+
export const readFileTool = {
|
|
6
|
+
name: "read_file",
|
|
7
|
+
stateScope: "call",
|
|
8
|
+
revalidate: ["sandboxRoots"],
|
|
9
|
+
prepare(call, ctx) {
|
|
10
|
+
let path;
|
|
11
|
+
try {
|
|
12
|
+
path = requiredString(call, "path");
|
|
13
|
+
const offset = optionalNumber(call, "offset");
|
|
14
|
+
const limit = optionalNumber(call, "limit");
|
|
15
|
+
if (offset !== undefined && offset < 1)
|
|
16
|
+
return invalid("offset must be >= 1");
|
|
17
|
+
if (limit !== undefined && limit < 1)
|
|
18
|
+
return invalid("limit must be >= 1");
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
return invalid(err.message);
|
|
22
|
+
}
|
|
23
|
+
return preparePath(ctx.cwd, path);
|
|
24
|
+
},
|
|
25
|
+
async execute(call, ctx) {
|
|
26
|
+
const file = resolvePath(ctx.cwd, call);
|
|
27
|
+
const offset = optionalNumber(call, "offset");
|
|
28
|
+
const limit = optionalNumber(call, "limit");
|
|
29
|
+
if (offset === undefined && limit === undefined) {
|
|
30
|
+
const result = await readTextFileResult(file);
|
|
31
|
+
const output = result.truncated
|
|
32
|
+
? `${result.text}\n[... truncated at ${result.returnedBytes} of ${result.totalBytes} bytes; use offset/limit, grep, or a narrower file ...]`
|
|
33
|
+
: result.text;
|
|
34
|
+
return {
|
|
35
|
+
ok: true,
|
|
36
|
+
output,
|
|
37
|
+
truncated: result.truncated,
|
|
38
|
+
totalLines: result.totalLines,
|
|
39
|
+
returnedLines: result.returnedLines,
|
|
40
|
+
totalBytes: result.totalBytes,
|
|
41
|
+
returnedBytes: result.returnedBytes,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const start = clampInt(offset, 1, 1, 1_000_000);
|
|
45
|
+
const count = clampInt(limit, MAX_READ_LINES, 1, MAX_READ_LINES);
|
|
46
|
+
const result = await readFileRange(file, start, count, { signal: ctx.signal });
|
|
47
|
+
if (result.binary) {
|
|
48
|
+
return {
|
|
49
|
+
ok: true,
|
|
50
|
+
output: result.text,
|
|
51
|
+
truncated: false,
|
|
52
|
+
totalLines: 0,
|
|
53
|
+
returnedLines: 0,
|
|
54
|
+
totalBytes: result.totalBytes,
|
|
55
|
+
returnedBytes: 0,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (result.returnedLines === 0 && start > result.totalLines) {
|
|
59
|
+
return {
|
|
60
|
+
ok: false,
|
|
61
|
+
output: `offset ${start} is beyond the end of ${file} (${result.totalLines} lines)`,
|
|
62
|
+
code: "NOT_FOUND",
|
|
63
|
+
hint: "Use a smaller offset or read without offset.",
|
|
64
|
+
totalLines: result.totalLines,
|
|
65
|
+
returnedLines: 0,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const end = start + result.returnedLines - 1;
|
|
69
|
+
const header = `[lines ${start}-${end} of ${result.totalLines}${result.scannedAll ? "" : "+"}]\n`;
|
|
70
|
+
return {
|
|
71
|
+
ok: true,
|
|
72
|
+
output: header + result.text,
|
|
73
|
+
truncated: result.truncated,
|
|
74
|
+
hint: result.scannedAll ? undefined : "totalLines is a lower bound; the file scan hit FASTCODE_READ_SCAN_MAX_BYTES.",
|
|
75
|
+
totalLines: result.totalLines,
|
|
76
|
+
returnedLines: result.returnedLines,
|
|
77
|
+
totalBytes: result.totalBytes,
|
|
78
|
+
returnedBytes: result.returnedBytes,
|
|
79
|
+
};
|
|
80
|
+
},
|
|
81
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { readManyResult } from "./readers.js";
|
|
2
|
+
import { invalid, optionalNumber, preparePath, stringArray } from "./validate.js";
|
|
3
|
+
export const readManyTool = {
|
|
4
|
+
name: "read_many",
|
|
5
|
+
stateScope: "call",
|
|
6
|
+
revalidate: ["sandboxRoots"],
|
|
7
|
+
prepare(call, ctx) {
|
|
8
|
+
let paths;
|
|
9
|
+
try {
|
|
10
|
+
paths = stringArray(call, "paths");
|
|
11
|
+
if (paths.length === 0)
|
|
12
|
+
return invalid("paths must contain at least one path");
|
|
13
|
+
const maxBytes = optionalNumber(call, "maxBytes");
|
|
14
|
+
if (maxBytes !== undefined && maxBytes < 1)
|
|
15
|
+
return invalid("maxBytes must be >= 1");
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
return invalid(err.message);
|
|
19
|
+
}
|
|
20
|
+
for (const path of paths) {
|
|
21
|
+
const checked = preparePath(ctx.cwd, path);
|
|
22
|
+
if (!checked.ok)
|
|
23
|
+
return checked;
|
|
24
|
+
}
|
|
25
|
+
return { ok: true };
|
|
26
|
+
},
|
|
27
|
+
async execute(call, ctx) {
|
|
28
|
+
const paths = stringArray(call, "paths");
|
|
29
|
+
const requested = optionalNumber(call, "maxBytes");
|
|
30
|
+
const maxBytes = requested === undefined ? undefined : Math.max(1, Math.floor(requested));
|
|
31
|
+
const result = await readManyResult(ctx.cwd, paths, maxBytes);
|
|
32
|
+
return {
|
|
33
|
+
ok: true,
|
|
34
|
+
output: result.text,
|
|
35
|
+
truncated: result.truncated,
|
|
36
|
+
totalBytes: result.totalBytes,
|
|
37
|
+
returnedBytes: result.returnedBytes,
|
|
38
|
+
filesRead: result.filesRead,
|
|
39
|
+
filesSkipped: result.filesSkipped,
|
|
40
|
+
hint: result.filesSkipped > 0 ? `${result.filesSkipped} file(s) skipped by the read_many byte budget.` : undefined,
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export interface ReadManyResult {
|
|
2
|
+
text: string;
|
|
3
|
+
truncated: boolean;
|
|
4
|
+
totalBytes: number;
|
|
5
|
+
returnedBytes: number;
|
|
6
|
+
filesRead: number;
|
|
7
|
+
filesSkipped: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function readManyResult(cwd: string, paths: string[], maxBytes?: number): Promise<ReadManyResult>;
|
|
10
|
+
export declare function readMany(cwd: string, paths: string[]): Promise<string>;
|
|
11
|
+
export declare function listFiles(sandbox: string, root: string, maxDepth: number, detail: boolean): Promise<string>;
|
|
12
|
+
export declare function formatSize(bytes: number): string;
|
|
13
|
+
export interface GrepOptions {
|
|
14
|
+
pattern: string;
|
|
15
|
+
flags?: string;
|
|
16
|
+
glob?: string;
|
|
17
|
+
context?: number;
|
|
18
|
+
maxResults?: number;
|
|
19
|
+
maxDepth?: number;
|
|
20
|
+
signal?: AbortSignal;
|
|
21
|
+
}
|
|
22
|
+
export interface GrepResult {
|
|
23
|
+
text: string;
|
|
24
|
+
truncated: boolean;
|
|
25
|
+
matchCount: number;
|
|
26
|
+
filesScanned: number;
|
|
27
|
+
}
|
|
28
|
+
export declare function grepFiles(sandbox: string, root: string, options: GrepOptions): Promise<GrepResult>;
|
|
29
|
+
export interface ReadTextResult {
|
|
30
|
+
text: string;
|
|
31
|
+
truncated: boolean;
|
|
32
|
+
totalLines?: number;
|
|
33
|
+
returnedLines: number;
|
|
34
|
+
totalBytes: number;
|
|
35
|
+
returnedBytes: number;
|
|
36
|
+
binary: boolean;
|
|
37
|
+
}
|
|
38
|
+
export declare function readTextFileResult(file: string, limit?: number): Promise<ReadTextResult>;
|
|
39
|
+
export interface ReadRangeResult {
|
|
40
|
+
text: string;
|
|
41
|
+
truncated: boolean;
|
|
42
|
+
totalLines: number;
|
|
43
|
+
returnedLines: number;
|
|
44
|
+
totalBytes: number;
|
|
45
|
+
returnedBytes: number;
|
|
46
|
+
scannedAll: boolean;
|
|
47
|
+
binary: boolean;
|
|
48
|
+
}
|
|
49
|
+
export declare function readFileRange(file: string, offset: number, limit: number, options?: {
|
|
50
|
+
maxBytes?: number;
|
|
51
|
+
scanMaxBytes?: number;
|
|
52
|
+
signal?: AbortSignal;
|
|
53
|
+
}): Promise<ReadRangeResult>;
|
|
54
|
+
export declare function readTextFile(file: string, limit?: number): Promise<string>;
|
|
55
|
+
export declare function readMaxBytes(): number;
|
|
56
|
+
export declare function grepMaxBytes(): number;
|
|
57
|
+
export declare function readScanMaxBytes(): number;
|
|
58
|
+
export declare function readManyMaxBytes(): number;
|