@agenticc/core 1.0.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/LICENSE +21 -0
- package/README.md +370 -0
- package/README.zh-CN.md +372 -0
- package/dist/audit/index.d.ts +9 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +9 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/logger.d.ts +211 -0
- package/dist/audit/logger.d.ts.map +1 -0
- package/dist/audit/logger.js +268 -0
- package/dist/audit/logger.js.map +1 -0
- package/dist/audit/query.d.ts +164 -0
- package/dist/audit/query.d.ts.map +1 -0
- package/dist/audit/query.js +250 -0
- package/dist/audit/query.js.map +1 -0
- package/dist/conversation/context-builder.d.ts +119 -0
- package/dist/conversation/context-builder.d.ts.map +1 -0
- package/dist/conversation/context-builder.js +252 -0
- package/dist/conversation/context-builder.js.map +1 -0
- package/dist/conversation/index.d.ts +10 -0
- package/dist/conversation/index.d.ts.map +1 -0
- package/dist/conversation/index.js +10 -0
- package/dist/conversation/index.js.map +1 -0
- package/dist/conversation/message-store.d.ts +231 -0
- package/dist/conversation/message-store.d.ts.map +1 -0
- package/dist/conversation/message-store.js +404 -0
- package/dist/conversation/message-store.js.map +1 -0
- package/dist/conversation/session.d.ts +201 -0
- package/dist/conversation/session.d.ts.map +1 -0
- package/dist/conversation/session.js +285 -0
- package/dist/conversation/session.js.map +1 -0
- package/dist/core/agent.d.ts +277 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +674 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/agentic-loop.d.ts +98 -0
- package/dist/core/agentic-loop.d.ts.map +1 -0
- package/dist/core/agentic-loop.js +496 -0
- package/dist/core/agentic-loop.js.map +1 -0
- package/dist/core/index.d.ts +14 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +14 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/intent-parser.d.ts +101 -0
- package/dist/core/intent-parser.d.ts.map +1 -0
- package/dist/core/intent-parser.js +221 -0
- package/dist/core/intent-parser.js.map +1 -0
- package/dist/core/plan-generator.d.ts +133 -0
- package/dist/core/plan-generator.d.ts.map +1 -0
- package/dist/core/plan-generator.js +294 -0
- package/dist/core/plan-generator.js.map +1 -0
- package/dist/core/plugin-manager.d.ts +120 -0
- package/dist/core/plugin-manager.d.ts.map +1 -0
- package/dist/core/plugin-manager.js +369 -0
- package/dist/core/plugin-manager.js.map +1 -0
- package/dist/core/response-handler.d.ts +141 -0
- package/dist/core/response-handler.d.ts.map +1 -0
- package/dist/core/response-handler.js +384 -0
- package/dist/core/response-handler.js.map +1 -0
- package/dist/core/tool-executor.d.ts +143 -0
- package/dist/core/tool-executor.d.ts.map +1 -0
- package/dist/core/tool-executor.js +354 -0
- package/dist/core/tool-executor.js.map +1 -0
- package/dist/core/tool-registry.d.ts +133 -0
- package/dist/core/tool-registry.d.ts.map +1 -0
- package/dist/core/tool-registry.js +252 -0
- package/dist/core/tool-registry.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/chunker.d.ts +78 -0
- package/dist/knowledge/chunker.d.ts.map +1 -0
- package/dist/knowledge/chunker.js +233 -0
- package/dist/knowledge/chunker.js.map +1 -0
- package/dist/knowledge/embedder.d.ts +93 -0
- package/dist/knowledge/embedder.d.ts.map +1 -0
- package/dist/knowledge/embedder.js +205 -0
- package/dist/knowledge/embedder.js.map +1 -0
- package/dist/knowledge/index.d.ts +10 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +11 -0
- package/dist/knowledge/index.js.map +1 -0
- package/dist/knowledge/loaders/index.d.ts +10 -0
- package/dist/knowledge/loaders/index.d.ts.map +1 -0
- package/dist/knowledge/loaders/index.js +10 -0
- package/dist/knowledge/loaders/index.js.map +1 -0
- package/dist/knowledge/loaders/markdown.d.ts +88 -0
- package/dist/knowledge/loaders/markdown.d.ts.map +1 -0
- package/dist/knowledge/loaders/markdown.js +205 -0
- package/dist/knowledge/loaders/markdown.js.map +1 -0
- package/dist/knowledge/loaders/yaml.d.ts +112 -0
- package/dist/knowledge/loaders/yaml.d.ts.map +1 -0
- package/dist/knowledge/loaders/yaml.js +368 -0
- package/dist/knowledge/loaders/yaml.js.map +1 -0
- package/dist/knowledge/retriever.d.ts +144 -0
- package/dist/knowledge/retriever.d.ts.map +1 -0
- package/dist/knowledge/retriever.js +399 -0
- package/dist/knowledge/retriever.js.map +1 -0
- package/dist/knowledge/store.d.ts +146 -0
- package/dist/knowledge/store.d.ts.map +1 -0
- package/dist/knowledge/store.js +420 -0
- package/dist/knowledge/store.js.map +1 -0
- package/dist/llm/adapter.d.ts +194 -0
- package/dist/llm/adapter.d.ts.map +1 -0
- package/dist/llm/adapter.js +42 -0
- package/dist/llm/adapter.js.map +1 -0
- package/dist/llm/adapters/anyrouter.d.ts +84 -0
- package/dist/llm/adapters/anyrouter.d.ts.map +1 -0
- package/dist/llm/adapters/anyrouter.js +372 -0
- package/dist/llm/adapters/anyrouter.js.map +1 -0
- package/dist/llm/adapters/claude.d.ts +66 -0
- package/dist/llm/adapters/claude.d.ts.map +1 -0
- package/dist/llm/adapters/claude.js +323 -0
- package/dist/llm/adapters/claude.js.map +1 -0
- package/dist/llm/adapters/index.d.ts +12 -0
- package/dist/llm/adapters/index.d.ts.map +1 -0
- package/dist/llm/adapters/index.js +12 -0
- package/dist/llm/adapters/index.js.map +1 -0
- package/dist/llm/adapters/mimo.d.ts +85 -0
- package/dist/llm/adapters/mimo.d.ts.map +1 -0
- package/dist/llm/adapters/mimo.js +316 -0
- package/dist/llm/adapters/mimo.js.map +1 -0
- package/dist/llm/adapters/openai.d.ts +53 -0
- package/dist/llm/adapters/openai.d.ts.map +1 -0
- package/dist/llm/adapters/openai.js +293 -0
- package/dist/llm/adapters/openai.js.map +1 -0
- package/dist/llm/adapters/qwen.d.ts +53 -0
- package/dist/llm/adapters/qwen.d.ts.map +1 -0
- package/dist/llm/adapters/qwen.js +299 -0
- package/dist/llm/adapters/qwen.js.map +1 -0
- package/dist/llm/adapters/siliconflow.d.ts +69 -0
- package/dist/llm/adapters/siliconflow.d.ts.map +1 -0
- package/dist/llm/adapters/siliconflow.js +331 -0
- package/dist/llm/adapters/siliconflow.js.map +1 -0
- package/dist/llm/index.d.ts +9 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +12 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/manager.d.ts +97 -0
- package/dist/llm/manager.d.ts.map +1 -0
- package/dist/llm/manager.js +337 -0
- package/dist/llm/manager.js.map +1 -0
- package/dist/test-utils/arbitraries.d.ts +230 -0
- package/dist/test-utils/arbitraries.d.ts.map +1 -0
- package/dist/test-utils/arbitraries.js +280 -0
- package/dist/test-utils/arbitraries.js.map +1 -0
- package/dist/test-utils/cleanup.d.ts +184 -0
- package/dist/test-utils/cleanup.d.ts.map +1 -0
- package/dist/test-utils/cleanup.js +282 -0
- package/dist/test-utils/cleanup.js.map +1 -0
- package/dist/test-utils/config.d.ts +80 -0
- package/dist/test-utils/config.d.ts.map +1 -0
- package/dist/test-utils/config.js +94 -0
- package/dist/test-utils/config.js.map +1 -0
- package/dist/test-utils/index.d.ts +10 -0
- package/dist/test-utils/index.d.ts.map +1 -0
- package/dist/test-utils/index.js +36 -0
- package/dist/test-utils/index.js.map +1 -0
- package/dist/test-utils/mocks.d.ts +170 -0
- package/dist/test-utils/mocks.d.ts.map +1 -0
- package/dist/test-utils/mocks.js +281 -0
- package/dist/test-utils/mocks.js.map +1 -0
- package/dist/types/config.d.ts +170 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +120 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/knowledge.d.ts +95 -0
- package/dist/types/knowledge.d.ts.map +1 -0
- package/dist/types/knowledge.js +7 -0
- package/dist/types/knowledge.js.map +1 -0
- package/dist/types/loop.d.ts +148 -0
- package/dist/types/loop.d.ts.map +1 -0
- package/dist/types/loop.js +16 -0
- package/dist/types/loop.js.map +1 -0
- package/dist/types/plugin.d.ts +137 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +15 -0
- package/dist/types/plugin.js.map +1 -0
- package/dist/types/response.d.ts +186 -0
- package/dist/types/response.d.ts.map +1 -0
- package/dist/types/response.js +99 -0
- package/dist/types/response.js.map +1 -0
- package/dist/types/streaming.d.ts +478 -0
- package/dist/types/streaming.d.ts.map +1 -0
- package/dist/types/streaming.js +483 -0
- package/dist/types/streaming.js.map +1 -0
- package/dist/types/tool.d.ts +118 -0
- package/dist/types/tool.d.ts.map +1 -0
- package/dist/types/tool.js +42 -0
- package/dist/types/tool.js.map +1 -0
- package/dist/utils/error.d.ts +22 -0
- package/dist/utils/error.d.ts.map +1 -0
- package/dist/utils/error.js +36 -0
- package/dist/utils/error.js.map +1 -0
- package/package.json +102 -0
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages plugin lifecycle, tool registration, and namespace handling.
|
|
5
|
+
* Provides dependency injection for plugins through PluginContext.
|
|
6
|
+
*
|
|
7
|
+
* @module core/plugin-manager
|
|
8
|
+
*/
|
|
9
|
+
import { DEFAULT_PLUGIN_MANAGER_OPTIONS } from '../types/plugin.js';
|
|
10
|
+
import { toolToDefinition } from '../types/tool.js';
|
|
11
|
+
/**
|
|
12
|
+
* Error thrown when plugin operations fail
|
|
13
|
+
*/
|
|
14
|
+
export class PluginError extends Error {
|
|
15
|
+
pluginName;
|
|
16
|
+
reason;
|
|
17
|
+
constructor(message, pluginName, reason) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.pluginName = pluginName;
|
|
20
|
+
this.reason = reason;
|
|
21
|
+
this.name = 'PluginError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Plugin Manager
|
|
26
|
+
*
|
|
27
|
+
* Handles plugin loading, unloading, and tool management.
|
|
28
|
+
* Supports namespace-based tool isolation, dependency injection, and dependency resolution.
|
|
29
|
+
*/
|
|
30
|
+
export class PluginManager {
|
|
31
|
+
plugins = new Map();
|
|
32
|
+
allTools = new Map();
|
|
33
|
+
options;
|
|
34
|
+
context;
|
|
35
|
+
loadingPlugins = new Set(); // Track plugins currently being loaded (for circular dependency detection)
|
|
36
|
+
constructor(options = {}) {
|
|
37
|
+
this.options = { ...DEFAULT_PLUGIN_MANAGER_OPTIONS, ...options };
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Set the plugin context for dependency injection
|
|
41
|
+
*/
|
|
42
|
+
setContext(context) {
|
|
43
|
+
this.context = context;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Load a plugin
|
|
47
|
+
*
|
|
48
|
+
* @param plugin - The plugin to load
|
|
49
|
+
* @throws PluginError if loading fails
|
|
50
|
+
*/
|
|
51
|
+
async load(plugin) {
|
|
52
|
+
// Validate plugin
|
|
53
|
+
if (this.options.strictValidation) {
|
|
54
|
+
this.validatePlugin(plugin);
|
|
55
|
+
}
|
|
56
|
+
// Check for duplicate plugin
|
|
57
|
+
if (this.plugins.has(plugin.name)) {
|
|
58
|
+
throw new PluginError(`Plugin already loaded: ${plugin.name}`, plugin.name, 'A plugin with this name is already loaded');
|
|
59
|
+
}
|
|
60
|
+
// Check for circular dependencies
|
|
61
|
+
if (this.loadingPlugins.has(plugin.name)) {
|
|
62
|
+
throw new PluginError(`Circular dependency detected for plugin: ${plugin.name}`, plugin.name, 'Plugin has a circular dependency');
|
|
63
|
+
}
|
|
64
|
+
// Load dependencies first
|
|
65
|
+
if (plugin.dependencies && plugin.dependencies.length > 0) {
|
|
66
|
+
this.loadingPlugins.add(plugin.name);
|
|
67
|
+
try {
|
|
68
|
+
await this.loadDependencies(plugin);
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
this.loadingPlugins.delete(plugin.name);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Create plugin state
|
|
75
|
+
const state = {
|
|
76
|
+
plugin,
|
|
77
|
+
status: 'loading',
|
|
78
|
+
tools: new Map(),
|
|
79
|
+
};
|
|
80
|
+
this.plugins.set(plugin.name, state);
|
|
81
|
+
try {
|
|
82
|
+
// Call lifecycle hooks (initialize/onLoad) if defined
|
|
83
|
+
// Support both naming conventions for backward compatibility
|
|
84
|
+
const initHook = plugin.initialize || plugin.onLoad;
|
|
85
|
+
if (initHook && this.context) {
|
|
86
|
+
await initHook.call(plugin, this.context);
|
|
87
|
+
}
|
|
88
|
+
// Register tools with namespace
|
|
89
|
+
for (const tool of plugin.tools) {
|
|
90
|
+
const namespacedName = this.getNamespacedToolName(tool.name, plugin.namespace);
|
|
91
|
+
// Check for conflicts
|
|
92
|
+
if (this.allTools.has(namespacedName)) {
|
|
93
|
+
this.handleConflict(namespacedName, plugin.name);
|
|
94
|
+
if (this.options.conflictStrategy === 'skip') {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Create namespaced tool
|
|
99
|
+
const namespacedTool = {
|
|
100
|
+
...tool,
|
|
101
|
+
name: namespacedName,
|
|
102
|
+
};
|
|
103
|
+
state.tools.set(namespacedName, namespacedTool);
|
|
104
|
+
this.allTools.set(namespacedName, namespacedTool);
|
|
105
|
+
}
|
|
106
|
+
state.status = 'loaded';
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
state.status = 'error';
|
|
110
|
+
state.error = error instanceof Error ? error.message : String(error);
|
|
111
|
+
// Cleanup any registered tools
|
|
112
|
+
for (const toolName of state.tools.keys()) {
|
|
113
|
+
this.allTools.delete(toolName);
|
|
114
|
+
}
|
|
115
|
+
state.tools.clear();
|
|
116
|
+
throw new PluginError(`Failed to load plugin: ${plugin.name}`, plugin.name, state.error);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Load plugin dependencies
|
|
121
|
+
* @private
|
|
122
|
+
*/
|
|
123
|
+
async loadDependencies(plugin) {
|
|
124
|
+
if (!plugin.dependencies || plugin.dependencies.length === 0) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
for (const depName of plugin.dependencies) {
|
|
128
|
+
if (!this.plugins.has(depName)) {
|
|
129
|
+
throw new PluginError(`Missing dependency for plugin ${plugin.name}: ${depName}`, plugin.name, `Plugin ${depName} must be loaded before ${plugin.name}`);
|
|
130
|
+
}
|
|
131
|
+
const depState = this.plugins.get(depName);
|
|
132
|
+
if (depState?.status !== 'loaded') {
|
|
133
|
+
throw new PluginError(`Dependency not ready for plugin ${plugin.name}: ${depName}`, plugin.name, `Plugin ${depName} is in status ${depState?.status}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Unload a plugin
|
|
139
|
+
*
|
|
140
|
+
* @param pluginName - Name of the plugin to unload
|
|
141
|
+
* @returns true if unloaded, false if not found
|
|
142
|
+
*/
|
|
143
|
+
async unload(pluginName) {
|
|
144
|
+
const state = this.plugins.get(pluginName);
|
|
145
|
+
if (!state) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
// Call lifecycle hooks (cleanup/onUnload) if defined
|
|
150
|
+
// Support both naming conventions for backward compatibility
|
|
151
|
+
const cleanupHook = state.plugin.cleanup || state.plugin.onUnload;
|
|
152
|
+
if (cleanupHook) {
|
|
153
|
+
await cleanupHook.call(state.plugin);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
// Log but don't throw - we still want to clean up
|
|
158
|
+
console.error(`Error during plugin unload: ${pluginName}`, error);
|
|
159
|
+
}
|
|
160
|
+
// Remove all tools
|
|
161
|
+
for (const toolName of state.tools.keys()) {
|
|
162
|
+
this.allTools.delete(toolName);
|
|
163
|
+
}
|
|
164
|
+
// Remove plugin
|
|
165
|
+
this.plugins.delete(pluginName);
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get a plugin by name
|
|
170
|
+
*/
|
|
171
|
+
getPlugin(name) {
|
|
172
|
+
return this.plugins.get(name)?.plugin;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Check if a plugin is loaded
|
|
176
|
+
*/
|
|
177
|
+
hasPlugin(name) {
|
|
178
|
+
return this.plugins.has(name);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* List all loaded plugins
|
|
182
|
+
*/
|
|
183
|
+
listPlugins() {
|
|
184
|
+
return Array.from(this.plugins.values()).map((state) => ({
|
|
185
|
+
name: state.plugin.name,
|
|
186
|
+
version: state.plugin.version,
|
|
187
|
+
description: state.plugin.description,
|
|
188
|
+
namespace: state.plugin.namespace,
|
|
189
|
+
toolCount: state.tools.size,
|
|
190
|
+
toolNames: Array.from(state.tools.keys()),
|
|
191
|
+
status: state.status,
|
|
192
|
+
error: state.error,
|
|
193
|
+
}));
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get a tool by name
|
|
197
|
+
*/
|
|
198
|
+
getTool(name) {
|
|
199
|
+
return this.allTools.get(name);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Check if a tool exists
|
|
203
|
+
*/
|
|
204
|
+
hasTool(name) {
|
|
205
|
+
return this.allTools.has(name);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* List all tools
|
|
209
|
+
*/
|
|
210
|
+
listTools() {
|
|
211
|
+
return Array.from(this.allTools.values());
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* List tool names
|
|
215
|
+
*/
|
|
216
|
+
listToolNames() {
|
|
217
|
+
return Array.from(this.allTools.keys());
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Get tool definitions for LLM Function Calling
|
|
221
|
+
*/
|
|
222
|
+
getToolDefinitions() {
|
|
223
|
+
return this.listTools().map((tool) => toolToDefinition(tool));
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Get the number of loaded plugins
|
|
227
|
+
*/
|
|
228
|
+
get pluginCount() {
|
|
229
|
+
return this.plugins.size;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Get the number of registered tools
|
|
233
|
+
*/
|
|
234
|
+
get toolCount() {
|
|
235
|
+
return this.allTools.size;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Clear all plugins
|
|
239
|
+
*/
|
|
240
|
+
async clear() {
|
|
241
|
+
const pluginNames = Array.from(this.plugins.keys());
|
|
242
|
+
for (const name of pluginNames) {
|
|
243
|
+
await this.unload(name);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Run health checks on all plugins
|
|
248
|
+
*/
|
|
249
|
+
async healthCheck() {
|
|
250
|
+
const results = new Map();
|
|
251
|
+
for (const [name, state] of this.plugins) {
|
|
252
|
+
if (state.plugin.healthCheck) {
|
|
253
|
+
try {
|
|
254
|
+
results.set(name, await state.plugin.healthCheck());
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
results.set(name, false);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
results.set(name, state.status === 'loaded');
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return results;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Get namespaced tool name
|
|
268
|
+
*/
|
|
269
|
+
getNamespacedToolName(toolName, namespace) {
|
|
270
|
+
if (!this.options.autoNamespace || !namespace) {
|
|
271
|
+
return toolName;
|
|
272
|
+
}
|
|
273
|
+
return `${namespace}_${toolName}`;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Handle tool name conflict
|
|
277
|
+
*/
|
|
278
|
+
handleConflict(toolName, pluginName) {
|
|
279
|
+
switch (this.options.conflictStrategy) {
|
|
280
|
+
case 'error':
|
|
281
|
+
throw new PluginError(`Tool name conflict: ${toolName}`, pluginName, 'A tool with this name already exists');
|
|
282
|
+
case 'replace':
|
|
283
|
+
// Will be replaced in the calling code
|
|
284
|
+
break;
|
|
285
|
+
case 'skip':
|
|
286
|
+
// Will be skipped in the calling code
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Validate plugin definition
|
|
292
|
+
*/
|
|
293
|
+
validatePlugin(plugin) {
|
|
294
|
+
if (!plugin.name || typeof plugin.name !== 'string') {
|
|
295
|
+
throw new PluginError('Invalid plugin name', plugin.name || 'unknown', 'Plugin name must be a non-empty string');
|
|
296
|
+
}
|
|
297
|
+
if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(plugin.name)) {
|
|
298
|
+
throw new PluginError(`Invalid plugin name format: ${plugin.name}`, plugin.name, 'Plugin name must start with a letter and contain only alphanumeric characters, underscores, and hyphens');
|
|
299
|
+
}
|
|
300
|
+
if (!plugin.version || typeof plugin.version !== 'string') {
|
|
301
|
+
throw new PluginError(`Invalid plugin version for ${plugin.name}`, plugin.name, 'Plugin version must be a non-empty string');
|
|
302
|
+
}
|
|
303
|
+
if (!plugin.description || typeof plugin.description !== 'string') {
|
|
304
|
+
throw new PluginError(`Invalid plugin description for ${plugin.name}`, plugin.name, 'Plugin description must be a non-empty string');
|
|
305
|
+
}
|
|
306
|
+
if (!Array.isArray(plugin.tools)) {
|
|
307
|
+
throw new PluginError(`Invalid tools for plugin ${plugin.name}`, plugin.name, 'Plugin tools must be an array');
|
|
308
|
+
}
|
|
309
|
+
// Validate each tool
|
|
310
|
+
for (const tool of plugin.tools) {
|
|
311
|
+
this.validateTool(tool, plugin.name);
|
|
312
|
+
}
|
|
313
|
+
// Validate namespace format if provided
|
|
314
|
+
if (plugin.namespace && !/^[a-zA-Z][a-zA-Z0-9_]*$/.test(plugin.namespace)) {
|
|
315
|
+
throw new PluginError(`Invalid namespace format for plugin ${plugin.name}`, plugin.name, 'Namespace must start with a letter and contain only alphanumeric characters and underscores');
|
|
316
|
+
}
|
|
317
|
+
// Validate dependencies if provided
|
|
318
|
+
if (plugin.dependencies) {
|
|
319
|
+
if (!Array.isArray(plugin.dependencies)) {
|
|
320
|
+
throw new PluginError(`Invalid dependencies for plugin ${plugin.name}`, plugin.name, 'Plugin dependencies must be an array');
|
|
321
|
+
}
|
|
322
|
+
for (const dep of plugin.dependencies) {
|
|
323
|
+
if (typeof dep !== 'string' || !dep) {
|
|
324
|
+
throw new PluginError(`Invalid dependency in plugin ${plugin.name}`, plugin.name, 'Each dependency must be a non-empty string');
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Validate tool definition
|
|
331
|
+
*/
|
|
332
|
+
validateTool(tool, pluginName) {
|
|
333
|
+
if (!tool.name || typeof tool.name !== 'string') {
|
|
334
|
+
throw new PluginError(`Invalid tool name in plugin ${pluginName}`, pluginName, 'Tool name must be a non-empty string');
|
|
335
|
+
}
|
|
336
|
+
if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(tool.name)) {
|
|
337
|
+
throw new PluginError(`Invalid tool name format in plugin ${pluginName}: ${tool.name}`, pluginName, 'Tool name must start with a letter and contain only alphanumeric characters, underscores, and hyphens');
|
|
338
|
+
}
|
|
339
|
+
if (!tool.description || typeof tool.description !== 'string') {
|
|
340
|
+
throw new PluginError(`Invalid tool description in plugin ${pluginName}: ${tool.name}`, pluginName, 'Tool description must be a non-empty string');
|
|
341
|
+
}
|
|
342
|
+
if (!Array.isArray(tool.parameters)) {
|
|
343
|
+
throw new PluginError(`Invalid tool parameters in plugin ${pluginName}: ${tool.name}`, pluginName, 'Tool parameters must be an array');
|
|
344
|
+
}
|
|
345
|
+
// Validate each parameter
|
|
346
|
+
for (const param of tool.parameters) {
|
|
347
|
+
if (!param.name || typeof param.name !== 'string' || param.name.trim() === '') {
|
|
348
|
+
throw new PluginError(`Invalid parameter name in tool ${tool.name} of plugin ${pluginName}`, pluginName, 'Parameter name must be a non-empty string');
|
|
349
|
+
}
|
|
350
|
+
if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(param.name)) {
|
|
351
|
+
throw new PluginError(`Invalid parameter name format "${param.name}" in tool ${tool.name} of plugin ${pluginName}`, pluginName, 'Parameter name must start with a letter and contain only alphanumeric characters and underscores');
|
|
352
|
+
}
|
|
353
|
+
if (!param.type || typeof param.type !== 'string') {
|
|
354
|
+
throw new PluginError(`Invalid parameter type in tool ${tool.name} of plugin ${pluginName}`, pluginName, 'Parameter type must be a non-empty string');
|
|
355
|
+
}
|
|
356
|
+
const validTypes = ['string', 'number', 'boolean', 'object', 'array'];
|
|
357
|
+
if (!validTypes.includes(param.type)) {
|
|
358
|
+
throw new PluginError(`Invalid parameter type "${param.type}" in tool ${tool.name} of plugin ${pluginName}`, pluginName, `Parameter type must be one of: ${validTypes.join(', ')}`);
|
|
359
|
+
}
|
|
360
|
+
if (typeof param.required !== 'boolean') {
|
|
361
|
+
throw new PluginError(`Invalid parameter required field in tool ${tool.name} of plugin ${pluginName}`, pluginName, 'Parameter required field must be a boolean');
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (typeof tool.execute !== 'function') {
|
|
365
|
+
throw new PluginError(`Invalid tool execute function in plugin ${pluginName}: ${tool.name}`, pluginName, 'Tool execute must be a function');
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
//# sourceMappingURL=plugin-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-manager.js","sourceRoot":"","sources":["../../src/core/plugin-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response Handler
|
|
3
|
+
*
|
|
4
|
+
* Generates appropriate responses based on execution results,
|
|
5
|
+
* knowledge assessment, and user interaction needs.
|
|
6
|
+
*
|
|
7
|
+
* _Requirements: 1.4, 5.1-5.5_
|
|
8
|
+
*/
|
|
9
|
+
import type { LLMManager } from '../llm/manager.js';
|
|
10
|
+
import type { ChatMessage } from '../llm/adapter.js';
|
|
11
|
+
import type { AgentResponse, ExecuteResponse, ToolCallRecord } from '../types/response.js';
|
|
12
|
+
import type { KnowledgeAssessment, SearchResult } from '../types/knowledge.js';
|
|
13
|
+
import type { ToolExecutionResult } from './tool-executor.js';
|
|
14
|
+
import type { ExecutionPlan } from './plan-generator.js';
|
|
15
|
+
import type { DetailedIntent } from './intent-parser.js';
|
|
16
|
+
/**
|
|
17
|
+
* Response handler configuration
|
|
18
|
+
*/
|
|
19
|
+
export interface ResponseHandlerConfig {
|
|
20
|
+
/** System prompt for response generation */
|
|
21
|
+
systemPrompt?: string;
|
|
22
|
+
/** Whether to include tool call details in responses */
|
|
23
|
+
includeToolDetails?: boolean;
|
|
24
|
+
/** Maximum response length */
|
|
25
|
+
maxResponseLength?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Context for response generation
|
|
29
|
+
*/
|
|
30
|
+
export interface ResponseContext {
|
|
31
|
+
/** Original user message */
|
|
32
|
+
userMessage: string;
|
|
33
|
+
/** Parsed intent */
|
|
34
|
+
intent: DetailedIntent;
|
|
35
|
+
/** Knowledge assessment */
|
|
36
|
+
knowledgeAssessment?: KnowledgeAssessment;
|
|
37
|
+
/** Search results */
|
|
38
|
+
searchResults?: SearchResult[];
|
|
39
|
+
/** Execution plan */
|
|
40
|
+
plan?: ExecutionPlan;
|
|
41
|
+
/** Tool execution results */
|
|
42
|
+
executionResults?: ToolExecutionResult[];
|
|
43
|
+
/** Conversation history */
|
|
44
|
+
history?: ChatMessage[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Response Handler
|
|
48
|
+
*
|
|
49
|
+
* Determines the appropriate response type and generates responses
|
|
50
|
+
* based on the current state of agent processing.
|
|
51
|
+
*/
|
|
52
|
+
export declare class ResponseHandler {
|
|
53
|
+
private llmManager;
|
|
54
|
+
private config;
|
|
55
|
+
constructor(llmManager: LLMManager, config?: ResponseHandlerConfig);
|
|
56
|
+
/**
|
|
57
|
+
* Generate an appropriate response based on context
|
|
58
|
+
*/
|
|
59
|
+
generateResponse(context: ResponseContext): Promise<AgentResponse>;
|
|
60
|
+
/**
|
|
61
|
+
* Check if knowledge request is needed
|
|
62
|
+
*/
|
|
63
|
+
private shouldRequestKnowledge;
|
|
64
|
+
/**
|
|
65
|
+
* Check if clarification is needed
|
|
66
|
+
*/
|
|
67
|
+
private shouldRequestClarification;
|
|
68
|
+
/**
|
|
69
|
+
* Check if confirmation is needed
|
|
70
|
+
*/
|
|
71
|
+
private shouldRequestConfirmation;
|
|
72
|
+
/**
|
|
73
|
+
* Check if options should be presented
|
|
74
|
+
*/
|
|
75
|
+
private shouldPresentOptions;
|
|
76
|
+
/**
|
|
77
|
+
* Create a knowledge request response
|
|
78
|
+
*/
|
|
79
|
+
private createKnowledgeRequestResponse;
|
|
80
|
+
/**
|
|
81
|
+
* Create a clarify response
|
|
82
|
+
*/
|
|
83
|
+
private createClarifyResponse;
|
|
84
|
+
/**
|
|
85
|
+
* Generate clarifying questions using LLM
|
|
86
|
+
*/
|
|
87
|
+
private generateClarifyingQuestions;
|
|
88
|
+
/**
|
|
89
|
+
* Create a confirm response
|
|
90
|
+
*/
|
|
91
|
+
private createConfirmResponse;
|
|
92
|
+
/**
|
|
93
|
+
* Generate a preview of the execution plan
|
|
94
|
+
*/
|
|
95
|
+
private generatePlanPreview;
|
|
96
|
+
/**
|
|
97
|
+
* Create an options response
|
|
98
|
+
*/
|
|
99
|
+
private createOptionsResponse;
|
|
100
|
+
/**
|
|
101
|
+
* Create an execute response
|
|
102
|
+
*/
|
|
103
|
+
private createExecuteResponse;
|
|
104
|
+
/**
|
|
105
|
+
* Build tool call records from execution results
|
|
106
|
+
*/
|
|
107
|
+
private buildToolCallRecords;
|
|
108
|
+
/**
|
|
109
|
+
* Generate execute response message using LLM
|
|
110
|
+
*/
|
|
111
|
+
private generateExecuteMessage;
|
|
112
|
+
/**
|
|
113
|
+
* Build prompt for execute message generation
|
|
114
|
+
*/
|
|
115
|
+
private buildExecuteMessagePrompt;
|
|
116
|
+
/**
|
|
117
|
+
* Generate message when no action was taken
|
|
118
|
+
*/
|
|
119
|
+
private generateNoActionMessage;
|
|
120
|
+
/**
|
|
121
|
+
* Generate fallback message when LLM fails
|
|
122
|
+
*/
|
|
123
|
+
private generateFallbackMessage;
|
|
124
|
+
/**
|
|
125
|
+
* Collect data from execution results
|
|
126
|
+
*/
|
|
127
|
+
private collectExecutionData;
|
|
128
|
+
/**
|
|
129
|
+
* Create a simple execute response without LLM
|
|
130
|
+
*/
|
|
131
|
+
createSimpleExecuteResponse(message: string, data?: unknown, toolCalls?: ToolCallRecord[]): ExecuteResponse;
|
|
132
|
+
/**
|
|
133
|
+
* Create an error response
|
|
134
|
+
*/
|
|
135
|
+
createErrorResponse(error: Error | string): ExecuteResponse;
|
|
136
|
+
/**
|
|
137
|
+
* Get current configuration
|
|
138
|
+
*/
|
|
139
|
+
getConfig(): Required<ResponseHandlerConfig>;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=response-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-handler.d.ts","sourceRoot":"","sources":["../../src/core/response-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EAKf,cAAc,EAGf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,8BAA8B;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAOD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,2BAA2B;IAC3B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,qBAAqB;IACrB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,qBAAqB;IACrB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,6BAA6B;IAC7B,gBAAgB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACzC,2BAA2B;IAC3B,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;CACzB;AAED;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAkC;gBAEpC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,qBAAqB;IASlE;;OAEG;IACG,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC;IAiCxE;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAK9B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAmBlC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAIjC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAS5B;;OAEG;IACH,OAAO,CAAC,8BAA8B;IA0CtC;;OAEG;YACW,qBAAqB;IAUnC;;OAEG;YACW,2BAA2B;IAoCzC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;YACW,qBAAqB;IAkBnC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;OAEG;YACW,sBAAsB;IAiCpC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA0BjC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAO/B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAoB/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;OAEG;IACH,2BAA2B,CACzB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,OAAO,EACd,SAAS,CAAC,EAAE,cAAc,EAAE,GAC3B,eAAe;IASlB;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,eAAe;IAS3D;;OAEG;IACH,SAAS,IAAI,QAAQ,CAAC,qBAAqB,CAAC;CAG7C"}
|