@a5c-ai/genty-runtime 5.1.1-staging.0007199a1cb2

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 (233) hide show
  1. package/README.md +69 -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 +20 -0
  6. package/dist/background/state.d.ts.map +1 -0
  7. package/dist/background/state.js +52 -0
  8. package/dist/backgroundProcessRegistry.d.ts +124 -0
  9. package/dist/backgroundProcessRegistry.d.ts.map +1 -0
  10. package/dist/backgroundProcessRegistry.js +427 -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 +245 -0
  35. package/dist/daemon/daemonLog.d.ts +30 -0
  36. package/dist/daemon/daemonLog.d.ts.map +1 -0
  37. package/dist/daemon/daemonLog.js +140 -0
  38. package/dist/daemon/durableQueue.d.ts +41 -0
  39. package/dist/daemon/durableQueue.d.ts.map +1 -0
  40. package/dist/daemon/durableQueue.js +183 -0
  41. package/dist/daemon/fileWatcher.d.ts +9 -0
  42. package/dist/daemon/fileWatcher.d.ts.map +1 -0
  43. package/dist/daemon/fileWatcher.js +144 -0
  44. package/dist/daemon/index.d.ts +15 -0
  45. package/dist/daemon/index.d.ts.map +1 -0
  46. package/dist/daemon/index.js +25 -0
  47. package/dist/daemon/lifecycle.d.ts +13 -0
  48. package/dist/daemon/lifecycle.d.ts.map +1 -0
  49. package/dist/daemon/lifecycle.js +320 -0
  50. package/dist/daemon/loop.d.ts +27 -0
  51. package/dist/daemon/loop.d.ts.map +1 -0
  52. package/dist/daemon/loop.js +387 -0
  53. package/dist/daemon/timerScheduler.d.ts +13 -0
  54. package/dist/daemon/timerScheduler.d.ts.map +1 -0
  55. package/dist/daemon/timerScheduler.js +212 -0
  56. package/dist/daemon/types.d.ts +122 -0
  57. package/dist/daemon/types.d.ts.map +1 -0
  58. package/dist/daemon/types.js +25 -0
  59. package/dist/daemon/webhookListener.d.ts +6 -0
  60. package/dist/daemon/webhookListener.d.ts.map +1 -0
  61. package/dist/daemon/webhookListener.js +132 -0
  62. package/dist/execution/index.d.ts +10 -0
  63. package/dist/execution/index.d.ts.map +1 -0
  64. package/dist/execution/index.js +20 -0
  65. package/dist/execution/modes/docker.d.ts +26 -0
  66. package/dist/execution/modes/docker.d.ts.map +1 -0
  67. package/dist/execution/modes/docker.js +183 -0
  68. package/dist/execution/modes/index.d.ts +10 -0
  69. package/dist/execution/modes/index.d.ts.map +1 -0
  70. package/dist/execution/modes/index.js +14 -0
  71. package/dist/execution/modes/kubernetes.d.ts +46 -0
  72. package/dist/execution/modes/kubernetes.d.ts.map +1 -0
  73. package/dist/execution/modes/kubernetes.js +334 -0
  74. package/dist/execution/modes/local.d.ts +23 -0
  75. package/dist/execution/modes/local.d.ts.map +1 -0
  76. package/dist/execution/modes/local.js +117 -0
  77. package/dist/execution/modes/ssh.d.ts +23 -0
  78. package/dist/execution/modes/ssh.d.ts.map +1 -0
  79. package/dist/execution/modes/ssh.js +144 -0
  80. package/dist/execution/policy.d.ts +15 -0
  81. package/dist/execution/policy.d.ts.map +1 -0
  82. package/dist/execution/policy.js +121 -0
  83. package/dist/execution/provider.d.ts +32 -0
  84. package/dist/execution/provider.d.ts.map +1 -0
  85. package/dist/execution/provider.js +90 -0
  86. package/dist/execution/types.d.ts +189 -0
  87. package/dist/execution/types.d.ts.map +1 -0
  88. package/dist/execution/types.js +9 -0
  89. package/dist/index.d.ts +12 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +44 -0
  92. package/dist/observability/diagnostics.d.ts +25 -0
  93. package/dist/observability/diagnostics.d.ts.map +1 -0
  94. package/dist/observability/diagnostics.js +98 -0
  95. package/dist/observability/health.d.ts +19 -0
  96. package/dist/observability/health.d.ts.map +1 -0
  97. package/dist/observability/health.js +145 -0
  98. package/dist/observability/index.d.ts +7 -0
  99. package/dist/observability/index.d.ts.map +1 -0
  100. package/dist/observability/index.js +25 -0
  101. package/dist/observability/runStatus.d.ts +44 -0
  102. package/dist/observability/runStatus.d.ts.map +1 -0
  103. package/dist/observability/runStatus.js +170 -0
  104. package/dist/observability/timeline.d.ts +11 -0
  105. package/dist/observability/timeline.d.ts.map +1 -0
  106. package/dist/observability/timeline.js +176 -0
  107. package/dist/observability/types.d.ts +65 -0
  108. package/dist/observability/types.d.ts.map +1 -0
  109. package/dist/observability/types.js +8 -0
  110. package/dist/observability/webhooks.d.ts +68 -0
  111. package/dist/observability/webhooks.d.ts.map +1 -0
  112. package/dist/observability/webhooks.js +132 -0
  113. package/dist/resources/budget-tracker.d.ts +56 -0
  114. package/dist/resources/budget-tracker.d.ts.map +1 -0
  115. package/dist/resources/budget-tracker.js +131 -0
  116. package/dist/resources/concurrency-guard.d.ts +55 -0
  117. package/dist/resources/concurrency-guard.d.ts.map +1 -0
  118. package/dist/resources/concurrency-guard.js +132 -0
  119. package/dist/resources/index.d.ts +12 -0
  120. package/dist/resources/index.d.ts.map +1 -0
  121. package/dist/resources/index.js +20 -0
  122. package/dist/resources/manager.d.ts +52 -0
  123. package/dist/resources/manager.d.ts.map +1 -0
  124. package/dist/resources/manager.js +150 -0
  125. package/dist/resources/timeout-cascade.d.ts +56 -0
  126. package/dist/resources/timeout-cascade.d.ts.map +1 -0
  127. package/dist/resources/timeout-cascade.js +145 -0
  128. package/dist/resources/types.d.ts +130 -0
  129. package/dist/resources/types.d.ts.map +1 -0
  130. package/dist/resources/types.js +9 -0
  131. package/dist/rpc/index.d.ts +5 -0
  132. package/dist/rpc/index.d.ts.map +1 -0
  133. package/dist/rpc/index.js +7 -0
  134. package/dist/rpc/server.d.ts +13 -0
  135. package/dist/rpc/server.d.ts.map +1 -0
  136. package/dist/rpc/server.js +64 -0
  137. package/dist/rpc/server.test.d.ts +2 -0
  138. package/dist/rpc/server.test.d.ts.map +1 -0
  139. package/dist/rpc/server.test.js +35 -0
  140. package/dist/rpc/types.d.ts +23 -0
  141. package/dist/rpc/types.d.ts.map +1 -0
  142. package/dist/rpc/types.js +20 -0
  143. package/dist/session/context.d.ts +22 -0
  144. package/dist/session/context.d.ts.map +1 -0
  145. package/dist/session/context.js +113 -0
  146. package/dist/session/continuityState.d.ts +39 -0
  147. package/dist/session/continuityState.d.ts.map +1 -0
  148. package/dist/session/continuityState.js +164 -0
  149. package/dist/session/cost.d.ts +63 -0
  150. package/dist/session/cost.d.ts.map +1 -0
  151. package/dist/session/cost.js +194 -0
  152. package/dist/session/discovery.d.ts +24 -0
  153. package/dist/session/discovery.d.ts.map +1 -0
  154. package/dist/session/discovery.js +43 -0
  155. package/dist/session/export.d.ts +4 -0
  156. package/dist/session/export.d.ts.map +1 -0
  157. package/dist/session/export.js +56 -0
  158. package/dist/session/export.test.d.ts +2 -0
  159. package/dist/session/export.test.d.ts.map +1 -0
  160. package/dist/session/export.test.js +42 -0
  161. package/dist/session/history.d.ts +30 -0
  162. package/dist/session/history.d.ts.map +1 -0
  163. package/dist/session/history.js +143 -0
  164. package/dist/session/index.d.ts +20 -0
  165. package/dist/session/index.d.ts.map +1 -0
  166. package/dist/session/index.js +78 -0
  167. package/dist/session/memoryExtraction.d.ts +65 -0
  168. package/dist/session/memoryExtraction.d.ts.map +1 -0
  169. package/dist/session/memoryExtraction.js +201 -0
  170. package/dist/session/parse.d.ts +45 -0
  171. package/dist/session/parse.d.ts.map +1 -0
  172. package/dist/session/parse.js +170 -0
  173. package/dist/session/persistence.d.ts +46 -0
  174. package/dist/session/persistence.d.ts.map +1 -0
  175. package/dist/session/persistence.js +180 -0
  176. package/dist/session/rewind.d.ts +45 -0
  177. package/dist/session/rewind.d.ts.map +1 -0
  178. package/dist/session/rewind.js +68 -0
  179. package/dist/session/rewind.test.d.ts +2 -0
  180. package/dist/session/rewind.test.d.ts.map +1 -0
  181. package/dist/session/rewind.test.js +96 -0
  182. package/dist/session/tree.d.ts +29 -0
  183. package/dist/session/tree.d.ts.map +1 -0
  184. package/dist/session/tree.js +115 -0
  185. package/dist/session/tree.test.d.ts +2 -0
  186. package/dist/session/tree.test.d.ts.map +1 -0
  187. package/dist/session/tree.test.js +75 -0
  188. package/dist/session/types.d.ts +267 -0
  189. package/dist/session/types.d.ts.map +1 -0
  190. package/dist/session/types.js +45 -0
  191. package/dist/session/write.d.ts +61 -0
  192. package/dist/session/write.d.ts.map +1 -0
  193. package/dist/session/write.js +213 -0
  194. package/dist/shellInvocation.d.ts +6 -0
  195. package/dist/shellInvocation.d.ts.map +1 -0
  196. package/dist/shellInvocation.js +8 -0
  197. package/dist/shellInvocation.test.d.ts +2 -0
  198. package/dist/shellInvocation.test.d.ts.map +1 -0
  199. package/dist/shellInvocation.test.js +18 -0
  200. package/dist/storage/journal.d.ts +17 -0
  201. package/dist/storage/journal.d.ts.map +1 -0
  202. package/dist/storage/journal.js +165 -0
  203. package/dist/storage/runFiles.d.ts +10 -0
  204. package/dist/storage/runFiles.d.ts.map +1 -0
  205. package/dist/storage/runFiles.js +54 -0
  206. package/dist/telemetry/audit-log.d.ts +56 -0
  207. package/dist/telemetry/audit-log.d.ts.map +1 -0
  208. package/dist/telemetry/audit-log.js +59 -0
  209. package/dist/telemetry/exporters.d.ts +35 -0
  210. package/dist/telemetry/exporters.d.ts.map +1 -0
  211. package/dist/telemetry/exporters.js +141 -0
  212. package/dist/telemetry/index.d.ts +12 -0
  213. package/dist/telemetry/index.d.ts.map +1 -0
  214. package/dist/telemetry/index.js +25 -0
  215. package/dist/telemetry/provider.d.ts +57 -0
  216. package/dist/telemetry/provider.d.ts.map +1 -0
  217. package/dist/telemetry/provider.js +261 -0
  218. package/dist/telemetry/span-tree.d.ts +46 -0
  219. package/dist/telemetry/span-tree.d.ts.map +1 -0
  220. package/dist/telemetry/span-tree.js +93 -0
  221. package/dist/telemetry/traceContext.d.ts +10 -0
  222. package/dist/telemetry/traceContext.d.ts.map +1 -0
  223. package/dist/telemetry/traceContext.js +43 -0
  224. package/dist/telemetry/types.d.ts +109 -0
  225. package/dist/telemetry/types.d.ts.map +1 -0
  226. package/dist/telemetry/types.js +21 -0
  227. package/dist/types/sdk.d.ts +66 -0
  228. package/dist/types/sdk.d.ts.map +1 -0
  229. package/dist/types/sdk.js +9 -0
  230. package/dist/utils/ulid.d.ts +11 -0
  231. package/dist/utils/ulid.d.ts.map +1 -0
  232. package/dist/utils/ulid.js +62 -0
  233. package/package.json +137 -0
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ /**
3
+ * GAP-SESSION-004: Session-Level Cost Tracking and Budgets.
4
+ *
5
+ * Aggregates cost data from runs within a session. Supports configurable
6
+ * budgets with threshold alerts and auto-pause.
7
+ * Uses the same atomic temp-file + rename pattern as context.ts.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.getSessionCostPath = getSessionCostPath;
44
+ exports.getSessionCost = getSessionCost;
45
+ exports.updateSessionCost = updateSessionCost;
46
+ exports.setSessionBudget = setSessionBudget;
47
+ exports.checkBudget = checkBudget;
48
+ exports.markThresholdsTriggered = markThresholdsTriggered;
49
+ const node_fs_1 = require("node:fs");
50
+ const path = __importStar(require("node:path"));
51
+ // ---------------------------------------------------------------------------
52
+ // Internal helpers
53
+ // ---------------------------------------------------------------------------
54
+ function emptyCostState() {
55
+ return {
56
+ totalCostUsd: 0,
57
+ totalInputTokens: 0,
58
+ totalOutputTokens: 0,
59
+ runCosts: [],
60
+ triggeredThresholds: [],
61
+ paused: false,
62
+ lastUpdatedAt: new Date().toISOString(),
63
+ };
64
+ }
65
+ async function readRaw(filePath) {
66
+ let raw;
67
+ try {
68
+ raw = await node_fs_1.promises.readFile(filePath, "utf8");
69
+ }
70
+ catch (error) {
71
+ const err = error;
72
+ if (err.code === "ENOENT")
73
+ return emptyCostState();
74
+ return emptyCostState();
75
+ }
76
+ try {
77
+ const data = JSON.parse(raw);
78
+ return {
79
+ totalCostUsd: typeof data.totalCostUsd === "number" ? data.totalCostUsd : 0,
80
+ totalInputTokens: typeof data.totalInputTokens === "number" ? data.totalInputTokens : 0,
81
+ totalOutputTokens: typeof data.totalOutputTokens === "number" ? data.totalOutputTokens : 0,
82
+ runCosts: Array.isArray(data.runCosts) ? data.runCosts : [],
83
+ budget: data.budget,
84
+ triggeredThresholds: Array.isArray(data.triggeredThresholds) ? data.triggeredThresholds : [],
85
+ paused: typeof data.paused === "boolean" ? data.paused : false,
86
+ lastUpdatedAt: typeof data.lastUpdatedAt === "string" ? data.lastUpdatedAt : new Date().toISOString(),
87
+ };
88
+ }
89
+ catch {
90
+ return emptyCostState();
91
+ }
92
+ }
93
+ async function writeRaw(filePath, data) {
94
+ const dir = path.dirname(filePath);
95
+ const tempPath = `${filePath}.tmp.${process.pid}`;
96
+ await node_fs_1.promises.mkdir(dir, { recursive: true });
97
+ await node_fs_1.promises.writeFile(tempPath, JSON.stringify(data, null, 2), "utf8");
98
+ await node_fs_1.promises.rename(tempPath, filePath);
99
+ }
100
+ // ---------------------------------------------------------------------------
101
+ // Public API
102
+ // ---------------------------------------------------------------------------
103
+ function getSessionCostPath(stateDir, sessionId) {
104
+ return path.join(stateDir, `${sessionId}.cost.json`);
105
+ }
106
+ async function getSessionCost(stateDir, sessionId) {
107
+ return readRaw(getSessionCostPath(stateDir, sessionId));
108
+ }
109
+ async function updateSessionCost(stateDir, sessionId, update) {
110
+ const filePath = getSessionCostPath(stateDir, sessionId);
111
+ const data = await readRaw(filePath);
112
+ // Check for duplicate run cost entry and update or add
113
+ const existingIdx = data.runCosts.findIndex((r) => r.runId === update.runId);
114
+ if (existingIdx >= 0) {
115
+ // Update existing entry (re-aggregation): subtract old, add new
116
+ const old = data.runCosts[existingIdx];
117
+ data.totalCostUsd += update.costUsd - old.costUsd;
118
+ data.totalInputTokens += update.inputTokens - old.inputTokens;
119
+ data.totalOutputTokens += update.outputTokens - old.outputTokens;
120
+ data.runCosts[existingIdx] = {
121
+ runId: update.runId,
122
+ costUsd: update.costUsd,
123
+ inputTokens: update.inputTokens,
124
+ outputTokens: update.outputTokens,
125
+ };
126
+ }
127
+ else {
128
+ data.totalCostUsd += update.costUsd;
129
+ data.totalInputTokens += update.inputTokens;
130
+ data.totalOutputTokens += update.outputTokens;
131
+ data.runCosts.push({
132
+ runId: update.runId,
133
+ costUsd: update.costUsd,
134
+ inputTokens: update.inputTokens,
135
+ outputTokens: update.outputTokens,
136
+ });
137
+ }
138
+ data.lastUpdatedAt = new Date().toISOString();
139
+ await writeRaw(filePath, data);
140
+ return data;
141
+ }
142
+ async function setSessionBudget(stateDir, sessionId, budget) {
143
+ const filePath = getSessionCostPath(stateDir, sessionId);
144
+ const data = await readRaw(filePath);
145
+ data.budget = budget;
146
+ data.lastUpdatedAt = new Date().toISOString();
147
+ await writeRaw(filePath, data);
148
+ return data;
149
+ }
150
+ /**
151
+ * Pure function: evaluate budget thresholds against current cost.
152
+ * Returns new alerts (excluding already-triggered thresholds).
153
+ */
154
+ function checkBudget(costState) {
155
+ if (!costState.budget || costState.budget.maxCostUsd <= 0) {
156
+ return { exceeded: false, alerts: [], shouldPause: false };
157
+ }
158
+ const { maxCostUsd, alertThresholds, autoPause } = costState.budget;
159
+ const currentPct = (costState.totalCostUsd / maxCostUsd) * 100;
160
+ const exceeded = currentPct >= 100;
161
+ const alerts = [];
162
+ for (const threshold of alertThresholds) {
163
+ if (currentPct >= threshold && !costState.triggeredThresholds.includes(threshold)) {
164
+ alerts.push({
165
+ thresholdPct: threshold,
166
+ currentCostUsd: costState.totalCostUsd,
167
+ budgetUsd: maxCostUsd,
168
+ currentPct,
169
+ message: `Session cost ${currentPct.toFixed(1)}% of budget ($${costState.totalCostUsd.toFixed(4)} / $${maxCostUsd.toFixed(2)})`,
170
+ });
171
+ }
172
+ }
173
+ return {
174
+ exceeded,
175
+ alerts,
176
+ shouldPause: exceeded && autoPause,
177
+ };
178
+ }
179
+ /**
180
+ * Persist triggered thresholds back to cost state after checkBudget produces alerts.
181
+ * Call this after processing alerts to prevent re-triggering.
182
+ */
183
+ async function markThresholdsTriggered(stateDir, sessionId, thresholds) {
184
+ if (thresholds.length === 0)
185
+ return;
186
+ const filePath = getSessionCostPath(stateDir, sessionId);
187
+ const data = await readRaw(filePath);
188
+ const existing = new Set(data.triggeredThresholds);
189
+ for (const t of thresholds)
190
+ existing.add(t);
191
+ data.triggeredThresholds = [...existing];
192
+ data.lastUpdatedAt = new Date().toISOString();
193
+ await writeRaw(filePath, data);
194
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Mapping of harness identifiers to their native session environment variables.
3
+ *
4
+ * Only Pi-specific env vars are kept here. External harness session discovery
5
+ * is handled by adapters session management.
6
+ */
7
+ export declare const HARNESS_ENV_VARS: Record<string, string[]>;
8
+ /**
9
+ * Resolve the current session ID from the ambient environment.
10
+ *
11
+ * This is used for "autodiscovery" in contexts where no explicit session ID
12
+ * was provided (e.g. journaling low-level events).
13
+ *
14
+ * Precedence:
15
+ * 1. Harness-native env vars (Pi / oh-my-pi)
16
+ * 2. AGENT_SESSION_ID
17
+ *
18
+ * PID-scoped marker resolution is handled by the SDK session layer if
19
+ * the SDK is present at runtime. This local implementation covers the
20
+ * environment-variable path which is sufficient for genty-runtime's
21
+ * internal needs (cost journaling, health observation).
22
+ */
23
+ export declare function resolveAmbientSessionId(harness?: string): string | undefined;
24
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/session/discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAGrD,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAc5E"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HARNESS_ENV_VARS = void 0;
4
+ exports.resolveAmbientSessionId = resolveAmbientSessionId;
5
+ /**
6
+ * Mapping of harness identifiers to their native session environment variables.
7
+ *
8
+ * Only Pi-specific env vars are kept here. External harness session discovery
9
+ * is handled by adapters session management.
10
+ */
11
+ exports.HARNESS_ENV_VARS = {
12
+ "pi": ["PI_SESSION_ID"],
13
+ "oh-my-pi": ["OMP_SESSION_ID"],
14
+ };
15
+ /**
16
+ * Resolve the current session ID from the ambient environment.
17
+ *
18
+ * This is used for "autodiscovery" in contexts where no explicit session ID
19
+ * was provided (e.g. journaling low-level events).
20
+ *
21
+ * Precedence:
22
+ * 1. Harness-native env vars (Pi / oh-my-pi)
23
+ * 2. AGENT_SESSION_ID
24
+ *
25
+ * PID-scoped marker resolution is handled by the SDK session layer if
26
+ * the SDK is present at runtime. This local implementation covers the
27
+ * environment-variable path which is sufficient for genty-runtime's
28
+ * internal needs (cost journaling, health observation).
29
+ */
30
+ function resolveAmbientSessionId(harness) {
31
+ if (!harness) {
32
+ return process.env.AGENT_SESSION_ID;
33
+ }
34
+ // Check harness-native env vars first.
35
+ const envVars = exports.HARNESS_ENV_VARS[harness] || [];
36
+ for (const key of envVars) {
37
+ const value = process.env[key];
38
+ if (value)
39
+ return value;
40
+ }
41
+ // Fall back to the generic agent session ID.
42
+ return process.env.AGENT_SESSION_ID;
43
+ }
@@ -0,0 +1,4 @@
1
+ import type { SessionTree } from './tree.js';
2
+ export declare function exportToHtml(tree: SessionTree, branchId?: string): string;
3
+ export declare function exportToMarkdown(tree: SessionTree, branchId?: string): string;
4
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/session/export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAY,MAAM,WAAW,CAAC;AAGvD,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CA6BzE;AAmBD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAM7E"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.exportToHtml = exportToHtml;
4
+ exports.exportToMarkdown = exportToMarkdown;
5
+ const tree_js_1 = require("./tree.js");
6
+ function exportToHtml(tree, branchId) {
7
+ const messages = (0, tree_js_1.getMessages)(tree, branchId);
8
+ const rows = messages.map(renderMessageHtml).join('\n');
9
+ return `<!DOCTYPE html>
10
+ <html lang="en">
11
+ <head>
12
+ <meta charset="UTF-8">
13
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
14
+ <title>Genty Session Export</title>
15
+ <style>
16
+ body { font-family: -apple-system, system-ui, sans-serif; max-width: 800px; margin: 0 auto; padding: 2rem; background: #0d1117; color: #c9d1d9; }
17
+ .message { margin: 1rem 0; padding: 1rem; border-radius: 8px; border-left: 3px solid; }
18
+ .user { border-color: #58a6ff; background: #161b22; }
19
+ .assistant { border-color: #3fb950; background: #161b22; }
20
+ .system { border-color: #8b949e; background: #0d1117; }
21
+ .tool { border-color: #d29922; background: #161b22; }
22
+ .role { font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.5rem; opacity: 0.7; }
23
+ .content { white-space: pre-wrap; }
24
+ .timestamp { font-size: 0.7rem; opacity: 0.5; margin-top: 0.5rem; }
25
+ pre { background: #0d1117; padding: 1rem; border-radius: 4px; overflow-x: auto; }
26
+ code { font-family: 'SF Mono', Menlo, monospace; }
27
+ </style>
28
+ </head>
29
+ <body>
30
+ <h1>Genty Session</h1>
31
+ ${rows}
32
+ </body>
33
+ </html>`;
34
+ }
35
+ function renderMessageHtml(node) {
36
+ const escaped = escapeHtml(node.content);
37
+ return ` <div class="message ${node.role}">
38
+ <div class="role">${node.role}${node.bookmark ? ` — 🔖 ${escapeHtml(node.bookmark)}` : ''}</div>
39
+ <div class="content">${escaped}</div>
40
+ <div class="timestamp">${node.timestamp}</div>
41
+ </div>`;
42
+ }
43
+ function escapeHtml(text) {
44
+ return text
45
+ .replace(/&/g, '&amp;')
46
+ .replace(/</g, '&lt;')
47
+ .replace(/>/g, '&gt;')
48
+ .replace(/"/g, '&quot;');
49
+ }
50
+ function exportToMarkdown(tree, branchId) {
51
+ const messages = (0, tree_js_1.getMessages)(tree, branchId);
52
+ return messages.map(node => {
53
+ const header = `### ${node.role.toUpperCase()}${node.bookmark ? ` 🔖 ${node.bookmark}` : ''}`;
54
+ return `${header}\n\n${node.content}\n\n---\n`;
55
+ }).join('\n');
56
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=export.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.test.d.ts","sourceRoot":"","sources":["../../src/session/export.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const tree_js_1 = require("./tree.js");
5
+ const export_js_1 = require("./export.js");
6
+ (0, vitest_1.describe)('session/export', () => {
7
+ (0, vitest_1.it)('exports to HTML with messages', () => {
8
+ const tree = (0, tree_js_1.createSessionTree)();
9
+ (0, tree_js_1.addMessage)(tree, 'user', 'What is 2+2?');
10
+ (0, tree_js_1.addMessage)(tree, 'assistant', 'The answer is 4.');
11
+ const html = (0, export_js_1.exportToHtml)(tree);
12
+ (0, vitest_1.expect)(html).toContain('<!DOCTYPE html>');
13
+ (0, vitest_1.expect)(html).toContain('What is 2+2?');
14
+ (0, vitest_1.expect)(html).toContain('The answer is 4.');
15
+ (0, vitest_1.expect)(html).toContain('class="message user"');
16
+ (0, vitest_1.expect)(html).toContain('class="message assistant"');
17
+ });
18
+ (0, vitest_1.it)('escapes HTML in content', () => {
19
+ const tree = (0, tree_js_1.createSessionTree)();
20
+ (0, tree_js_1.addMessage)(tree, 'user', '<script>alert("xss")</script>');
21
+ const html = (0, export_js_1.exportToHtml)(tree);
22
+ (0, vitest_1.expect)(html).not.toContain('<script>');
23
+ (0, vitest_1.expect)(html).toContain('&lt;script&gt;');
24
+ });
25
+ (0, vitest_1.it)('includes bookmarks in HTML export', () => {
26
+ const tree = (0, tree_js_1.createSessionTree)();
27
+ const m = (0, tree_js_1.addMessage)(tree, 'user', 'Key moment');
28
+ (0, tree_js_1.bookmarkNode)(tree, m.id, 'important');
29
+ const html = (0, export_js_1.exportToHtml)(tree);
30
+ (0, vitest_1.expect)(html).toContain('important');
31
+ });
32
+ (0, vitest_1.it)('exports to markdown', () => {
33
+ const tree = (0, tree_js_1.createSessionTree)();
34
+ (0, tree_js_1.addMessage)(tree, 'user', 'Hello');
35
+ (0, tree_js_1.addMessage)(tree, 'assistant', 'World');
36
+ const md = (0, export_js_1.exportToMarkdown)(tree);
37
+ (0, vitest_1.expect)(md).toContain('### USER');
38
+ (0, vitest_1.expect)(md).toContain('### ASSISTANT');
39
+ (0, vitest_1.expect)(md).toContain('Hello');
40
+ (0, vitest_1.expect)(md).toContain('World');
41
+ });
42
+ });
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Session history persistence for GAP-SESSION-002.
3
+ *
4
+ * Stores accumulated decisions, run summaries, and context snapshots
5
+ * in a dedicated <sessionId>.history.json file alongside the session state.
6
+ * Uses the same atomic temp-file + rename pattern as context.ts.
7
+ */
8
+ import type { SessionDecision, SessionRunSummary, SessionContextSnapshot, SessionHistory } from "./types";
9
+ /** Get the file path for a session's history JSON file. */
10
+ export declare function getSessionHistoryPath(stateDir: string, sessionId: string): string;
11
+ /**
12
+ * Append a decision to the session's history.
13
+ * Automatically adds a timestamp.
14
+ */
15
+ export declare function addDecision(stateDir: string, sessionId: string, decision: Omit<SessionDecision, "timestamp">): Promise<void>;
16
+ /**
17
+ * Append a run summary to the session's history.
18
+ */
19
+ export declare function addRunSummary(stateDir: string, sessionId: string, summary: SessionRunSummary): Promise<void>;
20
+ /**
21
+ * Save a context snapshot to the session's history.
22
+ * Automatically adds a timestamp.
23
+ */
24
+ export declare function saveContextSnapshot(stateDir: string, sessionId: string, snapshot: Omit<SessionContextSnapshot, "timestamp">): Promise<void>;
25
+ /**
26
+ * Get the full session history: SessionContext fields + history arrays.
27
+ * Returns empty defaults when files do not exist.
28
+ */
29
+ export declare function getSessionHistory(stateDir: string, sessionId: string): Promise<SessionHistory>;
30
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/session/history.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACf,MAAM,SAAS,CAAC;AAOjB,2DAA2D;AAC3D,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjF;AAuDD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,GAC3C,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,IAAI,CAAC,sBAAsB,EAAE,WAAW,CAAC,GAClD,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC,CAazB"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ /**
3
+ * Session history persistence for GAP-SESSION-002.
4
+ *
5
+ * Stores accumulated decisions, run summaries, and context snapshots
6
+ * in a dedicated <sessionId>.history.json file alongside the session state.
7
+ * Uses the same atomic temp-file + rename pattern as context.ts.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.getSessionHistoryPath = getSessionHistoryPath;
44
+ exports.addDecision = addDecision;
45
+ exports.addRunSummary = addRunSummary;
46
+ exports.saveContextSnapshot = saveContextSnapshot;
47
+ exports.getSessionHistory = getSessionHistory;
48
+ const node_fs_1 = require("node:fs");
49
+ const path = __importStar(require("node:path"));
50
+ const context_1 = require("./context");
51
+ // ---------------------------------------------------------------------------
52
+ // Path helper
53
+ // ---------------------------------------------------------------------------
54
+ /** Get the file path for a session's history JSON file. */
55
+ function getSessionHistoryPath(stateDir, sessionId) {
56
+ return path.join(stateDir, `${sessionId}.history.json`);
57
+ }
58
+ function emptyHistoryData() {
59
+ return { decisions: [], runSummaries: [], contextSnapshots: [] };
60
+ }
61
+ async function readRawHistory(filePath) {
62
+ let raw;
63
+ try {
64
+ raw = await node_fs_1.promises.readFile(filePath, "utf8");
65
+ }
66
+ catch (error) {
67
+ const err = error;
68
+ if (err.code === "ENOENT") {
69
+ return emptyHistoryData();
70
+ }
71
+ return emptyHistoryData();
72
+ }
73
+ try {
74
+ const data = JSON.parse(raw);
75
+ return {
76
+ decisions: Array.isArray(data.decisions) ? data.decisions : [],
77
+ runSummaries: Array.isArray(data.runSummaries) ? data.runSummaries : [],
78
+ contextSnapshots: Array.isArray(data.contextSnapshots) ? data.contextSnapshots : [],
79
+ };
80
+ }
81
+ catch {
82
+ return emptyHistoryData();
83
+ }
84
+ }
85
+ async function writeRawHistory(filePath, data) {
86
+ const dir = path.dirname(filePath);
87
+ const tempPath = `${filePath}.tmp.${process.pid}`;
88
+ await node_fs_1.promises.mkdir(dir, { recursive: true });
89
+ await node_fs_1.promises.writeFile(tempPath, JSON.stringify(data, null, 2), "utf8");
90
+ await node_fs_1.promises.rename(tempPath, filePath);
91
+ }
92
+ function nowTimestamp() {
93
+ return new Date().toISOString();
94
+ }
95
+ // ---------------------------------------------------------------------------
96
+ // Public API
97
+ // ---------------------------------------------------------------------------
98
+ /**
99
+ * Append a decision to the session's history.
100
+ * Automatically adds a timestamp.
101
+ */
102
+ async function addDecision(stateDir, sessionId, decision) {
103
+ const filePath = getSessionHistoryPath(stateDir, sessionId);
104
+ const data = await readRawHistory(filePath);
105
+ data.decisions.push({ ...decision, timestamp: nowTimestamp() });
106
+ await writeRawHistory(filePath, data);
107
+ }
108
+ /**
109
+ * Append a run summary to the session's history.
110
+ */
111
+ async function addRunSummary(stateDir, sessionId, summary) {
112
+ const filePath = getSessionHistoryPath(stateDir, sessionId);
113
+ const data = await readRawHistory(filePath);
114
+ data.runSummaries.push(summary);
115
+ await writeRawHistory(filePath, data);
116
+ }
117
+ /**
118
+ * Save a context snapshot to the session's history.
119
+ * Automatically adds a timestamp.
120
+ */
121
+ async function saveContextSnapshot(stateDir, sessionId, snapshot) {
122
+ const filePath = getSessionHistoryPath(stateDir, sessionId);
123
+ const data = await readRawHistory(filePath);
124
+ data.contextSnapshots.push({ ...snapshot, timestamp: nowTimestamp() });
125
+ await writeRawHistory(filePath, data);
126
+ }
127
+ /**
128
+ * Get the full session history: SessionContext fields + history arrays.
129
+ * Returns empty defaults when files do not exist.
130
+ */
131
+ async function getSessionHistory(stateDir, sessionId) {
132
+ const [context, rawHistory] = await Promise.all([
133
+ (0, context_1.getSessionContext)(stateDir, sessionId),
134
+ readRawHistory(getSessionHistoryPath(stateDir, sessionId)),
135
+ ]);
136
+ return {
137
+ notes: context.notes,
138
+ sharedKnowledge: context.sharedKnowledge,
139
+ decisions: rawHistory.decisions,
140
+ runSummaries: rawHistory.runSummaries,
141
+ contextSnapshots: rawHistory.contextSnapshots,
142
+ };
143
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Session state management module.
3
+ * Provides utilities for managing babysitter orchestration session state.
4
+ */
5
+ export type { SessionState, SessionFile, SessionContext, SessionDecision, SessionRunSummary, SessionContextSnapshot, SessionHistory, SessionInitOptions, SessionAssociateOptions, SessionResumeOptions, SessionStateOptions, SessionUpdateOptions, SessionInitResult, SessionAssociateResult, SessionResumeResult, SessionStateResult, SessionUpdateResult, } from './types';
6
+ export { SessionError, SessionErrorCode } from './types';
7
+ export { DEFAULT_SESSION_STATE, parseYamlFrontmatter, parseSessionState, readSessionFile, sessionFileExists, validateSessionState, getSessionFilePath, } from './parse';
8
+ export { serializeSessionState, createSessionFileContent, writeSessionFile, updateSessionState, getCurrentTimestamp, isoToEpochSeconds, updateIterationTimes, addRunToSession, getSessionRuns, } from './write';
9
+ export { getSessionContextPath, getSessionContext, updateSessionContext, } from './context';
10
+ export { HARNESS_ENV_VARS, resolveAmbientSessionId, } from './discovery';
11
+ export { getSessionHistoryPath, addDecision, addRunSummary, saveContextSnapshot, getSessionHistory, } from './history';
12
+ export type { SessionFinding, SessionFileModification, SessionBreakpointPattern, SessionPersistentState, } from './persistence';
13
+ export { SESSION_PERSISTENT_SCHEMA_VERSION, getSessionPersistentStatePath, getSessionPersistentState, addFinding, setPreference, recordFileModification, recordBreakpointInteraction, buildResumeContext, } from './persistence';
14
+ export type { ContinuityPhase, ContinuityDecision, ContinuityWorkingContext, ContinuityState, } from './continuityState';
15
+ export { CONTINUITY_STATE_SCHEMA_VERSION, getContinuityStatePath, getContinuityState, setCurrentPhase, upsertDecision, updateWorkingContext, buildContinuityResumePrompt, } from './continuityState';
16
+ export type { MemoryCategory, MemoryConfidence, MemoryEntry, LongTermMemoryStore, MemoryExtractionInput, } from './memoryExtraction';
17
+ export { LONG_TERM_MEMORY_SCHEMA_VERSION, extractMemoriesFromSession, readLongTermMemory, persistMemories, queryMemories, pruneMemories, } from './memoryExtraction';
18
+ export type { SessionBudget, SessionCostState, SessionBudgetAlert, BudgetCheckResult, RunCostUpdate, } from './cost';
19
+ export { getSessionCostPath, getSessionCost, updateSessionCost, setSessionBudget, checkBudget, markThresholdsTriggered, } from './cost';
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EACV,YAAY,EACZ,WAAW,EACX,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAGzD,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,cAAc,GACf,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AAGnB,YAAY,EACV,cAAc,EACd,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,iCAAiC,EACjC,6BAA6B,EAC7B,yBAAyB,EACzB,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,2BAA2B,EAC3B,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAGvB,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,+BAA+B,EAC/B,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;AAG3B,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,+BAA+B,EAC/B,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,aAAa,GACd,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,GACd,MAAM,QAAQ,CAAC;AAChB,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,uBAAuB,GACxB,MAAM,QAAQ,CAAC"}