@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.
- package/README.md +323 -0
- package/__tests__/hooks/bash-safety.test.ts +289 -0
- package/__tests__/hooks/file-organization.test.ts +335 -0
- package/__tests__/hooks/git-commit.test.ts +336 -0
- package/__tests__/hooks/index.ts +23 -0
- package/__tests__/hooks/session-hooks.test.ts +357 -0
- package/__tests__/hooks/task-hooks.test.ts +193 -0
- package/docs/EVENTS_IMPLEMENTATION_SUMMARY.md +388 -0
- package/docs/EVENTS_QUICK_REFERENCE.md +470 -0
- package/docs/EVENTS_README.md +352 -0
- package/package.json +39 -0
- package/src/core/config/defaults.ts +207 -0
- package/src/core/config/index.ts +15 -0
- package/src/core/config/loader.ts +271 -0
- package/src/core/config/schema.ts +188 -0
- package/src/core/config/validator.ts +209 -0
- package/src/core/event-bus.ts +236 -0
- package/src/core/index.ts +22 -0
- package/src/core/interfaces/agent.interface.ts +251 -0
- package/src/core/interfaces/coordinator.interface.ts +363 -0
- package/src/core/interfaces/event.interface.ts +267 -0
- package/src/core/interfaces/index.ts +19 -0
- package/src/core/interfaces/memory.interface.ts +332 -0
- package/src/core/interfaces/task.interface.ts +223 -0
- package/src/core/orchestrator/event-coordinator.ts +122 -0
- package/src/core/orchestrator/health-monitor.ts +214 -0
- package/src/core/orchestrator/index.ts +89 -0
- package/src/core/orchestrator/lifecycle-manager.ts +263 -0
- package/src/core/orchestrator/session-manager.ts +279 -0
- package/src/core/orchestrator/task-manager.ts +317 -0
- package/src/events/domain-events.ts +584 -0
- package/src/events/event-store.test.ts +387 -0
- package/src/events/event-store.ts +588 -0
- package/src/events/example-usage.ts +293 -0
- package/src/events/index.ts +90 -0
- package/src/events/projections.ts +561 -0
- package/src/events/state-reconstructor.ts +349 -0
- package/src/events.ts +367 -0
- package/src/hooks/INTEGRATION.md +658 -0
- package/src/hooks/README.md +532 -0
- package/src/hooks/example-usage.ts +499 -0
- package/src/hooks/executor.ts +379 -0
- package/src/hooks/hooks.test.ts +421 -0
- package/src/hooks/index.ts +131 -0
- package/src/hooks/registry.ts +333 -0
- package/src/hooks/safety/bash-safety.ts +604 -0
- package/src/hooks/safety/file-organization.ts +473 -0
- package/src/hooks/safety/git-commit.ts +623 -0
- package/src/hooks/safety/index.ts +46 -0
- package/src/hooks/session-hooks.ts +559 -0
- package/src/hooks/task-hooks.ts +513 -0
- package/src/hooks/types.ts +357 -0
- package/src/hooks/verify-exports.test.ts +125 -0
- package/src/index.ts +195 -0
- package/src/mcp/connection-pool.ts +438 -0
- package/src/mcp/index.ts +183 -0
- package/src/mcp/server.ts +774 -0
- package/src/mcp/session-manager.ts +428 -0
- package/src/mcp/tool-registry.ts +566 -0
- package/src/mcp/transport/http.ts +557 -0
- package/src/mcp/transport/index.ts +294 -0
- package/src/mcp/transport/stdio.ts +324 -0
- package/src/mcp/transport/websocket.ts +484 -0
- package/src/mcp/types.ts +565 -0
- package/src/plugin-interface.ts +663 -0
- package/src/plugin-loader.ts +638 -0
- package/src/plugin-registry.ts +604 -0
- package/src/plugins/index.ts +34 -0
- package/src/plugins/official/hive-mind-plugin.ts +330 -0
- package/src/plugins/official/index.ts +24 -0
- package/src/plugins/official/maestro-plugin.ts +508 -0
- package/src/plugins/types.ts +108 -0
- package/src/resilience/bulkhead.ts +277 -0
- package/src/resilience/circuit-breaker.ts +326 -0
- package/src/resilience/index.ts +26 -0
- package/src/resilience/rate-limiter.ts +420 -0
- package/src/resilience/retry.ts +224 -0
- package/src/security/index.ts +39 -0
- package/src/security/input-validation.ts +265 -0
- package/src/security/secure-random.ts +159 -0
- package/src/services/index.ts +16 -0
- package/src/services/v3-progress.service.ts +505 -0
- package/src/types/agent.types.ts +144 -0
- package/src/types/index.ts +22 -0
- package/src/types/mcp.types.ts +300 -0
- package/src/types/memory.types.ts +263 -0
- package/src/types/swarm.types.ts +255 -0
- package/src/types/task.types.ts +205 -0
- package/src/types.ts +367 -0
- package/src/utils/secure-logger.d.ts +69 -0
- package/src/utils/secure-logger.d.ts.map +1 -0
- package/src/utils/secure-logger.js +208 -0
- package/src/utils/secure-logger.js.map +1 -0
- package/src/utils/secure-logger.ts +257 -0
- package/tmp.json +0 -0
- 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
|
+
}
|