@chiwanpark/pi-squared-agent 0.1.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/README.md +13 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +144 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/auth-store.d.ts +36 -0
- package/dist/runtime/auth-store.d.ts.map +1 -0
- package/dist/runtime/auth-store.js +131 -0
- package/dist/runtime/auth-store.js.map +1 -0
- package/dist/runtime/config-store.d.ts +44 -0
- package/dist/runtime/config-store.d.ts.map +1 -0
- package/dist/runtime/config-store.js +138 -0
- package/dist/runtime/config-store.js.map +1 -0
- package/dist/runtime/messages.d.ts +12 -0
- package/dist/runtime/messages.d.ts.map +1 -0
- package/dist/runtime/messages.js +101 -0
- package/dist/runtime/messages.js.map +1 -0
- package/dist/runtime/model-resolver.d.ts +52 -0
- package/dist/runtime/model-resolver.d.ts.map +1 -0
- package/dist/runtime/model-resolver.js +175 -0
- package/dist/runtime/model-resolver.js.map +1 -0
- package/dist/runtime/pi-agent.d.ts +83 -0
- package/dist/runtime/pi-agent.d.ts.map +1 -0
- package/dist/runtime/pi-agent.js +405 -0
- package/dist/runtime/pi-agent.js.map +1 -0
- package/dist/runtime/status-store.d.ts +50 -0
- package/dist/runtime/status-store.d.ts.map +1 -0
- package/dist/runtime/status-store.js +65 -0
- package/dist/runtime/status-store.js.map +1 -0
- package/dist/runtime/system-prompt.d.ts +11 -0
- package/dist/runtime/system-prompt.d.ts.map +1 -0
- package/dist/runtime/system-prompt.js +43 -0
- package/dist/runtime/system-prompt.js.map +1 -0
- package/dist/runtime/tools/bash.d.ts +23 -0
- package/dist/runtime/tools/bash.d.ts.map +1 -0
- package/dist/runtime/tools/bash.js +206 -0
- package/dist/runtime/tools/bash.js.map +1 -0
- package/dist/runtime/tools/child-process.d.ts +13 -0
- package/dist/runtime/tools/child-process.d.ts.map +1 -0
- package/dist/runtime/tools/child-process.js +75 -0
- package/dist/runtime/tools/child-process.js.map +1 -0
- package/dist/runtime/tools/output-accumulator.d.ts +52 -0
- package/dist/runtime/tools/output-accumulator.d.ts.map +1 -0
- package/dist/runtime/tools/output-accumulator.js +160 -0
- package/dist/runtime/tools/output-accumulator.js.map +1 -0
- package/dist/runtime/tools/shell.d.ts +26 -0
- package/dist/runtime/tools/shell.d.ts.map +1 -0
- package/dist/runtime/tools/shell.js +116 -0
- package/dist/runtime/tools/shell.js.map +1 -0
- package/dist/runtime/tools/truncate.d.ts +38 -0
- package/dist/runtime/tools/truncate.d.ts.map +1 -0
- package/dist/runtime/tools/truncate.js +98 -0
- package/dist/runtime/tools/truncate.js.map +1 -0
- package/dist/tools/bash/child-process.d.ts +13 -0
- package/dist/tools/bash/child-process.d.ts.map +1 -0
- package/dist/tools/bash/child-process.js +79 -0
- package/dist/tools/bash/child-process.js.map +1 -0
- package/dist/tools/bash/output-accumulator.d.ts +54 -0
- package/dist/tools/bash/output-accumulator.d.ts.map +1 -0
- package/dist/tools/bash/output-accumulator.js +171 -0
- package/dist/tools/bash/output-accumulator.js.map +1 -0
- package/dist/tools/bash/shell.d.ts +26 -0
- package/dist/tools/bash/shell.d.ts.map +1 -0
- package/dist/tools/bash/shell.js +129 -0
- package/dist/tools/bash/shell.js.map +1 -0
- package/dist/tools/bash/tool.d.ts +23 -0
- package/dist/tools/bash/tool.d.ts.map +1 -0
- package/dist/tools/bash/tool.js +219 -0
- package/dist/tools/bash/tool.js.map +1 -0
- package/dist/tools/bash/truncate.d.ts +50 -0
- package/dist/tools/bash/truncate.d.ts.map +1 -0
- package/dist/tools/bash/truncate.js +184 -0
- package/dist/tools/bash/truncate.js.map +1 -0
- package/dist/tools/external-tool.d.ts +2 -0
- package/dist/tools/external-tool.d.ts.map +1 -0
- package/dist/tools/external-tool.js +15 -0
- package/dist/tools/external-tool.js.map +1 -0
- package/dist/tools/file/edit-diff.d.ts +27 -0
- package/dist/tools/file/edit-diff.d.ts.map +1 -0
- package/dist/tools/file/edit-diff.js +196 -0
- package/dist/tools/file/edit-diff.js.map +1 -0
- package/dist/tools/file/edit.d.ts +26 -0
- package/dist/tools/file/edit.d.ts.map +1 -0
- package/dist/tools/file/edit.js +106 -0
- package/dist/tools/file/edit.js.map +1 -0
- package/dist/tools/file/find.d.ts +27 -0
- package/dist/tools/file/find.d.ts.map +1 -0
- package/dist/tools/file/find.js +150 -0
- package/dist/tools/file/find.js.map +1 -0
- package/dist/tools/file/glob.d.ts +6 -0
- package/dist/tools/file/glob.d.ts.map +1 -0
- package/dist/tools/file/glob.js +50 -0
- package/dist/tools/file/glob.js.map +1 -0
- package/dist/tools/file/grep.d.ts +29 -0
- package/dist/tools/file/grep.d.ts.map +1 -0
- package/dist/tools/file/grep.js +220 -0
- package/dist/tools/file/grep.js.map +1 -0
- package/dist/tools/file/index.d.ts +7 -0
- package/dist/tools/file/index.d.ts.map +1 -0
- package/dist/tools/file/index.js +7 -0
- package/dist/tools/file/index.js.map +1 -0
- package/dist/tools/file/ls.d.ts +27 -0
- package/dist/tools/file/ls.d.ts.map +1 -0
- package/dist/tools/file/ls.js +82 -0
- package/dist/tools/file/ls.js.map +1 -0
- package/dist/tools/file/read.d.ts +23 -0
- package/dist/tools/file/read.d.ts.map +1 -0
- package/dist/tools/file/read.js +98 -0
- package/dist/tools/file/read.js.map +1 -0
- package/dist/tools/file/write.d.ts +17 -0
- package/dist/tools/file/write.d.ts.map +1 -0
- package/dist/tools/file/write.js +45 -0
- package/dist/tools/file/write.js.map +1 -0
- package/dist/tools/file-mutation-queue.d.ts +3 -0
- package/dist/tools/file-mutation-queue.d.ts.map +1 -0
- package/dist/tools/file-mutation-queue.js +47 -0
- package/dist/tools/file-mutation-queue.js.map +1 -0
- package/dist/tools/path-utils.d.ts +5 -0
- package/dist/tools/path-utils.d.ts.map +1 -0
- package/dist/tools/path-utils.js +79 -0
- package/dist/tools/path-utils.js.map +1 -0
- package/dist/tools/web/index.d.ts +2 -0
- package/dist/tools/web/index.d.ts.map +1 -0
- package/dist/tools/web/index.js +2 -0
- package/dist/tools/web/index.js.map +1 -0
- package/dist/tools/web/search.d.ts +44 -0
- package/dist/tools/web/search.d.ts.map +1 -0
- package/dist/tools/web/search.js +209 -0
- package/dist/tools/web/search.js.map +1 -0
- package/dist/tui/box.d.ts +11 -0
- package/dist/tui/box.d.ts.map +1 -0
- package/dist/tui/box.js +24 -0
- package/dist/tui/box.js.map +1 -0
- package/dist/tui/chat-screen.d.ts +29 -0
- package/dist/tui/chat-screen.d.ts.map +1 -0
- package/dist/tui/chat-screen.js +475 -0
- package/dist/tui/chat-screen.js.map +1 -0
- package/dist/tui/commands.d.ts +34 -0
- package/dist/tui/commands.d.ts.map +1 -0
- package/dist/tui/commands.js +691 -0
- package/dist/tui/commands.js.map +1 -0
- package/dist/tui/interactive.d.ts +9 -0
- package/dist/tui/interactive.d.ts.map +1 -0
- package/dist/tui/interactive.js +88 -0
- package/dist/tui/interactive.js.map +1 -0
- package/dist/tui/overlays.d.ts +39 -0
- package/dist/tui/overlays.d.ts.map +1 -0
- package/dist/tui/overlays.js +157 -0
- package/dist/tui/overlays.js.map +1 -0
- package/dist/tui/theme.d.ts +40 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +120 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/welcome.d.ts +3 -0
- package/dist/tui/welcome.d.ts.map +1 -0
- package/dist/tui/welcome.js +37 -0
- package/dist/tui/welcome.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { relative, sep } from "node:path";
|
|
2
|
+
export function toPosixPath(value) {
|
|
3
|
+
return value.split(sep).join("/");
|
|
4
|
+
}
|
|
5
|
+
function escapeRegex(value) {
|
|
6
|
+
return value.replace(/[|\\{}()[\]^$+?.]/g, "\\$&");
|
|
7
|
+
}
|
|
8
|
+
export function globToRegExp(pattern) {
|
|
9
|
+
const normalized = toPosixPath(pattern);
|
|
10
|
+
let regex = "^";
|
|
11
|
+
for (let i = 0; i < normalized.length; i += 1) {
|
|
12
|
+
const char = normalized[i];
|
|
13
|
+
const next = normalized[i + 1];
|
|
14
|
+
if (char === "*" && next === "*") {
|
|
15
|
+
const after = normalized[i + 2];
|
|
16
|
+
if (after === "/") {
|
|
17
|
+
regex += "(?:.*/)?";
|
|
18
|
+
i += 2;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
regex += ".*";
|
|
22
|
+
i += 1;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else if (char === "*") {
|
|
26
|
+
regex += "[^/]*";
|
|
27
|
+
}
|
|
28
|
+
else if (char === "?") {
|
|
29
|
+
regex += "[^/]";
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
regex += escapeRegex(char);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
regex += "$";
|
|
36
|
+
return new RegExp(regex);
|
|
37
|
+
}
|
|
38
|
+
export function matchesGlob(posixRelativePath, pattern) {
|
|
39
|
+
const normalizedPattern = toPosixPath(pattern);
|
|
40
|
+
const candidates = normalizedPattern.includes("/") ? [posixRelativePath] : [posixRelativePath.split("/").pop() ?? ""];
|
|
41
|
+
const regex = globToRegExp(normalizedPattern);
|
|
42
|
+
return candidates.some((candidate) => regex.test(candidate));
|
|
43
|
+
}
|
|
44
|
+
export function relativePosix(from, to) {
|
|
45
|
+
return toPosixPath(relative(from, to));
|
|
46
|
+
}
|
|
47
|
+
export function shouldSkipDirectory(name) {
|
|
48
|
+
return name === ".git" || name === "node_modules";
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=glob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../../src/tools/file/glob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,KAAK,GAAG,GAAG,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;gBAClB,KAAK,IAAI,UAAU,CAAC;gBACpB,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;iBAAM,CAAC;gBACN,KAAK,IAAI,IAAI,CAAC;gBACd,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACxB,KAAK,IAAI,OAAO,CAAC;QACnB,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACxB,KAAK,IAAI,MAAM,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,KAAK,IAAI,GAAG,CAAC;IACb,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,iBAAyB,EAAE,OAAe;IACpE,MAAM,iBAAiB,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACtH,MAAM,KAAK,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;IAC9C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,EAAU;IACpD,OAAO,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,cAAc,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { AgentTool } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import { type Static, Type } from "typebox";
|
|
3
|
+
import { type TruncationResult } from "../bash/truncate.js";
|
|
4
|
+
declare const grepSchema: Type.TObject<{
|
|
5
|
+
pattern: Type.TString;
|
|
6
|
+
path: Type.TOptional<Type.TString>;
|
|
7
|
+
glob: Type.TOptional<Type.TString>;
|
|
8
|
+
ignoreCase: Type.TOptional<Type.TBoolean>;
|
|
9
|
+
literal: Type.TOptional<Type.TBoolean>;
|
|
10
|
+
context: Type.TOptional<Type.TNumber>;
|
|
11
|
+
limit: Type.TOptional<Type.TNumber>;
|
|
12
|
+
}>;
|
|
13
|
+
export type GrepToolInput = Static<typeof grepSchema>;
|
|
14
|
+
export interface GrepToolDetails {
|
|
15
|
+
truncation?: TruncationResult;
|
|
16
|
+
matchLimitReached?: number;
|
|
17
|
+
linesTruncated?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface GrepOperations {
|
|
20
|
+
isDirectory: (absolutePath: string) => Promise<boolean> | boolean;
|
|
21
|
+
readFile: (absolutePath: string) => Promise<string> | string;
|
|
22
|
+
}
|
|
23
|
+
export interface GrepToolOptions {
|
|
24
|
+
operations?: GrepOperations;
|
|
25
|
+
rgPath?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function createGrepTool(cwd: string, options?: GrepToolOptions): AgentTool<typeof grepSchema, GrepToolDetails | undefined>;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=grep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../../src/tools/file/grep.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAK/D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAI7B,QAAA,MAAM,UAAU;;;;;;;;EAYd,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAGtD,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAClE,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;CAC9D;AAOD,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAQD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,eAAe,GACxB,SAAS,CAAC,OAAO,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC,CAyG3D"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { readFile as fsReadFile, stat as fsStat } from "node:fs/promises";
|
|
3
|
+
import { createInterface } from "node:readline";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { Type } from "typebox";
|
|
6
|
+
import { DEFAULT_MAX_BYTES, formatSize, GREP_MAX_LINE_LENGTH, truncateHead, truncateLine, } from "../bash/truncate.js";
|
|
7
|
+
import { findExecutable } from "../external-tool.js";
|
|
8
|
+
import { resolveToCwd } from "../path-utils.js";
|
|
9
|
+
const grepSchema = Type.Object({
|
|
10
|
+
pattern: Type.String({ description: "Search pattern (regex or literal string)" }),
|
|
11
|
+
path: Type.Optional(Type.String({ description: "Directory or file to search (default: current directory)" })),
|
|
12
|
+
glob: Type.Optional(Type.String({ description: "Filter files by glob pattern, e.g. '*.ts' or '**/*.spec.ts'" })),
|
|
13
|
+
ignoreCase: Type.Optional(Type.Boolean({ description: "Case-insensitive search (default: false)" })),
|
|
14
|
+
literal: Type.Optional(Type.Boolean({ description: "Treat pattern as literal string instead of regex (default: false)" })),
|
|
15
|
+
context: Type.Optional(Type.Number({ description: "Number of lines to show before and after each match (default: 0)" })),
|
|
16
|
+
limit: Type.Optional(Type.Number({ description: "Maximum number of matches to return (default: 100)" })),
|
|
17
|
+
});
|
|
18
|
+
const DEFAULT_LIMIT = 100;
|
|
19
|
+
const defaultGrepOperations = {
|
|
20
|
+
isDirectory: async (p) => (await fsStat(p)).isDirectory(),
|
|
21
|
+
readFile: (p) => fsReadFile(p, "utf-8"),
|
|
22
|
+
};
|
|
23
|
+
export function createGrepTool(cwd, options) {
|
|
24
|
+
const ops = options?.operations ?? defaultGrepOperations;
|
|
25
|
+
return {
|
|
26
|
+
name: "grep",
|
|
27
|
+
label: "grep",
|
|
28
|
+
description: `Search file contents for a pattern using ripgrep. Returns matching lines with file paths and line numbers. Respects .gitignore. Output is truncated to ${DEFAULT_LIMIT} matches or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). Long lines are truncated to ${GREP_MAX_LINE_LENGTH} chars.`,
|
|
29
|
+
parameters: grepSchema,
|
|
30
|
+
execute: async (_toolCallId, { pattern, path: searchDir, glob, ignoreCase, literal, context, limit }, signal) => {
|
|
31
|
+
if (signal?.aborted)
|
|
32
|
+
throw new Error("Operation aborted");
|
|
33
|
+
const rgPath = options?.rgPath ?? findExecutable(["rg"]);
|
|
34
|
+
if (!rgPath)
|
|
35
|
+
throw new Error("ripgrep (rg) is not available. Install ripgrep to use the grep tool.");
|
|
36
|
+
const searchPath = resolveToCwd(searchDir || ".", cwd);
|
|
37
|
+
let isDirectory;
|
|
38
|
+
try {
|
|
39
|
+
isDirectory = await ops.isDirectory(searchPath);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
throw new Error(`Path not found: ${searchPath}`);
|
|
43
|
+
}
|
|
44
|
+
const contextValue = Math.max(0, Math.floor(context ?? 0));
|
|
45
|
+
const effectiveLimit = Math.max(1, Math.floor(limit ?? DEFAULT_LIMIT));
|
|
46
|
+
const result = await runRipgrep(rgPath, buildRgArgs({ pattern, searchPath, glob, ignoreCase, literal }), effectiveLimit, signal);
|
|
47
|
+
if (result.matches.length === 0)
|
|
48
|
+
return { content: [{ type: "text", text: "No matches found" }], details: undefined };
|
|
49
|
+
const fileCache = new Map();
|
|
50
|
+
const getFileLines = async (filePath) => {
|
|
51
|
+
let lines = fileCache.get(filePath);
|
|
52
|
+
if (!lines) {
|
|
53
|
+
try {
|
|
54
|
+
const content = await ops.readFile(filePath);
|
|
55
|
+
lines = content.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n");
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
lines = [];
|
|
59
|
+
}
|
|
60
|
+
fileCache.set(filePath, lines);
|
|
61
|
+
}
|
|
62
|
+
return lines;
|
|
63
|
+
};
|
|
64
|
+
const outputLines = [];
|
|
65
|
+
let linesTruncated = false;
|
|
66
|
+
for (const match of result.matches) {
|
|
67
|
+
if (signal?.aborted)
|
|
68
|
+
throw new Error("Operation aborted");
|
|
69
|
+
if (contextValue === 0 && match.lineText !== undefined) {
|
|
70
|
+
const sanitized = match.lineText.replace(/\r\n/g, "\n").replace(/\r/g, "").replace(/\n$/, "");
|
|
71
|
+
const { text, wasTruncated } = truncateLine(sanitized);
|
|
72
|
+
if (wasTruncated)
|
|
73
|
+
linesTruncated = true;
|
|
74
|
+
outputLines.push(`${formatPath(searchPath, match.filePath, isDirectory)}:${match.lineNumber}: ${text}`);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const lines = await getFileLines(match.filePath);
|
|
78
|
+
if (!lines.length) {
|
|
79
|
+
outputLines.push(`${formatPath(searchPath, match.filePath, isDirectory)}:${match.lineNumber}: (unable to read file)`);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const start = Math.max(1, match.lineNumber - contextValue);
|
|
83
|
+
const end = Math.min(lines.length, match.lineNumber + contextValue);
|
|
84
|
+
for (let current = start; current <= end; current += 1) {
|
|
85
|
+
const { text, wasTruncated } = truncateLine(lines[current - 1] ?? "");
|
|
86
|
+
if (wasTruncated)
|
|
87
|
+
linesTruncated = true;
|
|
88
|
+
const separator = current === match.lineNumber ? ":" : "-";
|
|
89
|
+
outputLines.push(`${formatPath(searchPath, match.filePath, isDirectory)}${separator}${current}${separator} ${text}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const truncation = truncateHead(outputLines.join("\n"), { maxLines: Number.MAX_SAFE_INTEGER });
|
|
93
|
+
let output = truncation.content;
|
|
94
|
+
const details = {};
|
|
95
|
+
const notices = [];
|
|
96
|
+
if (result.matchLimitReached) {
|
|
97
|
+
notices.push(`${effectiveLimit} matches limit reached. Use limit=${effectiveLimit * 2} for more, or refine pattern`);
|
|
98
|
+
details.matchLimitReached = effectiveLimit;
|
|
99
|
+
}
|
|
100
|
+
if (truncation.truncated) {
|
|
101
|
+
notices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);
|
|
102
|
+
details.truncation = truncation;
|
|
103
|
+
}
|
|
104
|
+
if (linesTruncated) {
|
|
105
|
+
notices.push(`Some lines truncated to ${GREP_MAX_LINE_LENGTH} chars. Use read tool to see full lines`);
|
|
106
|
+
details.linesTruncated = true;
|
|
107
|
+
}
|
|
108
|
+
if (notices.length > 0)
|
|
109
|
+
output += `\n\n[${notices.join(". ")}]`;
|
|
110
|
+
return {
|
|
111
|
+
content: [{ type: "text", text: output }],
|
|
112
|
+
details: Object.keys(details).length > 0 ? details : undefined,
|
|
113
|
+
};
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function buildRgArgs(options) {
|
|
118
|
+
const args = [
|
|
119
|
+
"--json",
|
|
120
|
+
"--line-number",
|
|
121
|
+
"--color=never",
|
|
122
|
+
"--hidden",
|
|
123
|
+
"--glob",
|
|
124
|
+
"!.git/**",
|
|
125
|
+
"--glob",
|
|
126
|
+
"!node_modules/**",
|
|
127
|
+
];
|
|
128
|
+
if (options.ignoreCase)
|
|
129
|
+
args.push("--ignore-case");
|
|
130
|
+
if (options.literal)
|
|
131
|
+
args.push("--fixed-strings");
|
|
132
|
+
if (options.glob)
|
|
133
|
+
args.push("--glob", options.glob);
|
|
134
|
+
args.push("--", options.pattern, options.searchPath);
|
|
135
|
+
return args;
|
|
136
|
+
}
|
|
137
|
+
function runRipgrep(command, args, limit, signal) {
|
|
138
|
+
return new Promise((resolve, reject) => {
|
|
139
|
+
const child = spawn(command, args, { stdio: ["ignore", "pipe", "pipe"], windowsHide: true });
|
|
140
|
+
const rl = createInterface({ input: child.stdout });
|
|
141
|
+
const matches = [];
|
|
142
|
+
let stderr = "";
|
|
143
|
+
let settled = false;
|
|
144
|
+
let killedDueToLimit = false;
|
|
145
|
+
let aborted = false;
|
|
146
|
+
let matchLimitReached = false;
|
|
147
|
+
const cleanup = () => {
|
|
148
|
+
rl.close();
|
|
149
|
+
signal?.removeEventListener("abort", onAbort);
|
|
150
|
+
};
|
|
151
|
+
const settle = (fn) => {
|
|
152
|
+
if (settled)
|
|
153
|
+
return;
|
|
154
|
+
settled = true;
|
|
155
|
+
cleanup();
|
|
156
|
+
fn();
|
|
157
|
+
};
|
|
158
|
+
const stopChild = (dueToLimit = false) => {
|
|
159
|
+
if (!child.killed) {
|
|
160
|
+
killedDueToLimit = dueToLimit;
|
|
161
|
+
child.kill();
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
const onAbort = () => {
|
|
165
|
+
aborted = true;
|
|
166
|
+
stopChild();
|
|
167
|
+
};
|
|
168
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
169
|
+
child.stderr?.on("data", (chunk) => {
|
|
170
|
+
stderr += chunk.toString();
|
|
171
|
+
});
|
|
172
|
+
rl.on("line", (line) => {
|
|
173
|
+
if (!line.trim() || matches.length >= limit)
|
|
174
|
+
return;
|
|
175
|
+
const event = parseRgEvent(line);
|
|
176
|
+
if (event?.type !== "match")
|
|
177
|
+
return;
|
|
178
|
+
const filePath = event.data?.path?.text;
|
|
179
|
+
const lineNumber = event.data?.line_number;
|
|
180
|
+
const lineText = event.data?.lines?.text;
|
|
181
|
+
if (typeof filePath === "string" && typeof lineNumber === "number") {
|
|
182
|
+
const match = { filePath, lineNumber };
|
|
183
|
+
if (typeof lineText === "string")
|
|
184
|
+
match.lineText = lineText;
|
|
185
|
+
matches.push(match);
|
|
186
|
+
}
|
|
187
|
+
if (matches.length >= limit) {
|
|
188
|
+
matchLimitReached = true;
|
|
189
|
+
stopChild(true);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
child.on("error", (error) => settle(() => reject(new Error(`Failed to run ripgrep: ${error.message}`))));
|
|
193
|
+
child.on("close", (code) => {
|
|
194
|
+
if (aborted || signal?.aborted) {
|
|
195
|
+
settle(() => reject(new Error("Operation aborted")));
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (!killedDueToLimit && code !== 0 && code !== 1) {
|
|
199
|
+
settle(() => reject(new Error(stderr.trim() || `ripgrep exited with code ${code}`)));
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
settle(() => resolve({ matches, matchLimitReached }));
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
function parseRgEvent(line) {
|
|
207
|
+
try {
|
|
208
|
+
return JSON.parse(line);
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
function formatPath(root, filePath, isDirectory) {
|
|
215
|
+
if (!isDirectory)
|
|
216
|
+
return path.basename(filePath);
|
|
217
|
+
const relative = path.relative(root, filePath).replace(/\\/g, "/");
|
|
218
|
+
return relative && !relative.startsWith("..") ? relative : path.basename(filePath);
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=grep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep.js","sourceRoot":"","sources":["../../../src/tools/file/grep.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { createReadTool, type ReadOperations, type ReadToolDetails, type ReadToolInput, type ReadToolOptions, } from "./read.js";
|
|
2
|
+
export { createEditTool, type EditOperations, type EditToolDetails, type EditToolInput, type EditToolOptions, } from "./edit.js";
|
|
3
|
+
export { createFindTool, type FindOperations, type FindToolDetails, type FindToolInput, type FindToolOptions, } from "./find.js";
|
|
4
|
+
export { createGrepTool, type GrepOperations, type GrepToolDetails, type GrepToolInput, type GrepToolOptions, } from "./grep.js";
|
|
5
|
+
export { createLsTool, type LsOperations, type LsToolDetails, type LsToolInput, type LsToolOptions } from "./ls.js";
|
|
6
|
+
export { createWriteTool, type WriteOperations, type WriteToolInput, type WriteToolOptions } from "./write.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/file/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AACpH,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { createReadTool, } from "./read.js";
|
|
2
|
+
export { createEditTool, } from "./edit.js";
|
|
3
|
+
export { createFindTool, } from "./find.js";
|
|
4
|
+
export { createGrepTool, } from "./grep.js";
|
|
5
|
+
export { createLsTool } from "./ls.js";
|
|
6
|
+
export { createWriteTool } from "./write.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/file/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAKf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,cAAc,GAKf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,cAAc,GAKf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,cAAc,GAKf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAA+E,MAAM,SAAS,CAAC;AACpH,OAAO,EAAE,eAAe,EAAoE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AgentTool } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import { type Static, Type } from "typebox";
|
|
3
|
+
import { type TruncationResult } from "../bash/truncate.js";
|
|
4
|
+
declare const lsSchema: Type.TObject<{
|
|
5
|
+
path: Type.TOptional<Type.TString>;
|
|
6
|
+
limit: Type.TOptional<Type.TNumber>;
|
|
7
|
+
}>;
|
|
8
|
+
export type LsToolInput = Static<typeof lsSchema>;
|
|
9
|
+
export interface LsToolDetails {
|
|
10
|
+
truncation?: TruncationResult;
|
|
11
|
+
entryLimitReached?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface LsOperations {
|
|
14
|
+
exists: (absolutePath: string) => Promise<boolean> | boolean;
|
|
15
|
+
stat: (absolutePath: string) => Promise<{
|
|
16
|
+
isDirectory: () => boolean;
|
|
17
|
+
}> | {
|
|
18
|
+
isDirectory: () => boolean;
|
|
19
|
+
};
|
|
20
|
+
readdir: (absolutePath: string) => Promise<string[]> | string[];
|
|
21
|
+
}
|
|
22
|
+
export interface LsToolOptions {
|
|
23
|
+
operations?: LsOperations;
|
|
24
|
+
}
|
|
25
|
+
export declare function createLsTool(cwd: string, options?: LsToolOptions): AgentTool<typeof lsSchema, LsToolDetails | undefined>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=ls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../../src/tools/file/ls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAG/D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EAA+C,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGzG,QAAA,MAAM,QAAQ;;;EAGZ,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,QAAQ,CAAC,CAAC;AAIlD,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7D,IAAI,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC,GAAG;QAAE,WAAW,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC;IACzG,OAAO,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC;CACjE;AAQD,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,YAAY,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,aAAa,GACtB,SAAS,CAAC,OAAO,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC,CA+DvD"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { readdir as fsReaddir, stat as fsStat } from "node:fs/promises";
|
|
2
|
+
import nodePath from "node:path";
|
|
3
|
+
import { Type } from "typebox";
|
|
4
|
+
import { DEFAULT_MAX_BYTES, formatSize, truncateHead } from "../bash/truncate.js";
|
|
5
|
+
import { pathExists, resolveToCwd } from "../path-utils.js";
|
|
6
|
+
const lsSchema = Type.Object({
|
|
7
|
+
path: Type.Optional(Type.String({ description: "Directory to list (default: current directory)" })),
|
|
8
|
+
limit: Type.Optional(Type.Number({ description: "Maximum number of entries to return (default: 500)" })),
|
|
9
|
+
});
|
|
10
|
+
const DEFAULT_LIMIT = 500;
|
|
11
|
+
const defaultLsOperations = {
|
|
12
|
+
exists: pathExists,
|
|
13
|
+
stat: fsStat,
|
|
14
|
+
readdir: fsReaddir,
|
|
15
|
+
};
|
|
16
|
+
export function createLsTool(cwd, options) {
|
|
17
|
+
const ops = options?.operations ?? defaultLsOperations;
|
|
18
|
+
return {
|
|
19
|
+
name: "ls",
|
|
20
|
+
label: "ls",
|
|
21
|
+
description: `List directory contents. Returns entries sorted alphabetically, with '/' suffix for directories. Includes dotfiles. Output is truncated to ${DEFAULT_LIMIT} entries or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first).`,
|
|
22
|
+
parameters: lsSchema,
|
|
23
|
+
execute: async (_toolCallId, { path, limit }, signal) => {
|
|
24
|
+
if (signal?.aborted)
|
|
25
|
+
throw new Error("Operation aborted");
|
|
26
|
+
const dirPath = resolveToCwd(path || ".", cwd);
|
|
27
|
+
const effectiveLimit = Math.max(1, Math.floor(limit ?? DEFAULT_LIMIT));
|
|
28
|
+
if (!(await ops.exists(dirPath)))
|
|
29
|
+
throw new Error(`Path not found: ${dirPath}`);
|
|
30
|
+
const stat = await ops.stat(dirPath);
|
|
31
|
+
if (!stat.isDirectory())
|
|
32
|
+
throw new Error(`Not a directory: ${dirPath}`);
|
|
33
|
+
let entries;
|
|
34
|
+
try {
|
|
35
|
+
entries = await ops.readdir(dirPath);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
39
|
+
throw new Error(`Cannot read directory: ${message}`);
|
|
40
|
+
}
|
|
41
|
+
entries.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
|
|
42
|
+
const results = [];
|
|
43
|
+
let entryLimitReached = false;
|
|
44
|
+
for (const entry of entries) {
|
|
45
|
+
if (signal?.aborted)
|
|
46
|
+
throw new Error("Operation aborted");
|
|
47
|
+
if (results.length >= effectiveLimit) {
|
|
48
|
+
entryLimitReached = true;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const entryStat = await ops.stat(nodePath.join(dirPath, entry));
|
|
53
|
+
results.push(entry + (entryStat.isDirectory() ? "/" : ""));
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Skip entries we cannot stat.
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (results.length === 0)
|
|
60
|
+
return { content: [{ type: "text", text: "(empty directory)" }], details: undefined };
|
|
61
|
+
const truncation = truncateHead(results.join("\n"), { maxLines: Number.MAX_SAFE_INTEGER });
|
|
62
|
+
let output = truncation.content;
|
|
63
|
+
const details = {};
|
|
64
|
+
const notices = [];
|
|
65
|
+
if (entryLimitReached) {
|
|
66
|
+
notices.push(`${effectiveLimit} entries limit reached. Use limit=${effectiveLimit * 2} for more`);
|
|
67
|
+
details.entryLimitReached = effectiveLimit;
|
|
68
|
+
}
|
|
69
|
+
if (truncation.truncated) {
|
|
70
|
+
notices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);
|
|
71
|
+
details.truncation = truncation;
|
|
72
|
+
}
|
|
73
|
+
if (notices.length > 0)
|
|
74
|
+
output += `\n\n[${notices.join(". ")}]`;
|
|
75
|
+
return {
|
|
76
|
+
content: [{ type: "text", text: output }],
|
|
77
|
+
details: Object.keys(details).length > 0 ? details : undefined,
|
|
78
|
+
};
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=ls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ls.js","sourceRoot":"","sources":["../../../src/tools/file/ls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AgentTool } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import { type Static, Type } from "typebox";
|
|
3
|
+
import { type TruncationResult } from "../bash/truncate.js";
|
|
4
|
+
declare const readSchema: Type.TObject<{
|
|
5
|
+
path: Type.TString;
|
|
6
|
+
offset: Type.TOptional<Type.TNumber>;
|
|
7
|
+
limit: Type.TOptional<Type.TNumber>;
|
|
8
|
+
}>;
|
|
9
|
+
export type ReadToolInput = Static<typeof readSchema>;
|
|
10
|
+
export interface ReadToolDetails {
|
|
11
|
+
truncation?: TruncationResult;
|
|
12
|
+
}
|
|
13
|
+
export interface ReadOperations {
|
|
14
|
+
readFile: (absolutePath: string) => Promise<Buffer>;
|
|
15
|
+
access: (absolutePath: string) => Promise<void>;
|
|
16
|
+
detectImageMimeType?: (absolutePath: string) => Promise<string | null | undefined>;
|
|
17
|
+
}
|
|
18
|
+
export interface ReadToolOptions {
|
|
19
|
+
operations?: ReadOperations;
|
|
20
|
+
}
|
|
21
|
+
export declare function createReadTool(cwd: string, options?: ReadToolOptions): AgentTool<typeof readSchema, ReadToolDetails | undefined>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/tools/file/read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAI/D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAG7B,QAAA,MAAM,UAAU;;;;EAId,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,mBAAmB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACpF;AAQD,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAaD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,eAAe,GACxB,SAAS,CAAC,OAAO,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC,CAqE3D"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { access as fsAccess, readFile as fsReadFile } from "node:fs/promises";
|
|
3
|
+
import { Type } from "typebox";
|
|
4
|
+
import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, truncateHead, } from "../bash/truncate.js";
|
|
5
|
+
import { resolveReadPathAsync } from "../path-utils.js";
|
|
6
|
+
const readSchema = Type.Object({
|
|
7
|
+
path: Type.String({ description: "Path to the file to read (relative or absolute)" }),
|
|
8
|
+
offset: Type.Optional(Type.Number({ description: "Line number to start reading from (1-indexed)" })),
|
|
9
|
+
limit: Type.Optional(Type.Number({ description: "Maximum number of lines to read" })),
|
|
10
|
+
});
|
|
11
|
+
const defaultReadOperations = {
|
|
12
|
+
readFile: (path) => fsReadFile(path),
|
|
13
|
+
access: (path) => fsAccess(path, constants.R_OK),
|
|
14
|
+
detectImageMimeType: detectSupportedImageMimeType,
|
|
15
|
+
};
|
|
16
|
+
async function detectSupportedImageMimeType(path) {
|
|
17
|
+
const buffer = await fsReadFile(path);
|
|
18
|
+
if (buffer.subarray(0, 3).equals(Buffer.from([0xff, 0xd8, 0xff])))
|
|
19
|
+
return "image/jpeg";
|
|
20
|
+
if (buffer.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])))
|
|
21
|
+
return "image/png";
|
|
22
|
+
if (buffer.subarray(0, 6).toString("ascii") === "GIF87a" || buffer.subarray(0, 6).toString("ascii") === "GIF89a")
|
|
23
|
+
return "image/gif";
|
|
24
|
+
if (buffer.subarray(0, 4).toString("ascii") === "RIFF" && buffer.subarray(8, 12).toString("ascii") === "WEBP")
|
|
25
|
+
return "image/webp";
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
export function createReadTool(cwd, options) {
|
|
29
|
+
const ops = options?.operations ?? defaultReadOperations;
|
|
30
|
+
return {
|
|
31
|
+
name: "read",
|
|
32
|
+
label: "read",
|
|
33
|
+
description: `Read the contents of a file. Supports text files and images (jpg, png, gif, webp). For text files, output is truncated to ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). Use offset/limit for large files.`,
|
|
34
|
+
parameters: readSchema,
|
|
35
|
+
execute: async (_toolCallId, { path, offset, limit }, signal) => {
|
|
36
|
+
if (signal?.aborted)
|
|
37
|
+
throw new Error("Operation aborted");
|
|
38
|
+
const absolutePath = await resolveReadPathAsync(path, cwd);
|
|
39
|
+
await ops.access(absolutePath);
|
|
40
|
+
if (signal?.aborted)
|
|
41
|
+
throw new Error("Operation aborted");
|
|
42
|
+
const mimeType = ops.detectImageMimeType ? await ops.detectImageMimeType(absolutePath) : undefined;
|
|
43
|
+
if (signal?.aborted)
|
|
44
|
+
throw new Error("Operation aborted");
|
|
45
|
+
if (mimeType) {
|
|
46
|
+
const buffer = await ops.readFile(absolutePath);
|
|
47
|
+
const content = [
|
|
48
|
+
{ type: "text", text: `Read image file [${mimeType}]` },
|
|
49
|
+
{ type: "image", data: buffer.toString("base64"), mimeType },
|
|
50
|
+
];
|
|
51
|
+
return { content, details: undefined };
|
|
52
|
+
}
|
|
53
|
+
const buffer = await ops.readFile(absolutePath);
|
|
54
|
+
const textContent = buffer.toString("utf-8");
|
|
55
|
+
const allLines = textContent.split("\n");
|
|
56
|
+
const startLine = offset === undefined ? 0 : Math.max(0, Math.floor(offset) - 1);
|
|
57
|
+
const startLineDisplay = startLine + 1;
|
|
58
|
+
if (startLine >= allLines.length) {
|
|
59
|
+
throw new Error(`Offset ${offset} is beyond end of file (${allLines.length} lines total)`);
|
|
60
|
+
}
|
|
61
|
+
let selectedContent;
|
|
62
|
+
let userLimitedLines;
|
|
63
|
+
if (limit !== undefined) {
|
|
64
|
+
const safeLimit = Math.max(0, Math.floor(limit));
|
|
65
|
+
const endLine = Math.min(startLine + safeLimit, allLines.length);
|
|
66
|
+
selectedContent = allLines.slice(startLine, endLine).join("\n");
|
|
67
|
+
userLimitedLines = endLine - startLine;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
selectedContent = allLines.slice(startLine).join("\n");
|
|
71
|
+
}
|
|
72
|
+
const truncation = truncateHead(selectedContent);
|
|
73
|
+
let outputText;
|
|
74
|
+
let details;
|
|
75
|
+
if (truncation.firstLineExceedsLimit) {
|
|
76
|
+
const firstLineSize = formatSize(Buffer.byteLength(allLines[startLine] ?? "", "utf-8"));
|
|
77
|
+
outputText = `[Line ${startLineDisplay} is ${firstLineSize}, exceeds ${formatSize(DEFAULT_MAX_BYTES)} limit. Use bash: sed -n '${startLineDisplay}p' ${path} | head -c ${DEFAULT_MAX_BYTES}]`;
|
|
78
|
+
details = { truncation };
|
|
79
|
+
}
|
|
80
|
+
else if (truncation.truncated) {
|
|
81
|
+
const endLineDisplay = startLineDisplay + truncation.outputLines - 1;
|
|
82
|
+
const nextOffset = endLineDisplay + 1;
|
|
83
|
+
outputText = `${truncation.content}\n\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${allLines.length}${truncation.truncatedBy === "bytes" ? ` (${formatSize(DEFAULT_MAX_BYTES)} limit)` : ""}. Use offset=${nextOffset} to continue.]`;
|
|
84
|
+
details = { truncation };
|
|
85
|
+
}
|
|
86
|
+
else if (userLimitedLines !== undefined && startLine + userLimitedLines < allLines.length) {
|
|
87
|
+
const remaining = allLines.length - (startLine + userLimitedLines);
|
|
88
|
+
const nextOffset = startLine + userLimitedLines + 1;
|
|
89
|
+
outputText = `${truncation.content}\n\n[${remaining} more lines in file. Use offset=${nextOffset} to continue.]`;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
outputText = truncation.content;
|
|
93
|
+
}
|
|
94
|
+
return { content: [{ type: "text", text: outputText }], details };
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/tools/file/read.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AgentTool } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import { type Static, Type } from "typebox";
|
|
3
|
+
declare const writeSchema: Type.TObject<{
|
|
4
|
+
path: Type.TString;
|
|
5
|
+
content: Type.TString;
|
|
6
|
+
}>;
|
|
7
|
+
export type WriteToolInput = Static<typeof writeSchema>;
|
|
8
|
+
export interface WriteOperations {
|
|
9
|
+
writeFile: (absolutePath: string, content: string) => Promise<void>;
|
|
10
|
+
mkdir: (dir: string) => Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export interface WriteToolOptions {
|
|
13
|
+
operations?: WriteOperations;
|
|
14
|
+
}
|
|
15
|
+
export declare function createWriteTool(cwd: string, options?: WriteToolOptions): AgentTool<typeof writeSchema, undefined>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=write.d.ts.map
|