moflo 4.8.19 → 4.8.20

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 (241) hide show
  1. package/.claude/guidance/shipped/moflo.md +45 -0
  2. package/.claude/helpers/statusline.cjs +1 -1
  3. package/.claude/workflow-state.json +9 -0
  4. package/package.json +2 -2
  5. package/src/@claude-flow/cli/dist/src/init/statusline-generator.js +1 -1
  6. package/src/@claude-flow/cli/dist/src/services/agentic-flow-bridge.js +5 -3
  7. package/src/@claude-flow/cli/package.json +1 -1
  8. package/src/@claude-flow/memory/dist/agent-memory-scope.d.ts +131 -0
  9. package/src/@claude-flow/memory/dist/agent-memory-scope.js +223 -0
  10. package/src/@claude-flow/memory/dist/agent-memory-scope.test.d.ts +8 -0
  11. package/src/@claude-flow/memory/dist/agent-memory-scope.test.js +466 -0
  12. package/src/@claude-flow/memory/dist/agentdb-adapter.d.ts +165 -0
  13. package/src/@claude-flow/memory/dist/agentdb-adapter.js +806 -0
  14. package/src/@claude-flow/memory/dist/agentdb-backend.d.ts +212 -0
  15. package/src/@claude-flow/memory/dist/agentdb-backend.js +842 -0
  16. package/src/@claude-flow/memory/dist/agentdb-backend.test.d.ts +7 -0
  17. package/src/@claude-flow/memory/dist/agentdb-backend.test.js +258 -0
  18. package/src/@claude-flow/memory/dist/application/commands/delete-memory.command.d.ts +65 -0
  19. package/src/@claude-flow/memory/dist/application/commands/delete-memory.command.js +129 -0
  20. package/src/@claude-flow/memory/dist/application/commands/store-memory.command.d.ts +48 -0
  21. package/src/@claude-flow/memory/dist/application/commands/store-memory.command.js +72 -0
  22. package/src/@claude-flow/memory/dist/application/index.d.ts +12 -0
  23. package/src/@claude-flow/memory/dist/application/index.js +15 -0
  24. package/src/@claude-flow/memory/dist/application/queries/search-memory.query.d.ts +72 -0
  25. package/src/@claude-flow/memory/dist/application/queries/search-memory.query.js +143 -0
  26. package/src/@claude-flow/memory/dist/application/services/memory-application-service.d.ts +121 -0
  27. package/src/@claude-flow/memory/dist/application/services/memory-application-service.js +190 -0
  28. package/src/@claude-flow/memory/dist/auto-memory-bridge.d.ts +226 -0
  29. package/src/@claude-flow/memory/dist/auto-memory-bridge.js +709 -0
  30. package/src/@claude-flow/memory/dist/auto-memory-bridge.test.d.ts +8 -0
  31. package/src/@claude-flow/memory/dist/auto-memory-bridge.test.js +757 -0
  32. package/src/@claude-flow/memory/dist/benchmark.test.d.ts +2 -0
  33. package/src/@claude-flow/memory/dist/benchmark.test.js +277 -0
  34. package/src/@claude-flow/memory/dist/cache-manager.d.ts +134 -0
  35. package/src/@claude-flow/memory/dist/cache-manager.js +407 -0
  36. package/src/@claude-flow/memory/dist/controller-registry.d.ts +216 -0
  37. package/src/@claude-flow/memory/dist/controller-registry.js +893 -0
  38. package/src/@claude-flow/memory/dist/controller-registry.test.d.ts +14 -0
  39. package/src/@claude-flow/memory/dist/controller-registry.test.js +593 -0
  40. package/src/@claude-flow/memory/dist/database-provider.d.ts +87 -0
  41. package/src/@claude-flow/memory/dist/database-provider.js +372 -0
  42. package/src/@claude-flow/memory/dist/database-provider.test.d.ts +7 -0
  43. package/src/@claude-flow/memory/dist/database-provider.test.js +287 -0
  44. package/src/@claude-flow/memory/dist/domain/entities/memory-entry.d.ts +143 -0
  45. package/src/@claude-flow/memory/dist/domain/entities/memory-entry.js +226 -0
  46. package/src/@claude-flow/memory/dist/domain/index.d.ts +11 -0
  47. package/src/@claude-flow/memory/dist/domain/index.js +12 -0
  48. package/src/@claude-flow/memory/dist/domain/repositories/memory-repository.interface.d.ts +102 -0
  49. package/src/@claude-flow/memory/dist/domain/repositories/memory-repository.interface.js +11 -0
  50. package/src/@claude-flow/memory/dist/domain/services/memory-domain-service.d.ts +105 -0
  51. package/src/@claude-flow/memory/dist/domain/services/memory-domain-service.js +297 -0
  52. package/src/@claude-flow/memory/dist/hnsw-index.d.ts +111 -0
  53. package/src/@claude-flow/memory/dist/hnsw-index.js +781 -0
  54. package/src/@claude-flow/memory/dist/hnsw-lite.d.ts +23 -0
  55. package/src/@claude-flow/memory/dist/hnsw-lite.js +168 -0
  56. package/src/@claude-flow/memory/dist/index.d.ts +204 -0
  57. package/src/@claude-flow/memory/dist/index.js +358 -0
  58. package/src/@claude-flow/memory/dist/infrastructure/index.d.ts +17 -0
  59. package/src/@claude-flow/memory/dist/infrastructure/index.js +16 -0
  60. package/src/@claude-flow/memory/dist/infrastructure/repositories/hybrid-memory-repository.d.ts +66 -0
  61. package/src/@claude-flow/memory/dist/infrastructure/repositories/hybrid-memory-repository.js +409 -0
  62. package/src/@claude-flow/memory/dist/learning-bridge.d.ts +137 -0
  63. package/src/@claude-flow/memory/dist/learning-bridge.js +335 -0
  64. package/src/@claude-flow/memory/dist/learning-bridge.test.d.ts +8 -0
  65. package/src/@claude-flow/memory/dist/learning-bridge.test.js +578 -0
  66. package/src/@claude-flow/memory/dist/memory-graph.d.ts +100 -0
  67. package/src/@claude-flow/memory/dist/memory-graph.js +333 -0
  68. package/src/@claude-flow/memory/dist/memory-graph.test.d.ts +8 -0
  69. package/src/@claude-flow/memory/dist/memory-graph.test.js +609 -0
  70. package/src/@claude-flow/memory/dist/migration.d.ts +68 -0
  71. package/src/@claude-flow/memory/dist/migration.js +513 -0
  72. package/src/@claude-flow/memory/dist/persistent-sona.d.ts +144 -0
  73. package/src/@claude-flow/memory/dist/persistent-sona.js +332 -0
  74. package/src/@claude-flow/memory/dist/query-builder.d.ts +211 -0
  75. package/src/@claude-flow/memory/dist/query-builder.js +438 -0
  76. package/src/@claude-flow/memory/dist/rvf-backend.d.ts +51 -0
  77. package/src/@claude-flow/memory/dist/rvf-backend.js +481 -0
  78. package/src/@claude-flow/memory/dist/rvf-learning-store.d.ts +139 -0
  79. package/src/@claude-flow/memory/dist/rvf-learning-store.js +295 -0
  80. package/src/@claude-flow/memory/dist/rvf-migration.d.ts +45 -0
  81. package/src/@claude-flow/memory/dist/rvf-migration.js +234 -0
  82. package/src/@claude-flow/memory/dist/sqljs-backend.d.ts +127 -0
  83. package/src/@claude-flow/memory/dist/sqljs-backend.js +600 -0
  84. package/src/@claude-flow/memory/dist/types.d.ts +484 -0
  85. package/src/@claude-flow/memory/dist/types.js +58 -0
  86. package/src/@claude-flow/shared/dist/core/config/defaults.d.ts +41 -0
  87. package/src/@claude-flow/shared/dist/core/config/defaults.js +186 -0
  88. package/src/@claude-flow/shared/dist/core/config/index.d.ts +8 -0
  89. package/src/@claude-flow/shared/dist/core/config/index.js +12 -0
  90. package/src/@claude-flow/shared/dist/core/config/loader.d.ts +45 -0
  91. package/src/@claude-flow/shared/dist/core/config/loader.js +222 -0
  92. package/src/@claude-flow/shared/dist/core/config/schema.d.ts +1134 -0
  93. package/src/@claude-flow/shared/dist/core/config/schema.js +158 -0
  94. package/src/@claude-flow/shared/dist/core/config/validator.d.ts +92 -0
  95. package/src/@claude-flow/shared/dist/core/config/validator.js +147 -0
  96. package/src/@claude-flow/shared/dist/core/event-bus.d.ts +31 -0
  97. package/src/@claude-flow/shared/dist/core/event-bus.js +197 -0
  98. package/src/@claude-flow/shared/dist/core/index.d.ts +15 -0
  99. package/src/@claude-flow/shared/dist/core/index.js +19 -0
  100. package/src/@claude-flow/shared/dist/core/interfaces/agent.interface.d.ts +200 -0
  101. package/src/@claude-flow/shared/dist/core/interfaces/agent.interface.js +6 -0
  102. package/src/@claude-flow/shared/dist/core/interfaces/coordinator.interface.d.ts +310 -0
  103. package/src/@claude-flow/shared/dist/core/interfaces/coordinator.interface.js +7 -0
  104. package/src/@claude-flow/shared/dist/core/interfaces/event.interface.d.ts +224 -0
  105. package/src/@claude-flow/shared/dist/core/interfaces/event.interface.js +46 -0
  106. package/src/@claude-flow/shared/dist/core/interfaces/index.d.ts +10 -0
  107. package/src/@claude-flow/shared/dist/core/interfaces/index.js +15 -0
  108. package/src/@claude-flow/shared/dist/core/interfaces/memory.interface.d.ts +298 -0
  109. package/src/@claude-flow/shared/dist/core/interfaces/memory.interface.js +7 -0
  110. package/src/@claude-flow/shared/dist/core/interfaces/task.interface.d.ts +185 -0
  111. package/src/@claude-flow/shared/dist/core/interfaces/task.interface.js +6 -0
  112. package/src/@claude-flow/shared/dist/core/orchestrator/event-coordinator.d.ts +35 -0
  113. package/src/@claude-flow/shared/dist/core/orchestrator/event-coordinator.js +101 -0
  114. package/src/@claude-flow/shared/dist/core/orchestrator/health-monitor.d.ts +60 -0
  115. package/src/@claude-flow/shared/dist/core/orchestrator/health-monitor.js +166 -0
  116. package/src/@claude-flow/shared/dist/core/orchestrator/index.d.ts +46 -0
  117. package/src/@claude-flow/shared/dist/core/orchestrator/index.js +64 -0
  118. package/src/@claude-flow/shared/dist/core/orchestrator/lifecycle-manager.d.ts +56 -0
  119. package/src/@claude-flow/shared/dist/core/orchestrator/lifecycle-manager.js +195 -0
  120. package/src/@claude-flow/shared/dist/core/orchestrator/session-manager.d.ts +83 -0
  121. package/src/@claude-flow/shared/dist/core/orchestrator/session-manager.js +193 -0
  122. package/src/@claude-flow/shared/dist/core/orchestrator/task-manager.d.ts +49 -0
  123. package/src/@claude-flow/shared/dist/core/orchestrator/task-manager.js +253 -0
  124. package/src/@claude-flow/shared/dist/events/domain-events.d.ts +282 -0
  125. package/src/@claude-flow/shared/dist/events/domain-events.js +165 -0
  126. package/src/@claude-flow/shared/dist/events/event-store.d.ts +126 -0
  127. package/src/@claude-flow/shared/dist/events/event-store.js +432 -0
  128. package/src/@claude-flow/shared/dist/events/event-store.test.d.ts +8 -0
  129. package/src/@claude-flow/shared/dist/events/event-store.test.js +297 -0
  130. package/src/@claude-flow/shared/dist/events/example-usage.d.ts +10 -0
  131. package/src/@claude-flow/shared/dist/events/example-usage.js +193 -0
  132. package/src/@claude-flow/shared/dist/events/index.d.ts +21 -0
  133. package/src/@claude-flow/shared/dist/events/index.js +22 -0
  134. package/src/@claude-flow/shared/dist/events/projections.d.ts +177 -0
  135. package/src/@claude-flow/shared/dist/events/projections.js +421 -0
  136. package/src/@claude-flow/shared/dist/events/rvf-event-log.d.ts +82 -0
  137. package/src/@claude-flow/shared/dist/events/rvf-event-log.js +340 -0
  138. package/src/@claude-flow/shared/dist/events/state-reconstructor.d.ts +101 -0
  139. package/src/@claude-flow/shared/dist/events/state-reconstructor.js +263 -0
  140. package/src/@claude-flow/shared/dist/events.d.ts +80 -0
  141. package/src/@claude-flow/shared/dist/events.js +249 -0
  142. package/src/@claude-flow/shared/dist/hooks/example-usage.d.ts +42 -0
  143. package/src/@claude-flow/shared/dist/hooks/example-usage.js +351 -0
  144. package/src/@claude-flow/shared/dist/hooks/executor.d.ts +100 -0
  145. package/src/@claude-flow/shared/dist/hooks/executor.js +267 -0
  146. package/src/@claude-flow/shared/dist/hooks/hooks.test.d.ts +9 -0
  147. package/src/@claude-flow/shared/dist/hooks/hooks.test.js +322 -0
  148. package/src/@claude-flow/shared/dist/hooks/index.d.ts +52 -0
  149. package/src/@claude-flow/shared/dist/hooks/index.js +51 -0
  150. package/src/@claude-flow/shared/dist/hooks/registry.d.ts +133 -0
  151. package/src/@claude-flow/shared/dist/hooks/registry.js +277 -0
  152. package/src/@claude-flow/shared/dist/hooks/safety/bash-safety.d.ts +105 -0
  153. package/src/@claude-flow/shared/dist/hooks/safety/bash-safety.js +481 -0
  154. package/src/@claude-flow/shared/dist/hooks/safety/file-organization.d.ts +144 -0
  155. package/src/@claude-flow/shared/dist/hooks/safety/file-organization.js +328 -0
  156. package/src/@claude-flow/shared/dist/hooks/safety/git-commit.d.ts +158 -0
  157. package/src/@claude-flow/shared/dist/hooks/safety/git-commit.js +450 -0
  158. package/src/@claude-flow/shared/dist/hooks/safety/index.d.ts +17 -0
  159. package/src/@claude-flow/shared/dist/hooks/safety/index.js +17 -0
  160. package/src/@claude-flow/shared/dist/hooks/session-hooks.d.ts +234 -0
  161. package/src/@claude-flow/shared/dist/hooks/session-hooks.js +334 -0
  162. package/src/@claude-flow/shared/dist/hooks/task-hooks.d.ts +163 -0
  163. package/src/@claude-flow/shared/dist/hooks/task-hooks.js +326 -0
  164. package/src/@claude-flow/shared/dist/hooks/types.d.ts +267 -0
  165. package/src/@claude-flow/shared/dist/hooks/types.js +62 -0
  166. package/src/@claude-flow/shared/dist/hooks/verify-exports.test.d.ts +9 -0
  167. package/src/@claude-flow/shared/dist/hooks/verify-exports.test.js +93 -0
  168. package/src/@claude-flow/shared/dist/index.d.ts +20 -0
  169. package/src/@claude-flow/shared/dist/index.js +50 -0
  170. package/src/@claude-flow/shared/dist/mcp/connection-pool.d.ts +98 -0
  171. package/src/@claude-flow/shared/dist/mcp/connection-pool.js +364 -0
  172. package/src/@claude-flow/shared/dist/mcp/index.d.ts +69 -0
  173. package/src/@claude-flow/shared/dist/mcp/index.js +84 -0
  174. package/src/@claude-flow/shared/dist/mcp/server.d.ts +166 -0
  175. package/src/@claude-flow/shared/dist/mcp/server.js +593 -0
  176. package/src/@claude-flow/shared/dist/mcp/session-manager.d.ts +136 -0
  177. package/src/@claude-flow/shared/dist/mcp/session-manager.js +335 -0
  178. package/src/@claude-flow/shared/dist/mcp/tool-registry.d.ts +178 -0
  179. package/src/@claude-flow/shared/dist/mcp/tool-registry.js +439 -0
  180. package/src/@claude-flow/shared/dist/mcp/transport/http.d.ts +104 -0
  181. package/src/@claude-flow/shared/dist/mcp/transport/http.js +476 -0
  182. package/src/@claude-flow/shared/dist/mcp/transport/index.d.ts +102 -0
  183. package/src/@claude-flow/shared/dist/mcp/transport/index.js +238 -0
  184. package/src/@claude-flow/shared/dist/mcp/transport/stdio.d.ts +104 -0
  185. package/src/@claude-flow/shared/dist/mcp/transport/stdio.js +263 -0
  186. package/src/@claude-flow/shared/dist/mcp/transport/websocket.d.ts +133 -0
  187. package/src/@claude-flow/shared/dist/mcp/transport/websocket.js +396 -0
  188. package/src/@claude-flow/shared/dist/mcp/types.d.ts +438 -0
  189. package/src/@claude-flow/shared/dist/mcp/types.js +54 -0
  190. package/src/@claude-flow/shared/dist/plugin-interface.d.ts +544 -0
  191. package/src/@claude-flow/shared/dist/plugin-interface.js +23 -0
  192. package/src/@claude-flow/shared/dist/plugin-loader.d.ts +139 -0
  193. package/src/@claude-flow/shared/dist/plugin-loader.js +434 -0
  194. package/src/@claude-flow/shared/dist/plugin-registry.d.ts +183 -0
  195. package/src/@claude-flow/shared/dist/plugin-registry.js +457 -0
  196. package/src/@claude-flow/shared/dist/plugins/index.d.ts +10 -0
  197. package/src/@claude-flow/shared/dist/plugins/index.js +10 -0
  198. package/src/@claude-flow/shared/dist/plugins/official/hive-mind-plugin.d.ts +106 -0
  199. package/src/@claude-flow/shared/dist/plugins/official/hive-mind-plugin.js +241 -0
  200. package/src/@claude-flow/shared/dist/plugins/official/index.d.ts +10 -0
  201. package/src/@claude-flow/shared/dist/plugins/official/index.js +10 -0
  202. package/src/@claude-flow/shared/dist/plugins/official/maestro-plugin.d.ts +121 -0
  203. package/src/@claude-flow/shared/dist/plugins/official/maestro-plugin.js +355 -0
  204. package/src/@claude-flow/shared/dist/plugins/types.d.ts +93 -0
  205. package/src/@claude-flow/shared/dist/plugins/types.js +9 -0
  206. package/src/@claude-flow/shared/dist/resilience/bulkhead.d.ts +105 -0
  207. package/src/@claude-flow/shared/dist/resilience/bulkhead.js +206 -0
  208. package/src/@claude-flow/shared/dist/resilience/circuit-breaker.d.ts +132 -0
  209. package/src/@claude-flow/shared/dist/resilience/circuit-breaker.js +233 -0
  210. package/src/@claude-flow/shared/dist/resilience/index.d.ts +19 -0
  211. package/src/@claude-flow/shared/dist/resilience/index.js +19 -0
  212. package/src/@claude-flow/shared/dist/resilience/rate-limiter.d.ts +168 -0
  213. package/src/@claude-flow/shared/dist/resilience/rate-limiter.js +314 -0
  214. package/src/@claude-flow/shared/dist/resilience/retry.d.ts +91 -0
  215. package/src/@claude-flow/shared/dist/resilience/retry.js +159 -0
  216. package/src/@claude-flow/shared/dist/security/index.d.ts +10 -0
  217. package/src/@claude-flow/shared/dist/security/index.js +12 -0
  218. package/src/@claude-flow/shared/dist/security/input-validation.d.ts +73 -0
  219. package/src/@claude-flow/shared/dist/security/input-validation.js +201 -0
  220. package/src/@claude-flow/shared/dist/security/secure-random.d.ts +92 -0
  221. package/src/@claude-flow/shared/dist/security/secure-random.js +142 -0
  222. package/src/@claude-flow/shared/dist/services/index.d.ts +7 -0
  223. package/src/@claude-flow/shared/dist/services/index.js +7 -0
  224. package/src/@claude-flow/shared/dist/services/v3-progress.service.d.ts +124 -0
  225. package/src/@claude-flow/shared/dist/services/v3-progress.service.js +402 -0
  226. package/src/@claude-flow/shared/dist/types/agent.types.d.ts +137 -0
  227. package/src/@claude-flow/shared/dist/types/agent.types.js +6 -0
  228. package/src/@claude-flow/shared/dist/types/index.d.ts +11 -0
  229. package/src/@claude-flow/shared/dist/types/index.js +17 -0
  230. package/src/@claude-flow/shared/dist/types/mcp.types.d.ts +266 -0
  231. package/src/@claude-flow/shared/dist/types/mcp.types.js +7 -0
  232. package/src/@claude-flow/shared/dist/types/memory.types.d.ts +236 -0
  233. package/src/@claude-flow/shared/dist/types/memory.types.js +7 -0
  234. package/src/@claude-flow/shared/dist/types/swarm.types.d.ts +186 -0
  235. package/src/@claude-flow/shared/dist/types/swarm.types.js +65 -0
  236. package/src/@claude-flow/shared/dist/types/task.types.d.ts +178 -0
  237. package/src/@claude-flow/shared/dist/types/task.types.js +32 -0
  238. package/src/@claude-flow/shared/dist/types.d.ts +197 -0
  239. package/src/@claude-flow/shared/dist/types.js +21 -0
  240. package/src/@claude-flow/shared/dist/utils/secure-logger.d.ts +69 -0
  241. package/src/@claude-flow/shared/dist/utils/secure-logger.js +208 -0
@@ -0,0 +1,351 @@
1
+ /**
2
+ * V3 Hooks System - Example Usage
3
+ *
4
+ * Demonstrates practical use cases for the hooks system.
5
+ *
6
+ * @module v3/shared/hooks/example-usage
7
+ */
8
+ import { createHookRegistry } from './registry.js';
9
+ import { createHookExecutor } from './executor.js';
10
+ import { HookEvent, HookPriority } from './types.js';
11
+ import { createEventBus } from '../core/event-bus.js';
12
+ // =============================================================================
13
+ // Example 1: Security Hooks - Prevent Dangerous Commands
14
+ // =============================================================================
15
+ export function setupSecurityHooks() {
16
+ const registry = createHookRegistry();
17
+ const eventBus = createEventBus();
18
+ const executor = createHookExecutor(registry, eventBus);
19
+ // Block dangerous commands
20
+ registry.register(HookEvent.PreCommand, async (context) => {
21
+ const dangerousPatterns = [
22
+ /rm\s+-rf\s+\//,
23
+ /format\s+c:/i,
24
+ /del\s+\/f\s+\/s\s+\/q/i,
25
+ /dd\s+if=/,
26
+ ];
27
+ const command = context.command?.command || '';
28
+ for (const pattern of dangerousPatterns) {
29
+ if (pattern.test(command)) {
30
+ return {
31
+ success: false,
32
+ abort: true,
33
+ error: new Error(`🛡️ Dangerous command blocked: ${command}`),
34
+ };
35
+ }
36
+ }
37
+ return { success: true };
38
+ }, HookPriority.Critical, {
39
+ name: 'Security: Block Dangerous Commands',
40
+ metadata: { category: 'security' },
41
+ });
42
+ // Log security-sensitive commands
43
+ registry.register(HookEvent.PostCommand, async (context) => {
44
+ const sensitiveKeywords = ['password', 'secret', 'key', 'token', 'auth'];
45
+ const command = context.command?.command.toLowerCase() || '';
46
+ if (sensitiveKeywords.some(keyword => command.includes(keyword))) {
47
+ console.warn('⚠️ Security-sensitive command executed:', command);
48
+ }
49
+ return { success: true };
50
+ }, HookPriority.Normal, {
51
+ name: 'Security: Audit Sensitive Commands',
52
+ });
53
+ return { registry, executor };
54
+ }
55
+ // =============================================================================
56
+ // Example 2: Learning Hooks - ReasoningBank Integration
57
+ // =============================================================================
58
+ export function setupLearningHooks() {
59
+ const registry = createHookRegistry();
60
+ const eventBus = createEventBus();
61
+ const executor = createHookExecutor(registry, eventBus);
62
+ // Pre-edit: Retrieve similar past edits
63
+ registry.register(HookEvent.PreEdit, async (context) => {
64
+ const filePath = context.file?.path;
65
+ if (!filePath) {
66
+ return { success: true };
67
+ }
68
+ console.log(`📚 Searching for similar edits to ${filePath}...`);
69
+ // Example ReasoningBank search results (replace with actual agentic-flow call)
70
+ const similarEdits = [
71
+ { task: `Edit ${filePath}`, reward: 0.92, critique: 'Good test coverage' },
72
+ { task: `Edit ${filePath}`, reward: 0.88, critique: 'Could improve error handling' },
73
+ ];
74
+ return {
75
+ success: true,
76
+ data: {
77
+ metadata: {
78
+ ...context.metadata,
79
+ learningContext: similarEdits,
80
+ },
81
+ },
82
+ };
83
+ }, HookPriority.High, {
84
+ name: 'Learning: Pre-Edit Context Retrieval',
85
+ timeout: 2000,
86
+ });
87
+ // Post-edit: Store edit pattern
88
+ registry.register(HookEvent.PostEdit, async (context) => {
89
+ const success = context.metadata?.editSuccess ?? true;
90
+ const filePath = context.file?.path;
91
+ if (!filePath) {
92
+ return { success: true };
93
+ }
94
+ console.log(`💾 Storing edit pattern for ${filePath} (success: ${success})`);
95
+ // Example ReasoningBank storage (replace with actual agentic-flow call)
96
+ const pattern = {
97
+ task: `Edit ${filePath}`,
98
+ reward: success ? 0.9 : 0.3,
99
+ success,
100
+ };
101
+ console.log('Pattern stored:', pattern);
102
+ return { success: true };
103
+ }, HookPriority.Normal, {
104
+ name: 'Learning: Post-Edit Pattern Storage',
105
+ });
106
+ return { registry, executor };
107
+ }
108
+ // =============================================================================
109
+ // Example 3: Performance Monitoring Hooks
110
+ // =============================================================================
111
+ export function setupPerformanceHooks() {
112
+ const registry = createHookRegistry();
113
+ const eventBus = createEventBus();
114
+ const executor = createHookExecutor(registry, eventBus);
115
+ const performanceMetrics = new Map();
116
+ // Start performance tracking
117
+ registry.register(HookEvent.PreToolUse, async (context) => {
118
+ const toolName = context.tool?.name;
119
+ if (!toolName) {
120
+ return { success: true };
121
+ }
122
+ const metricId = `tool-${toolName}-${Date.now()}`;
123
+ performanceMetrics.set(metricId, { start: Date.now() });
124
+ return {
125
+ success: true,
126
+ data: {
127
+ metadata: {
128
+ ...context.metadata,
129
+ performanceMetricId: metricId,
130
+ },
131
+ },
132
+ };
133
+ }, HookPriority.High, {
134
+ name: 'Performance: Start Tool Tracking',
135
+ });
136
+ // End performance tracking
137
+ registry.register(HookEvent.PostToolUse, async (context) => {
138
+ const metricId = context.metadata?.performanceMetricId;
139
+ if (!metricId) {
140
+ return { success: true };
141
+ }
142
+ const metric = performanceMetrics.get(metricId);
143
+ if (metric) {
144
+ metric.end = Date.now();
145
+ const duration = metric.end - metric.start;
146
+ console.log(`⏱️ Tool ${context.tool?.name} took ${duration}ms`);
147
+ if (duration > 5000) {
148
+ console.warn(`⚠️ Slow tool execution detected: ${duration}ms`);
149
+ }
150
+ }
151
+ return { success: true };
152
+ }, HookPriority.Normal, {
153
+ name: 'Performance: End Tool Tracking',
154
+ });
155
+ return { registry, executor, performanceMetrics };
156
+ }
157
+ // =============================================================================
158
+ // Example 4: File Validation Hooks
159
+ // =============================================================================
160
+ export function setupFileValidationHooks() {
161
+ const registry = createHookRegistry();
162
+ const eventBus = createEventBus();
163
+ const executor = createHookExecutor(registry, eventBus);
164
+ // Validate file paths
165
+ registry.register(HookEvent.PreWrite, async (context) => {
166
+ const filePath = context.file?.path;
167
+ if (!filePath) {
168
+ return { success: true };
169
+ }
170
+ // Check for dangerous paths
171
+ const dangerousPaths = ['../', '/etc/', '/sys/', 'C:\\Windows'];
172
+ if (dangerousPaths.some(path => filePath.includes(path))) {
173
+ return {
174
+ success: false,
175
+ abort: true,
176
+ error: new Error(`🛡️ Dangerous file path blocked: ${filePath}`),
177
+ };
178
+ }
179
+ // Check for sensitive files
180
+ const sensitivePatterns = ['.env', 'credentials', 'secrets', '.pem', '.key'];
181
+ if (sensitivePatterns.some(pattern => filePath.includes(pattern))) {
182
+ console.warn(`⚠️ Writing to sensitive file: ${filePath}`);
183
+ }
184
+ return { success: true };
185
+ }, HookPriority.Critical, {
186
+ name: 'File: Validate Write Path',
187
+ });
188
+ // Check file size limits
189
+ registry.register(HookEvent.PreWrite, async (context) => {
190
+ const content = context.file?.content;
191
+ if (!content) {
192
+ return { success: true };
193
+ }
194
+ const maxSize = 10 * 1024 * 1024; // 10MB
195
+ const size = Buffer.byteLength(content, 'utf8');
196
+ if (size > maxSize) {
197
+ return {
198
+ success: false,
199
+ abort: true,
200
+ error: new Error(`File too large: ${size} bytes (max: ${maxSize})`),
201
+ };
202
+ }
203
+ return { success: true };
204
+ }, HookPriority.High, {
205
+ name: 'File: Check Size Limit',
206
+ });
207
+ return { registry, executor };
208
+ }
209
+ // =============================================================================
210
+ // Example 5: Session Management Hooks
211
+ // =============================================================================
212
+ export function setupSessionHooks() {
213
+ const registry = createHookRegistry();
214
+ const eventBus = createEventBus();
215
+ const executor = createHookExecutor(registry, eventBus);
216
+ let activeSession = null;
217
+ // Initialize session
218
+ registry.register(HookEvent.SessionStart, async (context) => {
219
+ const sessionId = context.session?.id || `session-${Date.now()}`;
220
+ activeSession = {
221
+ id: sessionId,
222
+ startTime: new Date(),
223
+ };
224
+ console.log(`🚀 Session started: ${sessionId}`);
225
+ return {
226
+ success: true,
227
+ data: {
228
+ session: {
229
+ id: sessionId,
230
+ startTime: activeSession.startTime,
231
+ },
232
+ },
233
+ };
234
+ }, HookPriority.Critical, {
235
+ name: 'Session: Initialize',
236
+ });
237
+ // Cleanup session
238
+ registry.register(HookEvent.SessionEnd, async (context) => {
239
+ if (activeSession) {
240
+ const duration = Date.now() - activeSession.startTime.getTime();
241
+ console.log(`👋 Session ended: ${activeSession.id} (duration: ${duration}ms)`);
242
+ activeSession = null;
243
+ }
244
+ return { success: true };
245
+ }, HookPriority.Critical, {
246
+ name: 'Session: Cleanup',
247
+ });
248
+ return { registry, executor };
249
+ }
250
+ // =============================================================================
251
+ // Example 6: Error Handling Hooks
252
+ // =============================================================================
253
+ export function setupErrorHooks() {
254
+ const registry = createHookRegistry();
255
+ const eventBus = createEventBus();
256
+ const executor = createHookExecutor(registry, eventBus);
257
+ const errorLog = [];
258
+ // Log all errors
259
+ registry.register(HookEvent.OnError, async (context) => {
260
+ const error = context.error?.error;
261
+ if (!error) {
262
+ return { success: true };
263
+ }
264
+ errorLog.push({
265
+ timestamp: new Date(),
266
+ error,
267
+ context: context.error?.context,
268
+ });
269
+ console.error(`❌ Error occurred:`, error.message);
270
+ return { success: true };
271
+ }, HookPriority.High, {
272
+ name: 'Error: Log Errors',
273
+ });
274
+ // Attempt recovery for recoverable errors
275
+ registry.register(HookEvent.OnError, async (context) => {
276
+ const recoverable = context.error?.recoverable ?? false;
277
+ if (recoverable) {
278
+ console.log(`🔄 Attempting error recovery...`);
279
+ // Implement recovery logic here
280
+ }
281
+ return { success: true };
282
+ }, HookPriority.Normal, {
283
+ name: 'Error: Attempt Recovery',
284
+ });
285
+ return { registry, executor, errorLog };
286
+ }
287
+ // =============================================================================
288
+ // Demo: Run All Examples
289
+ // =============================================================================
290
+ export async function runDemo() {
291
+ console.log('='.repeat(60));
292
+ console.log('V3 Hooks System - Demo');
293
+ console.log('='.repeat(60));
294
+ // Example 1: Security Hooks
295
+ console.log('\n📋 Example 1: Security Hooks');
296
+ const { executor: securityExecutor } = setupSecurityHooks();
297
+ const dangerousCommand = {
298
+ event: HookEvent.PreCommand,
299
+ timestamp: new Date(),
300
+ command: {
301
+ command: 'rm -rf /',
302
+ isDestructive: true,
303
+ },
304
+ };
305
+ const securityResult = await securityExecutor.execute(HookEvent.PreCommand, dangerousCommand);
306
+ console.log(`Security result: ${securityResult.success ? '✅ Passed' : '❌ Blocked'}`);
307
+ // Example 2: Learning Hooks
308
+ console.log('\n📋 Example 2: Learning Hooks');
309
+ const { executor: learningExecutor } = setupLearningHooks();
310
+ const editContext = {
311
+ event: HookEvent.PreEdit,
312
+ timestamp: new Date(),
313
+ file: {
314
+ path: '/workspaces/project/src/app.ts',
315
+ operation: 'edit',
316
+ },
317
+ };
318
+ await learningExecutor.execute(HookEvent.PreEdit, editContext);
319
+ // Example 3: Performance Monitoring
320
+ console.log('\n📋 Example 3: Performance Monitoring');
321
+ const { executor: perfExecutor } = setupPerformanceHooks();
322
+ const toolContext = {
323
+ event: HookEvent.PreToolUse,
324
+ timestamp: new Date(),
325
+ tool: {
326
+ name: 'Read',
327
+ parameters: { path: 'file.ts' },
328
+ category: 'file',
329
+ },
330
+ };
331
+ const preToolResult = await perfExecutor.execute(HookEvent.PreToolUse, toolContext);
332
+ // Brief delay representing tool execution time
333
+ await new Promise(resolve => setTimeout(resolve, 100));
334
+ await perfExecutor.execute(HookEvent.PostToolUse, {
335
+ ...toolContext,
336
+ event: HookEvent.PostToolUse,
337
+ metadata: preToolResult.finalContext?.metadata,
338
+ });
339
+ // Get statistics
340
+ console.log('\n📊 Hook Statistics');
341
+ const stats = perfExecutor.getRegistry().getStats();
342
+ console.log(`Total hooks: ${stats.totalHooks}`);
343
+ console.log(`Total executions: ${stats.totalExecutions}`);
344
+ console.log(`Average execution time: ${stats.avgExecutionTime.toFixed(2)}ms`);
345
+ console.log('\n' + '='.repeat(60));
346
+ }
347
+ // Run demo if executed directly
348
+ if (import.meta.url === `file://${process.argv[1]}`) {
349
+ runDemo().catch(console.error);
350
+ }
351
+ //# sourceMappingURL=example-usage.js.map
@@ -0,0 +1,100 @@
1
+ /**
2
+ * V3 Hooks System - Hook Executor
3
+ *
4
+ * Executes hooks in priority order with timeout handling and error recovery.
5
+ * Integrates with event bus for coordination and monitoring.
6
+ *
7
+ * @module v3/shared/hooks/executor
8
+ */
9
+ import type { IEventBus } from '../core/interfaces/event.interface.js';
10
+ import { HookRegistry } from './registry.js';
11
+ import { HookEvent, HookContext, HookResult, HookExecutionOptions } from './types.js';
12
+ /**
13
+ * Hook execution result aggregation
14
+ */
15
+ export interface AggregatedHookResult {
16
+ /** Whether all hooks succeeded */
17
+ success: boolean;
18
+ /** Individual hook results */
19
+ results: HookResult[];
20
+ /** Total execution time in ms */
21
+ totalExecutionTime: number;
22
+ /** Number of hooks executed */
23
+ hooksExecuted: number;
24
+ /** Number of hooks failed */
25
+ hooksFailed: number;
26
+ /** Whether operation was aborted */
27
+ aborted: boolean;
28
+ /** Final merged context (from all hooks) */
29
+ finalContext?: Partial<HookContext>;
30
+ }
31
+ /**
32
+ * Hook executor implementation
33
+ */
34
+ export declare class HookExecutor {
35
+ private registry;
36
+ private eventBus?;
37
+ constructor(registry: HookRegistry, eventBus?: IEventBus);
38
+ /**
39
+ * Execute all hooks for an event
40
+ *
41
+ * @param event - Hook event type
42
+ * @param context - Hook context
43
+ * @param options - Execution options
44
+ * @returns Aggregated results
45
+ */
46
+ execute(event: HookEvent, context: HookContext, options?: HookExecutionOptions): Promise<AggregatedHookResult>;
47
+ /**
48
+ * Execute hooks with timeout
49
+ *
50
+ * @param event - Hook event type
51
+ * @param context - Hook context
52
+ * @param timeout - Timeout in ms
53
+ * @returns Aggregated results
54
+ */
55
+ executeWithTimeout(event: HookEvent, context: HookContext, timeout: number): Promise<AggregatedHookResult>;
56
+ /**
57
+ * Execute a single hook with timeout and error handling
58
+ *
59
+ * @param handler - Hook handler function
60
+ * @param context - Hook context
61
+ * @param timeout - Optional timeout in ms
62
+ * @returns Hook result
63
+ */
64
+ private executeSingleHook;
65
+ /**
66
+ * Execute multiple hooks in parallel
67
+ *
68
+ * @param events - Array of hook events
69
+ * @param contexts - Array of contexts (matched by index)
70
+ * @param options - Execution options
71
+ * @returns Array of aggregated results
72
+ */
73
+ executeParallel(events: HookEvent[], contexts: HookContext[], options?: HookExecutionOptions): Promise<AggregatedHookResult[]>;
74
+ /**
75
+ * Execute hooks sequentially with context chaining
76
+ *
77
+ * @param events - Array of hook events
78
+ * @param initialContext - Initial context
79
+ * @param options - Execution options
80
+ * @returns Final aggregated result with chained context
81
+ */
82
+ executeSequential(events: HookEvent[], initialContext: HookContext, options?: HookExecutionOptions): Promise<AggregatedHookResult>;
83
+ /**
84
+ * Wrap a promise with timeout
85
+ */
86
+ private withTimeout;
87
+ /**
88
+ * Set event bus for coordination
89
+ */
90
+ setEventBus(eventBus: IEventBus): void;
91
+ /**
92
+ * Get hook registry
93
+ */
94
+ getRegistry(): HookRegistry;
95
+ }
96
+ /**
97
+ * Create a new hook executor
98
+ */
99
+ export declare function createHookExecutor(registry: HookRegistry, eventBus?: IEventBus): HookExecutor;
100
+ //# sourceMappingURL=executor.d.ts.map