@push.rocks/smartagent 1.8.0 → 3.0.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.
Files changed (87) hide show
  1. package/dist_ts/00_commitinfo_data.js +3 -3
  2. package/dist_ts/index.d.ts +8 -14
  3. package/dist_ts/index.js +8 -24
  4. package/dist_ts/plugins.d.ts +8 -9
  5. package/dist_ts/plugins.js +10 -12
  6. package/dist_ts/smartagent.classes.agent.d.ts +2 -0
  7. package/dist_ts/smartagent.classes.agent.js +173 -0
  8. package/dist_ts/smartagent.classes.toolregistry.d.ts +7 -70
  9. package/dist_ts/smartagent.classes.toolregistry.js +11 -155
  10. package/dist_ts/smartagent.interfaces.d.ts +47 -283
  11. package/dist_ts/smartagent.interfaces.js +6 -7
  12. package/dist_ts/smartagent.utils.truncation.d.ts +10 -0
  13. package/dist_ts/smartagent.utils.truncation.js +26 -0
  14. package/dist_ts_compaction/index.d.ts +1 -0
  15. package/dist_ts_compaction/index.js +2 -0
  16. package/dist_ts_compaction/plugins.d.ts +4 -0
  17. package/dist_ts_compaction/plugins.js +3 -0
  18. package/dist_ts_compaction/smartagent.compaction.d.ts +10 -0
  19. package/dist_ts_compaction/smartagent.compaction.js +46 -0
  20. package/dist_ts_tools/index.d.ts +8 -0
  21. package/dist_ts_tools/index.js +6 -0
  22. package/dist_ts_tools/plugins.d.ts +15 -0
  23. package/dist_ts_tools/plugins.js +19 -0
  24. package/dist_ts_tools/tool.filesystem.d.ts +6 -0
  25. package/dist_ts_tools/tool.filesystem.js +102 -0
  26. package/dist_ts_tools/tool.http.d.ts +2 -0
  27. package/dist_ts_tools/tool.http.js +65 -0
  28. package/dist_ts_tools/tool.json.d.ts +2 -0
  29. package/dist_ts_tools/tool.json.js +47 -0
  30. package/dist_ts_tools/tool.shell.d.ts +8 -0
  31. package/dist_ts_tools/tool.shell.js +40 -0
  32. package/npmextra.json +1 -1
  33. package/package.json +30 -18
  34. package/readme.hints.md +38 -84
  35. package/readme.md +254 -682
  36. package/ts/00_commitinfo_data.ts +2 -2
  37. package/ts/index.ts +10 -37
  38. package/ts/plugins.ts +22 -21
  39. package/ts/smartagent.classes.agent.ts +198 -0
  40. package/ts/smartagent.classes.toolregistry.ts +11 -179
  41. package/ts/smartagent.interfaces.ts +51 -363
  42. package/ts/smartagent.utils.truncation.ts +39 -0
  43. package/ts_compaction/index.ts +1 -0
  44. package/ts_compaction/plugins.ts +6 -0
  45. package/ts_compaction/smartagent.compaction.ts +51 -0
  46. package/ts_tools/index.ts +8 -0
  47. package/ts_tools/plugins.ts +30 -0
  48. package/ts_tools/tool.filesystem.ts +131 -0
  49. package/ts_tools/tool.http.ts +78 -0
  50. package/ts_tools/tool.json.ts +53 -0
  51. package/ts_tools/tool.shell.ts +62 -0
  52. package/dist_ts/smartagent.classes.driveragent.d.ts +0 -134
  53. package/dist_ts/smartagent.classes.driveragent.js +0 -671
  54. package/dist_ts/smartagent.classes.dualagent.d.ts +0 -93
  55. package/dist_ts/smartagent.classes.dualagent.js +0 -614
  56. package/dist_ts/smartagent.classes.guardianagent.d.ts +0 -46
  57. package/dist_ts/smartagent.classes.guardianagent.js +0 -201
  58. package/dist_ts/smartagent.tools.base.d.ts +0 -52
  59. package/dist_ts/smartagent.tools.base.js +0 -42
  60. package/dist_ts/smartagent.tools.browser.d.ts +0 -17
  61. package/dist_ts/smartagent.tools.browser.js +0 -229
  62. package/dist_ts/smartagent.tools.deno.d.ts +0 -21
  63. package/dist_ts/smartagent.tools.deno.js +0 -191
  64. package/dist_ts/smartagent.tools.expert.d.ts +0 -27
  65. package/dist_ts/smartagent.tools.expert.js +0 -126
  66. package/dist_ts/smartagent.tools.filesystem.d.ts +0 -40
  67. package/dist_ts/smartagent.tools.filesystem.js +0 -801
  68. package/dist_ts/smartagent.tools.http.d.ts +0 -16
  69. package/dist_ts/smartagent.tools.http.js +0 -264
  70. package/dist_ts/smartagent.tools.json.d.ts +0 -24
  71. package/dist_ts/smartagent.tools.json.js +0 -202
  72. package/dist_ts/smartagent.tools.search.d.ts +0 -29
  73. package/dist_ts/smartagent.tools.search.js +0 -215
  74. package/dist_ts/smartagent.tools.shell.d.ts +0 -17
  75. package/dist_ts/smartagent.tools.shell.js +0 -202
  76. package/ts/smartagent.classes.driveragent.ts +0 -775
  77. package/ts/smartagent.classes.dualagent.ts +0 -692
  78. package/ts/smartagent.classes.guardianagent.ts +0 -241
  79. package/ts/smartagent.tools.base.ts +0 -83
  80. package/ts/smartagent.tools.browser.ts +0 -253
  81. package/ts/smartagent.tools.deno.ts +0 -230
  82. package/ts/smartagent.tools.expert.ts +0 -144
  83. package/ts/smartagent.tools.filesystem.ts +0 -885
  84. package/ts/smartagent.tools.http.ts +0 -283
  85. package/ts/smartagent.tools.json.ts +0 -224
  86. package/ts/smartagent.tools.search.ts +0 -237
  87. 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,2 @@
1
+ import * as plugins from './plugins.js';
2
+ export declare function jsonTool(): plugins.ToolSet;
@@ -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": "an agentic framework built on top of @push.rocks/smartai",
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": "1.8.0",
3
+ "version": "3.0.0",
4
4
  "private": false,
5
- "description": "an agentic framework built on top of @push.rocks/smartai",
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 --web --allowimplicitany)",
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.2",
18
- "@git.zone/tsbundle": "^2.6.3",
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.1.3",
21
- "@types/node": "^25.0.2"
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.13.3",
25
- "@push.rocks/smartbrowser": "^2.0.8",
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.0",
30
- "minimatch": "^10.1.1"
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
- "ts_web/**/*",
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 a dual-agent agentic framework built on top of `@push.rocks/smartai`. It implements a Driver/Guardian architecture where the Driver proposes tool calls and the Guardian evaluates them against security policies.
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
- - **DualAgentOrchestrator**: Main entry point, coordinates Driver and Guardian agents
8
- - **DriverAgent**: Reasons about tasks, plans steps, proposes tool calls (supports both XML and native tool calling)
9
- - **GuardianAgent**: Evaluates tool calls against configured policies
10
- - **ToolRegistry**: Manages tool lifecycle, visibility, and discovery
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
- ## Standard Tools (via registerStandardTools)
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
- ## Expert/SubAgent System
41
- Experts are specialized agents wrapped as tools, enabling hierarchical agent architectures:
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
- ## Tool Search
56
- Enable tool discovery for the Driver:
57
-
58
- ```typescript
59
- orchestrator.enableToolSearch();
60
- // Driver can now use:
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`: Multi-provider AI interface
88
- - `@push.rocks/smartfs`: Filesystem operations
89
- - `@push.rocks/smartshell`: Shell command execution
90
- - `@push.rocks/smartbrowser`: Browser automation
91
- - `@push.rocks/smartdeno`: Deno code execution
92
- - `@push.rocks/smartrequest`: HTTP requests
93
- - `minimatch`: Glob pattern matching for exclusions
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`