@push.rocks/smartagent 1.8.0 → 3.0.1
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/dist_ts/00_commitinfo_data.js +3 -3
- package/dist_ts/index.d.ts +8 -14
- package/dist_ts/index.js +8 -24
- package/dist_ts/plugins.d.ts +8 -9
- package/dist_ts/plugins.js +10 -12
- package/dist_ts/smartagent.classes.agent.d.ts +2 -0
- package/dist_ts/smartagent.classes.agent.js +173 -0
- package/dist_ts/smartagent.classes.toolregistry.d.ts +7 -70
- package/dist_ts/smartagent.classes.toolregistry.js +11 -155
- package/dist_ts/smartagent.interfaces.d.ts +47 -283
- package/dist_ts/smartagent.interfaces.js +6 -7
- package/dist_ts/smartagent.utils.truncation.d.ts +10 -0
- package/dist_ts/smartagent.utils.truncation.js +26 -0
- package/dist_ts_compaction/index.d.ts +1 -0
- package/dist_ts_compaction/index.js +2 -0
- package/dist_ts_compaction/plugins.d.ts +4 -0
- package/dist_ts_compaction/plugins.js +3 -0
- package/dist_ts_compaction/smartagent.compaction.d.ts +10 -0
- package/dist_ts_compaction/smartagent.compaction.js +46 -0
- package/dist_ts_tools/index.d.ts +8 -0
- package/dist_ts_tools/index.js +6 -0
- package/dist_ts_tools/plugins.d.ts +15 -0
- package/dist_ts_tools/plugins.js +19 -0
- package/dist_ts_tools/tool.filesystem.d.ts +6 -0
- package/dist_ts_tools/tool.filesystem.js +102 -0
- package/dist_ts_tools/tool.http.d.ts +2 -0
- package/dist_ts_tools/tool.http.js +65 -0
- package/dist_ts_tools/tool.json.d.ts +2 -0
- package/dist_ts_tools/tool.json.js +47 -0
- package/dist_ts_tools/tool.shell.d.ts +8 -0
- package/dist_ts_tools/tool.shell.js +40 -0
- package/npmextra.json +1 -1
- package/package.json +30 -18
- package/readme.hints.md +38 -84
- package/readme.md +254 -682
- package/ts/00_commitinfo_data.ts +2 -2
- package/ts/index.ts +10 -37
- package/ts/plugins.ts +22 -21
- package/ts/smartagent.classes.agent.ts +198 -0
- package/ts/smartagent.classes.toolregistry.ts +11 -179
- package/ts/smartagent.interfaces.ts +51 -363
- package/ts/smartagent.utils.truncation.ts +39 -0
- package/ts_compaction/index.ts +1 -0
- package/ts_compaction/plugins.ts +6 -0
- package/ts_compaction/smartagent.compaction.ts +51 -0
- package/ts_tools/index.ts +8 -0
- package/ts_tools/plugins.ts +30 -0
- package/ts_tools/tool.filesystem.ts +131 -0
- package/ts_tools/tool.http.ts +78 -0
- package/ts_tools/tool.json.ts +53 -0
- package/ts_tools/tool.shell.ts +62 -0
- package/dist_ts/smartagent.classes.driveragent.d.ts +0 -134
- package/dist_ts/smartagent.classes.driveragent.js +0 -671
- package/dist_ts/smartagent.classes.dualagent.d.ts +0 -93
- package/dist_ts/smartagent.classes.dualagent.js +0 -614
- package/dist_ts/smartagent.classes.guardianagent.d.ts +0 -46
- package/dist_ts/smartagent.classes.guardianagent.js +0 -201
- package/dist_ts/smartagent.tools.base.d.ts +0 -52
- package/dist_ts/smartagent.tools.base.js +0 -42
- package/dist_ts/smartagent.tools.browser.d.ts +0 -17
- package/dist_ts/smartagent.tools.browser.js +0 -229
- package/dist_ts/smartagent.tools.deno.d.ts +0 -21
- package/dist_ts/smartagent.tools.deno.js +0 -191
- package/dist_ts/smartagent.tools.expert.d.ts +0 -27
- package/dist_ts/smartagent.tools.expert.js +0 -126
- package/dist_ts/smartagent.tools.filesystem.d.ts +0 -40
- package/dist_ts/smartagent.tools.filesystem.js +0 -801
- package/dist_ts/smartagent.tools.http.d.ts +0 -16
- package/dist_ts/smartagent.tools.http.js +0 -264
- package/dist_ts/smartagent.tools.json.d.ts +0 -24
- package/dist_ts/smartagent.tools.json.js +0 -202
- package/dist_ts/smartagent.tools.search.d.ts +0 -29
- package/dist_ts/smartagent.tools.search.js +0 -215
- package/dist_ts/smartagent.tools.shell.d.ts +0 -17
- package/dist_ts/smartagent.tools.shell.js +0 -202
- package/ts/smartagent.classes.driveragent.ts +0 -775
- package/ts/smartagent.classes.dualagent.ts +0 -692
- package/ts/smartagent.classes.guardianagent.ts +0 -241
- package/ts/smartagent.tools.base.ts +0 -83
- package/ts/smartagent.tools.browser.ts +0 -253
- package/ts/smartagent.tools.deno.ts +0 -230
- package/ts/smartagent.tools.expert.ts +0 -144
- package/ts/smartagent.tools.filesystem.ts +0 -885
- package/ts/smartagent.tools.http.ts +0 -283
- package/ts/smartagent.tools.json.ts +0 -224
- package/ts/smartagent.tools.search.ts +0 -237
- package/ts/smartagent.tools.shell.ts +0 -230
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
export function httpTool() {
|
|
3
|
+
return {
|
|
4
|
+
http_get: plugins.tool({
|
|
5
|
+
description: 'Make an HTTP GET request and return the response.',
|
|
6
|
+
inputSchema: plugins.z.object({
|
|
7
|
+
url: plugins.z.string().describe('URL to request'),
|
|
8
|
+
headers: plugins.z
|
|
9
|
+
.record(plugins.z.string())
|
|
10
|
+
.optional()
|
|
11
|
+
.describe('Request headers'),
|
|
12
|
+
}),
|
|
13
|
+
execute: async ({ url, headers, }) => {
|
|
14
|
+
let req = plugins.smartrequest.default.create().url(url);
|
|
15
|
+
if (headers) {
|
|
16
|
+
req = req.headers(headers);
|
|
17
|
+
}
|
|
18
|
+
const response = await req.get();
|
|
19
|
+
let body;
|
|
20
|
+
try {
|
|
21
|
+
const json = await response.json();
|
|
22
|
+
body = JSON.stringify(json, null, 2);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
body = await response.text();
|
|
26
|
+
}
|
|
27
|
+
return plugins.truncateOutput(`HTTP ${response.status}\n${body}`).content;
|
|
28
|
+
},
|
|
29
|
+
}),
|
|
30
|
+
http_post: plugins.tool({
|
|
31
|
+
description: 'Make an HTTP POST request with a JSON body.',
|
|
32
|
+
inputSchema: plugins.z.object({
|
|
33
|
+
url: plugins.z.string().describe('URL to request'),
|
|
34
|
+
body: plugins.z
|
|
35
|
+
.record(plugins.z.unknown())
|
|
36
|
+
.optional()
|
|
37
|
+
.describe('JSON body to send'),
|
|
38
|
+
headers: plugins.z
|
|
39
|
+
.record(plugins.z.string())
|
|
40
|
+
.optional()
|
|
41
|
+
.describe('Request headers'),
|
|
42
|
+
}),
|
|
43
|
+
execute: async ({ url, body, headers, }) => {
|
|
44
|
+
let req = plugins.smartrequest.default.create().url(url);
|
|
45
|
+
if (headers) {
|
|
46
|
+
req = req.headers(headers);
|
|
47
|
+
}
|
|
48
|
+
if (body) {
|
|
49
|
+
req = req.json(body);
|
|
50
|
+
}
|
|
51
|
+
const response = await req.post();
|
|
52
|
+
let responseBody;
|
|
53
|
+
try {
|
|
54
|
+
const json = await response.json();
|
|
55
|
+
responseBody = JSON.stringify(json, null, 2);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
responseBody = await response.text();
|
|
59
|
+
}
|
|
60
|
+
return plugins.truncateOutput(`HTTP ${response.status}\n${responseBody}`).content;
|
|
61
|
+
},
|
|
62
|
+
}),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC5odHRwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfdG9vbHMvdG9vbC5odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE1BQU0sVUFBVSxRQUFRO0lBQ3RCLE9BQU87UUFDTCxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNyQixXQUFXLEVBQUUsbURBQW1EO1lBQ2hFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDNUIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO2dCQUNsRCxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7cUJBQ2YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7cUJBQzFCLFFBQVEsRUFBRTtxQkFDVixRQUFRLENBQUMsaUJBQWlCLENBQUM7YUFDL0IsQ0FBQztZQUNGLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFDZCxHQUFHLEVBQ0gsT0FBTyxHQUlSLEVBQUUsRUFBRTtnQkFDSCxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3pELElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ1osR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzdCLENBQUM7Z0JBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2pDLElBQUksSUFBWSxDQUFDO2dCQUNqQixJQUFJLENBQUM7b0JBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ25DLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLENBQUM7Z0JBQUMsTUFBTSxDQUFDO29CQUNQLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDL0IsQ0FBQztnQkFDRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxRQUFRLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQzVFLENBQUM7U0FDRixDQUFDO1FBRUYsU0FBUyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDdEIsV0FBVyxFQUFFLDZDQUE2QztZQUMxRCxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBQzVCLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDbEQsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO3FCQUNaLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO3FCQUMzQixRQUFRLEVBQUU7cUJBQ1YsUUFBUSxDQUFDLG1CQUFtQixDQUFDO2dCQUNoQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7cUJBQ2YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7cUJBQzFCLFFBQVEsRUFBRTtxQkFDVixRQUFRLENBQUMsaUJBQWlCLENBQUM7YUFDL0IsQ0FBQztZQUNGLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFDZCxHQUFHLEVBQ0gsSUFBSSxFQUNKLE9BQU8sR0FLUixFQUFFLEVBQUU7Z0JBQ0gsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUNaLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM3QixDQUFDO2dCQUNELElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ1QsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZCLENBQUM7Z0JBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xDLElBQUksWUFBb0IsQ0FBQztnQkFDekIsSUFBSSxDQUFDO29CQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNuQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCxZQUFZLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZDLENBQUM7Z0JBQ0QsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsUUFBUSxDQUFDLE1BQU0sS0FBSyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNwRixDQUFDO1NBQ0YsQ0FBQztLQUNILENBQUM7QUFDSixDQUFDIn0=
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
export function jsonTool() {
|
|
3
|
+
return {
|
|
4
|
+
json_validate: plugins.tool({
|
|
5
|
+
description: 'Validate a JSON string and optionally check for required fields.',
|
|
6
|
+
inputSchema: plugins.z.object({
|
|
7
|
+
jsonString: plugins.z.string().describe('JSON string to validate'),
|
|
8
|
+
requiredFields: plugins.z
|
|
9
|
+
.array(plugins.z.string())
|
|
10
|
+
.optional()
|
|
11
|
+
.describe('Fields that must exist at the top level'),
|
|
12
|
+
}),
|
|
13
|
+
execute: async ({ jsonString, requiredFields, }) => {
|
|
14
|
+
try {
|
|
15
|
+
const parsed = JSON.parse(jsonString);
|
|
16
|
+
if (requiredFields?.length) {
|
|
17
|
+
const missing = requiredFields.filter((f) => !(f in parsed));
|
|
18
|
+
if (missing.length) {
|
|
19
|
+
return `Invalid: missing required fields: ${missing.join(', ')}`;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const type = Array.isArray(parsed) ? 'array' : typeof parsed;
|
|
23
|
+
return `Valid JSON (${type})`;
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
return `Invalid JSON: ${e.message}`;
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
}),
|
|
30
|
+
json_transform: plugins.tool({
|
|
31
|
+
description: 'Parse a JSON string and return it pretty-printed.',
|
|
32
|
+
inputSchema: plugins.z.object({
|
|
33
|
+
jsonString: plugins.z.string().describe('JSON string to format'),
|
|
34
|
+
}),
|
|
35
|
+
execute: async ({ jsonString }) => {
|
|
36
|
+
try {
|
|
37
|
+
const parsed = JSON.parse(jsonString);
|
|
38
|
+
return JSON.stringify(parsed, null, 2);
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
return `Error parsing JSON: ${e.message}`;
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
}),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC5qc29uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfdG9vbHMvdG9vbC5qc29uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE1BQU0sVUFBVSxRQUFRO0lBQ3RCLE9BQU87UUFDTCxhQUFhLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQztZQUMxQixXQUFXLEVBQ1Qsa0VBQWtFO1lBQ3BFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDNUIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFDO2dCQUNsRSxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7cUJBQ3RCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO3FCQUN6QixRQUFRLEVBQUU7cUJBQ1YsUUFBUSxDQUFDLHlDQUF5QyxDQUFDO2FBQ3ZELENBQUM7WUFDRixPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQ2QsVUFBVSxFQUNWLGNBQWMsR0FJZixFQUFFLEVBQUU7Z0JBQ0gsSUFBSSxDQUFDO29CQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3RDLElBQUksY0FBYyxFQUFFLE1BQU0sRUFBRSxDQUFDO3dCQUMzQixNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUM7d0JBQzdELElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDOzRCQUNuQixPQUFPLHFDQUFxQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7d0JBQ25FLENBQUM7b0JBQ0gsQ0FBQztvQkFDRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDO29CQUM3RCxPQUFPLGVBQWUsSUFBSSxHQUFHLENBQUM7Z0JBQ2hDLENBQUM7Z0JBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFDWCxPQUFPLGlCQUFrQixDQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pELENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQztRQUVGLGNBQWMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQzNCLFdBQVcsRUFBRSxtREFBbUQ7WUFDaEUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUM1QixVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUM7YUFDakUsQ0FBQztZQUNGLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQTBCLEVBQUUsRUFBRTtnQkFDeEQsSUFBSSxDQUFDO29CQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3RDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1gsT0FBTyx1QkFBd0IsQ0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN2RCxDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUM7S0FDSCxDQUFDO0FBQ0osQ0FBQyJ9
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
export interface IShellToolOptions {
|
|
3
|
+
/** Allowed commands whitelist. If empty, all commands are allowed. */
|
|
4
|
+
allowedCommands?: string[];
|
|
5
|
+
/** Working directory for shell execution */
|
|
6
|
+
cwd?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function shellTool(options?: IShellToolOptions): plugins.ToolSet;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
export function shellTool(options) {
|
|
3
|
+
const smartshell = new plugins.smartshell.Smartshell({ executor: 'bash' });
|
|
4
|
+
return {
|
|
5
|
+
run_command: plugins.tool({
|
|
6
|
+
description: 'Execute a shell command. Provide the full command string. stdout and stderr are returned.',
|
|
7
|
+
inputSchema: plugins.z.object({
|
|
8
|
+
command: plugins.z.string().describe('The shell command to execute'),
|
|
9
|
+
cwd: plugins.z
|
|
10
|
+
.string()
|
|
11
|
+
.optional()
|
|
12
|
+
.describe('Working directory for the command'),
|
|
13
|
+
timeout: plugins.z
|
|
14
|
+
.number()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('Timeout in milliseconds'),
|
|
17
|
+
}),
|
|
18
|
+
execute: async ({ command, cwd, timeout, }) => {
|
|
19
|
+
// Validate against allowed commands whitelist
|
|
20
|
+
if (options?.allowedCommands?.length) {
|
|
21
|
+
const baseCommand = command.split(/\s+/)[0];
|
|
22
|
+
if (!options.allowedCommands.includes(baseCommand)) {
|
|
23
|
+
return `Command "${baseCommand}" is not in the allowed commands list: ${options.allowedCommands.join(', ')}`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Build full command string with cd prefix if cwd specified
|
|
27
|
+
const effectiveCwd = cwd ?? options?.cwd;
|
|
28
|
+
const fullCommand = effectiveCwd
|
|
29
|
+
? `cd ${JSON.stringify(effectiveCwd)} && ${command}`
|
|
30
|
+
: command;
|
|
31
|
+
const execResult = await smartshell.exec(fullCommand);
|
|
32
|
+
const output = execResult.exitCode === 0
|
|
33
|
+
? execResult.stdout
|
|
34
|
+
: `Exit code: ${execResult.exitCode}\nstdout:\n${execResult.stdout}\nstderr:\n${execResult.stderr ?? ''}`;
|
|
35
|
+
return plugins.truncateOutput(output).content;
|
|
36
|
+
},
|
|
37
|
+
}),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC5zaGVsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3Rvb2xzL3Rvb2wuc2hlbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFTeEMsTUFBTSxVQUFVLFNBQVMsQ0FBQyxPQUEyQjtJQUNuRCxNQUFNLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFM0UsT0FBTztRQUNMLFdBQVcsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ3hCLFdBQVcsRUFDVCwyRkFBMkY7WUFDN0YsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUM1QixPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsOEJBQThCLENBQUM7Z0JBQ3BFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztxQkFDWCxNQUFNLEVBQUU7cUJBQ1IsUUFBUSxFQUFFO3FCQUNWLFFBQVEsQ0FBQyxtQ0FBbUMsQ0FBQztnQkFDaEQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3FCQUNmLE1BQU0sRUFBRTtxQkFDUixRQUFRLEVBQUU7cUJBQ1YsUUFBUSxDQUFDLHlCQUF5QixDQUFDO2FBQ3ZDLENBQUM7WUFDRixPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQ2QsT0FBTyxFQUNQLEdBQUcsRUFDSCxPQUFPLEdBS1IsRUFBRSxFQUFFO2dCQUNILDhDQUE4QztnQkFDOUMsSUFBSSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxDQUFDO29CQUNyQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM1QyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQzt3QkFDbkQsT0FBTyxZQUFZLFdBQVcsMENBQTBDLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQy9HLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCw0REFBNEQ7Z0JBQzVELE1BQU0sWUFBWSxHQUFHLEdBQUcsSUFBSSxPQUFPLEVBQUUsR0FBRyxDQUFDO2dCQUN6QyxNQUFNLFdBQVcsR0FBRyxZQUFZO29CQUM5QixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxPQUFPLE9BQU8sRUFBRTtvQkFDcEQsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFFWixNQUFNLFVBQVUsR0FBRyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBRXRELE1BQU0sTUFBTSxHQUNWLFVBQVUsQ0FBQyxRQUFRLEtBQUssQ0FBQztvQkFDdkIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNO29CQUNuQixDQUFDLENBQUMsY0FBYyxVQUFVLENBQUMsUUFBUSxjQUFjLFVBQVUsQ0FBQyxNQUFNLGNBQWMsVUFBVSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFFOUcsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNoRCxDQUFDO1NBQ0YsQ0FBQztLQUNILENBQUM7QUFDSixDQUFDIn0=
|
package/npmextra.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"githost": "code.foss.global",
|
|
6
6
|
"gitscope": "push.rocks",
|
|
7
7
|
"gitrepo": "smartagent",
|
|
8
|
-
"description": "
|
|
8
|
+
"description": "Agentic loop for ai-sdk (Vercel AI SDK). Wraps streamText with stopWhen for parallel multi-step tool execution. Built on @push.rocks/smartai.",
|
|
9
9
|
"npmPackagename": "@push.rocks/smartagent",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"projectDomain": "push.rocks"
|
package/package.json
CHANGED
|
@@ -1,33 +1,47 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartagent",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"private": false,
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "Agentic loop for ai-sdk (Vercel AI SDK). Wraps streamText with stopWhen for parallel multi-step tool execution. Built on @push.rocks/smartai.",
|
|
6
6
|
"main": "dist_ts/index.js",
|
|
7
7
|
"typings": "dist_ts/index.d.ts",
|
|
8
8
|
"type": "module",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist_ts/index.js",
|
|
12
|
+
"types": "./dist_ts/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./tools": {
|
|
15
|
+
"import": "./dist_ts_tools/index.js",
|
|
16
|
+
"types": "./dist_ts_tools/index.d.ts"
|
|
17
|
+
},
|
|
18
|
+
"./compaction": {
|
|
19
|
+
"import": "./dist_ts_compaction/index.js",
|
|
20
|
+
"types": "./dist_ts_compaction/index.d.ts"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
9
23
|
"author": "Task Venture Capital GmbH",
|
|
10
24
|
"license": "MIT",
|
|
11
25
|
"scripts": {
|
|
12
|
-
"test": "(tstest test/ --verbose)",
|
|
13
|
-
"build": "(tsbuild
|
|
26
|
+
"test": "(tstest test/ --verbose --logfile --timeout 120)",
|
|
27
|
+
"build": "(tsbuild tsfolders --allowimplicitany)",
|
|
14
28
|
"buildDocs": "(tsdoc)"
|
|
15
29
|
},
|
|
16
30
|
"devDependencies": {
|
|
17
|
-
"@git.zone/tsbuild": "^4.0
|
|
18
|
-
"@git.zone/tsbundle": "^2.
|
|
31
|
+
"@git.zone/tsbuild": "^4.3.0",
|
|
32
|
+
"@git.zone/tsbundle": "^2.9.1",
|
|
19
33
|
"@git.zone/tsrun": "^2.0.1",
|
|
20
|
-
"@git.zone/tstest": "^3.
|
|
21
|
-
"@
|
|
34
|
+
"@git.zone/tstest": "^3.3.0",
|
|
35
|
+
"@push.rocks/qenv": "^6.1.3",
|
|
36
|
+
"@types/node": "^25.3.5"
|
|
22
37
|
},
|
|
23
38
|
"dependencies": {
|
|
24
|
-
"@push.rocks/smartai": "^0.
|
|
25
|
-
"@push.rocks/
|
|
26
|
-
"@push.rocks/smartdeno": "^1.2.0",
|
|
27
|
-
"@push.rocks/smartfs": "^1.2.0",
|
|
39
|
+
"@push.rocks/smartai": "^2.0.0",
|
|
40
|
+
"@push.rocks/smartfs": "^1.4.0",
|
|
28
41
|
"@push.rocks/smartrequest": "^5.0.1",
|
|
29
|
-
"@push.rocks/smartshell": "^3.3.
|
|
30
|
-
"
|
|
42
|
+
"@push.rocks/smartshell": "^3.3.7",
|
|
43
|
+
"ai": "^6.0.0",
|
|
44
|
+
"zod": "^3.25.0"
|
|
31
45
|
},
|
|
32
46
|
"packageManager": "pnpm@10.18.1+sha512.77a884a165cbba2d8d1c19e3b4880eee6d2fcabd0d879121e282196b80042351d5eb3ca0935fa599da1dc51265cc68816ad2bddd2a2de5ea9fdf92adbec7cd34",
|
|
33
47
|
"repository": {
|
|
@@ -40,13 +54,11 @@
|
|
|
40
54
|
"homepage": "https://code.foss.global/push.rocks/smartagent#readme",
|
|
41
55
|
"files": [
|
|
42
56
|
"ts/**/*",
|
|
43
|
-
"
|
|
57
|
+
"ts_tools/**/*",
|
|
58
|
+
"ts_compaction/**/*",
|
|
44
59
|
"dist/**/*",
|
|
45
60
|
"dist_*/**/*",
|
|
46
|
-
"dist_ts/**/*",
|
|
47
|
-
"dist_ts_web/**/*",
|
|
48
61
|
"assets/**/*",
|
|
49
|
-
"cli.js",
|
|
50
62
|
"npmextra.json",
|
|
51
63
|
"readme.md"
|
|
52
64
|
],
|
package/readme.hints.md
CHANGED
|
@@ -1,97 +1,51 @@
|
|
|
1
1
|
# Project Readme Hints
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
|
-
`@push.rocks/smartagent` is
|
|
4
|
+
`@push.rocks/smartagent` v2.0.0 is an agentic loop built on Vercel AI SDK v6 via `@push.rocks/smartai`. It wraps `streamText` with `stopWhen: stepCountIs(n)` for parallel multi-step tool execution.
|
|
5
5
|
|
|
6
|
-
## Architecture
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
- **BaseToolWrapper**: Base class for creating custom tools
|
|
12
|
-
- **plugins.ts**: Imports and re-exports smartai and other dependencies
|
|
6
|
+
## Architecture (v2)
|
|
7
|
+
- **`runAgent()`**: Pure async function — the core agentic loop. No class state.
|
|
8
|
+
- **`ToolRegistry`**: Lightweight helper for collecting tools into a `ToolSet`.
|
|
9
|
+
- **`truncateOutput()`**: Utility to prevent tool output from bloating context.
|
|
10
|
+
- **`compactMessages()`**: Context overflow handler (separate subpath export).
|
|
13
11
|
|
|
14
|
-
##
|
|
15
|
-
1. **FilesystemTool** - File operations with scoping and exclusion patterns
|
|
16
|
-
2. **HttpTool** - HTTP requests
|
|
17
|
-
3. **ShellTool** - Secure shell commands (no injection possible)
|
|
18
|
-
4. **BrowserTool** - Web page interaction via Puppeteer
|
|
19
|
-
5. **DenoTool** - Sandboxed TypeScript/JavaScript execution
|
|
20
|
-
|
|
21
|
-
## Additional Tools (must register manually)
|
|
22
|
-
6. **JsonValidatorTool** - JSON validation and formatting (NOT in registerStandardTools)
|
|
23
|
-
7. **ToolSearchTool** - AI-facing interface for tool discovery and activation
|
|
24
|
-
8. **ExpertTool** - Wraps a DualAgentOrchestrator as a specialized expert tool
|
|
25
|
-
|
|
26
|
-
## Tool Visibility System
|
|
27
|
-
Tools can be registered with visibility modes:
|
|
28
|
-
- **initial**: Always visible to Driver, included in system prompt (default)
|
|
29
|
-
- **on-demand**: Only discoverable via search, must be activated before use
|
|
30
|
-
|
|
31
|
-
```typescript
|
|
32
|
-
// Register with visibility options
|
|
33
|
-
orchestrator.registerTool(myTool, {
|
|
34
|
-
visibility: 'on-demand',
|
|
35
|
-
tags: ['database', 'sql'],
|
|
36
|
-
category: 'data'
|
|
37
|
-
});
|
|
12
|
+
## Source Layout
|
|
38
13
|
```
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
```typescript
|
|
44
|
-
orchestrator.registerExpert({
|
|
45
|
-
name: 'code_reviewer',
|
|
46
|
-
description: 'Reviews code for quality and best practices',
|
|
47
|
-
systemMessage: 'You are a code review expert...',
|
|
48
|
-
guardianPolicy: 'Allow read-only file access',
|
|
49
|
-
tools: [new FilesystemTool()],
|
|
50
|
-
visibility: 'on-demand',
|
|
51
|
-
tags: ['code', 'review']
|
|
52
|
-
});
|
|
14
|
+
ts/ → core: runAgent, ToolRegistry, truncateOutput, interfaces
|
|
15
|
+
ts_tools/ → built-in tool factories (filesystem, shell, http, json)
|
|
16
|
+
ts_compaction/ → compactMessages helper for onContextOverflow
|
|
53
17
|
```
|
|
54
18
|
|
|
55
|
-
##
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
// - tools.search({"query": "database"})
|
|
62
|
-
// - tools.list({})
|
|
63
|
-
// - tools.activate({"name": "database_expert"})
|
|
64
|
-
// - tools.details({"name": "filesystem"})
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
## Key Features
|
|
68
|
-
- Token streaming support (`onToken` callback)
|
|
69
|
-
- Vision support (pass images as base64)
|
|
70
|
-
- Progress events (`onProgress` callback)
|
|
71
|
-
- Scoped filesystem with exclusion patterns
|
|
72
|
-
- Result truncation with configurable limits
|
|
73
|
-
- History windowing to manage token usage
|
|
74
|
-
- **Native tool calling mode** (`useNativeToolCalling: true`) for providers like Ollama
|
|
75
|
-
- **Tool visibility system** (initial vs on-demand)
|
|
76
|
-
- **Expert/SubAgent system** for hierarchical agents
|
|
77
|
-
- **Tool search and discovery** via ToolSearchTool
|
|
78
|
-
|
|
79
|
-
## Native Tool Calling
|
|
80
|
-
When `useNativeToolCalling` is enabled:
|
|
81
|
-
- Uses provider's built-in tool calling API instead of XML parsing
|
|
82
|
-
- Tool names become `toolName_actionName` (e.g., `json_validate`)
|
|
83
|
-
- Streaming includes `[THINKING]` and `[OUTPUT]` markers
|
|
84
|
-
- More efficient for models that support it
|
|
19
|
+
## Built-in Tools (ts_tools/)
|
|
20
|
+
Each exports a factory returning a flat `ToolSet` (Record<string, Tool>):
|
|
21
|
+
1. **filesystemTool()** → `read_file`, `write_file`, `list_directory`, `delete_file`
|
|
22
|
+
2. **shellTool()** → `run_command`
|
|
23
|
+
3. **httpTool()** → `http_get`, `http_post`
|
|
24
|
+
4. **jsonTool()** → `json_validate`, `json_transform`
|
|
85
25
|
|
|
86
26
|
## Key Dependencies
|
|
87
|
-
- `@push.rocks/smartai
|
|
88
|
-
-
|
|
89
|
-
-
|
|
90
|
-
- `@push.rocks/
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
- `
|
|
27
|
+
- `@push.rocks/smartai` ^2.0.0 — provider registry, `getModel()`, re-exports `tool`, `jsonSchema`
|
|
28
|
+
- `ai` ^6.0.0 — Vercel AI SDK v6 (`streamText`, `stepCountIs`, `ModelMessage`, `ToolSet`)
|
|
29
|
+
- `zod` ^3.25.0 — tool input schema definitions
|
|
30
|
+
- `@push.rocks/smartfs`, `smartshell`, `smartrequest` — tool implementations
|
|
31
|
+
|
|
32
|
+
## AI SDK v6 Key APIs
|
|
33
|
+
- `streamText({ model, messages, tools, stopWhen: stepCountIs(20) })` — agentic loop
|
|
34
|
+
- `tool({ description, inputSchema: z.object({...}), execute })` — define tools
|
|
35
|
+
- `ModelMessage` — message type (replaces v4's `CoreMessage`)
|
|
36
|
+
- `LanguageModelV3` — model type from `@ai-sdk/provider`
|
|
37
|
+
- Result is `StreamTextResult` with PromiseLike properties (`await result.text`, etc.)
|
|
38
|
+
|
|
39
|
+
## Package Exports
|
|
40
|
+
- `.` → core (runAgent, ToolRegistry, truncateOutput, re-exports)
|
|
41
|
+
- `./tools` → built-in tool factories
|
|
42
|
+
- `./compaction` → compactMessages
|
|
43
|
+
|
|
44
|
+
## Build
|
|
45
|
+
- `pnpm build` → `tsbuild tsfolders --allowimplicitany`
|
|
46
|
+
- Cross-folder imports via each folder's `plugins.ts` (tsbuild unpack resolves them)
|
|
94
47
|
|
|
95
48
|
## Test Structure
|
|
96
49
|
- Tests use `@git.zone/tstest/tapbundle`
|
|
97
|
-
- Tests must end with `export default tap.start()
|
|
50
|
+
- Tests must end with `export default tap.start()`
|
|
51
|
+
- `pnpm test` → `tstest test/ --verbose`
|