@push.rocks/smartagent 1.0.2 → 1.1.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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartagent',
6
- version: '1.0.2',
6
+ version: '1.1.1',
7
7
  description: 'an agentic framework built on top of @push.rocks/smartai'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDBEQUEwRDtDQUN4RSxDQUFBIn0=
@@ -6,5 +6,6 @@ export { FilesystemTool } from './smartagent.tools.filesystem.js';
6
6
  export { HttpTool } from './smartagent.tools.http.js';
7
7
  export { ShellTool } from './smartagent.tools.shell.js';
8
8
  export { BrowserTool } from './smartagent.tools.browser.js';
9
+ export { DenoTool, type TDenoPermission } from './smartagent.tools.deno.js';
9
10
  export * from './smartagent.interfaces.js';
10
11
  export { type ISmartAiOptions, type TProvider, type ChatMessage, type ChatOptions, type ChatResponse, } from '@push.rocks/smartai';
package/dist_ts/index.js CHANGED
@@ -11,8 +11,9 @@ export { FilesystemTool } from './smartagent.tools.filesystem.js';
11
11
  export { HttpTool } from './smartagent.tools.http.js';
12
12
  export { ShellTool } from './smartagent.tools.shell.js';
13
13
  export { BrowserTool } from './smartagent.tools.browser.js';
14
+ export { DenoTool } from './smartagent.tools.deno.js';
14
15
  // Export all interfaces
15
16
  export * from './smartagent.interfaces.js';
16
17
  // Re-export useful types from smartai
17
18
  export {} from '@push.rocks/smartai';
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4Qyx3REFBd0Q7QUFDeEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFMUUsMkJBQTJCO0FBQzNCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdEUsa0RBQWtEO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU3RCx3QkFBd0I7QUFDeEIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTVELHdCQUF3QjtBQUN4QixjQUFjLDRCQUE0QixDQUFDO0FBRTNDLHNDQUFzQztBQUN0QyxPQUFPLEVBTU4sTUFBTSxxQkFBcUIsQ0FBQyJ9
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4Qyx3REFBd0Q7QUFDeEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFMUUsMkJBQTJCO0FBQzNCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdEUsa0RBQWtEO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU3RCx3QkFBd0I7QUFDeEIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQXdCLE1BQU0sNEJBQTRCLENBQUM7QUFFNUUsd0JBQXdCO0FBQ3hCLGNBQWMsNEJBQTRCLENBQUM7QUFFM0Msc0NBQXNDO0FBQ3RDLE9BQU8sRUFNTixNQUFNLHFCQUFxQixDQUFDIn0=
@@ -1,6 +1,7 @@
1
1
  import * as smartai from '@push.rocks/smartai';
2
+ import * as smartdeno from '@push.rocks/smartdeno';
2
3
  import * as smartfs from '@push.rocks/smartfs';
3
4
  import * as smartrequest from '@push.rocks/smartrequest';
4
5
  import * as smartbrowser from '@push.rocks/smartbrowser';
5
6
  import * as smartshell from '@push.rocks/smartshell';
6
- export { smartai, smartfs, smartrequest, smartbrowser, smartshell, };
7
+ export { smartai, smartdeno, smartfs, smartrequest, smartbrowser, smartshell, };
@@ -1,8 +1,9 @@
1
1
  // @push.rocks scope
2
2
  import * as smartai from '@push.rocks/smartai';
3
+ import * as smartdeno from '@push.rocks/smartdeno';
3
4
  import * as smartfs from '@push.rocks/smartfs';
4
5
  import * as smartrequest from '@push.rocks/smartrequest';
5
6
  import * as smartbrowser from '@push.rocks/smartbrowser';
6
7
  import * as smartshell from '@push.rocks/smartshell';
7
- export { smartai, smartfs, smartrequest, smartbrowser, smartshell, };
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxLQUFLLE9BQU8sTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUVyRCxPQUFPLEVBQ0wsT0FBTyxFQUNQLE9BQU8sRUFDUCxZQUFZLEVBQ1osWUFBWSxFQUNaLFVBQVUsR0FDWCxDQUFDIn0=
8
+ export { smartai, smartdeno, smartfs, smartrequest, smartbrowser, smartshell, };
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssT0FBTyxNQUFNLHFCQUFxQixDQUFDO0FBQy9DLE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBRXJELE9BQU8sRUFDTCxPQUFPLEVBQ1AsU0FBUyxFQUNULE9BQU8sRUFDUCxZQUFZLEVBQ1osWUFBWSxFQUNaLFVBQVUsR0FDWCxDQUFDIn0=
@@ -7,6 +7,7 @@ import { FilesystemTool } from './smartagent.tools.filesystem.js';
7
7
  import { HttpTool } from './smartagent.tools.http.js';
8
8
  import { ShellTool } from './smartagent.tools.shell.js';
9
9
  import { BrowserTool } from './smartagent.tools.browser.js';
10
+ import { DenoTool } from './smartagent.tools.deno.js';
10
11
  /**
11
12
  * DualAgentOrchestrator - Coordinates Driver and Guardian agents
12
13
  * Manages the complete lifecycle of task execution with tool approval
@@ -79,6 +80,7 @@ export class DualAgentOrchestrator {
79
80
  new HttpTool(),
80
81
  new ShellTool(),
81
82
  new BrowserTool(),
83
+ new DenoTool(),
82
84
  ];
83
85
  for (const tool of standardTools) {
84
86
  this.registerTool(tool);
@@ -295,4 +297,4 @@ export class DualAgentOrchestrator {
295
297
  return Array.from(this.tools.keys());
296
298
  }
297
299
  }
298
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jbGFzc2VzLmR1YWxhZ2VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0YWdlbnQuY2xhc3Nlcy5kdWFsYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxLQUFLLFVBQVUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFNUQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQUN4QixPQUFPLENBQStCO0lBQ3RDLE9BQU8sQ0FBMEI7SUFDakMsY0FBYyxDQUFrQztJQUNoRCxnQkFBZ0IsQ0FBa0M7SUFDbEQsTUFBTSxDQUFjO0lBQ3BCLFFBQVEsQ0FBZ0I7SUFDeEIsS0FBSyxHQUFpQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2hELFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsbUJBQW1CLEdBQStCLEVBQUUsQ0FBQztJQUU3RCxZQUFZLE9BQXFDO1FBQy9DLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixhQUFhLEVBQUUsRUFBRTtZQUNqQix3QkFBd0IsRUFBRSxDQUFDO1lBQzNCLGVBQWUsRUFBRSxRQUFRO1lBQ3pCLEdBQUcsT0FBTztTQUNYLENBQUM7UUFFRiwwQkFBMEI7UUFDMUIs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
300
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jbGFzc2VzLmR1YWxhZ2VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0YWdlbnQuY2xhc3Nlcy5kdWFsYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxLQUFLLFVBQVUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXREOzs7R0FHRztBQUNILE1BQU0sT0FBTyxxQkFBcUI7SUFDeEIsT0FBTyxDQUErQjtJQUN0QyxPQUFPLENBQTBCO0lBQ2pDLGNBQWMsQ0FBa0M7SUFDaEQsZ0JBQWdCLENBQWtDO0lBQ2xELE1BQU0sQ0FBYztJQUNwQixRQUFRLENBQWdCO0lBQ3hCLEtBQUssR0FBaUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNoRCxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLG1CQUFtQixHQUErQixFQUFFLENBQUM7SUFFN0QsWUFBWSxPQUFxQztRQUMvQyxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsYUFBYSxFQUFFLEVBQUU7WUFDakIsd0JBQXdCLEVBQUUsQ0FBQztZQUMzQixlQUFlLEVBQUUsUUFBUTtZ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
@@ -0,0 +1,20 @@
1
+ import * as interfaces from './smartagent.interfaces.js';
2
+ import { BaseToolWrapper } from './smartagent.tools.base.js';
3
+ /**
4
+ * Deno permission types for sandboxed code execution
5
+ */
6
+ export type TDenoPermission = 'all' | 'env' | 'ffi' | 'hrtime' | 'net' | 'read' | 'run' | 'sys' | 'write';
7
+ /**
8
+ * Deno tool for executing TypeScript/JavaScript code in a sandboxed environment
9
+ * Wraps @push.rocks/smartdeno
10
+ */
11
+ export declare class DenoTool extends BaseToolWrapper {
12
+ name: string;
13
+ description: string;
14
+ actions: interfaces.IToolAction[];
15
+ private smartdeno;
16
+ initialize(): Promise<void>;
17
+ cleanup(): Promise<void>;
18
+ execute(action: string, params: Record<string, unknown>): Promise<interfaces.IToolExecutionResult>;
19
+ getCallSummary(action: string, params: Record<string, unknown>): string;
20
+ }
@@ -0,0 +1,153 @@
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
+ * Deno tool for executing TypeScript/JavaScript code in a sandboxed environment
6
+ * Wraps @push.rocks/smartdeno
7
+ */
8
+ export class DenoTool extends BaseToolWrapper {
9
+ name = 'deno';
10
+ description = 'Execute TypeScript/JavaScript code in a sandboxed Deno environment with fine-grained permission control';
11
+ actions = [
12
+ {
13
+ name: 'execute',
14
+ description: 'Execute TypeScript/JavaScript code and return stdout/stderr. Code runs in Deno sandbox with specified permissions.',
15
+ parameters: {
16
+ type: 'object',
17
+ properties: {
18
+ code: {
19
+ type: 'string',
20
+ description: 'TypeScript/JavaScript code to execute',
21
+ },
22
+ permissions: {
23
+ type: 'array',
24
+ items: {
25
+ type: 'string',
26
+ enum: ['all', 'env', 'ffi', 'hrtime', 'net', 'read', 'run', 'sys', 'write'],
27
+ },
28
+ description: 'Deno permissions to grant. Default: none (fully sandboxed). Options: all, env, net, read, write, run, sys, ffi, hrtime',
29
+ },
30
+ },
31
+ required: ['code'],
32
+ },
33
+ },
34
+ {
35
+ name: 'executeWithResult',
36
+ description: 'Execute code that outputs JSON on the last line of stdout. The JSON is parsed and returned as the result.',
37
+ parameters: {
38
+ type: 'object',
39
+ properties: {
40
+ code: {
41
+ type: 'string',
42
+ description: 'Code that console.logs a JSON value on the final line. This JSON will be parsed and returned.',
43
+ },
44
+ permissions: {
45
+ type: 'array',
46
+ items: {
47
+ type: 'string',
48
+ enum: ['all', 'env', 'ffi', 'hrtime', 'net', 'read', 'run', 'sys', 'write'],
49
+ },
50
+ description: 'Deno permissions to grant',
51
+ },
52
+ },
53
+ required: ['code'],
54
+ },
55
+ },
56
+ ];
57
+ smartdeno;
58
+ async initialize() {
59
+ this.smartdeno = new plugins.smartdeno.SmartDeno();
60
+ await this.smartdeno.start();
61
+ this.isInitialized = true;
62
+ }
63
+ async cleanup() {
64
+ if (this.smartdeno) {
65
+ await this.smartdeno.stop();
66
+ }
67
+ this.isInitialized = false;
68
+ }
69
+ async execute(action, params) {
70
+ this.validateAction(action);
71
+ this.ensureInitialized();
72
+ try {
73
+ const code = params.code;
74
+ const permissions = params.permissions || [];
75
+ // Execute the script
76
+ const result = await this.smartdeno.executeScript(code, {
77
+ permissions,
78
+ });
79
+ switch (action) {
80
+ case 'execute': {
81
+ return {
82
+ success: result.exitCode === 0,
83
+ result: {
84
+ exitCode: result.exitCode,
85
+ stdout: result.stdout,
86
+ stderr: result.stderr,
87
+ permissions,
88
+ },
89
+ };
90
+ }
91
+ case 'executeWithResult': {
92
+ if (result.exitCode !== 0) {
93
+ return {
94
+ success: false,
95
+ error: `Script failed with exit code ${result.exitCode}: ${result.stderr}`,
96
+ };
97
+ }
98
+ // Parse the last line of stdout as JSON
99
+ const lines = result.stdout.trim().split('\n');
100
+ const lastLine = lines[lines.length - 1];
101
+ try {
102
+ const parsedResult = JSON.parse(lastLine);
103
+ return {
104
+ success: true,
105
+ result: {
106
+ parsed: parsedResult,
107
+ stdout: result.stdout,
108
+ stderr: result.stderr,
109
+ },
110
+ };
111
+ }
112
+ catch (parseError) {
113
+ return {
114
+ success: false,
115
+ error: `Failed to parse JSON from last line of output: ${lastLine}`,
116
+ };
117
+ }
118
+ }
119
+ default:
120
+ return {
121
+ success: false,
122
+ error: `Unknown action: ${action}`,
123
+ };
124
+ }
125
+ }
126
+ catch (error) {
127
+ return {
128
+ success: false,
129
+ error: error instanceof Error ? error.message : String(error),
130
+ };
131
+ }
132
+ }
133
+ getCallSummary(action, params) {
134
+ const code = params.code;
135
+ const permissions = params.permissions || [];
136
+ // Create a preview of the code (first 100 chars)
137
+ const codePreview = code.length > 100 ? code.substring(0, 100) + '...' : code;
138
+ // Escape newlines for single-line display
139
+ const cleanPreview = codePreview.replace(/\n/g, '\\n');
140
+ const permissionInfo = permissions.length > 0
141
+ ? ` [permissions: ${permissions.join(', ')}]`
142
+ : ' [sandboxed - no permissions]';
143
+ switch (action) {
144
+ case 'execute':
145
+ return `Execute Deno code${permissionInfo}: "${cleanPreview}"`;
146
+ case 'executeWithResult':
147
+ return `Execute Deno code and parse JSON result${permissionInfo}: "${cleanPreview}"`;
148
+ default:
149
+ return `Unknown action: ${action}`;
150
+ }
151
+ }
152
+ }
153
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC50b29scy5kZW5vLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhZ2VudC50b29scy5kZW5vLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBZ0I3RDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sUUFBUyxTQUFRLGVBQWU7SUFDcEMsSUFBSSxHQUFHLE1BQU0sQ0FBQztJQUNkLFdBQVcsR0FDaEIseUdBQXlHLENBQUM7SUFFckcsT0FBTyxHQUE2QjtRQUN6QztZQUNFLElBQUksRUFBRSxTQUFTO1lBQ2YsV0FBVyxFQUNULG9IQUFvSDtZQUN0SCxVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsVUFBVSxFQUFFO29CQUNWLElBQUksRUFBRTt3QkFDSixJQUFJLEVBQUUsUUFBUTt3QkFDZCxXQUFXLEVBQUUsdUNBQXVDO3FCQUNyRDtvQkFDRCxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLE9BQU87d0JBQ2IsS0FBSyxFQUFFOzRCQUNMLElBQUksRUFBRSxRQUFROzRCQUNkLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDO3lCQUM1RTt3QkFDRCxXQUFXLEVBQ1Qsd0hBQXdIO3FCQUMzSDtpQkFDRjtnQkFDRCxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUM7YUFDbkI7U0FDRjtRQUNEO1lBQ0UsSUFBSSxFQUFFLG1CQUFtQjtZQUN6QixXQUFXLEVBQ1QsMkdBQTJHO1lBQzdHLFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsUUFBUTtnQkFDZCxVQUFVLEVB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
package/npmextra.json CHANGED
@@ -14,5 +14,14 @@
14
14
  "npmci": {
15
15
  "npmGlobalTools": [],
16
16
  "npmAccessLevel": "public"
17
+ },
18
+ "@git.zone/cli": {
19
+ "release": {
20
+ "registries": [
21
+ "https://verdaccio.lossless.digital",
22
+ "https://registry.npmjs.org"
23
+ ],
24
+ "accessLevel": "public"
25
+ }
17
26
  }
18
- }
27
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push.rocks/smartagent",
3
- "version": "1.0.2",
3
+ "version": "1.1.1",
4
4
  "private": false,
5
5
  "description": "an agentic framework built on top of @push.rocks/smartai",
6
6
  "main": "dist_ts/index.js",
@@ -8,20 +8,27 @@
8
8
  "type": "module",
9
9
  "author": "Task Venture Capital GmbH",
10
10
  "license": "MIT",
11
+ "scripts": {
12
+ "test": "(tstest test/ --verbose)",
13
+ "build": "(tsbuild --web --allowimplicitany)",
14
+ "buildDocs": "(tsdoc)"
15
+ },
11
16
  "devDependencies": {
12
- "@git.zone/tsbuild": "^3.1.2",
13
- "@git.zone/tsbundle": "^2.6.2",
14
- "@git.zone/tsrun": "^2.0.0",
17
+ "@git.zone/tsbuild": "^4.0.2",
18
+ "@git.zone/tsbundle": "^2.6.3",
19
+ "@git.zone/tsrun": "^2.0.1",
15
20
  "@git.zone/tstest": "^3.1.3",
16
- "@types/node": "^24.10.1"
21
+ "@types/node": "^25.0.2"
17
22
  },
18
23
  "dependencies": {
19
24
  "@push.rocks/smartai": "^0.8.0",
20
25
  "@push.rocks/smartbrowser": "^2.0.8",
26
+ "@push.rocks/smartdeno": "^1.2.0",
21
27
  "@push.rocks/smartfs": "^1.2.0",
22
28
  "@push.rocks/smartrequest": "^5.0.1",
23
29
  "@push.rocks/smartshell": "^3.3.0"
24
30
  },
31
+ "packageManager": "pnpm@10.18.1+sha512.77a884a165cbba2d8d1c19e3b4880eee6d2fcabd0d879121e282196b80042351d5eb3ca0935fa599da1dc51265cc68816ad2bddd2a2de5ea9fdf92adbec7cd34",
25
32
  "repository": {
26
33
  "type": "git",
27
34
  "url": "https://code.foss.global/push.rocks/smartagent.git"
@@ -42,9 +49,7 @@
42
49
  "npmextra.json",
43
50
  "readme.md"
44
51
  ],
45
- "scripts": {
46
- "test": "(tstest test/ --web)",
47
- "build": "(tsbuild --web --allowimplicitany)",
48
- "buildDocs": "(tsdoc)"
52
+ "pnpm": {
53
+ "overrides": {}
49
54
  }
50
- }
55
+ }
package/readme.md CHANGED
@@ -19,26 +19,33 @@ This design ensures safe tool use through AI-based policy evaluation rather than
19
19
 
20
20
  ## Architecture
21
21
 
22
- ```
23
- User Task + Guardian Policy Prompt
24
- |
25
- +---------------------------------------+
26
- | DualAgentOrchestrator |
27
- | |
28
- | +--------+ +------------+ |
29
- | | Driver |-------> | Guardian | |
30
- | | Agent | tool | Agent | |
31
- | | | call | | |
32
- | | Reason |<--------| Evaluate | |
33
- | | + Plan | approve | against | |
34
- | +--------+ /reject | policy | |
35
- | | +feedback+-----------+ |
36
- | v (if approved) |
37
- | +-----------------------------------+|
38
- | | Standard Tools ||
39
- | | Filesystem | HTTP | Shell | Browser|
40
- | +-----------------------------------+|
41
- +---------------------------------------+
22
+ ```mermaid
23
+ flowchart TB
24
+ subgraph Input
25
+ Task["User Task"]
26
+ Policy["Guardian Policy Prompt"]
27
+ end
28
+
29
+ subgraph Orchestrator["DualAgentOrchestrator"]
30
+ Driver["Driver Agent<br/><i>Reason + Plan</i>"]
31
+ Guardian["Guardian Agent<br/><i>Evaluate against policy</i>"]
32
+
33
+ Driver -->|"tool call proposal"| Guardian
34
+ Guardian -->|"approve / reject + feedback"| Driver
35
+ end
36
+
37
+ subgraph Tools["Standard Tools"]
38
+ FS["Filesystem"]
39
+ HTTP["HTTP"]
40
+ Shell["Shell"]
41
+ Browser["Browser"]
42
+ Deno["Deno"]
43
+ end
44
+
45
+ Task --> Orchestrator
46
+ Policy --> Guardian
47
+ Driver -->|"execute<br/>(if approved)"| Tools
48
+ Tools -->|"result"| Driver
42
49
  ```
43
50
 
44
51
  ## Quick Start
@@ -139,6 +146,46 @@ Web page interaction using `@push.rocks/smartbrowser` (Puppeteer-based).
139
146
  </tool_call>
140
147
  ```
141
148
 
149
+ ### DenoTool
150
+ Execute TypeScript/JavaScript code in a sandboxed Deno environment using `@push.rocks/smartdeno`.
151
+
152
+ **Actions**: `execute`, `executeWithResult`
153
+
154
+ **Permissions**: `all`, `env`, `ffi`, `hrtime`, `net`, `read`, `run`, `sys`, `write`
155
+
156
+ By default, code runs fully sandboxed with no permissions. Permissions must be explicitly requested.
157
+
158
+ ```typescript
159
+ // Simple code execution
160
+ <tool_call>
161
+ <tool>deno</tool>
162
+ <action>execute</action>
163
+ <params>{"code": "console.log('Hello from Deno!')"}</params>
164
+ <reasoning>Running a simple script to verify the environment</reasoning>
165
+ </tool_call>
166
+
167
+ // Code with network permission
168
+ <tool_call>
169
+ <tool>deno</tool>
170
+ <action>execute</action>
171
+ <params>{
172
+ "code": "const resp = await fetch('https://api.example.com/data'); console.log(await resp.json());",
173
+ "permissions": ["net"]
174
+ }</params>
175
+ <reasoning>Fetching data from API using Deno's fetch</reasoning>
176
+ </tool_call>
177
+
178
+ // Execute and parse JSON result
179
+ <tool_call>
180
+ <tool>deno</tool>
181
+ <action>executeWithResult</action>
182
+ <params>{
183
+ "code": "const result = { sum: 2 + 2, date: new Date().toISOString() }; console.log(JSON.stringify(result));"
184
+ }</params>
185
+ <reasoning>Computing values and returning structured data</reasoning>
186
+ </tool_call>
187
+ ```
188
+
142
189
  ## Guardian Policy Examples
143
190
 
144
191
  ### Strict Security Policy
@@ -174,6 +221,27 @@ Always verify:
174
221
  `;
175
222
  ```
176
223
 
224
+ ### Deno Code Execution Policy
225
+ ```typescript
226
+ const denoPolicy = `
227
+ DENO CODE EXECUTION POLICY:
228
+ - ONLY allow 'read' permission for files within the workspace
229
+ - REJECT 'all' permission unless explicitly justified for the task
230
+ - REJECT 'run' permission (subprocess execution) without specific justification
231
+ - REJECT code that attempts to:
232
+ - Access credentials or environment secrets (even with 'env' permission)
233
+ - Make network requests to internal/private IP ranges
234
+ - Write to system directories
235
+ - FLAG obfuscated or encoded code (base64, eval with dynamic strings)
236
+ - Prefer sandboxed execution (no permissions) when possible
237
+
238
+ When evaluating code:
239
+ - Review the actual code content, not just permissions
240
+ - Consider what data the code could exfiltrate
241
+ - Verify network endpoints are legitimate public APIs
242
+ `;
243
+ ```
244
+
177
245
  ## Configuration Options
178
246
 
179
247
  ```typescript
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartagent',
6
- version: '1.0.2',
6
+ version: '1.1.1',
7
7
  description: 'an agentic framework built on top of @push.rocks/smartai'
8
8
  }
package/ts/index.ts CHANGED
@@ -15,6 +15,7 @@ export { FilesystemTool } from './smartagent.tools.filesystem.js';
15
15
  export { HttpTool } from './smartagent.tools.http.js';
16
16
  export { ShellTool } from './smartagent.tools.shell.js';
17
17
  export { BrowserTool } from './smartagent.tools.browser.js';
18
+ export { DenoTool, type TDenoPermission } from './smartagent.tools.deno.js';
18
19
 
19
20
  // Export all interfaces
20
21
  export * from './smartagent.interfaces.js';
package/ts/plugins.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  // @push.rocks scope
2
2
  import * as smartai from '@push.rocks/smartai';
3
+ import * as smartdeno from '@push.rocks/smartdeno';
3
4
  import * as smartfs from '@push.rocks/smartfs';
4
5
  import * as smartrequest from '@push.rocks/smartrequest';
5
6
  import * as smartbrowser from '@push.rocks/smartbrowser';
@@ -7,6 +8,7 @@ import * as smartshell from '@push.rocks/smartshell';
7
8
 
8
9
  export {
9
10
  smartai,
11
+ smartdeno,
10
12
  smartfs,
11
13
  smartrequest,
12
14
  smartbrowser,
@@ -7,6 +7,7 @@ import { FilesystemTool } from './smartagent.tools.filesystem.js';
7
7
  import { HttpTool } from './smartagent.tools.http.js';
8
8
  import { ShellTool } from './smartagent.tools.shell.js';
9
9
  import { BrowserTool } from './smartagent.tools.browser.js';
10
+ import { DenoTool } from './smartagent.tools.deno.js';
10
11
 
11
12
  /**
12
13
  * DualAgentOrchestrator - Coordinates Driver and Guardian agents
@@ -87,6 +88,7 @@ export class DualAgentOrchestrator {
87
88
  new HttpTool(),
88
89
  new ShellTool(),
89
90
  new BrowserTool(),
91
+ new DenoTool(),
90
92
  ];
91
93
 
92
94
  for (const tool of standardTools) {
@@ -0,0 +1,191 @@
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
+ /**
6
+ * Deno permission types for sandboxed code execution
7
+ */
8
+ export type TDenoPermission =
9
+ | 'all'
10
+ | 'env'
11
+ | 'ffi'
12
+ | 'hrtime'
13
+ | 'net'
14
+ | 'read'
15
+ | 'run'
16
+ | 'sys'
17
+ | 'write';
18
+
19
+ /**
20
+ * Deno tool for executing TypeScript/JavaScript code in a sandboxed environment
21
+ * Wraps @push.rocks/smartdeno
22
+ */
23
+ export class DenoTool extends BaseToolWrapper {
24
+ public name = 'deno';
25
+ public description =
26
+ 'Execute TypeScript/JavaScript code in a sandboxed Deno environment with fine-grained permission control';
27
+
28
+ public actions: interfaces.IToolAction[] = [
29
+ {
30
+ name: 'execute',
31
+ description:
32
+ 'Execute TypeScript/JavaScript code and return stdout/stderr. Code runs in Deno sandbox with specified permissions.',
33
+ parameters: {
34
+ type: 'object',
35
+ properties: {
36
+ code: {
37
+ type: 'string',
38
+ description: 'TypeScript/JavaScript code to execute',
39
+ },
40
+ permissions: {
41
+ type: 'array',
42
+ items: {
43
+ type: 'string',
44
+ enum: ['all', 'env', 'ffi', 'hrtime', 'net', 'read', 'run', 'sys', 'write'],
45
+ },
46
+ description:
47
+ 'Deno permissions to grant. Default: none (fully sandboxed). Options: all, env, net, read, write, run, sys, ffi, hrtime',
48
+ },
49
+ },
50
+ required: ['code'],
51
+ },
52
+ },
53
+ {
54
+ name: 'executeWithResult',
55
+ description:
56
+ 'Execute code that outputs JSON on the last line of stdout. The JSON is parsed and returned as the result.',
57
+ parameters: {
58
+ type: 'object',
59
+ properties: {
60
+ code: {
61
+ type: 'string',
62
+ description:
63
+ 'Code that console.logs a JSON value on the final line. This JSON will be parsed and returned.',
64
+ },
65
+ permissions: {
66
+ type: 'array',
67
+ items: {
68
+ type: 'string',
69
+ enum: ['all', 'env', 'ffi', 'hrtime', 'net', 'read', 'run', 'sys', 'write'],
70
+ },
71
+ description: 'Deno permissions to grant',
72
+ },
73
+ },
74
+ required: ['code'],
75
+ },
76
+ },
77
+ ];
78
+
79
+ private smartdeno!: plugins.smartdeno.SmartDeno;
80
+
81
+ public async initialize(): Promise<void> {
82
+ this.smartdeno = new plugins.smartdeno.SmartDeno();
83
+ await this.smartdeno.start();
84
+ this.isInitialized = true;
85
+ }
86
+
87
+ public async cleanup(): Promise<void> {
88
+ if (this.smartdeno) {
89
+ await this.smartdeno.stop();
90
+ }
91
+ this.isInitialized = false;
92
+ }
93
+
94
+ public async execute(
95
+ action: string,
96
+ params: Record<string, unknown>
97
+ ): Promise<interfaces.IToolExecutionResult> {
98
+ this.validateAction(action);
99
+ this.ensureInitialized();
100
+
101
+ try {
102
+ const code = params.code as string;
103
+ const permissions = (params.permissions as TDenoPermission[]) || [];
104
+
105
+ // Execute the script
106
+ const result = await this.smartdeno.executeScript(code, {
107
+ permissions,
108
+ });
109
+
110
+ switch (action) {
111
+ case 'execute': {
112
+ return {
113
+ success: result.exitCode === 0,
114
+ result: {
115
+ exitCode: result.exitCode,
116
+ stdout: result.stdout,
117
+ stderr: result.stderr,
118
+ permissions,
119
+ },
120
+ };
121
+ }
122
+
123
+ case 'executeWithResult': {
124
+ if (result.exitCode !== 0) {
125
+ return {
126
+ success: false,
127
+ error: `Script failed with exit code ${result.exitCode}: ${result.stderr}`,
128
+ };
129
+ }
130
+
131
+ // Parse the last line of stdout as JSON
132
+ const lines = result.stdout.trim().split('\n');
133
+ const lastLine = lines[lines.length - 1];
134
+
135
+ try {
136
+ const parsedResult = JSON.parse(lastLine);
137
+ return {
138
+ success: true,
139
+ result: {
140
+ parsed: parsedResult,
141
+ stdout: result.stdout,
142
+ stderr: result.stderr,
143
+ },
144
+ };
145
+ } catch (parseError) {
146
+ return {
147
+ success: false,
148
+ error: `Failed to parse JSON from last line of output: ${lastLine}`,
149
+ };
150
+ }
151
+ }
152
+
153
+ default:
154
+ return {
155
+ success: false,
156
+ error: `Unknown action: ${action}`,
157
+ };
158
+ }
159
+ } catch (error) {
160
+ return {
161
+ success: false,
162
+ error: error instanceof Error ? error.message : String(error),
163
+ };
164
+ }
165
+ }
166
+
167
+ public getCallSummary(action: string, params: Record<string, unknown>): string {
168
+ const code = params.code as string;
169
+ const permissions = (params.permissions as string[]) || [];
170
+
171
+ // Create a preview of the code (first 100 chars)
172
+ const codePreview = code.length > 100 ? code.substring(0, 100) + '...' : code;
173
+ // Escape newlines for single-line display
174
+ const cleanPreview = codePreview.replace(/\n/g, '\\n');
175
+
176
+ const permissionInfo = permissions.length > 0
177
+ ? ` [permissions: ${permissions.join(', ')}]`
178
+ : ' [sandboxed - no permissions]';
179
+
180
+ switch (action) {
181
+ case 'execute':
182
+ return `Execute Deno code${permissionInfo}: "${cleanPreview}"`;
183
+
184
+ case 'executeWithResult':
185
+ return `Execute Deno code and parse JSON result${permissionInfo}: "${cleanPreview}"`;
186
+
187
+ default:
188
+ return `Unknown action: ${action}`;
189
+ }
190
+ }
191
+ }
@@ -1,123 +0,0 @@
1
- import * as plugins from './plugins.js';
2
- /**
3
- * Configuration options for SmartAgent
4
- */
5
- export interface ISmartAgentOptions extends plugins.smartai.ISmartAiOptions {
6
- /** Name of the agent for identification */
7
- name?: string;
8
- /** Default provider to use for agent operations */
9
- defaultProvider?: plugins.smartai.TProvider;
10
- /** System message that defines the agent's behavior */
11
- systemMessage?: string;
12
- /** Maximum number of reasoning steps before forcing completion */
13
- maxIterations?: number;
14
- }
15
- /**
16
- * Represents a tool that an agent can use
17
- */
18
- export interface IAgentTool {
19
- /** Unique name for the tool */
20
- name: string;
21
- /** Description of what the tool does (used by the AI to decide when to use it) */
22
- description: string;
23
- /** JSON schema defining the tool's parameters */
24
- parameters: Record<string, unknown>;
25
- /** The function to execute when the tool is called */
26
- execute: (params: Record<string, unknown>) => Promise<unknown>;
27
- }
28
- /**
29
- * Represents a message in the agent's conversation history
30
- */
31
- export interface IAgentMessage {
32
- role: 'system' | 'user' | 'assistant' | 'tool';
33
- content: string;
34
- toolName?: string;
35
- toolResult?: unknown;
36
- }
37
- /**
38
- * Result of an agent run
39
- */
40
- export interface IAgentRunResult {
41
- /** The final response from the agent */
42
- response: string;
43
- /** Number of iterations the agent took */
44
- iterations: number;
45
- /** Full message history from this run */
46
- messages: IAgentMessage[];
47
- /** Whether the agent completed successfully or hit max iterations */
48
- completed: boolean;
49
- }
50
- /**
51
- * SmartAgent - An agentic framework built on top of @push.rocks/smartai
52
- *
53
- * Provides autonomous agent capabilities including:
54
- * - Tool use and function calling
55
- * - Multi-step reasoning
56
- * - Conversation memory
57
- * - Multiple AI provider support
58
- */
59
- export declare class SmartAgent {
60
- options: ISmartAgentOptions;
61
- smartai: plugins.smartai.SmartAi;
62
- tools: Map<string, IAgentTool>;
63
- messageHistory: IAgentMessage[];
64
- private isStarted;
65
- constructor(optionsArg: ISmartAgentOptions);
66
- /**
67
- * Starts the agent and initializes the underlying SmartAi instance
68
- */
69
- start(): Promise<void>;
70
- /**
71
- * Stops the agent and cleans up resources
72
- */
73
- stop(): Promise<void>;
74
- /**
75
- * Registers a tool that the agent can use
76
- */
77
- registerTool(tool: IAgentTool): void;
78
- /**
79
- * Removes a tool from the agent
80
- */
81
- unregisterTool(toolName: string): void;
82
- /**
83
- * Gets all registered tools
84
- */
85
- getTools(): IAgentTool[];
86
- /**
87
- * Sets or updates the system message
88
- */
89
- setSystemMessage(message: string): void;
90
- /**
91
- * Clears the conversation history (except system message)
92
- */
93
- clearHistory(): void;
94
- /**
95
- * Runs the agent with a user message
96
- * The agent will reason, use tools, and respond autonomously
97
- */
98
- run(userMessage: string): Promise<IAgentRunResult>;
99
- /**
100
- * Simple chat without tool use
101
- */
102
- chat(message: string): Promise<string>;
103
- /**
104
- * Gets the AI provider based on configuration
105
- */
106
- private getProvider;
107
- /**
108
- * Builds tool descriptions for the system prompt
109
- */
110
- private buildToolDescriptions;
111
- /**
112
- * Builds the system prompt including tool descriptions
113
- */
114
- private buildSystemPrompt;
115
- /**
116
- * Builds the contextual prompt from message history
117
- */
118
- private buildContextualPrompt;
119
- /**
120
- * Parses a tool call from the AI response
121
- */
122
- private parseToolCall;
123
- }
@@ -1,274 +0,0 @@
1
- import * as plugins from './plugins.js';
2
- /**
3
- * SmartAgent - An agentic framework built on top of @push.rocks/smartai
4
- *
5
- * Provides autonomous agent capabilities including:
6
- * - Tool use and function calling
7
- * - Multi-step reasoning
8
- * - Conversation memory
9
- * - Multiple AI provider support
10
- */
11
- export class SmartAgent {
12
- options;
13
- smartai;
14
- tools = new Map();
15
- messageHistory = [];
16
- isStarted = false;
17
- constructor(optionsArg) {
18
- this.options = {
19
- name: 'SmartAgent',
20
- defaultProvider: 'openai',
21
- maxIterations: 10,
22
- ...optionsArg,
23
- };
24
- this.smartai = new plugins.smartai.SmartAi(this.options);
25
- if (this.options.systemMessage) {
26
- this.messageHistory.push({
27
- role: 'system',
28
- content: this.options.systemMessage,
29
- });
30
- }
31
- }
32
- /**
33
- * Starts the agent and initializes the underlying SmartAi instance
34
- */
35
- async start() {
36
- if (this.isStarted)
37
- return;
38
- await this.smartai.start();
39
- this.isStarted = true;
40
- }
41
- /**
42
- * Stops the agent and cleans up resources
43
- */
44
- async stop() {
45
- if (!this.isStarted)
46
- return;
47
- await this.smartai.stop();
48
- this.isStarted = false;
49
- }
50
- /**
51
- * Registers a tool that the agent can use
52
- */
53
- registerTool(tool) {
54
- this.tools.set(tool.name, tool);
55
- }
56
- /**
57
- * Removes a tool from the agent
58
- */
59
- unregisterTool(toolName) {
60
- this.tools.delete(toolName);
61
- }
62
- /**
63
- * Gets all registered tools
64
- */
65
- getTools() {
66
- return Array.from(this.tools.values());
67
- }
68
- /**
69
- * Sets or updates the system message
70
- */
71
- setSystemMessage(message) {
72
- const existingIndex = this.messageHistory.findIndex(m => m.role === 'system');
73
- if (existingIndex >= 0) {
74
- this.messageHistory[existingIndex].content = message;
75
- }
76
- else {
77
- this.messageHistory.unshift({
78
- role: 'system',
79
- content: message,
80
- });
81
- }
82
- }
83
- /**
84
- * Clears the conversation history (except system message)
85
- */
86
- clearHistory() {
87
- this.messageHistory = this.messageHistory.filter(m => m.role === 'system');
88
- }
89
- /**
90
- * Runs the agent with a user message
91
- * The agent will reason, use tools, and respond autonomously
92
- */
93
- async run(userMessage) {
94
- if (!this.isStarted) {
95
- await this.start();
96
- }
97
- // Add user message to history
98
- this.messageHistory.push({
99
- role: 'user',
100
- content: userMessage,
101
- });
102
- let iterations = 0;
103
- let completed = false;
104
- let response = '';
105
- while (iterations < (this.options.maxIterations || 10) && !completed) {
106
- iterations++;
107
- // Build the prompt with tool descriptions if tools are available
108
- const toolDescriptions = this.buildToolDescriptions();
109
- const systemPrompt = this.buildSystemPrompt(toolDescriptions);
110
- // Get response from AI
111
- const provider = this.getProvider();
112
- const chatResponse = await provider.chat({
113
- systemMessage: systemPrompt,
114
- userMessage: this.buildContextualPrompt(),
115
- messageHistory: [],
116
- });
117
- response = chatResponse.message;
118
- // Check if the response contains a tool call
119
- const toolCall = this.parseToolCall(response);
120
- if (toolCall) {
121
- // Execute the tool
122
- const tool = this.tools.get(toolCall.name);
123
- if (tool) {
124
- try {
125
- const toolResult = await tool.execute(toolCall.params);
126
- // Add tool interaction to history
127
- this.messageHistory.push({
128
- role: 'assistant',
129
- content: response,
130
- });
131
- this.messageHistory.push({
132
- role: 'tool',
133
- content: JSON.stringify(toolResult),
134
- toolName: toolCall.name,
135
- toolResult,
136
- });
137
- }
138
- catch (error) {
139
- // Add error to history
140
- this.messageHistory.push({
141
- role: 'tool',
142
- content: `Error executing tool ${toolCall.name}: ${error}`,
143
- toolName: toolCall.name,
144
- });
145
- }
146
- }
147
- else {
148
- // Unknown tool
149
- this.messageHistory.push({
150
- role: 'tool',
151
- content: `Unknown tool: ${toolCall.name}`,
152
- toolName: toolCall.name,
153
- });
154
- }
155
- }
156
- else {
157
- // No tool call, this is the final response
158
- this.messageHistory.push({
159
- role: 'assistant',
160
- content: response,
161
- });
162
- completed = true;
163
- }
164
- }
165
- return {
166
- response,
167
- iterations,
168
- messages: [...this.messageHistory],
169
- completed,
170
- };
171
- }
172
- /**
173
- * Simple chat without tool use
174
- */
175
- async chat(message) {
176
- if (!this.isStarted) {
177
- await this.start();
178
- }
179
- const systemMessage = this.messageHistory.find(m => m.role === 'system')?.content || 'You are a helpful assistant.';
180
- const provider = this.getProvider();
181
- const response = await provider.chat({
182
- systemMessage,
183
- userMessage: message,
184
- messageHistory: this.messageHistory
185
- .filter(m => m.role !== 'system')
186
- .map(m => ({
187
- role: m.role === 'tool' ? 'user' : m.role,
188
- content: m.content,
189
- })),
190
- });
191
- this.messageHistory.push({ role: 'user', content: message });
192
- this.messageHistory.push({ role: 'assistant', content: response.message });
193
- return response.message;
194
- }
195
- /**
196
- * Gets the AI provider based on configuration
197
- */
198
- getProvider() {
199
- const providerName = this.options.defaultProvider || 'openai';
200
- switch (providerName) {
201
- case 'openai':
202
- return this.smartai.openaiProvider;
203
- case 'anthropic':
204
- return this.smartai.anthropicProvider;
205
- case 'perplexity':
206
- return this.smartai.perplexityProvider;
207
- case 'groq':
208
- return this.smartai.groqProvider;
209
- case 'ollama':
210
- return this.smartai.ollamaProvider;
211
- case 'xai':
212
- return this.smartai.xaiProvider;
213
- case 'exo':
214
- return this.smartai.exoProvider;
215
- default:
216
- return this.smartai.openaiProvider;
217
- }
218
- }
219
- /**
220
- * Builds tool descriptions for the system prompt
221
- */
222
- buildToolDescriptions() {
223
- if (this.tools.size === 0)
224
- return '';
225
- const toolList = Array.from(this.tools.values())
226
- .map(tool => `- ${tool.name}: ${tool.description}\n Parameters: ${JSON.stringify(tool.parameters)}`)
227
- .join('\n');
228
- return `\nYou have access to the following tools:\n${toolList}\n\nTo use a tool, respond with:\n<tool_call>\n{"name": "tool_name", "params": {...}}\n</tool_call>\n\nAfter receiving the tool result, continue your reasoning or provide a final response.`;
229
- }
230
- /**
231
- * Builds the system prompt including tool descriptions
232
- */
233
- buildSystemPrompt(toolDescriptions) {
234
- const baseSystemMessage = this.messageHistory.find(m => m.role === 'system')?.content ||
235
- 'You are a helpful AI assistant.';
236
- return baseSystemMessage + toolDescriptions;
237
- }
238
- /**
239
- * Builds the contextual prompt from message history
240
- */
241
- buildContextualPrompt() {
242
- return this.messageHistory
243
- .filter(m => m.role !== 'system')
244
- .map(m => {
245
- if (m.role === 'tool') {
246
- return `[Tool Result from ${m.toolName}]: ${m.content}`;
247
- }
248
- return `[${m.role}]: ${m.content}`;
249
- })
250
- .join('\n\n');
251
- }
252
- /**
253
- * Parses a tool call from the AI response
254
- */
255
- parseToolCall(response) {
256
- const toolCallMatch = response.match(/<tool_call>\s*(\{[\s\S]*?\})\s*<\/tool_call>/);
257
- if (!toolCallMatch)
258
- return null;
259
- try {
260
- const parsed = JSON.parse(toolCallMatch[1]);
261
- if (parsed.name && typeof parsed.name === 'string') {
262
- return {
263
- name: parsed.name,
264
- params: parsed.params || {},
265
- };
266
- }
267
- }
268
- catch {
269
- return null;
270
- }
271
- return null;
272
- }
273
- }
274
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jbGFzc2VzLnNtYXJ0YWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFnZW50LmNsYXNzZXMuc21hcnRhZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQXNEeEM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sVUFBVTtJQUNkLE9BQU8sQ0FBcUI7SUFDNUIsT0FBTyxDQUEwQjtJQUNqQyxLQUFLLEdBQTRCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDM0MsY0FBYyxHQUFvQixFQUFFLENBQUM7SUFFcEMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUUxQixZQUFZLFVBQThCO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixJQUFJLEVBQUUsWUFBWTtZQUNsQixlQUFlLEVBQUUsUUFBUTtZQUN6QixhQUFhLEVBQUUsRUFBRTtZQUNqQixHQUFHLFVBQVU7U0FDZCxDQUFDO1FBRUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV6RCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZCLElBQUksRUFBRSxRQUFRO2dCQUNkLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWE7YUFDcEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQzNCLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsSUFBSTtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFDNUIsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVksQ0FBQyxJQUFnQjtRQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNJLGNBQWMsQ0FBQyxRQUFnQjtRQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRO1FBQ2IsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxnQkFBZ0IsQ0FBQyxPQUFlO1FBQ3JDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQztRQUM5RSxJQUFJLGFBQWEsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkQsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztnQkFDMUIsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsT0FBTyxFQUFFLE9BQU87YUFDakIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVk7UUFDakIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBbUI7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBRUQsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLElBQUksRUFBRSxNQUFNO1lBQ1osT0FBTyxFQUFFLFdBQVc7U0FDckIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFFbEIsT0FBTyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3JFLFVBQVUsRUFBRSxDQUFDO1lBRWIsaUVBQWlFO1lBQ2pFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDdEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFFOUQsdUJBQXVCO1lBQ3ZCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxNQUFNLFlBQVksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZDLGFBQWEsRUFBRSxZQUFZO2dCQUMzQixXQUFXLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFO2dCQUN6QyxjQUFjLEVBQUUsRUFBRTthQUNuQixDQUFDLENBQUM7WUFFSCxRQUFRLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUVoQyw2Q0FBNkM7WUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUU5QyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLG1CQUFtQjtnQkFDbkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNULElBQUksQ0FBQzt3QkFDSCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUV2RCxrQ0FBa0M7d0JBQ2xDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDOzRCQUN2QixJQUFJLEVBQUUsV0FBVzs0QkFDakIsT0FBTyxFQUFFLFFBQVE7eUJBQ2xCLENBQUMsQ0FBQzt3QkFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQzs0QkFDdkIsSUFBSSxFQUFFLE1BQU07NEJBQ1osT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDOzRCQUNuQyxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUk7NEJBQ3ZCLFVBQVU7eUJBQ1gsQ0FBQyxDQUFDO29CQUNMLENBQUM7b0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQzt3QkFDZix1QkFBdUI7d0JBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDOzRCQUN2QixJQUFJLEVBQUUsTUFBTTs0QkFDWixPQUFPLEVBQUUsd0JBQXdCLFFBQVEsQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFOzRCQUMxRCxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUk7eUJBQ3hCLENBQUMsQ0FBQztvQkFDTCxDQUFDO2dCQUNILENBQUM7cUJBQU0sQ0FBQztvQkFDTixlQUFlO29CQUNmLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO3dCQUN2QixJQUFJLEVBQUUsTUFBTTt3QkFDWixPQUFPLEVBQUUsaUJBQWlCLFFBQVEsQ0FBQyxJQUFJLEVBQUU7d0JBQ3pDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSTtxQkFDeEIsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sMkNBQTJDO2dCQUMzQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztvQkFDdkIsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLE9BQU8sRUFBRSxRQUFRO2lCQUNsQixDQUFDLENBQUM7Z0JBQ0gsU0FBUyxHQUFHLElBQUksQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU87WUFDTCxRQUFRO1lBQ1IsVUFBVTtZQUNWLFFBQVEsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNsQyxTQUFTO1NBQ1YsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBZTtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JCLENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLEVBQUUsT0FBTyxJQUFJLDhCQUE4QixDQUFDO1FBRXBILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxNQUFNLFFBQVEsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDbkMsYUFBYTtZQUNiLFdBQVcsRUFBRSxPQUFPO1lBQ3BCLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztpQkFDaEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7aUJBQ2hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ1QsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUE0QjtnQkFDakUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPO2FBQ25CLENBQUMsQ0FBQztTQUNOLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRTNFLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxXQUFXO1FBQ2pCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxJQUFJLFFBQVEsQ0FBQztRQUM5RCxRQUFRLFlBQVksRUFBRSxDQUFDO1lBQ3JCLEtBQUssUUFBUTtnQkFDWCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO1lBQ3JDLEtBQUssV0FBVztnQkFDZCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUM7WUFDeEMsS0FBSyxZQUFZO2dCQUNmLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztZQUN6QyxLQUFLLE1BQU07Z0JBQ1QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztZQUNuQyxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztZQUNyQyxLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUNsQyxLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUNsQztnQkFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxxQkFBcUI7UUFDM0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFckMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQzdDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsV0FBVyxtQkFBbUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQzthQUNwRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFZCxPQUFPLDhDQUE4QyxRQUFRLDhMQUE4TCxDQUFDO0lBQzlQLENBQUM7SUFFRDs7T0FFRztJQUNLLGlCQUFpQixDQUFDLGdCQUF3QjtRQUNoRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsRUFBRSxPQUFPO1lBQ25GLGlDQUFpQyxDQUFDO1FBQ3BDLE9BQU8saUJBQWlCLEdBQUcsZ0JBQWdCLENBQUM7SUFDOUMsQ0FBQztJQUVEOztPQUVHO0lBQ0sscUJBQXFCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGNBQWM7YUFDdkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7YUFDaEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ1AsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUN0QixPQUFPLHFCQUFxQixDQUFDLENBQUMsUUFBUSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxRCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLENBQUMsQ0FBQzthQUNELElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhLENBQUMsUUFBZ0I7UUFDcEMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFaEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNuRCxPQUFPO29CQUNMLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtvQkFDakIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRTtpQkFDNUIsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0YifQ==