mcp-agent-foundry 1.3.1 → 2.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 (144) hide show
  1. package/README.md +265 -2
  2. package/dist/background/index.d.ts +33 -0
  3. package/dist/background/index.d.ts.map +1 -0
  4. package/dist/background/index.js +33 -0
  5. package/dist/background/index.js.map +1 -0
  6. package/dist/background/task-runner.d.ts +177 -0
  7. package/dist/background/task-runner.d.ts.map +1 -0
  8. package/dist/background/task-runner.js +551 -0
  9. package/dist/background/task-runner.js.map +1 -0
  10. package/dist/background/types.d.ts +135 -0
  11. package/dist/background/types.d.ts.map +1 -0
  12. package/dist/background/types.js +8 -0
  13. package/dist/background/types.js.map +1 -0
  14. package/dist/config/validator.d.ts +2 -2
  15. package/dist/config/validator.d.ts.map +1 -1
  16. package/dist/config/validator.js +2 -2
  17. package/dist/config/validator.js.map +1 -1
  18. package/dist/failover/health-tracker.d.ts +81 -1
  19. package/dist/failover/health-tracker.d.ts.map +1 -1
  20. package/dist/failover/health-tracker.js +229 -1
  21. package/dist/failover/health-tracker.js.map +1 -1
  22. package/dist/failover/orchestrator.d.ts.map +1 -1
  23. package/dist/failover/orchestrator.js +12 -2
  24. package/dist/failover/orchestrator.js.map +1 -1
  25. package/dist/hooks/hook-executor.d.ts +77 -0
  26. package/dist/hooks/hook-executor.d.ts.map +1 -0
  27. package/dist/hooks/hook-executor.js +308 -0
  28. package/dist/hooks/hook-executor.js.map +1 -0
  29. package/dist/hooks/hook-manager.d.ts +140 -0
  30. package/dist/hooks/hook-manager.d.ts.map +1 -0
  31. package/dist/hooks/hook-manager.js +520 -0
  32. package/dist/hooks/hook-manager.js.map +1 -0
  33. package/dist/hooks/index.d.ts +10 -0
  34. package/dist/hooks/index.d.ts.map +1 -0
  35. package/dist/hooks/index.js +10 -0
  36. package/dist/hooks/index.js.map +1 -0
  37. package/dist/hooks/types.d.ts +221 -0
  38. package/dist/hooks/types.d.ts.map +1 -0
  39. package/dist/hooks/types.js +31 -0
  40. package/dist/hooks/types.js.map +1 -0
  41. package/dist/index.d.ts +1 -1
  42. package/dist/index.js +1 -1
  43. package/dist/mcp/auto-mode.d.ts +221 -0
  44. package/dist/mcp/auto-mode.d.ts.map +1 -0
  45. package/dist/mcp/auto-mode.js +436 -0
  46. package/dist/mcp/auto-mode.js.map +1 -0
  47. package/dist/mcp/index.d.ts +14 -0
  48. package/dist/mcp/index.d.ts.map +1 -0
  49. package/dist/mcp/index.js +22 -0
  50. package/dist/mcp/index.js.map +1 -0
  51. package/dist/mcp/tools/critique-plan.d.ts.map +1 -1
  52. package/dist/mcp/tools/critique-plan.js +57 -4
  53. package/dist/mcp/tools/critique-plan.js.map +1 -1
  54. package/dist/mcp/tools/design-feedback.d.ts.map +1 -1
  55. package/dist/mcp/tools/design-feedback.js +58 -4
  56. package/dist/mcp/tools/design-feedback.js.map +1 -1
  57. package/dist/mcp/tools/invoke-agent.d.ts.map +1 -1
  58. package/dist/mcp/tools/invoke-agent.js +64 -1
  59. package/dist/mcp/tools/invoke-agent.js.map +1 -1
  60. package/dist/mcp/tools/review-code.d.ts.map +1 -1
  61. package/dist/mcp/tools/review-code.js +57 -4
  62. package/dist/mcp/tools/review-code.js.map +1 -1
  63. package/dist/mcp/tools/tasks/delete-task.d.ts +25 -0
  64. package/dist/mcp/tools/tasks/delete-task.d.ts.map +1 -0
  65. package/dist/mcp/tools/tasks/delete-task.js +148 -0
  66. package/dist/mcp/tools/tasks/delete-task.js.map +1 -0
  67. package/dist/mcp/tools/tasks/execute-task.d.ts.map +1 -1
  68. package/dist/mcp/tools/tasks/execute-task.js +74 -5
  69. package/dist/mcp/tools/tasks/execute-task.js.map +1 -1
  70. package/dist/mcp/tools/tasks/index.d.ts +2 -0
  71. package/dist/mcp/tools/tasks/index.d.ts.map +1 -1
  72. package/dist/mcp/tools/tasks/index.js +6 -0
  73. package/dist/mcp/tools/tasks/index.js.map +1 -1
  74. package/dist/observability/debug-logger.d.ts +209 -0
  75. package/dist/observability/debug-logger.d.ts.map +1 -0
  76. package/dist/observability/debug-logger.js +430 -0
  77. package/dist/observability/debug-logger.js.map +1 -0
  78. package/dist/observability/index.d.ts +12 -0
  79. package/dist/observability/index.d.ts.map +1 -0
  80. package/dist/observability/index.js +12 -0
  81. package/dist/observability/index.js.map +1 -0
  82. package/dist/observability/logger.d.ts +180 -0
  83. package/dist/observability/logger.d.ts.map +1 -1
  84. package/dist/observability/logger.js +158 -0
  85. package/dist/observability/logger.js.map +1 -1
  86. package/dist/providers/anthropic.d.ts +40 -6
  87. package/dist/providers/anthropic.d.ts.map +1 -1
  88. package/dist/providers/anthropic.js +120 -8
  89. package/dist/providers/anthropic.js.map +1 -1
  90. package/dist/providers/base.d.ts +6 -3
  91. package/dist/providers/base.d.ts.map +1 -1
  92. package/dist/providers/base.js.map +1 -1
  93. package/dist/router/context-manager.d.ts +214 -1
  94. package/dist/router/context-manager.d.ts.map +1 -1
  95. package/dist/router/context-manager.js +759 -2
  96. package/dist/router/context-manager.js.map +1 -1
  97. package/dist/router/context-types.d.ts +182 -0
  98. package/dist/router/context-types.d.ts.map +1 -0
  99. package/dist/router/context-types.js +8 -0
  100. package/dist/router/context-types.js.map +1 -0
  101. package/dist/router/engine.d.ts +3 -3
  102. package/dist/router/engine.d.ts.map +1 -1
  103. package/dist/router/engine.js +32 -4
  104. package/dist/router/engine.js.map +1 -1
  105. package/dist/router/pattern-executor.d.ts.map +1 -1
  106. package/dist/router/pattern-executor.js +38 -7
  107. package/dist/router/pattern-executor.js.map +1 -1
  108. package/dist/server.d.ts +41 -0
  109. package/dist/server.d.ts.map +1 -1
  110. package/dist/server.js +165 -0
  111. package/dist/server.js.map +1 -1
  112. package/dist/skills/hot-reloader.d.ts +104 -0
  113. package/dist/skills/hot-reloader.d.ts.map +1 -0
  114. package/dist/skills/hot-reloader.js +314 -0
  115. package/dist/skills/hot-reloader.js.map +1 -0
  116. package/dist/skills/index.d.ts +14 -0
  117. package/dist/skills/index.d.ts.map +1 -0
  118. package/dist/skills/index.js +16 -0
  119. package/dist/skills/index.js.map +1 -0
  120. package/dist/skills/skill-executor.d.ts +96 -0
  121. package/dist/skills/skill-executor.d.ts.map +1 -0
  122. package/dist/skills/skill-executor.js +289 -0
  123. package/dist/skills/skill-executor.js.map +1 -0
  124. package/dist/skills/skill-loader.d.ts +147 -0
  125. package/dist/skills/skill-loader.d.ts.map +1 -0
  126. package/dist/skills/skill-loader.js +579 -0
  127. package/dist/skills/skill-loader.js.map +1 -0
  128. package/dist/skills/types.d.ts +198 -0
  129. package/dist/skills/types.d.ts.map +1 -0
  130. package/dist/skills/types.js +21 -0
  131. package/dist/skills/types.js.map +1 -0
  132. package/dist/tasks/coordinator.d.ts +22 -1
  133. package/dist/tasks/coordinator.d.ts.map +1 -1
  134. package/dist/tasks/coordinator.js +83 -0
  135. package/dist/tasks/coordinator.js.map +1 -1
  136. package/dist/tasks/state-coordinator.d.ts +19 -0
  137. package/dist/tasks/state-coordinator.d.ts.map +1 -1
  138. package/dist/tasks/state-coordinator.js +40 -0
  139. package/dist/tasks/state-coordinator.js.map +1 -1
  140. package/dist/types.d.ts +39 -7
  141. package/dist/types.d.ts.map +1 -1
  142. package/dist/types.js +9 -0
  143. package/dist/types.js.map +1 -1
  144. package/package.json +1 -1
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Hook Manager
3
+ *
4
+ * Central manager for hook registration, filtering, and execution.
5
+ * Handles hook lifecycle, session tracking, and event triggering.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ import type { Logger } from '../observability/logger.js';
9
+ import type { HooksConfig, HookDefinition, HookEvent, HookInput, HookTriggerResult, HookManagerEvents } from './types.js';
10
+ /**
11
+ * Manages hook registration, filtering, and execution.
12
+ * Provides an event-based API for hook lifecycle notifications.
13
+ */
14
+ export declare class HookManager extends EventEmitter {
15
+ private readonly logger;
16
+ private readonly executor;
17
+ private config;
18
+ private hooks;
19
+ private runTracker;
20
+ private sessionId;
21
+ private hooksFilePath?;
22
+ private fileWatcher?;
23
+ constructor(config: Partial<HooksConfig> | undefined, logger: Logger);
24
+ /**
25
+ * Check if hooks system is enabled.
26
+ */
27
+ get isEnabled(): boolean;
28
+ /**
29
+ * Get the current session ID.
30
+ */
31
+ getSessionId(): string;
32
+ /**
33
+ * Register hooks from configuration.
34
+ * Validates and indexes hooks by event type.
35
+ *
36
+ * @param hooks - Hook definitions to register
37
+ */
38
+ registerHooks(hooks: HookDefinition[]): void;
39
+ /**
40
+ * Unregister a hook by name.
41
+ *
42
+ * @param name - Name of the hook to unregister
43
+ */
44
+ unregisterHook(name: string): void;
45
+ /**
46
+ * Get all hooks registered for an event.
47
+ *
48
+ * @param event - Hook event type
49
+ * @returns Array of hook definitions
50
+ */
51
+ getHooksForEvent(event: HookEvent): HookDefinition[];
52
+ /**
53
+ * Trigger all hooks for an event.
54
+ * Executes matching hooks in registration order.
55
+ *
56
+ * @param event - Event to trigger
57
+ * @param input - Input data (without event and timestamp)
58
+ * @returns Combined result from all hooks
59
+ */
60
+ trigger(event: HookEvent, input: Omit<HookInput, 'event' | 'timestamp'>): Promise<HookTriggerResult>;
61
+ /**
62
+ * Check if a hook should run based on filters and run tracking.
63
+ *
64
+ * @param hook - Hook definition to check
65
+ * @param input - Hook input data
66
+ * @returns True if hook should run
67
+ */
68
+ shouldRun(hook: HookDefinition, input: HookInput): boolean;
69
+ /**
70
+ * Mark a hook as having run (for once: true hooks).
71
+ *
72
+ * @param hookName - Name of the hook
73
+ */
74
+ markRun(hookName: string): void;
75
+ /**
76
+ * Check if a hook has already run this session.
77
+ *
78
+ * @param hookName - Name of the hook
79
+ * @returns True if hook has run
80
+ */
81
+ hasRun(hookName: string): boolean;
82
+ /**
83
+ * Reset run tracking (for new session).
84
+ */
85
+ resetSession(): void;
86
+ /**
87
+ * Load hooks from an external file.
88
+ *
89
+ * @param path - Path to hooks configuration file (JSON or YAML)
90
+ */
91
+ loadFromFile(path: string): Promise<void>;
92
+ /**
93
+ * Start watching hooks file for changes.
94
+ * Automatically reloads hooks when file changes.
95
+ */
96
+ watchFile(): void;
97
+ /**
98
+ * Stop watching hooks file.
99
+ */
100
+ stopWatching(): void;
101
+ /**
102
+ * Hot-reload hooks from file.
103
+ */
104
+ reload(): Promise<void>;
105
+ /**
106
+ * Update configuration.
107
+ *
108
+ * @param config - New configuration (partial)
109
+ */
110
+ updateConfig(config: Partial<HooksConfig>): void;
111
+ /**
112
+ * Get current configuration.
113
+ */
114
+ getConfig(): HooksConfig;
115
+ /**
116
+ * Shutdown hook manager and cleanup resources.
117
+ */
118
+ shutdown(): void;
119
+ /**
120
+ * Generate a unique session ID.
121
+ */
122
+ private generateSessionId;
123
+ /**
124
+ * Parse hooks file content (JSON).
125
+ */
126
+ private parseHooksFile;
127
+ /**
128
+ * Match a string against a pattern (supports * wildcard).
129
+ */
130
+ private matchesPattern;
131
+ /**
132
+ * Merge two hook outputs, with later values taking precedence.
133
+ */
134
+ private mergeOutputs;
135
+ }
136
+ export interface HookManager {
137
+ on<K extends keyof HookManagerEvents>(event: K, listener: (payload: HookManagerEvents[K]) => void): this;
138
+ emit<K extends keyof HookManagerEvents>(event: K, payload: HookManagerEvents[K]): boolean;
139
+ }
140
+ //# sourceMappingURL=hook-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-manager.d.ts","sourceRoot":"","sources":["../../src/hooks/hook-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,SAAS,EACT,SAAS,EAGT,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAOpB;;;GAGG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,WAAW,CAAC,CAAY;gBAEpB,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,YAAK,EAAE,MAAM,EAAE,MAAM;IAqB7D;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;;;;OAKG;IACH,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAuD5C;;;;OAIG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAalC;;;;;OAKG;IACH,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,cAAc,EAAE;IAIpD;;;;;;;OAOG;IACG,OAAO,CACX,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,WAAW,CAAC,GAC5C,OAAO,CAAC,iBAAiB,CAAC;IAoJ7B;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO;IA6C1D;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI/B;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,YAAY,IAAI,IAAI;IAMpB;;;;OAIG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB/C;;;OAGG;IACH,SAAS,IAAI,IAAI;IA6BjB;;OAEG;IACH,YAAY,IAAI,IAAI;IAQpB;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAe7B;;;;OAIG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAahD;;OAEG;IACH,SAAS,IAAI,WAAW;IAIxB;;OAEG;IACH,QAAQ,IAAI,IAAI;IAYhB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAoBtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,OAAO,CAAC,YAAY;CA4BrB;AAOD,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,CAAC,SAAS,MAAM,iBAAiB,EAClC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,GAChD,IAAI,CAAC;IACR,IAAI,CAAC,CAAC,SAAS,MAAM,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CAC3F"}
@@ -0,0 +1,520 @@
1
+ /**
2
+ * Hook Manager
3
+ *
4
+ * Central manager for hook registration, filtering, and execution.
5
+ * Handles hook lifecycle, session tracking, and event triggering.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ import { readFile } from 'fs/promises';
9
+ import { watch } from 'fs';
10
+ import { HookExecutor } from './hook-executor.js';
11
+ import { DEFAULT_HOOKS_CONFIG, HOOK_EVENTS } from './types.js';
12
+ // ============================================================================
13
+ // Hook Manager Class
14
+ // ============================================================================
15
+ /**
16
+ * Manages hook registration, filtering, and execution.
17
+ * Provides an event-based API for hook lifecycle notifications.
18
+ */
19
+ export class HookManager extends EventEmitter {
20
+ logger;
21
+ executor;
22
+ config;
23
+ hooks;
24
+ runTracker; // Track hooks that have run (for once: true)
25
+ sessionId;
26
+ hooksFilePath;
27
+ fileWatcher;
28
+ constructor(config = {}, logger) {
29
+ super();
30
+ this.logger = logger.child({ component: 'HookManager' });
31
+ this.config = { ...DEFAULT_HOOKS_CONFIG, ...config };
32
+ this.executor = new HookExecutor(logger, this.config.default_timeout_ms);
33
+ this.hooks = new Map();
34
+ this.runTracker = new Set();
35
+ this.sessionId = this.generateSessionId();
36
+ // Initialize hooks from config
37
+ if (this.config.hooks.length > 0) {
38
+ this.registerHooks(this.config.hooks);
39
+ }
40
+ this.logger.debug('HookManager initialized', {
41
+ enabled: this.config.enabled,
42
+ hookCount: this.config.hooks.length,
43
+ failSilent: this.config.fail_silent,
44
+ });
45
+ }
46
+ /**
47
+ * Check if hooks system is enabled.
48
+ */
49
+ get isEnabled() {
50
+ return this.config.enabled;
51
+ }
52
+ /**
53
+ * Get the current session ID.
54
+ */
55
+ getSessionId() {
56
+ return this.sessionId;
57
+ }
58
+ /**
59
+ * Register hooks from configuration.
60
+ * Validates and indexes hooks by event type.
61
+ *
62
+ * @param hooks - Hook definitions to register
63
+ */
64
+ registerHooks(hooks) {
65
+ // Clear existing hooks
66
+ this.hooks.clear();
67
+ // Initialize empty arrays for all events
68
+ for (const event of HOOK_EVENTS) {
69
+ this.hooks.set(event, []);
70
+ }
71
+ // Register each hook
72
+ for (const hook of hooks) {
73
+ // Validate event type
74
+ if (!HOOK_EVENTS.includes(hook.event)) {
75
+ this.logger.warn('Invalid hook event type, skipping', {
76
+ hookName: hook.name,
77
+ event: hook.event,
78
+ validEvents: HOOK_EVENTS,
79
+ });
80
+ continue;
81
+ }
82
+ // Validate required fields
83
+ if (!hook.name || !hook.command) {
84
+ this.logger.warn('Hook missing required fields, skipping', {
85
+ hookName: hook.name,
86
+ hasCommand: !!hook.command,
87
+ });
88
+ continue;
89
+ }
90
+ const eventHooks = this.hooks.get(hook.event) ?? [];
91
+ eventHooks.push(hook);
92
+ this.hooks.set(hook.event, eventHooks);
93
+ this.logger.debug('Hook registered', {
94
+ hookName: hook.name,
95
+ event: hook.event,
96
+ enabled: hook.enabled !== false,
97
+ once: hook.once ?? false,
98
+ });
99
+ }
100
+ const totalHooks = Array.from(this.hooks.values()).reduce((sum, arr) => sum + arr.length, 0);
101
+ this.logger.info('Hooks registered', {
102
+ totalHooks,
103
+ eventBreakdown: Object.fromEntries(Array.from(this.hooks.entries()).map(([event, arr]) => [event, arr.length])),
104
+ });
105
+ }
106
+ /**
107
+ * Unregister a hook by name.
108
+ *
109
+ * @param name - Name of the hook to unregister
110
+ */
111
+ unregisterHook(name) {
112
+ for (const [event, eventHooks] of this.hooks.entries()) {
113
+ const index = eventHooks.findIndex((h) => h.name === name);
114
+ if (index !== -1) {
115
+ eventHooks.splice(index, 1);
116
+ this.hooks.set(event, eventHooks);
117
+ this.logger.debug('Hook unregistered', { hookName: name, event });
118
+ return;
119
+ }
120
+ }
121
+ this.logger.warn('Hook not found for unregistration', { hookName: name });
122
+ }
123
+ /**
124
+ * Get all hooks registered for an event.
125
+ *
126
+ * @param event - Hook event type
127
+ * @returns Array of hook definitions
128
+ */
129
+ getHooksForEvent(event) {
130
+ return this.hooks.get(event) ?? [];
131
+ }
132
+ /**
133
+ * Trigger all hooks for an event.
134
+ * Executes matching hooks in registration order.
135
+ *
136
+ * @param event - Event to trigger
137
+ * @param input - Input data (without event and timestamp)
138
+ * @returns Combined result from all hooks
139
+ */
140
+ async trigger(event, input) {
141
+ // Check if hooks are enabled
142
+ if (!this.config.enabled) {
143
+ return {
144
+ event,
145
+ hooksExecuted: 0,
146
+ results: [],
147
+ combinedOutput: {},
148
+ hasErrors: false,
149
+ shouldAbort: false,
150
+ };
151
+ }
152
+ const eventHooks = this.getHooksForEvent(event);
153
+ if (eventHooks.length === 0) {
154
+ return {
155
+ event,
156
+ hooksExecuted: 0,
157
+ results: [],
158
+ combinedOutput: {},
159
+ hasErrors: false,
160
+ shouldAbort: false,
161
+ };
162
+ }
163
+ // Build full input with event and timestamp
164
+ const fullInput = {
165
+ ...input,
166
+ event,
167
+ timestamp: new Date(),
168
+ sessionId: this.sessionId,
169
+ };
170
+ // Filter to applicable hooks
171
+ const applicableHooks = eventHooks.filter((hook) => this.shouldRun(hook, fullInput));
172
+ if (applicableHooks.length === 0) {
173
+ return {
174
+ event,
175
+ hooksExecuted: 0,
176
+ results: [],
177
+ combinedOutput: {},
178
+ hasErrors: false,
179
+ shouldAbort: false,
180
+ };
181
+ }
182
+ this.logger.debug('Triggering hooks', {
183
+ event,
184
+ totalHooks: eventHooks.length,
185
+ applicableHooks: applicableHooks.length,
186
+ });
187
+ // Execute hooks
188
+ const results = [];
189
+ let combinedOutput = {};
190
+ let hasErrors = false;
191
+ let shouldAbort = false;
192
+ for (const hook of applicableHooks) {
193
+ // Emit before event
194
+ this.emit('hook:before', { hook, input: fullInput });
195
+ try {
196
+ const result = await this.executor.execute(hook, fullInput);
197
+ results.push(result);
198
+ // Emit after event
199
+ this.emit('hook:after', { hook, result });
200
+ // Mark as run if once: true
201
+ if (hook.once) {
202
+ this.markRun(hook.name);
203
+ }
204
+ // Merge output
205
+ if (result.output) {
206
+ combinedOutput = this.mergeOutputs(combinedOutput, result.output);
207
+ }
208
+ // Check for errors
209
+ if (!result.success) {
210
+ hasErrors = true;
211
+ this.emit('hook:error', { hook, error: result.error ?? new Error('Unknown error') });
212
+ if (!this.config.fail_silent) {
213
+ shouldAbort = true;
214
+ break;
215
+ }
216
+ }
217
+ // Check for abort request
218
+ if (result.output?.abort) {
219
+ shouldAbort = true;
220
+ break;
221
+ }
222
+ // For PreToolUse, check for deny decision
223
+ if (event === 'PreToolUse' && result.output?.decision === 'deny') {
224
+ shouldAbort = true;
225
+ break;
226
+ }
227
+ }
228
+ catch (error) {
229
+ const errorObj = error instanceof Error ? error : new Error(String(error));
230
+ this.logger.error('Hook execution threw unexpected error', {
231
+ hookName: hook.name,
232
+ error: errorObj,
233
+ });
234
+ hasErrors = true;
235
+ results.push({
236
+ hook,
237
+ success: false,
238
+ error: errorObj,
239
+ durationMs: 0,
240
+ });
241
+ this.emit('hook:error', {
242
+ hook,
243
+ error: errorObj,
244
+ });
245
+ if (!this.config.fail_silent) {
246
+ shouldAbort = true;
247
+ break;
248
+ }
249
+ }
250
+ }
251
+ this.logger.debug('Hooks triggered', {
252
+ event,
253
+ hooksExecuted: results.length,
254
+ hasErrors,
255
+ shouldAbort,
256
+ });
257
+ return {
258
+ event,
259
+ hooksExecuted: results.length,
260
+ results,
261
+ combinedOutput,
262
+ hasErrors,
263
+ shouldAbort,
264
+ };
265
+ }
266
+ /**
267
+ * Check if a hook should run based on filters and run tracking.
268
+ *
269
+ * @param hook - Hook definition to check
270
+ * @param input - Hook input data
271
+ * @returns True if hook should run
272
+ */
273
+ shouldRun(hook, input) {
274
+ // Check if enabled
275
+ if (hook.enabled === false) {
276
+ return false;
277
+ }
278
+ // Check once tracking
279
+ if (hook.once && this.hasRun(hook.name)) {
280
+ return false;
281
+ }
282
+ // Check tool filter
283
+ if (hook.tools && hook.tools.length > 0 && input.toolName) {
284
+ const matchesTool = hook.tools.some((pattern) => this.matchesPattern(input.toolName, pattern));
285
+ if (!matchesTool) {
286
+ return false;
287
+ }
288
+ }
289
+ // Check provider filter
290
+ if (hook.providers && hook.providers.length > 0 && input.provider) {
291
+ if (!hook.providers.includes(input.provider)) {
292
+ return false;
293
+ }
294
+ }
295
+ // Check role filter
296
+ if (hook.roles && hook.roles.length > 0 && input.role) {
297
+ if (!hook.roles.includes(input.role)) {
298
+ return false;
299
+ }
300
+ }
301
+ // Check error code filter
302
+ if (hook.error_codes && hook.error_codes.length > 0) {
303
+ if (input.errorCode === undefined || !hook.error_codes.includes(input.errorCode)) {
304
+ return false;
305
+ }
306
+ }
307
+ return true;
308
+ }
309
+ /**
310
+ * Mark a hook as having run (for once: true hooks).
311
+ *
312
+ * @param hookName - Name of the hook
313
+ */
314
+ markRun(hookName) {
315
+ this.runTracker.add(hookName);
316
+ }
317
+ /**
318
+ * Check if a hook has already run this session.
319
+ *
320
+ * @param hookName - Name of the hook
321
+ * @returns True if hook has run
322
+ */
323
+ hasRun(hookName) {
324
+ return this.runTracker.has(hookName);
325
+ }
326
+ /**
327
+ * Reset run tracking (for new session).
328
+ */
329
+ resetSession() {
330
+ this.runTracker.clear();
331
+ this.sessionId = this.generateSessionId();
332
+ this.logger.debug('Session reset', { newSessionId: this.sessionId });
333
+ }
334
+ /**
335
+ * Load hooks from an external file.
336
+ *
337
+ * @param path - Path to hooks configuration file (JSON or YAML)
338
+ */
339
+ async loadFromFile(path) {
340
+ this.hooksFilePath = path;
341
+ try {
342
+ const content = await readFile(path, 'utf-8');
343
+ const hooks = this.parseHooksFile(content, path);
344
+ this.registerHooks(hooks);
345
+ this.logger.info('Hooks loaded from file', {
346
+ path,
347
+ hookCount: hooks.length,
348
+ });
349
+ }
350
+ catch (error) {
351
+ const errorObj = error instanceof Error ? error : new Error(String(error));
352
+ this.logger.error('Failed to load hooks from file', {
353
+ path,
354
+ error: errorObj,
355
+ });
356
+ throw error;
357
+ }
358
+ }
359
+ /**
360
+ * Start watching hooks file for changes.
361
+ * Automatically reloads hooks when file changes.
362
+ */
363
+ watchFile() {
364
+ if (!this.hooksFilePath) {
365
+ this.logger.warn('No hooks file path set, cannot watch');
366
+ return;
367
+ }
368
+ // Stop existing watcher
369
+ this.stopWatching();
370
+ try {
371
+ this.fileWatcher = watch(this.hooksFilePath, async (eventType) => {
372
+ if (eventType === 'change') {
373
+ this.logger.info('Hooks file changed, reloading', {
374
+ path: this.hooksFilePath,
375
+ });
376
+ await this.reload();
377
+ }
378
+ });
379
+ this.logger.debug('Watching hooks file', { path: this.hooksFilePath });
380
+ }
381
+ catch (error) {
382
+ const errorMessage = error instanceof Error ? error.message : String(error);
383
+ this.logger.warn('Failed to watch hooks file', {
384
+ path: this.hooksFilePath,
385
+ error: errorMessage,
386
+ });
387
+ }
388
+ }
389
+ /**
390
+ * Stop watching hooks file.
391
+ */
392
+ stopWatching() {
393
+ if (this.fileWatcher) {
394
+ this.fileWatcher.close();
395
+ this.fileWatcher = undefined;
396
+ this.logger.debug('Stopped watching hooks file');
397
+ }
398
+ }
399
+ /**
400
+ * Hot-reload hooks from file.
401
+ */
402
+ async reload() {
403
+ if (!this.hooksFilePath) {
404
+ this.logger.warn('No hooks file path set, cannot reload');
405
+ return;
406
+ }
407
+ try {
408
+ await this.loadFromFile(this.hooksFilePath);
409
+ this.emit('hooks:reload', { count: this.config.hooks.length });
410
+ }
411
+ catch (error) {
412
+ const errorObj = error instanceof Error ? error : new Error(String(error));
413
+ this.logger.error('Failed to reload hooks', { error: errorObj });
414
+ }
415
+ }
416
+ /**
417
+ * Update configuration.
418
+ *
419
+ * @param config - New configuration (partial)
420
+ */
421
+ updateConfig(config) {
422
+ this.config = { ...this.config, ...config };
423
+ if (config.hooks) {
424
+ this.registerHooks(config.hooks);
425
+ }
426
+ this.logger.debug('Configuration updated', {
427
+ enabled: this.config.enabled,
428
+ hookCount: this.config.hooks.length,
429
+ });
430
+ }
431
+ /**
432
+ * Get current configuration.
433
+ */
434
+ getConfig() {
435
+ return { ...this.config };
436
+ }
437
+ /**
438
+ * Shutdown hook manager and cleanup resources.
439
+ */
440
+ shutdown() {
441
+ this.stopWatching();
442
+ this.removeAllListeners();
443
+ this.hooks.clear();
444
+ this.runTracker.clear();
445
+ this.logger.debug('HookManager shutdown');
446
+ }
447
+ // ============================================================================
448
+ // Private Methods
449
+ // ============================================================================
450
+ /**
451
+ * Generate a unique session ID.
452
+ */
453
+ generateSessionId() {
454
+ return `session-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
455
+ }
456
+ /**
457
+ * Parse hooks file content (JSON).
458
+ */
459
+ parseHooksFile(content, path) {
460
+ try {
461
+ const parsed = JSON.parse(content);
462
+ // Support both { hooks: [...] } and [...] formats
463
+ if (Array.isArray(parsed)) {
464
+ return parsed;
465
+ }
466
+ if (parsed.hooks && Array.isArray(parsed.hooks)) {
467
+ return parsed.hooks;
468
+ }
469
+ throw new Error('Invalid hooks file format: expected array or object with hooks array');
470
+ }
471
+ catch (error) {
472
+ const errorMessage = error instanceof Error ? error.message : String(error);
473
+ throw new Error(`Failed to parse hooks file ${path}: ${errorMessage}`);
474
+ }
475
+ }
476
+ /**
477
+ * Match a string against a pattern (supports * wildcard).
478
+ */
479
+ matchesPattern(value, pattern) {
480
+ // Exact match
481
+ if (pattern === value) {
482
+ return true;
483
+ }
484
+ // Wildcard match
485
+ if (pattern.includes('*')) {
486
+ const regex = new RegExp('^' + pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/\\\*/g, '.*') + '$');
487
+ return regex.test(value);
488
+ }
489
+ return false;
490
+ }
491
+ /**
492
+ * Merge two hook outputs, with later values taking precedence.
493
+ */
494
+ mergeOutputs(base, overlay) {
495
+ return {
496
+ // Decision: later hook wins
497
+ decision: overlay.decision ?? base.decision,
498
+ // Context: concatenate
499
+ additionalContext: base.additionalContext && overlay.additionalContext
500
+ ? `${base.additionalContext}\n${overlay.additionalContext}`
501
+ : overlay.additionalContext ?? base.additionalContext,
502
+ // Updated input: merge deeply
503
+ updatedInput: base.updatedInput || overlay.updatedInput
504
+ ? { ...base.updatedInput, ...overlay.updatedInput }
505
+ : undefined,
506
+ // Message: concatenate
507
+ message: base.message && overlay.message
508
+ ? `${base.message}\n${overlay.message}`
509
+ : overlay.message ?? base.message,
510
+ // Abort: true if either says abort
511
+ abort: base.abort || overlay.abort,
512
+ // Keep last exit code
513
+ exitCode: overlay.exitCode ?? base.exitCode,
514
+ // Keep last stdout/stderr
515
+ stdout: overlay.stdout ?? base.stdout,
516
+ stderr: overlay.stderr ?? base.stderr,
517
+ };
518
+ }
519
+ }
520
+ //# sourceMappingURL=hook-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-manager.js","sourceRoot":"","sources":["../../src/hooks/hook-manager.ts"],"names":[],"mappings":"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"}