@push.rocks/smartagent 1.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.
Files changed (42) hide show
  1. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  2. package/dist_ts/00_commitinfo_data.js +9 -0
  3. package/dist_ts/index.d.ts +10 -0
  4. package/dist_ts/index.js +18 -0
  5. package/dist_ts/plugins.d.ts +6 -0
  6. package/dist_ts/plugins.js +8 -0
  7. package/dist_ts/smartagent.classes.driveragent.d.ts +70 -0
  8. package/dist_ts/smartagent.classes.driveragent.js +274 -0
  9. package/dist_ts/smartagent.classes.dualagent.d.ts +62 -0
  10. package/dist_ts/smartagent.classes.dualagent.js +298 -0
  11. package/dist_ts/smartagent.classes.guardianagent.d.ts +46 -0
  12. package/dist_ts/smartagent.classes.guardianagent.js +201 -0
  13. package/dist_ts/smartagent.classes.smartagent.d.ts +123 -0
  14. package/dist_ts/smartagent.classes.smartagent.js +274 -0
  15. package/dist_ts/smartagent.interfaces.d.ts +165 -0
  16. package/dist_ts/smartagent.interfaces.js +8 -0
  17. package/dist_ts/smartagent.tools.base.d.ts +46 -0
  18. package/dist_ts/smartagent.tools.base.js +45 -0
  19. package/dist_ts/smartagent.tools.browser.d.ts +16 -0
  20. package/dist_ts/smartagent.tools.browser.js +177 -0
  21. package/dist_ts/smartagent.tools.filesystem.d.ts +16 -0
  22. package/dist_ts/smartagent.tools.filesystem.js +352 -0
  23. package/dist_ts/smartagent.tools.http.d.ts +15 -0
  24. package/dist_ts/smartagent.tools.http.js +187 -0
  25. package/dist_ts/smartagent.tools.shell.d.ts +16 -0
  26. package/dist_ts/smartagent.tools.shell.js +155 -0
  27. package/npmextra.json +18 -0
  28. package/package.json +50 -0
  29. package/readme.hints.md +16 -0
  30. package/readme.md +299 -0
  31. package/ts/00_commitinfo_data.ts +8 -0
  32. package/ts/index.ts +29 -0
  33. package/ts/plugins.ts +14 -0
  34. package/ts/smartagent.classes.driveragent.ts +321 -0
  35. package/ts/smartagent.classes.dualagent.ts +350 -0
  36. package/ts/smartagent.classes.guardianagent.ts +241 -0
  37. package/ts/smartagent.interfaces.ts +210 -0
  38. package/ts/smartagent.tools.base.ts +80 -0
  39. package/ts/smartagent.tools.browser.ts +200 -0
  40. package/ts/smartagent.tools.filesystem.ts +379 -0
  41. package/ts/smartagent.tools.http.ts +205 -0
  42. package/ts/smartagent.tools.shell.ts +182 -0
@@ -0,0 +1,187 @@
1
+ import * as plugins from './plugins.js';
2
+ import * as interfaces from './smartagent.interfaces.js';
3
+ import { BaseToolWrapper } from './smartagent.tools.base.js';
4
+ /**
5
+ * HTTP tool for making web requests
6
+ * Wraps @push.rocks/smartrequest
7
+ */
8
+ export class HttpTool extends BaseToolWrapper {
9
+ name = 'http';
10
+ description = 'Make HTTP requests to web APIs and services';
11
+ actions = [
12
+ {
13
+ name: 'get',
14
+ description: 'Make a GET request',
15
+ parameters: {
16
+ type: 'object',
17
+ properties: {
18
+ url: { type: 'string', description: 'URL to request' },
19
+ headers: { type: 'object', description: 'Request headers (key-value pairs)' },
20
+ query: { type: 'object', description: 'Query parameters (key-value pairs)' },
21
+ timeout: { type: 'number', description: 'Timeout in milliseconds' },
22
+ },
23
+ required: ['url'],
24
+ },
25
+ },
26
+ {
27
+ name: 'post',
28
+ description: 'Make a POST request with JSON body',
29
+ parameters: {
30
+ type: 'object',
31
+ properties: {
32
+ url: { type: 'string', description: 'URL to request' },
33
+ body: { type: 'object', description: 'JSON body to send' },
34
+ headers: { type: 'object', description: 'Request headers (key-value pairs)' },
35
+ query: { type: 'object', description: 'Query parameters (key-value pairs)' },
36
+ timeout: { type: 'number', description: 'Timeout in milliseconds' },
37
+ },
38
+ required: ['url'],
39
+ },
40
+ },
41
+ {
42
+ name: 'put',
43
+ description: 'Make a PUT request with JSON body',
44
+ parameters: {
45
+ type: 'object',
46
+ properties: {
47
+ url: { type: 'string', description: 'URL to request' },
48
+ body: { type: 'object', description: 'JSON body to send' },
49
+ headers: { type: 'object', description: 'Request headers (key-value pairs)' },
50
+ timeout: { type: 'number', description: 'Timeout in milliseconds' },
51
+ },
52
+ required: ['url', 'body'],
53
+ },
54
+ },
55
+ {
56
+ name: 'patch',
57
+ description: 'Make a PATCH request with JSON body',
58
+ parameters: {
59
+ type: 'object',
60
+ properties: {
61
+ url: { type: 'string', description: 'URL to request' },
62
+ body: { type: 'object', description: 'JSON body to send' },
63
+ headers: { type: 'object', description: 'Request headers (key-value pairs)' },
64
+ timeout: { type: 'number', description: 'Timeout in milliseconds' },
65
+ },
66
+ required: ['url', 'body'],
67
+ },
68
+ },
69
+ {
70
+ name: 'delete',
71
+ description: 'Make a DELETE request',
72
+ parameters: {
73
+ type: 'object',
74
+ properties: {
75
+ url: { type: 'string', description: 'URL to request' },
76
+ headers: { type: 'object', description: 'Request headers (key-value pairs)' },
77
+ timeout: { type: 'number', description: 'Timeout in milliseconds' },
78
+ },
79
+ required: ['url'],
80
+ },
81
+ },
82
+ ];
83
+ async initialize() {
84
+ // SmartRequest is stateless, no initialization needed
85
+ this.isInitialized = true;
86
+ }
87
+ async cleanup() {
88
+ this.isInitialized = false;
89
+ }
90
+ async execute(action, params) {
91
+ this.validateAction(action);
92
+ this.ensureInitialized();
93
+ try {
94
+ let request = plugins.smartrequest.SmartRequest.create().url(params.url);
95
+ // Add headers
96
+ if (params.headers && typeof params.headers === 'object') {
97
+ for (const [key, value] of Object.entries(params.headers)) {
98
+ request = request.header(key, value);
99
+ }
100
+ }
101
+ // Add query parameters
102
+ if (params.query && typeof params.query === 'object') {
103
+ request = request.query(params.query);
104
+ }
105
+ // Add timeout
106
+ if (params.timeout) {
107
+ request = request.timeout(params.timeout);
108
+ }
109
+ // Add JSON body for POST, PUT, PATCH
110
+ if (params.body && ['post', 'put', 'patch'].includes(action)) {
111
+ request = request.json(params.body);
112
+ }
113
+ // Execute the request
114
+ let response;
115
+ switch (action) {
116
+ case 'get':
117
+ response = await request.get();
118
+ break;
119
+ case 'post':
120
+ response = await request.post();
121
+ break;
122
+ case 'put':
123
+ response = await request.put();
124
+ break;
125
+ case 'patch':
126
+ response = await request.patch();
127
+ break;
128
+ case 'delete':
129
+ response = await request.delete();
130
+ break;
131
+ default:
132
+ return { success: false, error: `Unknown action: ${action}` };
133
+ }
134
+ // Parse response body
135
+ let body;
136
+ const contentType = response.headers?.['content-type'] || '';
137
+ try {
138
+ if (contentType.includes('application/json')) {
139
+ body = await response.json();
140
+ }
141
+ else {
142
+ body = await response.text();
143
+ }
144
+ }
145
+ catch {
146
+ body = null;
147
+ }
148
+ return {
149
+ success: response.ok,
150
+ result: {
151
+ url: params.url,
152
+ method: action.toUpperCase(),
153
+ status: response.status,
154
+ statusText: response.statusText,
155
+ ok: response.ok,
156
+ headers: response.headers,
157
+ body,
158
+ },
159
+ };
160
+ }
161
+ catch (error) {
162
+ return {
163
+ success: false,
164
+ error: error instanceof Error ? error.message : String(error),
165
+ };
166
+ }
167
+ }
168
+ getCallSummary(action, params) {
169
+ const method = action.toUpperCase();
170
+ let summary = `${method} request to "${params.url}"`;
171
+ if (params.query && Object.keys(params.query).length > 0) {
172
+ const queryStr = JSON.stringify(params.query);
173
+ summary += ` with query: ${queryStr.length > 50 ? queryStr.substring(0, 50) + '...' : queryStr}`;
174
+ }
175
+ if (params.body) {
176
+ const bodyStr = JSON.stringify(params.body);
177
+ const preview = bodyStr.length > 100 ? bodyStr.substring(0, 100) + '...' : bodyStr;
178
+ summary += ` with body: ${preview}`;
179
+ }
180
+ if (params.headers && Object.keys(params.headers).length > 0) {
181
+ const headerKeys = Object.keys(params.headers).join(', ');
182
+ summary += ` with headers: [${headerKeys}]`;
183
+ }
184
+ return summary;
185
+ }
186
+ }
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC50b29scy5odHRwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhZ2VudC50b29scy5odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTdEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxRQUFTLFNBQVEsZUFBZTtJQUNwQyxJQUFJLEdBQUcsTUFBTSxDQUFDO0lBQ2QsV0FBVyxHQUFHLDZDQUE2QyxDQUFDO0lBRTVELE9BQU8sR0FBNkI7UUFDekM7WUFDRSxJQUFJLEVBQUUsS0FBSztZQUNYLFdBQVcsRUFBRSxvQkFBb0I7WUFDakMsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxRQUFRO2dCQUNkLFVBQVUsRUFBRTtvQkFDVixHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRTtvQkFDdEQsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsbUNBQW1DLEVBQUU7b0JBQzdFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLG9DQUFvQyxFQUFFO29CQUM1RSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSx5QkFBeUIsRUFBRTtpQkFDcEU7Z0JBQ0QsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDO2FBQ2xCO1NBQ0Y7UUFDRDtZQUNFLElBQUksRUFBRSxNQUFNO1lBQ1osV0FBVyxFQUFFLG9DQUFvQztZQUNqRCxVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsVUFBVSxFQUFFO29CQUNWLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFR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
@@ -0,0 +1,16 @@
1
+ import * as interfaces from './smartagent.interfaces.js';
2
+ import { BaseToolWrapper } from './smartagent.tools.base.js';
3
+ /**
4
+ * Shell tool for executing commands securely
5
+ * Wraps @push.rocks/smartshell with execSpawn for safety (no shell injection)
6
+ */
7
+ export declare class ShellTool extends BaseToolWrapper {
8
+ name: string;
9
+ description: string;
10
+ actions: interfaces.IToolAction[];
11
+ private smartshell;
12
+ initialize(): Promise<void>;
13
+ cleanup(): Promise<void>;
14
+ execute(action: string, params: Record<string, unknown>): Promise<interfaces.IToolExecutionResult>;
15
+ getCallSummary(action: string, params: Record<string, unknown>): string;
16
+ }
@@ -0,0 +1,155 @@
1
+ import * as plugins from './plugins.js';
2
+ import * as interfaces from './smartagent.interfaces.js';
3
+ import { BaseToolWrapper } from './smartagent.tools.base.js';
4
+ /**
5
+ * Shell tool for executing commands securely
6
+ * Wraps @push.rocks/smartshell with execSpawn for safety (no shell injection)
7
+ */
8
+ export class ShellTool extends BaseToolWrapper {
9
+ name = 'shell';
10
+ description = 'Execute shell commands securely. Uses execSpawn (shell:false) to prevent command injection.';
11
+ actions = [
12
+ {
13
+ name: 'execute',
14
+ description: 'Execute a command with arguments (secure, no shell injection possible). Command and args are passed separately.',
15
+ parameters: {
16
+ type: 'object',
17
+ properties: {
18
+ command: {
19
+ type: 'string',
20
+ description: 'The command to execute (e.g., "ls", "cat", "grep", "node")',
21
+ },
22
+ args: {
23
+ type: 'array',
24
+ items: { type: 'string' },
25
+ description: 'Array of arguments (each argument is properly escaped)',
26
+ },
27
+ cwd: { type: 'string', description: 'Working directory for the command' },
28
+ timeout: { type: 'number', description: 'Timeout in milliseconds' },
29
+ env: {
30
+ type: 'object',
31
+ description: 'Additional environment variables (key-value pairs)',
32
+ },
33
+ },
34
+ required: ['command'],
35
+ },
36
+ },
37
+ {
38
+ name: 'which',
39
+ description: 'Check if a command exists and get its path',
40
+ parameters: {
41
+ type: 'object',
42
+ properties: {
43
+ command: { type: 'string', description: 'Command name to look up (e.g., "node", "git")' },
44
+ },
45
+ required: ['command'],
46
+ },
47
+ },
48
+ ];
49
+ smartshell;
50
+ async initialize() {
51
+ this.smartshell = new plugins.smartshell.Smartshell({
52
+ executor: 'bash',
53
+ });
54
+ this.isInitialized = true;
55
+ }
56
+ async cleanup() {
57
+ this.isInitialized = false;
58
+ }
59
+ async execute(action, params) {
60
+ this.validateAction(action);
61
+ this.ensureInitialized();
62
+ try {
63
+ switch (action) {
64
+ case 'execute': {
65
+ const command = params.command;
66
+ const args = params.args || [];
67
+ // Build options
68
+ const options = {};
69
+ if (params.timeout) {
70
+ options.timeout = params.timeout;
71
+ }
72
+ if (params.env) {
73
+ options.env = {
74
+ ...process.env,
75
+ ...params.env,
76
+ };
77
+ }
78
+ // Use execSpawn for security - no shell injection possible
79
+ const result = await this.smartshell.execSpawn(command, args, options);
80
+ return {
81
+ success: result.exitCode === 0,
82
+ result: {
83
+ command,
84
+ args,
85
+ exitCode: result.exitCode,
86
+ stdout: result.stdout,
87
+ stderr: result.stderr,
88
+ signal: result.signal,
89
+ },
90
+ };
91
+ }
92
+ case 'which': {
93
+ try {
94
+ const commandPath = await plugins.smartshell.which(params.command);
95
+ return {
96
+ success: true,
97
+ result: {
98
+ command: params.command,
99
+ path: commandPath,
100
+ exists: true,
101
+ },
102
+ };
103
+ }
104
+ catch {
105
+ return {
106
+ success: true,
107
+ result: {
108
+ command: params.command,
109
+ path: null,
110
+ exists: false,
111
+ },
112
+ };
113
+ }
114
+ }
115
+ default:
116
+ return {
117
+ success: false,
118
+ error: `Unknown action: ${action}`,
119
+ };
120
+ }
121
+ }
122
+ catch (error) {
123
+ return {
124
+ success: false,
125
+ error: error instanceof Error ? error.message : String(error),
126
+ };
127
+ }
128
+ }
129
+ getCallSummary(action, params) {
130
+ switch (action) {
131
+ case 'execute': {
132
+ const command = params.command;
133
+ const args = params.args || [];
134
+ const fullCommand = [command, ...args].join(' ');
135
+ let summary = `Execute: ${fullCommand}`;
136
+ if (params.cwd) {
137
+ summary += ` (in ${params.cwd})`;
138
+ }
139
+ if (params.timeout) {
140
+ summary += ` [timeout: ${params.timeout}ms]`;
141
+ }
142
+ if (params.env && Object.keys(params.env).length > 0) {
143
+ const envKeys = Object.keys(params.env).join(', ');
144
+ summary += ` [env: ${envKeys}]`;
145
+ }
146
+ return summary;
147
+ }
148
+ case 'which':
149
+ return `Check if command "${params.command}" exists and get its path`;
150
+ default:
151
+ return `Unknown action: ${action}`;
152
+ }
153
+ }
154
+ }
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC50b29scy5zaGVsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0YWdlbnQudG9vbHMuc2hlbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxLQUFLLFVBQVUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0Q7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFNBQVUsU0FBUSxlQUFlO0lBQ3JDLElBQUksR0FBRyxPQUFPLENBQUM7SUFDZixXQUFXLEdBQ2hCLDZGQUE2RixDQUFDO0lBRXpGLE9BQU8sR0FBNkI7UUFDekM7WUFDRSxJQUFJLEVBQUUsU0FBUztZQUNmLFdBQVcsRUFDVCxpSEFBaUg7WUFDbkgsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxRQUFRO2dCQUNkLFVBQVUsRUFBRTtvQkFDVixPQUFPLEVBQUU7d0JBQ1AsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsV0FBVyxFQUFFLDREQUE0RDtxQkFDMUU7b0JBQ0QsSUFBSSxFQUFFO3dCQUNKLElBQUksRUFBRSxPQUFPO3dCQUNiLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7d0JBQ3pCLFdBQVcsRUFBRSx3REFBd0Q7cUJBQ3RFO29CQUNELEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLG1DQUFtQyxFQUFFO29CQUN6RSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSx5QkFBeUIsRUFBRTtvQkFDbkUsR0FBRyxFQUFFO3dCQUNILElBQUksRUFBRSxRQUFRO3dCQUNkLFdBQVcsRUFBRSxvREFBb0Q7cUJBQ2xFO2lCQUNGO2dCQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQzthQUN0QjtTQUNGO1FBQ0Q7WUFDRSxJQUFJLEVB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
package/npmextra.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "gitzone": {
3
+ "projectType": "npm",
4
+ "module": {
5
+ "githost": "code.foss.global",
6
+ "gitscope": "push.rocks",
7
+ "gitrepo": "smartagent",
8
+ "description": "an agentic framework built on top of @push.rocks/smartai",
9
+ "npmPackagename": "@push.rocks/smartagent",
10
+ "license": "MIT",
11
+ "projectDomain": "push.rocks"
12
+ }
13
+ },
14
+ "npmci": {
15
+ "npmGlobalTools": [],
16
+ "npmAccessLevel": "public"
17
+ }
18
+ }
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@push.rocks/smartagent",
3
+ "version": "1.0.2",
4
+ "private": false,
5
+ "description": "an agentic framework built on top of @push.rocks/smartai",
6
+ "main": "dist_ts/index.js",
7
+ "typings": "dist_ts/index.d.ts",
8
+ "type": "module",
9
+ "author": "Task Venture Capital GmbH",
10
+ "license": "MIT",
11
+ "devDependencies": {
12
+ "@git.zone/tsbuild": "^3.1.2",
13
+ "@git.zone/tsbundle": "^2.6.2",
14
+ "@git.zone/tsrun": "^2.0.0",
15
+ "@git.zone/tstest": "^3.1.3",
16
+ "@types/node": "^24.10.1"
17
+ },
18
+ "dependencies": {
19
+ "@push.rocks/smartai": "^0.8.0",
20
+ "@push.rocks/smartbrowser": "^2.0.8",
21
+ "@push.rocks/smartfs": "^1.2.0",
22
+ "@push.rocks/smartrequest": "^5.0.1",
23
+ "@push.rocks/smartshell": "^3.3.0"
24
+ },
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://code.foss.global/push.rocks/smartagent.git"
28
+ },
29
+ "bugs": {
30
+ "url": "https://code.foss.global/push.rocks/smartagent/issues"
31
+ },
32
+ "homepage": "https://code.foss.global/push.rocks/smartagent#readme",
33
+ "files": [
34
+ "ts/**/*",
35
+ "ts_web/**/*",
36
+ "dist/**/*",
37
+ "dist_*/**/*",
38
+ "dist_ts/**/*",
39
+ "dist_ts_web/**/*",
40
+ "assets/**/*",
41
+ "cli.js",
42
+ "npmextra.json",
43
+ "readme.md"
44
+ ],
45
+ "scripts": {
46
+ "test": "(tstest test/ --web)",
47
+ "build": "(tsbuild --web --allowimplicitany)",
48
+ "buildDocs": "(tsdoc)"
49
+ }
50
+ }
@@ -0,0 +1,16 @@
1
+ # Project Readme Hints
2
+
3
+ ## Overview
4
+ `@push.rocks/smartagent` is an agentic framework built on top of `@push.rocks/smartai`. It provides autonomous AI agent capabilities including tool use, multi-step reasoning, and conversation memory.
5
+
6
+ ## Architecture
7
+ - **SmartAgent**: Main class that wraps SmartAi and adds agentic behaviors
8
+ - **plugins.ts**: Imports and re-exports smartai
9
+ - **index.ts**: Main entry point, exports SmartAgent class and relevant types
10
+
11
+ ## Key Dependencies
12
+ - `@push.rocks/smartai`: Provides the underlying multi-modal AI provider interface
13
+
14
+ ## Test Structure
15
+ - Tests use `@git.zone/tstest/tapbundle`
16
+ - Tests must end with `export default tap.start();`