@ank1015/llm-agents 0.0.2
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/CHANGELOG.md +13 -0
- package/LICENSE +21 -0
- package/README.md +117 -0
- package/dist/agents/skills/index.d.ts +37 -0
- package/dist/agents/skills/index.d.ts.map +1 -0
- package/dist/agents/skills/index.js +386 -0
- package/dist/agents/skills/index.js.map +1 -0
- package/dist/agents/system-prompt.d.ts +7 -0
- package/dist/agents/system-prompt.d.ts.map +1 -0
- package/dist/agents/system-prompt.js +106 -0
- package/dist/agents/system-prompt.js.map +1 -0
- package/dist/agents/tools.d.ts +3 -0
- package/dist/agents/tools.d.ts.map +1 -0
- package/dist/agents/tools.js +3 -0
- package/dist/agents/tools.js.map +1 -0
- package/dist/helpers/ai-image/ai-image.d.ts +75 -0
- package/dist/helpers/ai-image/ai-image.d.ts.map +1 -0
- package/dist/helpers/ai-image/ai-image.js +438 -0
- package/dist/helpers/ai-image/ai-image.js.map +1 -0
- package/dist/helpers/ai-image/index.d.ts +3 -0
- package/dist/helpers/ai-image/index.d.ts.map +1 -0
- package/dist/helpers/ai-image/index.js +2 -0
- package/dist/helpers/ai-image/index.js.map +1 -0
- package/dist/helpers/index.d.ts +2 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +2 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/bash.d.ts +55 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +246 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit-diff.d.ts +63 -0
- package/dist/tools/edit-diff.d.ts.map +1 -0
- package/dist/tools/edit-diff.js +246 -0
- package/dist/tools/edit-diff.js.map +1 -0
- package/dist/tools/edit.d.ts +39 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +150 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/find.d.ts +39 -0
- package/dist/tools/find.d.ts.map +1 -0
- package/dist/tools/find.js +206 -0
- package/dist/tools/find.js.map +1 -0
- package/dist/tools/grep.d.ts +45 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +244 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +73 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +66 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/ls.d.ts +40 -0
- package/dist/tools/ls.d.ts.map +1 -0
- package/dist/tools/ls.js +121 -0
- package/dist/tools/ls.js.map +1 -0
- package/dist/tools/path-utils.d.ts +8 -0
- package/dist/tools/path-utils.d.ts.map +1 -0
- package/dist/tools/path-utils.js +81 -0
- package/dist/tools/path-utils.js.map +1 -0
- package/dist/tools/read.d.ts +39 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +177 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/truncate.d.ts +70 -0
- package/dist/tools/truncate.d.ts.map +1 -0
- package/dist/tools/truncate.js +205 -0
- package/dist/tools/truncate.js.map +1 -0
- package/dist/tools/utils/config.d.ts +16 -0
- package/dist/tools/utils/config.d.ts.map +1 -0
- package/dist/tools/utils/config.js +40 -0
- package/dist/tools/utils/config.js.map +1 -0
- package/dist/tools/utils/image-resize.d.ts +36 -0
- package/dist/tools/utils/image-resize.d.ts.map +1 -0
- package/dist/tools/utils/image-resize.js +183 -0
- package/dist/tools/utils/image-resize.js.map +1 -0
- package/dist/tools/utils/mime.d.ts +3 -0
- package/dist/tools/utils/mime.d.ts.map +1 -0
- package/dist/tools/utils/mime.js +41 -0
- package/dist/tools/utils/mime.js.map +1 -0
- package/dist/tools/utils/photon.d.ts +21 -0
- package/dist/tools/utils/photon.d.ts.map +1 -0
- package/dist/tools/utils/photon.js +121 -0
- package/dist/tools/utils/photon.js.map +1 -0
- package/dist/tools/utils/shell.d.ts +26 -0
- package/dist/tools/utils/shell.d.ts.map +1 -0
- package/dist/tools/utils/shell.js +177 -0
- package/dist/tools/utils/shell.js.map +1 -0
- package/dist/tools/utils/tools-manager.d.ts +3 -0
- package/dist/tools/utils/tools-manager.d.ts.map +1 -0
- package/dist/tools/utils/tools-manager.js +209 -0
- package/dist/tools/utils/tools-manager.js.map +1 -0
- package/dist/tools/write.d.ts +29 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +83 -0
- package/dist/tools/write.js.map +1 -0
- package/package.json +73 -0
- package/skills/ai-images/SKILL.md +45 -0
- package/skills/ai-images/references/create.md +106 -0
- package/skills/ai-images/references/edit.md +107 -0
- package/skills/registry.json +10 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { bashTool, createBashTool } from './bash.js';
|
|
2
|
+
import { createEditTool, editTool } from './edit.js';
|
|
3
|
+
import { createFindTool, findTool } from './find.js';
|
|
4
|
+
import { createGrepTool, grepTool } from './grep.js';
|
|
5
|
+
import { createLsTool, lsTool } from './ls.js';
|
|
6
|
+
import { createReadTool, readTool } from './read.js';
|
|
7
|
+
import { createWriteTool, writeTool } from './write.js';
|
|
8
|
+
export { bashTool, createBashTool, } from './bash.js';
|
|
9
|
+
export { createEditTool, editTool, } from './edit.js';
|
|
10
|
+
export { createFindTool, findTool, } from './find.js';
|
|
11
|
+
export { createGrepTool, grepTool, } from './grep.js';
|
|
12
|
+
export { createLsTool, lsTool, } from './ls.js';
|
|
13
|
+
export { createReadTool, readTool, } from './read.js';
|
|
14
|
+
export { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, truncateHead, truncateLine, truncateTail, } from './truncate.js';
|
|
15
|
+
export { createWriteTool, writeTool, } from './write.js';
|
|
16
|
+
// Default tools for full access mode (using process.cwd())
|
|
17
|
+
export const codingTools = [readTool, bashTool, editTool, writeTool];
|
|
18
|
+
// Read-only tools for exploration without modification (using process.cwd())
|
|
19
|
+
export const readOnlyTools = [readTool, grepTool, findTool, lsTool];
|
|
20
|
+
// All available tools (using process.cwd())
|
|
21
|
+
export const allTools = {
|
|
22
|
+
read: readTool,
|
|
23
|
+
bash: bashTool,
|
|
24
|
+
edit: editTool,
|
|
25
|
+
write: writeTool,
|
|
26
|
+
grep: grepTool,
|
|
27
|
+
find: findTool,
|
|
28
|
+
ls: lsTool,
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Create coding tools configured for a specific working directory.
|
|
32
|
+
*/
|
|
33
|
+
export function createCodingTools(cwd, options) {
|
|
34
|
+
return [
|
|
35
|
+
createReadTool(cwd, options?.read),
|
|
36
|
+
createBashTool(cwd, options?.bash),
|
|
37
|
+
createEditTool(cwd),
|
|
38
|
+
createWriteTool(cwd),
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Create read-only tools configured for a specific working directory.
|
|
43
|
+
*/
|
|
44
|
+
export function createReadOnlyTools(cwd, options) {
|
|
45
|
+
return [
|
|
46
|
+
createReadTool(cwd, options?.read),
|
|
47
|
+
createGrepTool(cwd),
|
|
48
|
+
createFindTool(cwd),
|
|
49
|
+
createLsTool(cwd),
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create all tools configured for a specific working directory.
|
|
54
|
+
*/
|
|
55
|
+
export function createAllTools(cwd, options) {
|
|
56
|
+
return {
|
|
57
|
+
read: createReadTool(cwd, options?.read),
|
|
58
|
+
bash: createBashTool(cwd, options?.bash),
|
|
59
|
+
edit: createEditTool(cwd),
|
|
60
|
+
write: createWriteTool(cwd),
|
|
61
|
+
grep: createGrepTool(cwd),
|
|
62
|
+
find: createFindTool(cwd),
|
|
63
|
+
ls: createLsTool(cwd),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type Static } from '@sinclair/typebox';
|
|
2
|
+
import { type TruncationResult } from './truncate.js';
|
|
3
|
+
import type { AgentTool } from '@ank1015/llm-sdk';
|
|
4
|
+
declare const lsSchema: import("@sinclair/typebox").TObject<{
|
|
5
|
+
path: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
6
|
+
limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
7
|
+
}>;
|
|
8
|
+
export type LsToolInput = Static<typeof lsSchema>;
|
|
9
|
+
export interface LsToolDetails {
|
|
10
|
+
truncation?: TruncationResult;
|
|
11
|
+
entryLimitReached?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Pluggable operations for the ls tool.
|
|
15
|
+
* Override these to delegate directory listing to remote systems (e.g., SSH).
|
|
16
|
+
*/
|
|
17
|
+
export interface LsOperations {
|
|
18
|
+
/** Check if path exists */
|
|
19
|
+
exists: (absolutePath: string) => Promise<boolean> | boolean;
|
|
20
|
+
/** Get file/directory stats. Throws if not found. */
|
|
21
|
+
stat: (absolutePath: string) => Promise<{
|
|
22
|
+
isDirectory: () => boolean;
|
|
23
|
+
}> | {
|
|
24
|
+
isDirectory: () => boolean;
|
|
25
|
+
};
|
|
26
|
+
/** Read directory entries */
|
|
27
|
+
readdir: (absolutePath: string) => Promise<string[]> | string[];
|
|
28
|
+
}
|
|
29
|
+
export interface LsToolOptions {
|
|
30
|
+
/** Custom operations for directory listing. Default: local filesystem */
|
|
31
|
+
operations?: LsOperations;
|
|
32
|
+
}
|
|
33
|
+
export declare function createLsTool(cwd: string, options?: LsToolOptions): AgentTool<typeof lsSchema>;
|
|
34
|
+
/** Default ls tool using process.cwd() - for backwards compatibility */
|
|
35
|
+
export declare const lsTool: AgentTool<import("@sinclair/typebox").TObject<{
|
|
36
|
+
path: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
37
|
+
limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
38
|
+
}>, unknown>;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=ls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../src/tools/ls.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAGtD,OAAO,EAAiC,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAEnG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,QAAA,MAAM,QAAQ;;;EAOZ,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;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7D,qDAAqD;IACrD,IAAI,EAAE,CACJ,YAAY,EAAE,MAAM,KACjB,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC,GAAG;QAAE,WAAW,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC;IAC9E,6BAA6B;IAC7B,OAAO,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC;CACjE;AAQD,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,UAAU,CAAC,EAAE,YAAY,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC,OAAO,QAAQ,CAAC,CA8H7F;AAED,wEAAwE;AACxE,eAAO,MAAM,MAAM;;;YAA8B,CAAC"}
|
package/dist/tools/ls.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { existsSync, readdirSync, statSync } from 'fs';
|
|
2
|
+
import nodePath from 'path';
|
|
3
|
+
import { Type } from '@sinclair/typebox';
|
|
4
|
+
import { resolveToCwd } from './path-utils.js';
|
|
5
|
+
import { DEFAULT_MAX_BYTES, formatSize, truncateHead } from './truncate.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: existsSync,
|
|
13
|
+
stat: statSync,
|
|
14
|
+
readdir: readdirSync,
|
|
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
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
if (signal?.aborted) {
|
|
26
|
+
reject(new Error('Operation aborted'));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const onAbort = () => reject(new Error('Operation aborted'));
|
|
30
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
31
|
+
(async () => {
|
|
32
|
+
try {
|
|
33
|
+
const dirPath = resolveToCwd(path || '.', cwd);
|
|
34
|
+
const effectiveLimit = limit ?? DEFAULT_LIMIT;
|
|
35
|
+
// Check if path exists
|
|
36
|
+
if (!(await ops.exists(dirPath))) {
|
|
37
|
+
reject(new Error(`Path not found: ${dirPath}`));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Check if path is a directory
|
|
41
|
+
const stat = await ops.stat(dirPath);
|
|
42
|
+
if (!stat.isDirectory()) {
|
|
43
|
+
reject(new Error(`Not a directory: ${dirPath}`));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Read directory entries
|
|
47
|
+
let entries;
|
|
48
|
+
try {
|
|
49
|
+
entries = await ops.readdir(dirPath);
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
reject(new Error(`Cannot read directory: ${e.message}`));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Sort alphabetically (case-insensitive)
|
|
56
|
+
entries.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
|
|
57
|
+
// Format entries with directory indicators
|
|
58
|
+
const results = [];
|
|
59
|
+
let entryLimitReached = false;
|
|
60
|
+
for (const entry of entries) {
|
|
61
|
+
if (results.length >= effectiveLimit) {
|
|
62
|
+
entryLimitReached = true;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
const fullPath = nodePath.join(dirPath, entry);
|
|
66
|
+
let suffix = '';
|
|
67
|
+
try {
|
|
68
|
+
const entryStat = await ops.stat(fullPath);
|
|
69
|
+
if (entryStat.isDirectory()) {
|
|
70
|
+
suffix = '/';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Skip entries we can't stat
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
results.push(entry + suffix);
|
|
78
|
+
}
|
|
79
|
+
signal?.removeEventListener('abort', onAbort);
|
|
80
|
+
if (results.length === 0) {
|
|
81
|
+
resolve({
|
|
82
|
+
content: [{ type: 'text', content: '(empty directory)' }],
|
|
83
|
+
details: undefined,
|
|
84
|
+
});
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// Apply byte truncation (no line limit since we already have entry limit)
|
|
88
|
+
const rawOutput = results.join('\n');
|
|
89
|
+
const truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });
|
|
90
|
+
let output = truncation.content;
|
|
91
|
+
const details = {};
|
|
92
|
+
// Build notices
|
|
93
|
+
const notices = [];
|
|
94
|
+
if (entryLimitReached) {
|
|
95
|
+
notices.push(`${effectiveLimit} entries limit reached. Use limit=${effectiveLimit * 2} for more`);
|
|
96
|
+
details.entryLimitReached = effectiveLimit;
|
|
97
|
+
}
|
|
98
|
+
if (truncation.truncated) {
|
|
99
|
+
notices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);
|
|
100
|
+
details.truncation = truncation;
|
|
101
|
+
}
|
|
102
|
+
if (notices.length > 0) {
|
|
103
|
+
output += `\n\n[${notices.join('. ')}]`;
|
|
104
|
+
}
|
|
105
|
+
resolve({
|
|
106
|
+
content: [{ type: 'text', content: output }],
|
|
107
|
+
details: Object.keys(details).length > 0 ? details : undefined,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
signal?.removeEventListener('abort', onAbort);
|
|
112
|
+
reject(e);
|
|
113
|
+
}
|
|
114
|
+
})();
|
|
115
|
+
});
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/** Default ls tool using process.cwd() - for backwards compatibility */
|
|
120
|
+
export const lsTool = createLsTool(process.cwd());
|
|
121
|
+
//# sourceMappingURL=ls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ls.js","sourceRoot":"","sources":["../../src/tools/ls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function expandPath(filePath: string): string;
|
|
2
|
+
/**
|
|
3
|
+
* Resolve a path relative to the given cwd.
|
|
4
|
+
* Handles ~ expansion and absolute paths.
|
|
5
|
+
*/
|
|
6
|
+
export declare function resolveToCwd(filePath: string, cwd: string): string;
|
|
7
|
+
export declare function resolveReadPath(filePath: string, cwd: string): string;
|
|
8
|
+
//# sourceMappingURL=path-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../../src/tools/path-utils.ts"],"names":[],"mappings":"AAsCA,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CASnD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAMlE;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAgCrE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { accessSync, constants } from 'node:fs';
|
|
2
|
+
import * as os from 'node:os';
|
|
3
|
+
import { isAbsolute, resolve as resolvePath } from 'node:path';
|
|
4
|
+
const UNICODE_SPACES = /[\u00A0\u2000-\u200A\u202F\u205F\u3000]/g;
|
|
5
|
+
const NARROW_NO_BREAK_SPACE = '\u202F';
|
|
6
|
+
function normalizeUnicodeSpaces(str) {
|
|
7
|
+
return str.replace(UNICODE_SPACES, ' ');
|
|
8
|
+
}
|
|
9
|
+
function tryMacOSScreenshotPath(filePath) {
|
|
10
|
+
return filePath.replace(/ (AM|PM)\./g, `${NARROW_NO_BREAK_SPACE}$1.`);
|
|
11
|
+
}
|
|
12
|
+
function tryNFDVariant(filePath) {
|
|
13
|
+
// macOS stores filenames in NFD (decomposed) form, try converting user input to NFD
|
|
14
|
+
return filePath.normalize('NFD');
|
|
15
|
+
}
|
|
16
|
+
function tryCurlyQuoteVariant(filePath) {
|
|
17
|
+
// macOS uses U+2019 (right single quotation mark) in screenshot names like "Capture d'écran"
|
|
18
|
+
// Users typically type U+0027 (straight apostrophe)
|
|
19
|
+
return filePath.replace(/'/g, '\u2019');
|
|
20
|
+
}
|
|
21
|
+
function fileExists(filePath) {
|
|
22
|
+
try {
|
|
23
|
+
accessSync(filePath, constants.F_OK);
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function normalizeAtPrefix(filePath) {
|
|
31
|
+
return filePath.startsWith('@') ? filePath.slice(1) : filePath;
|
|
32
|
+
}
|
|
33
|
+
export function expandPath(filePath) {
|
|
34
|
+
const normalized = normalizeUnicodeSpaces(normalizeAtPrefix(filePath));
|
|
35
|
+
if (normalized === '~') {
|
|
36
|
+
return os.homedir();
|
|
37
|
+
}
|
|
38
|
+
if (normalized.startsWith('~/')) {
|
|
39
|
+
return os.homedir() + normalized.slice(1);
|
|
40
|
+
}
|
|
41
|
+
return normalized;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Resolve a path relative to the given cwd.
|
|
45
|
+
* Handles ~ expansion and absolute paths.
|
|
46
|
+
*/
|
|
47
|
+
export function resolveToCwd(filePath, cwd) {
|
|
48
|
+
const expanded = expandPath(filePath);
|
|
49
|
+
if (isAbsolute(expanded)) {
|
|
50
|
+
return expanded;
|
|
51
|
+
}
|
|
52
|
+
return resolvePath(cwd, expanded);
|
|
53
|
+
}
|
|
54
|
+
export function resolveReadPath(filePath, cwd) {
|
|
55
|
+
const resolved = resolveToCwd(filePath, cwd);
|
|
56
|
+
if (fileExists(resolved)) {
|
|
57
|
+
return resolved;
|
|
58
|
+
}
|
|
59
|
+
// Try macOS AM/PM variant (narrow no-break space before AM/PM)
|
|
60
|
+
const amPmVariant = tryMacOSScreenshotPath(resolved);
|
|
61
|
+
if (amPmVariant !== resolved && fileExists(amPmVariant)) {
|
|
62
|
+
return amPmVariant;
|
|
63
|
+
}
|
|
64
|
+
// Try NFD variant (macOS stores filenames in NFD form)
|
|
65
|
+
const nfdVariant = tryNFDVariant(resolved);
|
|
66
|
+
if (nfdVariant !== resolved && fileExists(nfdVariant)) {
|
|
67
|
+
return nfdVariant;
|
|
68
|
+
}
|
|
69
|
+
// Try curly quote variant (macOS uses U+2019 in screenshot names)
|
|
70
|
+
const curlyVariant = tryCurlyQuoteVariant(resolved);
|
|
71
|
+
if (curlyVariant !== resolved && fileExists(curlyVariant)) {
|
|
72
|
+
return curlyVariant;
|
|
73
|
+
}
|
|
74
|
+
// Try combined NFD + curly quote (for French macOS screenshots like "Capture d'écran")
|
|
75
|
+
const nfdCurlyVariant = tryCurlyQuoteVariant(nfdVariant);
|
|
76
|
+
if (nfdCurlyVariant !== resolved && fileExists(nfdCurlyVariant)) {
|
|
77
|
+
return nfdCurlyVariant;
|
|
78
|
+
}
|
|
79
|
+
return resolved;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=path-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../src/tools/path-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type Static } from '@sinclair/typebox';
|
|
2
|
+
import { type TruncationResult } from './truncate.js';
|
|
3
|
+
import type { AgentTool } from '@ank1015/llm-sdk';
|
|
4
|
+
declare const readSchema: import("@sinclair/typebox").TObject<{
|
|
5
|
+
path: import("@sinclair/typebox").TString;
|
|
6
|
+
offset: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
7
|
+
limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
8
|
+
}>;
|
|
9
|
+
export type ReadToolInput = Static<typeof readSchema>;
|
|
10
|
+
export interface ReadToolDetails {
|
|
11
|
+
truncation?: TruncationResult;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Pluggable operations for the read tool.
|
|
15
|
+
* Override these to delegate file reading to remote systems (e.g., SSH).
|
|
16
|
+
*/
|
|
17
|
+
export interface ReadOperations {
|
|
18
|
+
/** Read file contents as a Buffer */
|
|
19
|
+
readFile: (absolutePath: string) => Promise<Buffer>;
|
|
20
|
+
/** Check if file is readable (throw if not) */
|
|
21
|
+
access: (absolutePath: string) => Promise<void>;
|
|
22
|
+
/** Detect image MIME type, return null/undefined for non-images */
|
|
23
|
+
detectImageMimeType?: (absolutePath: string) => Promise<string | null | undefined>;
|
|
24
|
+
}
|
|
25
|
+
export interface ReadToolOptions {
|
|
26
|
+
/** Whether to auto-resize images to 2000x2000 max. Default: true */
|
|
27
|
+
autoResizeImages?: boolean;
|
|
28
|
+
/** Custom operations for file reading. Default: local filesystem */
|
|
29
|
+
operations?: ReadOperations;
|
|
30
|
+
}
|
|
31
|
+
export declare function createReadTool(cwd: string, options?: ReadToolOptions): AgentTool<typeof readSchema>;
|
|
32
|
+
/** Default read tool using process.cwd() - for backwards compatibility */
|
|
33
|
+
export declare const readTool: AgentTool<import("@sinclair/typebox").TObject<{
|
|
34
|
+
path: import("@sinclair/typebox").TString;
|
|
35
|
+
offset: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
36
|
+
limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
37
|
+
}>, unknown>;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAGtD,OAAO,EAIL,KAAK,gBAAgB,EAEtB,MAAM,eAAe,CAAC;AAOvB,OAAO,KAAK,EAAE,SAAS,EAA0C,MAAM,kBAAkB,CAAC;AAE1F,QAAA,MAAM,UAAU;;;;EAMd,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;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,+CAA+C;IAC/C,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACpF;AAQD,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oEAAoE;IACpE,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,eAAe,GACxB,SAAS,CAAC,OAAO,UAAU,CAAC,CA2L9B;AAED,0EAA0E;AAC1E,eAAO,MAAM,QAAQ;;;;YAAgC,CAAC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { constants } from 'fs';
|
|
2
|
+
import { access as fsAccess, readFile as fsReadFile } from 'fs/promises';
|
|
3
|
+
import { basename } from 'path';
|
|
4
|
+
import { Type } from '@sinclair/typebox';
|
|
5
|
+
import { resolveReadPath } from './path-utils.js';
|
|
6
|
+
import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, truncateHead, } from './truncate.js';
|
|
7
|
+
import { formatDimensionNote, resizeImage } from './utils/image-resize.js';
|
|
8
|
+
import { detectSupportedBinaryMimeTypeFromBuffer, detectSupportedImageMimeTypeFromFile, } from './utils/mime.js';
|
|
9
|
+
const readSchema = Type.Object({
|
|
10
|
+
path: Type.String({ description: 'Path to the file to read (relative or absolute)' }),
|
|
11
|
+
offset: Type.Optional(Type.Number({ description: 'Line number to start reading from (1-indexed)' })),
|
|
12
|
+
limit: Type.Optional(Type.Number({ description: 'Maximum number of lines to read' })),
|
|
13
|
+
});
|
|
14
|
+
const defaultReadOperations = {
|
|
15
|
+
readFile: (path) => fsReadFile(path),
|
|
16
|
+
access: (path) => fsAccess(path, constants.R_OK),
|
|
17
|
+
detectImageMimeType: detectSupportedImageMimeTypeFromFile,
|
|
18
|
+
};
|
|
19
|
+
export function createReadTool(cwd, options) {
|
|
20
|
+
const autoResizeImages = options?.autoResizeImages ?? true;
|
|
21
|
+
const ops = options?.operations ?? defaultReadOperations;
|
|
22
|
+
return {
|
|
23
|
+
name: 'read',
|
|
24
|
+
label: 'read',
|
|
25
|
+
description: `Read the contents of a file. Supports text files, images, and PDFs. Images (jpg, png, gif, webp) and PDFs are sent as attachments. 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. When you need the full file, continue with offset until complete.`,
|
|
26
|
+
parameters: readSchema,
|
|
27
|
+
execute: async (_toolCallId, { path, offset, limit }, signal) => {
|
|
28
|
+
const absolutePath = resolveReadPath(path, cwd);
|
|
29
|
+
const filename = basename(absolutePath);
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
// Check if already aborted
|
|
32
|
+
if (signal?.aborted) {
|
|
33
|
+
reject(new Error('Operation aborted'));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
let aborted = false;
|
|
37
|
+
// Set up abort handler
|
|
38
|
+
const onAbort = () => {
|
|
39
|
+
aborted = true;
|
|
40
|
+
reject(new Error('Operation aborted'));
|
|
41
|
+
};
|
|
42
|
+
if (signal) {
|
|
43
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
44
|
+
}
|
|
45
|
+
// Perform the read operation
|
|
46
|
+
(async () => {
|
|
47
|
+
try {
|
|
48
|
+
// Check if file exists
|
|
49
|
+
await ops.access(absolutePath);
|
|
50
|
+
// Check if aborted before reading
|
|
51
|
+
if (aborted) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const buffer = await ops.readFile(absolutePath);
|
|
55
|
+
const imageMimeType = ops.detectImageMimeType
|
|
56
|
+
? await ops.detectImageMimeType(absolutePath)
|
|
57
|
+
: undefined;
|
|
58
|
+
const mimeType = imageMimeType ?? (await detectSupportedBinaryMimeTypeFromBuffer(buffer));
|
|
59
|
+
// Read the file based on type
|
|
60
|
+
let content;
|
|
61
|
+
let details;
|
|
62
|
+
if (mimeType?.startsWith('image/')) {
|
|
63
|
+
// Read as image (binary)
|
|
64
|
+
const base64 = buffer.toString('base64');
|
|
65
|
+
if (autoResizeImages) {
|
|
66
|
+
// Resize image if needed
|
|
67
|
+
const resized = await resizeImage({ type: 'image', data: base64, mimeType });
|
|
68
|
+
const dimensionNote = formatDimensionNote(resized);
|
|
69
|
+
let textNote = `Read image file [${resized.mimeType}]`;
|
|
70
|
+
if (dimensionNote) {
|
|
71
|
+
textNote += `\n${dimensionNote}`;
|
|
72
|
+
}
|
|
73
|
+
content = [
|
|
74
|
+
{ type: 'text', content: textNote },
|
|
75
|
+
{ type: 'image', data: resized.data, mimeType: resized.mimeType },
|
|
76
|
+
];
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const textNote = `Read image file [${mimeType}]`;
|
|
80
|
+
content = [
|
|
81
|
+
{ type: 'text', content: textNote },
|
|
82
|
+
{ type: 'image', data: base64, mimeType },
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else if (mimeType === 'application/pdf') {
|
|
87
|
+
content = [
|
|
88
|
+
{ type: 'text', content: `Read PDF file [${mimeType}]` },
|
|
89
|
+
{ type: 'file', data: buffer.toString('base64'), mimeType, filename },
|
|
90
|
+
];
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// Read as text
|
|
94
|
+
const textContent = buffer.toString('utf-8');
|
|
95
|
+
const allLines = textContent.split('\n');
|
|
96
|
+
const totalFileLines = allLines.length;
|
|
97
|
+
// Apply offset if specified (1-indexed to 0-indexed)
|
|
98
|
+
const startLine = offset ? Math.max(0, offset - 1) : 0;
|
|
99
|
+
const startLineDisplay = startLine + 1; // For display (1-indexed)
|
|
100
|
+
// Check if offset is out of bounds
|
|
101
|
+
if (startLine >= allLines.length) {
|
|
102
|
+
throw new Error(`Offset ${offset} is beyond end of file (${allLines.length} lines total)`);
|
|
103
|
+
}
|
|
104
|
+
// If limit is specified by user, use it; otherwise we'll let truncateHead decide
|
|
105
|
+
let selectedContent;
|
|
106
|
+
let userLimitedLines;
|
|
107
|
+
if (limit !== undefined) {
|
|
108
|
+
const endLine = Math.min(startLine + limit, allLines.length);
|
|
109
|
+
selectedContent = allLines.slice(startLine, endLine).join('\n');
|
|
110
|
+
userLimitedLines = endLine - startLine;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
selectedContent = allLines.slice(startLine).join('\n');
|
|
114
|
+
}
|
|
115
|
+
// Apply truncation (respects both line and byte limits)
|
|
116
|
+
const truncation = truncateHead(selectedContent);
|
|
117
|
+
let outputText;
|
|
118
|
+
if (truncation.firstLineExceedsLimit) {
|
|
119
|
+
// First line at offset exceeds 30KB - tell model to use bash
|
|
120
|
+
const firstLineSize = formatSize(Buffer.byteLength(allLines[startLine] ?? '', 'utf-8'));
|
|
121
|
+
outputText = `[Line ${startLineDisplay} is ${firstLineSize}, exceeds ${formatSize(DEFAULT_MAX_BYTES)} limit. Use bash: sed -n '${startLineDisplay}p' ${path} | head -c ${DEFAULT_MAX_BYTES}]`;
|
|
122
|
+
details = { truncation };
|
|
123
|
+
}
|
|
124
|
+
else if (truncation.truncated) {
|
|
125
|
+
// Truncation occurred - build actionable notice
|
|
126
|
+
const endLineDisplay = startLineDisplay + truncation.outputLines - 1;
|
|
127
|
+
const nextOffset = endLineDisplay + 1;
|
|
128
|
+
outputText = truncation.content;
|
|
129
|
+
if (truncation.truncatedBy === 'lines') {
|
|
130
|
+
outputText += `\n\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines}. Use offset=${nextOffset} to continue.]`;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
outputText += `\n\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Use offset=${nextOffset} to continue.]`;
|
|
134
|
+
}
|
|
135
|
+
details = { truncation };
|
|
136
|
+
}
|
|
137
|
+
else if (userLimitedLines !== undefined &&
|
|
138
|
+
startLine + userLimitedLines < allLines.length) {
|
|
139
|
+
// User specified limit, there's more content, but no truncation
|
|
140
|
+
const remaining = allLines.length - (startLine + userLimitedLines);
|
|
141
|
+
const nextOffset = startLine + userLimitedLines + 1;
|
|
142
|
+
outputText = truncation.content;
|
|
143
|
+
outputText += `\n\n[${remaining} more lines in file. Use offset=${nextOffset} to continue.]`;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
// No truncation, no user limit exceeded
|
|
147
|
+
outputText = truncation.content;
|
|
148
|
+
}
|
|
149
|
+
content = [{ type: 'text', content: outputText }];
|
|
150
|
+
}
|
|
151
|
+
// Check if aborted after reading
|
|
152
|
+
if (aborted) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// Clean up abort handler
|
|
156
|
+
if (signal) {
|
|
157
|
+
signal.removeEventListener('abort', onAbort);
|
|
158
|
+
}
|
|
159
|
+
resolve({ content, details });
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
// Clean up abort handler
|
|
163
|
+
if (signal) {
|
|
164
|
+
signal.removeEventListener('abort', onAbort);
|
|
165
|
+
}
|
|
166
|
+
if (!aborted) {
|
|
167
|
+
reject(error);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
})();
|
|
171
|
+
});
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/** Default read tool using process.cwd() - for backwards compatibility */
|
|
176
|
+
export const readTool = createReadTool(process.cwd());
|
|
177
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"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"}
|