@push.rocks/smartagent 1.8.0 → 3.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.
Files changed (87) hide show
  1. package/dist_ts/00_commitinfo_data.js +3 -3
  2. package/dist_ts/index.d.ts +8 -14
  3. package/dist_ts/index.js +8 -24
  4. package/dist_ts/plugins.d.ts +8 -9
  5. package/dist_ts/plugins.js +10 -12
  6. package/dist_ts/smartagent.classes.agent.d.ts +2 -0
  7. package/dist_ts/smartagent.classes.agent.js +173 -0
  8. package/dist_ts/smartagent.classes.toolregistry.d.ts +7 -70
  9. package/dist_ts/smartagent.classes.toolregistry.js +11 -155
  10. package/dist_ts/smartagent.interfaces.d.ts +47 -283
  11. package/dist_ts/smartagent.interfaces.js +6 -7
  12. package/dist_ts/smartagent.utils.truncation.d.ts +10 -0
  13. package/dist_ts/smartagent.utils.truncation.js +26 -0
  14. package/dist_ts_compaction/index.d.ts +1 -0
  15. package/dist_ts_compaction/index.js +2 -0
  16. package/dist_ts_compaction/plugins.d.ts +4 -0
  17. package/dist_ts_compaction/plugins.js +3 -0
  18. package/dist_ts_compaction/smartagent.compaction.d.ts +10 -0
  19. package/dist_ts_compaction/smartagent.compaction.js +46 -0
  20. package/dist_ts_tools/index.d.ts +8 -0
  21. package/dist_ts_tools/index.js +6 -0
  22. package/dist_ts_tools/plugins.d.ts +15 -0
  23. package/dist_ts_tools/plugins.js +19 -0
  24. package/dist_ts_tools/tool.filesystem.d.ts +6 -0
  25. package/dist_ts_tools/tool.filesystem.js +102 -0
  26. package/dist_ts_tools/tool.http.d.ts +2 -0
  27. package/dist_ts_tools/tool.http.js +65 -0
  28. package/dist_ts_tools/tool.json.d.ts +2 -0
  29. package/dist_ts_tools/tool.json.js +47 -0
  30. package/dist_ts_tools/tool.shell.d.ts +8 -0
  31. package/dist_ts_tools/tool.shell.js +40 -0
  32. package/npmextra.json +1 -1
  33. package/package.json +30 -18
  34. package/readme.hints.md +38 -84
  35. package/readme.md +254 -682
  36. package/ts/00_commitinfo_data.ts +2 -2
  37. package/ts/index.ts +10 -37
  38. package/ts/plugins.ts +22 -21
  39. package/ts/smartagent.classes.agent.ts +198 -0
  40. package/ts/smartagent.classes.toolregistry.ts +11 -179
  41. package/ts/smartagent.interfaces.ts +51 -363
  42. package/ts/smartagent.utils.truncation.ts +39 -0
  43. package/ts_compaction/index.ts +1 -0
  44. package/ts_compaction/plugins.ts +6 -0
  45. package/ts_compaction/smartagent.compaction.ts +51 -0
  46. package/ts_tools/index.ts +8 -0
  47. package/ts_tools/plugins.ts +30 -0
  48. package/ts_tools/tool.filesystem.ts +131 -0
  49. package/ts_tools/tool.http.ts +78 -0
  50. package/ts_tools/tool.json.ts +53 -0
  51. package/ts_tools/tool.shell.ts +62 -0
  52. package/dist_ts/smartagent.classes.driveragent.d.ts +0 -134
  53. package/dist_ts/smartagent.classes.driveragent.js +0 -671
  54. package/dist_ts/smartagent.classes.dualagent.d.ts +0 -93
  55. package/dist_ts/smartagent.classes.dualagent.js +0 -614
  56. package/dist_ts/smartagent.classes.guardianagent.d.ts +0 -46
  57. package/dist_ts/smartagent.classes.guardianagent.js +0 -201
  58. package/dist_ts/smartagent.tools.base.d.ts +0 -52
  59. package/dist_ts/smartagent.tools.base.js +0 -42
  60. package/dist_ts/smartagent.tools.browser.d.ts +0 -17
  61. package/dist_ts/smartagent.tools.browser.js +0 -229
  62. package/dist_ts/smartagent.tools.deno.d.ts +0 -21
  63. package/dist_ts/smartagent.tools.deno.js +0 -191
  64. package/dist_ts/smartagent.tools.expert.d.ts +0 -27
  65. package/dist_ts/smartagent.tools.expert.js +0 -126
  66. package/dist_ts/smartagent.tools.filesystem.d.ts +0 -40
  67. package/dist_ts/smartagent.tools.filesystem.js +0 -801
  68. package/dist_ts/smartagent.tools.http.d.ts +0 -16
  69. package/dist_ts/smartagent.tools.http.js +0 -264
  70. package/dist_ts/smartagent.tools.json.d.ts +0 -24
  71. package/dist_ts/smartagent.tools.json.js +0 -202
  72. package/dist_ts/smartagent.tools.search.d.ts +0 -29
  73. package/dist_ts/smartagent.tools.search.js +0 -215
  74. package/dist_ts/smartagent.tools.shell.d.ts +0 -17
  75. package/dist_ts/smartagent.tools.shell.js +0 -202
  76. package/ts/smartagent.classes.driveragent.ts +0 -775
  77. package/ts/smartagent.classes.dualagent.ts +0 -692
  78. package/ts/smartagent.classes.guardianagent.ts +0 -241
  79. package/ts/smartagent.tools.base.ts +0 -83
  80. package/ts/smartagent.tools.browser.ts +0 -253
  81. package/ts/smartagent.tools.deno.ts +0 -230
  82. package/ts/smartagent.tools.expert.ts +0 -144
  83. package/ts/smartagent.tools.filesystem.ts +0 -885
  84. package/ts/smartagent.tools.http.ts +0 -283
  85. package/ts/smartagent.tools.json.ts +0 -224
  86. package/ts/smartagent.tools.search.ts +0 -237
  87. package/ts/smartagent.tools.shell.ts +0 -230
@@ -1,614 +0,0 @@
1
- import * as plugins from './plugins.js';
2
- import * as interfaces from './smartagent.interfaces.js';
3
- import { BaseToolWrapper } from './smartagent.tools.base.js';
4
- import { DriverAgent } from './smartagent.classes.driveragent.js';
5
- import { GuardianAgent } from './smartagent.classes.guardianagent.js';
6
- import { FilesystemTool } from './smartagent.tools.filesystem.js';
7
- import { HttpTool } from './smartagent.tools.http.js';
8
- import { ShellTool } from './smartagent.tools.shell.js';
9
- import { BrowserTool } from './smartagent.tools.browser.js';
10
- import { DenoTool } from './smartagent.tools.deno.js';
11
- import { ToolRegistry } from './smartagent.classes.toolregistry.js';
12
- import { ToolSearchTool } from './smartagent.tools.search.js';
13
- import { ExpertTool } from './smartagent.tools.expert.js';
14
- /**
15
- * DualAgentOrchestrator - Coordinates Driver and Guardian agents
16
- * Manages the complete lifecycle of task execution with tool approval
17
- */
18
- export class DualAgentOrchestrator {
19
- options;
20
- smartai;
21
- driverProvider;
22
- guardianProvider;
23
- driver;
24
- guardian;
25
- registry = new ToolRegistry();
26
- isRunning = false;
27
- conversationHistory = [];
28
- ownsSmartAi = true; // true if we created the SmartAi instance, false if it was provided
29
- constructor(options) {
30
- this.options = {
31
- maxIterations: 20,
32
- maxConsecutiveRejections: 3,
33
- defaultProvider: 'openai',
34
- maxResultChars: 15000,
35
- maxHistoryMessages: 20,
36
- ...options,
37
- };
38
- // Use existing SmartAi instance if provided, otherwise create a new one
39
- if (options.smartAiInstance) {
40
- this.smartai = options.smartAiInstance;
41
- this.ownsSmartAi = false; // Don't manage lifecycle of provided instance
42
- }
43
- else {
44
- this.smartai = new plugins.smartai.SmartAi(options);
45
- this.ownsSmartAi = true;
46
- }
47
- // Note: Don't access providers here - they don't exist until start() is called
48
- }
49
- /**
50
- * Get provider by name
51
- */
52
- getProviderByName(providerName) {
53
- switch (providerName) {
54
- case 'openai':
55
- return this.smartai.openaiProvider;
56
- case 'anthropic':
57
- return this.smartai.anthropicProvider;
58
- case 'perplexity':
59
- return this.smartai.perplexityProvider;
60
- case 'ollama':
61
- return this.smartai.ollamaProvider;
62
- case 'groq':
63
- return this.smartai.groqProvider;
64
- case 'xai':
65
- return this.smartai.xaiProvider;
66
- case 'exo':
67
- return this.smartai.exoProvider;
68
- default:
69
- return this.smartai.openaiProvider;
70
- }
71
- }
72
- /**
73
- * Emit a progress event if callback is configured
74
- */
75
- emitProgress(event) {
76
- if (this.options.onProgress) {
77
- const prefix = this.options.logPrefix ? `${this.options.logPrefix} ` : '';
78
- const { logLevel, logMessage } = this.formatProgressEvent(event, prefix);
79
- this.options.onProgress({
80
- ...event,
81
- timestamp: new Date(),
82
- logLevel,
83
- logMessage,
84
- });
85
- }
86
- }
87
- /**
88
- * Format a progress event into a log level and message
89
- */
90
- formatProgressEvent(event, prefix) {
91
- switch (event.type) {
92
- case 'task_started':
93
- return { logLevel: 'info', logMessage: `${prefix}Task started` };
94
- case 'iteration_started':
95
- return { logLevel: 'info', logMessage: `${prefix}Iteration ${event.iteration}/${event.maxIterations}` };
96
- case 'tool_proposed':
97
- return { logLevel: 'info', logMessage: `${prefix} → Proposing: ${event.toolName}.${event.action}` };
98
- case 'guardian_evaluating':
99
- return { logLevel: 'info', logMessage: `${prefix} ⏳ Guardian evaluating...` };
100
- case 'tool_approved':
101
- return { logLevel: 'info', logMessage: `${prefix} ✓ Approved: ${event.toolName}.${event.action}` };
102
- case 'tool_rejected':
103
- return { logLevel: 'warn', logMessage: `${prefix} ✗ Rejected: ${event.toolName}.${event.action} - ${event.reason}` };
104
- case 'tool_executing':
105
- return { logLevel: 'info', logMessage: `${prefix} ⚡ Executing: ${event.toolName}.${event.action}...` };
106
- case 'tool_completed':
107
- return { logLevel: 'info', logMessage: `${prefix} ✓ Completed: ${event.message}` };
108
- case 'task_completed':
109
- return { logLevel: 'success', logMessage: `${prefix}Task completed in ${event.iteration} iterations` };
110
- case 'clarification_needed':
111
- return { logLevel: 'warn', logMessage: `${prefix}Clarification needed from user` };
112
- case 'max_iterations':
113
- return { logLevel: 'error', logMessage: `${prefix}${event.message}` };
114
- case 'max_rejections':
115
- return { logLevel: 'error', logMessage: `${prefix}${event.message}` };
116
- default:
117
- return { logLevel: 'info', logMessage: `${prefix}${event.type}` };
118
- }
119
- }
120
- /**
121
- * Register a custom tool with optional visibility settings
122
- */
123
- registerTool(tool, options) {
124
- this.registry.register(tool, options);
125
- // If initial visibility and agents exist, register with them
126
- const visibility = options?.visibility ?? 'initial';
127
- if (visibility === 'initial') {
128
- if (this.driver) {
129
- this.driver.registerTool(tool);
130
- }
131
- if (this.guardian) {
132
- this.guardian.registerTool(tool);
133
- }
134
- }
135
- }
136
- /**
137
- * Register an expert (subagent) as a tool
138
- */
139
- registerExpert(config) {
140
- const expert = new ExpertTool(config, this.smartai);
141
- this.registerTool(expert, {
142
- visibility: config.visibility,
143
- tags: config.tags,
144
- category: config.category ?? 'expert',
145
- });
146
- }
147
- /**
148
- * Enable tool search functionality
149
- * This adds a 'tools' tool that allows the Driver to discover and activate on-demand tools
150
- */
151
- enableToolSearch() {
152
- const searchTool = new ToolSearchTool(this.registry, (tool) => {
153
- // Callback when an on-demand tool is activated
154
- if (this.driver) {
155
- this.driver.registerTool(tool);
156
- }
157
- if (this.guardian) {
158
- this.guardian.registerTool(tool);
159
- }
160
- });
161
- this.registerTool(searchTool); // Always initial visibility
162
- }
163
- /**
164
- * Register all standard tools
165
- */
166
- registerStandardTools() {
167
- const standardTools = [
168
- new FilesystemTool(),
169
- new HttpTool(),
170
- new ShellTool(),
171
- new BrowserTool(),
172
- new DenoTool(),
173
- ];
174
- for (const tool of standardTools) {
175
- this.registerTool(tool);
176
- }
177
- }
178
- /**
179
- * Register a scoped filesystem tool that can only access files within the specified directory
180
- * @param basePath The directory to scope filesystem operations to
181
- * @param excludePatterns Optional glob patterns to exclude from listings (e.g., ['.nogit/**', 'node_modules/**'])
182
- */
183
- registerScopedFilesystemTool(basePath, excludePatterns) {
184
- const scopedTool = new FilesystemTool({ basePath, excludePatterns });
185
- this.registerTool(scopedTool);
186
- }
187
- /**
188
- * Initialize all tools (eager loading)
189
- */
190
- async start() {
191
- // Start smartai only if we created it (external instances should already be started)
192
- if (this.ownsSmartAi) {
193
- await this.smartai.start();
194
- }
195
- // NOW get providers (after they've been initialized by smartai.start())
196
- this.driverProvider = this.getProviderByName(this.options.defaultProvider);
197
- this.guardianProvider = this.options.guardianProvider
198
- ? this.getProviderByName(this.options.guardianProvider)
199
- : this.driverProvider;
200
- // NOW create agents with initialized providers
201
- // Set up token callback wrapper if streaming is enabled
202
- const driverOnToken = this.options.onToken
203
- ? (token) => this.options.onToken(token, 'driver')
204
- : undefined;
205
- this.driver = new DriverAgent(this.driverProvider, {
206
- systemMessage: this.options.driverSystemMessage,
207
- maxHistoryMessages: this.options.maxHistoryMessages,
208
- onToken: driverOnToken,
209
- });
210
- this.guardian = new GuardianAgent(this.guardianProvider, this.options.guardianPolicyPrompt);
211
- // Register visible tools with agents
212
- for (const tool of this.registry.getVisibleTools()) {
213
- this.driver.registerTool(tool);
214
- this.guardian.registerTool(tool);
215
- }
216
- // Initialize visible tools
217
- await this.registry.initializeVisibleTools();
218
- this.isRunning = true;
219
- }
220
- /**
221
- * Cleanup all tools
222
- */
223
- async stop() {
224
- await this.registry.cleanup();
225
- // Only stop smartai if we created it (don't stop external instances)
226
- if (this.ownsSmartAi) {
227
- await this.smartai.stop();
228
- }
229
- this.isRunning = false;
230
- if (this.driver) {
231
- this.driver.reset();
232
- }
233
- }
234
- /**
235
- * Run a task through the dual-agent system
236
- * @param task The task description
237
- * @param options Optional task run options (e.g., images for vision tasks)
238
- */
239
- async run(task, options) {
240
- if (!this.isRunning) {
241
- throw new Error('Orchestrator not started. Call start() first.');
242
- }
243
- // Use native tool calling if enabled
244
- const useNativeTools = this.options.useNativeToolCalling === true;
245
- this.conversationHistory = [];
246
- let iterations = 0;
247
- let consecutiveRejections = 0;
248
- let completed = false;
249
- let finalResult = null;
250
- // Track pending native tool calls
251
- let pendingNativeToolCalls;
252
- // Extract images from options
253
- const images = options?.images;
254
- // Add initial task to history
255
- this.conversationHistory.push({
256
- role: 'user',
257
- content: task,
258
- });
259
- // Start the driver with the task and optional images
260
- let driverResponse;
261
- if (useNativeTools) {
262
- // Native tool calling mode
263
- const result = await this.driver.startTaskWithNativeTools(task, images);
264
- driverResponse = result.message;
265
- pendingNativeToolCalls = result.toolCalls;
266
- }
267
- else {
268
- // XML parsing mode
269
- driverResponse = await this.driver.startTask(task, images);
270
- }
271
- this.conversationHistory.push(driverResponse);
272
- // Emit task started event
273
- this.emitProgress({
274
- type: 'task_started',
275
- message: task.length > 100 ? task.substring(0, 100) + '...' : task,
276
- });
277
- while (iterations < this.options.maxIterations &&
278
- consecutiveRejections < this.options.maxConsecutiveRejections &&
279
- !completed) {
280
- iterations++;
281
- // Emit iteration started event
282
- this.emitProgress({
283
- type: 'iteration_started',
284
- iteration: iterations,
285
- maxIterations: this.options.maxIterations,
286
- });
287
- // Check if task is complete (for native mode, no pending tool calls and has content)
288
- const isComplete = useNativeTools
289
- ? (!pendingNativeToolCalls || pendingNativeToolCalls.length === 0) && driverResponse.content.length > 0
290
- : this.driver.isTaskComplete(driverResponse.content);
291
- if (isComplete) {
292
- completed = true;
293
- finalResult = useNativeTools
294
- ? driverResponse.content
295
- : (this.driver.extractTaskResult(driverResponse.content) || driverResponse.content);
296
- // Emit task completed event
297
- this.emitProgress({
298
- type: 'task_completed',
299
- iteration: iterations,
300
- message: 'Task completed successfully',
301
- });
302
- break;
303
- }
304
- // Check if driver needs clarification
305
- if (this.driver.needsClarification(driverResponse.content)) {
306
- // Emit clarification needed event
307
- this.emitProgress({
308
- type: 'clarification_needed',
309
- iteration: iterations,
310
- message: 'Driver needs clarification from user',
311
- });
312
- // Return with clarification needed status
313
- return {
314
- success: false,
315
- completed: false,
316
- result: driverResponse.content,
317
- iterations,
318
- history: this.conversationHistory,
319
- status: 'clarification_needed',
320
- };
321
- }
322
- // Parse tool call proposals - native mode uses pendingNativeToolCalls, XML mode parses content
323
- let proposals;
324
- if (useNativeTools && pendingNativeToolCalls && pendingNativeToolCalls.length > 0) {
325
- // Native tool calling mode - convert native tool calls to proposals
326
- proposals = this.driver.parseNativeToolCalls(pendingNativeToolCalls);
327
- pendingNativeToolCalls = undefined; // Clear after processing
328
- }
329
- else if (!useNativeTools) {
330
- // XML parsing mode
331
- proposals = this.driver.parseToolCallProposals(driverResponse.content);
332
- }
333
- else {
334
- proposals = [];
335
- }
336
- if (proposals.length === 0) {
337
- if (useNativeTools) {
338
- // Native mode: no tool calls and no content means we should continue
339
- const result = await this.driver.continueWithNativeTools('Please continue with the task. Use the available tools or provide your final output.');
340
- driverResponse = result.message;
341
- pendingNativeToolCalls = result.toolCalls;
342
- this.conversationHistory.push(driverResponse);
343
- continue;
344
- }
345
- else {
346
- // XML mode: remind the model of the exact XML format
347
- driverResponse = await this.driver.continueWithMessage(`No valid tool call was found in your response. To use a tool, you MUST output the exact XML format:
348
-
349
- <tool_call>
350
- <tool>tool_name</tool>
351
- <action>action_name</action>
352
- <params>{"param1": "value1"}</params>
353
- </tool_call>
354
-
355
- For example, to validate JSON:
356
- <tool_call>
357
- <tool>json</tool>
358
- <action>validate</action>
359
- <params>{"jsonString": "{\\"key\\":\\"value\\"}", "requiredFields": ["key"]}</params>
360
- </tool_call>
361
-
362
- Or to complete the task:
363
- <task_complete>your final JSON output here</task_complete>
364
-
365
- Please output the exact XML format above.`);
366
- this.conversationHistory.push(driverResponse);
367
- continue;
368
- }
369
- }
370
- // Process the first proposal (one at a time)
371
- const proposal = proposals[0];
372
- // Emit tool proposed event
373
- this.emitProgress({
374
- type: 'tool_proposed',
375
- iteration: iterations,
376
- toolName: proposal.toolName,
377
- action: proposal.action,
378
- message: `${proposal.toolName}.${proposal.action}`,
379
- });
380
- // Quick validation first
381
- const quickDecision = this.guardian.quickValidate(proposal);
382
- let decision;
383
- if (quickDecision) {
384
- decision = quickDecision;
385
- }
386
- else {
387
- // Emit guardian evaluating event
388
- this.emitProgress({
389
- type: 'guardian_evaluating',
390
- iteration: iterations,
391
- toolName: proposal.toolName,
392
- action: proposal.action,
393
- });
394
- // Full AI evaluation
395
- decision = await this.guardian.evaluate(proposal, task);
396
- }
397
- if (decision.decision === 'approve') {
398
- consecutiveRejections = 0;
399
- // Emit tool approved event
400
- this.emitProgress({
401
- type: 'tool_approved',
402
- iteration: iterations,
403
- toolName: proposal.toolName,
404
- action: proposal.action,
405
- });
406
- // Execute the tool
407
- const tool = this.registry.getTool(proposal.toolName);
408
- if (!tool) {
409
- const errorMessage = `Tool "${proposal.toolName}" not found.`;
410
- driverResponse = await this.driver.continueWithMessage(`TOOL ERROR: ${errorMessage}\n\nPlease try a different approach.`);
411
- this.conversationHistory.push(driverResponse);
412
- continue;
413
- }
414
- try {
415
- // Emit tool executing event
416
- this.emitProgress({
417
- type: 'tool_executing',
418
- iteration: iterations,
419
- toolName: proposal.toolName,
420
- action: proposal.action,
421
- });
422
- const result = await tool.execute(proposal.action, proposal.params);
423
- // Emit tool completed event
424
- this.emitProgress({
425
- type: 'tool_completed',
426
- iteration: iterations,
427
- toolName: proposal.toolName,
428
- action: proposal.action,
429
- message: result.success ? 'success' : result.error,
430
- });
431
- // Build result message (prefer summary if provided, otherwise stringify result)
432
- let resultMessage;
433
- if (result.success) {
434
- if (result.summary) {
435
- // Use tool-provided summary
436
- resultMessage = `TOOL RESULT (${proposal.toolName}.${proposal.action}):\n${result.summary}`;
437
- }
438
- else {
439
- // Stringify and potentially truncate
440
- const resultStr = JSON.stringify(result.result, null, 2);
441
- const maxChars = this.options.maxResultChars ?? 15000;
442
- if (maxChars > 0 && resultStr.length > maxChars) {
443
- // Truncate the result
444
- const truncated = resultStr.substring(0, maxChars);
445
- const omittedTokens = Math.round((resultStr.length - maxChars) / 4);
446
- resultMessage = `TOOL RESULT (${proposal.toolName}.${proposal.action}):\n${truncated}\n\n[... output truncated, ~${omittedTokens} tokens omitted. Use more specific parameters to reduce output size.]`;
447
- }
448
- else {
449
- resultMessage = `TOOL RESULT (${proposal.toolName}.${proposal.action}):\n${resultStr}`;
450
- }
451
- }
452
- }
453
- else {
454
- resultMessage = `TOOL ERROR (${proposal.toolName}.${proposal.action}):\n${result.error}`;
455
- }
456
- this.conversationHistory.push({
457
- role: 'system',
458
- content: resultMessage,
459
- toolCall: proposal,
460
- toolResult: result,
461
- });
462
- // Continue with appropriate method based on mode
463
- if (useNativeTools) {
464
- const toolNameForHistory = `${proposal.toolName}_${proposal.action}`;
465
- const continueResult = await this.driver.continueWithNativeTools(resultMessage, toolNameForHistory);
466
- driverResponse = continueResult.message;
467
- pendingNativeToolCalls = continueResult.toolCalls;
468
- }
469
- else {
470
- driverResponse = await this.driver.continueWithMessage(resultMessage);
471
- }
472
- this.conversationHistory.push(driverResponse);
473
- }
474
- catch (error) {
475
- const errorMessage = `Tool execution failed: ${error instanceof Error ? error.message : String(error)}`;
476
- if (useNativeTools) {
477
- const toolNameForHistory = `${proposal.toolName}_${proposal.action}`;
478
- const continueResult = await this.driver.continueWithNativeTools(`TOOL ERROR: ${errorMessage}\n\nPlease try a different approach.`, toolNameForHistory);
479
- driverResponse = continueResult.message;
480
- pendingNativeToolCalls = continueResult.toolCalls;
481
- }
482
- else {
483
- driverResponse = await this.driver.continueWithMessage(`TOOL ERROR: ${errorMessage}\n\nPlease try a different approach.`);
484
- }
485
- this.conversationHistory.push(driverResponse);
486
- }
487
- }
488
- else {
489
- // Rejected
490
- consecutiveRejections++;
491
- // Emit tool rejected event
492
- this.emitProgress({
493
- type: 'tool_rejected',
494
- iteration: iterations,
495
- toolName: proposal.toolName,
496
- action: proposal.action,
497
- reason: decision.reason,
498
- });
499
- // Build rejection feedback
500
- let feedback = `TOOL CALL REJECTED by Guardian:\n`;
501
- feedback += `- Reason: ${decision.reason}\n`;
502
- if (decision.concerns && decision.concerns.length > 0) {
503
- feedback += `- Concerns:\n${decision.concerns.map(c => ` - ${c}`).join('\n')}\n`;
504
- }
505
- if (decision.suggestions) {
506
- feedback += `- Suggestions: ${decision.suggestions}\n`;
507
- }
508
- feedback += `\nPlease adapt your approach based on this feedback.`;
509
- this.conversationHistory.push({
510
- role: 'system',
511
- content: feedback,
512
- toolCall: proposal,
513
- guardianDecision: decision,
514
- });
515
- // Continue with appropriate method based on mode
516
- if (useNativeTools) {
517
- const continueResult = await this.driver.continueWithNativeTools(feedback);
518
- driverResponse = continueResult.message;
519
- pendingNativeToolCalls = continueResult.toolCalls;
520
- }
521
- else {
522
- driverResponse = await this.driver.continueWithMessage(feedback);
523
- }
524
- this.conversationHistory.push(driverResponse);
525
- }
526
- }
527
- // Determine final status
528
- let status = 'completed';
529
- if (!completed) {
530
- if (iterations >= this.options.maxIterations) {
531
- status = 'max_iterations_reached';
532
- // Emit max iterations event
533
- this.emitProgress({
534
- type: 'max_iterations',
535
- iteration: iterations,
536
- maxIterations: this.options.maxIterations,
537
- message: `Maximum iterations (${this.options.maxIterations}) reached`,
538
- });
539
- }
540
- else if (consecutiveRejections >= this.options.maxConsecutiveRejections) {
541
- status = 'max_rejections_reached';
542
- // Emit max rejections event
543
- this.emitProgress({
544
- type: 'max_rejections',
545
- iteration: iterations,
546
- message: `Maximum consecutive rejections (${this.options.maxConsecutiveRejections}) reached`,
547
- });
548
- }
549
- }
550
- return {
551
- success: completed,
552
- completed,
553
- result: finalResult || driverResponse.content,
554
- iterations,
555
- history: this.conversationHistory,
556
- status,
557
- };
558
- }
559
- /**
560
- * Continue an existing task with user input
561
- */
562
- async continueTask(userInput) {
563
- if (!this.isRunning) {
564
- throw new Error('Orchestrator not started. Call start() first.');
565
- }
566
- this.conversationHistory.push({
567
- role: 'user',
568
- content: userInput,
569
- });
570
- const driverResponse = await this.driver.continueWithMessage(userInput);
571
- this.conversationHistory.push(driverResponse);
572
- // Continue the run loop
573
- // For simplicity, we return the current state - full continuation would need refactoring
574
- return {
575
- success: false,
576
- completed: false,
577
- result: driverResponse.content,
578
- iterations: 1,
579
- history: this.conversationHistory,
580
- status: 'in_progress',
581
- };
582
- }
583
- /**
584
- * Get the conversation history
585
- */
586
- getHistory() {
587
- return [...this.conversationHistory];
588
- }
589
- /**
590
- * Update the guardian policy
591
- */
592
- setGuardianPolicy(policyPrompt) {
593
- this.guardian.setPolicy(policyPrompt);
594
- }
595
- /**
596
- * Check if orchestrator is running
597
- */
598
- isActive() {
599
- return this.isRunning;
600
- }
601
- /**
602
- * Get registered tool names
603
- */
604
- getToolNames() {
605
- return this.registry.getAllMetadata().map((m) => m.name);
606
- }
607
- /**
608
- * Get the tool registry for advanced operations
609
- */
610
- getRegistry() {
611
- return this.registry;
612
- }
613
- }
614
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jbGFzc2VzLmR1YWxhZ2VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0YWdlbnQuY2xhc3Nlcy5kdWFsYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxLQUFLLFVBQVUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTFEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxxQkFBcUI7SUFDeEIsT0FBTyxDQUErQjtJQUN0QyxPQUFPLENBQTBCO0lBQ2pDLGNBQWMsQ0FBa0M7SUFDaEQsZ0JBQWdCLENBQWtDO0lBQ2xELE1BQU0sQ0FBYztJQUNwQixRQUFRLENBQWdCO0lBQ3hCLFFBQVEsR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUM1QyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLG1C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