@sparkleideas/shared 3.0.0-alpha.7

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 (96) hide show
  1. package/README.md +323 -0
  2. package/__tests__/hooks/bash-safety.test.ts +289 -0
  3. package/__tests__/hooks/file-organization.test.ts +335 -0
  4. package/__tests__/hooks/git-commit.test.ts +336 -0
  5. package/__tests__/hooks/index.ts +23 -0
  6. package/__tests__/hooks/session-hooks.test.ts +357 -0
  7. package/__tests__/hooks/task-hooks.test.ts +193 -0
  8. package/docs/EVENTS_IMPLEMENTATION_SUMMARY.md +388 -0
  9. package/docs/EVENTS_QUICK_REFERENCE.md +470 -0
  10. package/docs/EVENTS_README.md +352 -0
  11. package/package.json +39 -0
  12. package/src/core/config/defaults.ts +207 -0
  13. package/src/core/config/index.ts +15 -0
  14. package/src/core/config/loader.ts +271 -0
  15. package/src/core/config/schema.ts +188 -0
  16. package/src/core/config/validator.ts +209 -0
  17. package/src/core/event-bus.ts +236 -0
  18. package/src/core/index.ts +22 -0
  19. package/src/core/interfaces/agent.interface.ts +251 -0
  20. package/src/core/interfaces/coordinator.interface.ts +363 -0
  21. package/src/core/interfaces/event.interface.ts +267 -0
  22. package/src/core/interfaces/index.ts +19 -0
  23. package/src/core/interfaces/memory.interface.ts +332 -0
  24. package/src/core/interfaces/task.interface.ts +223 -0
  25. package/src/core/orchestrator/event-coordinator.ts +122 -0
  26. package/src/core/orchestrator/health-monitor.ts +214 -0
  27. package/src/core/orchestrator/index.ts +89 -0
  28. package/src/core/orchestrator/lifecycle-manager.ts +263 -0
  29. package/src/core/orchestrator/session-manager.ts +279 -0
  30. package/src/core/orchestrator/task-manager.ts +317 -0
  31. package/src/events/domain-events.ts +584 -0
  32. package/src/events/event-store.test.ts +387 -0
  33. package/src/events/event-store.ts +588 -0
  34. package/src/events/example-usage.ts +293 -0
  35. package/src/events/index.ts +90 -0
  36. package/src/events/projections.ts +561 -0
  37. package/src/events/state-reconstructor.ts +349 -0
  38. package/src/events.ts +367 -0
  39. package/src/hooks/INTEGRATION.md +658 -0
  40. package/src/hooks/README.md +532 -0
  41. package/src/hooks/example-usage.ts +499 -0
  42. package/src/hooks/executor.ts +379 -0
  43. package/src/hooks/hooks.test.ts +421 -0
  44. package/src/hooks/index.ts +131 -0
  45. package/src/hooks/registry.ts +333 -0
  46. package/src/hooks/safety/bash-safety.ts +604 -0
  47. package/src/hooks/safety/file-organization.ts +473 -0
  48. package/src/hooks/safety/git-commit.ts +623 -0
  49. package/src/hooks/safety/index.ts +46 -0
  50. package/src/hooks/session-hooks.ts +559 -0
  51. package/src/hooks/task-hooks.ts +513 -0
  52. package/src/hooks/types.ts +357 -0
  53. package/src/hooks/verify-exports.test.ts +125 -0
  54. package/src/index.ts +195 -0
  55. package/src/mcp/connection-pool.ts +438 -0
  56. package/src/mcp/index.ts +183 -0
  57. package/src/mcp/server.ts +774 -0
  58. package/src/mcp/session-manager.ts +428 -0
  59. package/src/mcp/tool-registry.ts +566 -0
  60. package/src/mcp/transport/http.ts +557 -0
  61. package/src/mcp/transport/index.ts +294 -0
  62. package/src/mcp/transport/stdio.ts +324 -0
  63. package/src/mcp/transport/websocket.ts +484 -0
  64. package/src/mcp/types.ts +565 -0
  65. package/src/plugin-interface.ts +663 -0
  66. package/src/plugin-loader.ts +638 -0
  67. package/src/plugin-registry.ts +604 -0
  68. package/src/plugins/index.ts +34 -0
  69. package/src/plugins/official/hive-mind-plugin.ts +330 -0
  70. package/src/plugins/official/index.ts +24 -0
  71. package/src/plugins/official/maestro-plugin.ts +508 -0
  72. package/src/plugins/types.ts +108 -0
  73. package/src/resilience/bulkhead.ts +277 -0
  74. package/src/resilience/circuit-breaker.ts +326 -0
  75. package/src/resilience/index.ts +26 -0
  76. package/src/resilience/rate-limiter.ts +420 -0
  77. package/src/resilience/retry.ts +224 -0
  78. package/src/security/index.ts +39 -0
  79. package/src/security/input-validation.ts +265 -0
  80. package/src/security/secure-random.ts +159 -0
  81. package/src/services/index.ts +16 -0
  82. package/src/services/v3-progress.service.ts +505 -0
  83. package/src/types/agent.types.ts +144 -0
  84. package/src/types/index.ts +22 -0
  85. package/src/types/mcp.types.ts +300 -0
  86. package/src/types/memory.types.ts +263 -0
  87. package/src/types/swarm.types.ts +255 -0
  88. package/src/types/task.types.ts +205 -0
  89. package/src/types.ts +367 -0
  90. package/src/utils/secure-logger.d.ts +69 -0
  91. package/src/utils/secure-logger.d.ts.map +1 -0
  92. package/src/utils/secure-logger.js +208 -0
  93. package/src/utils/secure-logger.js.map +1 -0
  94. package/src/utils/secure-logger.ts +257 -0
  95. package/tmp.json +0 -0
  96. package/tsconfig.json +9 -0
@@ -0,0 +1,584 @@
1
+ /**
2
+ * Domain Events for Event Sourcing (ADR-007)
3
+ *
4
+ * Defines all domain events for the V3 system:
5
+ * - Agent lifecycle events (spawned, started, stopped, failed)
6
+ * - Task execution events (created, started, completed, failed)
7
+ * - Memory operations events (stored, retrieved, deleted)
8
+ * - Swarm coordination events (initialized, scaled, terminated)
9
+ *
10
+ * @module v3/shared/events/domain-events
11
+ */
12
+
13
+ import { AgentId, TaskId, EventType, SwarmEvent } from '../types.js';
14
+
15
+ // =============================================================================
16
+ // Base Domain Event Interface
17
+ // =============================================================================
18
+
19
+ export interface DomainEvent {
20
+ /** Unique event identifier */
21
+ id: string;
22
+
23
+ /** Event type discriminator */
24
+ type: string;
25
+
26
+ /** Aggregate ID (entity the event belongs to) */
27
+ aggregateId: string;
28
+
29
+ /** Aggregate type (agent, task, memory, swarm) */
30
+ aggregateType: 'agent' | 'task' | 'memory' | 'swarm';
31
+
32
+ /** Event version for ordering */
33
+ version: number;
34
+
35
+ /** Timestamp when event occurred */
36
+ timestamp: number;
37
+
38
+ /** Event source (agent or swarm system) */
39
+ source: AgentId | 'swarm';
40
+
41
+ /** Event payload data */
42
+ payload: Record<string, unknown>;
43
+
44
+ /** Optional metadata */
45
+ metadata?: Record<string, unknown>;
46
+
47
+ /** Optional causation ID (event that caused this event) */
48
+ causationId?: string;
49
+
50
+ /** Optional correlation ID (groups related events) */
51
+ correlationId?: string;
52
+ }
53
+
54
+ // =============================================================================
55
+ // Agent Lifecycle Events
56
+ // =============================================================================
57
+
58
+ export interface AgentSpawnedEvent extends DomainEvent {
59
+ type: 'agent:spawned';
60
+ aggregateType: 'agent';
61
+ payload: {
62
+ agentId: AgentId;
63
+ role: string;
64
+ domain: string;
65
+ capabilities: string[];
66
+ };
67
+ }
68
+
69
+ export interface AgentStartedEvent extends DomainEvent {
70
+ type: 'agent:started';
71
+ aggregateType: 'agent';
72
+ payload: {
73
+ agentId: AgentId;
74
+ startedAt: number;
75
+ };
76
+ }
77
+
78
+ export interface AgentStoppedEvent extends DomainEvent {
79
+ type: 'agent:stopped';
80
+ aggregateType: 'agent';
81
+ payload: {
82
+ agentId: AgentId;
83
+ reason: string;
84
+ stoppedAt: number;
85
+ };
86
+ }
87
+
88
+ export interface AgentFailedEvent extends DomainEvent {
89
+ type: 'agent:failed';
90
+ aggregateType: 'agent';
91
+ payload: {
92
+ agentId: AgentId;
93
+ error: string;
94
+ stack?: string;
95
+ failedAt: number;
96
+ };
97
+ }
98
+
99
+ export interface AgentStatusChangedEvent extends DomainEvent {
100
+ type: 'agent:status-changed';
101
+ aggregateType: 'agent';
102
+ payload: {
103
+ agentId: AgentId;
104
+ previousStatus: string;
105
+ newStatus: string;
106
+ };
107
+ }
108
+
109
+ export interface AgentTaskAssignedEvent extends DomainEvent {
110
+ type: 'agent:task-assigned';
111
+ aggregateType: 'agent';
112
+ payload: {
113
+ agentId: AgentId;
114
+ taskId: TaskId;
115
+ assignedAt: number;
116
+ };
117
+ }
118
+
119
+ export interface AgentTaskCompletedEvent extends DomainEvent {
120
+ type: 'agent:task-completed';
121
+ aggregateType: 'agent';
122
+ payload: {
123
+ agentId: AgentId;
124
+ taskId: TaskId;
125
+ result: unknown;
126
+ completedAt: number;
127
+ duration: number;
128
+ };
129
+ }
130
+
131
+ // =============================================================================
132
+ // Task Execution Events
133
+ // =============================================================================
134
+
135
+ export interface TaskCreatedEvent extends DomainEvent {
136
+ type: 'task:created';
137
+ aggregateType: 'task';
138
+ payload: {
139
+ taskId: TaskId;
140
+ taskType: string;
141
+ title: string;
142
+ description: string;
143
+ priority: string;
144
+ dependencies: TaskId[];
145
+ createdAt: number;
146
+ };
147
+ }
148
+
149
+ export interface TaskStartedEvent extends DomainEvent {
150
+ type: 'task:started';
151
+ aggregateType: 'task';
152
+ payload: {
153
+ taskId: TaskId;
154
+ agentId: AgentId;
155
+ startedAt: number;
156
+ };
157
+ }
158
+
159
+ export interface TaskCompletedEvent extends DomainEvent {
160
+ type: 'task:completed';
161
+ aggregateType: 'task';
162
+ payload: {
163
+ taskId: TaskId;
164
+ result: unknown;
165
+ completedAt: number;
166
+ duration: number;
167
+ };
168
+ }
169
+
170
+ export interface TaskFailedEvent extends DomainEvent {
171
+ type: 'task:failed';
172
+ aggregateType: 'task';
173
+ payload: {
174
+ taskId: TaskId;
175
+ error: string;
176
+ stack?: string;
177
+ failedAt: number;
178
+ retryCount: number;
179
+ };
180
+ }
181
+
182
+ export interface TaskBlockedEvent extends DomainEvent {
183
+ type: 'task:blocked';
184
+ aggregateType: 'task';
185
+ payload: {
186
+ taskId: TaskId;
187
+ blockedBy: TaskId[];
188
+ blockedAt: number;
189
+ };
190
+ }
191
+
192
+ export interface TaskQueuedEvent extends DomainEvent {
193
+ type: 'task:queued';
194
+ aggregateType: 'task';
195
+ payload: {
196
+ taskId: TaskId;
197
+ priority: string;
198
+ queuedAt: number;
199
+ };
200
+ }
201
+
202
+ // =============================================================================
203
+ // Memory Operations Events
204
+ // =============================================================================
205
+
206
+ export interface MemoryStoredEvent extends DomainEvent {
207
+ type: 'memory:stored';
208
+ aggregateType: 'memory';
209
+ payload: {
210
+ memoryId: string;
211
+ namespace: string;
212
+ key: string;
213
+ memoryType: string;
214
+ size: number;
215
+ storedAt: number;
216
+ };
217
+ }
218
+
219
+ export interface MemoryRetrievedEvent extends DomainEvent {
220
+ type: 'memory:retrieved';
221
+ aggregateType: 'memory';
222
+ payload: {
223
+ memoryId: string;
224
+ namespace: string;
225
+ key: string;
226
+ retrievedAt: number;
227
+ accessCount: number;
228
+ };
229
+ }
230
+
231
+ export interface MemoryDeletedEvent extends DomainEvent {
232
+ type: 'memory:deleted';
233
+ aggregateType: 'memory';
234
+ payload: {
235
+ memoryId: string;
236
+ namespace: string;
237
+ key: string;
238
+ deletedAt: number;
239
+ };
240
+ }
241
+
242
+ export interface MemoryExpiredEvent extends DomainEvent {
243
+ type: 'memory:expired';
244
+ aggregateType: 'memory';
245
+ payload: {
246
+ memoryId: string;
247
+ namespace: string;
248
+ key: string;
249
+ expiredAt: number;
250
+ expiresAt: number;
251
+ };
252
+ }
253
+
254
+ // =============================================================================
255
+ // Swarm Coordination Events
256
+ // =============================================================================
257
+
258
+ export interface SwarmInitializedEvent extends DomainEvent {
259
+ type: 'swarm:initialized';
260
+ aggregateType: 'swarm';
261
+ payload: {
262
+ topology: string;
263
+ maxAgents: number;
264
+ config: Record<string, unknown>;
265
+ initializedAt: number;
266
+ };
267
+ }
268
+
269
+ export interface SwarmScaledEvent extends DomainEvent {
270
+ type: 'swarm:scaled';
271
+ aggregateType: 'swarm';
272
+ payload: {
273
+ previousAgentCount: number;
274
+ newAgentCount: number;
275
+ scaledAt: number;
276
+ reason: string;
277
+ };
278
+ }
279
+
280
+ export interface SwarmTerminatedEvent extends DomainEvent {
281
+ type: 'swarm:terminated';
282
+ aggregateType: 'swarm';
283
+ payload: {
284
+ reason: string;
285
+ terminatedAt: number;
286
+ metrics: Record<string, unknown>;
287
+ };
288
+ }
289
+
290
+ export interface SwarmPhaseChangedEvent extends DomainEvent {
291
+ type: 'swarm:phase-changed';
292
+ aggregateType: 'swarm';
293
+ payload: {
294
+ previousPhase: string;
295
+ newPhase: string;
296
+ changedAt: number;
297
+ };
298
+ }
299
+
300
+ export interface SwarmMilestoneReachedEvent extends DomainEvent {
301
+ type: 'swarm:milestone-reached';
302
+ aggregateType: 'swarm';
303
+ payload: {
304
+ milestoneId: string;
305
+ name: string;
306
+ reachedAt: number;
307
+ };
308
+ }
309
+
310
+ export interface SwarmErrorEvent extends DomainEvent {
311
+ type: 'swarm:error';
312
+ aggregateType: 'swarm';
313
+ payload: {
314
+ error: string;
315
+ stack?: string;
316
+ context: Record<string, unknown>;
317
+ errorAt: number;
318
+ };
319
+ }
320
+
321
+ // =============================================================================
322
+ // Event Type Union
323
+ // =============================================================================
324
+
325
+ export type AllDomainEvents =
326
+ | AgentSpawnedEvent
327
+ | AgentStartedEvent
328
+ | AgentStoppedEvent
329
+ | AgentFailedEvent
330
+ | AgentStatusChangedEvent
331
+ | AgentTaskAssignedEvent
332
+ | AgentTaskCompletedEvent
333
+ | TaskCreatedEvent
334
+ | TaskStartedEvent
335
+ | TaskCompletedEvent
336
+ | TaskFailedEvent
337
+ | TaskBlockedEvent
338
+ | TaskQueuedEvent
339
+ | MemoryStoredEvent
340
+ | MemoryRetrievedEvent
341
+ | MemoryDeletedEvent
342
+ | MemoryExpiredEvent
343
+ | SwarmInitializedEvent
344
+ | SwarmScaledEvent
345
+ | SwarmTerminatedEvent
346
+ | SwarmPhaseChangedEvent
347
+ | SwarmMilestoneReachedEvent
348
+ | SwarmErrorEvent;
349
+
350
+ // =============================================================================
351
+ // Event Factory Functions
352
+ // =============================================================================
353
+
354
+ let eventCounter = 0;
355
+
356
+ function createDomainEvent<T extends DomainEvent>(
357
+ type: T['type'],
358
+ aggregateId: string,
359
+ aggregateType: T['aggregateType'],
360
+ payload: T['payload'],
361
+ metadata?: Record<string, unknown>,
362
+ causationId?: string,
363
+ correlationId?: string
364
+ ): T {
365
+ return {
366
+ id: `evt-${Date.now()}-${++eventCounter}`,
367
+ type,
368
+ aggregateId,
369
+ aggregateType,
370
+ version: 1, // Version will be set by event store
371
+ timestamp: Date.now(),
372
+ source: 'swarm', // Default to swarm, can be overridden
373
+ payload,
374
+ metadata,
375
+ causationId,
376
+ correlationId,
377
+ } as T;
378
+ }
379
+
380
+ // Agent Event Factories
381
+ export function createAgentSpawnedEvent(
382
+ agentId: AgentId,
383
+ role: string,
384
+ domain: string,
385
+ capabilities: string[]
386
+ ): AgentSpawnedEvent {
387
+ return createDomainEvent('agent:spawned', agentId, 'agent', {
388
+ agentId,
389
+ role,
390
+ domain,
391
+ capabilities,
392
+ });
393
+ }
394
+
395
+ export function createAgentStartedEvent(agentId: AgentId): AgentStartedEvent {
396
+ return createDomainEvent('agent:started', agentId, 'agent', {
397
+ agentId,
398
+ startedAt: Date.now(),
399
+ });
400
+ }
401
+
402
+ export function createAgentStoppedEvent(agentId: AgentId, reason: string): AgentStoppedEvent {
403
+ return createDomainEvent('agent:stopped', agentId, 'agent', {
404
+ agentId,
405
+ reason,
406
+ stoppedAt: Date.now(),
407
+ });
408
+ }
409
+
410
+ export function createAgentFailedEvent(agentId: AgentId, error: Error): AgentFailedEvent {
411
+ return createDomainEvent('agent:failed', agentId, 'agent', {
412
+ agentId,
413
+ error: error.message,
414
+ stack: error.stack,
415
+ failedAt: Date.now(),
416
+ });
417
+ }
418
+
419
+ export function createAgentTaskAssignedEvent(
420
+ agentId: AgentId,
421
+ taskId: TaskId,
422
+ assignedAt?: number
423
+ ): AgentTaskAssignedEvent {
424
+ return createDomainEvent('agent:task-assigned', agentId, 'agent', {
425
+ agentId,
426
+ taskId,
427
+ assignedAt: assignedAt ?? Date.now(),
428
+ });
429
+ }
430
+
431
+ export function createAgentTaskCompletedEvent(
432
+ agentId: AgentId,
433
+ taskId: TaskId,
434
+ result: unknown,
435
+ completedAt: number,
436
+ duration: number
437
+ ): AgentTaskCompletedEvent {
438
+ return createDomainEvent('agent:task-completed', agentId, 'agent', {
439
+ agentId,
440
+ taskId,
441
+ result,
442
+ completedAt,
443
+ duration,
444
+ });
445
+ }
446
+
447
+ // Task Event Factories
448
+ export function createTaskCreatedEvent(
449
+ taskId: TaskId,
450
+ taskType: string,
451
+ title: string,
452
+ description: string,
453
+ priority: string,
454
+ dependencies: TaskId[]
455
+ ): TaskCreatedEvent {
456
+ return createDomainEvent('task:created', taskId, 'task', {
457
+ taskId,
458
+ taskType,
459
+ title,
460
+ description,
461
+ priority,
462
+ dependencies,
463
+ createdAt: Date.now(),
464
+ });
465
+ }
466
+
467
+ export function createTaskStartedEvent(taskId: TaskId, agentId: AgentId): TaskStartedEvent {
468
+ return createDomainEvent('task:started', taskId, 'task', {
469
+ taskId,
470
+ agentId,
471
+ startedAt: Date.now(),
472
+ });
473
+ }
474
+
475
+ export function createTaskCompletedEvent(
476
+ taskId: TaskId,
477
+ result: unknown,
478
+ duration: number
479
+ ): TaskCompletedEvent {
480
+ return createDomainEvent('task:completed', taskId, 'task', {
481
+ taskId,
482
+ result,
483
+ completedAt: Date.now(),
484
+ duration,
485
+ });
486
+ }
487
+
488
+ export function createTaskFailedEvent(
489
+ taskId: TaskId,
490
+ error: Error,
491
+ retryCount: number
492
+ ): TaskFailedEvent {
493
+ return createDomainEvent('task:failed', taskId, 'task', {
494
+ taskId,
495
+ error: error.message,
496
+ stack: error.stack,
497
+ failedAt: Date.now(),
498
+ retryCount,
499
+ });
500
+ }
501
+
502
+ // Memory Event Factories
503
+ export function createMemoryStoredEvent(
504
+ memoryId: string,
505
+ namespace: string,
506
+ key: string,
507
+ memoryType: string,
508
+ size: number
509
+ ): MemoryStoredEvent {
510
+ return createDomainEvent('memory:stored', memoryId, 'memory', {
511
+ memoryId,
512
+ namespace,
513
+ key,
514
+ memoryType,
515
+ size,
516
+ storedAt: Date.now(),
517
+ });
518
+ }
519
+
520
+ export function createMemoryRetrievedEvent(
521
+ memoryId: string,
522
+ namespace: string,
523
+ key: string,
524
+ accessCount: number
525
+ ): MemoryRetrievedEvent {
526
+ return createDomainEvent('memory:retrieved', memoryId, 'memory', {
527
+ memoryId,
528
+ namespace,
529
+ key,
530
+ retrievedAt: Date.now(),
531
+ accessCount,
532
+ });
533
+ }
534
+
535
+ export function createMemoryDeletedEvent(
536
+ memoryId: string,
537
+ namespace: string,
538
+ key: string
539
+ ): MemoryDeletedEvent {
540
+ return createDomainEvent('memory:deleted', memoryId, 'memory', {
541
+ memoryId,
542
+ namespace,
543
+ key,
544
+ deletedAt: Date.now(),
545
+ });
546
+ }
547
+
548
+ // Swarm Event Factories
549
+ export function createSwarmInitializedEvent(
550
+ topology: string,
551
+ maxAgents: number,
552
+ config: Record<string, unknown>
553
+ ): SwarmInitializedEvent {
554
+ return createDomainEvent('swarm:initialized', 'swarm', 'swarm', {
555
+ topology,
556
+ maxAgents,
557
+ config,
558
+ initializedAt: Date.now(),
559
+ });
560
+ }
561
+
562
+ export function createSwarmScaledEvent(
563
+ previousAgentCount: number,
564
+ newAgentCount: number,
565
+ reason: string
566
+ ): SwarmScaledEvent {
567
+ return createDomainEvent('swarm:scaled', 'swarm', 'swarm', {
568
+ previousAgentCount,
569
+ newAgentCount,
570
+ scaledAt: Date.now(),
571
+ reason,
572
+ });
573
+ }
574
+
575
+ export function createSwarmTerminatedEvent(
576
+ reason: string,
577
+ metrics: Record<string, unknown>
578
+ ): SwarmTerminatedEvent {
579
+ return createDomainEvent('swarm:terminated', 'swarm', 'swarm', {
580
+ reason,
581
+ terminatedAt: Date.now(),
582
+ metrics,
583
+ });
584
+ }