@a5c-ai/agent-runtime 5.0.1-staging.04ca6ab00d21

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 (170) hide show
  1. package/README.md +23 -0
  2. package/dist/apiResult.d.ts +19 -0
  3. package/dist/apiResult.d.ts.map +1 -0
  4. package/dist/apiResult.js +16 -0
  5. package/dist/background/state.d.ts +14 -0
  6. package/dist/background/state.d.ts.map +1 -0
  7. package/dist/background/state.js +25 -0
  8. package/dist/backgroundProcessRegistry.d.ts +66 -0
  9. package/dist/backgroundProcessRegistry.d.ts.map +1 -0
  10. package/dist/backgroundProcessRegistry.js +202 -0
  11. package/dist/cost/claudeCodeParser.d.ts +81 -0
  12. package/dist/cost/claudeCodeParser.d.ts.map +1 -0
  13. package/dist/cost/claudeCodeParser.js +232 -0
  14. package/dist/cost/collector.d.ts +42 -0
  15. package/dist/cost/collector.d.ts.map +1 -0
  16. package/dist/cost/collector.js +105 -0
  17. package/dist/cost/effectCost.d.ts +23 -0
  18. package/dist/cost/effectCost.d.ts.map +1 -0
  19. package/dist/cost/effectCost.js +26 -0
  20. package/dist/cost/index.d.ts +19 -0
  21. package/dist/cost/index.d.ts.map +1 -0
  22. package/dist/cost/index.js +39 -0
  23. package/dist/cost/journal.d.ts +40 -0
  24. package/dist/cost/journal.d.ts.map +1 -0
  25. package/dist/cost/journal.js +137 -0
  26. package/dist/cost/types.d.ts +164 -0
  27. package/dist/cost/types.d.ts.map +1 -0
  28. package/dist/cost/types.js +228 -0
  29. package/dist/daemon/automationExecutor.d.ts +16 -0
  30. package/dist/daemon/automationExecutor.d.ts.map +1 -0
  31. package/dist/daemon/automationExecutor.js +222 -0
  32. package/dist/daemon/config.d.ts +8 -0
  33. package/dist/daemon/config.d.ts.map +1 -0
  34. package/dist/daemon/config.js +209 -0
  35. package/dist/daemon/daemonLog.d.ts +13 -0
  36. package/dist/daemon/daemonLog.d.ts.map +1 -0
  37. package/dist/daemon/daemonLog.js +64 -0
  38. package/dist/daemon/fileWatcher.d.ts +9 -0
  39. package/dist/daemon/fileWatcher.d.ts.map +1 -0
  40. package/dist/daemon/fileWatcher.js +141 -0
  41. package/dist/daemon/index.d.ts +13 -0
  42. package/dist/daemon/index.d.ts.map +1 -0
  43. package/dist/daemon/index.js +22 -0
  44. package/dist/daemon/lifecycle.d.ts +12 -0
  45. package/dist/daemon/lifecycle.d.ts.map +1 -0
  46. package/dist/daemon/lifecycle.js +257 -0
  47. package/dist/daemon/loop.d.ts +21 -0
  48. package/dist/daemon/loop.d.ts.map +1 -0
  49. package/dist/daemon/loop.js +196 -0
  50. package/dist/daemon/timerScheduler.d.ts +13 -0
  51. package/dist/daemon/timerScheduler.d.ts.map +1 -0
  52. package/dist/daemon/timerScheduler.js +122 -0
  53. package/dist/daemon/types.d.ts +93 -0
  54. package/dist/daemon/types.d.ts.map +1 -0
  55. package/dist/daemon/types.js +25 -0
  56. package/dist/daemon/webhookListener.d.ts +6 -0
  57. package/dist/daemon/webhookListener.d.ts.map +1 -0
  58. package/dist/daemon/webhookListener.js +110 -0
  59. package/dist/execution/index.d.ts +8 -0
  60. package/dist/execution/index.d.ts.map +1 -0
  61. package/dist/execution/index.js +12 -0
  62. package/dist/execution/modes/docker.d.ts +21 -0
  63. package/dist/execution/modes/docker.d.ts.map +1 -0
  64. package/dist/execution/modes/docker.js +125 -0
  65. package/dist/execution/modes/index.d.ts +10 -0
  66. package/dist/execution/modes/index.d.ts.map +1 -0
  67. package/dist/execution/modes/index.js +14 -0
  68. package/dist/execution/modes/kubernetes.d.ts +29 -0
  69. package/dist/execution/modes/kubernetes.d.ts.map +1 -0
  70. package/dist/execution/modes/kubernetes.js +121 -0
  71. package/dist/execution/modes/local.d.ts +23 -0
  72. package/dist/execution/modes/local.d.ts.map +1 -0
  73. package/dist/execution/modes/local.js +102 -0
  74. package/dist/execution/modes/ssh.d.ts +23 -0
  75. package/dist/execution/modes/ssh.d.ts.map +1 -0
  76. package/dist/execution/modes/ssh.js +134 -0
  77. package/dist/execution/provider.d.ts +32 -0
  78. package/dist/execution/provider.d.ts.map +1 -0
  79. package/dist/execution/provider.js +90 -0
  80. package/dist/execution/types.d.ts +105 -0
  81. package/dist/execution/types.d.ts.map +1 -0
  82. package/dist/execution/types.js +9 -0
  83. package/dist/index.d.ts +11 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +42 -0
  86. package/dist/observability/health.d.ts +19 -0
  87. package/dist/observability/health.d.ts.map +1 -0
  88. package/dist/observability/health.js +129 -0
  89. package/dist/observability/index.d.ts +6 -0
  90. package/dist/observability/index.d.ts.map +1 -0
  91. package/dist/observability/index.js +20 -0
  92. package/dist/observability/runStatus.d.ts +44 -0
  93. package/dist/observability/runStatus.d.ts.map +1 -0
  94. package/dist/observability/runStatus.js +169 -0
  95. package/dist/observability/timeline.d.ts +11 -0
  96. package/dist/observability/timeline.d.ts.map +1 -0
  97. package/dist/observability/timeline.js +176 -0
  98. package/dist/observability/types.d.ts +62 -0
  99. package/dist/observability/types.d.ts.map +1 -0
  100. package/dist/observability/types.js +8 -0
  101. package/dist/observability/webhooks.d.ts +68 -0
  102. package/dist/observability/webhooks.d.ts.map +1 -0
  103. package/dist/observability/webhooks.js +132 -0
  104. package/dist/resources/budget-tracker.d.ts +56 -0
  105. package/dist/resources/budget-tracker.d.ts.map +1 -0
  106. package/dist/resources/budget-tracker.js +131 -0
  107. package/dist/resources/concurrency-guard.d.ts +55 -0
  108. package/dist/resources/concurrency-guard.d.ts.map +1 -0
  109. package/dist/resources/concurrency-guard.js +132 -0
  110. package/dist/resources/index.d.ts +12 -0
  111. package/dist/resources/index.d.ts.map +1 -0
  112. package/dist/resources/index.js +20 -0
  113. package/dist/resources/manager.d.ts +49 -0
  114. package/dist/resources/manager.d.ts.map +1 -0
  115. package/dist/resources/manager.js +111 -0
  116. package/dist/resources/timeout-cascade.d.ts +56 -0
  117. package/dist/resources/timeout-cascade.d.ts.map +1 -0
  118. package/dist/resources/timeout-cascade.js +145 -0
  119. package/dist/resources/types.d.ts +108 -0
  120. package/dist/resources/types.d.ts.map +1 -0
  121. package/dist/resources/types.js +9 -0
  122. package/dist/session/context.d.ts +22 -0
  123. package/dist/session/context.d.ts.map +1 -0
  124. package/dist/session/context.js +113 -0
  125. package/dist/session/continuityState.d.ts +39 -0
  126. package/dist/session/continuityState.d.ts.map +1 -0
  127. package/dist/session/continuityState.js +164 -0
  128. package/dist/session/cost.d.ts +63 -0
  129. package/dist/session/cost.d.ts.map +1 -0
  130. package/dist/session/cost.js +194 -0
  131. package/dist/session/discovery.d.ts +22 -0
  132. package/dist/session/discovery.d.ts.map +1 -0
  133. package/dist/session/discovery.js +35 -0
  134. package/dist/session/history.d.ts +30 -0
  135. package/dist/session/history.d.ts.map +1 -0
  136. package/dist/session/history.js +143 -0
  137. package/dist/session/index.d.ts +20 -0
  138. package/dist/session/index.d.ts.map +1 -0
  139. package/dist/session/index.js +78 -0
  140. package/dist/session/memoryExtraction.d.ts +65 -0
  141. package/dist/session/memoryExtraction.d.ts.map +1 -0
  142. package/dist/session/memoryExtraction.js +201 -0
  143. package/dist/session/parse.d.ts +45 -0
  144. package/dist/session/parse.d.ts.map +1 -0
  145. package/dist/session/parse.js +170 -0
  146. package/dist/session/persistence.d.ts +46 -0
  147. package/dist/session/persistence.d.ts.map +1 -0
  148. package/dist/session/persistence.js +180 -0
  149. package/dist/session/types.d.ts +267 -0
  150. package/dist/session/types.d.ts.map +1 -0
  151. package/dist/session/types.js +45 -0
  152. package/dist/session/write.d.ts +61 -0
  153. package/dist/session/write.d.ts.map +1 -0
  154. package/dist/session/write.js +213 -0
  155. package/dist/telemetry/audit-log.d.ts +56 -0
  156. package/dist/telemetry/audit-log.d.ts.map +1 -0
  157. package/dist/telemetry/audit-log.js +59 -0
  158. package/dist/telemetry/index.d.ts +9 -0
  159. package/dist/telemetry/index.d.ts.map +1 -0
  160. package/dist/telemetry/index.js +15 -0
  161. package/dist/telemetry/provider.d.ts +39 -0
  162. package/dist/telemetry/provider.d.ts.map +1 -0
  163. package/dist/telemetry/provider.js +91 -0
  164. package/dist/telemetry/span-tree.d.ts +46 -0
  165. package/dist/telemetry/span-tree.d.ts.map +1 -0
  166. package/dist/telemetry/span-tree.js +93 -0
  167. package/dist/telemetry/types.d.ts +85 -0
  168. package/dist/telemetry/types.d.ts.map +1 -0
  169. package/dist/telemetry/types.js +21 -0
  170. package/package.json +90 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/resources/manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,UAAU,EAEV,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACZ,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMnD,wDAAwD;AACxD,MAAM,WAAW,sBAAsB;IACrC,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,0BAA0B;IAC1B,WAAW,CAAC,EAAE;QACZ,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH;AAMD,qBAAa,mBAAoB,YAAW,eAAe;IACzD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;IAElD,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,+CAA+C;IAC/C,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAElC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiC;gBAEvD,OAAO,EAAE,sBAAsB;IAwB3C,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,UAAU;IAIvD,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/C,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/C,WAAW,IAAI,gBAAgB;IAa/B,SAAS,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI;IAMlD,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,YAAY;CAerB"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ /**
3
+ * Unified resource manager that composes budget trackers, a concurrency
4
+ * guard, and a timeout cascade into the `ResourceManager` interface.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ResourceManagerImpl = void 0;
8
+ const budget_tracker_1 = require("./budget-tracker");
9
+ const concurrency_guard_1 = require("./concurrency-guard");
10
+ const timeout_cascade_1 = require("./timeout-cascade");
11
+ // ---------------------------------------------------------------------------
12
+ // ResourceManagerImpl
13
+ // ---------------------------------------------------------------------------
14
+ class ResourceManagerImpl {
15
+ _tokenBudget;
16
+ _costBudget;
17
+ _costCurrency;
18
+ _warningThresholdPercent;
19
+ /** Concurrency guard for parallel effects. */
20
+ effects;
21
+ /** Concurrency guard for parallel runs. */
22
+ runs;
23
+ /** Concurrency guard for parallel sessions. */
24
+ sessions;
25
+ /** Timeout cascade for run / iteration / effect timeouts. */
26
+ timeouts;
27
+ _warningCallbacks = [];
28
+ constructor(options) {
29
+ this._tokenBudget = new budget_tracker_1.BudgetTracker(options.tokenLimit);
30
+ this._costBudget = new budget_tracker_1.BudgetTracker(options.costLimit);
31
+ this._costCurrency = options.costCurrency ?? "USD";
32
+ this._warningThresholdPercent = options.warningThresholdPercent ?? 80;
33
+ const cc = options.concurrency ?? {};
34
+ this.effects = new concurrency_guard_1.ConcurrencyGuard(cc.maxParallelEffects ?? 8);
35
+ this.runs = new concurrency_guard_1.ConcurrencyGuard(cc.maxParallelRuns ?? 4);
36
+ this.sessions = new concurrency_guard_1.ConcurrencyGuard(cc.maxParallelSessions ?? 4);
37
+ this.timeouts = new timeout_cascade_1.TimeoutCascade();
38
+ // Wire up threshold warnings.
39
+ this._tokenBudget.onThreshold(this._warningThresholdPercent, () => {
40
+ this._fireWarning("tokens");
41
+ });
42
+ this._costBudget.onThreshold(this._warningThresholdPercent, () => {
43
+ this._fireWarning("cost");
44
+ });
45
+ }
46
+ // -- ResourceManager interface --------------------------------------------
47
+ checkBudget(kind) {
48
+ return this._snapshot(kind);
49
+ }
50
+ consume(kind, amount) {
51
+ this._trackerFor(kind).consume(amount);
52
+ }
53
+ release(kind, amount) {
54
+ this._trackerFor(kind).release(amount);
55
+ }
56
+ getSnapshot() {
57
+ return {
58
+ tokens: this._snapshot("tokens"),
59
+ cost: this._snapshot("cost"),
60
+ concurrency: {
61
+ maxParallelEffects: this.effects.active,
62
+ maxParallelRuns: this.runs.active,
63
+ maxParallelSessions: this.sessions.active,
64
+ },
65
+ timestamp: new Date().toISOString(),
66
+ };
67
+ }
68
+ onWarning(callback) {
69
+ this._warningCallbacks.push(callback);
70
+ }
71
+ // -- Helpers --------------------------------------------------------------
72
+ _trackerFor(kind) {
73
+ return kind === "tokens" ? this._tokenBudget : this._costBudget;
74
+ }
75
+ _snapshot(kind) {
76
+ const tracker = this._trackerFor(kind);
77
+ if (kind === "tokens") {
78
+ const snap = {
79
+ limit: tracker.limit,
80
+ used: tracker.used,
81
+ remaining: tracker.remaining,
82
+ warningThreshold: this._warningThresholdPercent / 100,
83
+ };
84
+ return snap;
85
+ }
86
+ const snap = {
87
+ limit: tracker.limit,
88
+ used: tracker.used,
89
+ remaining: tracker.remaining,
90
+ currency: this._costCurrency,
91
+ };
92
+ return snap;
93
+ }
94
+ _fireWarning(kind) {
95
+ const budget = this._snapshot(kind);
96
+ const warning = {
97
+ kind,
98
+ budget,
99
+ timestamp: new Date().toISOString(),
100
+ };
101
+ for (const cb of this._warningCallbacks) {
102
+ try {
103
+ cb(warning);
104
+ }
105
+ catch {
106
+ // Swallow subscriber errors to avoid breaking the manager.
107
+ }
108
+ }
109
+ }
110
+ }
111
+ exports.ResourceManagerImpl = ResourceManagerImpl;
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Nested timeout management with cascading abort signals.
3
+ *
4
+ * Manages timeouts at three levels: run -> iteration -> effect.
5
+ * When a parent timeout fires (or is cleared), all children are
6
+ * automatically aborted.
7
+ */
8
+ /** Handle returned by each `create*Timeout` method. */
9
+ export interface TimeoutHandle {
10
+ /** AbortSignal that fires when the timeout elapses or is cancelled. */
11
+ readonly signal: AbortSignal;
12
+ /** Manually clear the timeout and abort any children. */
13
+ clear(): void;
14
+ }
15
+ export declare class TimeoutCascade {
16
+ private _run;
17
+ private _iteration;
18
+ /**
19
+ * Create a run-level timeout.
20
+ *
21
+ * Clears any existing run (and its children) before creating a new one.
22
+ */
23
+ createRunTimeout(ms: number): TimeoutHandle;
24
+ /**
25
+ * Create an iteration-level timeout nested under the current run.
26
+ *
27
+ * Clears any existing iteration (and its effect children) first.
28
+ *
29
+ * @throws {Error} if no run timeout is active.
30
+ */
31
+ createIterationTimeout(ms: number): TimeoutHandle;
32
+ /**
33
+ * Create an effect-level timeout nested under the current iteration.
34
+ *
35
+ * @throws {Error} if no iteration timeout is active.
36
+ */
37
+ createEffectTimeout(ms: number): TimeoutHandle;
38
+ /**
39
+ * Tear down all active timeouts (run, iteration, and effects).
40
+ */
41
+ clearAll(): void;
42
+ /**
43
+ * Create a new `TimeoutNode`, register it as a child of `parent` (if any),
44
+ * and set up parent-abort cascading.
45
+ */
46
+ private _createNode;
47
+ /** Abort a node and all of its children recursively. */
48
+ private _abortNode;
49
+ /** Clear a node: abort it and all descendants. */
50
+ private _clearNode;
51
+ /** Remove a child from a parent's children array. */
52
+ private _removeChild;
53
+ /** Create a public `TimeoutHandle` for a node. */
54
+ private _handleFor;
55
+ }
56
+ //# sourceMappingURL=timeout-cascade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout-cascade.d.ts","sourceRoot":"","sources":["../../src/resources/timeout-cascade.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,uDAAuD;AACvD,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,yDAAyD;IACzD,KAAK,IAAI,IAAI,CAAC;CACf;AAgBD,qBAAa,cAAc;IACzB,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,UAAU,CAA0B;IAI5C;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa;IAY3C;;;;;;OAMG;IACH,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa;IAiBjD;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa;IAW9C;;OAEG;IACH,QAAQ,IAAI,IAAI;IAUhB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAwCnB,wDAAwD;IACxD,OAAO,CAAC,UAAU;IAclB,kDAAkD;IAClD,OAAO,CAAC,UAAU;IAIlB,qDAAqD;IACrD,OAAO,CAAC,YAAY;IAOpB,kDAAkD;IAClD,OAAO,CAAC,UAAU;CAQnB"}
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ /**
3
+ * Nested timeout management with cascading abort signals.
4
+ *
5
+ * Manages timeouts at three levels: run -> iteration -> effect.
6
+ * When a parent timeout fires (or is cleared), all children are
7
+ * automatically aborted.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.TimeoutCascade = void 0;
11
+ // ---------------------------------------------------------------------------
12
+ // TimeoutCascade
13
+ // ---------------------------------------------------------------------------
14
+ class TimeoutCascade {
15
+ _run;
16
+ _iteration;
17
+ // -- Factory methods ------------------------------------------------------
18
+ /**
19
+ * Create a run-level timeout.
20
+ *
21
+ * Clears any existing run (and its children) before creating a new one.
22
+ */
23
+ createRunTimeout(ms) {
24
+ // Tear down any previous run hierarchy.
25
+ if (this._run) {
26
+ this._clearNode(this._run);
27
+ }
28
+ this._run = this._createNode(ms, undefined);
29
+ this._iteration = undefined; // Children belong to previous run.
30
+ return this._handleFor(this._run);
31
+ }
32
+ /**
33
+ * Create an iteration-level timeout nested under the current run.
34
+ *
35
+ * Clears any existing iteration (and its effect children) first.
36
+ *
37
+ * @throws {Error} if no run timeout is active.
38
+ */
39
+ createIterationTimeout(ms) {
40
+ if (!this._run) {
41
+ throw new Error("Cannot create iteration timeout: no run timeout is active");
42
+ }
43
+ // Tear down previous iteration.
44
+ if (this._iteration) {
45
+ this._removeChild(this._run, this._iteration);
46
+ this._clearNode(this._iteration);
47
+ }
48
+ this._iteration = this._createNode(ms, this._run);
49
+ return this._handleFor(this._iteration);
50
+ }
51
+ /**
52
+ * Create an effect-level timeout nested under the current iteration.
53
+ *
54
+ * @throws {Error} if no iteration timeout is active.
55
+ */
56
+ createEffectTimeout(ms) {
57
+ if (!this._iteration) {
58
+ throw new Error("Cannot create effect timeout: no iteration timeout is active");
59
+ }
60
+ const node = this._createNode(ms, this._iteration);
61
+ return this._handleFor(node);
62
+ }
63
+ /**
64
+ * Tear down all active timeouts (run, iteration, and effects).
65
+ */
66
+ clearAll() {
67
+ if (this._run) {
68
+ this._clearNode(this._run);
69
+ this._run = undefined;
70
+ this._iteration = undefined;
71
+ }
72
+ }
73
+ // -- Internals ------------------------------------------------------------
74
+ /**
75
+ * Create a new `TimeoutNode`, register it as a child of `parent` (if any),
76
+ * and set up parent-abort cascading.
77
+ */
78
+ _createNode(ms, parent) {
79
+ const controller = new AbortController();
80
+ const node = {
81
+ controller,
82
+ timer: undefined,
83
+ children: [],
84
+ };
85
+ // Schedule the timeout.
86
+ node.timer = setTimeout(() => {
87
+ node.timer = undefined;
88
+ this._abortNode(node);
89
+ }, ms);
90
+ // If the parent is already aborted, abort immediately.
91
+ if (parent) {
92
+ if (parent.controller.signal.aborted) {
93
+ clearTimeout(node.timer);
94
+ node.timer = undefined;
95
+ controller.abort(parent.controller.signal.reason);
96
+ }
97
+ else {
98
+ parent.children.push(node);
99
+ // Listen for parent abort to cascade.
100
+ const onParentAbort = () => {
101
+ this._abortNode(node);
102
+ };
103
+ parent.controller.signal.addEventListener("abort", onParentAbort, {
104
+ once: true,
105
+ });
106
+ }
107
+ }
108
+ return node;
109
+ }
110
+ /** Abort a node and all of its children recursively. */
111
+ _abortNode(node) {
112
+ if (node.timer !== undefined) {
113
+ clearTimeout(node.timer);
114
+ node.timer = undefined;
115
+ }
116
+ if (!node.controller.signal.aborted) {
117
+ node.controller.abort(new Error("Timeout elapsed"));
118
+ }
119
+ for (const child of node.children) {
120
+ this._abortNode(child);
121
+ }
122
+ node.children.length = 0;
123
+ }
124
+ /** Clear a node: abort it and all descendants. */
125
+ _clearNode(node) {
126
+ this._abortNode(node);
127
+ }
128
+ /** Remove a child from a parent's children array. */
129
+ _removeChild(parent, child) {
130
+ const idx = parent.children.indexOf(child);
131
+ if (idx !== -1) {
132
+ parent.children.splice(idx, 1);
133
+ }
134
+ }
135
+ /** Create a public `TimeoutHandle` for a node. */
136
+ _handleFor(node) {
137
+ return {
138
+ signal: node.controller.signal,
139
+ clear: () => {
140
+ this._clearNode(node);
141
+ },
142
+ };
143
+ }
144
+ }
145
+ exports.TimeoutCascade = TimeoutCascade;
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Resource management interfaces for Babysitter Agent Runtime.
3
+ *
4
+ * Covers budget tracking (tokens, cost), concurrency limits, timeouts,
5
+ * and a unified resource manager. Interface-only stubs; implementations
6
+ * will follow in issue #217.
7
+ */
8
+ /** Token consumption budget for a run or session. */
9
+ export interface TokenBudget {
10
+ /** Maximum allowed tokens. */
11
+ readonly limit: number;
12
+ /** Tokens consumed so far. */
13
+ readonly used: number;
14
+ /** Tokens remaining (`limit - used`). */
15
+ readonly remaining: number;
16
+ /** Optional threshold (0-1) at which a warning callback fires. */
17
+ readonly warningThreshold?: number;
18
+ }
19
+ /** Monetary cost budget for a run or session. */
20
+ export interface CostBudget {
21
+ /** Maximum allowed cost. */
22
+ readonly limit: number;
23
+ /** Cost consumed so far. */
24
+ readonly used: number;
25
+ /** Cost remaining (`limit - used`). */
26
+ readonly remaining: number;
27
+ /** ISO 4217 currency code; defaults to "USD". */
28
+ readonly currency?: string;
29
+ }
30
+ /** Hard caps on parallel work within a single orchestration scope. */
31
+ export interface ConcurrencyLimits {
32
+ /** Maximum effects that may execute in parallel. */
33
+ readonly maxParallelEffects: number;
34
+ /** Maximum babysitter runs that may execute in parallel. */
35
+ readonly maxParallelRuns: number;
36
+ /** Maximum Claude Code sessions that may execute in parallel. */
37
+ readonly maxParallelSessions: number;
38
+ }
39
+ /** Timeout configuration at various granularity levels. */
40
+ export interface TimeoutConfig {
41
+ /** Maximum wall-clock duration for a single effect (ms). */
42
+ readonly perEffect?: number;
43
+ /** Maximum wall-clock duration for a single iteration (ms). */
44
+ readonly perIteration?: number;
45
+ /** Maximum wall-clock duration for an entire run (ms). */
46
+ readonly perRun?: number;
47
+ /** Policy applied when a timeout fires (e.g. "cancel", "warn", "escalate"). */
48
+ readonly escalationPolicy?: string;
49
+ }
50
+ /** Point-in-time snapshot of all tracked resource dimensions. */
51
+ export interface ResourceSnapshot {
52
+ /** Current token budget state. */
53
+ readonly tokens: TokenBudget;
54
+ /** Current cost budget state. */
55
+ readonly cost: CostBudget;
56
+ /** Current concurrency utilisation (used counts, not limits). */
57
+ readonly concurrency: ConcurrencyLimits;
58
+ /** ISO-8601 timestamp when this snapshot was captured. */
59
+ readonly timestamp: string;
60
+ }
61
+ /** Discriminator for the type of budget being queried or mutated. */
62
+ export type BudgetKind = "tokens" | "cost";
63
+ /** Payload delivered to resource-warning subscribers. */
64
+ export interface ResourceWarning {
65
+ /** Which budget triggered the warning. */
66
+ readonly kind: BudgetKind;
67
+ /** The budget state at the time of the warning. */
68
+ readonly budget: TokenBudget | CostBudget;
69
+ /** ISO-8601 timestamp of the warning. */
70
+ readonly timestamp: string;
71
+ }
72
+ /** Callback signature for resource warning notifications. */
73
+ export type ResourceWarningCallback = (warning: ResourceWarning) => void;
74
+ /** Unified resource manager for budget enforcement and reporting. */
75
+ export interface ResourceManager {
76
+ /**
77
+ * Check the current budget state for a given kind.
78
+ *
79
+ * @param kind - "tokens" or "cost".
80
+ * @returns The corresponding budget snapshot.
81
+ */
82
+ checkBudget(kind: BudgetKind): TokenBudget | CostBudget;
83
+ /**
84
+ * Record consumption against a budget.
85
+ *
86
+ * @param kind - Which budget to charge.
87
+ * @param amount - Units to consume.
88
+ */
89
+ consume(kind: BudgetKind, amount: number): void;
90
+ /**
91
+ * Release previously consumed units back into a budget (e.g. on rollback).
92
+ *
93
+ * @param kind - Which budget to credit.
94
+ * @param amount - Units to release.
95
+ */
96
+ release(kind: BudgetKind, amount: number): void;
97
+ /**
98
+ * Capture a point-in-time snapshot of all resource dimensions.
99
+ */
100
+ getSnapshot(): ResourceSnapshot;
101
+ /**
102
+ * Register a callback that fires when any budget crosses its warning threshold.
103
+ *
104
+ * @param callback - Function invoked with the warning payload.
105
+ */
106
+ onWarning(callback: ResourceWarningCallback): void;
107
+ }
108
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/resources/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,qDAAqD;AACrD,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,iDAAiD;AACjD,MAAM,WAAW,UAAU;IACzB,4BAA4B;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4BAA4B;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAMD,sEAAsE;AACtE,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,4DAA4D;IAC5D,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,iEAAiE;IACjE,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAED,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,+EAA+E;IAC/E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAMD,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAC/B,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,iEAAiE;IACjE,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAMD,qEAAqE;AACrE,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAM3C,yDAAyD;AACzD,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,mDAAmD;IACnD,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,CAAC;IAC1C,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,6DAA6D;AAC7D,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;AAMzE,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,UAAU,CAAC;IAExD;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAEhD;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAEhD;;OAEG;IACH,WAAW,IAAI,gBAAgB,CAAC;IAEhC;;;;OAIG;IACH,SAAS,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI,CAAC;CACpD"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * Resource management interfaces for Babysitter Agent Runtime.
4
+ *
5
+ * Covers budget tracking (tokens, cost), concurrency limits, timeouts,
6
+ * and a unified resource manager. Interface-only stubs; implementations
7
+ * will follow in issue #217.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Session context persistence for cross-run knowledge sharing (GAP-SESSION-001).
3
+ * Stores accumulated notes and shared knowledge as a JSON file alongside the session state file.
4
+ */
5
+ import type { SessionContext } from './types';
6
+ /**
7
+ * Get the file path for a session's context JSON file.
8
+ */
9
+ export declare function getSessionContextPath(stateDir: string, sessionId: string): string;
10
+ /**
11
+ * Read session context from disk.
12
+ * Returns empty context if the file does not exist.
13
+ * Logs a warning and returns empty context if the file is corrupt.
14
+ */
15
+ export declare function getSessionContext(stateDir: string, sessionId: string): Promise<SessionContext>;
16
+ /**
17
+ * Update session context by merging new data with existing context.
18
+ * Notes are appended; sharedKnowledge keys are merged (newer values win).
19
+ * Uses atomic temp-file + rename pattern to prevent partial writes.
20
+ */
21
+ export declare function updateSessionContext(stateDir: string, sessionId: string, updates: Partial<SessionContext>): Promise<SessionContext>;
22
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/session/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjF;AAQD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA4BpG;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,OAAO,CAAC,cAAc,CAAC,CAoBzB"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ /**
3
+ * Session context persistence for cross-run knowledge sharing (GAP-SESSION-001).
4
+ * Stores accumulated notes and shared knowledge as a JSON file alongside the session state file.
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.getSessionContextPath = getSessionContextPath;
41
+ exports.getSessionContext = getSessionContext;
42
+ exports.updateSessionContext = updateSessionContext;
43
+ const node_fs_1 = require("node:fs");
44
+ const path = __importStar(require("node:path"));
45
+ /**
46
+ * Get the file path for a session's context JSON file.
47
+ */
48
+ function getSessionContextPath(stateDir, sessionId) {
49
+ return `${stateDir}/${sessionId}.context.json`;
50
+ }
51
+ const EMPTY_CONTEXT = {
52
+ notes: [],
53
+ sharedKnowledge: {},
54
+ worktree: undefined,
55
+ };
56
+ /**
57
+ * Read session context from disk.
58
+ * Returns empty context if the file does not exist.
59
+ * Logs a warning and returns empty context if the file is corrupt.
60
+ */
61
+ async function getSessionContext(stateDir, sessionId) {
62
+ const filePath = getSessionContextPath(stateDir, sessionId);
63
+ let raw;
64
+ try {
65
+ raw = await node_fs_1.promises.readFile(filePath, 'utf8');
66
+ }
67
+ catch (error) {
68
+ const err = error;
69
+ if (err.code === 'ENOENT') {
70
+ return { ...EMPTY_CONTEXT, sharedKnowledge: {} };
71
+ }
72
+ // Unexpected FS error — return empty rather than crash
73
+ return { ...EMPTY_CONTEXT, sharedKnowledge: {} };
74
+ }
75
+ try {
76
+ const data = JSON.parse(raw);
77
+ return {
78
+ notes: Array.isArray(data.notes) ? data.notes : [],
79
+ sharedKnowledge: data.sharedKnowledge && typeof data.sharedKnowledge === 'object'
80
+ ? data.sharedKnowledge
81
+ : {},
82
+ worktree: data.worktree && typeof data.worktree === 'object'
83
+ ? data.worktree
84
+ : undefined,
85
+ };
86
+ }
87
+ catch {
88
+ // Corrupt JSON — return empty context rather than crash
89
+ return { ...EMPTY_CONTEXT, sharedKnowledge: {} };
90
+ }
91
+ }
92
+ /**
93
+ * Update session context by merging new data with existing context.
94
+ * Notes are appended; sharedKnowledge keys are merged (newer values win).
95
+ * Uses atomic temp-file + rename pattern to prevent partial writes.
96
+ */
97
+ async function updateSessionContext(stateDir, sessionId, updates) {
98
+ const existing = await getSessionContext(stateDir, sessionId);
99
+ const merged = {
100
+ notes: updates.notes ? [...existing.notes, ...updates.notes] : existing.notes,
101
+ sharedKnowledge: updates.sharedKnowledge
102
+ ? { ...existing.sharedKnowledge, ...updates.sharedKnowledge }
103
+ : existing.sharedKnowledge,
104
+ worktree: updates.worktree ? { ...(existing.worktree ?? {}), ...updates.worktree } : existing.worktree,
105
+ };
106
+ const filePath = getSessionContextPath(stateDir, sessionId);
107
+ const dir = path.dirname(filePath);
108
+ const tempPath = `${filePath}.tmp.${process.pid}`;
109
+ await node_fs_1.promises.mkdir(dir, { recursive: true });
110
+ await node_fs_1.promises.writeFile(tempPath, JSON.stringify(merged), 'utf8');
111
+ await node_fs_1.promises.rename(tempPath, filePath);
112
+ return merged;
113
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * GAP-PERF-008: Structured Continuity State.
3
+ *
4
+ * Structured state that persists across session compaction. Captures
5
+ * key decisions, current phase, and working context for seamless
6
+ * resume after context compression.
7
+ */
8
+ export interface ContinuityPhase {
9
+ name: string;
10
+ startedAt: string;
11
+ description: string;
12
+ }
13
+ export interface ContinuityDecision {
14
+ key: string;
15
+ value: string;
16
+ rationale?: string;
17
+ madeAt: string;
18
+ runId?: string;
19
+ }
20
+ export interface ContinuityWorkingContext {
21
+ focus: string;
22
+ blockers: string[];
23
+ nextSteps: string[];
24
+ }
25
+ export interface ContinuityState {
26
+ schemaVersion: string;
27
+ updatedAt: string;
28
+ currentPhase: ContinuityPhase | null;
29
+ decisions: ContinuityDecision[];
30
+ workingContext: ContinuityWorkingContext;
31
+ }
32
+ export declare const CONTINUITY_STATE_SCHEMA_VERSION = "2026.01.continuity-state-v1";
33
+ export declare function getContinuityStatePath(stateDir: string, sessionId: string): string;
34
+ export declare function getContinuityState(stateDir: string, sessionId: string): Promise<ContinuityState>;
35
+ export declare function setCurrentPhase(stateDir: string, sessionId: string, phase: Omit<ContinuityPhase, "startedAt">): Promise<void>;
36
+ export declare function upsertDecision(stateDir: string, sessionId: string, decision: Omit<ContinuityDecision, "madeAt">): Promise<void>;
37
+ export declare function updateWorkingContext(stateDir: string, sessionId: string, updates: Partial<ContinuityWorkingContext>): Promise<void>;
38
+ export declare function buildContinuityResumePrompt(stateDir: string, sessionId: string): Promise<string>;
39
+ //# sourceMappingURL=continuityState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continuityState.d.ts","sourceRoot":"","sources":["../../src/session/continuityState.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,cAAc,EAAE,wBAAwB,CAAC;CAC1C;AAMD,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAiD7E,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAElF;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAEtG;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,GACxC,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,GAC3C,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACzC,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CA2BjB"}