@cuylabs/agent-core 4.10.0 → 5.0.0

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 (155) hide show
  1. package/dist/agent/chat-loop/commit-batch.d.ts +1 -1
  2. package/dist/agent/chat-loop/commit-batch.d.ts.map +1 -1
  3. package/dist/agent/chat-loop/context-recovery.d.ts +7 -3
  4. package/dist/agent/chat-loop/context-recovery.d.ts.map +1 -1
  5. package/dist/agent/chat-loop/finalize-turn.d.ts.map +1 -1
  6. package/dist/agent/chat-loop/loop.d.ts.map +1 -1
  7. package/dist/agent/chat-loop/model-step-snapshot.d.ts +1 -1
  8. package/dist/agent/chat-loop/model-step-snapshot.d.ts.map +1 -1
  9. package/dist/agent/chat-loop/types.d.ts +1 -1
  10. package/dist/agent/chat-loop/types.d.ts.map +1 -1
  11. package/dist/agent/event-printer.d.ts.map +1 -1
  12. package/dist/agent/fork.d.ts +1 -1
  13. package/dist/agent/fork.d.ts.map +1 -1
  14. package/dist/agent/index.d.ts +1 -1
  15. package/dist/agent/index.d.ts.map +1 -1
  16. package/dist/agent/instance/context-management.d.ts +14 -1
  17. package/dist/agent/instance/context-management.d.ts.map +1 -1
  18. package/dist/agent/instance/forking.d.ts +1 -1
  19. package/dist/agent/instance/forking.d.ts.map +1 -1
  20. package/dist/agent/instance/index.d.ts +17 -5
  21. package/dist/agent/instance/index.d.ts.map +1 -1
  22. package/dist/agent/instance/sessions.d.ts +1 -1
  23. package/dist/agent/instance/sessions.d.ts.map +1 -1
  24. package/dist/agent/instance/turn-lifecycle.d.ts +1 -1
  25. package/dist/agent/instance/turn-lifecycle.d.ts.map +1 -1
  26. package/dist/agent/session.d.ts +1 -1
  27. package/dist/agent/session.d.ts.map +1 -1
  28. package/dist/agent/setup/config.d.ts +1 -1
  29. package/dist/agent/setup/config.d.ts.map +1 -1
  30. package/dist/agent/setup/context-window.d.ts.map +1 -1
  31. package/dist/agent/setup.d.ts +1 -1
  32. package/dist/agent/setup.d.ts.map +1 -1
  33. package/dist/agent/turn-context/compaction/agent-context.d.ts +26 -3
  34. package/dist/agent/turn-context/compaction/agent-context.d.ts.map +1 -1
  35. package/dist/agent/turn-context/compaction/budget.d.ts +2 -2
  36. package/dist/agent/turn-context/compaction/budget.d.ts.map +1 -1
  37. package/dist/agent/turn-context/compaction/check.d.ts +9 -3
  38. package/dist/agent/turn-context/compaction/check.d.ts.map +1 -1
  39. package/dist/agent/turn-context/compaction/index.d.ts +1 -1
  40. package/dist/agent/turn-context/compaction/index.d.ts.map +1 -1
  41. package/dist/agent/turn-context/compaction/memory.d.ts +5 -4
  42. package/dist/agent/turn-context/compaction/memory.d.ts.map +1 -1
  43. package/dist/agent/turn-context/compaction/results.d.ts +7 -1
  44. package/dist/agent/turn-context/compaction/results.d.ts.map +1 -1
  45. package/dist/agent/turn-context/compaction/types.d.ts +7 -1
  46. package/dist/agent/turn-context/compaction/types.d.ts.map +1 -1
  47. package/dist/agent/turn-context/fit-model-context.d.ts +1 -1
  48. package/dist/agent/turn-context/fit-model-context.d.ts.map +1 -1
  49. package/dist/agent/turn-context/index.d.ts +1 -1
  50. package/dist/agent/turn-context/index.d.ts.map +1 -1
  51. package/dist/agent/types/config.d.ts +7 -0
  52. package/dist/agent/types/config.d.ts.map +1 -1
  53. package/dist/{chunk-LX4AHGI3.js → chunk-346FIYKT.js} +1 -1
  54. package/dist/{chunk-EBVSPHXA.js → chunk-556CPZ3J.js} +1 -1
  55. package/dist/{chunk-V4YQ6MBK.js → chunk-BKHWKKSG.js} +1 -1
  56. package/dist/{chunk-AAGKWUXR.js → chunk-CGP6UNCQ.js} +33 -18
  57. package/dist/{chunk-EEAGM5MS.js → chunk-DD7S7ZG4.js} +32 -15
  58. package/dist/{chunk-NMJNN6LS.js → chunk-DYZGHHDB.js} +424 -121
  59. package/dist/{chunk-VMGZKIFT.js → chunk-EDKZOPUV.js} +34 -298
  60. package/dist/{chunk-TU5KDFWI.js → chunk-GHVW7L4P.js} +41 -0
  61. package/dist/{chunk-IQA64CAO.js → chunk-TYQWH6XH.js} +6 -2
  62. package/dist/context/assembly/prepare.d.ts.map +1 -1
  63. package/dist/context/assembly/types.d.ts +6 -2
  64. package/dist/context/assembly/types.d.ts.map +1 -1
  65. package/dist/context/config.d.ts +10 -1
  66. package/dist/context/config.d.ts.map +1 -1
  67. package/dist/context/fragments/messages.d.ts +2 -0
  68. package/dist/context/fragments/messages.d.ts.map +1 -1
  69. package/dist/context/index.js +9 -3
  70. package/dist/context/window/budget.d.ts +28 -1
  71. package/dist/context/window/budget.d.ts.map +1 -1
  72. package/dist/context/window/compactor.d.ts +17 -2
  73. package/dist/context/window/compactor.d.ts.map +1 -1
  74. package/dist/context/window/cut-planner.d.ts +3 -0
  75. package/dist/context/window/cut-planner.d.ts.map +1 -1
  76. package/dist/context/window/decision.d.ts +11 -2
  77. package/dist/context/window/decision.d.ts.map +1 -1
  78. package/dist/context/window/estimation.d.ts +19 -4
  79. package/dist/context/window/estimation.d.ts.map +1 -1
  80. package/dist/context/window/index.d.ts +5 -3
  81. package/dist/context/window/index.d.ts.map +1 -1
  82. package/dist/context/window/manager.d.ts +33 -0
  83. package/dist/context/window/manager.d.ts.map +1 -1
  84. package/dist/context/window/summary.d.ts +9 -0
  85. package/dist/context/window/summary.d.ts.map +1 -1
  86. package/dist/context/window/tool-pruning.d.ts +11 -0
  87. package/dist/context/window/tool-pruning.d.ts.map +1 -1
  88. package/dist/dispatch/index.js +3 -3
  89. package/dist/execution/index.js +3 -3
  90. package/dist/execution/turn/index.js +3 -3
  91. package/dist/index.d.ts +2 -2
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +311 -125
  94. package/dist/memory/config.d.ts +2 -2
  95. package/dist/memory/config.d.ts.map +1 -1
  96. package/dist/memory/index.d.ts +2 -2
  97. package/dist/memory/index.d.ts.map +1 -1
  98. package/dist/memory/index.js +5 -5
  99. package/dist/memory/middleware.d.ts +2 -2
  100. package/dist/memory/middleware.d.ts.map +1 -1
  101. package/dist/memory/types.d.ts +34 -15
  102. package/dist/memory/types.d.ts.map +1 -1
  103. package/dist/middleware/index.d.ts +2 -1
  104. package/dist/middleware/index.d.ts.map +1 -1
  105. package/dist/middleware/index.js +1 -1
  106. package/dist/middleware/runner.d.ts +16 -1
  107. package/dist/middleware/runner.d.ts.map +1 -1
  108. package/dist/middleware/types.d.ts +57 -2
  109. package/dist/middleware/types.d.ts.map +1 -1
  110. package/dist/{storage → sessions}/index.d.ts +7 -8
  111. package/dist/sessions/index.d.ts.map +1 -0
  112. package/dist/{storage → sessions}/index.js +6 -18
  113. package/dist/{storage → sessions}/manager/default.d.ts +3 -3
  114. package/dist/sessions/manager/default.d.ts.map +1 -0
  115. package/dist/sessions/manager/index.d.ts.map +1 -0
  116. package/dist/{storage → sessions}/manager/session-manager.d.ts +14 -4
  117. package/dist/sessions/manager/session-manager.d.ts.map +1 -0
  118. package/dist/sessions/manager/types.d.ts.map +1 -0
  119. package/dist/sessions/store/lock.d.ts.map +1 -0
  120. package/dist/{storage → sessions/store}/memory.d.ts +5 -5
  121. package/dist/sessions/store/memory.d.ts.map +1 -0
  122. package/dist/{storage → sessions}/types.d.ts +16 -6
  123. package/dist/sessions/types.d.ts.map +1 -0
  124. package/dist/{storage → sessions}/utils.d.ts +3 -3
  125. package/dist/sessions/utils.d.ts.map +1 -0
  126. package/dist/subagents/index.js +4 -4
  127. package/dist/types/compaction.d.ts +49 -0
  128. package/dist/types/compaction.d.ts.map +1 -1
  129. package/dist/types/events.d.ts +4 -2
  130. package/dist/types/events.d.ts.map +1 -1
  131. package/dist/types/index.d.ts +1 -1
  132. package/dist/types/index.d.ts.map +1 -1
  133. package/package.json +5 -5
  134. package/dist/storage/file/helpers.d.ts +0 -16
  135. package/dist/storage/file/helpers.d.ts.map +0 -1
  136. package/dist/storage/file/index.d.ts +0 -6
  137. package/dist/storage/file/index.d.ts.map +0 -1
  138. package/dist/storage/file/storage.d.ts +0 -29
  139. package/dist/storage/file/storage.d.ts.map +0 -1
  140. package/dist/storage/file/types.d.ts +0 -6
  141. package/dist/storage/file/types.d.ts.map +0 -1
  142. package/dist/storage/index.d.ts.map +0 -1
  143. package/dist/storage/lock.d.ts.map +0 -1
  144. package/dist/storage/manager/default.d.ts.map +0 -1
  145. package/dist/storage/manager/index.d.ts.map +0 -1
  146. package/dist/storage/manager/session-manager.d.ts.map +0 -1
  147. package/dist/storage/manager/types.d.ts.map +0 -1
  148. package/dist/storage/memory.d.ts.map +0 -1
  149. package/dist/storage/paths.d.ts +0 -37
  150. package/dist/storage/paths.d.ts.map +0 -1
  151. package/dist/storage/types.d.ts.map +0 -1
  152. package/dist/storage/utils.d.ts.map +0 -1
  153. /package/dist/{storage → sessions}/manager/index.d.ts +0 -0
  154. /package/dist/{storage → sessions}/manager/types.d.ts +0 -0
  155. /package/dist/{storage → sessions/store}/lock.d.ts +0 -0
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createAgentContextFragmentMessage
3
- } from "./chunk-AAGKWUXR.js";
3
+ } from "./chunk-CGP6UNCQ.js";
4
4
 
5
- // src/storage/types.ts
6
- var STORAGE_VERSION = 1;
5
+ // src/sessions/types.ts
6
+ var SESSION_FORMAT_VERSION = 1;
7
7
 
8
- // src/storage/utils.ts
8
+ // src/sessions/utils.ts
9
9
  function generateEntryId(existingIds) {
10
10
  for (let i = 0; i < 100; i++) {
11
11
  const id = crypto.randomUUID().slice(0, 8);
@@ -298,8 +298,8 @@ function normalizeRecentMessagesLimit(limit) {
298
298
  return Math.floor(limit);
299
299
  }
300
300
 
301
- // src/storage/memory.ts
302
- var MemoryStorage = class {
301
+ // src/sessions/store/memory.ts
302
+ var InMemorySessionStore = class {
303
303
  sessions = /* @__PURE__ */ new Map();
304
304
  async create(header) {
305
305
  if (this.sessions.has(header.id)) {
@@ -350,224 +350,7 @@ var MemoryStorage = class {
350
350
  }
351
351
  };
352
352
 
353
- // src/storage/file/helpers.ts
354
- import {
355
- appendFile,
356
- mkdir,
357
- readFile,
358
- readdir,
359
- stat,
360
- unlink,
361
- writeFile
362
- } from "fs/promises";
363
- import { existsSync } from "fs";
364
- import { basename, join } from "path";
365
- async function ensureStorageDirectory(directory) {
366
- if (!existsSync(directory)) {
367
- await mkdir(directory, { recursive: true });
368
- }
369
- }
370
- function getSessionFilePath(directory, extension, sessionId) {
371
- const safeId = sessionId.replace(/[^a-zA-Z0-9-_]/g, "_");
372
- const needsHash = safeId !== sessionId;
373
- if (needsHash) {
374
- let hash = 2166136261;
375
- for (let i = 0; i < sessionId.length; i++) {
376
- hash ^= sessionId.charCodeAt(i);
377
- hash = hash * 16777619 >>> 0;
378
- }
379
- const suffix = hash.toString(16).padStart(8, "0");
380
- return join(directory, `${safeId}_${suffix}${extension}`);
381
- }
382
- return join(directory, `${safeId}${extension}`);
383
- }
384
- async function loadEntriesFromDisk(filePath, sessionId) {
385
- try {
386
- const content = await readFile(filePath, "utf-8");
387
- return parseJSONL(content);
388
- } catch (error) {
389
- if (error.code === "ENOENT") {
390
- throw new Error(`Session not found: ${sessionId}`);
391
- }
392
- throw error;
393
- }
394
- }
395
- async function createSessionFile(filePath, header) {
396
- await writeFile(filePath, toJSONL(header), "utf-8");
397
- }
398
- async function appendSessionEntry(filePath, entry) {
399
- await appendFile(filePath, toJSONL(entry), "utf-8");
400
- }
401
- async function appendSessionEntries(filePath, entries) {
402
- await appendFile(filePath, toJSONLBatch(entries), "utf-8");
403
- }
404
- function sessionFileExists(filePath) {
405
- return existsSync(filePath);
406
- }
407
- async function deleteSessionFile(filePath) {
408
- if (!existsSync(filePath)) {
409
- return false;
410
- }
411
- try {
412
- await unlink(filePath);
413
- return true;
414
- } catch {
415
- return false;
416
- }
417
- }
418
- async function listSessionIds(directory, extension) {
419
- try {
420
- const files = await readdir(directory);
421
- return files.filter((file) => file.endsWith(extension)).map((file) => basename(file, extension));
422
- } catch {
423
- return [];
424
- }
425
- }
426
- async function clearSessionFiles(directory, extension) {
427
- try {
428
- const files = await readdir(directory);
429
- await Promise.all(
430
- files.filter((file) => file.endsWith(extension)).map((file) => unlink(join(directory, file)).catch(() => {
431
- }))
432
- );
433
- } catch {
434
- }
435
- }
436
- async function getSessionFileStats(filePath) {
437
- try {
438
- const info = await stat(filePath);
439
- return {
440
- size: info.size,
441
- mtime: info.mtime
442
- };
443
- } catch {
444
- return null;
445
- }
446
- }
447
-
448
- // src/storage/file/storage.ts
449
- var FileStorage = class {
450
- directory;
451
- extension;
452
- useCache;
453
- cache = /* @__PURE__ */ new Map();
454
- initialized = false;
455
- constructor(options) {
456
- this.directory = options.directory;
457
- this.extension = options.extension ?? ".jsonl";
458
- this.useCache = options.cache ?? true;
459
- }
460
- async ensureDir() {
461
- if (this.initialized) return;
462
- await ensureStorageDirectory(this.directory);
463
- this.initialized = true;
464
- }
465
- getPath(sessionId) {
466
- return getSessionFilePath(this.directory, this.extension, sessionId);
467
- }
468
- async getEntries(sessionId) {
469
- if (this.useCache && this.cache.has(sessionId)) {
470
- return this.cache.get(sessionId);
471
- }
472
- const entries = await loadEntriesFromDisk(
473
- this.getPath(sessionId),
474
- sessionId
475
- );
476
- if (this.useCache) {
477
- this.cache.set(sessionId, entries);
478
- }
479
- return entries;
480
- }
481
- async create(header) {
482
- await this.ensureDir();
483
- const filePath = this.getPath(header.id);
484
- if (sessionFileExists(filePath)) {
485
- throw new Error(`Session already exists: ${header.id}`);
486
- }
487
- await createSessionFile(filePath, header);
488
- if (this.useCache) {
489
- this.cache.set(header.id, [header]);
490
- }
491
- }
492
- async append(sessionId, entry) {
493
- await this.ensureDir();
494
- const filePath = this.getPath(sessionId);
495
- if (!sessionFileExists(filePath)) {
496
- throw new Error(`Session not found: ${sessionId}`);
497
- }
498
- await appendSessionEntry(filePath, entry);
499
- if (this.useCache) {
500
- this.cache.get(sessionId)?.push(entry);
501
- }
502
- }
503
- async appendBatch(sessionId, entries) {
504
- if (entries.length === 0) return;
505
- await this.ensureDir();
506
- const filePath = this.getPath(sessionId);
507
- if (!sessionFileExists(filePath)) {
508
- throw new Error(`Session not found: ${sessionId}`);
509
- }
510
- await appendSessionEntries(filePath, entries);
511
- if (this.useCache) {
512
- this.cache.get(sessionId)?.push(...entries);
513
- }
514
- }
515
- async read(sessionId) {
516
- await this.ensureDir();
517
- return [...await this.getEntries(sessionId)];
518
- }
519
- async delete(sessionId) {
520
- this.cache.delete(sessionId);
521
- return deleteSessionFile(this.getPath(sessionId));
522
- }
523
- async exists(sessionId) {
524
- if (this.useCache && this.cache.has(sessionId)) {
525
- return true;
526
- }
527
- return sessionFileExists(this.getPath(sessionId));
528
- }
529
- async list() {
530
- await this.ensureDir();
531
- const infos = [];
532
- for (const sessionId of await listSessionIds(
533
- this.directory,
534
- this.extension
535
- )) {
536
- try {
537
- const info = extractSessionInfo(
538
- await this.getEntries(sessionId),
539
- this.getPath(sessionId)
540
- );
541
- if (info) {
542
- infos.push(info);
543
- }
544
- } catch {
545
- }
546
- }
547
- infos.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
548
- return infos;
549
- }
550
- async clear() {
551
- this.cache.clear();
552
- await clearSessionFiles(this.directory, this.extension);
553
- }
554
- flushCache() {
555
- this.cache.clear();
556
- }
557
- async reload(sessionId) {
558
- this.cache.delete(sessionId);
559
- return this.read(sessionId);
560
- }
561
- async listIds() {
562
- await this.ensureDir();
563
- return listSessionIds(this.directory, this.extension);
564
- }
565
- async getStats(sessionId) {
566
- return getSessionFileStats(this.getPath(sessionId));
567
- }
568
- };
569
-
570
- // src/storage/lock.ts
353
+ // src/sessions/store/lock.ts
571
354
  var LocalSessionTurnLock = class {
572
355
  locks = /* @__PURE__ */ new Map();
573
356
  async acquire(sessionId, options = {}) {
@@ -642,74 +425,29 @@ function createAbortError() {
642
425
  return error;
643
426
  }
644
427
 
645
- // src/storage/paths.ts
646
- import { homedir } from "os";
647
- import { join as join2 } from "path";
648
- import { execSync } from "child_process";
649
- function getDataDir(appName = "cuylabs") {
650
- const platform = process.platform;
651
- if (platform === "darwin") {
652
- return join2(homedir(), `.${appName}`);
653
- }
654
- if (platform === "win32") {
655
- return join2(
656
- process.env.APPDATA || join2(homedir(), "AppData", "Roaming"),
657
- appName
658
- );
659
- }
660
- const xdgData = process.env.XDG_DATA_HOME || join2(homedir(), ".local", "share");
661
- return join2(xdgData, appName);
662
- }
663
- function getSessionsDir(appName = "cuylabs") {
664
- return join2(getDataDir(appName), "sessions");
665
- }
666
- function getGitRootHash(cwd) {
667
- try {
668
- const result = execSync("git rev-list --max-parents=0 --all 2>/dev/null", {
669
- cwd,
670
- encoding: "utf-8"
671
- });
672
- const roots = result.split("\n").filter(Boolean).map((s) => s.trim()).sort();
673
- return roots[0] || null;
674
- } catch {
675
- return null;
676
- }
677
- }
678
- function getProjectId(cwd) {
679
- const gitHash = getGitRootHash(cwd);
680
- if (gitHash) {
681
- return gitHash.slice(0, 12);
682
- }
683
- return cwd.replace(/^\//, "").replace(/[/\\:]/g, "-").replace(/\s+/g, "-").toLowerCase().slice(-50);
684
- }
685
- function getProjectSessionsDir(cwd, appName = "cuylabs") {
686
- const projectId = getProjectId(cwd);
687
- return join2(getSessionsDir(appName), projectId);
688
- }
689
-
690
- // src/storage/manager/session-manager.ts
428
+ // src/sessions/manager/session-manager.ts
691
429
  var SessionManager = class {
692
- storage;
430
+ store;
693
431
  currentSessionId = null;
694
432
  currentLeafId = null;
695
433
  entriesCache = [];
696
434
  idsCache = /* @__PURE__ */ new Set();
697
435
  entriesByIdCache = /* @__PURE__ */ new Map();
698
- constructor(storage) {
699
- this.storage = storage ?? new MemoryStorage();
436
+ constructor(store) {
437
+ this.store = store ?? new InMemorySessionStore();
700
438
  }
701
439
  async create(options) {
702
440
  const id = options.id ?? crypto.randomUUID();
703
441
  const header = {
704
442
  type: "header",
705
- version: STORAGE_VERSION,
443
+ version: SESSION_FORMAT_VERSION,
706
444
  id,
707
445
  cwd: options.cwd,
708
446
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
709
447
  title: options.title,
710
448
  parentSessionId: options.parentSessionId
711
449
  };
712
- await this.storage.create(header);
450
+ await this.store.create(header);
713
451
  this.currentSessionId = id;
714
452
  this.currentLeafId = null;
715
453
  this.entriesCache = [header];
@@ -718,7 +456,7 @@ var SessionManager = class {
718
456
  return id;
719
457
  }
720
458
  async load(sessionId) {
721
- const entries = await this.storage.read(sessionId);
459
+ const entries = await this.store.read(sessionId);
722
460
  if (entries.length === 0) {
723
461
  throw new Error(`Empty session: ${sessionId}`);
724
462
  }
@@ -750,7 +488,7 @@ var SessionManager = class {
750
488
  this.currentLeafId,
751
489
  this.idsCache
752
490
  );
753
- await this.storage.append(this.currentSessionId, entry);
491
+ await this.store.append(this.currentSessionId, entry);
754
492
  this.entriesCache.push(entry);
755
493
  this.idsCache.add(entry.id);
756
494
  this.entriesByIdCache.set(entry.id, entry);
@@ -773,7 +511,7 @@ var SessionManager = class {
773
511
  this.entriesByIdCache.set(entry.id, entry);
774
512
  parentId = entry.id;
775
513
  }
776
- await this.storage.appendBatch(this.currentSessionId, entries);
514
+ await this.store.appendBatch(this.currentSessionId, entries);
777
515
  this.entriesCache.push(...entries);
778
516
  this.currentLeafId = entries[entries.length - 1].id;
779
517
  return entries.map((entry) => entry.id);
@@ -811,7 +549,7 @@ var SessionManager = class {
811
549
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
812
550
  ...options
813
551
  };
814
- await this.storage.append(this.currentSessionId, entry);
552
+ await this.store.append(this.currentSessionId, entry);
815
553
  this.entriesCache.push(entry);
816
554
  this.idsCache.add(entry.id);
817
555
  this.entriesByIdCache.set(entry.id, entry);
@@ -837,15 +575,19 @@ var SessionManager = class {
837
575
  id: compactionId,
838
576
  parentId: this.currentLeafId,
839
577
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
578
+ ...options.phase ? { phase: options.phase } : {},
579
+ ...options.trigger ? { trigger: options.trigger } : {},
580
+ ...options.reason ? { reason: options.reason } : {},
840
581
  summary: options.summary,
841
582
  ...options.displaySummary === false ? { displaySummary: false } : {},
842
583
  firstKeptEntryId: messageEntries[0]?.id ?? compactionId,
843
584
  tokensBefore: options.tokensBefore,
844
585
  tokensAfter: options.tokensAfter,
586
+ ...options.cutReason ? { cutReason: options.cutReason } : {},
845
587
  ...options.readFiles ? { readFiles: options.readFiles } : {},
846
588
  ...options.modifiedFiles ? { modifiedFiles: options.modifiedFiles } : {}
847
589
  };
848
- await this.storage.appendBatch(this.currentSessionId, [
590
+ await this.store.appendBatch(this.currentSessionId, [
849
591
  compactionEntry,
850
592
  ...messageEntries
851
593
  ]);
@@ -872,7 +614,7 @@ var SessionManager = class {
872
614
  branchFromId: fromEntryId,
873
615
  summary
874
616
  };
875
- await this.storage.append(this.currentSessionId, entry);
617
+ await this.store.append(this.currentSessionId, entry);
876
618
  this.entriesCache.push(entry);
877
619
  this.idsCache.add(entry.id);
878
620
  this.entriesByIdCache.set(entry.id, entry);
@@ -894,7 +636,7 @@ var SessionManager = class {
894
636
  this.currentLeafId,
895
637
  this.idsCache
896
638
  );
897
- await this.storage.append(this.currentSessionId, entry);
639
+ await this.store.append(this.currentSessionId, entry);
898
640
  this.entriesCache.push(entry);
899
641
  this.idsCache.add(entry.id);
900
642
  this.entriesByIdCache.set(entry.id, entry);
@@ -933,10 +675,10 @@ var SessionManager = class {
933
675
  return header?.type === "header" ? header : null;
934
676
  }
935
677
  async listSessions() {
936
- return this.storage.list();
678
+ return this.store.list();
937
679
  }
938
680
  async deleteSession(sessionId) {
939
- const result = await this.storage.delete(sessionId);
681
+ const result = await this.store.delete(sessionId);
940
682
  if (sessionId === this.currentSessionId) {
941
683
  this.currentSessionId = null;
942
684
  this.currentLeafId = null;
@@ -947,14 +689,14 @@ var SessionManager = class {
947
689
  return result;
948
690
  }
949
691
  async sessionExists(sessionId) {
950
- return this.storage.exists(sessionId);
692
+ return this.store.exists(sessionId);
951
693
  }
952
- getStorage() {
953
- return this.storage;
694
+ getStore() {
695
+ return this.store;
954
696
  }
955
697
  };
956
698
 
957
- // src/storage/manager/default.ts
699
+ // src/sessions/manager/default.ts
958
700
  var defaultManager = null;
959
701
  function getDefaultSessionManager() {
960
702
  if (!defaultManager) {
@@ -962,13 +704,13 @@ function getDefaultSessionManager() {
962
704
  }
963
705
  return defaultManager;
964
706
  }
965
- function configureDefaultSessionManager(storage) {
966
- defaultManager = new SessionManager(storage);
707
+ function configureDefaultSessionManager(store) {
708
+ defaultManager = new SessionManager(store);
967
709
  return defaultManager;
968
710
  }
969
711
 
970
712
  export {
971
- STORAGE_VERSION,
713
+ SESSION_FORMAT_VERSION,
972
714
  generateEntryId,
973
715
  parseJSONL,
974
716
  toJSONL,
@@ -983,14 +725,8 @@ export {
983
725
  buildMessagesFromEntries,
984
726
  buildRecentMessagesFromEntries,
985
727
  buildRecentMessagesFromEntryMap,
986
- MemoryStorage,
987
- FileStorage,
728
+ InMemorySessionStore,
988
729
  LocalSessionTurnLock,
989
- getDataDir,
990
- getSessionsDir,
991
- getGitRootHash,
992
- getProjectId,
993
- getProjectSessionsDir,
994
730
  SessionManager,
995
731
  getDefaultSessionManager,
996
732
  configureDefaultSessionManager
@@ -221,6 +221,47 @@ var MiddlewareRunner = class {
221
221
  return contextFragments;
222
222
  }
223
223
  // --------------------------------------------------------------------------
224
+ // context compaction commit lifecycle — before in array order, after in reverse order
225
+ // --------------------------------------------------------------------------
226
+ /**
227
+ * Run all `beforeContextCompactionCommit` hooks in order.
228
+ *
229
+ * Hooks are awaited because durability work, such as memory capture, must
230
+ * complete before old context is replaced. Errors are logged and do not abort
231
+ * compaction.
232
+ */
233
+ async runBeforeContextCompactionCommit(ctx) {
234
+ for (const mw of this.stack) {
235
+ if (!mw.beforeContextCompactionCommit) continue;
236
+ try {
237
+ await mw.beforeContextCompactionCommit(ctx);
238
+ } catch (err) {
239
+ this.log.warn(
240
+ `"${mw.name}" beforeContextCompactionCommit error: ${err instanceof Error ? err.message : String(err)}`
241
+ );
242
+ }
243
+ }
244
+ }
245
+ /**
246
+ * Run all `afterContextCompactionCommit` hooks in reverse order.
247
+ *
248
+ * This mirrors `afterToolCall` / `model.output` ordering. Errors are logged
249
+ * and do not abort the turn.
250
+ */
251
+ async runAfterContextCompactionCommit(ctx) {
252
+ for (let i = this.stack.length - 1; i >= 0; i--) {
253
+ const mw = this.stack[i];
254
+ if (!mw.afterContextCompactionCommit) continue;
255
+ try {
256
+ await mw.afterContextCompactionCommit(ctx);
257
+ } catch (err) {
258
+ this.log.warn(
259
+ `"${mw.name}" afterContextCompactionCommit error: ${err instanceof Error ? err.message : String(err)}`
260
+ );
261
+ }
262
+ }
263
+ }
264
+ // --------------------------------------------------------------------------
224
265
  // onEvent — fire-and-forget, all run
225
266
  // --------------------------------------------------------------------------
226
267
  /**
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  applyAgentContextFragmentsWithReport
3
- } from "./chunk-AAGKWUXR.js";
3
+ } from "./chunk-CGP6UNCQ.js";
4
4
 
5
5
  // src/context/assembly/prepare.ts
6
6
  var DEFAULT_CONTEXT_FRAGMENT_BUDGET_RATIO = 0.1;
@@ -54,10 +54,14 @@ async function assembleModelContext(options) {
54
54
  configured: options.contextFragmentBudget,
55
55
  windowBefore
56
56
  });
57
+ const tokenEstimator = options.window?.getTokenEstimator?.();
57
58
  const contextFragmentResult = applyAgentContextFragmentsWithReport(
58
59
  baseMessages,
59
60
  requestedContextFragments,
60
- contextFragmentBudget ? { budget: contextFragmentBudget } : {}
61
+ {
62
+ ...contextFragmentBudget ? { budget: contextFragmentBudget } : {},
63
+ ...tokenEstimator ? { tokenEstimator } : {}
64
+ }
61
65
  );
62
66
  const messages = contextFragmentResult.messages;
63
67
  const windowAfter = options.window?.getStats(messages);
@@ -1 +1 @@
1
- {"version":3,"file":"prepare.d.ts","sourceRoot":"","sources":["../../../src/context/assembly/prepare.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,2BAA2B,EAE3B,0BAA0B,EAC3B,MAAM,YAAY,CAAC;AA+DpB;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC,CAkCrC"}
1
+ {"version":3,"file":"prepare.d.ts","sourceRoot":"","sources":["../../../src/context/assembly/prepare.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,2BAA2B,EAE3B,0BAA0B,EAC3B,MAAM,YAAY,CAAC;AA+DpB;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC,CAsCrC"}
@@ -1,9 +1,10 @@
1
1
  import type { Message } from "../../types/messages.js";
2
- import type { CompactionCutReason, CompactionEffectiveness } from "../../types/compaction.js";
2
+ import type { CompactionCutReason, CompactionEffectiveness, CompactionReason, CompactionTrigger } from "../../types/compaction.js";
3
3
  import type { AgentContextFragmentApplyReport, AgentContextFragmentBuildContext, AgentContextFragmentBudgetOptions, AgentContextFragmentInput } from "../fragments/types.js";
4
4
  import type { ContextCompactionDecision } from "../window/decision.js";
5
5
  import type { ContextWindowStats } from "../window/manager.js";
6
- export type ModelContextCompactionPhase = "pre-step" | "recovery" | "post-turn";
6
+ import type { ContextTokenEstimator } from "../window/estimation.js";
7
+ export type ModelContextCompactionPhase = "pre-step" | "recovery" | "post-turn" | "manual";
7
8
  export interface ContextFragmentCollector {
8
9
  hasMiddleware?: boolean;
9
10
  collectContextFragments(context: AgentContextFragmentBuildContext): Promise<AgentContextFragmentInput[]>;
@@ -22,12 +23,15 @@ export interface ModelContextAssemblyOptions {
22
23
  contextFragmentBudget?: AgentContextFragmentBudgetOptions;
23
24
  window?: {
24
25
  getStats(messages: readonly Message[]): ContextWindowStats;
26
+ getTokenEstimator?(): ContextTokenEstimator | undefined;
25
27
  };
26
28
  compaction?: ModelContextCompactionReport;
27
29
  }
28
30
  export interface ModelContextCompactionReport {
29
31
  applied: boolean;
30
32
  phase: ModelContextCompactionPhase;
33
+ trigger?: CompactionTrigger;
34
+ reason?: CompactionReason;
31
35
  inputTokens: number;
32
36
  limit: number;
33
37
  decision: ContextCompactionDecision;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/context/assembly/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EACV,mBAAmB,EACnB,uBAAuB,EACxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EACV,+BAA+B,EAC/B,gCAAgC,EAChC,iCAAiC,EACjC,yBAAyB,EAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,MAAM,2BAA2B,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;AAEhF,MAAM,WAAW,wBAAwB;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,uBAAuB,CACrB,OAAO,EAAE,gCAAgC,GACxC,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,wBAAwB,CAAC,EAAE,wBAAwB,CAAC;IACpD,gBAAgB,CAAC,EAAE,SAAS,yBAAyB,EAAE,CAAC;IACxD,qBAAqB,CAAC,EAAE,iCAAiC,CAAC;IAC1D,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,kBAAkB,CAAC;KAC5D,CAAC;IACF,UAAU,CAAC,EAAE,4BAA4B,CAAC;CAC3C;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,2BAA2B,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,yBAAyB,CAAC;IACpC,aAAa,EAAE,uBAAuB,CAAC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACjC;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,gBAAgB,EAAE,+BAA+B,CAAC;IAClD,MAAM,EAAE;QACN,MAAM,CAAC,EAAE,kBAAkB,CAAC;QAC5B,KAAK,CAAC,EAAE,kBAAkB,CAAC;KAC5B,CAAC;IACF,UAAU,CAAC,EAAE,4BAA4B,CAAC;CAC3C;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,0BAA0B,CAAC;CACpC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/context/assembly/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EACV,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EACV,+BAA+B,EAC/B,gCAAgC,EAChC,iCAAiC,EACjC,yBAAyB,EAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE,MAAM,MAAM,2BAA2B,GACnC,UAAU,GACV,UAAU,GACV,WAAW,GACX,QAAQ,CAAC;AAEb,MAAM,WAAW,wBAAwB;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,uBAAuB,CACrB,OAAO,EAAE,gCAAgC,GACxC,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,wBAAwB,CAAC,EAAE,wBAAwB,CAAC;IACpD,gBAAgB,CAAC,EAAE,SAAS,yBAAyB,EAAE,CAAC;IACxD,qBAAqB,CAAC,EAAE,iCAAiC,CAAC;IAC1D,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,kBAAkB,CAAC;QAC3D,iBAAiB,CAAC,IAAI,qBAAqB,GAAG,SAAS,CAAC;KACzD,CAAC;IACF,UAAU,CAAC,EAAE,4BAA4B,CAAC;CAC3C;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,2BAA2B,CAAC;IACnC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,yBAAyB,CAAC;IACpC,aAAa,EAAE,uBAAuB,CAAC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACjC;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,gBAAgB,EAAE,+BAA+B,CAAC;IAClD,MAAM,EAAE;QACN,MAAM,CAAC,EAAE,kBAAkB,CAAC;QAC5B,KAAK,CAAC,EAAE,kBAAkB,CAAC;KAC5B,CAAC;IACF,UAAU,CAAC,EAAE,4BAA4B,CAAC;CAC3C;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,0BAA0B,CAAC;CACpC"}
@@ -1,3 +1,4 @@
1
+ import type { ContextTokenEstimator } from "./window/index.js";
1
2
  export interface AgentContextConfig {
2
3
  /**
3
4
  * Maximum estimated tokens allowed for transient context fragments injected
@@ -6,6 +7,14 @@ export interface AgentContextConfig {
6
7
  * When omitted, the runtime uses a proportional cap based on the usable
7
8
  * context window.
8
9
  */
9
- maxEstimatedFragmentTokens?: number;
10
+ maxFragmentTokens?: number;
11
+ /**
12
+ * Optional estimator used by context-window planning.
13
+ *
14
+ * Agent-core still treats these numbers as estimates. Provider usage
15
+ * metadata remains a lower bound when available, and provider overflow
16
+ * recovery is still the final safety net.
17
+ */
18
+ tokenEstimator?: ContextTokenEstimator;
10
19
  }
11
20
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/context/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC;;;;;;OAMG;IACH,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACrC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/context/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/D,MAAM,WAAW,kBAAkB;IACjC;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,qBAAqB,CAAC;CACxC"}
@@ -1,10 +1,12 @@
1
1
  import type { Message } from "../../types/messages.js";
2
+ import { type ContextTokenEstimator } from "../window/estimation.js";
2
3
  import type { AgentContextFragmentApplyResult, AgentContextFragmentBudgetOptions, AgentContextFragmentInput, AgentContextFragmentMessageMetadata } from "./types.js";
3
4
  export declare function createAgentContextFragmentMessage(input: AgentContextFragmentInput): Message;
4
5
  export declare function getAgentContextFragmentMetadata(message: Message): AgentContextFragmentMessageMetadata | undefined;
5
6
  export declare function isAgentContextFragmentMessage(message: Message): boolean;
6
7
  export declare function applyAgentContextFragmentsWithReport(messages: readonly Message[], contextFragments?: readonly AgentContextFragmentInput[], options?: {
7
8
  budget?: AgentContextFragmentBudgetOptions;
9
+ tokenEstimator?: ContextTokenEstimator;
8
10
  }): AgentContextFragmentApplyResult;
9
11
  export declare function applyAgentContextFragments(messages: readonly Message[], contextFragments?: readonly AgentContextFragmentInput[]): Message[];
10
12
  //# sourceMappingURL=messages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/context/fragments/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAOvD,OAAO,KAAK,EAEV,+BAA+B,EAC/B,iCAAiC,EACjC,yBAAyB,EAEzB,mCAAmC,EAIpC,MAAM,YAAY,CAAC;AAapB,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAWT;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,OAAO,GACf,mCAAmC,GAAG,SAAS,CASjD;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAEvE;AA8GD,wBAAgB,oCAAoC,CAClD,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,gBAAgB,GAAE,SAAS,yBAAyB,EAAO,EAC3D,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,iCAAiC,CAAA;CAAO,GAC3D,+BAA+B,CA6GjC;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,gBAAgB,GAAE,SAAS,yBAAyB,EAAO,GAC1D,OAAO,EAAE,CAGX"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/context/fragments/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,yBAAyB,CAAC;AAMjC,OAAO,KAAK,EAEV,+BAA+B,EAC/B,iCAAiC,EACjC,yBAAyB,EAEzB,mCAAmC,EAIpC,MAAM,YAAY,CAAC;AAapB,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAWT;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,OAAO,GACf,mCAAmC,GAAG,SAAS,CASjD;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAEvE;AA8GD,wBAAgB,oCAAoC,CAClD,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,gBAAgB,GAAE,SAAS,yBAAyB,EAAO,EAC3D,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,iCAAiC,CAAC;IAC3C,cAAc,CAAC,EAAE,qBAAqB,CAAC;CACnC,GACL,+BAA+B,CAgHjC;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,gBAAgB,GAAE,SAAS,yBAAyB,EAAO,GAC1D,OAAO,EAAE,CAGX"}