@push.rocks/smartagent 1.6.2 → 1.8.0

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.
@@ -0,0 +1,27 @@
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
+ * ExpertTool - A specialized agent wrapped as a tool
6
+ *
7
+ * Enables hierarchical agent architectures where the Driver can delegate
8
+ * complex tasks to specialized experts with their own tools and policies.
9
+ */
10
+ export declare class ExpertTool extends BaseToolWrapper {
11
+ name: string;
12
+ description: string;
13
+ actions: interfaces.IToolAction[];
14
+ private config;
15
+ private smartAi;
16
+ private inner?;
17
+ constructor(config: interfaces.IExpertConfig, smartAi: plugins.smartai.SmartAi);
18
+ initialize(): Promise<void>;
19
+ cleanup(): Promise<void>;
20
+ execute(action: string, params: Record<string, unknown>): Promise<interfaces.IToolExecutionResult>;
21
+ getCallSummary(action: string, params: Record<string, unknown>): string;
22
+ getToolExplanation(): string;
23
+ /**
24
+ * Get the expert's configuration
25
+ */
26
+ getConfig(): interfaces.IExpertConfig;
27
+ }
@@ -0,0 +1,126 @@
1
+ import * as plugins from './plugins.js';
2
+ import * as interfaces from './smartagent.interfaces.js';
3
+ import { BaseToolWrapper } from './smartagent.tools.base.js';
4
+ // Forward declaration to avoid circular import at module load time
5
+ // The actual import happens lazily in initialize()
6
+ let DualAgentOrchestrator;
7
+ /**
8
+ * ExpertTool - A specialized agent wrapped as a tool
9
+ *
10
+ * Enables hierarchical agent architectures where the Driver can delegate
11
+ * complex tasks to specialized experts with their own tools and policies.
12
+ */
13
+ export class ExpertTool extends BaseToolWrapper {
14
+ name;
15
+ description;
16
+ actions = [
17
+ {
18
+ name: 'consult',
19
+ description: 'Delegate a task or question to this expert',
20
+ parameters: {
21
+ type: 'object',
22
+ properties: {
23
+ task: { type: 'string', description: 'The task or question for the expert' },
24
+ context: { type: 'string', description: 'Additional context to help the expert' },
25
+ },
26
+ required: ['task'],
27
+ },
28
+ },
29
+ ];
30
+ config;
31
+ smartAi;
32
+ inner;
33
+ constructor(config, smartAi) {
34
+ super();
35
+ this.config = config;
36
+ this.smartAi = smartAi;
37
+ this.name = config.name;
38
+ this.description = config.description;
39
+ }
40
+ async initialize() {
41
+ // Lazy import to avoid circular dependency
42
+ if (!DualAgentOrchestrator) {
43
+ const module = await import('./smartagent.classes.dualagent.js');
44
+ DualAgentOrchestrator = module.DualAgentOrchestrator;
45
+ }
46
+ this.inner = new DualAgentOrchestrator({
47
+ smartAiInstance: this.smartAi, // Share SmartAi instance
48
+ defaultProvider: this.config.provider,
49
+ driverSystemMessage: this.config.systemMessage,
50
+ guardianPolicyPrompt: this.config.guardianPolicy,
51
+ maxIterations: this.config.maxIterations ?? 10,
52
+ });
53
+ // Register expert's tools
54
+ if (this.config.tools) {
55
+ for (const tool of this.config.tools) {
56
+ // Tools in the config are IAgentToolWrapper, but we need BaseToolWrapper
57
+ // Since all our tools extend BaseToolWrapper, this cast is safe
58
+ this.inner.registerTool(tool);
59
+ }
60
+ }
61
+ await this.inner.start();
62
+ this.isInitialized = true;
63
+ }
64
+ async cleanup() {
65
+ if (this.inner) {
66
+ await this.inner.stop();
67
+ this.inner = undefined;
68
+ }
69
+ this.isInitialized = false;
70
+ }
71
+ async execute(action, params) {
72
+ this.validateAction(action);
73
+ this.ensureInitialized();
74
+ const task = params.task;
75
+ const context = params.context;
76
+ const fullTask = context ? `Context: ${context}\n\nTask: ${task}` : task;
77
+ try {
78
+ const result = await this.inner.run(fullTask);
79
+ return {
80
+ success: result.success,
81
+ result: {
82
+ response: result.result,
83
+ iterations: result.iterations,
84
+ status: result.status,
85
+ },
86
+ summary: result.success
87
+ ? `Expert "${this.name}" completed (${result.iterations} iterations)`
88
+ : `Expert "${this.name}" failed: ${result.status}`,
89
+ };
90
+ }
91
+ catch (error) {
92
+ return {
93
+ success: false,
94
+ error: `Expert error: ${error instanceof Error ? error.message : String(error)}`,
95
+ };
96
+ }
97
+ }
98
+ getCallSummary(action, params) {
99
+ const task = params.task;
100
+ const preview = task.length > 60 ? task.substring(0, 60) + '...' : task;
101
+ return `Consult ${this.name}: "${preview}"`;
102
+ }
103
+ getToolExplanation() {
104
+ return `## Expert: ${this.name}
105
+ ${this.description}
106
+
107
+ ### Usage:
108
+ Delegate tasks to this expert when you need specialized help.
109
+
110
+ \`\`\`
111
+ <tool_call>
112
+ <tool>${this.name}</tool>
113
+ <action>consult</action>
114
+ <params>{"task": "Your question or task", "context": "Optional background"}</params>
115
+ </tool_call>
116
+ \`\`\`
117
+ `;
118
+ }
119
+ /**
120
+ * Get the expert's configuration
121
+ */
122
+ getConfig() {
123
+ return this.config;
124
+ }
125
+ }
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC50b29scy5leHBlcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFnZW50LnRvb2xzLmV4cGVydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssVUFBVSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU3RCxtRUFBbUU7QUFDbkUsbURBQW1EO0FBQ25ELElBQUkscUJBQStGLENBQUM7QUFFcEc7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sVUFBVyxTQUFRLGVBQWU7SUFDdEMsSUFBSSxDQUFTO0lBQ2IsV0FBVyxDQUFTO0lBQ3BCLE9BQU8sR0FBNkI7UUFDekM7WUFDRSxJQUFJLEVBQUUsU0FBUztZQUNmLFdBQVcsRUFBRSw0Q0FBNEM7WUFDekQsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxRQUFRO2dCQUNkLFVBQVUsRUFBRTtvQkFDVixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxxQ0FBcUMsRUFBRTtvQkFDNUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsdUNBQXVDLEVBQUU7aUJBQ2xGO2dCQUNELFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQzthQUNuQjtTQUNGO0tBQ0YsQ0FBQztJQUVNLE1BQU0sQ0FBMkI7SUFDakMsT0FBTyxDQUEwQjtJQUNqQyxLQUFLLENBQThDO0lBRTNELFlBQVksTUFBZ0MsRUFBRSxPQUFnQztRQUM1RSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN4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
@@ -0,0 +1,29 @@
1
+ import * as interfaces from './smartagent.interfaces.js';
2
+ import { BaseToolWrapper } from './smartagent.tools.base.js';
3
+ import { ToolRegistry } from './smartagent.classes.toolregistry.js';
4
+ /**
5
+ * ToolSearchTool - AI-facing interface for discovering and activating tools
6
+ *
7
+ * This tool enables the Driver to:
8
+ * - Search for tools by capability
9
+ * - List all available tools
10
+ * - Activate on-demand tools
11
+ * - Get detailed information about specific tools
12
+ */
13
+ export declare class ToolSearchTool extends BaseToolWrapper {
14
+ name: string;
15
+ description: string;
16
+ actions: interfaces.IToolAction[];
17
+ private registry;
18
+ private onToolActivated?;
19
+ constructor(registry: ToolRegistry, onToolActivated?: (tool: BaseToolWrapper) => void);
20
+ initialize(): Promise<void>;
21
+ cleanup(): Promise<void>;
22
+ execute(action: string, params: Record<string, unknown>): Promise<interfaces.IToolExecutionResult>;
23
+ private handleSearch;
24
+ private handleList;
25
+ private handleActivate;
26
+ private handleDetails;
27
+ getCallSummary(action: string, params: Record<string, unknown>): string;
28
+ getToolExplanation(): string;
29
+ }
@@ -0,0 +1,215 @@
1
+ import * as interfaces from './smartagent.interfaces.js';
2
+ import { BaseToolWrapper } from './smartagent.tools.base.js';
3
+ import { ToolRegistry } from './smartagent.classes.toolregistry.js';
4
+ /**
5
+ * ToolSearchTool - AI-facing interface for discovering and activating tools
6
+ *
7
+ * This tool enables the Driver to:
8
+ * - Search for tools by capability
9
+ * - List all available tools
10
+ * - Activate on-demand tools
11
+ * - Get detailed information about specific tools
12
+ */
13
+ export class ToolSearchTool extends BaseToolWrapper {
14
+ name = 'tools';
15
+ description = 'Search for and activate available tools and experts. Use this to discover specialized capabilities.';
16
+ actions = [
17
+ {
18
+ name: 'search',
19
+ description: 'Search for tools by name, description, tags, or capabilities',
20
+ parameters: {
21
+ type: 'object',
22
+ properties: {
23
+ query: { type: 'string', description: 'Search query' },
24
+ },
25
+ required: ['query'],
26
+ },
27
+ },
28
+ {
29
+ name: 'list',
30
+ description: 'List all available tools grouped by visibility',
31
+ parameters: { type: 'object', properties: {} },
32
+ },
33
+ {
34
+ name: 'activate',
35
+ description: 'Activate an on-demand tool to make it available for use',
36
+ parameters: {
37
+ type: 'object',
38
+ properties: {
39
+ name: { type: 'string', description: 'Name of the tool to activate' },
40
+ },
41
+ required: ['name'],
42
+ },
43
+ },
44
+ {
45
+ name: 'details',
46
+ description: 'Get detailed information about a specific tool',
47
+ parameters: {
48
+ type: 'object',
49
+ properties: {
50
+ name: { type: 'string', description: 'Name of the tool' },
51
+ },
52
+ required: ['name'],
53
+ },
54
+ },
55
+ ];
56
+ registry;
57
+ onToolActivated;
58
+ constructor(registry, onToolActivated) {
59
+ super();
60
+ this.registry = registry;
61
+ this.onToolActivated = onToolActivated;
62
+ }
63
+ async initialize() {
64
+ this.isInitialized = true;
65
+ }
66
+ async cleanup() {
67
+ this.isInitialized = false;
68
+ }
69
+ async execute(action, params) {
70
+ this.validateAction(action);
71
+ switch (action) {
72
+ case 'search':
73
+ return this.handleSearch(params.query);
74
+ case 'list':
75
+ return this.handleList();
76
+ case 'activate':
77
+ return this.handleActivate(params.name);
78
+ case 'details':
79
+ return this.handleDetails(params.name);
80
+ default:
81
+ return { success: false, error: `Unknown action: ${action}` };
82
+ }
83
+ }
84
+ handleSearch(query) {
85
+ const results = this.registry.search(query);
86
+ return {
87
+ success: true,
88
+ result: results.map((m) => ({
89
+ name: m.name,
90
+ description: m.description,
91
+ visibility: m.visibility,
92
+ isActivated: m.isActivated,
93
+ category: m.category,
94
+ tags: m.tags,
95
+ actionCount: m.actions.length,
96
+ })),
97
+ summary: `Found ${results.length} tools matching "${query}"`,
98
+ };
99
+ }
100
+ handleList() {
101
+ const all = this.registry.getAllMetadata();
102
+ const initial = all.filter((m) => m.visibility === 'initial');
103
+ const onDemand = all.filter((m) => m.visibility === 'on-demand');
104
+ return {
105
+ success: true,
106
+ result: {
107
+ initial: initial.map((m) => ({
108
+ name: m.name,
109
+ description: m.description,
110
+ category: m.category,
111
+ })),
112
+ onDemand: onDemand.map((m) => ({
113
+ name: m.name,
114
+ description: m.description,
115
+ category: m.category,
116
+ isActivated: m.isActivated,
117
+ })),
118
+ summary: `${initial.length} initial, ${onDemand.length} on-demand`,
119
+ },
120
+ };
121
+ }
122
+ async handleActivate(name) {
123
+ const result = await this.registry.activate(name);
124
+ if (result.success && this.onToolActivated) {
125
+ const tool = this.registry.getTool(name);
126
+ if (tool) {
127
+ this.onToolActivated(tool);
128
+ }
129
+ }
130
+ return {
131
+ success: result.success,
132
+ result: result.success ? { name, message: `Tool "${name}" is now available` } : undefined,
133
+ error: result.error,
134
+ summary: result.success ? `Activated: ${name}` : result.error,
135
+ };
136
+ }
137
+ handleDetails(name) {
138
+ const tool = this.registry.getTool(name);
139
+ const meta = this.registry.getMetadata(name);
140
+ if (!tool || !meta) {
141
+ return { success: false, error: `Tool "${name}" not found` };
142
+ }
143
+ return {
144
+ success: true,
145
+ result: {
146
+ name: meta.name,
147
+ description: meta.description,
148
+ visibility: meta.visibility,
149
+ isActivated: meta.isActivated,
150
+ category: meta.category,
151
+ tags: meta.tags,
152
+ actions: meta.actions,
153
+ fullExplanation: tool.getToolExplanation(),
154
+ },
155
+ };
156
+ }
157
+ getCallSummary(action, params) {
158
+ switch (action) {
159
+ case 'search':
160
+ return `Search tools: "${params.query}"`;
161
+ case 'list':
162
+ return 'List all tools';
163
+ case 'activate':
164
+ return `Activate tool: ${params.name}`;
165
+ case 'details':
166
+ return `Get details: ${params.name}`;
167
+ default:
168
+ return `tools.${action}`;
169
+ }
170
+ }
171
+ getToolExplanation() {
172
+ return `## Tool: tools
173
+ Search for and manage available tools and experts.
174
+
175
+ ### Actions:
176
+
177
+ **search** - Find tools by capability
178
+ \`\`\`
179
+ <tool_call>
180
+ <tool>tools</tool>
181
+ <action>search</action>
182
+ <params>{"query": "database"}</params>
183
+ </tool_call>
184
+ \`\`\`
185
+
186
+ **list** - List all tools grouped by visibility
187
+ \`\`\`
188
+ <tool_call>
189
+ <tool>tools</tool>
190
+ <action>list</action>
191
+ <params>{}</params>
192
+ </tool_call>
193
+ \`\`\`
194
+
195
+ **activate** - Activate an on-demand tool
196
+ \`\`\`
197
+ <tool_call>
198
+ <tool>tools</tool>
199
+ <action>activate</action>
200
+ <params>{"name": "database_expert"}</params>
201
+ </tool_call>
202
+ \`\`\`
203
+
204
+ **details** - Get full information about a tool
205
+ \`\`\`
206
+ <tool_call>
207
+ <tool>tools</tool>
208
+ <action>details</action>
209
+ <params>{"name": "filesystem"}</params>
210
+ </tool_call>
211
+ \`\`\`
212
+ `;
213
+ }
214
+ }
215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC50b29scy5zZWFyY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFnZW50LnRvb2xzLnNlYXJjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssVUFBVSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFcEU7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLGVBQWU7SUFDMUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztJQUNmLFdBQVcsR0FDaEIscUdBQXFHLENBQUM7SUFFakcsT0FBTyxHQUE2QjtRQUN6QztZQUNFLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLDhEQUE4RDtZQUMzRSxVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsVUFBVSxFQUFFO29CQUNWLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRTtpQkFDdkQ7Z0JBQ0QsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDO2FBQ3BCO1NBQ0Y7UUFDRDtZQUNFLElBQUksRUFBRSxNQUFNO1lBQ1osV0FBVyxFQUFFLGdEQUFnRDtZQUM3RCxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUU7U0FDL0M7UUFDRDtZQUNFLElBQUksRUFBRSxVQUFVO1lBQ2hCLFdBQVcsRUFBRSx5REFBeUQ7WUFDdEUsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxRQUFRO2dCQUNkLFVBQVUsRUFBRTtvQkFDVixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSw4QkFBOEIsRUFBRTtpQkFDdEU7Z0JBQ0QsUUFBUSxFQUFFLENBQUMsTUFBTSxD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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push.rocks/smartagent",
3
- "version": "1.6.2",
3
+ "version": "1.8.0",
4
4
  "private": false,
5
5
  "description": "an agentic framework built on top of @push.rocks/smartai",
6
6
  "main": "dist_ts/index.js",
package/readme.hints.md CHANGED
@@ -5,18 +5,64 @@
5
5
 
6
6
  ## Architecture
7
7
  - **DualAgentOrchestrator**: Main entry point, coordinates Driver and Guardian agents
8
- - **DriverAgent**: Reasons about tasks, plans steps, proposes tool calls
8
+ - **DriverAgent**: Reasons about tasks, plans steps, proposes tool calls (supports both XML and native tool calling)
9
9
  - **GuardianAgent**: Evaluates tool calls against configured policies
10
+ - **ToolRegistry**: Manages tool lifecycle, visibility, and discovery
10
11
  - **BaseToolWrapper**: Base class for creating custom tools
11
12
  - **plugins.ts**: Imports and re-exports smartai and other dependencies
12
13
 
13
- ## Standard Tools
14
+ ## Standard Tools (via registerStandardTools)
14
15
  1. **FilesystemTool** - File operations with scoping and exclusion patterns
15
16
  2. **HttpTool** - HTTP requests
16
17
  3. **ShellTool** - Secure shell commands (no injection possible)
17
18
  4. **BrowserTool** - Web page interaction via Puppeteer
18
19
  5. **DenoTool** - Sandboxed TypeScript/JavaScript execution
19
- 6. **JsonValidatorTool** - JSON validation and formatting
20
+
21
+ ## Additional Tools (must register manually)
22
+ 6. **JsonValidatorTool** - JSON validation and formatting (NOT in registerStandardTools)
23
+ 7. **ToolSearchTool** - AI-facing interface for tool discovery and activation
24
+ 8. **ExpertTool** - Wraps a DualAgentOrchestrator as a specialized expert tool
25
+
26
+ ## Tool Visibility System
27
+ Tools can be registered with visibility modes:
28
+ - **initial**: Always visible to Driver, included in system prompt (default)
29
+ - **on-demand**: Only discoverable via search, must be activated before use
30
+
31
+ ```typescript
32
+ // Register with visibility options
33
+ orchestrator.registerTool(myTool, {
34
+ visibility: 'on-demand',
35
+ tags: ['database', 'sql'],
36
+ category: 'data'
37
+ });
38
+ ```
39
+
40
+ ## Expert/SubAgent System
41
+ Experts are specialized agents wrapped as tools, enabling hierarchical agent architectures:
42
+
43
+ ```typescript
44
+ orchestrator.registerExpert({
45
+ name: 'code_reviewer',
46
+ description: 'Reviews code for quality and best practices',
47
+ systemMessage: 'You are a code review expert...',
48
+ guardianPolicy: 'Allow read-only file access',
49
+ tools: [new FilesystemTool()],
50
+ visibility: 'on-demand',
51
+ tags: ['code', 'review']
52
+ });
53
+ ```
54
+
55
+ ## Tool Search
56
+ Enable tool discovery for the Driver:
57
+
58
+ ```typescript
59
+ orchestrator.enableToolSearch();
60
+ // Driver can now use:
61
+ // - tools.search({"query": "database"})
62
+ // - tools.list({})
63
+ // - tools.activate({"name": "database_expert"})
64
+ // - tools.details({"name": "filesystem"})
65
+ ```
20
66
 
21
67
  ## Key Features
22
68
  - Token streaming support (`onToken` callback)
@@ -25,6 +71,17 @@
25
71
  - Scoped filesystem with exclusion patterns
26
72
  - Result truncation with configurable limits
27
73
  - History windowing to manage token usage
74
+ - **Native tool calling mode** (`useNativeToolCalling: true`) for providers like Ollama
75
+ - **Tool visibility system** (initial vs on-demand)
76
+ - **Expert/SubAgent system** for hierarchical agents
77
+ - **Tool search and discovery** via ToolSearchTool
78
+
79
+ ## Native Tool Calling
80
+ When `useNativeToolCalling` is enabled:
81
+ - Uses provider's built-in tool calling API instead of XML parsing
82
+ - Tool names become `toolName_actionName` (e.g., `json_validate`)
83
+ - Streaming includes `[THINKING]` and `[OUTPUT]` markers
84
+ - More efficient for models that support it
28
85
 
29
86
  ## Key Dependencies
30
87
  - `@push.rocks/smartai`: Multi-provider AI interface