@hashgraphonline/conversational-agent 0.1.215 → 0.1.217
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/cjs/conversational-agent.d.ts +8 -0
- package/dist/cjs/core/ToolRegistry.d.ts +130 -0
- package/dist/cjs/execution/ExecutionPipeline.d.ts +81 -0
- package/dist/cjs/forms/FormEngine.d.ts +121 -0
- package/dist/cjs/forms/form-generator.d.ts +39 -2
- package/dist/cjs/forms/types.d.ts +21 -2
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.ts +3 -4
- package/dist/cjs/langchain/FormAwareAgentExecutor.d.ts +53 -4
- package/dist/cjs/langchain/FormValidatingToolWrapper.d.ts +43 -6
- package/dist/cjs/langchain-agent.d.ts +49 -0
- package/dist/cjs/memory/ContentStorage.d.ts +7 -0
- package/dist/cjs/memory/SmartMemoryManager.d.ts +1 -0
- package/dist/cjs/services/ContentStoreManager.d.ts +11 -1
- package/dist/cjs/utils/ResponseFormatter.d.ts +26 -0
- package/dist/esm/index.js +2 -6
- package/dist/esm/index12.js +1 -1
- package/dist/esm/index12.js.map +1 -1
- package/dist/esm/index14.js +23 -5
- package/dist/esm/index14.js.map +1 -1
- package/dist/esm/index15.js +25 -4
- package/dist/esm/index15.js.map +1 -1
- package/dist/esm/index16.js +4 -2
- package/dist/esm/index16.js.map +1 -1
- package/dist/esm/index17.js +2 -7
- package/dist/esm/index17.js.map +1 -1
- package/dist/esm/index18.js +292 -150
- package/dist/esm/index18.js.map +1 -1
- package/dist/esm/index19.js +158 -65
- package/dist/esm/index19.js.map +1 -1
- package/dist/esm/index20.js +94 -270
- package/dist/esm/index20.js.map +1 -1
- package/dist/esm/index21.js +1 -1
- package/dist/esm/index23.js +14 -0
- package/dist/esm/index23.js.map +1 -1
- package/dist/esm/index24.js +508 -12
- package/dist/esm/index24.js.map +1 -1
- package/dist/esm/index25.js +1 -1
- package/dist/esm/index25.js.map +1 -1
- package/dist/esm/index26.js +1 -1
- package/dist/esm/index26.js.map +1 -1
- package/dist/esm/index27.js +189 -128
- package/dist/esm/index27.js.map +1 -1
- package/dist/esm/index28.js +164 -45
- package/dist/esm/index28.js.map +1 -1
- package/dist/esm/index29.js +302 -24
- package/dist/esm/index29.js.map +1 -1
- package/dist/esm/index30.js +144 -80
- package/dist/esm/index30.js.map +1 -1
- package/dist/esm/index31.js +63 -7
- package/dist/esm/index31.js.map +1 -1
- package/dist/esm/index32.js +24 -236
- package/dist/esm/index32.js.map +1 -1
- package/dist/esm/index33.js +95 -0
- package/dist/esm/index33.js.map +1 -0
- package/dist/esm/index34.js +245 -0
- package/dist/esm/index34.js.map +1 -0
- package/dist/esm/index5.js.map +1 -1
- package/dist/esm/index6.js +61 -22
- package/dist/esm/index6.js.map +1 -1
- package/dist/esm/index8.js +653 -131
- package/dist/esm/index8.js.map +1 -1
- package/dist/types/conversational-agent.d.ts +8 -0
- package/dist/types/core/ToolRegistry.d.ts +130 -0
- package/dist/types/execution/ExecutionPipeline.d.ts +81 -0
- package/dist/types/forms/FormEngine.d.ts +121 -0
- package/dist/types/forms/form-generator.d.ts +39 -2
- package/dist/types/forms/types.d.ts +21 -2
- package/dist/types/index.d.ts +3 -4
- package/dist/types/langchain/FormAwareAgentExecutor.d.ts +53 -4
- package/dist/types/langchain/FormValidatingToolWrapper.d.ts +43 -6
- package/dist/types/langchain-agent.d.ts +49 -0
- package/dist/types/memory/ContentStorage.d.ts +7 -0
- package/dist/types/memory/SmartMemoryManager.d.ts +1 -0
- package/dist/types/services/ContentStoreManager.d.ts +11 -1
- package/dist/types/utils/ResponseFormatter.d.ts +26 -0
- package/package.json +13 -10
- package/src/config/system-message.ts +14 -0
- package/src/context/ReferenceContextManager.ts +1 -1
- package/src/conversational-agent.ts +91 -36
- package/src/core/ToolRegistry.ts +358 -0
- package/src/execution/ExecutionPipeline.ts +301 -0
- package/src/forms/FormEngine.ts +443 -0
- package/src/forms/field-type-registry.ts +1 -13
- package/src/forms/form-generator.ts +394 -237
- package/src/forms/types.ts +20 -3
- package/src/index.ts +6 -10
- package/src/langchain/FormAwareAgentExecutor.ts +653 -22
- package/src/langchain/FormValidatingToolWrapper.ts +216 -93
- package/src/langchain-agent.ts +924 -185
- package/src/mcp/ContentProcessor.ts +20 -4
- package/src/mcp/MCPClientManager.ts +1 -1
- package/src/mcp/adapters/langchain.ts +1 -1
- package/src/memory/ContentStorage.ts +25 -5
- package/src/memory/SmartMemoryManager.ts +27 -4
- package/src/memory/TokenCounter.ts +1 -1
- package/src/plugins/hbar/HbarPlugin.ts +0 -1
- package/src/scripts/test-external-tool-wrapper.ts +3 -12
- package/src/scripts/test-hedera-kit-wrapper.ts +6 -22
- package/src/scripts/test-inscribe-form-generation.ts +24 -42
- package/src/scripts/test-inscribe-wrapper-verification.ts +1 -7
- package/src/services/ContentStoreManager.ts +23 -9
- package/src/services/EntityResolver.ts +2 -9
- package/src/tools/EntityResolverTool.ts +5 -8
- package/src/utils/ResponseFormatter.ts +146 -0
- package/dist/cjs/examples/external-tool-wrapper-example.d.ts +0 -131
- package/dist/cjs/langchain/ContentAwareAgentExecutor.d.ts +0 -14
- package/dist/cjs/langchain/external-tool-wrapper.d.ts +0 -179
- package/dist/cjs/scripts/test-external-tool-wrapper.d.ts +0 -5
- package/dist/cjs/scripts/test-hedera-kit-wrapper.d.ts +0 -36
- package/dist/cjs/scripts/test-inscribe-form-generation.d.ts +0 -15
- package/dist/cjs/scripts/test-inscribe-wrapper-verification.d.ts +0 -13
- package/dist/types/examples/external-tool-wrapper-example.d.ts +0 -131
- package/dist/types/langchain/ContentAwareAgentExecutor.d.ts +0 -14
- package/dist/types/langchain/external-tool-wrapper.d.ts +0 -179
- package/dist/types/scripts/test-external-tool-wrapper.d.ts +0 -5
- package/dist/types/scripts/test-hedera-kit-wrapper.d.ts +0 -36
- package/dist/types/scripts/test-inscribe-form-generation.d.ts +0 -15
- package/dist/types/scripts/test-inscribe-wrapper-verification.d.ts +0 -13
- package/src/examples/external-tool-wrapper-example.ts +0 -227
- package/src/langchain/ContentAwareAgentExecutor.ts +0 -19
- package/src/langchain/external-tool-wrapper.ts +0 -486
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { ZodError } from 'zod';
|
|
2
|
+
import { Logger } from '@hashgraphonline/standards-sdk';
|
|
3
|
+
import { SmartMemoryManager } from '../memory/SmartMemoryManager';
|
|
4
|
+
import { FormEngine, ToolExecutionResult } from '../forms/FormEngine';
|
|
5
|
+
import type { FormMessage, FormSubmission } from '../forms/types';
|
|
6
|
+
import type { ToolRegistry, ToolRegistryEntry } from '../core/ToolRegistry';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Session context for tool execution
|
|
10
|
+
*/
|
|
11
|
+
export interface SessionContext {
|
|
12
|
+
sessionId: string;
|
|
13
|
+
userId?: string;
|
|
14
|
+
timestamp: number;
|
|
15
|
+
conversationId?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Context passed through execution pipeline
|
|
20
|
+
*/
|
|
21
|
+
export interface ExecutionContext {
|
|
22
|
+
toolName: string;
|
|
23
|
+
input: unknown;
|
|
24
|
+
session: SessionContext;
|
|
25
|
+
memory: SmartMemoryManager;
|
|
26
|
+
traceId: string;
|
|
27
|
+
toolEntry: ToolRegistryEntry;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Result of tool execution with metadata
|
|
32
|
+
*/
|
|
33
|
+
export interface ExecutionResult extends ToolExecutionResult {
|
|
34
|
+
traceId: string;
|
|
35
|
+
executionTime: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* ExecutionPipeline handles tool execution coordination
|
|
40
|
+
*/
|
|
41
|
+
export class ExecutionPipeline {
|
|
42
|
+
private logger: Logger;
|
|
43
|
+
private toolRegistry: ToolRegistry;
|
|
44
|
+
private formEngine: FormEngine;
|
|
45
|
+
private memory: SmartMemoryManager;
|
|
46
|
+
|
|
47
|
+
constructor(
|
|
48
|
+
toolRegistry: ToolRegistry,
|
|
49
|
+
formEngine: FormEngine,
|
|
50
|
+
memory: SmartMemoryManager,
|
|
51
|
+
logger?: Logger
|
|
52
|
+
) {
|
|
53
|
+
this.toolRegistry = toolRegistry;
|
|
54
|
+
this.formEngine = formEngine;
|
|
55
|
+
this.memory = memory;
|
|
56
|
+
this.logger = logger || new Logger({ module: 'ExecutionPipeline' });
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Execute a tool through the pipeline
|
|
61
|
+
*/
|
|
62
|
+
async execute(
|
|
63
|
+
toolName: string,
|
|
64
|
+
input: unknown,
|
|
65
|
+
sessionContext?: SessionContext
|
|
66
|
+
): Promise<ExecutionResult> {
|
|
67
|
+
const traceId = `trace-${Date.now()}-${Math.random()
|
|
68
|
+
.toString(36)
|
|
69
|
+
.substr(2, 9)}`;
|
|
70
|
+
const startTime = Date.now();
|
|
71
|
+
|
|
72
|
+
const toolEntry = this.toolRegistry.getTool(toolName);
|
|
73
|
+
if (!toolEntry) {
|
|
74
|
+
throw new Error(`Tool not found in registry: ${toolName}`);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const context: ExecutionContext = {
|
|
78
|
+
toolName,
|
|
79
|
+
input,
|
|
80
|
+
session: sessionContext || this.buildDefaultSession(),
|
|
81
|
+
memory: this.memory,
|
|
82
|
+
traceId,
|
|
83
|
+
toolEntry,
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
try {
|
|
87
|
+
const shouldGenerateForm = await this.checkFormGeneration(context);
|
|
88
|
+
if (shouldGenerateForm.requiresForm && shouldGenerateForm.formMessage) {
|
|
89
|
+
return {
|
|
90
|
+
success: false,
|
|
91
|
+
output: 'Form generation required',
|
|
92
|
+
requiresForm: true,
|
|
93
|
+
formMessage: shouldGenerateForm.formMessage,
|
|
94
|
+
traceId,
|
|
95
|
+
executionTime: Date.now() - startTime,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const result = await this.executeToolDirect(context);
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
success: true,
|
|
103
|
+
output: result,
|
|
104
|
+
traceId,
|
|
105
|
+
executionTime: Date.now() - startTime,
|
|
106
|
+
};
|
|
107
|
+
} catch (error) {
|
|
108
|
+
return this.handleExecutionError(
|
|
109
|
+
error,
|
|
110
|
+
context,
|
|
111
|
+
traceId,
|
|
112
|
+
Date.now() - startTime
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Execute tool with validation
|
|
119
|
+
*/
|
|
120
|
+
async executeWithValidation(
|
|
121
|
+
toolName: string,
|
|
122
|
+
input: unknown,
|
|
123
|
+
sessionContext?: SessionContext
|
|
124
|
+
): Promise<ExecutionResult> {
|
|
125
|
+
return this.execute(toolName, input, sessionContext);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Process form submission
|
|
130
|
+
*/
|
|
131
|
+
async processFormSubmission(
|
|
132
|
+
toolName: string,
|
|
133
|
+
formId: string,
|
|
134
|
+
parameters: Record<string, unknown>,
|
|
135
|
+
sessionContext?: SessionContext
|
|
136
|
+
): Promise<ExecutionResult> {
|
|
137
|
+
const traceId = `form-${Date.now()}-${Math.random()
|
|
138
|
+
.toString(36)
|
|
139
|
+
.substr(2, 9)}`;
|
|
140
|
+
const startTime = Date.now();
|
|
141
|
+
|
|
142
|
+
try {
|
|
143
|
+
const formSubmission: FormSubmission = {
|
|
144
|
+
formId,
|
|
145
|
+
toolName,
|
|
146
|
+
parameters,
|
|
147
|
+
timestamp: Date.now(),
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
const processedInput = await this.formEngine.processSubmission(
|
|
151
|
+
formSubmission
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
return this.execute(toolName, processedInput, sessionContext);
|
|
155
|
+
} catch (error) {
|
|
156
|
+
return {
|
|
157
|
+
success: false,
|
|
158
|
+
output: 'Form submission processing failed',
|
|
159
|
+
error: error instanceof Error ? error.message : String(error),
|
|
160
|
+
traceId,
|
|
161
|
+
executionTime: Date.now() - startTime,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Check if form generation is required
|
|
168
|
+
*/
|
|
169
|
+
private async checkFormGeneration(context: ExecutionContext): Promise<{
|
|
170
|
+
requiresForm: boolean;
|
|
171
|
+
formMessage?: FormMessage;
|
|
172
|
+
}> {
|
|
173
|
+
const inputRecord = context.input as Record<string, unknown>;
|
|
174
|
+
if (inputRecord?.__fromForm === true || inputRecord?.renderForm === false) {
|
|
175
|
+
return { requiresForm: false };
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (
|
|
179
|
+
!this.formEngine.shouldGenerateForm(context.toolEntry.tool, context.input)
|
|
180
|
+
) {
|
|
181
|
+
return { requiresForm: false };
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const formMessage = await this.formEngine.generateForm(
|
|
185
|
+
context.toolName,
|
|
186
|
+
context.toolEntry.tool,
|
|
187
|
+
context.input
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
if (formMessage) {
|
|
191
|
+
return { requiresForm: true, formMessage };
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return { requiresForm: false };
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Execute tool directly
|
|
199
|
+
*/
|
|
200
|
+
private async executeToolDirect(context: ExecutionContext): Promise<string> {
|
|
201
|
+
const { toolEntry, input } = context;
|
|
202
|
+
const parameters = (input as Record<string, unknown>) || {};
|
|
203
|
+
const mergedArgs = { ...parameters, renderForm: false };
|
|
204
|
+
|
|
205
|
+
if (toolEntry.wrapper) {
|
|
206
|
+
return this.executeWrappedTool(toolEntry, mergedArgs);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
return await toolEntry.tool.call(mergedArgs);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Execute wrapped tool
|
|
214
|
+
*/
|
|
215
|
+
private async executeWrappedTool(
|
|
216
|
+
toolEntry: ToolRegistryEntry,
|
|
217
|
+
mergedArgs: Record<string, unknown>
|
|
218
|
+
): Promise<string> {
|
|
219
|
+
const wrapper = toolEntry.wrapper;
|
|
220
|
+
if (!wrapper) {
|
|
221
|
+
throw new Error('Tool wrapper not found');
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const wrapperAsAny = wrapper as unknown as {
|
|
225
|
+
executeOriginal?: (args: Record<string, unknown>) => Promise<string>;
|
|
226
|
+
originalTool?: {
|
|
227
|
+
call?: (args: Record<string, unknown>) => Promise<string>;
|
|
228
|
+
};
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
if (wrapperAsAny.executeOriginal) {
|
|
232
|
+
return await wrapperAsAny.executeOriginal(mergedArgs);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (wrapperAsAny.originalTool?.call) {
|
|
236
|
+
return await wrapperAsAny.originalTool.call(mergedArgs);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return await toolEntry.originalTool.call(mergedArgs);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Handle execution error
|
|
244
|
+
*/
|
|
245
|
+
private handleExecutionError(
|
|
246
|
+
error: unknown,
|
|
247
|
+
context: ExecutionContext,
|
|
248
|
+
traceId: string,
|
|
249
|
+
executionTime: number
|
|
250
|
+
): ExecutionResult {
|
|
251
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
252
|
+
|
|
253
|
+
if (error instanceof ZodError) {
|
|
254
|
+
return {
|
|
255
|
+
success: false,
|
|
256
|
+
output: 'Validation error occurred',
|
|
257
|
+
error: errorMessage,
|
|
258
|
+
traceId,
|
|
259
|
+
executionTime,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
this.logger.error(`Tool execution failed: ${context.toolName}`, {
|
|
264
|
+
traceId,
|
|
265
|
+
error: errorMessage,
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
return {
|
|
269
|
+
success: false,
|
|
270
|
+
output: 'Tool execution failed',
|
|
271
|
+
error: errorMessage,
|
|
272
|
+
traceId,
|
|
273
|
+
executionTime,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Build default session context
|
|
279
|
+
*/
|
|
280
|
+
private buildDefaultSession(): SessionContext {
|
|
281
|
+
return {
|
|
282
|
+
sessionId: `session-${Date.now()}-${Math.random()
|
|
283
|
+
.toString(36)
|
|
284
|
+
.substr(2, 9)}`,
|
|
285
|
+
timestamp: Date.now(),
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Get statistics about the pipeline
|
|
291
|
+
*/
|
|
292
|
+
getStatistics(): {
|
|
293
|
+
totalMiddleware: number;
|
|
294
|
+
registeredMiddleware: string[];
|
|
295
|
+
} {
|
|
296
|
+
return {
|
|
297
|
+
totalMiddleware: 0,
|
|
298
|
+
registeredMiddleware: [],
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
}
|