@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.
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/index.d.ts +10 -0
- package/dist_ts/index.js +18 -0
- package/dist_ts/plugins.d.ts +6 -0
- package/dist_ts/plugins.js +8 -0
- package/dist_ts/smartagent.classes.driveragent.d.ts +70 -0
- package/dist_ts/smartagent.classes.driveragent.js +274 -0
- package/dist_ts/smartagent.classes.dualagent.d.ts +62 -0
- package/dist_ts/smartagent.classes.dualagent.js +298 -0
- package/dist_ts/smartagent.classes.guardianagent.d.ts +46 -0
- package/dist_ts/smartagent.classes.guardianagent.js +201 -0
- package/dist_ts/smartagent.classes.smartagent.d.ts +123 -0
- package/dist_ts/smartagent.classes.smartagent.js +274 -0
- package/dist_ts/smartagent.interfaces.d.ts +165 -0
- package/dist_ts/smartagent.interfaces.js +8 -0
- package/dist_ts/smartagent.tools.base.d.ts +46 -0
- package/dist_ts/smartagent.tools.base.js +45 -0
- package/dist_ts/smartagent.tools.browser.d.ts +16 -0
- package/dist_ts/smartagent.tools.browser.js +177 -0
- package/dist_ts/smartagent.tools.filesystem.d.ts +16 -0
- package/dist_ts/smartagent.tools.filesystem.js +352 -0
- package/dist_ts/smartagent.tools.http.d.ts +15 -0
- package/dist_ts/smartagent.tools.http.js +187 -0
- package/dist_ts/smartagent.tools.shell.d.ts +16 -0
- package/dist_ts/smartagent.tools.shell.js +155 -0
- package/npmextra.json +18 -0
- package/package.json +50 -0
- package/readme.hints.md +16 -0
- package/readme.md +299 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/index.ts +29 -0
- package/ts/plugins.ts +14 -0
- package/ts/smartagent.classes.driveragent.ts +321 -0
- package/ts/smartagent.classes.dualagent.ts +350 -0
- package/ts/smartagent.classes.guardianagent.ts +241 -0
- package/ts/smartagent.interfaces.ts +210 -0
- package/ts/smartagent.tools.base.ts +80 -0
- package/ts/smartagent.tools.browser.ts +200 -0
- package/ts/smartagent.tools.filesystem.ts +379 -0
- package/ts/smartagent.tools.http.ts +205 -0
- package/ts/smartagent.tools.shell.ts +182 -0
|
@@ -0,0 +1,123 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,274 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jbGFzc2VzLnNtYXJ0YWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFnZW50LmNsYXNzZXMuc21hcnRhZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQXNEeEM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sVUFBVTtJQUNkLE9BQU8sQ0FBcUI7SUFDNUIsT0FBTyxDQUEwQjtJQUNqQyxLQUFLLEdBQTRCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDM0MsY0FBYyxHQUFvQixFQUFFLENBQUM7SUFFcEMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUUxQixZQUFZLFVBQThCO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixJQUFJLEVBQUUsWUFBWTtZQUNsQixlQUFlLEVBQUUsUUFBUTtZQUN6QixhQUFhLEVBQUUsRUFBRTtZQUNqQixHQUFHLFVBQVU7U0FDZCxDQUFDO1FBRUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV6RCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZCLElBQUksRUFBRSxRQUFRO2dCQUNkLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWE7YUFDcEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQzNCLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFD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
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* Configuration options for the DualAgentOrchestrator
|
|
4
|
+
*/
|
|
5
|
+
export interface IDualAgentOptions extends plugins.smartai.ISmartAiOptions {
|
|
6
|
+
/** Name of the agent system */
|
|
7
|
+
name?: string;
|
|
8
|
+
/** Default AI provider for both Driver and Guardian */
|
|
9
|
+
defaultProvider?: plugins.smartai.TProvider;
|
|
10
|
+
/** Optional separate provider for Guardian (for cost optimization) */
|
|
11
|
+
guardianProvider?: plugins.smartai.TProvider;
|
|
12
|
+
/** System message for the Driver agent */
|
|
13
|
+
driverSystemMessage?: string;
|
|
14
|
+
/** Policy prompt for the Guardian agent - REQUIRED */
|
|
15
|
+
guardianPolicyPrompt: string;
|
|
16
|
+
/** Maximum iterations for task completion (default: 20) */
|
|
17
|
+
maxIterations?: number;
|
|
18
|
+
/** Maximum consecutive rejections before aborting (default: 3) */
|
|
19
|
+
maxConsecutiveRejections?: number;
|
|
20
|
+
/** Enable verbose logging */
|
|
21
|
+
verbose?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Represents a message in the agent's conversation history
|
|
25
|
+
*/
|
|
26
|
+
export interface IAgentMessage {
|
|
27
|
+
role: 'system' | 'user' | 'assistant' | 'tool' | 'guardian';
|
|
28
|
+
content: string;
|
|
29
|
+
toolName?: string;
|
|
30
|
+
toolResult?: unknown;
|
|
31
|
+
toolCall?: IToolCallProposal;
|
|
32
|
+
guardianDecision?: IGuardianDecision;
|
|
33
|
+
timestamp?: Date;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Represents an action that a tool can perform
|
|
37
|
+
*/
|
|
38
|
+
export interface IToolAction {
|
|
39
|
+
/** Action name (e.g., 'read', 'write', 'delete') */
|
|
40
|
+
name: string;
|
|
41
|
+
/** Description of what this action does */
|
|
42
|
+
description: string;
|
|
43
|
+
/** JSON schema for action parameters */
|
|
44
|
+
parameters: Record<string, unknown>;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Proposed tool call from the Driver
|
|
48
|
+
*/
|
|
49
|
+
export interface IToolCallProposal {
|
|
50
|
+
/** Unique ID for this proposal */
|
|
51
|
+
proposalId: string;
|
|
52
|
+
/** Name of the tool */
|
|
53
|
+
toolName: string;
|
|
54
|
+
/** Specific action to perform */
|
|
55
|
+
action: string;
|
|
56
|
+
/** Parameters for the action */
|
|
57
|
+
params: Record<string, unknown>;
|
|
58
|
+
/** Driver's reasoning for this call */
|
|
59
|
+
reasoning?: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Result of tool execution
|
|
63
|
+
*/
|
|
64
|
+
export interface IToolExecutionResult {
|
|
65
|
+
success: boolean;
|
|
66
|
+
result?: unknown;
|
|
67
|
+
error?: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Base interface for wrapped tools
|
|
71
|
+
*/
|
|
72
|
+
export interface IAgentToolWrapper {
|
|
73
|
+
/** Tool name */
|
|
74
|
+
name: string;
|
|
75
|
+
/** Tool description */
|
|
76
|
+
description: string;
|
|
77
|
+
/** Available actions */
|
|
78
|
+
actions: IToolAction[];
|
|
79
|
+
/** Initialize the tool */
|
|
80
|
+
initialize(): Promise<void>;
|
|
81
|
+
/** Cleanup resources */
|
|
82
|
+
cleanup(): Promise<void>;
|
|
83
|
+
/** Execute an action */
|
|
84
|
+
execute(action: string, params: Record<string, unknown>): Promise<IToolExecutionResult>;
|
|
85
|
+
/** Get a summary for Guardian review */
|
|
86
|
+
getCallSummary(action: string, params: Record<string, unknown>): string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Request for Guardian evaluation
|
|
90
|
+
*/
|
|
91
|
+
export interface IGuardianEvaluationRequest {
|
|
92
|
+
/** The proposed tool call */
|
|
93
|
+
proposal: IToolCallProposal;
|
|
94
|
+
/** Current task context */
|
|
95
|
+
taskContext: string;
|
|
96
|
+
/** Recent conversation history (last N messages) */
|
|
97
|
+
recentHistory: IAgentMessage[];
|
|
98
|
+
/** Summary of what the tool call will do */
|
|
99
|
+
callSummary: string;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Guardian's decision
|
|
103
|
+
*/
|
|
104
|
+
export interface IGuardianDecision {
|
|
105
|
+
/** Approve or reject */
|
|
106
|
+
decision: 'approve' | 'reject';
|
|
107
|
+
/** Explanation of the decision */
|
|
108
|
+
reason: string;
|
|
109
|
+
/** Specific concerns if rejected */
|
|
110
|
+
concerns?: string[];
|
|
111
|
+
/** Suggestions for the Driver if rejected */
|
|
112
|
+
suggestions?: string;
|
|
113
|
+
/** Confidence level (0-1) */
|
|
114
|
+
confidence?: number;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Log entry for tool executions
|
|
118
|
+
*/
|
|
119
|
+
export interface IToolExecutionLog {
|
|
120
|
+
timestamp: Date;
|
|
121
|
+
toolName: string;
|
|
122
|
+
action: string;
|
|
123
|
+
params: Record<string, unknown>;
|
|
124
|
+
guardianDecision: 'approved' | 'rejected';
|
|
125
|
+
guardianReason: string;
|
|
126
|
+
executionResult?: unknown;
|
|
127
|
+
executionError?: string;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Status of a dual-agent run
|
|
131
|
+
*/
|
|
132
|
+
export type TDualAgentRunStatus = 'completed' | 'in_progress' | 'max_iterations_reached' | 'max_rejections_reached' | 'clarification_needed' | 'error';
|
|
133
|
+
/**
|
|
134
|
+
* Result of a dual-agent run
|
|
135
|
+
*/
|
|
136
|
+
export interface IDualAgentRunResult {
|
|
137
|
+
/** Whether the task was successful */
|
|
138
|
+
success: boolean;
|
|
139
|
+
/** Whether the task is completed */
|
|
140
|
+
completed: boolean;
|
|
141
|
+
/** Final result or response */
|
|
142
|
+
result: string;
|
|
143
|
+
/** Total iterations taken */
|
|
144
|
+
iterations: number;
|
|
145
|
+
/** Full conversation history */
|
|
146
|
+
history: IAgentMessage[];
|
|
147
|
+
/** Current status */
|
|
148
|
+
status: TDualAgentRunStatus;
|
|
149
|
+
/** Number of tool calls made */
|
|
150
|
+
toolCallCount?: number;
|
|
151
|
+
/** Number of Guardian rejections */
|
|
152
|
+
rejectionCount?: number;
|
|
153
|
+
/** Tool execution log */
|
|
154
|
+
toolLog?: IToolExecutionLog[];
|
|
155
|
+
/** Error message if status is 'error' */
|
|
156
|
+
error?: string;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Available tool names
|
|
160
|
+
*/
|
|
161
|
+
export type TToolName = 'filesystem' | 'http' | 'browser' | 'shell';
|
|
162
|
+
/**
|
|
163
|
+
* Generate a unique proposal ID
|
|
164
|
+
*/
|
|
165
|
+
export declare function generateProposalId(): string;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a unique proposal ID
|
|
4
|
+
*/
|
|
5
|
+
export function generateProposalId() {
|
|
6
|
+
return `proposal_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5pbnRlcmZhY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhZ2VudC5pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBNE14Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsT0FBTyxZQUFZLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNoRixDQUFDIn0=
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as interfaces from './smartagent.interfaces.js';
|
|
2
|
+
/**
|
|
3
|
+
* Abstract base class for tool wrappers
|
|
4
|
+
* All tool implementations should extend this class
|
|
5
|
+
*/
|
|
6
|
+
export declare abstract class BaseToolWrapper implements interfaces.IAgentToolWrapper {
|
|
7
|
+
abstract name: string;
|
|
8
|
+
abstract description: string;
|
|
9
|
+
abstract actions: interfaces.IToolAction[];
|
|
10
|
+
protected isInitialized: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Initialize the tool and any required resources
|
|
13
|
+
*/
|
|
14
|
+
abstract initialize(): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Cleanup any resources used by the tool
|
|
17
|
+
*/
|
|
18
|
+
abstract cleanup(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Execute an action with the given parameters
|
|
21
|
+
*/
|
|
22
|
+
abstract execute(action: string, params: Record<string, unknown>): Promise<interfaces.IToolExecutionResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Generate a human-readable summary of what the action will do
|
|
25
|
+
* This is used by the Guardian to understand the proposed action
|
|
26
|
+
*/
|
|
27
|
+
abstract getCallSummary(action: string, params: Record<string, unknown>): string;
|
|
28
|
+
/**
|
|
29
|
+
* Validate that an action exists for this tool
|
|
30
|
+
* @throws Error if the action is not valid
|
|
31
|
+
*/
|
|
32
|
+
protected validateAction(action: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* Check if the tool is initialized
|
|
35
|
+
*/
|
|
36
|
+
protected ensureInitialized(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Get the full tool description including all actions
|
|
39
|
+
* Used for Driver's tool awareness
|
|
40
|
+
*/
|
|
41
|
+
getFullDescription(): string;
|
|
42
|
+
/**
|
|
43
|
+
* Get the JSON schema for a specific action
|
|
44
|
+
*/
|
|
45
|
+
getActionSchema(action: string): Record<string, unknown> | undefined;
|
|
46
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as interfaces from './smartagent.interfaces.js';
|
|
2
|
+
/**
|
|
3
|
+
* Abstract base class for tool wrappers
|
|
4
|
+
* All tool implementations should extend this class
|
|
5
|
+
*/
|
|
6
|
+
export class BaseToolWrapper {
|
|
7
|
+
isInitialized = false;
|
|
8
|
+
/**
|
|
9
|
+
* Validate that an action exists for this tool
|
|
10
|
+
* @throws Error if the action is not valid
|
|
11
|
+
*/
|
|
12
|
+
validateAction(action) {
|
|
13
|
+
const validAction = this.actions.find((a) => a.name === action);
|
|
14
|
+
if (!validAction) {
|
|
15
|
+
const availableActions = this.actions.map((a) => a.name).join(', ');
|
|
16
|
+
throw new Error(`Unknown action "${action}" for tool "${this.name}". Available actions: ${availableActions}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check if the tool is initialized
|
|
21
|
+
*/
|
|
22
|
+
ensureInitialized() {
|
|
23
|
+
if (!this.isInitialized) {
|
|
24
|
+
throw new Error(`Tool "${this.name}" is not initialized. Call initialize() first.`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get the full tool description including all actions
|
|
29
|
+
* Used for Driver's tool awareness
|
|
30
|
+
*/
|
|
31
|
+
getFullDescription() {
|
|
32
|
+
const actionDescriptions = this.actions
|
|
33
|
+
.map((a) => ` - ${a.name}: ${a.description}`)
|
|
34
|
+
.join('\n');
|
|
35
|
+
return `${this.name}: ${this.description}\nActions:\n${actionDescriptions}`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get the JSON schema for a specific action
|
|
39
|
+
*/
|
|
40
|
+
getActionSchema(action) {
|
|
41
|
+
const actionDef = this.actions.find((a) => a.name === action);
|
|
42
|
+
return actionDef?.parameters;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC50b29scy5iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhZ2VudC50b29scy5iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sNEJBQTRCLENBQUM7QUFFekQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFnQixlQUFlO0lBS3pCLGFBQWEsR0FBRyxLQUFLLENBQUM7SUEwQmhDOzs7T0FHRztJQUNPLGNBQWMsQ0FBQyxNQUFjO1FBQ3JDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sSUFBSSxLQUFLLENBQ2IsbUJBQW1CLE1BQU0sZUFBZSxJQUFJLENBQUMsSUFBSSx5QkFBeUIsZ0JBQWdCLEVBQUUsQ0FDN0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxpQkFBaUI7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksZ0RBQWdELENBQUMsQ0FBQztRQUN0RixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGtCQUFrQjtRQUN2QixNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxPQUFPO2FBQ3BDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFZCxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsV0FBVyxlQUFlLGtCQUFrQixFQUFFLENBQUM7SUFDOUUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZSxDQUFDLE1BQWM7UUFDbkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUM7UUFDOUQsT0FBTyxTQUFTLEVBQUUsVUFBVSxDQUFDO0lBQy9CLENBQUM7Q0FDRiJ9
|