@everworker/oneringai 0.3.2 → 0.4.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/README.md +115 -3
- package/dist/capabilities/agents/index.cjs +14 -2
- package/dist/capabilities/agents/index.cjs.map +1 -1
- package/dist/capabilities/agents/index.d.cts +1 -1
- package/dist/capabilities/agents/index.d.ts +1 -1
- package/dist/capabilities/agents/index.js +14 -2
- package/dist/capabilities/agents/index.js.map +1 -1
- package/dist/capabilities/images/index.cjs.map +1 -1
- package/dist/capabilities/images/index.js.map +1 -1
- package/dist/{index-WlQwiNF8.d.cts → index-CR5PHkck.d.cts} +6 -1
- package/dist/{index-BeZcWDiq.d.ts → index-Cb7N9QIj.d.ts} +6 -1
- package/dist/index.cjs +2148 -566
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +919 -340
- package/dist/index.d.ts +919 -340
- package/dist/index.js +2054 -491
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -31,7 +31,9 @@
|
|
|
31
31
|
- [16. Developer Tools](#16-developer-tools)
|
|
32
32
|
- [17. Custom Tool Generation](#17-custom-tool-generation-new) — Agents create, test, and persist their own tools
|
|
33
33
|
- [18. Document Reader](#18-document-reader) — PDF, DOCX, XLSX, PPTX, CSV, HTML, images
|
|
34
|
-
- [
|
|
34
|
+
- [20. Routine Execution](#20-routine-execution) — Multi-step workflows with task dependencies, validation, and memory bridging
|
|
35
|
+
- [21. External API Integration](#21-external-api-integration) — Scoped Registry, Vendor Templates, Tool Discovery
|
|
36
|
+
- [22. Microsoft Graph Connector Tools](#22-microsoft-graph-connector-tools-new) — Email, calendar, meetings, and Teams transcripts
|
|
35
37
|
- [MCP Integration](#mcp-model-context-protocol-integration)
|
|
36
38
|
- [Documentation](#documentation)
|
|
37
39
|
- [Examples](#examples)
|
|
@@ -101,6 +103,8 @@ Better to see once and then dig in the code! :)
|
|
|
101
103
|
- 💾 **StorageRegistry** - Centralized storage configuration — swap all backends (sessions, media, custom tools, etc.) with one `configure()` call
|
|
102
104
|
- 🔐 **OAuth 2.0** - Full OAuth support for external APIs with encrypted token storage
|
|
103
105
|
- 📦 **Vendor Templates** - NEW: Pre-configured auth templates for 43+ services (GitHub, Slack, Stripe, etc.)
|
|
106
|
+
- 📧 **Microsoft Graph Tools** - NEW: Email, calendar, meetings, and Teams transcripts via Microsoft Graph API
|
|
107
|
+
- 🔁 **Routine Execution** - NEW: Multi-step workflows with task dependencies, LLM validation, retry logic, and memory bridging between tasks
|
|
104
108
|
- 🔄 **Streaming** - Real-time responses with event streams
|
|
105
109
|
- 📝 **TypeScript** - Full type safety and IntelliSense support
|
|
106
110
|
|
|
@@ -640,6 +644,7 @@ StorageRegistry.configure({
|
|
|
640
644
|
sessions: (agentId, ctx) => new RedisContextStorage(agentId, ctx?.tenantId),
|
|
641
645
|
persistentInstructions: (agentId, ctx) => new DBInstructionsStorage(agentId, ctx?.userId),
|
|
642
646
|
workingMemory: (ctx) => new RedisMemoryStorage(ctx?.tenantId),
|
|
647
|
+
routineDefinitions: (ctx) => new MongoRoutineStorage(ctx?.userId),
|
|
643
648
|
});
|
|
644
649
|
|
|
645
650
|
// All agents and tools automatically use these backends
|
|
@@ -1240,7 +1245,70 @@ await agent.run([
|
|
|
1240
1245
|
|
|
1241
1246
|
See the [User Guide](./USER_GUIDE.md#document-reader) for complete API reference and configuration options.
|
|
1242
1247
|
|
|
1243
|
-
### 20.
|
|
1248
|
+
### 20. Routine Execution (NEW)
|
|
1249
|
+
|
|
1250
|
+
Execute multi-step AI workflows where tasks run in dependency order with automatic validation:
|
|
1251
|
+
|
|
1252
|
+
```typescript
|
|
1253
|
+
import { executeRoutine, createRoutineDefinition } from '@everworker/oneringai';
|
|
1254
|
+
|
|
1255
|
+
const routine = createRoutineDefinition({
|
|
1256
|
+
name: 'Research Report',
|
|
1257
|
+
tasks: [
|
|
1258
|
+
{
|
|
1259
|
+
name: 'Research',
|
|
1260
|
+
description: 'Search for information about quantum computing',
|
|
1261
|
+
suggestedTools: ['web_search'],
|
|
1262
|
+
validation: {
|
|
1263
|
+
completionCriteria: ['At least 3 sources found', 'Key findings stored in memory'],
|
|
1264
|
+
},
|
|
1265
|
+
},
|
|
1266
|
+
{
|
|
1267
|
+
name: 'Write Report',
|
|
1268
|
+
description: 'Write a report based on research findings',
|
|
1269
|
+
dependsOn: ['Research'],
|
|
1270
|
+
validation: {
|
|
1271
|
+
completionCriteria: ['Report has introduction and conclusion', 'Sources are cited'],
|
|
1272
|
+
},
|
|
1273
|
+
},
|
|
1274
|
+
],
|
|
1275
|
+
});
|
|
1276
|
+
|
|
1277
|
+
const execution = await executeRoutine({
|
|
1278
|
+
definition: routine,
|
|
1279
|
+
connector: 'openai',
|
|
1280
|
+
model: 'gpt-4',
|
|
1281
|
+
tools: [...searchTools],
|
|
1282
|
+
onTaskComplete: (task, exec) => console.log(`[${exec.progress}%] ${task.name} done`),
|
|
1283
|
+
});
|
|
1284
|
+
|
|
1285
|
+
console.log(execution.status); // 'completed' | 'failed'
|
|
1286
|
+
```
|
|
1287
|
+
|
|
1288
|
+
**Key Features:**
|
|
1289
|
+
- 🔗 **Task Dependencies** - DAG-based ordering via `dependsOn`
|
|
1290
|
+
- 🧠 **Memory Bridging** - In-context memory (`context_set`) + working memory (`memory_store`) persist across tasks while conversation is cleared
|
|
1291
|
+
- 🔍 **LLM Validation** - Self-reflection against completion criteria with configurable score thresholds
|
|
1292
|
+
- 🔄 **Retry Logic** - Configurable `maxAttempts` per task with automatic retry on validation failure
|
|
1293
|
+
- 📊 **Progress Tracking** - Real-time callbacks and progress percentage
|
|
1294
|
+
- ⚙️ **Failure Modes** - `fail-fast` (default) or `continue` for independent tasks
|
|
1295
|
+
- 🎨 **Custom Prompts** - Override system, task, or validation prompts
|
|
1296
|
+
|
|
1297
|
+
**Routine Persistence:** Save and load routine definitions with `FileRoutineDefinitionStorage` (or implement `IRoutineDefinitionStorage` for custom backends). Per-user isolation via optional `userId`. Integrated into `StorageRegistry` as `routineDefinitions`.
|
|
1298
|
+
|
|
1299
|
+
```typescript
|
|
1300
|
+
import { createFileRoutineDefinitionStorage, createRoutineDefinition } from '@everworker/oneringai';
|
|
1301
|
+
|
|
1302
|
+
const storage = createFileRoutineDefinitionStorage();
|
|
1303
|
+
const routine = createRoutineDefinition({ name: 'Daily Report', description: '...', tasks: [...] });
|
|
1304
|
+
await storage.save(undefined, routine); // undefined = default user
|
|
1305
|
+
const loaded = await storage.load(undefined, routine.id);
|
|
1306
|
+
const all = await storage.list(undefined, { tags: ['daily'] });
|
|
1307
|
+
```
|
|
1308
|
+
|
|
1309
|
+
> See the [User Guide](./USER_GUIDE.md#routine-execution) for the complete API reference, architecture details, and examples.
|
|
1310
|
+
|
|
1311
|
+
### 21. External API Integration
|
|
1244
1312
|
|
|
1245
1313
|
Connect your AI agents to 35+ external services with enterprise-grade resilience:
|
|
1246
1314
|
|
|
@@ -1280,6 +1348,7 @@ await agent.run('Show me PR #42 and summarize the review comments');
|
|
|
1280
1348
|
**Supported Services (35+):**
|
|
1281
1349
|
- **Communication**: Slack, Discord, Microsoft Teams, Twilio
|
|
1282
1350
|
- **Development**: GitHub *(7 built-in tools)*, GitLab, Jira, Linear, Bitbucket
|
|
1351
|
+
- **Microsoft**: Microsoft Graph *(6 built-in tools)* — email, calendar, meetings, Teams transcripts
|
|
1283
1352
|
- **Productivity**: Notion, Asana, Monday, Airtable, Trello
|
|
1284
1353
|
- **CRM**: Salesforce, HubSpot, Zendesk, Intercom
|
|
1285
1354
|
- **Payments**: Stripe, PayPal, Square
|
|
@@ -1446,6 +1515,49 @@ for (const tool of allTools) {
|
|
|
1446
1515
|
}
|
|
1447
1516
|
```
|
|
1448
1517
|
|
|
1518
|
+
### 22. Microsoft Graph Connector Tools (NEW)
|
|
1519
|
+
|
|
1520
|
+
6 dedicated tools for Microsoft Graph API — email, calendar, meetings, and Teams transcripts. Auto-registered for connectors with `serviceType: 'microsoft'` or `baseURL` matching `graph.microsoft.com`.
|
|
1521
|
+
|
|
1522
|
+
```typescript
|
|
1523
|
+
import { Connector, ConnectorTools, Services, Agent } from '@everworker/oneringai';
|
|
1524
|
+
|
|
1525
|
+
// Create a Microsoft connector (OAuth required for most operations)
|
|
1526
|
+
Connector.create({
|
|
1527
|
+
name: 'microsoft',
|
|
1528
|
+
serviceType: Services.Microsoft,
|
|
1529
|
+
auth: { type: 'oauth', /* ... OAuth config ... */ },
|
|
1530
|
+
baseURL: 'https://graph.microsoft.com/v1.0',
|
|
1531
|
+
});
|
|
1532
|
+
|
|
1533
|
+
// Get all Microsoft tools (generic API + 6 dedicated tools)
|
|
1534
|
+
const tools = ConnectorTools.for('microsoft');
|
|
1535
|
+
|
|
1536
|
+
const agent = Agent.create({
|
|
1537
|
+
connector: 'openai',
|
|
1538
|
+
model: 'gpt-4',
|
|
1539
|
+
tools,
|
|
1540
|
+
});
|
|
1541
|
+
|
|
1542
|
+
await agent.run('Draft an email to alice@example.com about the project update');
|
|
1543
|
+
await agent.run('Schedule a 30-minute meeting with bob@example.com next Tuesday at 2pm');
|
|
1544
|
+
await agent.run('Find available meeting slots for alice and bob this week');
|
|
1545
|
+
```
|
|
1546
|
+
|
|
1547
|
+
**Tools:**
|
|
1548
|
+
| Tool | Description | Risk |
|
|
1549
|
+
|------|-------------|------|
|
|
1550
|
+
| `create_draft_email` | Create a draft email or reply draft | medium |
|
|
1551
|
+
| `send_email` | Send an email or reply immediately | medium |
|
|
1552
|
+
| `create_meeting` | Create calendar event with optional Teams link | medium |
|
|
1553
|
+
| `edit_meeting` | Update an existing calendar event | medium |
|
|
1554
|
+
| `find_meeting_slots` | Find available slots when all attendees are free | low |
|
|
1555
|
+
| `get_meeting_transcript` | Retrieve Teams meeting transcript as text | low |
|
|
1556
|
+
|
|
1557
|
+
Supports both **delegated** (`/me` — user signs in) and **application** (`/users/{id}` — app-only) permission modes. See the [User Guide](./USER_GUIDE.md#microsoft-graph-connector-tools) for full parameter reference.
|
|
1558
|
+
|
|
1559
|
+
---
|
|
1560
|
+
|
|
1449
1561
|
## MCP (Model Context Protocol) Integration
|
|
1450
1562
|
|
|
1451
1563
|
Connect to MCP servers for automatic tool discovery and seamless integration:
|
|
@@ -1592,4 +1704,4 @@ MIT License - See [LICENSE](./LICENSE) file.
|
|
|
1592
1704
|
|
|
1593
1705
|
---
|
|
1594
1706
|
|
|
1595
|
-
**Version:** 0.3.
|
|
1707
|
+
**Version:** 0.3.2 | **Last Updated:** 2026-02-19 | **[User Guide](./USER_GUIDE.md)** | **[API Reference](./API_REFERENCE.md)** | **[Changelog](./CHANGELOG.md)**
|
|
@@ -262,6 +262,18 @@ var HookManager = class {
|
|
|
262
262
|
}
|
|
263
263
|
existing.push(hook);
|
|
264
264
|
}
|
|
265
|
+
/**
|
|
266
|
+
* Unregister a specific hook function by reference.
|
|
267
|
+
* Returns true if the hook was found and removed.
|
|
268
|
+
*/
|
|
269
|
+
unregister(name, hook) {
|
|
270
|
+
const hooks = this.hooks.get(name);
|
|
271
|
+
if (!hooks) return false;
|
|
272
|
+
const index = hooks.indexOf(hook);
|
|
273
|
+
if (index === -1) return false;
|
|
274
|
+
hooks.splice(index, 1);
|
|
275
|
+
return true;
|
|
276
|
+
}
|
|
265
277
|
/**
|
|
266
278
|
* Execute hooks for a given name
|
|
267
279
|
*/
|
|
@@ -284,7 +296,7 @@ var HookManager = class {
|
|
|
284
296
|
const hook = hooks[i];
|
|
285
297
|
const hookKey = this.getHookKey(hook, i);
|
|
286
298
|
const hookResult = await this.executeHookSafely(hook, context, hookKey);
|
|
287
|
-
if (hookResult
|
|
299
|
+
if (hookResult == null) {
|
|
288
300
|
continue;
|
|
289
301
|
}
|
|
290
302
|
result = { ...result, ...hookResult };
|
|
@@ -304,7 +316,7 @@ var HookManager = class {
|
|
|
304
316
|
return this.executeHookSafely(hook, context, hookKey);
|
|
305
317
|
})
|
|
306
318
|
);
|
|
307
|
-
const validResults = results.filter((r) => r
|
|
319
|
+
const validResults = results.filter((r) => r != null);
|
|
308
320
|
return validResults.reduce(
|
|
309
321
|
(acc, hookResult) => ({ ...acc, ...hookResult }),
|
|
310
322
|
defaultResult
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/capabilities/agents/ExecutionContext.ts","../../../src/capabilities/agents/HookManager.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Execution context - tracks state, metrics, and history for agent execution\n * Includes memory safety (circular buffers) and resource limits\n */\n\nimport { AgentResponse } from '../../domain/entities/Response.js';\nimport { TextGenerateOptions } from '../../domain/interfaces/ITextProvider.js';\nimport { ToolCall, ToolResult, ToolCallState } from '../../domain/entities/Tool.js';\n\nexport type HistoryMode = 'none' | 'summary' | 'full';\n\nexport interface ExecutionContextConfig {\n maxHistorySize?: number; // Max iterations to store (default: 10)\n historyMode?: HistoryMode; // What to store (default: 'summary')\n maxAuditTrailSize?: number; // Max audit entries (default: 1000)\n}\n\nexport interface IterationRecord {\n iteration: number;\n request: TextGenerateOptions;\n response: AgentResponse;\n toolCalls: ToolCall[];\n toolResults: ToolResult[];\n startTime: Date;\n endTime: Date;\n}\n\nexport interface IterationSummary {\n iteration: number;\n tokens: number;\n toolCount: number;\n duration: number;\n timestamp: Date;\n}\n\nexport interface ExecutionMetrics {\n // Timing\n totalDuration: number;\n llmDuration: number;\n toolDuration: number;\n hookDuration: number;\n\n // Counts\n iterationCount: number;\n toolCallCount: number;\n toolSuccessCount: number;\n toolFailureCount: number;\n toolTimeoutCount: number;\n\n // Tokens\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n\n // Errors\n errors: Array<{ type: string; message: string; timestamp: Date }>;\n}\n\nexport interface AuditEntry {\n timestamp: Date;\n type:\n | 'hook_executed'\n | 'tool_modified'\n | 'tool_skipped'\n | 'execution_paused'\n | 'execution_resumed'\n | 'tool_approved'\n | 'tool_rejected'\n | 'tool_blocked'\n | 'tool_permission_approved';\n hookName?: string;\n toolName?: string;\n details: any;\n}\n\nexport class ExecutionContext {\n // Execution metadata\n readonly executionId: string;\n readonly startTime: Date;\n iteration: number = 0;\n\n // Tool tracking\n readonly toolCalls: Map<string, ToolCall> = new Map();\n readonly toolResults: Map<string, ToolResult> = new Map();\n\n // Control state\n paused: boolean = false;\n pauseReason?: string;\n cancelled: boolean = false;\n cancelReason?: string;\n\n // User data (for hooks to share state)\n readonly metadata: Map<string, any> = new Map();\n\n // History storage (memory-safe)\n private readonly config: ExecutionContextConfig;\n private readonly iterations: IterationRecord[] = [];\n private readonly iterationSummaries: IterationSummary[] = [];\n\n // Metrics\n readonly metrics: ExecutionMetrics = {\n totalDuration: 0,\n llmDuration: 0,\n toolDuration: 0,\n hookDuration: 0,\n iterationCount: 0,\n toolCallCount: 0,\n toolSuccessCount: 0,\n toolFailureCount: 0,\n toolTimeoutCount: 0,\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n errors: [],\n };\n\n // Audit trail\n private readonly auditTrail: AuditEntry[] = [];\n\n constructor(\n executionId: string,\n config: ExecutionContextConfig = {}\n ) {\n this.executionId = executionId;\n this.startTime = new Date();\n this.config = {\n maxHistorySize: config.maxHistorySize || 10,\n historyMode: config.historyMode || 'summary',\n maxAuditTrailSize: config.maxAuditTrailSize || 1000,\n };\n }\n\n /**\n * Add iteration to history (memory-safe)\n */\n addIteration(record: IterationRecord): void {\n switch (this.config.historyMode) {\n case 'none':\n // Don't store anything\n break;\n\n case 'summary':\n // Store lightweight summary only\n this.iterationSummaries.push({\n iteration: record.iteration,\n tokens: record.response.usage.total_tokens,\n toolCount: record.toolCalls.length,\n duration: record.endTime.getTime() - record.startTime.getTime(),\n timestamp: record.startTime,\n });\n\n // Keep circular buffer\n if (this.iterationSummaries.length > this.config.maxHistorySize!) {\n this.iterationSummaries.shift();\n }\n break;\n\n case 'full':\n // Store full iteration data\n this.iterations.push(record);\n\n // Keep circular buffer\n if (this.iterations.length > this.config.maxHistorySize!) {\n this.iterations.shift();\n }\n break;\n }\n }\n\n /**\n * Get iteration history\n */\n getHistory(): IterationRecord[] | IterationSummary[] {\n return this.config.historyMode === 'full' ? this.iterations : this.iterationSummaries;\n }\n\n /**\n * Add audit entry\n */\n audit(type: AuditEntry['type'], details: any, hookName?: string, toolName?: string): void {\n this.auditTrail.push({\n timestamp: new Date(),\n type,\n hookName,\n toolName,\n details,\n });\n\n // Keep circular buffer\n if (this.auditTrail.length > this.config.maxAuditTrailSize!) {\n this.auditTrail.shift();\n }\n }\n\n /**\n * Get audit trail\n */\n getAuditTrail(): readonly AuditEntry[] {\n return this.auditTrail;\n }\n\n /**\n * Update metrics\n */\n updateMetrics(update: Partial<ExecutionMetrics>): void {\n Object.assign(this.metrics, update);\n }\n\n /**\n * Add tool call to tracking\n */\n addToolCall(toolCall: ToolCall): void {\n this.toolCalls.set(toolCall.id, toolCall);\n this.metrics.toolCallCount++;\n }\n\n /**\n * Add tool result to tracking\n */\n addToolResult(result: ToolResult): void {\n this.toolResults.set(result.tool_use_id, result);\n\n // Update metrics\n if (result.state === ToolCallState.COMPLETED) {\n this.metrics.toolSuccessCount++;\n } else if (result.state === ToolCallState.FAILED) {\n this.metrics.toolFailureCount++;\n } else if (result.state === ToolCallState.TIMEOUT) {\n this.metrics.toolTimeoutCount++;\n }\n }\n\n /**\n * Check resource limits\n */\n checkLimits(limits?: {\n maxExecutionTime?: number;\n maxToolCalls?: number;\n maxContextSize?: number;\n }): void {\n if (!limits) return;\n\n // Check execution time\n if (limits.maxExecutionTime) {\n const elapsed = Date.now() - this.startTime.getTime();\n if (elapsed > limits.maxExecutionTime) {\n throw new Error(\n `Execution time limit exceeded: ${elapsed}ms > ${limits.maxExecutionTime}ms`\n );\n }\n }\n\n // Check tool call count\n if (limits.maxToolCalls && this.toolCalls.size > limits.maxToolCalls) {\n throw new Error(\n `Tool call limit exceeded: ${this.toolCalls.size} > ${limits.maxToolCalls}`\n );\n }\n\n // Check context size\n if (limits.maxContextSize) {\n const size = this.estimateSize();\n if (size > limits.maxContextSize) {\n throw new Error(\n `Context size limit exceeded: ${size} bytes > ${limits.maxContextSize} bytes`\n );\n }\n }\n }\n\n /**\n * Estimate memory usage (rough approximation)\n */\n private estimateSize(): number {\n try {\n const data = {\n toolCalls: Array.from(this.toolCalls.values()),\n toolResults: Array.from(this.toolResults.values()),\n iterations: this.config.historyMode === 'full' ? this.iterations : this.iterationSummaries,\n auditTrail: this.auditTrail,\n };\n return JSON.stringify(data).length;\n } catch {\n return 0; // Error estimating, return 0\n }\n }\n\n /**\n * Cleanup resources and release memory\n * Clears all internal arrays and maps to allow garbage collection\n */\n cleanup(): void {\n // Store execution summary before clearing\n const summary = {\n executionId: this.executionId,\n totalIterations: this.iteration,\n totalToolCalls: this.metrics.toolCallCount,\n totalDuration: Date.now() - this.startTime.getTime(),\n success: !this.cancelled && this.metrics.errors.length === 0,\n };\n\n // Clear all maps\n this.toolCalls.clear();\n this.toolResults.clear();\n this.metadata.clear();\n\n // Clear all arrays (modify length to allow GC of items)\n this.iterations.length = 0;\n this.iterationSummaries.length = 0;\n this.auditTrail.length = 0;\n this.metrics.errors.length = 0;\n\n // Store summary after clearing (for final access if needed)\n this.metadata.set('execution_summary', summary);\n }\n\n /**\n * Get execution summary\n */\n getSummary() {\n return {\n executionId: this.executionId,\n startTime: this.startTime,\n currentIteration: this.iteration,\n paused: this.paused,\n cancelled: this.cancelled,\n metrics: { ...this.metrics },\n totalDuration: Date.now() - this.startTime.getTime(),\n };\n }\n}\n","/**\n * Hook manager - handles hook registration and execution\n * Includes error isolation, timeouts, and optional parallel execution\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport {\n Hook,\n HookConfig,\n HookName,\n HookSignatures,\n} from './types/HookTypes.js';\n\nexport class HookManager {\n private hooks: Map<HookName, Hook<any, any>[]> = new Map();\n private timeout: number;\n private parallel: boolean;\n // Per-hook error tracking: hookKey -> consecutive error count\n private hookErrorCounts: Map<string, number> = new Map();\n // Disabled hooks that exceeded error threshold\n private disabledHooks: Set<string> = new Set();\n private maxConsecutiveErrors: number = 3;\n private emitter: EventEmitter;\n\n constructor(\n config: HookConfig = {},\n emitter: EventEmitter,\n errorHandling?: { maxConsecutiveErrors?: number }\n ) {\n this.timeout = config.hookTimeout || 5000; // 5 second default\n this.parallel = config.parallelHooks || false;\n this.emitter = emitter;\n this.maxConsecutiveErrors = errorHandling?.maxConsecutiveErrors || 3;\n\n // Register hooks from config\n this.registerFromConfig(config);\n }\n\n /**\n * Register hooks from configuration\n */\n private registerFromConfig(config: HookConfig): void {\n const hookNames: HookName[] = [\n 'before:execution',\n 'after:execution',\n 'before:llm',\n 'after:llm',\n 'before:tool',\n 'after:tool',\n 'approve:tool',\n 'pause:check',\n ];\n\n for (const name of hookNames) {\n const hook = config[name];\n if (hook) {\n this.register(name, hook);\n }\n }\n }\n\n /**\n * Register a hook\n */\n register(name: HookName, hook: Hook<any, any>): void {\n // Validate hook is a function\n if (typeof hook !== 'function') {\n throw new Error(`Hook must be a function, got: ${typeof hook}`);\n }\n\n // Get or create hooks array\n if (!this.hooks.has(name)) {\n this.hooks.set(name, []);\n }\n\n const existing = this.hooks.get(name)!;\n\n // Limit number of hooks per name\n if (existing.length >= 10) {\n throw new Error(`Too many hooks for ${name} (max: 10)`);\n }\n\n existing.push(hook);\n }\n\n /**\n * Execute hooks for a given name\n */\n async executeHooks<K extends HookName>(\n name: K,\n context: HookSignatures[K]['context'],\n defaultResult: HookSignatures[K]['result']\n ): Promise<HookSignatures[K]['result']> {\n const hooks = this.hooks.get(name);\n\n if (!hooks || hooks.length === 0) {\n return defaultResult;\n }\n\n // Parallel execution (for independent hooks)\n if (this.parallel && hooks.length > 1) {\n return this.executeHooksParallel(hooks, context, defaultResult);\n }\n\n // Sequential execution (default)\n return this.executeHooksSequential(hooks, context, defaultResult);\n }\n\n /**\n * Execute hooks sequentially\n */\n private async executeHooksSequential<T>(\n hooks: Hook<any, any>[],\n context: any,\n defaultResult: T\n ): Promise<T> {\n let result = defaultResult;\n\n for (let i = 0; i < hooks.length; i++) {\n const hook = hooks[i]!;\n const hookKey = this.getHookKey(hook, i);\n const hookResult = await this.executeHookSafely(hook, context, hookKey);\n\n // Skip failed hooks\n if (hookResult === null) {\n continue;\n }\n\n // Merge hook result\n result = { ...result, ...hookResult };\n\n // Check for early exit\n if ((hookResult as any).skip === true) {\n break;\n }\n }\n\n return result;\n }\n\n /**\n * Execute hooks in parallel\n */\n private async executeHooksParallel<T>(\n hooks: Hook<any, any>[],\n context: any,\n defaultResult: T\n ): Promise<T> {\n // Execute all hooks concurrently with unique keys\n const results = await Promise.all(\n hooks.map((hook, i) => {\n const hookKey = this.getHookKey(hook, i);\n return this.executeHookSafely(hook, context, hookKey);\n })\n );\n\n // Filter out failures and merge results\n const validResults = results.filter((r) => r !== null);\n\n return validResults.reduce(\n (acc, hookResult) => ({ ...acc, ...hookResult }),\n defaultResult\n );\n }\n\n /**\n * Generate unique key for a hook\n */\n private getHookKey(hook: Hook<any, any>, index: number): string {\n return `${hook.name || 'anonymous'}_${index}`;\n }\n\n /**\n * Execute single hook with error isolation and timeout (with per-hook error tracking)\n */\n private async executeHookSafely<T>(\n hook: Hook<any, any>,\n context: any,\n hookKey?: string\n ): Promise<T | null> {\n const key = hookKey || hook.name || 'anonymous';\n\n // Skip disabled hooks\n if (this.disabledHooks.has(key)) {\n return null;\n }\n\n const startTime = Date.now();\n\n try {\n // Execute with timeout\n const result = await Promise.race([\n hook(context),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Hook timeout')), this.timeout)\n ),\n ]);\n\n // Reset error counter for this hook on success\n this.hookErrorCounts.delete(key);\n\n // Track timing\n const duration = Date.now() - startTime;\n if (context.context?.updateMetrics) {\n context.context.updateMetrics({\n hookDuration: (context.context.metrics.hookDuration || 0) + duration,\n });\n }\n\n return result as T;\n } catch (error) {\n // Increment error counter for this specific hook\n const errorCount = (this.hookErrorCounts.get(key) || 0) + 1;\n this.hookErrorCounts.set(key, errorCount);\n\n // Emit error event\n this.emitter.emit('hook:error', {\n executionId: context.executionId,\n hookName: hook.name || 'anonymous',\n error: error as Error,\n consecutiveErrors: errorCount,\n timestamp: new Date(),\n });\n\n // Check consecutive error threshold for this hook\n if (errorCount >= this.maxConsecutiveErrors) {\n // Disable this specific hook, not all hooks\n this.disabledHooks.add(key);\n console.warn(\n `Hook \"${key}\" disabled after ${errorCount} consecutive failures. Last error: ${(error as Error).message}`\n );\n } else {\n // Log warning but continue (degraded mode)\n console.warn(\n `Hook execution failed (${key}): ${(error as Error).message} (${errorCount}/${this.maxConsecutiveErrors} errors)`\n );\n }\n\n return null; // Hook failed, skip its result\n }\n }\n\n /**\n * Check if there are any hooks registered\n */\n hasHooks(name: HookName): boolean {\n const hooks = this.hooks.get(name);\n return !!hooks && hooks.length > 0;\n }\n\n /**\n * Get hook count\n */\n getHookCount(name?: HookName): number {\n if (name) {\n return this.hooks.get(name)?.length || 0;\n }\n // Total across all hooks\n return Array.from(this.hooks.values()).reduce((sum, arr) => sum + arr.length, 0);\n }\n\n /**\n * Clear all hooks and reset error tracking\n */\n clear(): void {\n this.hooks.clear();\n this.hookErrorCounts.clear();\n this.disabledHooks.clear();\n }\n\n /**\n * Re-enable a disabled hook\n */\n enableHook(hookKey: string): void {\n this.disabledHooks.delete(hookKey);\n this.hookErrorCounts.delete(hookKey);\n }\n\n /**\n * Get list of disabled hooks\n */\n getDisabledHooks(): string[] {\n return Array.from(this.disabledHooks);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/capabilities/agents/ExecutionContext.ts","../../../src/capabilities/agents/HookManager.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Execution context - tracks state, metrics, and history for agent execution\n * Includes memory safety (circular buffers) and resource limits\n */\n\nimport { AgentResponse } from '../../domain/entities/Response.js';\nimport { TextGenerateOptions } from '../../domain/interfaces/ITextProvider.js';\nimport { ToolCall, ToolResult, ToolCallState } from '../../domain/entities/Tool.js';\n\nexport type HistoryMode = 'none' | 'summary' | 'full';\n\nexport interface ExecutionContextConfig {\n maxHistorySize?: number; // Max iterations to store (default: 10)\n historyMode?: HistoryMode; // What to store (default: 'summary')\n maxAuditTrailSize?: number; // Max audit entries (default: 1000)\n}\n\nexport interface IterationRecord {\n iteration: number;\n request: TextGenerateOptions;\n response: AgentResponse;\n toolCalls: ToolCall[];\n toolResults: ToolResult[];\n startTime: Date;\n endTime: Date;\n}\n\nexport interface IterationSummary {\n iteration: number;\n tokens: number;\n toolCount: number;\n duration: number;\n timestamp: Date;\n}\n\nexport interface ExecutionMetrics {\n // Timing\n totalDuration: number;\n llmDuration: number;\n toolDuration: number;\n hookDuration: number;\n\n // Counts\n iterationCount: number;\n toolCallCount: number;\n toolSuccessCount: number;\n toolFailureCount: number;\n toolTimeoutCount: number;\n\n // Tokens\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n\n // Errors\n errors: Array<{ type: string; message: string; timestamp: Date }>;\n}\n\nexport interface AuditEntry {\n timestamp: Date;\n type:\n | 'hook_executed'\n | 'tool_modified'\n | 'tool_skipped'\n | 'execution_paused'\n | 'execution_resumed'\n | 'tool_approved'\n | 'tool_rejected'\n | 'tool_blocked'\n | 'tool_permission_approved';\n hookName?: string;\n toolName?: string;\n details: any;\n}\n\nexport class ExecutionContext {\n // Execution metadata\n readonly executionId: string;\n readonly startTime: Date;\n iteration: number = 0;\n\n // Tool tracking\n readonly toolCalls: Map<string, ToolCall> = new Map();\n readonly toolResults: Map<string, ToolResult> = new Map();\n\n // Control state\n paused: boolean = false;\n pauseReason?: string;\n cancelled: boolean = false;\n cancelReason?: string;\n\n // User data (for hooks to share state)\n readonly metadata: Map<string, any> = new Map();\n\n // History storage (memory-safe)\n private readonly config: ExecutionContextConfig;\n private readonly iterations: IterationRecord[] = [];\n private readonly iterationSummaries: IterationSummary[] = [];\n\n // Metrics\n readonly metrics: ExecutionMetrics = {\n totalDuration: 0,\n llmDuration: 0,\n toolDuration: 0,\n hookDuration: 0,\n iterationCount: 0,\n toolCallCount: 0,\n toolSuccessCount: 0,\n toolFailureCount: 0,\n toolTimeoutCount: 0,\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n errors: [],\n };\n\n // Audit trail\n private readonly auditTrail: AuditEntry[] = [];\n\n constructor(\n executionId: string,\n config: ExecutionContextConfig = {}\n ) {\n this.executionId = executionId;\n this.startTime = new Date();\n this.config = {\n maxHistorySize: config.maxHistorySize || 10,\n historyMode: config.historyMode || 'summary',\n maxAuditTrailSize: config.maxAuditTrailSize || 1000,\n };\n }\n\n /**\n * Add iteration to history (memory-safe)\n */\n addIteration(record: IterationRecord): void {\n switch (this.config.historyMode) {\n case 'none':\n // Don't store anything\n break;\n\n case 'summary':\n // Store lightweight summary only\n this.iterationSummaries.push({\n iteration: record.iteration,\n tokens: record.response.usage.total_tokens,\n toolCount: record.toolCalls.length,\n duration: record.endTime.getTime() - record.startTime.getTime(),\n timestamp: record.startTime,\n });\n\n // Keep circular buffer\n if (this.iterationSummaries.length > this.config.maxHistorySize!) {\n this.iterationSummaries.shift();\n }\n break;\n\n case 'full':\n // Store full iteration data\n this.iterations.push(record);\n\n // Keep circular buffer\n if (this.iterations.length > this.config.maxHistorySize!) {\n this.iterations.shift();\n }\n break;\n }\n }\n\n /**\n * Get iteration history\n */\n getHistory(): IterationRecord[] | IterationSummary[] {\n return this.config.historyMode === 'full' ? this.iterations : this.iterationSummaries;\n }\n\n /**\n * Add audit entry\n */\n audit(type: AuditEntry['type'], details: any, hookName?: string, toolName?: string): void {\n this.auditTrail.push({\n timestamp: new Date(),\n type,\n hookName,\n toolName,\n details,\n });\n\n // Keep circular buffer\n if (this.auditTrail.length > this.config.maxAuditTrailSize!) {\n this.auditTrail.shift();\n }\n }\n\n /**\n * Get audit trail\n */\n getAuditTrail(): readonly AuditEntry[] {\n return this.auditTrail;\n }\n\n /**\n * Update metrics\n */\n updateMetrics(update: Partial<ExecutionMetrics>): void {\n Object.assign(this.metrics, update);\n }\n\n /**\n * Add tool call to tracking\n */\n addToolCall(toolCall: ToolCall): void {\n this.toolCalls.set(toolCall.id, toolCall);\n this.metrics.toolCallCount++;\n }\n\n /**\n * Add tool result to tracking\n */\n addToolResult(result: ToolResult): void {\n this.toolResults.set(result.tool_use_id, result);\n\n // Update metrics\n if (result.state === ToolCallState.COMPLETED) {\n this.metrics.toolSuccessCount++;\n } else if (result.state === ToolCallState.FAILED) {\n this.metrics.toolFailureCount++;\n } else if (result.state === ToolCallState.TIMEOUT) {\n this.metrics.toolTimeoutCount++;\n }\n }\n\n /**\n * Check resource limits\n */\n checkLimits(limits?: {\n maxExecutionTime?: number;\n maxToolCalls?: number;\n maxContextSize?: number;\n }): void {\n if (!limits) return;\n\n // Check execution time\n if (limits.maxExecutionTime) {\n const elapsed = Date.now() - this.startTime.getTime();\n if (elapsed > limits.maxExecutionTime) {\n throw new Error(\n `Execution time limit exceeded: ${elapsed}ms > ${limits.maxExecutionTime}ms`\n );\n }\n }\n\n // Check tool call count\n if (limits.maxToolCalls && this.toolCalls.size > limits.maxToolCalls) {\n throw new Error(\n `Tool call limit exceeded: ${this.toolCalls.size} > ${limits.maxToolCalls}`\n );\n }\n\n // Check context size\n if (limits.maxContextSize) {\n const size = this.estimateSize();\n if (size > limits.maxContextSize) {\n throw new Error(\n `Context size limit exceeded: ${size} bytes > ${limits.maxContextSize} bytes`\n );\n }\n }\n }\n\n /**\n * Estimate memory usage (rough approximation)\n */\n private estimateSize(): number {\n try {\n const data = {\n toolCalls: Array.from(this.toolCalls.values()),\n toolResults: Array.from(this.toolResults.values()),\n iterations: this.config.historyMode === 'full' ? this.iterations : this.iterationSummaries,\n auditTrail: this.auditTrail,\n };\n return JSON.stringify(data).length;\n } catch {\n return 0; // Error estimating, return 0\n }\n }\n\n /**\n * Cleanup resources and release memory\n * Clears all internal arrays and maps to allow garbage collection\n */\n cleanup(): void {\n // Store execution summary before clearing\n const summary = {\n executionId: this.executionId,\n totalIterations: this.iteration,\n totalToolCalls: this.metrics.toolCallCount,\n totalDuration: Date.now() - this.startTime.getTime(),\n success: !this.cancelled && this.metrics.errors.length === 0,\n };\n\n // Clear all maps\n this.toolCalls.clear();\n this.toolResults.clear();\n this.metadata.clear();\n\n // Clear all arrays (modify length to allow GC of items)\n this.iterations.length = 0;\n this.iterationSummaries.length = 0;\n this.auditTrail.length = 0;\n this.metrics.errors.length = 0;\n\n // Store summary after clearing (for final access if needed)\n this.metadata.set('execution_summary', summary);\n }\n\n /**\n * Get execution summary\n */\n getSummary() {\n return {\n executionId: this.executionId,\n startTime: this.startTime,\n currentIteration: this.iteration,\n paused: this.paused,\n cancelled: this.cancelled,\n metrics: { ...this.metrics },\n totalDuration: Date.now() - this.startTime.getTime(),\n };\n }\n}\n","/**\n * Hook manager - handles hook registration and execution\n * Includes error isolation, timeouts, and optional parallel execution\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport {\n Hook,\n HookConfig,\n HookName,\n HookSignatures,\n} from './types/HookTypes.js';\n\nexport class HookManager {\n private hooks: Map<HookName, Hook<any, any>[]> = new Map();\n private timeout: number;\n private parallel: boolean;\n // Per-hook error tracking: hookKey -> consecutive error count\n private hookErrorCounts: Map<string, number> = new Map();\n // Disabled hooks that exceeded error threshold\n private disabledHooks: Set<string> = new Set();\n private maxConsecutiveErrors: number = 3;\n private emitter: EventEmitter;\n\n constructor(\n config: HookConfig = {},\n emitter: EventEmitter,\n errorHandling?: { maxConsecutiveErrors?: number }\n ) {\n this.timeout = config.hookTimeout || 5000; // 5 second default\n this.parallel = config.parallelHooks || false;\n this.emitter = emitter;\n this.maxConsecutiveErrors = errorHandling?.maxConsecutiveErrors || 3;\n\n // Register hooks from config\n this.registerFromConfig(config);\n }\n\n /**\n * Register hooks from configuration\n */\n private registerFromConfig(config: HookConfig): void {\n const hookNames: HookName[] = [\n 'before:execution',\n 'after:execution',\n 'before:llm',\n 'after:llm',\n 'before:tool',\n 'after:tool',\n 'approve:tool',\n 'pause:check',\n ];\n\n for (const name of hookNames) {\n const hook = config[name];\n if (hook) {\n this.register(name, hook);\n }\n }\n }\n\n /**\n * Register a hook\n */\n register(name: HookName, hook: Hook<any, any>): void {\n // Validate hook is a function\n if (typeof hook !== 'function') {\n throw new Error(`Hook must be a function, got: ${typeof hook}`);\n }\n\n // Get or create hooks array\n if (!this.hooks.has(name)) {\n this.hooks.set(name, []);\n }\n\n const existing = this.hooks.get(name)!;\n\n // Limit number of hooks per name\n if (existing.length >= 10) {\n throw new Error(`Too many hooks for ${name} (max: 10)`);\n }\n\n existing.push(hook);\n }\n\n /**\n * Unregister a specific hook function by reference.\n * Returns true if the hook was found and removed.\n */\n unregister(name: HookName, hook: Hook<any, any>): boolean {\n const hooks = this.hooks.get(name);\n if (!hooks) return false;\n\n const index = hooks.indexOf(hook);\n if (index === -1) return false;\n\n hooks.splice(index, 1);\n return true;\n }\n\n /**\n * Execute hooks for a given name\n */\n async executeHooks<K extends HookName>(\n name: K,\n context: HookSignatures[K]['context'],\n defaultResult: HookSignatures[K]['result']\n ): Promise<HookSignatures[K]['result']> {\n const hooks = this.hooks.get(name);\n\n if (!hooks || hooks.length === 0) {\n return defaultResult;\n }\n\n // Parallel execution (for independent hooks)\n if (this.parallel && hooks.length > 1) {\n return this.executeHooksParallel(hooks, context, defaultResult);\n }\n\n // Sequential execution (default)\n return this.executeHooksSequential(hooks, context, defaultResult);\n }\n\n /**\n * Execute hooks sequentially\n */\n private async executeHooksSequential<T>(\n hooks: Hook<any, any>[],\n context: any,\n defaultResult: T\n ): Promise<T> {\n let result = defaultResult;\n\n for (let i = 0; i < hooks.length; i++) {\n const hook = hooks[i]!;\n const hookKey = this.getHookKey(hook, i);\n const hookResult = await this.executeHookSafely(hook, context, hookKey);\n\n // Skip failed hooks (loose equality catches both null and undefined)\n if (hookResult == null) {\n continue;\n }\n\n // Merge hook result\n result = { ...result, ...hookResult };\n\n // Check for early exit\n if ((hookResult as any).skip === true) {\n break;\n }\n }\n\n return result;\n }\n\n /**\n * Execute hooks in parallel\n */\n private async executeHooksParallel<T>(\n hooks: Hook<any, any>[],\n context: any,\n defaultResult: T\n ): Promise<T> {\n // Execute all hooks concurrently with unique keys\n const results = await Promise.all(\n hooks.map((hook, i) => {\n const hookKey = this.getHookKey(hook, i);\n return this.executeHookSafely(hook, context, hookKey);\n })\n );\n\n // Filter out failures and merge results\n const validResults = results.filter((r) => r != null);\n\n return validResults.reduce(\n (acc, hookResult) => ({ ...acc, ...hookResult }),\n defaultResult\n );\n }\n\n /**\n * Generate unique key for a hook\n */\n private getHookKey(hook: Hook<any, any>, index: number): string {\n return `${hook.name || 'anonymous'}_${index}`;\n }\n\n /**\n * Execute single hook with error isolation and timeout (with per-hook error tracking)\n */\n private async executeHookSafely<T>(\n hook: Hook<any, any>,\n context: any,\n hookKey?: string\n ): Promise<T | null> {\n const key = hookKey || hook.name || 'anonymous';\n\n // Skip disabled hooks\n if (this.disabledHooks.has(key)) {\n return null;\n }\n\n const startTime = Date.now();\n\n try {\n // Execute with timeout\n const result = await Promise.race([\n hook(context),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Hook timeout')), this.timeout)\n ),\n ]);\n\n // Reset error counter for this hook on success\n this.hookErrorCounts.delete(key);\n\n // Track timing\n const duration = Date.now() - startTime;\n if (context.context?.updateMetrics) {\n context.context.updateMetrics({\n hookDuration: (context.context.metrics.hookDuration || 0) + duration,\n });\n }\n\n return result as T;\n } catch (error) {\n // Increment error counter for this specific hook\n const errorCount = (this.hookErrorCounts.get(key) || 0) + 1;\n this.hookErrorCounts.set(key, errorCount);\n\n // Emit error event\n this.emitter.emit('hook:error', {\n executionId: context.executionId,\n hookName: hook.name || 'anonymous',\n error: error as Error,\n consecutiveErrors: errorCount,\n timestamp: new Date(),\n });\n\n // Check consecutive error threshold for this hook\n if (errorCount >= this.maxConsecutiveErrors) {\n // Disable this specific hook, not all hooks\n this.disabledHooks.add(key);\n console.warn(\n `Hook \"${key}\" disabled after ${errorCount} consecutive failures. Last error: ${(error as Error).message}`\n );\n } else {\n // Log warning but continue (degraded mode)\n console.warn(\n `Hook execution failed (${key}): ${(error as Error).message} (${errorCount}/${this.maxConsecutiveErrors} errors)`\n );\n }\n\n return null; // Hook failed, skip its result\n }\n }\n\n /**\n * Check if there are any hooks registered\n */\n hasHooks(name: HookName): boolean {\n const hooks = this.hooks.get(name);\n return !!hooks && hooks.length > 0;\n }\n\n /**\n * Get hook count\n */\n getHookCount(name?: HookName): number {\n if (name) {\n return this.hooks.get(name)?.length || 0;\n }\n // Total across all hooks\n return Array.from(this.hooks.values()).reduce((sum, arr) => sum + arr.length, 0);\n }\n\n /**\n * Clear all hooks and reset error tracking\n */\n clear(): void {\n this.hooks.clear();\n this.hookErrorCounts.clear();\n this.disabledHooks.clear();\n }\n\n /**\n * Re-enable a disabled hook\n */\n enableHook(hookKey: string): void {\n this.disabledHooks.delete(hookKey);\n this.hookErrorCounts.delete(hookKey);\n }\n\n /**\n * Get list of disabled hooks\n */\n getDisabledHooks(): string[] {\n return Array.from(this.disabledHooks);\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { y as AfterToolContext, z as AgentEventName, A as AgentEvents, B as AgenticLoopEventName, D as AgenticLoopEvents, G as ApprovalResult, J as ApproveToolContext, m as AuditEntry, K as BeforeToolContext, aH as ExecutionCompleteEvent, X as ExecutionConfig, E as ExecutionContext, l as ExecutionMetrics, aI as ExecutionStartEvent, j as HistoryMode, Y as Hook, H as HookConfig, Z as HookManager, n as HookName, aJ as LLMRequestEvent, aK as LLMResponseEvent, a6 as ModifyingHook, aL as ToolCompleteEvent, an as ToolModification, aM as ToolStartEvent } from '../../index-CR5PHkck.cjs';
|
|
2
2
|
import '../../IProvider-Br817mKc.cjs';
|
|
3
3
|
import '../../Vendor-DYh_bzwo.cjs';
|
|
4
4
|
import 'eventemitter3';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { y as AfterToolContext, z as AgentEventName, A as AgentEvents, B as AgenticLoopEventName, D as AgenticLoopEvents, G as ApprovalResult, J as ApproveToolContext, m as AuditEntry, K as BeforeToolContext, aH as ExecutionCompleteEvent, X as ExecutionConfig, E as ExecutionContext, l as ExecutionMetrics, aI as ExecutionStartEvent, j as HistoryMode, Y as Hook, H as HookConfig, Z as HookManager, n as HookName, aJ as LLMRequestEvent, aK as LLMResponseEvent, a6 as ModifyingHook, aL as ToolCompleteEvent, an as ToolModification, aM as ToolStartEvent } from '../../index-Cb7N9QIj.js';
|
|
2
2
|
import '../../IProvider-BUbU5UwV.js';
|
|
3
3
|
import '../../Vendor-DYh_bzwo.js';
|
|
4
4
|
import 'eventemitter3';
|
|
@@ -260,6 +260,18 @@ var HookManager = class {
|
|
|
260
260
|
}
|
|
261
261
|
existing.push(hook);
|
|
262
262
|
}
|
|
263
|
+
/**
|
|
264
|
+
* Unregister a specific hook function by reference.
|
|
265
|
+
* Returns true if the hook was found and removed.
|
|
266
|
+
*/
|
|
267
|
+
unregister(name, hook) {
|
|
268
|
+
const hooks = this.hooks.get(name);
|
|
269
|
+
if (!hooks) return false;
|
|
270
|
+
const index = hooks.indexOf(hook);
|
|
271
|
+
if (index === -1) return false;
|
|
272
|
+
hooks.splice(index, 1);
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
263
275
|
/**
|
|
264
276
|
* Execute hooks for a given name
|
|
265
277
|
*/
|
|
@@ -282,7 +294,7 @@ var HookManager = class {
|
|
|
282
294
|
const hook = hooks[i];
|
|
283
295
|
const hookKey = this.getHookKey(hook, i);
|
|
284
296
|
const hookResult = await this.executeHookSafely(hook, context, hookKey);
|
|
285
|
-
if (hookResult
|
|
297
|
+
if (hookResult == null) {
|
|
286
298
|
continue;
|
|
287
299
|
}
|
|
288
300
|
result = { ...result, ...hookResult };
|
|
@@ -302,7 +314,7 @@ var HookManager = class {
|
|
|
302
314
|
return this.executeHookSafely(hook, context, hookKey);
|
|
303
315
|
})
|
|
304
316
|
);
|
|
305
|
-
const validResults = results.filter((r) => r
|
|
317
|
+
const validResults = results.filter((r) => r != null);
|
|
306
318
|
return validResults.reduce(
|
|
307
319
|
(acc, hookResult) => ({ ...acc, ...hookResult }),
|
|
308
320
|
defaultResult
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/capabilities/agents/ExecutionContext.ts","../../../src/capabilities/agents/HookManager.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Execution context - tracks state, metrics, and history for agent execution\n * Includes memory safety (circular buffers) and resource limits\n */\n\nimport { AgentResponse } from '../../domain/entities/Response.js';\nimport { TextGenerateOptions } from '../../domain/interfaces/ITextProvider.js';\nimport { ToolCall, ToolResult, ToolCallState } from '../../domain/entities/Tool.js';\n\nexport type HistoryMode = 'none' | 'summary' | 'full';\n\nexport interface ExecutionContextConfig {\n maxHistorySize?: number; // Max iterations to store (default: 10)\n historyMode?: HistoryMode; // What to store (default: 'summary')\n maxAuditTrailSize?: number; // Max audit entries (default: 1000)\n}\n\nexport interface IterationRecord {\n iteration: number;\n request: TextGenerateOptions;\n response: AgentResponse;\n toolCalls: ToolCall[];\n toolResults: ToolResult[];\n startTime: Date;\n endTime: Date;\n}\n\nexport interface IterationSummary {\n iteration: number;\n tokens: number;\n toolCount: number;\n duration: number;\n timestamp: Date;\n}\n\nexport interface ExecutionMetrics {\n // Timing\n totalDuration: number;\n llmDuration: number;\n toolDuration: number;\n hookDuration: number;\n\n // Counts\n iterationCount: number;\n toolCallCount: number;\n toolSuccessCount: number;\n toolFailureCount: number;\n toolTimeoutCount: number;\n\n // Tokens\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n\n // Errors\n errors: Array<{ type: string; message: string; timestamp: Date }>;\n}\n\nexport interface AuditEntry {\n timestamp: Date;\n type:\n | 'hook_executed'\n | 'tool_modified'\n | 'tool_skipped'\n | 'execution_paused'\n | 'execution_resumed'\n | 'tool_approved'\n | 'tool_rejected'\n | 'tool_blocked'\n | 'tool_permission_approved';\n hookName?: string;\n toolName?: string;\n details: any;\n}\n\nexport class ExecutionContext {\n // Execution metadata\n readonly executionId: string;\n readonly startTime: Date;\n iteration: number = 0;\n\n // Tool tracking\n readonly toolCalls: Map<string, ToolCall> = new Map();\n readonly toolResults: Map<string, ToolResult> = new Map();\n\n // Control state\n paused: boolean = false;\n pauseReason?: string;\n cancelled: boolean = false;\n cancelReason?: string;\n\n // User data (for hooks to share state)\n readonly metadata: Map<string, any> = new Map();\n\n // History storage (memory-safe)\n private readonly config: ExecutionContextConfig;\n private readonly iterations: IterationRecord[] = [];\n private readonly iterationSummaries: IterationSummary[] = [];\n\n // Metrics\n readonly metrics: ExecutionMetrics = {\n totalDuration: 0,\n llmDuration: 0,\n toolDuration: 0,\n hookDuration: 0,\n iterationCount: 0,\n toolCallCount: 0,\n toolSuccessCount: 0,\n toolFailureCount: 0,\n toolTimeoutCount: 0,\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n errors: [],\n };\n\n // Audit trail\n private readonly auditTrail: AuditEntry[] = [];\n\n constructor(\n executionId: string,\n config: ExecutionContextConfig = {}\n ) {\n this.executionId = executionId;\n this.startTime = new Date();\n this.config = {\n maxHistorySize: config.maxHistorySize || 10,\n historyMode: config.historyMode || 'summary',\n maxAuditTrailSize: config.maxAuditTrailSize || 1000,\n };\n }\n\n /**\n * Add iteration to history (memory-safe)\n */\n addIteration(record: IterationRecord): void {\n switch (this.config.historyMode) {\n case 'none':\n // Don't store anything\n break;\n\n case 'summary':\n // Store lightweight summary only\n this.iterationSummaries.push({\n iteration: record.iteration,\n tokens: record.response.usage.total_tokens,\n toolCount: record.toolCalls.length,\n duration: record.endTime.getTime() - record.startTime.getTime(),\n timestamp: record.startTime,\n });\n\n // Keep circular buffer\n if (this.iterationSummaries.length > this.config.maxHistorySize!) {\n this.iterationSummaries.shift();\n }\n break;\n\n case 'full':\n // Store full iteration data\n this.iterations.push(record);\n\n // Keep circular buffer\n if (this.iterations.length > this.config.maxHistorySize!) {\n this.iterations.shift();\n }\n break;\n }\n }\n\n /**\n * Get iteration history\n */\n getHistory(): IterationRecord[] | IterationSummary[] {\n return this.config.historyMode === 'full' ? this.iterations : this.iterationSummaries;\n }\n\n /**\n * Add audit entry\n */\n audit(type: AuditEntry['type'], details: any, hookName?: string, toolName?: string): void {\n this.auditTrail.push({\n timestamp: new Date(),\n type,\n hookName,\n toolName,\n details,\n });\n\n // Keep circular buffer\n if (this.auditTrail.length > this.config.maxAuditTrailSize!) {\n this.auditTrail.shift();\n }\n }\n\n /**\n * Get audit trail\n */\n getAuditTrail(): readonly AuditEntry[] {\n return this.auditTrail;\n }\n\n /**\n * Update metrics\n */\n updateMetrics(update: Partial<ExecutionMetrics>): void {\n Object.assign(this.metrics, update);\n }\n\n /**\n * Add tool call to tracking\n */\n addToolCall(toolCall: ToolCall): void {\n this.toolCalls.set(toolCall.id, toolCall);\n this.metrics.toolCallCount++;\n }\n\n /**\n * Add tool result to tracking\n */\n addToolResult(result: ToolResult): void {\n this.toolResults.set(result.tool_use_id, result);\n\n // Update metrics\n if (result.state === ToolCallState.COMPLETED) {\n this.metrics.toolSuccessCount++;\n } else if (result.state === ToolCallState.FAILED) {\n this.metrics.toolFailureCount++;\n } else if (result.state === ToolCallState.TIMEOUT) {\n this.metrics.toolTimeoutCount++;\n }\n }\n\n /**\n * Check resource limits\n */\n checkLimits(limits?: {\n maxExecutionTime?: number;\n maxToolCalls?: number;\n maxContextSize?: number;\n }): void {\n if (!limits) return;\n\n // Check execution time\n if (limits.maxExecutionTime) {\n const elapsed = Date.now() - this.startTime.getTime();\n if (elapsed > limits.maxExecutionTime) {\n throw new Error(\n `Execution time limit exceeded: ${elapsed}ms > ${limits.maxExecutionTime}ms`\n );\n }\n }\n\n // Check tool call count\n if (limits.maxToolCalls && this.toolCalls.size > limits.maxToolCalls) {\n throw new Error(\n `Tool call limit exceeded: ${this.toolCalls.size} > ${limits.maxToolCalls}`\n );\n }\n\n // Check context size\n if (limits.maxContextSize) {\n const size = this.estimateSize();\n if (size > limits.maxContextSize) {\n throw new Error(\n `Context size limit exceeded: ${size} bytes > ${limits.maxContextSize} bytes`\n );\n }\n }\n }\n\n /**\n * Estimate memory usage (rough approximation)\n */\n private estimateSize(): number {\n try {\n const data = {\n toolCalls: Array.from(this.toolCalls.values()),\n toolResults: Array.from(this.toolResults.values()),\n iterations: this.config.historyMode === 'full' ? this.iterations : this.iterationSummaries,\n auditTrail: this.auditTrail,\n };\n return JSON.stringify(data).length;\n } catch {\n return 0; // Error estimating, return 0\n }\n }\n\n /**\n * Cleanup resources and release memory\n * Clears all internal arrays and maps to allow garbage collection\n */\n cleanup(): void {\n // Store execution summary before clearing\n const summary = {\n executionId: this.executionId,\n totalIterations: this.iteration,\n totalToolCalls: this.metrics.toolCallCount,\n totalDuration: Date.now() - this.startTime.getTime(),\n success: !this.cancelled && this.metrics.errors.length === 0,\n };\n\n // Clear all maps\n this.toolCalls.clear();\n this.toolResults.clear();\n this.metadata.clear();\n\n // Clear all arrays (modify length to allow GC of items)\n this.iterations.length = 0;\n this.iterationSummaries.length = 0;\n this.auditTrail.length = 0;\n this.metrics.errors.length = 0;\n\n // Store summary after clearing (for final access if needed)\n this.metadata.set('execution_summary', summary);\n }\n\n /**\n * Get execution summary\n */\n getSummary() {\n return {\n executionId: this.executionId,\n startTime: this.startTime,\n currentIteration: this.iteration,\n paused: this.paused,\n cancelled: this.cancelled,\n metrics: { ...this.metrics },\n totalDuration: Date.now() - this.startTime.getTime(),\n };\n }\n}\n","/**\n * Hook manager - handles hook registration and execution\n * Includes error isolation, timeouts, and optional parallel execution\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport {\n Hook,\n HookConfig,\n HookName,\n HookSignatures,\n} from './types/HookTypes.js';\n\nexport class HookManager {\n private hooks: Map<HookName, Hook<any, any>[]> = new Map();\n private timeout: number;\n private parallel: boolean;\n // Per-hook error tracking: hookKey -> consecutive error count\n private hookErrorCounts: Map<string, number> = new Map();\n // Disabled hooks that exceeded error threshold\n private disabledHooks: Set<string> = new Set();\n private maxConsecutiveErrors: number = 3;\n private emitter: EventEmitter;\n\n constructor(\n config: HookConfig = {},\n emitter: EventEmitter,\n errorHandling?: { maxConsecutiveErrors?: number }\n ) {\n this.timeout = config.hookTimeout || 5000; // 5 second default\n this.parallel = config.parallelHooks || false;\n this.emitter = emitter;\n this.maxConsecutiveErrors = errorHandling?.maxConsecutiveErrors || 3;\n\n // Register hooks from config\n this.registerFromConfig(config);\n }\n\n /**\n * Register hooks from configuration\n */\n private registerFromConfig(config: HookConfig): void {\n const hookNames: HookName[] = [\n 'before:execution',\n 'after:execution',\n 'before:llm',\n 'after:llm',\n 'before:tool',\n 'after:tool',\n 'approve:tool',\n 'pause:check',\n ];\n\n for (const name of hookNames) {\n const hook = config[name];\n if (hook) {\n this.register(name, hook);\n }\n }\n }\n\n /**\n * Register a hook\n */\n register(name: HookName, hook: Hook<any, any>): void {\n // Validate hook is a function\n if (typeof hook !== 'function') {\n throw new Error(`Hook must be a function, got: ${typeof hook}`);\n }\n\n // Get or create hooks array\n if (!this.hooks.has(name)) {\n this.hooks.set(name, []);\n }\n\n const existing = this.hooks.get(name)!;\n\n // Limit number of hooks per name\n if (existing.length >= 10) {\n throw new Error(`Too many hooks for ${name} (max: 10)`);\n }\n\n existing.push(hook);\n }\n\n /**\n * Execute hooks for a given name\n */\n async executeHooks<K extends HookName>(\n name: K,\n context: HookSignatures[K]['context'],\n defaultResult: HookSignatures[K]['result']\n ): Promise<HookSignatures[K]['result']> {\n const hooks = this.hooks.get(name);\n\n if (!hooks || hooks.length === 0) {\n return defaultResult;\n }\n\n // Parallel execution (for independent hooks)\n if (this.parallel && hooks.length > 1) {\n return this.executeHooksParallel(hooks, context, defaultResult);\n }\n\n // Sequential execution (default)\n return this.executeHooksSequential(hooks, context, defaultResult);\n }\n\n /**\n * Execute hooks sequentially\n */\n private async executeHooksSequential<T>(\n hooks: Hook<any, any>[],\n context: any,\n defaultResult: T\n ): Promise<T> {\n let result = defaultResult;\n\n for (let i = 0; i < hooks.length; i++) {\n const hook = hooks[i]!;\n const hookKey = this.getHookKey(hook, i);\n const hookResult = await this.executeHookSafely(hook, context, hookKey);\n\n // Skip failed hooks\n if (hookResult === null) {\n continue;\n }\n\n // Merge hook result\n result = { ...result, ...hookResult };\n\n // Check for early exit\n if ((hookResult as any).skip === true) {\n break;\n }\n }\n\n return result;\n }\n\n /**\n * Execute hooks in parallel\n */\n private async executeHooksParallel<T>(\n hooks: Hook<any, any>[],\n context: any,\n defaultResult: T\n ): Promise<T> {\n // Execute all hooks concurrently with unique keys\n const results = await Promise.all(\n hooks.map((hook, i) => {\n const hookKey = this.getHookKey(hook, i);\n return this.executeHookSafely(hook, context, hookKey);\n })\n );\n\n // Filter out failures and merge results\n const validResults = results.filter((r) => r !== null);\n\n return validResults.reduce(\n (acc, hookResult) => ({ ...acc, ...hookResult }),\n defaultResult\n );\n }\n\n /**\n * Generate unique key for a hook\n */\n private getHookKey(hook: Hook<any, any>, index: number): string {\n return `${hook.name || 'anonymous'}_${index}`;\n }\n\n /**\n * Execute single hook with error isolation and timeout (with per-hook error tracking)\n */\n private async executeHookSafely<T>(\n hook: Hook<any, any>,\n context: any,\n hookKey?: string\n ): Promise<T | null> {\n const key = hookKey || hook.name || 'anonymous';\n\n // Skip disabled hooks\n if (this.disabledHooks.has(key)) {\n return null;\n }\n\n const startTime = Date.now();\n\n try {\n // Execute with timeout\n const result = await Promise.race([\n hook(context),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Hook timeout')), this.timeout)\n ),\n ]);\n\n // Reset error counter for this hook on success\n this.hookErrorCounts.delete(key);\n\n // Track timing\n const duration = Date.now() - startTime;\n if (context.context?.updateMetrics) {\n context.context.updateMetrics({\n hookDuration: (context.context.metrics.hookDuration || 0) + duration,\n });\n }\n\n return result as T;\n } catch (error) {\n // Increment error counter for this specific hook\n const errorCount = (this.hookErrorCounts.get(key) || 0) + 1;\n this.hookErrorCounts.set(key, errorCount);\n\n // Emit error event\n this.emitter.emit('hook:error', {\n executionId: context.executionId,\n hookName: hook.name || 'anonymous',\n error: error as Error,\n consecutiveErrors: errorCount,\n timestamp: new Date(),\n });\n\n // Check consecutive error threshold for this hook\n if (errorCount >= this.maxConsecutiveErrors) {\n // Disable this specific hook, not all hooks\n this.disabledHooks.add(key);\n console.warn(\n `Hook \"${key}\" disabled after ${errorCount} consecutive failures. Last error: ${(error as Error).message}`\n );\n } else {\n // Log warning but continue (degraded mode)\n console.warn(\n `Hook execution failed (${key}): ${(error as Error).message} (${errorCount}/${this.maxConsecutiveErrors} errors)`\n );\n }\n\n return null; // Hook failed, skip its result\n }\n }\n\n /**\n * Check if there are any hooks registered\n */\n hasHooks(name: HookName): boolean {\n const hooks = this.hooks.get(name);\n return !!hooks && hooks.length > 0;\n }\n\n /**\n * Get hook count\n */\n getHookCount(name?: HookName): number {\n if (name) {\n return this.hooks.get(name)?.length || 0;\n }\n // Total across all hooks\n return Array.from(this.hooks.values()).reduce((sum, arr) => sum + arr.length, 0);\n }\n\n /**\n * Clear all hooks and reset error tracking\n */\n clear(): void {\n this.hooks.clear();\n this.hookErrorCounts.clear();\n this.disabledHooks.clear();\n }\n\n /**\n * Re-enable a disabled hook\n */\n enableHook(hookKey: string): void {\n this.disabledHooks.delete(hookKey);\n this.hookErrorCounts.delete(hookKey);\n }\n\n /**\n * Get list of disabled hooks\n */\n getDisabledHooks(): string[] {\n return Array.from(this.disabledHooks);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/capabilities/agents/ExecutionContext.ts","../../../src/capabilities/agents/HookManager.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Execution context - tracks state, metrics, and history for agent execution\n * Includes memory safety (circular buffers) and resource limits\n */\n\nimport { AgentResponse } from '../../domain/entities/Response.js';\nimport { TextGenerateOptions } from '../../domain/interfaces/ITextProvider.js';\nimport { ToolCall, ToolResult, ToolCallState } from '../../domain/entities/Tool.js';\n\nexport type HistoryMode = 'none' | 'summary' | 'full';\n\nexport interface ExecutionContextConfig {\n maxHistorySize?: number; // Max iterations to store (default: 10)\n historyMode?: HistoryMode; // What to store (default: 'summary')\n maxAuditTrailSize?: number; // Max audit entries (default: 1000)\n}\n\nexport interface IterationRecord {\n iteration: number;\n request: TextGenerateOptions;\n response: AgentResponse;\n toolCalls: ToolCall[];\n toolResults: ToolResult[];\n startTime: Date;\n endTime: Date;\n}\n\nexport interface IterationSummary {\n iteration: number;\n tokens: number;\n toolCount: number;\n duration: number;\n timestamp: Date;\n}\n\nexport interface ExecutionMetrics {\n // Timing\n totalDuration: number;\n llmDuration: number;\n toolDuration: number;\n hookDuration: number;\n\n // Counts\n iterationCount: number;\n toolCallCount: number;\n toolSuccessCount: number;\n toolFailureCount: number;\n toolTimeoutCount: number;\n\n // Tokens\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n\n // Errors\n errors: Array<{ type: string; message: string; timestamp: Date }>;\n}\n\nexport interface AuditEntry {\n timestamp: Date;\n type:\n | 'hook_executed'\n | 'tool_modified'\n | 'tool_skipped'\n | 'execution_paused'\n | 'execution_resumed'\n | 'tool_approved'\n | 'tool_rejected'\n | 'tool_blocked'\n | 'tool_permission_approved';\n hookName?: string;\n toolName?: string;\n details: any;\n}\n\nexport class ExecutionContext {\n // Execution metadata\n readonly executionId: string;\n readonly startTime: Date;\n iteration: number = 0;\n\n // Tool tracking\n readonly toolCalls: Map<string, ToolCall> = new Map();\n readonly toolResults: Map<string, ToolResult> = new Map();\n\n // Control state\n paused: boolean = false;\n pauseReason?: string;\n cancelled: boolean = false;\n cancelReason?: string;\n\n // User data (for hooks to share state)\n readonly metadata: Map<string, any> = new Map();\n\n // History storage (memory-safe)\n private readonly config: ExecutionContextConfig;\n private readonly iterations: IterationRecord[] = [];\n private readonly iterationSummaries: IterationSummary[] = [];\n\n // Metrics\n readonly metrics: ExecutionMetrics = {\n totalDuration: 0,\n llmDuration: 0,\n toolDuration: 0,\n hookDuration: 0,\n iterationCount: 0,\n toolCallCount: 0,\n toolSuccessCount: 0,\n toolFailureCount: 0,\n toolTimeoutCount: 0,\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n errors: [],\n };\n\n // Audit trail\n private readonly auditTrail: AuditEntry[] = [];\n\n constructor(\n executionId: string,\n config: ExecutionContextConfig = {}\n ) {\n this.executionId = executionId;\n this.startTime = new Date();\n this.config = {\n maxHistorySize: config.maxHistorySize || 10,\n historyMode: config.historyMode || 'summary',\n maxAuditTrailSize: config.maxAuditTrailSize || 1000,\n };\n }\n\n /**\n * Add iteration to history (memory-safe)\n */\n addIteration(record: IterationRecord): void {\n switch (this.config.historyMode) {\n case 'none':\n // Don't store anything\n break;\n\n case 'summary':\n // Store lightweight summary only\n this.iterationSummaries.push({\n iteration: record.iteration,\n tokens: record.response.usage.total_tokens,\n toolCount: record.toolCalls.length,\n duration: record.endTime.getTime() - record.startTime.getTime(),\n timestamp: record.startTime,\n });\n\n // Keep circular buffer\n if (this.iterationSummaries.length > this.config.maxHistorySize!) {\n this.iterationSummaries.shift();\n }\n break;\n\n case 'full':\n // Store full iteration data\n this.iterations.push(record);\n\n // Keep circular buffer\n if (this.iterations.length > this.config.maxHistorySize!) {\n this.iterations.shift();\n }\n break;\n }\n }\n\n /**\n * Get iteration history\n */\n getHistory(): IterationRecord[] | IterationSummary[] {\n return this.config.historyMode === 'full' ? this.iterations : this.iterationSummaries;\n }\n\n /**\n * Add audit entry\n */\n audit(type: AuditEntry['type'], details: any, hookName?: string, toolName?: string): void {\n this.auditTrail.push({\n timestamp: new Date(),\n type,\n hookName,\n toolName,\n details,\n });\n\n // Keep circular buffer\n if (this.auditTrail.length > this.config.maxAuditTrailSize!) {\n this.auditTrail.shift();\n }\n }\n\n /**\n * Get audit trail\n */\n getAuditTrail(): readonly AuditEntry[] {\n return this.auditTrail;\n }\n\n /**\n * Update metrics\n */\n updateMetrics(update: Partial<ExecutionMetrics>): void {\n Object.assign(this.metrics, update);\n }\n\n /**\n * Add tool call to tracking\n */\n addToolCall(toolCall: ToolCall): void {\n this.toolCalls.set(toolCall.id, toolCall);\n this.metrics.toolCallCount++;\n }\n\n /**\n * Add tool result to tracking\n */\n addToolResult(result: ToolResult): void {\n this.toolResults.set(result.tool_use_id, result);\n\n // Update metrics\n if (result.state === ToolCallState.COMPLETED) {\n this.metrics.toolSuccessCount++;\n } else if (result.state === ToolCallState.FAILED) {\n this.metrics.toolFailureCount++;\n } else if (result.state === ToolCallState.TIMEOUT) {\n this.metrics.toolTimeoutCount++;\n }\n }\n\n /**\n * Check resource limits\n */\n checkLimits(limits?: {\n maxExecutionTime?: number;\n maxToolCalls?: number;\n maxContextSize?: number;\n }): void {\n if (!limits) return;\n\n // Check execution time\n if (limits.maxExecutionTime) {\n const elapsed = Date.now() - this.startTime.getTime();\n if (elapsed > limits.maxExecutionTime) {\n throw new Error(\n `Execution time limit exceeded: ${elapsed}ms > ${limits.maxExecutionTime}ms`\n );\n }\n }\n\n // Check tool call count\n if (limits.maxToolCalls && this.toolCalls.size > limits.maxToolCalls) {\n throw new Error(\n `Tool call limit exceeded: ${this.toolCalls.size} > ${limits.maxToolCalls}`\n );\n }\n\n // Check context size\n if (limits.maxContextSize) {\n const size = this.estimateSize();\n if (size > limits.maxContextSize) {\n throw new Error(\n `Context size limit exceeded: ${size} bytes > ${limits.maxContextSize} bytes`\n );\n }\n }\n }\n\n /**\n * Estimate memory usage (rough approximation)\n */\n private estimateSize(): number {\n try {\n const data = {\n toolCalls: Array.from(this.toolCalls.values()),\n toolResults: Array.from(this.toolResults.values()),\n iterations: this.config.historyMode === 'full' ? this.iterations : this.iterationSummaries,\n auditTrail: this.auditTrail,\n };\n return JSON.stringify(data).length;\n } catch {\n return 0; // Error estimating, return 0\n }\n }\n\n /**\n * Cleanup resources and release memory\n * Clears all internal arrays and maps to allow garbage collection\n */\n cleanup(): void {\n // Store execution summary before clearing\n const summary = {\n executionId: this.executionId,\n totalIterations: this.iteration,\n totalToolCalls: this.metrics.toolCallCount,\n totalDuration: Date.now() - this.startTime.getTime(),\n success: !this.cancelled && this.metrics.errors.length === 0,\n };\n\n // Clear all maps\n this.toolCalls.clear();\n this.toolResults.clear();\n this.metadata.clear();\n\n // Clear all arrays (modify length to allow GC of items)\n this.iterations.length = 0;\n this.iterationSummaries.length = 0;\n this.auditTrail.length = 0;\n this.metrics.errors.length = 0;\n\n // Store summary after clearing (for final access if needed)\n this.metadata.set('execution_summary', summary);\n }\n\n /**\n * Get execution summary\n */\n getSummary() {\n return {\n executionId: this.executionId,\n startTime: this.startTime,\n currentIteration: this.iteration,\n paused: this.paused,\n cancelled: this.cancelled,\n metrics: { ...this.metrics },\n totalDuration: Date.now() - this.startTime.getTime(),\n };\n }\n}\n","/**\n * Hook manager - handles hook registration and execution\n * Includes error isolation, timeouts, and optional parallel execution\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport {\n Hook,\n HookConfig,\n HookName,\n HookSignatures,\n} from './types/HookTypes.js';\n\nexport class HookManager {\n private hooks: Map<HookName, Hook<any, any>[]> = new Map();\n private timeout: number;\n private parallel: boolean;\n // Per-hook error tracking: hookKey -> consecutive error count\n private hookErrorCounts: Map<string, number> = new Map();\n // Disabled hooks that exceeded error threshold\n private disabledHooks: Set<string> = new Set();\n private maxConsecutiveErrors: number = 3;\n private emitter: EventEmitter;\n\n constructor(\n config: HookConfig = {},\n emitter: EventEmitter,\n errorHandling?: { maxConsecutiveErrors?: number }\n ) {\n this.timeout = config.hookTimeout || 5000; // 5 second default\n this.parallel = config.parallelHooks || false;\n this.emitter = emitter;\n this.maxConsecutiveErrors = errorHandling?.maxConsecutiveErrors || 3;\n\n // Register hooks from config\n this.registerFromConfig(config);\n }\n\n /**\n * Register hooks from configuration\n */\n private registerFromConfig(config: HookConfig): void {\n const hookNames: HookName[] = [\n 'before:execution',\n 'after:execution',\n 'before:llm',\n 'after:llm',\n 'before:tool',\n 'after:tool',\n 'approve:tool',\n 'pause:check',\n ];\n\n for (const name of hookNames) {\n const hook = config[name];\n if (hook) {\n this.register(name, hook);\n }\n }\n }\n\n /**\n * Register a hook\n */\n register(name: HookName, hook: Hook<any, any>): void {\n // Validate hook is a function\n if (typeof hook !== 'function') {\n throw new Error(`Hook must be a function, got: ${typeof hook}`);\n }\n\n // Get or create hooks array\n if (!this.hooks.has(name)) {\n this.hooks.set(name, []);\n }\n\n const existing = this.hooks.get(name)!;\n\n // Limit number of hooks per name\n if (existing.length >= 10) {\n throw new Error(`Too many hooks for ${name} (max: 10)`);\n }\n\n existing.push(hook);\n }\n\n /**\n * Unregister a specific hook function by reference.\n * Returns true if the hook was found and removed.\n */\n unregister(name: HookName, hook: Hook<any, any>): boolean {\n const hooks = this.hooks.get(name);\n if (!hooks) return false;\n\n const index = hooks.indexOf(hook);\n if (index === -1) return false;\n\n hooks.splice(index, 1);\n return true;\n }\n\n /**\n * Execute hooks for a given name\n */\n async executeHooks<K extends HookName>(\n name: K,\n context: HookSignatures[K]['context'],\n defaultResult: HookSignatures[K]['result']\n ): Promise<HookSignatures[K]['result']> {\n const hooks = this.hooks.get(name);\n\n if (!hooks || hooks.length === 0) {\n return defaultResult;\n }\n\n // Parallel execution (for independent hooks)\n if (this.parallel && hooks.length > 1) {\n return this.executeHooksParallel(hooks, context, defaultResult);\n }\n\n // Sequential execution (default)\n return this.executeHooksSequential(hooks, context, defaultResult);\n }\n\n /**\n * Execute hooks sequentially\n */\n private async executeHooksSequential<T>(\n hooks: Hook<any, any>[],\n context: any,\n defaultResult: T\n ): Promise<T> {\n let result = defaultResult;\n\n for (let i = 0; i < hooks.length; i++) {\n const hook = hooks[i]!;\n const hookKey = this.getHookKey(hook, i);\n const hookResult = await this.executeHookSafely(hook, context, hookKey);\n\n // Skip failed hooks (loose equality catches both null and undefined)\n if (hookResult == null) {\n continue;\n }\n\n // Merge hook result\n result = { ...result, ...hookResult };\n\n // Check for early exit\n if ((hookResult as any).skip === true) {\n break;\n }\n }\n\n return result;\n }\n\n /**\n * Execute hooks in parallel\n */\n private async executeHooksParallel<T>(\n hooks: Hook<any, any>[],\n context: any,\n defaultResult: T\n ): Promise<T> {\n // Execute all hooks concurrently with unique keys\n const results = await Promise.all(\n hooks.map((hook, i) => {\n const hookKey = this.getHookKey(hook, i);\n return this.executeHookSafely(hook, context, hookKey);\n })\n );\n\n // Filter out failures and merge results\n const validResults = results.filter((r) => r != null);\n\n return validResults.reduce(\n (acc, hookResult) => ({ ...acc, ...hookResult }),\n defaultResult\n );\n }\n\n /**\n * Generate unique key for a hook\n */\n private getHookKey(hook: Hook<any, any>, index: number): string {\n return `${hook.name || 'anonymous'}_${index}`;\n }\n\n /**\n * Execute single hook with error isolation and timeout (with per-hook error tracking)\n */\n private async executeHookSafely<T>(\n hook: Hook<any, any>,\n context: any,\n hookKey?: string\n ): Promise<T | null> {\n const key = hookKey || hook.name || 'anonymous';\n\n // Skip disabled hooks\n if (this.disabledHooks.has(key)) {\n return null;\n }\n\n const startTime = Date.now();\n\n try {\n // Execute with timeout\n const result = await Promise.race([\n hook(context),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Hook timeout')), this.timeout)\n ),\n ]);\n\n // Reset error counter for this hook on success\n this.hookErrorCounts.delete(key);\n\n // Track timing\n const duration = Date.now() - startTime;\n if (context.context?.updateMetrics) {\n context.context.updateMetrics({\n hookDuration: (context.context.metrics.hookDuration || 0) + duration,\n });\n }\n\n return result as T;\n } catch (error) {\n // Increment error counter for this specific hook\n const errorCount = (this.hookErrorCounts.get(key) || 0) + 1;\n this.hookErrorCounts.set(key, errorCount);\n\n // Emit error event\n this.emitter.emit('hook:error', {\n executionId: context.executionId,\n hookName: hook.name || 'anonymous',\n error: error as Error,\n consecutiveErrors: errorCount,\n timestamp: new Date(),\n });\n\n // Check consecutive error threshold for this hook\n if (errorCount >= this.maxConsecutiveErrors) {\n // Disable this specific hook, not all hooks\n this.disabledHooks.add(key);\n console.warn(\n `Hook \"${key}\" disabled after ${errorCount} consecutive failures. Last error: ${(error as Error).message}`\n );\n } else {\n // Log warning but continue (degraded mode)\n console.warn(\n `Hook execution failed (${key}): ${(error as Error).message} (${errorCount}/${this.maxConsecutiveErrors} errors)`\n );\n }\n\n return null; // Hook failed, skip its result\n }\n }\n\n /**\n * Check if there are any hooks registered\n */\n hasHooks(name: HookName): boolean {\n const hooks = this.hooks.get(name);\n return !!hooks && hooks.length > 0;\n }\n\n /**\n * Get hook count\n */\n getHookCount(name?: HookName): number {\n if (name) {\n return this.hooks.get(name)?.length || 0;\n }\n // Total across all hooks\n return Array.from(this.hooks.values()).reduce((sum, arr) => sum + arr.length, 0);\n }\n\n /**\n * Clear all hooks and reset error tracking\n */\n clear(): void {\n this.hooks.clear();\n this.hookErrorCounts.clear();\n this.disabledHooks.clear();\n }\n\n /**\n * Re-enable a disabled hook\n */\n enableHook(hookKey: string): void {\n this.disabledHooks.delete(hookKey);\n this.hookErrorCounts.delete(hookKey);\n }\n\n /**\n * Get list of disabled hooks\n */\n getDisabledHooks(): string[] {\n return Array.from(this.disabledHooks);\n }\n}\n"]}
|