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,234 @@
1
+ /**
2
+ * V3 Session Management Hooks
3
+ *
4
+ * Provides session-end and session-restore hooks for state persistence.
5
+ * Enables cross-session memory and state recovery.
6
+ *
7
+ * @module v3/shared/hooks/session-hooks
8
+ */
9
+ import { HookContext, HookResult } from './types.js';
10
+ import { HookRegistry } from './registry.js';
11
+ /**
12
+ * Session state to persist
13
+ */
14
+ export interface SessionState {
15
+ /** Session ID */
16
+ sessionId: string;
17
+ /** Session start time */
18
+ startTime: Date;
19
+ /** Session end time */
20
+ endTime?: Date;
21
+ /** Working directory */
22
+ workingDirectory?: string;
23
+ /** Active tasks */
24
+ activeTasks?: Array<{
25
+ id: string;
26
+ description: string;
27
+ status: 'pending' | 'in_progress' | 'completed' | 'failed';
28
+ }>;
29
+ /** Spawned agents */
30
+ spawnedAgents?: Array<{
31
+ id: string;
32
+ type: string;
33
+ status: 'active' | 'idle' | 'terminated';
34
+ }>;
35
+ /** Memory entries */
36
+ memoryEntries?: Array<{
37
+ key: string;
38
+ namespace: string;
39
+ type: string;
40
+ }>;
41
+ /** Git state */
42
+ gitState?: {
43
+ branch: string;
44
+ uncommittedChanges: number;
45
+ lastCommit?: string;
46
+ };
47
+ /** Learning metrics */
48
+ learningMetrics?: {
49
+ patternsLearned: number;
50
+ trajectoryCount: number;
51
+ avgConfidence: number;
52
+ };
53
+ /** Custom metadata */
54
+ metadata?: Record<string, unknown>;
55
+ }
56
+ /**
57
+ * Session-end hook result
58
+ */
59
+ export interface SessionEndHookResult extends HookResult {
60
+ /** Session state that was persisted */
61
+ persistedState?: SessionState;
62
+ /** File path where state was saved */
63
+ statePath?: string;
64
+ /** Duration of the session in ms */
65
+ duration?: number;
66
+ /** Summary of session activity */
67
+ summary?: SessionSummary;
68
+ }
69
+ /**
70
+ * Session-restore hook result
71
+ */
72
+ export interface SessionRestoreHookResult extends HookResult {
73
+ /** Restored session state */
74
+ restoredState?: SessionState;
75
+ /** Number of tasks restored */
76
+ tasksRestored?: number;
77
+ /** Number of agents restored */
78
+ agentsRestored?: number;
79
+ /** Memory entries restored */
80
+ memoryRestored?: number;
81
+ /** Warnings during restoration */
82
+ warnings?: string[];
83
+ }
84
+ /**
85
+ * Session summary
86
+ */
87
+ export interface SessionSummary {
88
+ /** Total tasks executed */
89
+ tasksExecuted: number;
90
+ /** Successful tasks */
91
+ tasksSucceeded: number;
92
+ /** Failed tasks */
93
+ tasksFailed: number;
94
+ /** Commands executed */
95
+ commandsExecuted: number;
96
+ /** Files modified */
97
+ filesModified: number;
98
+ /** Agents spawned */
99
+ agentsSpawned: number;
100
+ /** Duration in ms */
101
+ duration: number;
102
+ }
103
+ /**
104
+ * Session storage interface
105
+ */
106
+ export interface SessionStorage {
107
+ /** Save session state */
108
+ save(sessionId: string, state: SessionState): Promise<void>;
109
+ /** Load session state */
110
+ load(sessionId: string): Promise<SessionState | null>;
111
+ /** List available sessions */
112
+ list(): Promise<Array<{
113
+ id: string;
114
+ startTime: Date;
115
+ summary?: SessionSummary;
116
+ }>>;
117
+ /** Delete session */
118
+ delete(sessionId: string): Promise<boolean>;
119
+ /** Get latest session ID */
120
+ getLatest(): Promise<string | null>;
121
+ }
122
+ /**
123
+ * In-memory session storage (for testing and fallback)
124
+ */
125
+ export declare class InMemorySessionStorage implements SessionStorage {
126
+ private sessions;
127
+ save(sessionId: string, state: SessionState): Promise<void>;
128
+ load(sessionId: string): Promise<SessionState | null>;
129
+ list(): Promise<Array<{
130
+ id: string;
131
+ startTime: Date;
132
+ summary?: SessionSummary;
133
+ }>>;
134
+ delete(sessionId: string): Promise<boolean>;
135
+ getLatest(): Promise<string | null>;
136
+ }
137
+ /**
138
+ * Session activity tracker
139
+ */
140
+ interface SessionActivity {
141
+ tasksExecuted: number;
142
+ tasksSucceeded: number;
143
+ tasksFailed: number;
144
+ commandsExecuted: number;
145
+ filesModified: Set<string>;
146
+ agentsSpawned: Set<string>;
147
+ }
148
+ /**
149
+ * Session Hooks Manager
150
+ *
151
+ * Manages session lifecycle hooks with state persistence.
152
+ */
153
+ export declare class SessionHooksManager {
154
+ private registry;
155
+ private storage;
156
+ private currentSessionId;
157
+ private sessionStartTime;
158
+ private activity;
159
+ constructor(registry: HookRegistry, storage?: SessionStorage);
160
+ /**
161
+ * Register default session hooks
162
+ */
163
+ private registerDefaultHooks;
164
+ /**
165
+ * Handle session start
166
+ */
167
+ handleSessionStart(context: HookContext): Promise<HookResult>;
168
+ /**
169
+ * Handle session end
170
+ */
171
+ handleSessionEnd(context: HookContext): Promise<SessionEndHookResult>;
172
+ /**
173
+ * Handle session resume (restoration)
174
+ */
175
+ handleSessionResume(context: HookContext): Promise<SessionRestoreHookResult>;
176
+ /**
177
+ * Track task execution
178
+ */
179
+ private trackTaskExecution;
180
+ /**
181
+ * Track command execution
182
+ */
183
+ private trackCommandExecution;
184
+ /**
185
+ * Track file modification
186
+ */
187
+ private trackFileModification;
188
+ /**
189
+ * Track agent spawn
190
+ */
191
+ private trackAgentSpawn;
192
+ /**
193
+ * Reset activity tracking
194
+ */
195
+ private resetActivity;
196
+ /**
197
+ * Execute session-end hook manually
198
+ */
199
+ executeSessionEnd(metadata?: Record<string, unknown>): Promise<SessionEndHookResult>;
200
+ /**
201
+ * Execute session-restore hook manually
202
+ */
203
+ executeSessionRestore(sessionId?: string, metadata?: Record<string, unknown>): Promise<SessionRestoreHookResult>;
204
+ /**
205
+ * List available sessions
206
+ */
207
+ listSessions(): Promise<Array<{
208
+ id: string;
209
+ startTime: Date;
210
+ summary?: SessionSummary;
211
+ }>>;
212
+ /**
213
+ * Delete a session
214
+ */
215
+ deleteSession(sessionId: string): Promise<boolean>;
216
+ /**
217
+ * Get current session ID
218
+ */
219
+ getCurrentSessionId(): string | null;
220
+ /**
221
+ * Get current session activity
222
+ */
223
+ getCurrentActivity(): SessionActivity;
224
+ /**
225
+ * Set storage backend
226
+ */
227
+ setStorage(storage: SessionStorage): void;
228
+ }
229
+ /**
230
+ * Create session hooks manager
231
+ */
232
+ export declare function createSessionHooksManager(registry: HookRegistry, storage?: SessionStorage): SessionHooksManager;
233
+ export {};
234
+ //# sourceMappingURL=session-hooks.d.ts.map
@@ -0,0 +1,334 @@
1
+ /**
2
+ * V3 Session Management Hooks
3
+ *
4
+ * Provides session-end and session-restore hooks for state persistence.
5
+ * Enables cross-session memory and state recovery.
6
+ *
7
+ * @module v3/shared/hooks/session-hooks
8
+ */
9
+ import { HookEvent, HookPriority, } from './types.js';
10
+ /**
11
+ * In-memory session storage (for testing and fallback)
12
+ */
13
+ export class InMemorySessionStorage {
14
+ sessions = new Map();
15
+ async save(sessionId, state) {
16
+ this.sessions.set(sessionId, state);
17
+ }
18
+ async load(sessionId) {
19
+ return this.sessions.get(sessionId) || null;
20
+ }
21
+ async list() {
22
+ return Array.from(this.sessions.entries()).map(([id, state]) => ({
23
+ id,
24
+ startTime: state.startTime,
25
+ }));
26
+ }
27
+ async delete(sessionId) {
28
+ return this.sessions.delete(sessionId);
29
+ }
30
+ async getLatest() {
31
+ let latest = null;
32
+ for (const [id, state] of this.sessions) {
33
+ const time = state.startTime.getTime();
34
+ if (!latest || time > latest.time) {
35
+ latest = { id, time };
36
+ }
37
+ }
38
+ return latest?.id || null;
39
+ }
40
+ }
41
+ /**
42
+ * Session Hooks Manager
43
+ *
44
+ * Manages session lifecycle hooks with state persistence.
45
+ */
46
+ export class SessionHooksManager {
47
+ registry;
48
+ storage;
49
+ currentSessionId = null;
50
+ sessionStartTime = null;
51
+ activity = {
52
+ tasksExecuted: 0,
53
+ tasksSucceeded: 0,
54
+ tasksFailed: 0,
55
+ commandsExecuted: 0,
56
+ filesModified: new Set(),
57
+ agentsSpawned: new Set(),
58
+ };
59
+ constructor(registry, storage) {
60
+ this.registry = registry;
61
+ this.storage = storage || new InMemorySessionStorage();
62
+ this.registerDefaultHooks();
63
+ }
64
+ /**
65
+ * Register default session hooks
66
+ */
67
+ registerDefaultHooks() {
68
+ // Session start hook
69
+ this.registry.register(HookEvent.SessionStart, this.handleSessionStart.bind(this), HookPriority.High, { name: 'session-hooks:start' });
70
+ // Session end hook
71
+ this.registry.register(HookEvent.SessionEnd, this.handleSessionEnd.bind(this), HookPriority.High, { name: 'session-hooks:end' });
72
+ // Session resume hook (for restoration)
73
+ this.registry.register(HookEvent.SessionResume, this.handleSessionResume.bind(this), HookPriority.High, { name: 'session-hooks:resume' });
74
+ // Track tasks
75
+ this.registry.register(HookEvent.PostTaskExecute, this.trackTaskExecution.bind(this), HookPriority.Low, { name: 'session-hooks:track-task' });
76
+ // Track commands
77
+ this.registry.register(HookEvent.PostCommand, this.trackCommandExecution.bind(this), HookPriority.Low, { name: 'session-hooks:track-command' });
78
+ // Track file modifications
79
+ this.registry.register(HookEvent.PostEdit, this.trackFileModification.bind(this), HookPriority.Low, { name: 'session-hooks:track-file' });
80
+ // Track agent spawns
81
+ this.registry.register(HookEvent.PostAgentSpawn, this.trackAgentSpawn.bind(this), HookPriority.Low, { name: 'session-hooks:track-agent' });
82
+ }
83
+ /**
84
+ * Handle session start
85
+ */
86
+ async handleSessionStart(context) {
87
+ this.currentSessionId = context.session?.id || `session-${Date.now()}`;
88
+ this.sessionStartTime = new Date();
89
+ this.resetActivity();
90
+ return {
91
+ success: true,
92
+ data: {
93
+ session: {
94
+ id: this.currentSessionId,
95
+ startTime: this.sessionStartTime,
96
+ },
97
+ },
98
+ };
99
+ }
100
+ /**
101
+ * Handle session end
102
+ */
103
+ async handleSessionEnd(context) {
104
+ if (!this.currentSessionId || !this.sessionStartTime) {
105
+ return { success: true }; // No active session to end
106
+ }
107
+ const endTime = new Date();
108
+ const duration = endTime.getTime() - this.sessionStartTime.getTime();
109
+ // Build session summary
110
+ const summary = {
111
+ tasksExecuted: this.activity.tasksExecuted,
112
+ tasksSucceeded: this.activity.tasksSucceeded,
113
+ tasksFailed: this.activity.tasksFailed,
114
+ commandsExecuted: this.activity.commandsExecuted,
115
+ filesModified: this.activity.filesModified.size,
116
+ agentsSpawned: this.activity.agentsSpawned.size,
117
+ duration,
118
+ };
119
+ // Build session state
120
+ const state = {
121
+ sessionId: this.currentSessionId,
122
+ startTime: this.sessionStartTime,
123
+ endTime,
124
+ workingDirectory: context.metadata?.workingDirectory,
125
+ activeTasks: context.metadata?.activeTasks,
126
+ spawnedAgents: context.metadata?.spawnedAgents,
127
+ memoryEntries: context.metadata?.memoryEntries,
128
+ gitState: context.metadata?.gitState,
129
+ learningMetrics: context.metadata?.learningMetrics,
130
+ metadata: {
131
+ summary,
132
+ ...(context.metadata || {}),
133
+ },
134
+ };
135
+ // Persist state
136
+ await this.storage.save(this.currentSessionId, state);
137
+ // Reset session tracking
138
+ const sessionId = this.currentSessionId;
139
+ this.currentSessionId = null;
140
+ this.sessionStartTime = null;
141
+ this.resetActivity();
142
+ return {
143
+ success: true,
144
+ persistedState: state,
145
+ statePath: `sessions/${sessionId}.json`,
146
+ duration,
147
+ summary,
148
+ };
149
+ }
150
+ /**
151
+ * Handle session resume (restoration)
152
+ */
153
+ async handleSessionResume(context) {
154
+ let sessionId = context.session?.id;
155
+ // If 'latest' is requested, get the most recent session
156
+ if (sessionId === 'latest' || !sessionId) {
157
+ sessionId = await this.storage.getLatest() || undefined;
158
+ }
159
+ if (!sessionId) {
160
+ return {
161
+ success: false,
162
+ error: new Error('No session ID provided and no previous sessions found'),
163
+ warnings: ['No sessions available for restoration'],
164
+ };
165
+ }
166
+ // Load session state
167
+ const state = await this.storage.load(sessionId);
168
+ if (!state) {
169
+ return {
170
+ success: false,
171
+ error: new Error(`Session ${sessionId} not found`),
172
+ warnings: [`Session ${sessionId} does not exist or has been deleted`],
173
+ };
174
+ }
175
+ const warnings = [];
176
+ // Validate state age
177
+ const stateAge = Date.now() - state.startTime.getTime();
178
+ const maxAge = 7 * 24 * 60 * 60 * 1000; // 7 days
179
+ if (stateAge > maxAge) {
180
+ warnings.push(`Session is ${Math.floor(stateAge / (24 * 60 * 60 * 1000))} days old, some state may be stale`);
181
+ }
182
+ // Count restorable items
183
+ const tasksRestored = state.activeTasks?.length || 0;
184
+ const agentsRestored = state.spawnedAgents?.length || 0;
185
+ const memoryRestored = state.memoryEntries?.length || 0;
186
+ // Check for incomplete tasks
187
+ const incompleteTasks = state.activeTasks?.filter(t => t.status === 'pending' || t.status === 'in_progress');
188
+ if (incompleteTasks && incompleteTasks.length > 0) {
189
+ warnings.push(`${incompleteTasks.length} tasks were incomplete when session ended`);
190
+ }
191
+ // Update current session tracking
192
+ this.currentSessionId = `session-${Date.now()}-restored`;
193
+ this.sessionStartTime = new Date();
194
+ this.resetActivity();
195
+ return {
196
+ success: true,
197
+ restoredState: state,
198
+ tasksRestored,
199
+ agentsRestored,
200
+ memoryRestored,
201
+ warnings: warnings.length > 0 ? warnings : undefined,
202
+ data: {
203
+ session: {
204
+ id: this.currentSessionId,
205
+ startTime: this.sessionStartTime,
206
+ metadata: {
207
+ restoredFrom: sessionId,
208
+ originalStartTime: state.startTime,
209
+ },
210
+ },
211
+ },
212
+ };
213
+ }
214
+ /**
215
+ * Track task execution
216
+ */
217
+ async trackTaskExecution(context) {
218
+ this.activity.tasksExecuted++;
219
+ if (context.metadata?.success !== false) {
220
+ this.activity.tasksSucceeded++;
221
+ }
222
+ else {
223
+ this.activity.tasksFailed++;
224
+ }
225
+ return { success: true };
226
+ }
227
+ /**
228
+ * Track command execution
229
+ */
230
+ async trackCommandExecution(context) {
231
+ this.activity.commandsExecuted++;
232
+ return { success: true };
233
+ }
234
+ /**
235
+ * Track file modification
236
+ */
237
+ async trackFileModification(context) {
238
+ if (context.file?.path) {
239
+ this.activity.filesModified.add(context.file.path);
240
+ }
241
+ return { success: true };
242
+ }
243
+ /**
244
+ * Track agent spawn
245
+ */
246
+ async trackAgentSpawn(context) {
247
+ if (context.agent?.id) {
248
+ this.activity.agentsSpawned.add(context.agent.id);
249
+ }
250
+ return { success: true };
251
+ }
252
+ /**
253
+ * Reset activity tracking
254
+ */
255
+ resetActivity() {
256
+ this.activity = {
257
+ tasksExecuted: 0,
258
+ tasksSucceeded: 0,
259
+ tasksFailed: 0,
260
+ commandsExecuted: 0,
261
+ filesModified: new Set(),
262
+ agentsSpawned: new Set(),
263
+ };
264
+ }
265
+ /**
266
+ * Execute session-end hook manually
267
+ */
268
+ async executeSessionEnd(metadata) {
269
+ const context = {
270
+ event: HookEvent.SessionEnd,
271
+ timestamp: new Date(),
272
+ session: this.currentSessionId
273
+ ? {
274
+ id: this.currentSessionId,
275
+ startTime: this.sessionStartTime,
276
+ }
277
+ : undefined,
278
+ metadata,
279
+ };
280
+ return this.handleSessionEnd(context);
281
+ }
282
+ /**
283
+ * Execute session-restore hook manually
284
+ */
285
+ async executeSessionRestore(sessionId, metadata) {
286
+ const context = {
287
+ event: HookEvent.SessionResume,
288
+ timestamp: new Date(),
289
+ session: {
290
+ id: sessionId || 'latest',
291
+ startTime: new Date(),
292
+ },
293
+ metadata,
294
+ };
295
+ return this.handleSessionResume(context);
296
+ }
297
+ /**
298
+ * List available sessions
299
+ */
300
+ async listSessions() {
301
+ return this.storage.list();
302
+ }
303
+ /**
304
+ * Delete a session
305
+ */
306
+ async deleteSession(sessionId) {
307
+ return this.storage.delete(sessionId);
308
+ }
309
+ /**
310
+ * Get current session ID
311
+ */
312
+ getCurrentSessionId() {
313
+ return this.currentSessionId;
314
+ }
315
+ /**
316
+ * Get current session activity
317
+ */
318
+ getCurrentActivity() {
319
+ return { ...this.activity };
320
+ }
321
+ /**
322
+ * Set storage backend
323
+ */
324
+ setStorage(storage) {
325
+ this.storage = storage;
326
+ }
327
+ }
328
+ /**
329
+ * Create session hooks manager
330
+ */
331
+ export function createSessionHooksManager(registry, storage) {
332
+ return new SessionHooksManager(registry, storage);
333
+ }
334
+ //# sourceMappingURL=session-hooks.js.map