@push.rocks/smartagent 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  2. package/dist_ts/00_commitinfo_data.js +9 -0
  3. package/dist_ts/index.d.ts +10 -0
  4. package/dist_ts/index.js +18 -0
  5. package/dist_ts/plugins.d.ts +6 -0
  6. package/dist_ts/plugins.js +8 -0
  7. package/dist_ts/smartagent.classes.driveragent.d.ts +70 -0
  8. package/dist_ts/smartagent.classes.driveragent.js +274 -0
  9. package/dist_ts/smartagent.classes.dualagent.d.ts +62 -0
  10. package/dist_ts/smartagent.classes.dualagent.js +298 -0
  11. package/dist_ts/smartagent.classes.guardianagent.d.ts +46 -0
  12. package/dist_ts/smartagent.classes.guardianagent.js +201 -0
  13. package/dist_ts/smartagent.classes.smartagent.d.ts +123 -0
  14. package/dist_ts/smartagent.classes.smartagent.js +274 -0
  15. package/dist_ts/smartagent.interfaces.d.ts +165 -0
  16. package/dist_ts/smartagent.interfaces.js +8 -0
  17. package/dist_ts/smartagent.tools.base.d.ts +46 -0
  18. package/dist_ts/smartagent.tools.base.js +45 -0
  19. package/dist_ts/smartagent.tools.browser.d.ts +16 -0
  20. package/dist_ts/smartagent.tools.browser.js +177 -0
  21. package/dist_ts/smartagent.tools.filesystem.d.ts +16 -0
  22. package/dist_ts/smartagent.tools.filesystem.js +352 -0
  23. package/dist_ts/smartagent.tools.http.d.ts +15 -0
  24. package/dist_ts/smartagent.tools.http.js +187 -0
  25. package/dist_ts/smartagent.tools.shell.d.ts +16 -0
  26. package/dist_ts/smartagent.tools.shell.js +155 -0
  27. package/npmextra.json +18 -0
  28. package/package.json +50 -0
  29. package/readme.hints.md +16 -0
  30. package/readme.md +299 -0
  31. package/ts/00_commitinfo_data.ts +8 -0
  32. package/ts/index.ts +29 -0
  33. package/ts/plugins.ts +14 -0
  34. package/ts/smartagent.classes.driveragent.ts +321 -0
  35. package/ts/smartagent.classes.dualagent.ts +350 -0
  36. package/ts/smartagent.classes.guardianagent.ts +241 -0
  37. package/ts/smartagent.interfaces.ts +210 -0
  38. package/ts/smartagent.tools.base.ts +80 -0
  39. package/ts/smartagent.tools.browser.ts +200 -0
  40. package/ts/smartagent.tools.filesystem.ts +379 -0
  41. package/ts/smartagent.tools.http.ts +205 -0
  42. package/ts/smartagent.tools.shell.ts +182 -0
@@ -0,0 +1,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