@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.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/index.d.ts +3 -0
- package/dist_ts/index.js +6 -1
- package/dist_ts/smartagent.classes.dualagent.d.ts +17 -3
- package/dist_ts/smartagent.classes.dualagent.js +57 -26
- package/dist_ts/smartagent.classes.toolregistry.d.ts +75 -0
- package/dist_ts/smartagent.classes.toolregistry.js +161 -0
- package/dist_ts/smartagent.interfaces.d.ts +52 -0
- package/dist_ts/smartagent.interfaces.js +1 -1
- package/dist_ts/smartagent.tools.expert.d.ts +27 -0
- package/dist_ts/smartagent.tools.expert.js +126 -0
- package/dist_ts/smartagent.tools.search.d.ts +29 -0
- package/dist_ts/smartagent.tools.search.js +215 -0
- package/package.json +1 -1
- package/readme.hints.md +60 -3
- package/readme.md +205 -11
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +7 -0
- package/ts/smartagent.classes.dualagent.ts +63 -28
- package/ts/smartagent.classes.toolregistry.ts +188 -0
- package/ts/smartagent.interfaces.ts +60 -0
- package/ts/smartagent.tools.expert.ts +144 -0
- package/ts/smartagent.tools.search.ts +237 -0
|
@@ -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
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
|
-
|
|
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
|