estela 0.1.39 → 0.2.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.
- package/README.md +96 -0
- package/dist/billing/assign.d.ts +45 -0
- package/dist/billing/assign.d.ts.map +1 -0
- package/dist/billing/assign.js +159 -0
- package/dist/billing/assign.js.map +1 -0
- package/dist/billing/assign.test.d.ts +2 -0
- package/dist/billing/assign.test.d.ts.map +1 -0
- package/dist/billing/assign.test.js +153 -0
- package/dist/billing/assign.test.js.map +1 -0
- package/dist/bin.js +23 -1
- package/dist/bin.js.map +1 -1
- package/dist/cli-import-recover.test.d.ts +2 -0
- package/dist/cli-import-recover.test.d.ts.map +1 -0
- package/dist/cli-import-recover.test.js +191 -0
- package/dist/cli-import-recover.test.js.map +1 -0
- package/dist/cli-quota.test.d.ts +2 -0
- package/dist/cli-quota.test.d.ts.map +1 -0
- package/dist/cli-quota.test.js +281 -0
- package/dist/cli-quota.test.js.map +1 -0
- package/dist/cli-statusline.test.d.ts +2 -0
- package/dist/cli-statusline.test.d.ts.map +1 -0
- package/dist/cli-statusline.test.js +333 -0
- package/dist/cli-statusline.test.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +350 -49
- package/dist/cli.js.map +1 -1
- package/dist/db/store.d.ts +12 -1
- package/dist/db/store.d.ts.map +1 -1
- package/dist/db/store.js +52 -0
- package/dist/db/store.js.map +1 -1
- package/dist/demo.d.ts.map +1 -1
- package/dist/demo.js +53 -0
- package/dist/demo.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +68 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/metrics/quota.d.ts +226 -0
- package/dist/metrics/quota.d.ts.map +1 -0
- package/dist/metrics/quota.js +291 -0
- package/dist/metrics/quota.js.map +1 -0
- package/dist/metrics/quota.test.d.ts +2 -0
- package/dist/metrics/quota.test.d.ts.map +1 -0
- package/dist/metrics/quota.test.js +325 -0
- package/dist/metrics/quota.test.js.map +1 -0
- package/dist/project-of.d.ts +52 -0
- package/dist/project-of.d.ts.map +1 -0
- package/dist/project-of.js +124 -0
- package/dist/project-of.js.map +1 -0
- package/dist/project-of.test.d.ts +2 -0
- package/dist/project-of.test.d.ts.map +1 -0
- package/dist/project-of.test.js +203 -0
- package/dist/project-of.test.js.map +1 -0
- package/dist/quota.d.ts +27 -0
- package/dist/quota.d.ts.map +1 -0
- package/dist/quota.js +79 -0
- package/dist/quota.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +17 -26
- package/dist/server.js.map +1 -1
- package/dist/server.test.js +37 -0
- package/dist/server.test.js.map +1 -1
- package/dist/statusline-cache.d.ts +35 -0
- package/dist/statusline-cache.d.ts.map +1 -0
- package/dist/statusline-cache.js +57 -0
- package/dist/statusline-cache.js.map +1 -0
- package/dist/statusline-install.d.ts +52 -0
- package/dist/statusline-install.d.ts.map +1 -0
- package/dist/statusline-install.js +115 -0
- package/dist/statusline-install.js.map +1 -0
- package/dist/statusline-run.d.ts +8 -0
- package/dist/statusline-run.d.ts.map +1 -0
- package/dist/statusline-run.js +256 -0
- package/dist/statusline-run.js.map +1 -0
- package/dist/statusline.d.ts +71 -0
- package/dist/statusline.d.ts.map +1 -0
- package/dist/statusline.js +139 -0
- package/dist/statusline.js.map +1 -0
- package/dist/statusline.test.d.ts +2 -0
- package/dist/statusline.test.d.ts.map +1 -0
- package/dist/statusline.test.js +197 -0
- package/dist/statusline.test.js.map +1 -0
- package/dist/watchers/claude.d.ts +11 -1
- package/dist/watchers/claude.d.ts.map +1 -1
- package/dist/watchers/claude.js +32 -15
- package/dist/watchers/claude.js.map +1 -1
- package/package.json +1 -1
- package/web/app.css +36 -0
- package/web/app.js +61 -1
- package/web/i18n.js +28 -0
- package/web/index.html +4 -1
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
40
|
+
const node_test_1 = require("node:test");
|
|
41
|
+
const schema_js_1 = require("../db/schema.js");
|
|
42
|
+
const store = __importStar(require("../db/store.js"));
|
|
43
|
+
const quota_js_1 = require("../quota.js");
|
|
44
|
+
const quota_js_2 = require("./quota.js");
|
|
45
|
+
/**
|
|
46
|
+
* "¿Qué proyecto se come mi cuota?"
|
|
47
|
+
*
|
|
48
|
+
* Lo que no puede fallar: que un turno repetido cuente dos veces (inflaría a un
|
|
49
|
+
* proyecto), que la semana empiece donde no es, y que se compare con un
|
|
50
|
+
* historial que no existe. Todo lo demás es presentación.
|
|
51
|
+
*/
|
|
52
|
+
const tok = (total, over = {}) => ({ input: 0, output: 0, cacheRead: total, cacheWrite5m: 0, cacheWrite1h: 0, ...over });
|
|
53
|
+
const turno = (at, repoPath, total, agent = "claude-code") => ({ agent, at: new Date(at), repoPath, tokens: tok(total) });
|
|
54
|
+
const porCarpeta = (repoPath) => repoPath ? { kind: "project", projectId: repoPath, projectName: repoPath } : { kind: "none" };
|
|
55
|
+
/** Fechas en hora local: los tests no dependen de la zona de quien los corre. */
|
|
56
|
+
const local = (y, m, d, h = 0, min = 0) => new Date(y, m - 1, d, h, min);
|
|
57
|
+
// ── La semana ───────────────────────────────────────────────────────────
|
|
58
|
+
(0, node_test_1.test)("la semana empieza el lunes a las 00:00 en hora local, también un domingo por la noche", () => {
|
|
59
|
+
// 2026-10-11 es domingo; 2026-10-05, lunes.
|
|
60
|
+
strict_1.default.deepEqual((0, quota_js_2.weekStart)(local(2026, 10, 11, 23, 59)), local(2026, 10, 5));
|
|
61
|
+
strict_1.default.deepEqual((0, quota_js_2.weekStart)(local(2026, 10, 5, 0, 0)), local(2026, 10, 5), "el propio lunes a medianoche");
|
|
62
|
+
strict_1.default.deepEqual((0, quota_js_2.weekStart)(local(2026, 10, 7, 15, 0)), local(2026, 10, 5));
|
|
63
|
+
});
|
|
64
|
+
(0, node_test_1.test)("cambio de semana: lo del domingo por la noche no cuenta en la semana que empieza el lunes", () => {
|
|
65
|
+
const now = local(2026, 10, 12, 0, 30); // lunes 00:30
|
|
66
|
+
const r = (0, quota_js_2.buildQuota)({
|
|
67
|
+
turns: [
|
|
68
|
+
{ agent: "claude-code", at: local(2026, 10, 11, 23, 50), repoPath: "/a", tokens: tok(1000) },
|
|
69
|
+
{ agent: "claude-code", at: local(2026, 10, 12, 0, 10), repoPath: "/b", tokens: tok(10) },
|
|
70
|
+
],
|
|
71
|
+
firstTurnAt: new Map(), now, bucketOf: porCarpeta,
|
|
72
|
+
});
|
|
73
|
+
const semana = r.agents[0].week;
|
|
74
|
+
strict_1.default.deepEqual(semana.rows.map((x) => x.bucket.kind === "project" && x.bucket.projectId), ["/b"]);
|
|
75
|
+
strict_1.default.equal(semana.total.total, 10);
|
|
76
|
+
// Pero la ventana de 5 h sí cruza la medianoche: la cuota no sabe de semanas.
|
|
77
|
+
strict_1.default.equal(r.agents[0].window.total.total, 1010);
|
|
78
|
+
});
|
|
79
|
+
(0, node_test_1.test)("la semana del cambio de hora sigue empezando el lunes a las 00:00", () => {
|
|
80
|
+
// En Madrid, el domingo 25 de octubre de 2026 tiene 25 horas. Restar 7×24 h
|
|
81
|
+
// dejaría el "lunes" a las 23:00 del domingo.
|
|
82
|
+
const antes = process.env["TZ"];
|
|
83
|
+
process.env["TZ"] = "Europe/Madrid";
|
|
84
|
+
try {
|
|
85
|
+
const lunes = (0, quota_js_2.weekStart)(local(2026, 10, 28, 12));
|
|
86
|
+
strict_1.default.equal(lunes.getDay(), 1);
|
|
87
|
+
strict_1.default.equal(lunes.getHours(), 0);
|
|
88
|
+
const atras = (0, quota_js_2.sameStretch)(local(2026, 10, 28, 12), 1);
|
|
89
|
+
strict_1.default.equal(atras.start.getDay(), 1);
|
|
90
|
+
strict_1.default.equal(atras.start.getHours(), 0, "el lunes anterior, a medianoche y no a las 23:00 del domingo");
|
|
91
|
+
strict_1.default.equal(atras.end.getDay(), 3);
|
|
92
|
+
strict_1.default.equal(atras.end.getHours(), 12);
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
if (antes === undefined)
|
|
96
|
+
delete process.env["TZ"];
|
|
97
|
+
else
|
|
98
|
+
process.env["TZ"] = antes;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
(0, node_test_1.test)("el mismo tramo de semanas anteriores: de lunes 00:00 al mismo día y hora", () => {
|
|
102
|
+
const t = (0, quota_js_2.sameStretch)(local(2026, 10, 7, 15, 0), 2); // miércoles 15:00, dos semanas atrás
|
|
103
|
+
strict_1.default.deepEqual(t.start, local(2026, 9, 21));
|
|
104
|
+
strict_1.default.deepEqual(t.end, local(2026, 9, 23, 15, 0));
|
|
105
|
+
});
|
|
106
|
+
// ── La ventana de 5 h ───────────────────────────────────────────────────
|
|
107
|
+
(0, node_test_1.test)("una ventana empieza con el primer turno después de que acabe la anterior y dura 5 h", () => {
|
|
108
|
+
const w = (0, quota_js_2.fiveHourWindows)([
|
|
109
|
+
local(2026, 10, 7, 9, 0), local(2026, 10, 7, 13, 59), // misma ventana
|
|
110
|
+
local(2026, 10, 7, 14, 0), // justo al cerrar: nueva
|
|
111
|
+
local(2026, 10, 7, 18, 30), // dentro de la segunda
|
|
112
|
+
]);
|
|
113
|
+
strict_1.default.deepEqual(w.map((x) => [x.start.getHours(), x.end.getHours()]), [[9, 14], [14, 19]]);
|
|
114
|
+
});
|
|
115
|
+
(0, node_test_1.test)("ventana abierta ahora, o la hora en que acabó la última", () => {
|
|
116
|
+
const veces = [local(2026, 10, 7, 9, 0), local(2026, 10, 7, 10, 0)];
|
|
117
|
+
const abierta = (0, quota_js_2.windowAt)(veces, local(2026, 10, 7, 12, 0));
|
|
118
|
+
strict_1.default.deepEqual(abierta.current?.start, local(2026, 10, 7, 9, 0));
|
|
119
|
+
strict_1.default.equal(abierta.lastEnded, null);
|
|
120
|
+
const cerrada = (0, quota_js_2.windowAt)(veces, local(2026, 10, 7, 16, 0));
|
|
121
|
+
strict_1.default.equal(cerrada.current, null);
|
|
122
|
+
strict_1.default.deepEqual(cerrada.lastEnded, local(2026, 10, 7, 14, 0));
|
|
123
|
+
strict_1.default.deepEqual((0, quota_js_2.windowAt)([], local(2026, 10, 7, 16, 0)), { current: null, lastEnded: null });
|
|
124
|
+
});
|
|
125
|
+
// ── Reparto ─────────────────────────────────────────────────────────────
|
|
126
|
+
(0, node_test_1.test)("el reparto va de mayor a menor, con su porcentaje, y suma bien los cinco campos", () => {
|
|
127
|
+
const now = local(2026, 10, 7, 12);
|
|
128
|
+
const r = (0, quota_js_2.buildQuota)({
|
|
129
|
+
turns: [
|
|
130
|
+
{ agent: "claude-code", at: local(2026, 10, 7, 10), repoPath: "/a",
|
|
131
|
+
tokens: { input: 1, output: 2, cacheRead: 3, cacheWrite5m: 4, cacheWrite1h: 5 } },
|
|
132
|
+
turno("2026-10-06T10:00:00", "/b", 45),
|
|
133
|
+
],
|
|
134
|
+
firstTurnAt: new Map(), now, bucketOf: porCarpeta,
|
|
135
|
+
});
|
|
136
|
+
const w = r.agents[0].week;
|
|
137
|
+
strict_1.default.deepEqual(w.rows.map((x) => x.usage.total), [45, 15]);
|
|
138
|
+
strict_1.default.deepEqual(w.rows[1].usage, { input: 1, output: 2, cacheRead: 3, cacheWrite: 9, total: 15 });
|
|
139
|
+
strict_1.default.equal(w.rows[0].share, 0.75);
|
|
140
|
+
strict_1.default.equal(w.total.total, 60);
|
|
141
|
+
});
|
|
142
|
+
(0, node_test_1.test)("un proyecto sin actividad en el periodo no sale en la tabla", () => {
|
|
143
|
+
const db = (0, schema_js_1.openDatabase)(":memory:");
|
|
144
|
+
try {
|
|
145
|
+
store.upsertClient(db, { id: "c", name: "C", currency: "EUR" });
|
|
146
|
+
for (const [id, repo] of [["activo", "/repos/activo"], ["parado", "/repos/parado"]]) {
|
|
147
|
+
store.upsertProject(db, { id, clientId: "c", name: id, repoPaths: [repo], billable: true,
|
|
148
|
+
roundingMinutes: 0, aiCostPolicy: "absorbed", kind: "client" });
|
|
149
|
+
}
|
|
150
|
+
store.saveTurns(db, [turnoGuardado("t1", "/repos/activo", "2026-10-07T10:00:00")]);
|
|
151
|
+
const r = (0, quota_js_1.loadQuotaReport)(db, local(2026, 10, 7, 12));
|
|
152
|
+
const ids = r.agents[0].week.rows.map((x) => x.bucket.kind === "project" ? x.bucket.projectId : "?");
|
|
153
|
+
strict_1.default.deepEqual(ids, ["activo"]);
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
db.close();
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
(0, node_test_1.test)("un turno fuera de cualquier proyecto cuenta, a nombre de su carpeta, y uno sin carpeta también", () => {
|
|
160
|
+
const db = (0, schema_js_1.openDatabase)(":memory:");
|
|
161
|
+
try {
|
|
162
|
+
store.saveTurns(db, [
|
|
163
|
+
turnoGuardado("t1", "/home/yo/notas", "2026-10-07T10:00:00"),
|
|
164
|
+
{ ...turnoGuardado("t2", null, "2026-10-07T10:05:00") },
|
|
165
|
+
]);
|
|
166
|
+
const filas = (0, quota_js_1.loadQuotaReport)(db, local(2026, 10, 7, 12)).agents[0].week.rows.map((x) => x.bucket);
|
|
167
|
+
strict_1.default.deepEqual(filas, [{ kind: "folder", folder: "notas", path: "/home/yo/notas" }, { kind: "none" }]);
|
|
168
|
+
}
|
|
169
|
+
finally {
|
|
170
|
+
db.close();
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
(0, node_test_1.test)("deduplicación: el mismo turno leído dos veces cuenta una sola vez", () => {
|
|
174
|
+
// Es la garantía de los lectores (por message.id en Claude Code) y de la
|
|
175
|
+
// clave primaria de agent_turns. La cuota no la repite: la hereda.
|
|
176
|
+
const db = (0, schema_js_1.openDatabase)(":memory:");
|
|
177
|
+
try {
|
|
178
|
+
const t = turnoGuardado("msg_01ABC", "/repo", "2026-10-07T10:00:00", 1000);
|
|
179
|
+
store.saveTurns(db, [t, t]);
|
|
180
|
+
store.saveTurns(db, [t]);
|
|
181
|
+
const r = (0, quota_js_1.loadQuotaReport)(db, local(2026, 10, 7, 12));
|
|
182
|
+
strict_1.default.equal(r.agents[0].week.total.total, 1000);
|
|
183
|
+
}
|
|
184
|
+
finally {
|
|
185
|
+
db.close();
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
// ── Agentes ─────────────────────────────────────────────────────────────
|
|
189
|
+
(0, node_test_1.test)("Claude Code y Codex van por separado; Copilot queda fuera y se dice", () => {
|
|
190
|
+
const now = local(2026, 10, 7, 12);
|
|
191
|
+
const r = (0, quota_js_2.buildQuota)({
|
|
192
|
+
turns: [
|
|
193
|
+
turno("2026-10-07T10:00:00", "/a", 100, "claude-code"),
|
|
194
|
+
turno("2026-10-07T10:00:00", "/a", 7, "codex"),
|
|
195
|
+
turno("2026-10-07T10:00:00", "/a", 999_999, "copilot"),
|
|
196
|
+
],
|
|
197
|
+
firstTurnAt: new Map(), now, bucketOf: porCarpeta,
|
|
198
|
+
});
|
|
199
|
+
strict_1.default.deepEqual(r.agents.map((a) => [a.agent, a.week.total.total]), [["claude-code", 100], ["codex", 7]]);
|
|
200
|
+
strict_1.default.equal(r.copilotExcluded, true);
|
|
201
|
+
});
|
|
202
|
+
(0, node_test_1.test)("un agente sin actividad no aparece; sin Copilot no se menciona", () => {
|
|
203
|
+
const r = (0, quota_js_2.buildQuota)({
|
|
204
|
+
turns: [turno("2026-10-07T10:00:00", "/a", 100, "claude-code")],
|
|
205
|
+
firstTurnAt: new Map(), now: local(2026, 10, 7, 12), bucketOf: porCarpeta,
|
|
206
|
+
});
|
|
207
|
+
strict_1.default.deepEqual(r.agents.map((a) => a.agent), ["claude-code"]);
|
|
208
|
+
strict_1.default.equal(r.copilotExcluded, false);
|
|
209
|
+
});
|
|
210
|
+
// ── Historial ───────────────────────────────────────────────────────────
|
|
211
|
+
const semanal = (n) => Array.from({ length: n }, (_, i) => ({ at: (0, quota_js_2.sameStretch)(local(2026, 10, 7, 15), i + 1).start, total: 100 }));
|
|
212
|
+
(0, node_test_1.test)("semana sin historial: no se compara, y se dice cuántas semanas hay", () => {
|
|
213
|
+
const now = local(2026, 10, 7, 15);
|
|
214
|
+
// El primer turno es de hace 10 días: solo una semana completa anterior.
|
|
215
|
+
const c = (0, quota_js_2.compareWithHistory)([], local(2026, 9, 28, 9), now);
|
|
216
|
+
strict_1.default.deepEqual(c, { status: "insufficient", completeWeeks: 1, weeks: 4 });
|
|
217
|
+
// Sin ningún turno guardado, ninguna.
|
|
218
|
+
strict_1.default.deepEqual((0, quota_js_2.compareWithHistory)([], null, now), { status: "insufficient", completeWeeks: 0, weeks: 4 });
|
|
219
|
+
});
|
|
220
|
+
(0, node_test_1.test)("con cuatro semanas de historial, media del mismo tramo; una semana vacía cuenta como cero", () => {
|
|
221
|
+
const now = local(2026, 10, 7, 15); // miércoles
|
|
222
|
+
const veces = [
|
|
223
|
+
...semanal(3), // 100 en cada una de las tres últimas
|
|
224
|
+
{ at: local(2026, 10, 6, 10), total: 150 }, // esta semana
|
|
225
|
+
{ at: local(2026, 10, 1, 9), total: 9999 }, // jueves de la semana pasada: fuera del tramo
|
|
226
|
+
];
|
|
227
|
+
// La cuarta semana atrás está cubierta (el primer turno es anterior) pero vacía.
|
|
228
|
+
const c = (0, quota_js_2.compareWithHistory)(veces, local(2026, 8, 1), now);
|
|
229
|
+
strict_1.default.equal(c.status, "ok");
|
|
230
|
+
if (c.status !== "ok")
|
|
231
|
+
return;
|
|
232
|
+
strict_1.default.equal(c.current, 150);
|
|
233
|
+
strict_1.default.equal(c.average, 75, "(100+100+100+0)/4: el jueves pasado no entra en un tramo que acaba el miércoles");
|
|
234
|
+
strict_1.default.equal(c.ratio, 2);
|
|
235
|
+
});
|
|
236
|
+
(0, node_test_1.test)("una media de cero no divide: el ratio va a null", () => {
|
|
237
|
+
const c = (0, quota_js_2.compareWithHistory)([{ at: local(2026, 10, 6, 10), total: 5 }], local(2026, 1, 1), local(2026, 10, 7, 15));
|
|
238
|
+
strict_1.default.equal(c.status, "ok");
|
|
239
|
+
if (c.status === "ok")
|
|
240
|
+
strict_1.default.equal(c.ratio, null);
|
|
241
|
+
});
|
|
242
|
+
// ── JSON ────────────────────────────────────────────────────────────────
|
|
243
|
+
(0, node_test_1.test)("el JSON lleva fechas en ISO, filas homogéneas y avisa de que la ventana es una estimación", () => {
|
|
244
|
+
const r = (0, quota_js_2.buildQuota)({
|
|
245
|
+
turns: [turno("2026-10-07T10:00:00", "/a", 100), turno("2026-10-07T10:30:00", null, 100)],
|
|
246
|
+
firstTurnAt: new Map(), now: local(2026, 10, 7, 12), bucketOf: porCarpeta,
|
|
247
|
+
});
|
|
248
|
+
const j = (0, quota_js_2.quotaToJson)(r);
|
|
249
|
+
strict_1.default.equal(j.windowIsEstimate, true);
|
|
250
|
+
strict_1.default.deepEqual(Object.keys(j.agents[0].week.projects[0]).sort(), ["cacheRead", "cacheWrite", "folder", "input", "listCostMicroUsd", "output", "projectId", "projectName", "share", "total"]);
|
|
251
|
+
strict_1.default.equal(j.agents[0].week.projects[1]["projectId"], null);
|
|
252
|
+
strict_1.default.deepEqual(j.excluded, []);
|
|
253
|
+
strict_1.default.doesNotThrow(() => JSON.parse(JSON.stringify(j)));
|
|
254
|
+
});
|
|
255
|
+
// ---------------------------------------------------------------------------
|
|
256
|
+
function turnoGuardado(turnId, repoPath, at, cacheRead = 100) {
|
|
257
|
+
return {
|
|
258
|
+
agent: "claude-code", turnId, sessionId: "s", at: new Date(at), model: "claude-sonnet-4-6",
|
|
259
|
+
repoPath, branch: "main", tokens: tok(cacheRead), producerVersion: null,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
// ── La ventana que dio Claude Code (resets_at) ──────────────────────────
|
|
263
|
+
(0, node_test_1.test)("con un resets_at de hace menos de 5 h, la ventana empieza 5 h antes del reinicio", () => {
|
|
264
|
+
const now = local(2026, 10, 7, 15, 0);
|
|
265
|
+
const w = (0, quota_js_2.officialWindow)({ resetsAt: local(2026, 10, 7, 17, 30), seenAt: local(2026, 10, 7, 14, 50) }, now);
|
|
266
|
+
strict_1.default.deepEqual(w, { start: local(2026, 10, 7, 12, 30), end: local(2026, 10, 7, 17, 30) });
|
|
267
|
+
});
|
|
268
|
+
(0, node_test_1.test)("un resets_at visto hace 5 h o más, o ya pasado, no vale: se estima", () => {
|
|
269
|
+
const now = local(2026, 10, 7, 15, 0);
|
|
270
|
+
strict_1.default.equal((0, quota_js_2.officialWindow)({ resetsAt: local(2026, 10, 7, 17, 0), seenAt: local(2026, 10, 7, 10, 0) }, now), null, "visto hace 5 h justas");
|
|
271
|
+
strict_1.default.equal((0, quota_js_2.officialWindow)({ resetsAt: local(2026, 10, 7, 14, 59), seenAt: local(2026, 10, 7, 14, 0) }, now), null, "el reinicio ya pasó: la ventana de ahora es otra que nadie ha visto");
|
|
272
|
+
strict_1.default.equal((0, quota_js_2.officialWindow)(null, now), null);
|
|
273
|
+
});
|
|
274
|
+
(0, node_test_1.test)("buildQuota usa la ventana oficial solo para Claude Code, y la marca como no estimada", () => {
|
|
275
|
+
const now = local(2026, 10, 7, 15, 0);
|
|
276
|
+
const r = (0, quota_js_2.buildQuota)({
|
|
277
|
+
turns: [
|
|
278
|
+
{ agent: "claude-code", at: local(2026, 10, 7, 12, 0), repoPath: "/a", tokens: tok(5) }, // antes de la ventana oficial
|
|
279
|
+
{ agent: "claude-code", at: local(2026, 10, 7, 13, 0), repoPath: "/a", tokens: tok(7) },
|
|
280
|
+
{ agent: "codex", at: local(2026, 10, 7, 14, 0), repoPath: "/a", tokens: tok(3) },
|
|
281
|
+
],
|
|
282
|
+
firstTurnAt: new Map(), now, bucketOf: porCarpeta,
|
|
283
|
+
claudeWindow: { start: local(2026, 10, 7, 12, 30), end: local(2026, 10, 7, 17, 30) },
|
|
284
|
+
});
|
|
285
|
+
const claude = r.agents.find((a) => a.agent === "claude-code");
|
|
286
|
+
const codex = r.agents.find((a) => a.agent === "codex");
|
|
287
|
+
strict_1.default.equal(claude.window.estimated, false);
|
|
288
|
+
strict_1.default.deepEqual(claude.window.start, local(2026, 10, 7, 12, 30));
|
|
289
|
+
strict_1.default.equal(claude.window.total.total, 7, "lo de antes del inicio oficial no entra");
|
|
290
|
+
strict_1.default.equal(codex.window.estimated, true, "Codex tiene su propia cuota: sigue estimada");
|
|
291
|
+
const j = (0, quota_js_2.quotaToJson)(r);
|
|
292
|
+
strict_1.default.equal(j.windowIsEstimate, true, "hay una ventana estimada (Codex)");
|
|
293
|
+
});
|
|
294
|
+
// ── --weighted ──────────────────────────────────────────────────────────
|
|
295
|
+
(0, node_test_1.test)("ponderado: el % sale del precio de lista de cada modelo, no de los tokens", () => {
|
|
296
|
+
const at = local(2026, 10, 7, 10);
|
|
297
|
+
const opus = { agent: "claude-code", at, repoPath: "/caro", model: "claude-opus-4-8",
|
|
298
|
+
tokens: { input: 0, output: 10_000, cacheRead: 0, cacheWrite5m: 0, cacheWrite1h: 0 } }; // 10k × 25 $/M = 0,25 $
|
|
299
|
+
const lectura = { agent: "claude-code", at, repoPath: "/barato", model: "claude-sonnet-4-6",
|
|
300
|
+
tokens: { input: 0, output: 0, cacheRead: 100_000, cacheWrite5m: 0, cacheWrite1h: 0 } }; // 100k × 3 $/M × 0,1 = 0,03 $
|
|
301
|
+
const desde = local(2026, 10, 7), hasta = local(2026, 10, 8);
|
|
302
|
+
const tokens = (0, quota_js_2.breakdown)([opus, lectura], desde, hasta, porCarpeta);
|
|
303
|
+
strict_1.default.equal(tokens.weighted, false);
|
|
304
|
+
strict_1.default.equal(tokens.rows[0].bucket.projectId, "/barato", "por tokens gana la caché");
|
|
305
|
+
const precio = (0, quota_js_2.breakdown)([opus, lectura], desde, hasta, porCarpeta, { weighted: true });
|
|
306
|
+
strict_1.default.equal(precio.weighted, true);
|
|
307
|
+
strict_1.default.ok(precio.listCost > 0);
|
|
308
|
+
const caro = precio.rows[0];
|
|
309
|
+
strict_1.default.equal(caro.bucket.projectId, "/caro", "por precio gana Opus: el orden se invierte");
|
|
310
|
+
strict_1.default.equal(caro.listCost, 250_000);
|
|
311
|
+
strict_1.default.equal(precio.rows[1].listCost, 30_000);
|
|
312
|
+
strict_1.default.equal(caro.share, 250_000 / 280_000);
|
|
313
|
+
// Mismos tokens en las dos: ponderar solo cambia el %, no las columnas.
|
|
314
|
+
strict_1.default.deepEqual(precio.total, tokens.total);
|
|
315
|
+
});
|
|
316
|
+
(0, node_test_1.test)("ponderado: un modelo sin precio cuenta como 0 y se cuenta aparte", () => {
|
|
317
|
+
const at = local(2026, 10, 7, 10);
|
|
318
|
+
const b = (0, quota_js_2.breakdown)([
|
|
319
|
+
{ agent: "claude-code", at, repoPath: "/a", model: "modelo-que-no-existe", tokens: tok(1000) },
|
|
320
|
+
{ agent: "claude-code", at, repoPath: "/b", model: "claude-sonnet-4-6", tokens: tok(10) },
|
|
321
|
+
], local(2026, 10, 7), local(2026, 10, 8), porCarpeta, { weighted: true });
|
|
322
|
+
strict_1.default.equal(b.unpriced, 1);
|
|
323
|
+
strict_1.default.equal(b.rows[0].share, 1, "todo el % es del único con precio");
|
|
324
|
+
});
|
|
325
|
+
//# sourceMappingURL=quota.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota.test.js","sourceRoot":"","sources":["../../src/metrics/quota.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gEAAwC;AACxC,yCAAiC;AAIjC,+CAA+C;AAC/C,sDAAwC;AACxC,0CAA8C;AAC9C,yCAGoB;AAEpB;;;;;;GAMG;AAEH,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,OAA4B,EAAE,EAAc,EAAE,CACxE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AAEzF,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,QAAuB,EAAE,KAAa,EAAE,QAAmB,aAAa,EAAa,EAAE,CAChH,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAE9D,MAAM,UAAU,GAAG,CAAC,QAAuB,EAAe,EAAE,CAC1D,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAEhG,iFAAiF;AACjF,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;AAEjG,2EAA2E;AAE3E,IAAA,gBAAI,EAAC,uFAAuF,EAAE,GAAG,EAAE;IACjG,4CAA4C;IAC5C,gBAAM,CAAC,SAAS,CAAC,IAAA,oBAAS,EAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7E,gBAAM,CAAC,SAAS,CAAC,IAAA,oBAAS,EAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,8BAA8B,CAAC,CAAC;IAC1G,gBAAM,CAAC,SAAS,CAAC,IAAA,oBAAS,EAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7E,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,2FAA2F,EAAE,GAAG,EAAE;IACrG,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc;IACtD,MAAM,CAAC,GAAG,IAAA,qBAAU,EAAC;QACnB,KAAK,EAAE;YACL,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;YAC5F,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE;SAC1F;QACD,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU;KAClD,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;IACjC,gBAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACpG,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrC,8EAA8E;IAC9E,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,MAAO,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,mEAAmE,EAAE,GAAG,EAAE;IAC7E,4EAA4E;IAC5E,8CAA8C;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAA,oBAAS,EAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACjD,gBAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QAChC,gBAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,IAAA,sBAAW,EAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,gBAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QACtC,gBAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,8DAA8D,CAAC,CAAC;QACxG,gBAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QACpC,gBAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;;YAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACpF,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,0EAA0E,EAAE,GAAG,EAAE;IACpF,MAAM,CAAC,GAAG,IAAA,sBAAW,EAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,qCAAqC;IAC1F,gBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9C,gBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,2EAA2E;AAE3E,IAAA,gBAAI,EAAC,qFAAqF,EAAE,GAAG,EAAE;IAC/F,MAAM,CAAC,GAAG,IAAA,0BAAe,EAAC;QACxB,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,gBAAgB;QACtE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAA8B,yBAAyB;QAChF,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAA6B,uBAAuB;KAC/E,CAAC,CAAC;IACH,gBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9F,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,yDAAyD,EAAE,GAAG,EAAE;IACnE,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,IAAA,mBAAQ,EAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,gBAAM,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG,IAAA,mBAAQ,EAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACpC,gBAAM,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/D,gBAAM,CAAC,SAAS,CAAC,IAAA,mBAAQ,EAAC,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAChG,CAAC,CAAC,CAAC;AAEH,2EAA2E;AAE3E,IAAA,gBAAI,EAAC,iFAAiF,EAAE,GAAG,EAAE;IAC3F,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,IAAA,qBAAU,EAAC;QACnB,KAAK,EAAE;YACL,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI;gBAChE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;YACnF,KAAK,CAAC,qBAAqB,EAAE,IAAI,EAAE,EAAE,CAAC;SACvC;QACD,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU;KAClD,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;IAC5B,gBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC7D,gBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACpG,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACrC,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,6DAA6D,EAAE,GAAG,EAAE;IACvE,MAAM,EAAE,GAAG,IAAA,wBAAY,EAAC,UAAU,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAChE,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAU,EAAE,CAAC;YAC7F,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI;gBACtF,eAAe,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,eAAe,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACnF,MAAM,CAAC,GAAG,IAAA,0BAAe,EAAC,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACtG,gBAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpC,CAAC;YAAS,CAAC;QAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,gGAAgG,EAAE,GAAG,EAAE;IAC1G,MAAM,EAAE,GAAG,IAAA,wBAAY,EAAC,UAAU,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE;YAClB,aAAa,CAAC,IAAI,EAAE,gBAAgB,EAAE,qBAAqB,CAAC;YAC5D,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,qBAAqB,CAAC,EAAE;SACxD,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,IAAA,0BAAe,EAAC,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACpG,gBAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3G,CAAC;YAAS,CAAC;QAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,mEAAmE,EAAE,GAAG,EAAE;IAC7E,yEAAyE;IACzE,mEAAmE;IACnE,MAAM,EAAE,GAAG,IAAA,wBAAY,EAAC,UAAU,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE,qBAAqB,EAAE,IAAI,CAAC,CAAC;QAC3E,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5B,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,GAAG,IAAA,0BAAe,EAAC,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACtD,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;YAAS,CAAC;QAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,2EAA2E;AAE3E,IAAA,gBAAI,EAAC,qEAAqE,EAAE,GAAG,EAAE;IAC/E,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,IAAA,qBAAU,EAAC;QACnB,KAAK,EAAE;YACL,KAAK,CAAC,qBAAqB,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,CAAC;YACtD,KAAK,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC;YAC9C,KAAK,CAAC,qBAAqB,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC;SACvD;QACD,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU;KAClD,CAAC,CAAC;IACH,gBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3G,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,gEAAgE,EAAE,GAAG,EAAE;IAC1E,MAAM,CAAC,GAAG,IAAA,qBAAU,EAAC;QACnB,KAAK,EAAE,CAAC,KAAK,CAAC,qBAAqB,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;QAC/D,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU;KAC1E,CAAC,CAAC;IACH,gBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAChE,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,2EAA2E;AAE3E,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAA,sBAAW,EAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAE3I,IAAA,gBAAI,EAAC,oEAAoE,EAAE,GAAG,EAAE;IAC9E,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACnC,yEAAyE;IACzE,MAAM,CAAC,GAAG,IAAA,6BAAkB,EAAC,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7D,gBAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5E,sCAAsC;IACtC,gBAAM,CAAC,SAAS,CAAC,IAAA,6BAAkB,EAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AAC9G,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,2FAA2F,EAAE,GAAG,EAAE;IACrG,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY;IAChD,MAAM,KAAK,GAAG;QACZ,GAAG,OAAO,CAAC,CAAC,CAAC,EAAwC,sCAAsC;QAC3F,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAW,cAAc;QACnE,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAW,8CAA8C;KACpG,CAAC;IACF,iFAAiF;IACjF,MAAM,CAAC,GAAG,IAAA,6BAAkB,EAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5D,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO;IAC9B,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7B,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,iFAAiF,CAAC,CAAC;IAC/G,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,iDAAiD,EAAE,GAAG,EAAE;IAC3D,MAAM,CAAC,GAAG,IAAA,6BAAkB,EAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACpH,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI;QAAE,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,2EAA2E;AAE3E,IAAA,gBAAI,EAAC,2FAA2F,EAAE,GAAG,EAAE;IACrG,MAAM,CAAC,GAAG,IAAA,qBAAU,EAAC;QACnB,KAAK,EAAE,CAAC,KAAK,CAAC,qBAAqB,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,qBAAqB,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACzF,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU;KAC1E,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,IAAA,sBAAW,EAAC,CAAC,CAEtB,CAAC;IACF,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IACvC,gBAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,IAAI,EAAE,EACjE,CAAC,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9H,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;IAChE,gBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACjC,gBAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAE9E,SAAS,aAAa,CAAC,MAAc,EAAE,QAAuB,EAAE,EAAU,EAAE,SAAS,GAAG,GAAG;IACzF,OAAO;QACL,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,mBAAmB;QAC1F,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,eAAe,EAAE,IAAI;KACxE,CAAC;AACJ,CAAC;AAED,2EAA2E;AAE3E,IAAA,gBAAI,EAAC,kFAAkF,EAAE,GAAG,EAAE;IAC5F,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAA,yBAAc,EAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC5G,gBAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AAC9F,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,oEAAoE,EAAE,GAAG,EAAE;IAC9E,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACtC,gBAAM,CAAC,KAAK,CAAC,IAAA,yBAAc,EAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAChH,uBAAuB,CAAC,CAAC;IAC3B,gBAAM,CAAC,KAAK,CAAC,IAAA,yBAAc,EAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EACjH,qEAAqE,CAAC,CAAC;IACzE,gBAAM,CAAC,KAAK,CAAC,IAAA,yBAAc,EAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,sFAAsF,EAAE,GAAG,EAAE;IAChG,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAA,qBAAU,EAAC;QACnB,KAAK,EAAE;YACL,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAG,8BAA8B;YACxH,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE;YACvF,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE;SAClF;QACD,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU;QACjD,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;KACrF,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,aAAa,CAAE,CAAC;IAChE,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAE,CAAC;IACzD,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC9C,gBAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAO,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACnE,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,yCAAyC,CAAC,CAAC;IACvF,gBAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAO,CAAC,SAAS,EAAE,IAAI,EAAE,6CAA6C,CAAC,CAAC;IAC3F,MAAM,CAAC,GAAG,IAAA,sBAAW,EAAC,CAAC,CAAkC,CAAC;IAC1D,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,EAAE,IAAI,EAAE,kCAAkC,CAAC,CAAC;AAC7E,CAAC,CAAC,CAAC;AAEH,2EAA2E;AAE3E,IAAA,gBAAI,EAAC,2EAA2E,EAAE,GAAG,EAAE;IACrF,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,aAAsB,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB;QAC3F,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,CAAG,wBAAwB;IACpH,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,aAAsB,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,mBAAmB;QAClG,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,8BAA8B;IACzH,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,IAAA,oBAAS,EAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACpE,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrC,gBAAM,CAAC,KAAK,CAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,MAAgC,CAAC,SAAS,EAAE,SAAS,EAAE,0BAA0B,CAAC,CAAC;IAEjH,MAAM,MAAM,GAAG,IAAA,oBAAS,EAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACxF,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACpC,gBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;IAC7B,gBAAM,CAAC,KAAK,CAAE,IAAI,CAAC,MAAgC,CAAC,SAAS,EAAE,OAAO,EAAE,4CAA4C,CAAC,CAAC;IACtH,gBAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrC,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/C,gBAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC;IAC5C,wEAAwE;IACxE,gBAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,kEAAkE,EAAE,GAAG,EAAE;IAC5E,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,IAAA,oBAAS,EAAC;QAClB,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;QAC9F,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE;KAC1F,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC5B,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,KAAK,EAAE,CAAC,EAAE,mCAAmC,CAAC,CAAC;AACzE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
2
|
+
/**
|
|
3
|
+
* A qué proyecto pertenece una carpeta de trabajo: lo comparten `estela quota`
|
|
4
|
+
* y `estela statusline`.
|
|
5
|
+
*
|
|
6
|
+
* El `cwd` de una sesión no siempre está dentro de la carpeta registrada:
|
|
7
|
+
* un worktree vive al lado del repositorio (`../web-feature`), y una sesión
|
|
8
|
+
* abierta en `repo/src` de un repo sin registrar se llamaba "src". Por eso,
|
|
9
|
+
* en este orden:
|
|
10
|
+
*
|
|
11
|
+
* 1. La carpeta tal cual contra los proyectos registrados (el prefijo más
|
|
12
|
+
* largo gana). Cubre `repo/src` y también un subproyecto registrado
|
|
13
|
+
* dentro de un monorepo (`repo/packages/x`), que resolviendo antes a la
|
|
14
|
+
* raíz git se perdería.
|
|
15
|
+
* 2. La raíz git — y si es un worktree, la del repositorio principal —
|
|
16
|
+
* contra los proyectos registrados.
|
|
17
|
+
* 3. Si nada coincide, "sin proyecto" con el nombre de la raíz git, nunca
|
|
18
|
+
* el de una subcarpeta. Fuera de git, la propia carpeta.
|
|
19
|
+
*/
|
|
20
|
+
export type Owner = {
|
|
21
|
+
readonly kind: "project";
|
|
22
|
+
readonly projectId: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* `path` agrupa (dos repos pueden llamarse igual); `name` es lo que se
|
|
26
|
+
* enseña; `inGit` dice si es la raíz de un repo o una carpeta suelta.
|
|
27
|
+
*/
|
|
28
|
+
| {
|
|
29
|
+
readonly kind: "folder";
|
|
30
|
+
readonly path: string;
|
|
31
|
+
readonly name: string;
|
|
32
|
+
readonly inGit: boolean;
|
|
33
|
+
} | {
|
|
34
|
+
readonly kind: "none";
|
|
35
|
+
};
|
|
36
|
+
/** Un resolvedor con caché: una semana tiene miles de turnos y pocas carpetas. */
|
|
37
|
+
export declare function ownerResolver(db: DatabaseSync): (dir: string | null) => Owner;
|
|
38
|
+
/** El nombre de una carpeta para enseñarlo: la última parte de la ruta. */
|
|
39
|
+
export declare function folderName(path: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* La raíz del repositorio git que contiene `dir`, o null si no está en git.
|
|
42
|
+
*
|
|
43
|
+
* Se sube hasta encontrar `.git`. Si es una carpeta, esa es la raíz. Si es un
|
|
44
|
+
* fichero (`gitdir: …`), es un worktree o un submódulo: un worktree tiene un
|
|
45
|
+
* `commondir` que apunta al `.git` del repositorio principal, y la raíz es la
|
|
46
|
+
* de ese; un submódulo no lo tiene, y es su propio repositorio.
|
|
47
|
+
*
|
|
48
|
+
* Solo lee el disco, sin ejecutar git: se llama en cada evento de la status
|
|
49
|
+
* line. Si la carpeta ya no existe (un worktree borrado), sube igualmente.
|
|
50
|
+
*/
|
|
51
|
+
export declare function gitRoot(dir: string): string | null;
|
|
52
|
+
//# sourceMappingURL=project-of.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-of.d.ts","sourceRoot":"","sources":["../src/project-of.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,MAAM,KAAK,GACb;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAC1D;;;GAGG;GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAClG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9B,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,KAAK,KAAK,CAW7E;AAcD,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBlD"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ownerResolver = ownerResolver;
|
|
37
|
+
exports.folderName = folderName;
|
|
38
|
+
exports.gitRoot = gitRoot;
|
|
39
|
+
const node_fs_1 = require("node:fs");
|
|
40
|
+
const node_path_1 = require("node:path");
|
|
41
|
+
const store = __importStar(require("./db/store.js"));
|
|
42
|
+
const paths_js_1 = require("./paths.js");
|
|
43
|
+
/** Un resolvedor con caché: una semana tiene miles de turnos y pocas carpetas. */
|
|
44
|
+
function ownerResolver(db) {
|
|
45
|
+
const cache = new Map();
|
|
46
|
+
return (dir) => {
|
|
47
|
+
if (!dir)
|
|
48
|
+
return { kind: "none" };
|
|
49
|
+
let owner = cache.get(dir);
|
|
50
|
+
if (!owner) {
|
|
51
|
+
owner = resolveOwner(db, dir);
|
|
52
|
+
cache.set(dir, owner);
|
|
53
|
+
}
|
|
54
|
+
return owner;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function resolveOwner(db, dir) {
|
|
58
|
+
const direct = store.projectForRepo(db, dir);
|
|
59
|
+
if (direct)
|
|
60
|
+
return { kind: "project", projectId: direct };
|
|
61
|
+
const root = gitRoot(dir);
|
|
62
|
+
if (root && root !== dir) {
|
|
63
|
+
const viaRoot = store.projectForRepo(db, root);
|
|
64
|
+
if (viaRoot)
|
|
65
|
+
return { kind: "project", projectId: viaRoot };
|
|
66
|
+
}
|
|
67
|
+
const path = root ?? (0, paths_js_1.normalizePath)(dir);
|
|
68
|
+
return { kind: "folder", path, name: folderName(path), inGit: root !== null };
|
|
69
|
+
}
|
|
70
|
+
/** El nombre de una carpeta para enseñarlo: la última parte de la ruta. */
|
|
71
|
+
function folderName(path) {
|
|
72
|
+
return (0, node_path_1.basename)(path.replace(/[\\/]+$/, "")) || path;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* La raíz del repositorio git que contiene `dir`, o null si no está en git.
|
|
76
|
+
*
|
|
77
|
+
* Se sube hasta encontrar `.git`. Si es una carpeta, esa es la raíz. Si es un
|
|
78
|
+
* fichero (`gitdir: …`), es un worktree o un submódulo: un worktree tiene un
|
|
79
|
+
* `commondir` que apunta al `.git` del repositorio principal, y la raíz es la
|
|
80
|
+
* de ese; un submódulo no lo tiene, y es su propio repositorio.
|
|
81
|
+
*
|
|
82
|
+
* Solo lee el disco, sin ejecutar git: se llama en cada evento de la status
|
|
83
|
+
* line. Si la carpeta ya no existe (un worktree borrado), sube igualmente.
|
|
84
|
+
*/
|
|
85
|
+
function gitRoot(dir) {
|
|
86
|
+
// Una ruta relativa (o "~/…", como en la demo) se resolvería contra la
|
|
87
|
+
// carpeta desde la que se ejecuta Estela, y acabaría en el repo de quien la
|
|
88
|
+
// ejecuta. Los cwd de verdad son absolutos.
|
|
89
|
+
if (!(0, node_path_1.isAbsolute)(dir))
|
|
90
|
+
return null;
|
|
91
|
+
let d = (0, node_path_1.resolve)(dir);
|
|
92
|
+
for (;;) {
|
|
93
|
+
const dotGit = (0, node_path_1.join)(d, ".git");
|
|
94
|
+
try {
|
|
95
|
+
const st = (0, node_fs_1.statSync)(dotGit);
|
|
96
|
+
if (st.isDirectory())
|
|
97
|
+
return (0, paths_js_1.normalizePath)(d);
|
|
98
|
+
if (st.isFile())
|
|
99
|
+
return (0, paths_js_1.normalizePath)(worktreeMain(dotGit) ?? d);
|
|
100
|
+
}
|
|
101
|
+
catch { /* no hay .git aquí: se sube */ }
|
|
102
|
+
const parent = (0, node_path_1.dirname)(d);
|
|
103
|
+
if (parent === d)
|
|
104
|
+
return null;
|
|
105
|
+
d = parent;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** La raíz del repositorio principal de un worktree, o null si no lo es. */
|
|
109
|
+
function worktreeMain(dotGitFile) {
|
|
110
|
+
try {
|
|
111
|
+
const m = /^gitdir:\s*(.+?)\s*$/m.exec((0, node_fs_1.readFileSync)(dotGitFile, "utf8"));
|
|
112
|
+
if (!m)
|
|
113
|
+
return null;
|
|
114
|
+
const gitdir = (0, node_path_1.isAbsolute)(m[1]) ? m[1] : (0, node_path_1.resolve)((0, node_path_1.dirname)(dotGitFile), m[1]);
|
|
115
|
+
const common = (0, node_fs_1.readFileSync)((0, node_path_1.join)(gitdir, "commondir"), "utf8").trim();
|
|
116
|
+
const commonDir = (0, node_path_1.isAbsolute)(common) ? common : (0, node_path_1.resolve)(gitdir, common);
|
|
117
|
+
// El .git del principal: su carpeta padre es la raíz del repositorio.
|
|
118
|
+
return (0, node_path_1.basename)(commonDir) === ".git" ? (0, node_path_1.dirname)(commonDir) : null;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=project-of.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-of.js","sourceRoot":"","sources":["../src/project-of.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,sCAWC;AAeD,gCAEC;AAaD,0BAiBC;AA9FD,qCAAiD;AACjD,yCAAyE;AAGzE,qDAAuC;AACvC,yCAA2C;AA8B3C,kFAAkF;AAClF,SAAgB,aAAa,CAAC,EAAgB;IAC5C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAiB,CAAC;IACvC,OAAO,CAAC,GAAG,EAAE,EAAE;QACb,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAClC,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAC9B,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,EAAgB,EAAE,GAAW;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/C,IAAI,OAAO;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAC9D,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,IAAI,IAAA,wBAAa,EAAC,GAAG,CAAC,CAAC;IACxC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;AAChF,CAAC;AAED,2EAA2E;AAC3E,SAAgB,UAAU,CAAC,IAAY;IACrC,OAAO,IAAA,oBAAQ,EAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;AACvD,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,OAAO,CAAC,GAAW;IACjC,uEAAuE;IACvE,4EAA4E;IAC5E,4CAA4C;IAC5C,IAAI,CAAC,IAAA,sBAAU,EAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,CAAC,GAAG,IAAA,mBAAO,EAAC,GAAG,CAAC,CAAC;IACrB,SAAS,CAAC;QACR,MAAM,MAAM,GAAG,IAAA,gBAAI,EAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAA,kBAAQ,EAAC,MAAM,CAAC,CAAC;YAC5B,IAAI,EAAE,CAAC,WAAW,EAAE;gBAAE,OAAO,IAAA,wBAAa,EAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,EAAE,CAAC,MAAM,EAAE;gBAAE,OAAO,IAAA,wBAAa,EAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,CAAC;QAAC,MAAM,CAAC,CAAC,+BAA+B,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAA,mBAAO,EAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9B,CAAC,GAAG,MAAM,CAAC;IACb,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,SAAS,YAAY,CAAC,UAAkB;IACtC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAA,sBAAY,EAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACpB,MAAM,MAAM,GAAG,IAAA,sBAAU,EAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAA,mBAAO,EAAC,IAAA,mBAAO,EAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,IAAA,sBAAY,EAAC,IAAA,gBAAI,EAAC,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACtE,MAAM,SAAS,GAAG,IAAA,sBAAU,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAA,mBAAO,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxE,sEAAsE;QACtE,OAAO,IAAA,oBAAQ,EAAC,SAAS,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAA,mBAAO,EAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-of.test.d.ts","sourceRoot":"","sources":["../src/project-of.test.ts"],"names":[],"mappings":""}
|