@sparkleideas/claims 3.0.0-alpha.8-patch.26 → 3.0.0-alpha.8-patch.28

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 (69) hide show
  1. package/dist/api/cli-commands.d.ts +84 -0
  2. package/dist/api/cli-commands.d.ts.map +1 -0
  3. package/dist/api/cli-commands.js +1223 -0
  4. package/dist/api/cli-commands.js.map +1 -0
  5. package/dist/api/cli-types.d.ts +82 -0
  6. package/dist/api/cli-types.d.ts.map +1 -0
  7. package/dist/api/cli-types.js +87 -0
  8. package/dist/api/cli-types.js.map +1 -0
  9. package/dist/api/index.d.ts +9 -0
  10. package/dist/api/index.d.ts.map +1 -0
  11. package/dist/api/index.js +11 -0
  12. package/dist/api/index.js.map +1 -0
  13. package/dist/api/mcp-tools.d.ts +376 -0
  14. package/dist/api/mcp-tools.d.ts.map +1 -0
  15. package/dist/api/mcp-tools.js +1409 -0
  16. package/dist/api/mcp-tools.js.map +1 -0
  17. package/dist/application/claim-service.d.ts +99 -0
  18. package/dist/application/claim-service.d.ts.map +1 -0
  19. package/dist/application/claim-service.js +440 -0
  20. package/dist/application/claim-service.js.map +1 -0
  21. package/dist/application/index.d.ts +15 -0
  22. package/dist/application/index.d.ts.map +1 -0
  23. package/dist/application/index.js +17 -0
  24. package/dist/application/index.js.map +1 -0
  25. package/dist/application/load-balancer.d.ts +353 -0
  26. package/dist/application/load-balancer.d.ts.map +1 -0
  27. package/dist/application/load-balancer.js +430 -0
  28. package/dist/application/load-balancer.js.map +1 -0
  29. package/dist/application/work-stealing-service.d.ts +149 -0
  30. package/dist/application/work-stealing-service.d.ts.map +1 -0
  31. package/dist/application/work-stealing-service.js +604 -0
  32. package/dist/application/work-stealing-service.js.map +1 -0
  33. package/dist/domain/events.d.ts +308 -0
  34. package/dist/domain/events.d.ts.map +1 -0
  35. package/dist/domain/events.js +241 -0
  36. package/dist/domain/events.js.map +1 -0
  37. package/dist/domain/index.d.ts +16 -0
  38. package/dist/domain/index.d.ts.map +1 -0
  39. package/dist/domain/index.js +34 -0
  40. package/dist/domain/index.js.map +1 -0
  41. package/dist/domain/repositories.d.ts +154 -0
  42. package/dist/domain/repositories.d.ts.map +1 -0
  43. package/dist/domain/repositories.js +9 -0
  44. package/dist/domain/repositories.js.map +1 -0
  45. package/dist/domain/rules.d.ts +105 -0
  46. package/dist/domain/rules.d.ts.map +1 -0
  47. package/dist/domain/rules.js +348 -0
  48. package/dist/domain/rules.js.map +1 -0
  49. package/dist/domain/types.d.ts +578 -0
  50. package/dist/domain/types.d.ts.map +1 -0
  51. package/dist/domain/types.js +99 -0
  52. package/dist/domain/types.js.map +1 -0
  53. package/dist/index.d.ts +33 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +51 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/infrastructure/claim-repository.d.ts +46 -0
  58. package/dist/infrastructure/claim-repository.d.ts.map +1 -0
  59. package/dist/infrastructure/claim-repository.js +274 -0
  60. package/dist/infrastructure/claim-repository.js.map +1 -0
  61. package/dist/infrastructure/event-store.d.ts +62 -0
  62. package/dist/infrastructure/event-store.d.ts.map +1 -0
  63. package/dist/infrastructure/event-store.js +189 -0
  64. package/dist/infrastructure/event-store.js.map +1 -0
  65. package/dist/infrastructure/index.d.ts +10 -0
  66. package/dist/infrastructure/index.d.ts.map +1 -0
  67. package/dist/infrastructure/index.js +12 -0
  68. package/dist/infrastructure/index.js.map +1 -0
  69. package/package.json +2 -2
@@ -0,0 +1,604 @@
1
+ /**
2
+ * Work Stealing Service - Application Layer
3
+ *
4
+ * Handles work stealing to maximize swarm throughput by redistributing
5
+ * work from stale, blocked, or overloaded agents to available ones.
6
+ *
7
+ * @module v3/claims/application/work-stealing-service
8
+ */
9
+ import { randomUUID } from 'crypto';
10
+ import { DEFAULT_WORK_STEALING_CONFIG, } from '../domain/types.js';
11
+ // =============================================================================
12
+ // Default Event Bus Implementation
13
+ // =============================================================================
14
+ /**
15
+ * Simple in-memory event bus for work stealing events
16
+ */
17
+ export class InMemoryWorkStealingEventBus {
18
+ handlers = new Map();
19
+ history = [];
20
+ maxHistorySize;
21
+ constructor(options = {}) {
22
+ this.maxHistorySize = options.maxHistorySize ?? 1000;
23
+ }
24
+ async emit(event) {
25
+ this.addToHistory(event);
26
+ const typeHandlers = this.handlers.get(event.type) ?? new Set();
27
+ const allHandlers = this.handlers.get('*') ?? new Set();
28
+ const promises = [];
29
+ for (const handler of typeHandlers) {
30
+ promises.push(this.safeExecute(handler, event));
31
+ }
32
+ for (const handler of allHandlers) {
33
+ promises.push(this.safeExecute(handler, event));
34
+ }
35
+ await Promise.all(promises);
36
+ }
37
+ subscribe(eventType, handler) {
38
+ if (!this.handlers.has(eventType)) {
39
+ this.handlers.set(eventType, new Set());
40
+ }
41
+ const handlers = this.handlers.get(eventType);
42
+ handlers.add(handler);
43
+ return () => {
44
+ handlers.delete(handler);
45
+ };
46
+ }
47
+ subscribeAll(handler) {
48
+ if (!this.handlers.has('*')) {
49
+ this.handlers.set('*', new Set());
50
+ }
51
+ const handlers = this.handlers.get('*');
52
+ handlers.add(handler);
53
+ return () => {
54
+ handlers.delete(handler);
55
+ };
56
+ }
57
+ getHistory(filter) {
58
+ let events = [...this.history];
59
+ if (filter?.types?.length) {
60
+ events = events.filter(e => filter.types.includes(e.type));
61
+ }
62
+ if (filter?.limit) {
63
+ events = events.slice(-filter.limit);
64
+ }
65
+ return events;
66
+ }
67
+ addToHistory(event) {
68
+ this.history.push(event);
69
+ if (this.history.length > this.maxHistorySize) {
70
+ this.history = this.history.slice(-Math.floor(this.maxHistorySize / 2));
71
+ }
72
+ }
73
+ async safeExecute(handler, event) {
74
+ try {
75
+ await handler(event);
76
+ }
77
+ catch (err) {
78
+ console.error(`Work stealing event handler error for ${event.type}:`, err);
79
+ }
80
+ }
81
+ }
82
+ // =============================================================================
83
+ // Work Stealing Service Implementation
84
+ // =============================================================================
85
+ /**
86
+ * Work Stealing Service
87
+ *
88
+ * Implements work stealing algorithms to maximize swarm throughput by
89
+ * redistributing work from stale, blocked, or overloaded agents.
90
+ */
91
+ export class WorkStealingService {
92
+ repository;
93
+ eventBus;
94
+ config;
95
+ constructor(repository, eventBus, config = {}) {
96
+ this.repository = repository;
97
+ this.eventBus = eventBus;
98
+ this.config = { ...DEFAULT_WORK_STEALING_CONFIG, ...config };
99
+ }
100
+ // ===========================================================================
101
+ // Mark Stealable
102
+ // ===========================================================================
103
+ /**
104
+ * Mark work as stealable with the given reason
105
+ */
106
+ async markStealable(issueId, info) {
107
+ const claim = await this.repository.findByIssueId(issueId);
108
+ if (!claim) {
109
+ throw new Error(`Claim not found for issue: ${issueId}`);
110
+ }
111
+ // Check if already stealable
112
+ if (claim.stealInfo) {
113
+ return; // Already marked
114
+ }
115
+ // Check grace period protection
116
+ if (this.isInGracePeriod(claim)) {
117
+ throw new Error(`Claim is still in grace period`);
118
+ }
119
+ // Check progress protection
120
+ if (this.isProtectedByProgress(claim)) {
121
+ throw new Error(`Claim is protected by progress (${claim.progress}%)`);
122
+ }
123
+ // Update claim with stealable info
124
+ const now = new Date();
125
+ claim.stealInfo = {
126
+ ...info,
127
+ markedAt: now,
128
+ };
129
+ claim.stealableAt = now;
130
+ await this.repository.update(claim);
131
+ // Emit event
132
+ await this.emitMarkedStealableEvent(claim, info);
133
+ }
134
+ // ===========================================================================
135
+ // Steal
136
+ // ===========================================================================
137
+ /**
138
+ * Steal work from another agent
139
+ */
140
+ async steal(issueId, stealer) {
141
+ const claim = await this.repository.findByIssueId(issueId);
142
+ // Validate claim exists
143
+ if (!claim) {
144
+ return this.stealError('ISSUE_NOT_FOUND', `Claim not found for issue: ${issueId}`);
145
+ }
146
+ // Check if stealable
147
+ if (!claim.stealInfo) {
148
+ return this.stealError('NOT_STEALABLE', 'Issue is not marked as stealable');
149
+ }
150
+ // Check if there's a pending contest
151
+ if (claim.contestInfo && !claim.contestInfo.resolution) {
152
+ return this.stealError('CONTEST_PENDING', 'A contest is pending for this issue');
153
+ }
154
+ // Check grace period
155
+ if (this.isInGracePeriod(claim)) {
156
+ return this.stealError('IN_GRACE_PERIOD', 'Claim is still in grace period');
157
+ }
158
+ // Check progress protection
159
+ if (this.isProtectedByProgress(claim)) {
160
+ return this.stealError('PROTECTED_BY_PROGRESS', `Claim is protected by progress (${claim.progress}%)`);
161
+ }
162
+ // Check cross-type stealing rules
163
+ const stealerType = this.getAgentType(stealer);
164
+ const ownerType = this.getAgentType(claim.claimant);
165
+ if (!this.canStealCrossType(stealerType, ownerType, claim.stealInfo)) {
166
+ return this.stealError('CROSS_TYPE_NOT_ALLOWED', `${stealerType} cannot steal from ${ownerType}`);
167
+ }
168
+ // Check if stealer is overloaded
169
+ const stealerClaimCount = await this.repository.countByAgentId(stealer.id);
170
+ if (stealerClaimCount >= this.config.overloadThreshold) {
171
+ return this.stealError('STEALER_OVERLOADED', `Stealer has too many claims (${stealerClaimCount})`);
172
+ }
173
+ // Perform the steal
174
+ const previousClaimant = { ...claim.claimant };
175
+ const previousStealInfo = { ...claim.stealInfo };
176
+ const now = new Date();
177
+ const contestWindowEndsAt = new Date(now.getTime() + this.config.contestWindowMinutes * 60 * 1000);
178
+ // Update claim with new owner
179
+ claim.claimant = stealer;
180
+ claim.stealInfo = undefined;
181
+ claim.stealableAt = undefined;
182
+ claim.lastActivityAt = now;
183
+ claim.contestInfo = {
184
+ contestedAt: now,
185
+ contestedBy: previousClaimant,
186
+ stolenBy: stealer,
187
+ reason: '', // Will be set if contested
188
+ windowEndsAt: contestWindowEndsAt,
189
+ };
190
+ await this.repository.update(claim);
191
+ // Emit stolen event
192
+ await this.emitStolenEvent(claim, previousClaimant, stealer, previousStealInfo, contestWindowEndsAt);
193
+ return {
194
+ success: true,
195
+ claim,
196
+ previousClaimant,
197
+ contestWindowEndsAt,
198
+ };
199
+ }
200
+ // ===========================================================================
201
+ // Get Stealable
202
+ // ===========================================================================
203
+ /**
204
+ * Get list of stealable issues, optionally filtered by agent type
205
+ */
206
+ async getStealable(agentType) {
207
+ const stealableClaims = await this.repository.findStealable(agentType);
208
+ // Filter out claims that are protected or in grace period
209
+ return stealableClaims.filter(claim => {
210
+ if (!claim.stealInfo)
211
+ return false;
212
+ if (this.isInGracePeriod(claim))
213
+ return false;
214
+ if (this.isProtectedByProgress(claim))
215
+ return false;
216
+ // Check cross-type restrictions if agentType is specified
217
+ if (agentType && claim.stealInfo.allowedStealerTypes) {
218
+ if (!claim.stealInfo.allowedStealerTypes.includes(agentType)) {
219
+ return false;
220
+ }
221
+ }
222
+ return true;
223
+ });
224
+ }
225
+ // ===========================================================================
226
+ // Contest Steal
227
+ // ===========================================================================
228
+ /**
229
+ * Contest a steal (original owner wants the work back)
230
+ */
231
+ async contestSteal(issueId, originalClaimant, reason) {
232
+ const claim = await this.repository.findByIssueId(issueId);
233
+ if (!claim) {
234
+ throw new Error(`Claim not found for issue: ${issueId}`);
235
+ }
236
+ // Check if there's a valid contest window
237
+ if (!claim.contestInfo) {
238
+ throw new Error('No steal to contest - issue was not recently stolen');
239
+ }
240
+ if (claim.contestInfo.resolution) {
241
+ throw new Error('Contest has already been resolved');
242
+ }
243
+ const now = new Date();
244
+ if (now > claim.contestInfo.windowEndsAt) {
245
+ throw new Error('Contest window has expired');
246
+ }
247
+ // Verify the contester was the original owner
248
+ if (claim.contestInfo.contestedBy.id !== originalClaimant.id) {
249
+ throw new Error('Only the original claimant can contest the steal');
250
+ }
251
+ // Update contest info with reason
252
+ claim.contestInfo.reason = reason;
253
+ claim.contestInfo.contestedAt = now;
254
+ await this.repository.update(claim);
255
+ // Emit contest event
256
+ await this.emitContestEvent(claim);
257
+ }
258
+ // ===========================================================================
259
+ // Resolve Contest
260
+ // ===========================================================================
261
+ /**
262
+ * Resolve a contest (queen or human decides the winner)
263
+ */
264
+ async resolveContest(issueId, winner, reason) {
265
+ const claim = await this.repository.findByIssueId(issueId);
266
+ if (!claim) {
267
+ throw new Error(`Claim not found for issue: ${issueId}`);
268
+ }
269
+ if (!claim.contestInfo) {
270
+ throw new Error('No contest to resolve');
271
+ }
272
+ if (claim.contestInfo.resolution) {
273
+ throw new Error('Contest has already been resolved');
274
+ }
275
+ const now = new Date();
276
+ const resolvedBy = this.determineResolver(winner, claim.contestInfo);
277
+ // Create resolution
278
+ const resolution = {
279
+ resolvedAt: now,
280
+ winner,
281
+ resolvedBy,
282
+ reason,
283
+ };
284
+ claim.contestInfo.resolution = resolution;
285
+ // Update claimant if the original owner won
286
+ if (winner.id === claim.contestInfo.contestedBy.id) {
287
+ claim.claimant = winner;
288
+ }
289
+ claim.lastActivityAt = now;
290
+ await this.repository.update(claim);
291
+ // Emit resolution event
292
+ await this.emitContestResolvedEvent(claim, resolution);
293
+ }
294
+ // ===========================================================================
295
+ // Detect Stale Work
296
+ // ===========================================================================
297
+ /**
298
+ * Detect stale work based on config thresholds
299
+ */
300
+ async detectStaleWork(config) {
301
+ const allClaims = await this.repository.findAll();
302
+ const now = new Date();
303
+ const staleThresholdMs = config.staleThresholdMinutes * 60 * 1000;
304
+ const blockedThresholdMs = config.blockedThresholdMinutes * 60 * 1000;
305
+ const staleClaims = [];
306
+ for (const claim of allClaims) {
307
+ // Skip if already stealable
308
+ if (claim.stealInfo)
309
+ continue;
310
+ // Skip if in grace period
311
+ if (this.isInGracePeriodWithConfig(claim, config))
312
+ continue;
313
+ // Skip if protected by progress
314
+ if (this.isProtectedByProgressWithConfig(claim, config))
315
+ continue;
316
+ // Check for stale claims (no activity)
317
+ const timeSinceActivity = now.getTime() - new Date(claim.lastActivityAt).getTime();
318
+ if (timeSinceActivity > staleThresholdMs) {
319
+ staleClaims.push(claim);
320
+ continue;
321
+ }
322
+ // Check for blocked claims
323
+ if (claim.status === 'pending_handoff' && claim.blockedAt) {
324
+ const timeSinceBlocked = now.getTime() - new Date(claim.blockedAt).getTime();
325
+ if (timeSinceBlocked > blockedThresholdMs) {
326
+ staleClaims.push(claim);
327
+ continue;
328
+ }
329
+ }
330
+ }
331
+ // Check for overloaded agents
332
+ const agentClaimCounts = new Map();
333
+ for (const claim of allClaims) {
334
+ const agentId = claim.claimant.id;
335
+ if (!agentClaimCounts.has(agentId)) {
336
+ agentClaimCounts.set(agentId, []);
337
+ }
338
+ agentClaimCounts.get(agentId).push(claim);
339
+ }
340
+ for (const [_agentId, claims] of agentClaimCounts) {
341
+ if (claims.length > config.overloadThreshold) {
342
+ // Sort by progress (lowest first) and mark the lowest priority as stealable
343
+ const sortedClaims = claims
344
+ .filter(c => !c.stealInfo && !staleClaims.includes(c))
345
+ .sort((a, b) => a.progress - b.progress);
346
+ if (sortedClaims.length > 0) {
347
+ staleClaims.push(sortedClaims[0]);
348
+ }
349
+ }
350
+ }
351
+ return staleClaims;
352
+ }
353
+ // ===========================================================================
354
+ // Auto Mark Stealable
355
+ // ===========================================================================
356
+ /**
357
+ * Auto-mark stealable work based on config thresholds
358
+ */
359
+ async autoMarkStealable(config) {
360
+ const staleClaims = await this.detectStaleWork(config);
361
+ const now = new Date();
362
+ let markedCount = 0;
363
+ for (const claim of staleClaims) {
364
+ const reason = this.determineStaleReason(claim, config, now);
365
+ const stealInfo = {
366
+ reason,
367
+ markedAt: now,
368
+ originalProgress: claim.progress,
369
+ allowedStealerTypes: this.getAllowedStealerTypes(claim.claimant, config),
370
+ };
371
+ try {
372
+ await this.markStealable(claim.issueId, stealInfo);
373
+ markedCount++;
374
+ }
375
+ catch (err) {
376
+ // Log but don't fail - some claims may be protected
377
+ console.warn(`Failed to mark claim ${claim.id} as stealable:`, err);
378
+ }
379
+ }
380
+ return markedCount;
381
+ }
382
+ // ===========================================================================
383
+ // Private Helper Methods
384
+ // ===========================================================================
385
+ /**
386
+ * Check if claim is in grace period
387
+ */
388
+ isInGracePeriod(claim) {
389
+ return this.isInGracePeriodWithConfig(claim, this.config);
390
+ }
391
+ /**
392
+ * Check if claim is in grace period with specific config
393
+ */
394
+ isInGracePeriodWithConfig(claim, config) {
395
+ const gracePeriodMs = config.gracePeriodMinutes * 60 * 1000;
396
+ const now = new Date();
397
+ const claimedAt = new Date(claim.claimedAt);
398
+ return now.getTime() - claimedAt.getTime() < gracePeriodMs;
399
+ }
400
+ /**
401
+ * Check if claim is protected by progress
402
+ */
403
+ isProtectedByProgress(claim) {
404
+ return this.isProtectedByProgressWithConfig(claim, this.config);
405
+ }
406
+ /**
407
+ * Check if claim is protected by progress with specific config
408
+ */
409
+ isProtectedByProgressWithConfig(claim, config) {
410
+ return claim.progress >= config.minProgressToProtect;
411
+ }
412
+ /**
413
+ * Get agent type from claimant
414
+ */
415
+ getAgentType(claimant) {
416
+ // Try to extract agent type from specializations or capabilities
417
+ const typeKeywords = ['coder', 'debugger', 'tester', 'reviewer', 'researcher', 'planner', 'architect', 'coordinator'];
418
+ for (const keyword of typeKeywords) {
419
+ if (claimant.specializations?.includes(keyword)) {
420
+ return keyword;
421
+ }
422
+ if (claimant.capabilities?.includes(keyword)) {
423
+ return keyword;
424
+ }
425
+ if (claimant.name.toLowerCase().includes(keyword)) {
426
+ return keyword;
427
+ }
428
+ }
429
+ // Default to coder if no type can be determined
430
+ return 'coder';
431
+ }
432
+ /**
433
+ * Check if cross-type stealing is allowed
434
+ */
435
+ canStealCrossType(stealerType, ownerType, stealInfo) {
436
+ // Same type can always steal
437
+ if (stealerType === ownerType)
438
+ return true;
439
+ // Check if cross-type stealing is enabled
440
+ if (!this.config.allowCrossTypeSteal)
441
+ return false;
442
+ // Check if there are specific allowed types
443
+ if (stealInfo.allowedStealerTypes) {
444
+ return stealInfo.allowedStealerTypes.includes(stealerType);
445
+ }
446
+ // Check cross-type steal rules
447
+ for (const [type1, type2] of this.config.crossTypeStealRules) {
448
+ if ((stealerType === type1 && ownerType === type2) ||
449
+ (stealerType === type2 && ownerType === type1)) {
450
+ return true;
451
+ }
452
+ }
453
+ return false;
454
+ }
455
+ /**
456
+ * Get allowed stealer types for a claimant
457
+ */
458
+ getAllowedStealerTypes(claimant, config) {
459
+ if (!config.allowCrossTypeSteal)
460
+ return undefined;
461
+ const ownerType = this.getAgentType(claimant);
462
+ const allowedTypes = [ownerType]; // Same type always allowed
463
+ for (const [type1, type2] of config.crossTypeStealRules) {
464
+ if (ownerType === type1)
465
+ allowedTypes.push(type2);
466
+ if (ownerType === type2)
467
+ allowedTypes.push(type1);
468
+ }
469
+ return [...new Set(allowedTypes)];
470
+ }
471
+ /**
472
+ * Determine the stale reason for a claim
473
+ */
474
+ determineStaleReason(claim, config, now) {
475
+ const staleThresholdMs = config.staleThresholdMinutes * 60 * 1000;
476
+ const blockedThresholdMs = config.blockedThresholdMinutes * 60 * 1000;
477
+ // Check if blocked
478
+ if (claim.status === 'pending_handoff' && claim.blockedAt) {
479
+ const timeSinceBlocked = now.getTime() - new Date(claim.blockedAt).getTime();
480
+ if (timeSinceBlocked > blockedThresholdMs) {
481
+ return 'blocked';
482
+ }
483
+ }
484
+ // Check if stale
485
+ const timeSinceActivity = now.getTime() - new Date(claim.lastActivityAt).getTime();
486
+ if (timeSinceActivity > staleThresholdMs) {
487
+ return 'stale';
488
+ }
489
+ // Default to overloaded
490
+ return 'overloaded';
491
+ }
492
+ /**
493
+ * Determine who resolved the contest
494
+ */
495
+ determineResolver(winner, contestInfo) {
496
+ const now = new Date();
497
+ // Check if window expired (timeout)
498
+ if (now > contestInfo.windowEndsAt) {
499
+ return 'timeout';
500
+ }
501
+ // Check if resolved by human
502
+ if (winner.type === 'human') {
503
+ return 'human';
504
+ }
505
+ // Default to queen (coordinator)
506
+ return 'queen';
507
+ }
508
+ /**
509
+ * Create a steal error result
510
+ */
511
+ stealError(errorCode, error) {
512
+ return {
513
+ success: false,
514
+ error,
515
+ errorCode,
516
+ };
517
+ }
518
+ // ===========================================================================
519
+ // Event Emission
520
+ // ===========================================================================
521
+ /**
522
+ * Emit IssueMarkedStealable event
523
+ */
524
+ async emitMarkedStealableEvent(claim, info) {
525
+ const event = {
526
+ id: `evt-${randomUUID()}`,
527
+ type: 'IssueMarkedStealable',
528
+ timestamp: new Date(),
529
+ issueId: claim.issueId,
530
+ claimId: claim.id,
531
+ payload: {
532
+ info,
533
+ currentClaimant: claim.claimant,
534
+ claim,
535
+ },
536
+ };
537
+ await this.eventBus.emit(event);
538
+ }
539
+ /**
540
+ * Emit IssueStolen event
541
+ */
542
+ async emitStolenEvent(claim, previousClaimant, newClaimant, stealableInfo, contestWindowEndsAt) {
543
+ const event = {
544
+ id: `evt-${randomUUID()}`,
545
+ type: 'IssueStolen',
546
+ timestamp: new Date(),
547
+ issueId: claim.issueId,
548
+ claimId: claim.id,
549
+ payload: {
550
+ previousClaimant,
551
+ newClaimant,
552
+ stealableInfo,
553
+ contestWindowEndsAt,
554
+ },
555
+ };
556
+ await this.eventBus.emit(event);
557
+ }
558
+ /**
559
+ * Emit StealContested event
560
+ */
561
+ async emitContestEvent(claim) {
562
+ const event = {
563
+ id: `evt-${randomUUID()}`,
564
+ type: 'StealContested',
565
+ timestamp: new Date(),
566
+ issueId: claim.issueId,
567
+ claimId: claim.id,
568
+ payload: {
569
+ contestInfo: claim.contestInfo,
570
+ claim,
571
+ },
572
+ };
573
+ await this.eventBus.emit(event);
574
+ }
575
+ /**
576
+ * Emit StealContestResolved event
577
+ */
578
+ async emitContestResolvedEvent(claim, resolution) {
579
+ const event = {
580
+ id: `evt-${randomUUID()}`,
581
+ type: 'StealContestResolved',
582
+ timestamp: new Date(),
583
+ issueId: claim.issueId,
584
+ claimId: claim.id,
585
+ payload: {
586
+ contestInfo: claim.contestInfo,
587
+ resolution,
588
+ winnerClaim: claim,
589
+ },
590
+ };
591
+ await this.eventBus.emit(event);
592
+ }
593
+ }
594
+ // =============================================================================
595
+ // Factory Function
596
+ // =============================================================================
597
+ /**
598
+ * Create a new WorkStealingService with default event bus
599
+ */
600
+ export function createWorkStealingService(repository, config, eventBus) {
601
+ const bus = eventBus ?? new InMemoryWorkStealingEventBus();
602
+ return new WorkStealingService(repository, bus, config);
603
+ }
604
+ //# sourceMappingURL=work-stealing-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-stealing-service.js","sourceRoot":"","sources":["../../src/application/work-stealing-service.ts"],"names":[],"mappings":"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"}