agents-library 0.1.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 (89) hide show
  1. package/dist/base-agent.d.ts +172 -0
  2. package/dist/base-agent.d.ts.map +1 -0
  3. package/dist/base-agent.js +255 -0
  4. package/dist/base-agent.js.map +1 -0
  5. package/dist/base-bot.d.ts +282 -0
  6. package/dist/base-bot.d.ts.map +1 -0
  7. package/dist/base-bot.js +375 -0
  8. package/dist/base-bot.js.map +1 -0
  9. package/dist/common/result.d.ts +51 -0
  10. package/dist/common/result.d.ts.map +1 -0
  11. package/dist/common/result.js +45 -0
  12. package/dist/common/result.js.map +1 -0
  13. package/dist/common/types.d.ts +57 -0
  14. package/dist/common/types.d.ts.map +1 -0
  15. package/dist/common/types.js +42 -0
  16. package/dist/common/types.js.map +1 -0
  17. package/dist/index.d.ts +94 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +108 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/kadi-event-publisher.d.ts +163 -0
  22. package/dist/kadi-event-publisher.d.ts.map +1 -0
  23. package/dist/kadi-event-publisher.js +286 -0
  24. package/dist/kadi-event-publisher.js.map +1 -0
  25. package/dist/memory/arcadedb-adapter.d.ts +159 -0
  26. package/dist/memory/arcadedb-adapter.d.ts.map +1 -0
  27. package/dist/memory/arcadedb-adapter.js +314 -0
  28. package/dist/memory/arcadedb-adapter.js.map +1 -0
  29. package/dist/memory/file-storage-adapter.d.ts +122 -0
  30. package/dist/memory/file-storage-adapter.d.ts.map +1 -0
  31. package/dist/memory/file-storage-adapter.js +352 -0
  32. package/dist/memory/file-storage-adapter.js.map +1 -0
  33. package/dist/memory/memory-service.d.ts +208 -0
  34. package/dist/memory/memory-service.d.ts.map +1 -0
  35. package/dist/memory/memory-service.js +410 -0
  36. package/dist/memory/memory-service.js.map +1 -0
  37. package/dist/memory/types.d.ts +126 -0
  38. package/dist/memory/types.d.ts.map +1 -0
  39. package/dist/memory/types.js +41 -0
  40. package/dist/memory/types.js.map +1 -0
  41. package/dist/producer-tool-utils.d.ts +474 -0
  42. package/dist/producer-tool-utils.d.ts.map +1 -0
  43. package/dist/producer-tool-utils.js +664 -0
  44. package/dist/producer-tool-utils.js.map +1 -0
  45. package/dist/providers/anthropic-provider.d.ts +160 -0
  46. package/dist/providers/anthropic-provider.d.ts.map +1 -0
  47. package/dist/providers/anthropic-provider.js +527 -0
  48. package/dist/providers/anthropic-provider.js.map +1 -0
  49. package/dist/providers/model-manager-provider.d.ts +91 -0
  50. package/dist/providers/model-manager-provider.d.ts.map +1 -0
  51. package/dist/providers/model-manager-provider.js +355 -0
  52. package/dist/providers/model-manager-provider.js.map +1 -0
  53. package/dist/providers/provider-manager.d.ts +111 -0
  54. package/dist/providers/provider-manager.d.ts.map +1 -0
  55. package/dist/providers/provider-manager.js +337 -0
  56. package/dist/providers/provider-manager.js.map +1 -0
  57. package/dist/providers/types.d.ts +145 -0
  58. package/dist/providers/types.d.ts.map +1 -0
  59. package/dist/providers/types.js +23 -0
  60. package/dist/providers/types.js.map +1 -0
  61. package/dist/shadow-agent-factory.d.ts +623 -0
  62. package/dist/shadow-agent-factory.d.ts.map +1 -0
  63. package/dist/shadow-agent-factory.js +1117 -0
  64. package/dist/shadow-agent-factory.js.map +1 -0
  65. package/dist/types/agent-config.d.ts +307 -0
  66. package/dist/types/agent-config.d.ts.map +1 -0
  67. package/dist/types/agent-config.js +15 -0
  68. package/dist/types/agent-config.js.map +1 -0
  69. package/dist/types/event-schemas.d.ts +358 -0
  70. package/dist/types/event-schemas.d.ts.map +1 -0
  71. package/dist/types/event-schemas.js +188 -0
  72. package/dist/types/event-schemas.js.map +1 -0
  73. package/dist/types/tool-schemas.d.ts +498 -0
  74. package/dist/types/tool-schemas.d.ts.map +1 -0
  75. package/dist/types/tool-schemas.js +457 -0
  76. package/dist/types/tool-schemas.js.map +1 -0
  77. package/dist/utils/logger.d.ts +135 -0
  78. package/dist/utils/logger.d.ts.map +1 -0
  79. package/dist/utils/logger.js +205 -0
  80. package/dist/utils/logger.js.map +1 -0
  81. package/dist/utils/timer.d.ts +186 -0
  82. package/dist/utils/timer.d.ts.map +1 -0
  83. package/dist/utils/timer.js +211 -0
  84. package/dist/utils/timer.js.map +1 -0
  85. package/dist/worker-agent-factory.d.ts +688 -0
  86. package/dist/worker-agent-factory.d.ts.map +1 -0
  87. package/dist/worker-agent-factory.js +1517 -0
  88. package/dist/worker-agent-factory.js.map +1 -0
  89. package/package.json +38 -0
@@ -0,0 +1,664 @@
1
+ /**
2
+ * Producer Tool Utilities
3
+ * ========================
4
+ *
5
+ * Shared utilities for agent-producer to invoke shrimp-task-manager tools
6
+ * via KĀDI broker protocol with consistent error handling and retry logic.
7
+ *
8
+ * Includes Option C orchestration pattern (Claude API streaming with tool invocation)
9
+ * for agent-producer workflow orchestration.
10
+ *
11
+ * Design Principles:
12
+ * - Standardized error classification for retry logic
13
+ * - Configurable timeout with sensible defaults
14
+ * - Type-safe result handling with discriminated unions
15
+ * - Graceful degradation on failure
16
+ * - Streaming-first architecture with tool interruption support
17
+ *
18
+ * @module producer-tool-utils
19
+ */
20
+ import { classifyToolError, ErrorType } from './types/tool-schemas.js';
21
+ import { validateTopicPattern } from './kadi-event-publisher.js';
22
+ import { logger, MODULE_AGENT } from './utils/logger.js';
23
+ import { timer } from './utils/timer.js';
24
+ // ============================================================================
25
+ // Async Response Manager (Singleton)
26
+ // ============================================================================
27
+ /**
28
+ * Manages pending async tool responses from kadi-broker
29
+ *
30
+ * When a tool returns {status: "pending", requestId: "..."}, this manager
31
+ * subscribes to kadi.ability.response notifications and resolves pending promises.
32
+ */
33
+ class AsyncResponseManager {
34
+ static instance;
35
+ pendingResponses = new Map();
36
+ subscribed = false;
37
+ constructor() { }
38
+ static getInstance() {
39
+ if (!AsyncResponseManager.instance) {
40
+ AsyncResponseManager.instance = new AsyncResponseManager();
41
+ }
42
+ return AsyncResponseManager.instance;
43
+ }
44
+ /**
45
+ * Subscribe to kadi.ability.response notifications (once per process)
46
+ */
47
+ async subscribeToAbilityResponses(client) {
48
+ if (this.subscribed) {
49
+ return; // Already subscribed
50
+ }
51
+ // Subscribe to kadi.ability.response events via kadi-core v0.6.0 subscribe API
52
+ await client.subscribe('kadi.ability.response', (event) => {
53
+ const { requestId, result, error } = event || {};
54
+ const pending = this.pendingResponses.get(requestId);
55
+ if (!pending) {
56
+ // This response is for a different request or already handled
57
+ return;
58
+ }
59
+ // Clear timeout timer
60
+ clearTimeout(pending.timer);
61
+ this.pendingResponses.delete(requestId);
62
+ // Resolve or reject the promise
63
+ if (error) {
64
+ pending.reject(new Error(`Async tool failed: ${error}`));
65
+ }
66
+ else {
67
+ pending.resolve(result);
68
+ }
69
+ }, { broker: 'default' });
70
+ this.subscribed = true;
71
+ logger.info(MODULE_AGENT, 'AsyncResponseManager: Subscribed to kadi.ability.response notifications', timer.elapsed('main'));
72
+ }
73
+ /**
74
+ * Wait for async ability response from kadi-broker
75
+ */
76
+ waitForResponse(requestId, timeout) {
77
+ return new Promise((resolve, reject) => {
78
+ // Setup timeout
79
+ const timer = setTimeout(() => {
80
+ this.pendingResponses.delete(requestId);
81
+ reject(new Error(`Timeout waiting for async tool result: ${requestId}`));
82
+ }, timeout);
83
+ // Register promise resolver
84
+ this.pendingResponses.set(requestId, {
85
+ resolve,
86
+ reject,
87
+ timer
88
+ });
89
+ });
90
+ }
91
+ }
92
+ // ============================================================================
93
+ // Utility Functions
94
+ // ============================================================================
95
+ /**
96
+ * Invoke shrimp-task-manager tool via KĀDI broker protocol
97
+ *
98
+ * Provides consistent error handling, timeout management, and error classification
99
+ * for tools exposed by shrimp-task-manager MCP server. Uses KĀDI protocol.invokeTool()
100
+ * with standardized response handling.
101
+ *
102
+ * Error Classification:
103
+ * - **Transient errors** (retry recommended):
104
+ * - Network errors (ECONNREFUSED, ENOTFOUND)
105
+ * - Timeout errors
106
+ * - Rate limiting (429)
107
+ * - Service unavailable (503)
108
+ *
109
+ * - **Permanent errors** (fail-fast):
110
+ * - Validation errors (400)
111
+ * - Authentication errors (401, 403)
112
+ * - Not found errors (404)
113
+ * - Invalid input errors
114
+ *
115
+ * Response Handling:
116
+ * - Success (200-299): Returns { success: true, data: responseData }
117
+ * - Client error (400-499): Returns { success: false, error: { type: 'permanent', message } }
118
+ * - Server error (500-599): Returns { success: false, error: { type: 'transient', message } }
119
+ * - Network error: Returns { success: false, error: { type: 'transient', message } }
120
+ *
121
+ * @param protocol - KĀDI broker protocol instance (from client.getBrokerProtocol())
122
+ * @param toolName - Name of shrimp tool to invoke (e.g., 'shrimp_plan_task')
123
+ * @param params - Tool input parameters (validated by tool's input schema)
124
+ * @param options - Optional configuration (timeout, targetAgent)
125
+ * @returns Structured result with success flag and data/error
126
+ *
127
+ * @example
128
+ * ```typescript
129
+ * // Success case
130
+ * const result = await invokeShrimTool(
131
+ * protocol,
132
+ * 'shrimp_plan_task',
133
+ * { description: 'Implement feature X', requirements: 'Must be async' }
134
+ * );
135
+ *
136
+ * if (result.success) {
137
+ * console.log('Task planned:', result.data);
138
+ * } else {
139
+ * if (result.error.type === ErrorType.Transient) {
140
+ * // Retry with exponential backoff
141
+ * await retryWithBackoff(() => invokeShrimTool(...));
142
+ * } else {
143
+ * // Fail-fast on permanent errors
144
+ * console.error('Permanent error:', result.error.message);
145
+ * }
146
+ * }
147
+ * ```
148
+ *
149
+ * @example
150
+ * ```typescript
151
+ * // With custom timeout
152
+ * const result = await invokeShrimTool(
153
+ * protocol,
154
+ * 'shrimp_execute_task',
155
+ * { taskId: '123' },
156
+ * { timeout: 60000 } // 60 seconds
157
+ * );
158
+ * ```
159
+ *
160
+ * @example
161
+ * ```typescript
162
+ * // With custom target agent
163
+ * const result = await invokeShrimTool(
164
+ * protocol,
165
+ * 'shrimp_split_tasks',
166
+ * { tasksRaw: JSON.stringify([...]), updateMode: 'append' },
167
+ * { targetAgent: 'mcp-server-shrimp-custom' }
168
+ * );
169
+ * ```
170
+ */
171
+ export async function invokeShrimTool(protocol, toolName, params, options) {
172
+ // Extract options with defaults
173
+ const timeout = options?.timeout || 30000;
174
+ const targetAgent = options?.targetAgent || 'mcp-server-shrimp-agent-playground';
175
+ const client = options?.client; // KadiClient for async response subscription
176
+ try {
177
+ // Invoke tool via KĀDI protocol
178
+ const response = await protocol.invokeTool({
179
+ targetAgent,
180
+ toolName,
181
+ toolInput: params,
182
+ timeout
183
+ });
184
+ // Check if response is async pending
185
+ if (response && typeof response === 'object' &&
186
+ response.status === 'pending' && response.requestId) {
187
+ console.log(`⏳ Tool is pending, waiting for async result: ${response.requestId}`);
188
+ // Ensure AsyncResponseManager is subscribed (if client provided)
189
+ if (client) {
190
+ const asyncManager = AsyncResponseManager.getInstance();
191
+ asyncManager.subscribeToAbilityResponses(client);
192
+ // Wait for async response
193
+ try {
194
+ const asyncResult = await asyncManager.waitForResponse(response.requestId, timeout);
195
+ console.log(`📤 Async tool result received for ${response.requestId}`);
196
+ // Return the async result
197
+ return {
198
+ success: true,
199
+ data: asyncResult
200
+ };
201
+ }
202
+ catch (error) {
203
+ console.error(`❌ Async tool timeout: ${error.message}`);
204
+ return {
205
+ success: false,
206
+ error: {
207
+ type: ErrorType.Transient,
208
+ message: error.message,
209
+ original: error instanceof Error ? error : undefined
210
+ }
211
+ };
212
+ }
213
+ }
214
+ else {
215
+ // No client provided - cannot wait for async result
216
+ return {
217
+ success: false,
218
+ error: {
219
+ type: ErrorType.Permanent,
220
+ message: 'Tool returned pending status but no KadiClient provided for async response handling'
221
+ }
222
+ };
223
+ }
224
+ }
225
+ // Check response status code (if available)
226
+ // KĀDI protocol returns response with status code and data
227
+ const statusCode = response?.status || response?.statusCode || 200;
228
+ if (statusCode >= 200 && statusCode < 300) {
229
+ // Success response (2xx)
230
+ return {
231
+ success: true,
232
+ data: response?.data || response
233
+ };
234
+ }
235
+ else if (statusCode >= 400 && statusCode < 500) {
236
+ // Client error (4xx) - permanent error
237
+ return {
238
+ success: false,
239
+ error: {
240
+ type: ErrorType.Permanent,
241
+ message: response?.error || response?.message || `Client error: ${statusCode}`
242
+ }
243
+ };
244
+ }
245
+ else if (statusCode >= 500 && statusCode < 600) {
246
+ // Server error (5xx) - transient error
247
+ return {
248
+ success: false,
249
+ error: {
250
+ type: ErrorType.Transient,
251
+ message: response?.error || response?.message || `Server error: ${statusCode}`
252
+ }
253
+ };
254
+ }
255
+ else {
256
+ // Unknown status code - treat as permanent error
257
+ return {
258
+ success: false,
259
+ error: {
260
+ type: ErrorType.Permanent,
261
+ message: `Unknown status code: ${statusCode}`
262
+ }
263
+ };
264
+ }
265
+ }
266
+ catch (error) {
267
+ // Network error, timeout, or other exception
268
+ const classification = classifyToolError(error);
269
+ return {
270
+ success: false,
271
+ error: {
272
+ type: classification.type === 'transient' ? ErrorType.Transient : ErrorType.Permanent,
273
+ message: classification.message,
274
+ original: error instanceof Error ? error : undefined
275
+ }
276
+ };
277
+ }
278
+ }
279
+ /**
280
+ * Type guard to check if result is a success
281
+ *
282
+ * @param result - Tool invocation result
283
+ * @returns True if result is success
284
+ *
285
+ * @example
286
+ * ```typescript
287
+ * if (isToolSuccess(result)) {
288
+ * console.log('Success:', result.data);
289
+ * }
290
+ * ```
291
+ */
292
+ export function isToolSuccess(result) {
293
+ return result.success === true;
294
+ }
295
+ /**
296
+ * Type guard to check if result is a failure
297
+ *
298
+ * @param result - Tool invocation result
299
+ * @returns True if result is failure
300
+ *
301
+ * @example
302
+ * ```typescript
303
+ * if (isToolFailure(result)) {
304
+ * console.error('Failure:', result.error.message);
305
+ * }
306
+ * ```
307
+ */
308
+ export function isToolFailure(result) {
309
+ return result.success === false;
310
+ }
311
+ // ============================================================================
312
+ // Orchestration Utility Functions
313
+ // ============================================================================
314
+ /**
315
+ * Orchestrate workflow using Claude API streaming with tool invocation (Option C pattern)
316
+ *
317
+ * Implements agent-producer Option C orchestration flow:
318
+ * 1. Stream Claude API response with tool definitions
319
+ * 2. When Claude requests tool use, pause stream
320
+ * 3. Invoke tool via invokeShrimTool() with KĀDI protocol
321
+ * 4. Resume stream with tool_result
322
+ * 5. Accumulate text blocks for final response
323
+ * 6. Log all tool invocations for debugging
324
+ *
325
+ * Streaming Architecture:
326
+ * - Uses Anthropic SDK streaming API for low-latency responses
327
+ * - Handles streaming interruptions gracefully (tool_use blocks)
328
+ * - Accumulates partial text blocks into final response
329
+ * - Maintains tool invocation log for analysis
330
+ *
331
+ * Error Handling:
332
+ * - Tool invocation failures are passed back to Claude as error tool_result
333
+ * - Stream errors are caught and returned in OrchestrationResult
334
+ * - Graceful degradation if tool invocation fails
335
+ *
336
+ * @param anthropic - Anthropic SDK client instance
337
+ * @param protocol - KĀDI broker protocol instance (from client.getBrokerProtocol())
338
+ * @param prompt - User prompt to send to Claude
339
+ * @param availableTools - Array of tool definitions Claude can use
340
+ * @param options - Optional configuration (max_tokens, temperature, system prompts, etc.)
341
+ * @returns Orchestration result with accumulated text and tool invocation log
342
+ *
343
+ * @example
344
+ * ```typescript
345
+ * // Basic usage
346
+ * const result = await orchestrateWithClaude(
347
+ * anthropic,
348
+ * protocol,
349
+ * 'Plan a task to implement feature X',
350
+ * [
351
+ * {
352
+ * name: 'shrimp_plan_task',
353
+ * description: 'Create task plan with requirements',
354
+ * input_schema: {
355
+ * type: 'object',
356
+ * properties: {
357
+ * description: { type: 'string' },
358
+ * requirements: { type: 'string' }
359
+ * },
360
+ * required: ['description']
361
+ * }
362
+ * }
363
+ * ]
364
+ * );
365
+ *
366
+ * if (result.success) {
367
+ * console.log('Claude response:', result.text);
368
+ * console.log('Tools invoked:', result.toolInvocations.length);
369
+ * }
370
+ * ```
371
+ *
372
+ * @example
373
+ * ```typescript
374
+ * // With custom options
375
+ * const result = await orchestrateWithClaude(
376
+ * anthropic,
377
+ * protocol,
378
+ * 'Split tasks for feature implementation',
379
+ * tools,
380
+ * {
381
+ * max_tokens: 16000,
382
+ * temperature: 0.7,
383
+ * system: ['You are a task planning assistant'],
384
+ * toolTimeout: 60000
385
+ * }
386
+ * );
387
+ * ```
388
+ */
389
+ export async function orchestrateWithClaude(anthropic, protocol, prompt, availableTools, options) {
390
+ // Extract options with defaults
391
+ const maxTokens = options?.max_tokens || 8000;
392
+ const temperature = options?.temperature || 1.0;
393
+ const system = options?.system || [];
394
+ const model = options?.model || 'claude-sonnet-4-5-20250929';
395
+ const toolTimeout = options?.toolTimeout || 30000;
396
+ const targetAgent = options?.targetAgent || 'mcp-server-shrimp-agent-playground';
397
+ const client = options?.client; // KadiClient for async response handling
398
+ // Initialize result
399
+ const result = {
400
+ text: '',
401
+ toolInvocations: [],
402
+ success: false
403
+ };
404
+ try {
405
+ console.log('🤖 Starting Claude API orchestration...');
406
+ console.log(` Model: ${model}`);
407
+ console.log(` Max tokens: ${maxTokens}`);
408
+ console.log(` Temperature: ${temperature}`);
409
+ console.log(` Available tools: ${availableTools.map(t => t.name).join(', ')}`);
410
+ // Build messages array for Claude API
411
+ const messages = [
412
+ {
413
+ role: 'user',
414
+ content: prompt
415
+ }
416
+ ];
417
+ // Orchestration loop - continue until Claude stops requesting tools
418
+ let continueOrchestration = true;
419
+ let iterationCount = 0;
420
+ const maxIterations = 10; // Prevent infinite loops
421
+ while (continueOrchestration && iterationCount < maxIterations) {
422
+ iterationCount++;
423
+ console.log(`\n📡 Orchestration iteration ${iterationCount}/${maxIterations}`);
424
+ // Stream Claude API response
425
+ const stream = await anthropic.messages.stream({
426
+ model,
427
+ max_tokens: maxTokens,
428
+ temperature,
429
+ system: system.length > 0 ? system.join('\n') : undefined,
430
+ messages,
431
+ tools: availableTools.length > 0 ? availableTools : undefined
432
+ });
433
+ // Accumulate content blocks from stream
434
+ let textAccumulator = '';
435
+ const toolUseBlocks = [];
436
+ // Process stream events
437
+ for await (const event of stream) {
438
+ if (event.type === 'content_block_delta') {
439
+ // Handle text delta
440
+ if (event.delta.type === 'text_delta') {
441
+ textAccumulator += event.delta.text;
442
+ }
443
+ }
444
+ else if (event.type === 'content_block_start') {
445
+ // Handle tool use block
446
+ if (event.content_block.type === 'tool_use') {
447
+ console.log(`\n🔧 Claude requested tool: ${event.content_block.name}`);
448
+ toolUseBlocks.push({
449
+ id: event.content_block.id,
450
+ name: event.content_block.name,
451
+ input: event.content_block.input
452
+ });
453
+ }
454
+ }
455
+ }
456
+ // Accumulate text to result
457
+ if (textAccumulator.length > 0) {
458
+ result.text += textAccumulator;
459
+ console.log(`\n📝 Claude response: ${textAccumulator.substring(0, 150)}${textAccumulator.length > 150 ? '...' : ''}`);
460
+ }
461
+ // Check if Claude requested tool use
462
+ if (toolUseBlocks.length > 0) {
463
+ console.log(`\n🛠️ Processing ${toolUseBlocks.length} tool invocation(s)...`);
464
+ // Build tool results for next iteration
465
+ const toolResults = [];
466
+ // Invoke each tool
467
+ for (const toolUse of toolUseBlocks) {
468
+ console.log(`\n → Invoking: ${toolUse.name}`);
469
+ console.log(` Input: ${JSON.stringify(toolUse.input).substring(0, 100)}...`);
470
+ const startTime = Date.now();
471
+ // Invoke tool via invokeShrimTool
472
+ const toolResult = await invokeShrimTool(protocol, toolUse.name, toolUse.input, { timeout: toolTimeout, targetAgent, client });
473
+ const durationMs = Date.now() - startTime;
474
+ // Log tool invocation
475
+ const invocation = {
476
+ toolName: toolUse.name,
477
+ input: toolUse.input,
478
+ result: toolResult,
479
+ timestamp: new Date().toISOString(),
480
+ durationMs
481
+ };
482
+ result.toolInvocations.push(invocation);
483
+ console.log(` ✅ Completed in ${durationMs}ms`);
484
+ console.log(` Success: ${toolResult.success}`);
485
+ // Build tool result for Claude
486
+ if (toolResult.success) {
487
+ toolResults.push({
488
+ type: 'tool_result',
489
+ tool_use_id: toolUse.id,
490
+ content: JSON.stringify(toolResult.data)
491
+ });
492
+ }
493
+ else {
494
+ // Pass error back to Claude
495
+ toolResults.push({
496
+ type: 'tool_result',
497
+ tool_use_id: toolUse.id,
498
+ content: `Error: ${toolResult.error?.message}`,
499
+ is_error: true
500
+ });
501
+ }
502
+ }
503
+ // Add assistant message with tool use blocks
504
+ messages.push({
505
+ role: 'assistant',
506
+ content: toolUseBlocks.map(tu => ({
507
+ type: 'tool_use',
508
+ id: tu.id,
509
+ name: tu.name,
510
+ input: tu.input
511
+ }))
512
+ });
513
+ // Add user message with tool results
514
+ messages.push({
515
+ role: 'user',
516
+ content: toolResults
517
+ });
518
+ // Continue orchestration loop
519
+ continueOrchestration = true;
520
+ }
521
+ else {
522
+ // No tool use - orchestration complete
523
+ console.log('\n✅ Orchestration complete (no tool use requested)');
524
+ continueOrchestration = false;
525
+ }
526
+ }
527
+ if (iterationCount >= maxIterations) {
528
+ console.warn('\n⚠️ Orchestration loop exceeded max iterations - stopping');
529
+ result.error = 'Orchestration loop exceeded maximum iterations';
530
+ }
531
+ result.success = true;
532
+ console.log('\n✅ Claude API orchestration succeeded');
533
+ console.log(` Total text length: ${result.text.length} characters`);
534
+ console.log(` Total tool invocations: ${result.toolInvocations.length}`);
535
+ return result;
536
+ }
537
+ catch (error) {
538
+ console.error('\n❌ Claude API orchestration failed');
539
+ console.error(` Error: ${error.message || String(error)}`);
540
+ result.success = false;
541
+ result.error = error.message || String(error);
542
+ return result;
543
+ }
544
+ }
545
+ // ============================================================================
546
+ // Event Publishing Utility Functions
547
+ // ============================================================================
548
+ /**
549
+ * Publish standardized tool event to KĀDI broker
550
+ *
551
+ * Creates consistent event structure across all agent-producer tools with
552
+ * required metadata fields (timestamp, agentName, toolName, taskId).
553
+ *
554
+ * Topic Pattern: producer.tool.{eventType}
555
+ * - producer.tool.invoked - Tool invocation started
556
+ * - producer.tool.completed - Tool completed successfully
557
+ * - producer.tool.failed - Tool invocation failed
558
+ *
559
+ * Event Structure:
560
+ * ```typescript
561
+ * {
562
+ * timestamp: string; // ISO 8601 timestamp
563
+ * agentName: string; // 'producer' (default)
564
+ * toolName: string; // Tool that was invoked
565
+ * taskId?: string; // Optional task ID
566
+ * ...data // Additional event data
567
+ * }
568
+ * ```
569
+ *
570
+ * Validation:
571
+ * - Topic pattern validated using validateTopicPattern()
572
+ * - Ensures backward compatibility with existing event conventions
573
+ *
574
+ * Error Handling:
575
+ * - Invalid topic patterns logged as warnings
576
+ * - Publishing failures logged but do not throw
577
+ * - Graceful degradation if broker unavailable
578
+ *
579
+ * @param client - KĀDI client instance (from KadiClient)
580
+ * @param eventType - Event type suffix (e.g., 'invoked', 'completed', 'failed')
581
+ * @param data - Event data payload (will be merged with metadata)
582
+ * @param metadata - Required metadata (toolName, optional taskId, agentName)
583
+ *
584
+ * @example
585
+ * ```typescript
586
+ * // Publish tool invocation event
587
+ * await publishToolEvent(
588
+ * client,
589
+ * 'invoked',
590
+ * { input: { description: 'Plan feature X' } },
591
+ * { toolName: 'shrimp_plan_task', taskId: 'task-123' }
592
+ * );
593
+ * // Topic: producer.tool.invoked
594
+ * // Payload: { timestamp, agentName: 'producer', toolName, taskId, input: {...} }
595
+ * ```
596
+ *
597
+ * @example
598
+ * ```typescript
599
+ * // Publish tool completion event
600
+ * await publishToolEvent(
601
+ * client,
602
+ * 'completed',
603
+ * { result: { success: true, data: {...} }, durationMs: 1500 },
604
+ * { toolName: 'shrimp_execute_task', taskId: 'task-456' }
605
+ * );
606
+ * // Topic: producer.tool.completed
607
+ * ```
608
+ *
609
+ * @example
610
+ * ```typescript
611
+ * // Publish tool failure event
612
+ * await publishToolEvent(
613
+ * client,
614
+ * 'failed',
615
+ * { error: 'Validation failed', errorType: 'permanent' },
616
+ * { toolName: 'shrimp_split_tasks', taskId: 'task-789' }
617
+ * );
618
+ * // Topic: producer.tool.failed
619
+ * ```
620
+ */
621
+ export async function publishToolEvent(client, eventType, data, metadata) {
622
+ // Extract metadata with defaults
623
+ const agentName = metadata.agentName || 'producer';
624
+ const toolName = metadata.toolName;
625
+ const taskId = metadata.taskId;
626
+ // Construct topic: producer.tool.{eventType}
627
+ const topic = `producer.tool.${eventType}`;
628
+ // Validate topic pattern
629
+ if (!validateTopicPattern(topic)) {
630
+ console.warn(`⚠️ Invalid topic pattern: ${topic}`);
631
+ console.warn(` Expected format: {platform}.{event_type}.{bot_id}`);
632
+ console.warn(` This may cause routing issues in KĀDI broker`);
633
+ }
634
+ // Build event payload with required metadata
635
+ const eventPayload = {
636
+ timestamp: new Date().toISOString(),
637
+ agentName,
638
+ toolName,
639
+ ...(taskId ? { taskId } : {}),
640
+ ...data
641
+ };
642
+ try {
643
+ console.log(`📤 Publishing tool event`);
644
+ console.log(` Topic: ${topic}`);
645
+ console.log(` Tool: ${toolName}`);
646
+ if (taskId) {
647
+ console.log(` Task ID: ${taskId}`);
648
+ }
649
+ console.log(` Event type: ${eventType}`);
650
+ console.log(` Payload keys: ${Object.keys(eventPayload).join(', ')}`);
651
+ // Publish event to KĀDI broker
652
+ await client.publish(topic, eventPayload, { broker: 'default', network: 'global' });
653
+ console.log(` ✅ Event published successfully`);
654
+ }
655
+ catch (error) {
656
+ // Log error but don't throw - graceful degradation
657
+ console.error(`❌ Failed to publish tool event (non-fatal)`);
658
+ console.error(` Topic: ${topic}`);
659
+ console.error(` Tool: ${toolName}`);
660
+ console.error(` Error: ${error.message || String(error)}`);
661
+ // Don't throw - event publishing failure should not crash tool execution
662
+ }
663
+ }
664
+ //# sourceMappingURL=producer-tool-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"producer-tool-utils.js","sourceRoot":"","sources":["../src/producer-tool-utils.ts"],"names":[],"mappings":"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"}