@defai.digital/session-domain 13.0.3

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.
@@ -0,0 +1,609 @@
1
+ /**
2
+ * Session Manager Implementation
3
+ *
4
+ * Manages session lifecycle, participants, and tasks.
5
+ */
6
+ import { SessionErrorCode, isValidSessionTransition, isValidTaskTransition, } from '@defai.digital/contracts';
7
+ /**
8
+ * Default session manager implementation
9
+ *
10
+ * Emits events for all state changes when an event emitter is provided.
11
+ * INV-SESS-EVENT: All state changes MUST emit corresponding events
12
+ */
13
+ export class DefaultSessionManager {
14
+ store;
15
+ config;
16
+ eventEmitter;
17
+ eventVersion = 1;
18
+ constructor(store, config, eventEmitter) {
19
+ this.store = store;
20
+ this.config = config;
21
+ this.eventEmitter = eventEmitter;
22
+ }
23
+ /**
24
+ * Emits a session event if an event emitter is configured
25
+ * INV-SESS-EVENT: Events emitted for all state changes
26
+ *
27
+ * Event structure follows the contract schema:
28
+ * - aggregateId: the session ID
29
+ * - type: 'session.created' | 'session.agentJoined' | etc.
30
+ * - payload: discriminated union with type: 'created' | 'agentJoined' | etc.
31
+ */
32
+ emitEvent(type, sessionId, payload, correlationId) {
33
+ if (this.eventEmitter === undefined)
34
+ return;
35
+ const event = {
36
+ eventId: crypto.randomUUID(),
37
+ aggregateId: sessionId,
38
+ type,
39
+ payload,
40
+ timestamp: new Date().toISOString(),
41
+ version: this.eventVersion++,
42
+ correlationId: correlationId ?? crypto.randomUUID(),
43
+ };
44
+ this.eventEmitter.emit(event);
45
+ }
46
+ /**
47
+ * Create a new session
48
+ */
49
+ async createSession(input) {
50
+ const session = await this.store.create(input);
51
+ // Emit session.created event
52
+ this.emitEvent('session.created', session.sessionId, {
53
+ type: 'created',
54
+ initiator: input.initiator,
55
+ task: input.task,
56
+ });
57
+ return session;
58
+ }
59
+ /**
60
+ * Get a session by ID
61
+ */
62
+ async getSession(sessionId) {
63
+ return this.store.get(sessionId);
64
+ }
65
+ /**
66
+ * Join an existing session
67
+ */
68
+ async joinSession(input) {
69
+ const session = await this.store.get(input.sessionId);
70
+ if (session === undefined) {
71
+ throw new SessionError(SessionErrorCode.SESSION_NOT_FOUND, `Session ${input.sessionId} not found`);
72
+ }
73
+ if (session.status !== 'active') {
74
+ throw new SessionError(SessionErrorCode.SESSION_ALREADY_COMPLETED, `Session ${input.sessionId} is ${session.status}`);
75
+ }
76
+ // Check if already a participant
77
+ const existingParticipant = session.participants.find((p) => p.agentId === input.agentId && p.leftAt === undefined);
78
+ if (existingParticipant !== undefined) {
79
+ return session; // Already joined
80
+ }
81
+ // Check max participants
82
+ const activeParticipants = session.participants.filter((p) => p.leftAt === undefined);
83
+ if (activeParticipants.length >= this.config.maxParticipants) {
84
+ throw new SessionError(SessionErrorCode.SESSION_MAX_PARTICIPANTS, `Session ${input.sessionId} has reached max participants (${this.config.maxParticipants})`);
85
+ }
86
+ // Add participant
87
+ const newParticipant = {
88
+ agentId: input.agentId,
89
+ role: input.role ?? 'collaborator',
90
+ joinedAt: new Date().toISOString(),
91
+ tasks: [],
92
+ };
93
+ const updatedSession = {
94
+ sessionId: session.sessionId,
95
+ initiator: session.initiator,
96
+ task: session.task,
97
+ participants: [...session.participants, newParticipant],
98
+ status: session.status,
99
+ createdAt: session.createdAt,
100
+ updatedAt: new Date().toISOString(),
101
+ completedAt: session.completedAt,
102
+ version: session.version + 1,
103
+ workspace: session.workspace,
104
+ metadata: session.metadata,
105
+ appliedPolicies: session.appliedPolicies ?? [],
106
+ };
107
+ await this.store.update(input.sessionId, updatedSession);
108
+ // Emit session.agentJoined event
109
+ this.emitEvent('session.agentJoined', input.sessionId, {
110
+ type: 'agentJoined',
111
+ agentId: input.agentId,
112
+ role: newParticipant.role,
113
+ });
114
+ return updatedSession;
115
+ }
116
+ /**
117
+ * Leave a session
118
+ */
119
+ async leaveSession(sessionId, agentId) {
120
+ const session = await this.store.get(sessionId);
121
+ if (session === undefined) {
122
+ throw new SessionError(SessionErrorCode.SESSION_NOT_FOUND, `Session ${sessionId} not found`);
123
+ }
124
+ const participantIndex = session.participants.findIndex((p) => p.agentId === agentId && p.leftAt === undefined);
125
+ if (participantIndex === -1) {
126
+ throw new SessionError(SessionErrorCode.SESSION_AGENT_NOT_PARTICIPANT, `Agent ${agentId} is not a participant in session ${sessionId}`);
127
+ }
128
+ // Update participant with leftAt timestamp
129
+ const participant = session.participants[participantIndex];
130
+ if (participant === undefined) {
131
+ throw new SessionError(SessionErrorCode.SESSION_AGENT_NOT_PARTICIPANT, `Agent ${agentId} is not a participant in session ${sessionId}`);
132
+ }
133
+ const updatedParticipant = {
134
+ agentId: participant.agentId,
135
+ role: participant.role,
136
+ joinedAt: participant.joinedAt,
137
+ leftAt: new Date().toISOString(),
138
+ tasks: participant.tasks,
139
+ metadata: participant.metadata,
140
+ };
141
+ const updatedParticipants = [...session.participants];
142
+ updatedParticipants[participantIndex] = updatedParticipant;
143
+ const updatedSession = {
144
+ sessionId: session.sessionId,
145
+ initiator: session.initiator,
146
+ task: session.task,
147
+ participants: updatedParticipants,
148
+ status: session.status,
149
+ createdAt: session.createdAt,
150
+ updatedAt: new Date().toISOString(),
151
+ completedAt: session.completedAt,
152
+ version: session.version + 1,
153
+ workspace: session.workspace,
154
+ metadata: session.metadata,
155
+ appliedPolicies: session.appliedPolicies ?? [],
156
+ };
157
+ await this.store.update(sessionId, updatedSession);
158
+ // Emit session.agentLeft event
159
+ this.emitEvent('session.agentLeft', sessionId, {
160
+ type: 'agentLeft',
161
+ agentId,
162
+ });
163
+ return updatedSession;
164
+ }
165
+ /**
166
+ * Start a task within a session
167
+ */
168
+ async startTask(input) {
169
+ const session = await this.store.get(input.sessionId);
170
+ if (session === undefined) {
171
+ throw new SessionError(SessionErrorCode.SESSION_NOT_FOUND, `Session ${input.sessionId} not found`);
172
+ }
173
+ if (session.status !== 'active') {
174
+ throw new SessionError(SessionErrorCode.SESSION_ALREADY_COMPLETED, `Session ${input.sessionId} is ${session.status}`);
175
+ }
176
+ // Find participant
177
+ const participantIndex = session.participants.findIndex((p) => p.agentId === input.agentId && p.leftAt === undefined);
178
+ if (participantIndex === -1) {
179
+ throw new SessionError(SessionErrorCode.SESSION_AGENT_NOT_PARTICIPANT, `Agent ${input.agentId} is not a participant in session ${input.sessionId}`);
180
+ }
181
+ const participant = session.participants[participantIndex];
182
+ if (participant === undefined) {
183
+ throw new SessionError(SessionErrorCode.SESSION_AGENT_NOT_PARTICIPANT, `Agent ${input.agentId} is not a participant in session ${input.sessionId}`);
184
+ }
185
+ // Check task limit
186
+ if (participant.tasks.length >= this.config.maxTasksPerParticipant) {
187
+ throw new SessionError(SessionErrorCode.SESSION_VALIDATION_ERROR, `Agent ${input.agentId} has reached max tasks (${this.config.maxTasksPerParticipant})`);
188
+ }
189
+ // Create task
190
+ const task = {
191
+ taskId: crypto.randomUUID(),
192
+ title: input.title,
193
+ description: input.description,
194
+ status: 'running',
195
+ startedAt: new Date().toISOString(),
196
+ };
197
+ // Update participant's tasks
198
+ const updatedParticipant = {
199
+ agentId: participant.agentId,
200
+ role: participant.role,
201
+ joinedAt: participant.joinedAt,
202
+ leftAt: participant.leftAt,
203
+ tasks: [...participant.tasks, task],
204
+ metadata: participant.metadata,
205
+ };
206
+ const updatedParticipants = [...session.participants];
207
+ updatedParticipants[participantIndex] = updatedParticipant;
208
+ const updatedSession = {
209
+ sessionId: session.sessionId,
210
+ initiator: session.initiator,
211
+ task: session.task,
212
+ participants: updatedParticipants,
213
+ status: session.status,
214
+ createdAt: session.createdAt,
215
+ updatedAt: new Date().toISOString(),
216
+ completedAt: session.completedAt,
217
+ version: session.version + 1,
218
+ workspace: session.workspace,
219
+ metadata: session.metadata,
220
+ appliedPolicies: session.appliedPolicies ?? [],
221
+ };
222
+ await this.store.update(input.sessionId, updatedSession);
223
+ // Emit session.taskStarted event
224
+ this.emitEvent('session.taskStarted', input.sessionId, {
225
+ type: 'taskStarted',
226
+ taskId: task.taskId,
227
+ agentId: input.agentId,
228
+ title: task.title,
229
+ });
230
+ return task;
231
+ }
232
+ /**
233
+ * Complete a task
234
+ */
235
+ async completeTask(input) {
236
+ const session = await this.store.get(input.sessionId);
237
+ if (session === undefined) {
238
+ throw new SessionError(SessionErrorCode.SESSION_NOT_FOUND, `Session ${input.sessionId} not found`);
239
+ }
240
+ // Find task across all participants
241
+ let foundParticipantIndex = -1;
242
+ let foundTaskIndex = -1;
243
+ for (let pi = 0; pi < session.participants.length; pi++) {
244
+ const participant = session.participants[pi];
245
+ if (participant === undefined)
246
+ continue;
247
+ const ti = participant.tasks.findIndex((t) => t.taskId === input.taskId);
248
+ if (ti !== -1) {
249
+ foundParticipantIndex = pi;
250
+ foundTaskIndex = ti;
251
+ break;
252
+ }
253
+ }
254
+ if (foundParticipantIndex === -1 || foundTaskIndex === -1) {
255
+ throw new SessionError(SessionErrorCode.SESSION_TASK_NOT_FOUND, `Task ${input.taskId} not found in session ${input.sessionId}`);
256
+ }
257
+ const participant = session.participants[foundParticipantIndex];
258
+ if (participant === undefined) {
259
+ throw new SessionError(SessionErrorCode.SESSION_TASK_NOT_FOUND, `Task ${input.taskId} not found in session ${input.sessionId}`);
260
+ }
261
+ const task = participant.tasks[foundTaskIndex];
262
+ if (task === undefined) {
263
+ throw new SessionError(SessionErrorCode.SESSION_TASK_NOT_FOUND, `Task ${input.taskId} not found in session ${input.sessionId}`);
264
+ }
265
+ // Validate transition
266
+ if (!isValidTaskTransition(task.status, 'completed')) {
267
+ throw new SessionError(SessionErrorCode.SESSION_INVALID_TRANSITION, `Cannot transition task from ${task.status} to completed`);
268
+ }
269
+ const now = new Date().toISOString();
270
+ const startTime = new Date(task.startedAt).getTime();
271
+ const durationMs = new Date(now).getTime() - startTime;
272
+ // Update task
273
+ const updatedTask = {
274
+ taskId: task.taskId,
275
+ title: task.title,
276
+ description: task.description,
277
+ status: 'completed',
278
+ startedAt: task.startedAt,
279
+ completedAt: now,
280
+ durationMs,
281
+ output: input.output,
282
+ error: task.error,
283
+ metadata: task.metadata,
284
+ };
285
+ // Update session
286
+ const updatedTasks = [...participant.tasks];
287
+ updatedTasks[foundTaskIndex] = updatedTask;
288
+ const updatedParticipant = {
289
+ agentId: participant.agentId,
290
+ role: participant.role,
291
+ joinedAt: participant.joinedAt,
292
+ leftAt: participant.leftAt,
293
+ tasks: updatedTasks,
294
+ metadata: participant.metadata,
295
+ };
296
+ const updatedParticipants = [...session.participants];
297
+ updatedParticipants[foundParticipantIndex] = updatedParticipant;
298
+ const updatedSession = {
299
+ sessionId: session.sessionId,
300
+ initiator: session.initiator,
301
+ task: session.task,
302
+ participants: updatedParticipants,
303
+ status: session.status,
304
+ createdAt: session.createdAt,
305
+ updatedAt: now,
306
+ completedAt: session.completedAt,
307
+ version: session.version + 1,
308
+ workspace: session.workspace,
309
+ metadata: session.metadata,
310
+ appliedPolicies: session.appliedPolicies ?? [],
311
+ };
312
+ await this.store.update(input.sessionId, updatedSession);
313
+ // Emit session.taskCompleted event
314
+ this.emitEvent('session.taskCompleted', input.sessionId, {
315
+ type: 'taskCompleted',
316
+ taskId: input.taskId,
317
+ agentId: participant.agentId,
318
+ durationMs: updatedTask.durationMs ?? 0,
319
+ output: input.output,
320
+ });
321
+ return updatedTask;
322
+ }
323
+ /**
324
+ * Fail a task
325
+ */
326
+ async failTask(input) {
327
+ const session = await this.store.get(input.sessionId);
328
+ if (session === undefined) {
329
+ throw new SessionError(SessionErrorCode.SESSION_NOT_FOUND, `Session ${input.sessionId} not found`);
330
+ }
331
+ // Find task across all participants
332
+ let foundParticipantIndex = -1;
333
+ let foundTaskIndex = -1;
334
+ for (let pi = 0; pi < session.participants.length; pi++) {
335
+ const participant = session.participants[pi];
336
+ if (participant === undefined)
337
+ continue;
338
+ const ti = participant.tasks.findIndex((t) => t.taskId === input.taskId);
339
+ if (ti !== -1) {
340
+ foundParticipantIndex = pi;
341
+ foundTaskIndex = ti;
342
+ break;
343
+ }
344
+ }
345
+ if (foundParticipantIndex === -1 || foundTaskIndex === -1) {
346
+ throw new SessionError(SessionErrorCode.SESSION_TASK_NOT_FOUND, `Task ${input.taskId} not found in session ${input.sessionId}`);
347
+ }
348
+ const participant = session.participants[foundParticipantIndex];
349
+ if (participant === undefined) {
350
+ throw new SessionError(SessionErrorCode.SESSION_TASK_NOT_FOUND, `Task ${input.taskId} not found in session ${input.sessionId}`);
351
+ }
352
+ const task = participant.tasks[foundTaskIndex];
353
+ if (task === undefined) {
354
+ throw new SessionError(SessionErrorCode.SESSION_TASK_NOT_FOUND, `Task ${input.taskId} not found in session ${input.sessionId}`);
355
+ }
356
+ // Validate transition
357
+ if (!isValidTaskTransition(task.status, 'failed')) {
358
+ throw new SessionError(SessionErrorCode.SESSION_INVALID_TRANSITION, `Cannot transition task from ${task.status} to failed`);
359
+ }
360
+ const now = new Date().toISOString();
361
+ const startTime = new Date(task.startedAt).getTime();
362
+ const durationMs = new Date(now).getTime() - startTime;
363
+ // Update task
364
+ const updatedTask = {
365
+ taskId: task.taskId,
366
+ title: task.title,
367
+ description: task.description,
368
+ status: 'failed',
369
+ startedAt: task.startedAt,
370
+ completedAt: now,
371
+ durationMs,
372
+ output: task.output,
373
+ error: input.error,
374
+ metadata: task.metadata,
375
+ };
376
+ // Update session
377
+ const updatedTasks = [...participant.tasks];
378
+ updatedTasks[foundTaskIndex] = updatedTask;
379
+ const updatedParticipant = {
380
+ agentId: participant.agentId,
381
+ role: participant.role,
382
+ joinedAt: participant.joinedAt,
383
+ leftAt: participant.leftAt,
384
+ tasks: updatedTasks,
385
+ metadata: participant.metadata,
386
+ };
387
+ const updatedParticipants = [...session.participants];
388
+ updatedParticipants[foundParticipantIndex] = updatedParticipant;
389
+ const updatedSession = {
390
+ sessionId: session.sessionId,
391
+ initiator: session.initiator,
392
+ task: session.task,
393
+ participants: updatedParticipants,
394
+ status: session.status,
395
+ createdAt: session.createdAt,
396
+ updatedAt: now,
397
+ completedAt: session.completedAt,
398
+ version: session.version + 1,
399
+ workspace: session.workspace,
400
+ metadata: session.metadata,
401
+ appliedPolicies: session.appliedPolicies ?? [],
402
+ };
403
+ await this.store.update(input.sessionId, updatedSession);
404
+ // Emit session.taskFailed event
405
+ this.emitEvent('session.taskFailed', input.sessionId, {
406
+ type: 'taskFailed',
407
+ taskId: input.taskId,
408
+ agentId: participant.agentId,
409
+ error: input.error,
410
+ });
411
+ return updatedTask;
412
+ }
413
+ /**
414
+ * Complete a session
415
+ */
416
+ async completeSession(sessionId, summary) {
417
+ const session = await this.store.get(sessionId);
418
+ if (session === undefined) {
419
+ throw new SessionError(SessionErrorCode.SESSION_NOT_FOUND, `Session ${sessionId} not found`);
420
+ }
421
+ if (!isValidSessionTransition(session.status, 'completed')) {
422
+ throw new SessionError(SessionErrorCode.SESSION_INVALID_TRANSITION, `Cannot transition session from ${session.status} to completed`);
423
+ }
424
+ const now = new Date().toISOString();
425
+ const updatedSession = {
426
+ sessionId: session.sessionId,
427
+ initiator: session.initiator,
428
+ task: session.task,
429
+ participants: session.participants,
430
+ status: 'completed',
431
+ createdAt: session.createdAt,
432
+ updatedAt: now,
433
+ completedAt: now,
434
+ version: session.version + 1,
435
+ workspace: session.workspace,
436
+ metadata: summary !== undefined
437
+ ? { ...session.metadata, summary }
438
+ : session.metadata,
439
+ appliedPolicies: session.appliedPolicies ?? [],
440
+ };
441
+ await this.store.update(sessionId, updatedSession);
442
+ // Calculate session duration
443
+ const startTime = new Date(session.createdAt).getTime();
444
+ const durationMs = new Date(now).getTime() - startTime;
445
+ // Emit session.completed event
446
+ this.emitEvent('session.completed', sessionId, {
447
+ type: 'completed',
448
+ summary,
449
+ durationMs,
450
+ });
451
+ return updatedSession;
452
+ }
453
+ /**
454
+ * Fail a session
455
+ */
456
+ async failSession(sessionId, error) {
457
+ const session = await this.store.get(sessionId);
458
+ if (session === undefined) {
459
+ throw new SessionError(SessionErrorCode.SESSION_NOT_FOUND, `Session ${sessionId} not found`);
460
+ }
461
+ if (!isValidSessionTransition(session.status, 'failed')) {
462
+ throw new SessionError(SessionErrorCode.SESSION_INVALID_TRANSITION, `Cannot transition session from ${session.status} to failed`);
463
+ }
464
+ const now = new Date().toISOString();
465
+ const updatedSession = {
466
+ sessionId: session.sessionId,
467
+ initiator: session.initiator,
468
+ task: session.task,
469
+ participants: session.participants,
470
+ status: 'failed',
471
+ createdAt: session.createdAt,
472
+ updatedAt: now,
473
+ completedAt: now,
474
+ version: session.version + 1,
475
+ workspace: session.workspace,
476
+ metadata: {
477
+ ...session.metadata,
478
+ error: {
479
+ code: error.code,
480
+ message: error.message,
481
+ taskId: error.taskId,
482
+ details: error.details,
483
+ },
484
+ },
485
+ appliedPolicies: session.appliedPolicies ?? [],
486
+ };
487
+ await this.store.update(sessionId, updatedSession);
488
+ // Emit session.failed event
489
+ this.emitEvent('session.failed', sessionId, {
490
+ type: 'failed',
491
+ error: {
492
+ code: error.code,
493
+ message: error.message,
494
+ taskId: error.taskId,
495
+ retryable: error.retryable,
496
+ details: error.details,
497
+ },
498
+ });
499
+ return updatedSession;
500
+ }
501
+ /**
502
+ * List sessions
503
+ */
504
+ async listSessions(filter) {
505
+ return this.store.list(filter);
506
+ }
507
+ /**
508
+ * Get run history across all sessions
509
+ * Aggregates tasks from all participants across sessions
510
+ */
511
+ async getRunHistory(options) {
512
+ const sessions = await this.store.list();
513
+ const records = [];
514
+ for (const session of sessions) {
515
+ for (const participant of session.participants) {
516
+ // Apply agent filter if specified
517
+ if (options?.agentId !== undefined && participant.agentId !== options.agentId) {
518
+ continue;
519
+ }
520
+ for (const task of participant.tasks) {
521
+ // Map task status to run status
522
+ const runStatus = this.mapTaskStatusToRunStatus(task.status);
523
+ // Apply status filter if specified
524
+ if (options?.status !== undefined && runStatus !== options.status) {
525
+ continue;
526
+ }
527
+ // Build record with optional properties only when defined
528
+ const record = {
529
+ runId: task.taskId,
530
+ agentId: participant.agentId,
531
+ sessionId: session.sessionId,
532
+ task: task.title,
533
+ status: runStatus,
534
+ startedAt: task.startedAt,
535
+ stepsCompleted: task.status === 'completed' ? 1 : 0,
536
+ };
537
+ // Add optional properties only when they have values
538
+ if (task.error?.message !== undefined) {
539
+ record.error = task.error.message;
540
+ }
541
+ if (task.completedAt !== undefined) {
542
+ record.completedAt = task.completedAt;
543
+ }
544
+ if (task.durationMs !== undefined) {
545
+ record.durationMs = task.durationMs;
546
+ }
547
+ if (task.metadata?.tokensUsed !== undefined) {
548
+ record.tokensUsed = task.metadata.tokensUsed;
549
+ }
550
+ if (task.metadata?.providerId !== undefined) {
551
+ record.providerId = task.metadata.providerId;
552
+ }
553
+ records.push(record);
554
+ }
555
+ }
556
+ }
557
+ // Sort by startedAt descending (most recent first)
558
+ records.sort((a, b) => {
559
+ return new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime();
560
+ });
561
+ // Apply limit
562
+ const limit = options?.limit ?? 50;
563
+ return records.slice(0, limit);
564
+ }
565
+ /**
566
+ * Count active sessions
567
+ */
568
+ async countActiveSessions() {
569
+ const sessions = await this.store.list({ status: 'active' });
570
+ return sessions.length;
571
+ }
572
+ /**
573
+ * Maps SessionTask status to RunStatus
574
+ */
575
+ mapTaskStatusToRunStatus(taskStatus) {
576
+ switch (taskStatus) {
577
+ case 'running':
578
+ case 'pending':
579
+ return 'running';
580
+ case 'completed':
581
+ return 'completed';
582
+ case 'failed':
583
+ return 'failed';
584
+ default:
585
+ return 'running';
586
+ }
587
+ }
588
+ }
589
+ /**
590
+ * Session error
591
+ */
592
+ export class SessionError extends Error {
593
+ code;
594
+ constructor(code, message) {
595
+ super(message);
596
+ this.code = code;
597
+ this.name = 'SessionError';
598
+ }
599
+ }
600
+ /**
601
+ * Creates a new session manager
602
+ * @param store - Session store implementation
603
+ * @param config - Session domain configuration
604
+ * @param eventEmitter - Optional event emitter for state change events
605
+ */
606
+ export function createSessionManager(store, config, eventEmitter) {
607
+ return new DefaultSessionManager(store, config, eventEmitter);
608
+ }
609
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}