@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,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* autocreated commitinfo by @push.rocks/commitinfo
|
|
3
|
+
*/
|
|
4
|
+
export const commitinfo = {
|
|
5
|
+
name: '@push.rocks/smartagent',
|
|
6
|
+
version: '1.0.2',
|
|
7
|
+
description: 'an agentic framework built on top of @push.rocks/smartai'
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDBEQUEwRDtDQUN4RSxDQUFBIn0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { DualAgentOrchestrator } from './smartagent.classes.dualagent.js';
|
|
2
|
+
export { DriverAgent } from './smartagent.classes.driveragent.js';
|
|
3
|
+
export { GuardianAgent } from './smartagent.classes.guardianagent.js';
|
|
4
|
+
export { BaseToolWrapper } from './smartagent.tools.base.js';
|
|
5
|
+
export { FilesystemTool } from './smartagent.tools.filesystem.js';
|
|
6
|
+
export { HttpTool } from './smartagent.tools.http.js';
|
|
7
|
+
export { ShellTool } from './smartagent.tools.shell.js';
|
|
8
|
+
export { BrowserTool } from './smartagent.tools.browser.js';
|
|
9
|
+
export * from './smartagent.interfaces.js';
|
|
10
|
+
export { type ISmartAiOptions, type TProvider, type ChatMessage, type ChatOptions, type ChatResponse, } from '@push.rocks/smartai';
|
package/dist_ts/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
// Export the dual-agent orchestrator (main entry point)
|
|
3
|
+
export { DualAgentOrchestrator } from './smartagent.classes.dualagent.js';
|
|
4
|
+
// Export individual agents
|
|
5
|
+
export { DriverAgent } from './smartagent.classes.driveragent.js';
|
|
6
|
+
export { GuardianAgent } from './smartagent.classes.guardianagent.js';
|
|
7
|
+
// Export base tool class for custom tool creation
|
|
8
|
+
export { BaseToolWrapper } from './smartagent.tools.base.js';
|
|
9
|
+
// Export standard tools
|
|
10
|
+
export { FilesystemTool } from './smartagent.tools.filesystem.js';
|
|
11
|
+
export { HttpTool } from './smartagent.tools.http.js';
|
|
12
|
+
export { ShellTool } from './smartagent.tools.shell.js';
|
|
13
|
+
export { BrowserTool } from './smartagent.tools.browser.js';
|
|
14
|
+
// Export all interfaces
|
|
15
|
+
export * from './smartagent.interfaces.js';
|
|
16
|
+
// Re-export useful types from smartai
|
|
17
|
+
export {} from '@push.rocks/smartai';
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4Qyx3REFBd0Q7QUFDeEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFMUUsMkJBQTJCO0FBQzNCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdEUsa0RBQWtEO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU3RCx3QkFBd0I7QUFDeEIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTVELHdCQUF3QjtBQUN4QixjQUFjLDRCQUE0QixDQUFDO0FBRTNDLHNDQUFzQztBQUN0QyxPQUFPLEVBTU4sTUFBTSxxQkFBcUIsQ0FBQyJ9
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as smartai from '@push.rocks/smartai';
|
|
2
|
+
import * as smartfs from '@push.rocks/smartfs';
|
|
3
|
+
import * as smartrequest from '@push.rocks/smartrequest';
|
|
4
|
+
import * as smartbrowser from '@push.rocks/smartbrowser';
|
|
5
|
+
import * as smartshell from '@push.rocks/smartshell';
|
|
6
|
+
export { smartai, smartfs, smartrequest, smartbrowser, smartshell, };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// @push.rocks scope
|
|
2
|
+
import * as smartai from '@push.rocks/smartai';
|
|
3
|
+
import * as smartfs from '@push.rocks/smartfs';
|
|
4
|
+
import * as smartrequest from '@push.rocks/smartrequest';
|
|
5
|
+
import * as smartbrowser from '@push.rocks/smartbrowser';
|
|
6
|
+
import * as smartshell from '@push.rocks/smartshell';
|
|
7
|
+
export { smartai, smartfs, smartrequest, smartbrowser, smartshell, };
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxLQUFLLE9BQU8sTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUVyRCxPQUFPLEVBQ0wsT0FBTyxFQUNQLE9BQU8sRUFDUCxZQUFZLEVBQ1osWUFBWSxFQUNaLFVBQVUsR0FDWCxDQUFDIn0=
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import * as interfaces from './smartagent.interfaces.js';
|
|
3
|
+
import type { BaseToolWrapper } from './smartagent.tools.base.js';
|
|
4
|
+
/**
|
|
5
|
+
* DriverAgent - Executes tasks by reasoning and proposing tool calls
|
|
6
|
+
* Works in conjunction with GuardianAgent for approval
|
|
7
|
+
*/
|
|
8
|
+
export declare class DriverAgent {
|
|
9
|
+
private provider;
|
|
10
|
+
private systemMessage;
|
|
11
|
+
private messageHistory;
|
|
12
|
+
private tools;
|
|
13
|
+
constructor(provider: plugins.smartai.MultiModalModel, systemMessage?: string);
|
|
14
|
+
/**
|
|
15
|
+
* Register a tool for use by the driver
|
|
16
|
+
*/
|
|
17
|
+
registerTool(tool: BaseToolWrapper): void;
|
|
18
|
+
/**
|
|
19
|
+
* Get all registered tools
|
|
20
|
+
*/
|
|
21
|
+
getTools(): Map<string, BaseToolWrapper>;
|
|
22
|
+
/**
|
|
23
|
+
* Initialize a new conversation for a task
|
|
24
|
+
*/
|
|
25
|
+
startTask(task: string): Promise<interfaces.IAgentMessage>;
|
|
26
|
+
/**
|
|
27
|
+
* Continue the conversation with feedback or results
|
|
28
|
+
*/
|
|
29
|
+
continueWithMessage(message: string): Promise<interfaces.IAgentMessage>;
|
|
30
|
+
/**
|
|
31
|
+
* Parse tool call proposals from assistant response
|
|
32
|
+
*/
|
|
33
|
+
parseToolCallProposals(response: string): interfaces.IToolCallProposal[];
|
|
34
|
+
/**
|
|
35
|
+
* Parse the content inside a tool_call block
|
|
36
|
+
*/
|
|
37
|
+
private parseToolCallContent;
|
|
38
|
+
/**
|
|
39
|
+
* Extract parameters from XML-like format when JSON parsing fails
|
|
40
|
+
*/
|
|
41
|
+
private extractParamsFromXml;
|
|
42
|
+
/**
|
|
43
|
+
* Check if the response indicates task completion
|
|
44
|
+
*/
|
|
45
|
+
isTaskComplete(response: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Check if the response needs clarification or user input
|
|
48
|
+
*/
|
|
49
|
+
needsClarification(response: string): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Extract the final result from a completed task
|
|
52
|
+
*/
|
|
53
|
+
extractTaskResult(response: string): string | null;
|
|
54
|
+
/**
|
|
55
|
+
* Build tool descriptions for the system message
|
|
56
|
+
*/
|
|
57
|
+
private buildToolDescriptions;
|
|
58
|
+
/**
|
|
59
|
+
* Generate a unique proposal ID
|
|
60
|
+
*/
|
|
61
|
+
private generateProposalId;
|
|
62
|
+
/**
|
|
63
|
+
* Get the default system message for the driver
|
|
64
|
+
*/
|
|
65
|
+
private getDefaultSystemMessage;
|
|
66
|
+
/**
|
|
67
|
+
* Reset the conversation state
|
|
68
|
+
*/
|
|
69
|
+
reset(): void;
|
|
70
|
+
}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import * as interfaces from './smartagent.interfaces.js';
|
|
3
|
+
/**
|
|
4
|
+
* DriverAgent - Executes tasks by reasoning and proposing tool calls
|
|
5
|
+
* Works in conjunction with GuardianAgent for approval
|
|
6
|
+
*/
|
|
7
|
+
export class DriverAgent {
|
|
8
|
+
provider;
|
|
9
|
+
systemMessage;
|
|
10
|
+
messageHistory = [];
|
|
11
|
+
tools = new Map();
|
|
12
|
+
constructor(provider, systemMessage) {
|
|
13
|
+
this.provider = provider;
|
|
14
|
+
this.systemMessage = systemMessage || this.getDefaultSystemMessage();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Register a tool for use by the driver
|
|
18
|
+
*/
|
|
19
|
+
registerTool(tool) {
|
|
20
|
+
this.tools.set(tool.name, tool);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get all registered tools
|
|
24
|
+
*/
|
|
25
|
+
getTools() {
|
|
26
|
+
return this.tools;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Initialize a new conversation for a task
|
|
30
|
+
*/
|
|
31
|
+
async startTask(task) {
|
|
32
|
+
// Reset message history
|
|
33
|
+
this.messageHistory = [];
|
|
34
|
+
// Build the user message
|
|
35
|
+
const userMessage = `TASK: ${task}\n\nAnalyze this task and determine what actions are needed. If you need to use a tool, provide a tool call proposal.`;
|
|
36
|
+
// Add to history
|
|
37
|
+
this.messageHistory.push({
|
|
38
|
+
role: 'user',
|
|
39
|
+
content: userMessage,
|
|
40
|
+
});
|
|
41
|
+
// Build tool descriptions for the system message
|
|
42
|
+
const toolDescriptions = this.buildToolDescriptions();
|
|
43
|
+
const fullSystemMessage = `${this.systemMessage}\n\n## Available Tools\n${toolDescriptions}`;
|
|
44
|
+
// Get response from provider
|
|
45
|
+
const response = await this.provider.chat({
|
|
46
|
+
systemMessage: fullSystemMessage,
|
|
47
|
+
userMessage: userMessage,
|
|
48
|
+
messageHistory: [],
|
|
49
|
+
});
|
|
50
|
+
// Add assistant response to history
|
|
51
|
+
this.messageHistory.push({
|
|
52
|
+
role: 'assistant',
|
|
53
|
+
content: response.message,
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
role: 'assistant',
|
|
57
|
+
content: response.message,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Continue the conversation with feedback or results
|
|
62
|
+
*/
|
|
63
|
+
async continueWithMessage(message) {
|
|
64
|
+
// Add the new message to history
|
|
65
|
+
this.messageHistory.push({
|
|
66
|
+
role: 'user',
|
|
67
|
+
content: message,
|
|
68
|
+
});
|
|
69
|
+
// Build tool descriptions for the system message
|
|
70
|
+
const toolDescriptions = this.buildToolDescriptions();
|
|
71
|
+
const fullSystemMessage = `${this.systemMessage}\n\n## Available Tools\n${toolDescriptions}`;
|
|
72
|
+
// Get response from provider (pass all but last user message as history)
|
|
73
|
+
const historyForChat = this.messageHistory.slice(0, -1);
|
|
74
|
+
const response = await this.provider.chat({
|
|
75
|
+
systemMessage: fullSystemMessage,
|
|
76
|
+
userMessage: message,
|
|
77
|
+
messageHistory: historyForChat,
|
|
78
|
+
});
|
|
79
|
+
// Add assistant response to history
|
|
80
|
+
this.messageHistory.push({
|
|
81
|
+
role: 'assistant',
|
|
82
|
+
content: response.message,
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
role: 'assistant',
|
|
86
|
+
content: response.message,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Parse tool call proposals from assistant response
|
|
91
|
+
*/
|
|
92
|
+
parseToolCallProposals(response) {
|
|
93
|
+
const proposals = [];
|
|
94
|
+
// Match <tool_call>...</tool_call> blocks
|
|
95
|
+
const toolCallRegex = /<tool_call>([\s\S]*?)<\/tool_call>/g;
|
|
96
|
+
let match;
|
|
97
|
+
while ((match = toolCallRegex.exec(response)) !== null) {
|
|
98
|
+
const content = match[1];
|
|
99
|
+
try {
|
|
100
|
+
const proposal = this.parseToolCallContent(content);
|
|
101
|
+
if (proposal) {
|
|
102
|
+
proposals.push(proposal);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
// Skip malformed tool calls
|
|
107
|
+
console.warn('Failed to parse tool call:', error);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return proposals;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Parse the content inside a tool_call block
|
|
114
|
+
*/
|
|
115
|
+
parseToolCallContent(content) {
|
|
116
|
+
// Extract tool name
|
|
117
|
+
const toolMatch = content.match(/<tool>(.*?)<\/tool>/s);
|
|
118
|
+
if (!toolMatch)
|
|
119
|
+
return null;
|
|
120
|
+
const toolName = toolMatch[1].trim();
|
|
121
|
+
// Extract action
|
|
122
|
+
const actionMatch = content.match(/<action>(.*?)<\/action>/s);
|
|
123
|
+
if (!actionMatch)
|
|
124
|
+
return null;
|
|
125
|
+
const action = actionMatch[1].trim();
|
|
126
|
+
// Extract params (JSON)
|
|
127
|
+
const paramsMatch = content.match(/<params>([\s\S]*?)<\/params>/);
|
|
128
|
+
let params = {};
|
|
129
|
+
if (paramsMatch) {
|
|
130
|
+
try {
|
|
131
|
+
params = JSON.parse(paramsMatch[1].trim());
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// Try to extract individual parameters if JSON fails
|
|
135
|
+
params = this.extractParamsFromXml(paramsMatch[1]);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Extract reasoning (optional)
|
|
139
|
+
const reasoningMatch = content.match(/<reasoning>([\s\S]*?)<\/reasoning>/);
|
|
140
|
+
const reasoning = reasoningMatch ? reasoningMatch[1].trim() : undefined;
|
|
141
|
+
return {
|
|
142
|
+
proposalId: this.generateProposalId(),
|
|
143
|
+
toolName,
|
|
144
|
+
action,
|
|
145
|
+
params,
|
|
146
|
+
reasoning,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Extract parameters from XML-like format when JSON parsing fails
|
|
151
|
+
*/
|
|
152
|
+
extractParamsFromXml(content) {
|
|
153
|
+
const params = {};
|
|
154
|
+
const paramRegex = /<(\w+)>([\s\S]*?)<\/\1>/g;
|
|
155
|
+
let match;
|
|
156
|
+
while ((match = paramRegex.exec(content)) !== null) {
|
|
157
|
+
const key = match[1];
|
|
158
|
+
let value = match[2].trim();
|
|
159
|
+
// Try to parse as JSON for arrays/objects
|
|
160
|
+
try {
|
|
161
|
+
value = JSON.parse(value);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Keep as string if not valid JSON
|
|
165
|
+
}
|
|
166
|
+
params[key] = value;
|
|
167
|
+
}
|
|
168
|
+
return params;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Check if the response indicates task completion
|
|
172
|
+
*/
|
|
173
|
+
isTaskComplete(response) {
|
|
174
|
+
// Check for explicit completion markers
|
|
175
|
+
const completionMarkers = [
|
|
176
|
+
'<task_complete>',
|
|
177
|
+
'<task_completed>',
|
|
178
|
+
'TASK COMPLETE',
|
|
179
|
+
'Task completed successfully',
|
|
180
|
+
];
|
|
181
|
+
const lowerResponse = response.toLowerCase();
|
|
182
|
+
return completionMarkers.some(marker => lowerResponse.includes(marker.toLowerCase()));
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Check if the response needs clarification or user input
|
|
186
|
+
*/
|
|
187
|
+
needsClarification(response) {
|
|
188
|
+
const clarificationMarkers = [
|
|
189
|
+
'<needs_clarification>',
|
|
190
|
+
'<question>',
|
|
191
|
+
'please clarify',
|
|
192
|
+
'could you specify',
|
|
193
|
+
'what do you mean by',
|
|
194
|
+
];
|
|
195
|
+
const lowerResponse = response.toLowerCase();
|
|
196
|
+
return clarificationMarkers.some(marker => lowerResponse.includes(marker.toLowerCase()));
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Extract the final result from a completed task
|
|
200
|
+
*/
|
|
201
|
+
extractTaskResult(response) {
|
|
202
|
+
// Try to extract from result tags
|
|
203
|
+
const resultMatch = response.match(/<task_result>([\s\S]*?)<\/task_result>/);
|
|
204
|
+
if (resultMatch) {
|
|
205
|
+
return resultMatch[1].trim();
|
|
206
|
+
}
|
|
207
|
+
const completeMatch = response.match(/<task_complete>([\s\S]*?)<\/task_complete>/);
|
|
208
|
+
if (completeMatch) {
|
|
209
|
+
return completeMatch[1].trim();
|
|
210
|
+
}
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Build tool descriptions for the system message
|
|
215
|
+
*/
|
|
216
|
+
buildToolDescriptions() {
|
|
217
|
+
const descriptions = [];
|
|
218
|
+
for (const tool of this.tools.values()) {
|
|
219
|
+
descriptions.push(tool.getFullDescription());
|
|
220
|
+
}
|
|
221
|
+
return descriptions.join('\n\n');
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Generate a unique proposal ID
|
|
225
|
+
*/
|
|
226
|
+
generateProposalId() {
|
|
227
|
+
return `prop_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Get the default system message for the driver
|
|
231
|
+
*/
|
|
232
|
+
getDefaultSystemMessage() {
|
|
233
|
+
return `You are an AI assistant that executes tasks by using available tools.
|
|
234
|
+
|
|
235
|
+
## Your Role
|
|
236
|
+
You analyze tasks, break them down into steps, and use tools to accomplish goals.
|
|
237
|
+
|
|
238
|
+
## Tool Usage Format
|
|
239
|
+
When you need to use a tool, output a tool call proposal in this format:
|
|
240
|
+
|
|
241
|
+
<tool_call>
|
|
242
|
+
<tool>tool_name</tool>
|
|
243
|
+
<action>action_name</action>
|
|
244
|
+
<params>
|
|
245
|
+
{"param1": "value1", "param2": "value2"}
|
|
246
|
+
</params>
|
|
247
|
+
<reasoning>Brief explanation of why this action is needed</reasoning>
|
|
248
|
+
</tool_call>
|
|
249
|
+
|
|
250
|
+
## Guidelines
|
|
251
|
+
1. Think step by step about what needs to be done
|
|
252
|
+
2. Use only the tools that are available to you
|
|
253
|
+
3. Provide clear reasoning for each tool call
|
|
254
|
+
4. If a tool call is rejected, adapt your approach based on the feedback
|
|
255
|
+
5. When the task is complete, indicate this clearly:
|
|
256
|
+
|
|
257
|
+
<task_complete>
|
|
258
|
+
Brief summary of what was accomplished
|
|
259
|
+
</task_complete>
|
|
260
|
+
|
|
261
|
+
## Important
|
|
262
|
+
- Only propose ONE tool call at a time
|
|
263
|
+
- Wait for the result before proposing the next action
|
|
264
|
+
- If you encounter an error, analyze it and try an alternative approach
|
|
265
|
+
- If you need clarification, ask using <needs_clarification>your question</needs_clarification>`;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Reset the conversation state
|
|
269
|
+
*/
|
|
270
|
+
reset() {
|
|
271
|
+
this.messageHistory = [];
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jbGFzc2VzLmRyaXZlcmFnZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhZ2VudC5jbGFzc2VzLmRyaXZlcmFnZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sNEJBQTRCLENBQUM7QUFHekQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFDZCxRQUFRLENBQWtDO0lBQzFDLGFBQWEsQ0FBUztJQUN0QixjQUFjLEdBQWtDLEVBQUUsQ0FBQztJQUNuRCxLQUFLLEdBQWlDLElBQUksR0FBRyxFQUFFLENBQUM7SUFFeEQsWUFDRSxRQUF5QyxFQUN6QyxhQUFzQjtRQUV0QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUN2RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZLENBQUMsSUFBcUI7UUFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBWTtRQUNqQyx3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFFekIseUJBQXlCO1FBQ3pCLE1BQU0sV0FBVyxHQUFHLFNBQVMsSUFBSSx1SEFBdUgsQ0FBQztRQUV6SixpQkFBaUI7UUFDakIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDdkIsSUFBSSxFQUFFLE1BQU07WUFDWixPQUFPLEVBQUUsV0FB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
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as interfaces from './smartagent.interfaces.js';
|
|
2
|
+
import { BaseToolWrapper } from './smartagent.tools.base.js';
|
|
3
|
+
/**
|
|
4
|
+
* DualAgentOrchestrator - Coordinates Driver and Guardian agents
|
|
5
|
+
* Manages the complete lifecycle of task execution with tool approval
|
|
6
|
+
*/
|
|
7
|
+
export declare class DualAgentOrchestrator {
|
|
8
|
+
private options;
|
|
9
|
+
private smartai;
|
|
10
|
+
private driverProvider;
|
|
11
|
+
private guardianProvider;
|
|
12
|
+
private driver;
|
|
13
|
+
private guardian;
|
|
14
|
+
private tools;
|
|
15
|
+
private isRunning;
|
|
16
|
+
private conversationHistory;
|
|
17
|
+
constructor(options: interfaces.IDualAgentOptions);
|
|
18
|
+
/**
|
|
19
|
+
* Get provider by name
|
|
20
|
+
*/
|
|
21
|
+
private getProviderByName;
|
|
22
|
+
/**
|
|
23
|
+
* Register a custom tool
|
|
24
|
+
*/
|
|
25
|
+
registerTool(tool: BaseToolWrapper): void;
|
|
26
|
+
/**
|
|
27
|
+
* Register all standard tools
|
|
28
|
+
*/
|
|
29
|
+
registerStandardTools(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Initialize all tools (eager loading)
|
|
32
|
+
*/
|
|
33
|
+
start(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Cleanup all tools
|
|
36
|
+
*/
|
|
37
|
+
stop(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Run a task through the dual-agent system
|
|
40
|
+
*/
|
|
41
|
+
run(task: string): Promise<interfaces.IDualAgentRunResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Continue an existing task with user input
|
|
44
|
+
*/
|
|
45
|
+
continueTask(userInput: string): Promise<interfaces.IDualAgentRunResult>;
|
|
46
|
+
/**
|
|
47
|
+
* Get the conversation history
|
|
48
|
+
*/
|
|
49
|
+
getHistory(): interfaces.IAgentMessage[];
|
|
50
|
+
/**
|
|
51
|
+
* Update the guardian policy
|
|
52
|
+
*/
|
|
53
|
+
setGuardianPolicy(policyPrompt: string): void;
|
|
54
|
+
/**
|
|
55
|
+
* Check if orchestrator is running
|
|
56
|
+
*/
|
|
57
|
+
isActive(): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Get registered tool names
|
|
60
|
+
*/
|
|
61
|
+
getToolNames(): string[];
|
|
62
|
+
}
|