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.
Files changed (90) hide show
  1. package/README.md +96 -0
  2. package/dist/billing/assign.d.ts +45 -0
  3. package/dist/billing/assign.d.ts.map +1 -0
  4. package/dist/billing/assign.js +159 -0
  5. package/dist/billing/assign.js.map +1 -0
  6. package/dist/billing/assign.test.d.ts +2 -0
  7. package/dist/billing/assign.test.d.ts.map +1 -0
  8. package/dist/billing/assign.test.js +153 -0
  9. package/dist/billing/assign.test.js.map +1 -0
  10. package/dist/bin.js +23 -1
  11. package/dist/bin.js.map +1 -1
  12. package/dist/cli-import-recover.test.d.ts +2 -0
  13. package/dist/cli-import-recover.test.d.ts.map +1 -0
  14. package/dist/cli-import-recover.test.js +191 -0
  15. package/dist/cli-import-recover.test.js.map +1 -0
  16. package/dist/cli-quota.test.d.ts +2 -0
  17. package/dist/cli-quota.test.d.ts.map +1 -0
  18. package/dist/cli-quota.test.js +281 -0
  19. package/dist/cli-quota.test.js.map +1 -0
  20. package/dist/cli-statusline.test.d.ts +2 -0
  21. package/dist/cli-statusline.test.d.ts.map +1 -0
  22. package/dist/cli-statusline.test.js +333 -0
  23. package/dist/cli-statusline.test.js.map +1 -0
  24. package/dist/cli.d.ts.map +1 -1
  25. package/dist/cli.js +350 -49
  26. package/dist/cli.js.map +1 -1
  27. package/dist/db/store.d.ts +12 -1
  28. package/dist/db/store.d.ts.map +1 -1
  29. package/dist/db/store.js +52 -0
  30. package/dist/db/store.js.map +1 -1
  31. package/dist/demo.d.ts.map +1 -1
  32. package/dist/demo.js +53 -0
  33. package/dist/demo.js.map +1 -1
  34. package/dist/i18n/en.d.ts.map +1 -1
  35. package/dist/i18n/en.js +68 -0
  36. package/dist/i18n/en.js.map +1 -1
  37. package/dist/metrics/quota.d.ts +226 -0
  38. package/dist/metrics/quota.d.ts.map +1 -0
  39. package/dist/metrics/quota.js +291 -0
  40. package/dist/metrics/quota.js.map +1 -0
  41. package/dist/metrics/quota.test.d.ts +2 -0
  42. package/dist/metrics/quota.test.d.ts.map +1 -0
  43. package/dist/metrics/quota.test.js +325 -0
  44. package/dist/metrics/quota.test.js.map +1 -0
  45. package/dist/project-of.d.ts +52 -0
  46. package/dist/project-of.d.ts.map +1 -0
  47. package/dist/project-of.js +124 -0
  48. package/dist/project-of.js.map +1 -0
  49. package/dist/project-of.test.d.ts +2 -0
  50. package/dist/project-of.test.d.ts.map +1 -0
  51. package/dist/project-of.test.js +203 -0
  52. package/dist/project-of.test.js.map +1 -0
  53. package/dist/quota.d.ts +27 -0
  54. package/dist/quota.d.ts.map +1 -0
  55. package/dist/quota.js +79 -0
  56. package/dist/quota.js.map +1 -0
  57. package/dist/server.d.ts.map +1 -1
  58. package/dist/server.js +17 -26
  59. package/dist/server.js.map +1 -1
  60. package/dist/server.test.js +37 -0
  61. package/dist/server.test.js.map +1 -1
  62. package/dist/statusline-cache.d.ts +35 -0
  63. package/dist/statusline-cache.d.ts.map +1 -0
  64. package/dist/statusline-cache.js +57 -0
  65. package/dist/statusline-cache.js.map +1 -0
  66. package/dist/statusline-install.d.ts +52 -0
  67. package/dist/statusline-install.d.ts.map +1 -0
  68. package/dist/statusline-install.js +115 -0
  69. package/dist/statusline-install.js.map +1 -0
  70. package/dist/statusline-run.d.ts +8 -0
  71. package/dist/statusline-run.d.ts.map +1 -0
  72. package/dist/statusline-run.js +256 -0
  73. package/dist/statusline-run.js.map +1 -0
  74. package/dist/statusline.d.ts +71 -0
  75. package/dist/statusline.d.ts.map +1 -0
  76. package/dist/statusline.js +139 -0
  77. package/dist/statusline.js.map +1 -0
  78. package/dist/statusline.test.d.ts +2 -0
  79. package/dist/statusline.test.d.ts.map +1 -0
  80. package/dist/statusline.test.js +197 -0
  81. package/dist/statusline.test.js.map +1 -0
  82. package/dist/watchers/claude.d.ts +11 -1
  83. package/dist/watchers/claude.d.ts.map +1 -1
  84. package/dist/watchers/claude.js +32 -15
  85. package/dist/watchers/claude.js.map +1 -1
  86. package/package.json +1 -1
  87. package/web/app.css +36 -0
  88. package/web/app.js +61 -1
  89. package/web/i18n.js +28 -0
  90. package/web/index.html +4 -1
@@ -0,0 +1,191 @@
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_child_process_1 = require("node:child_process");
41
+ const node_fs_1 = require("node:fs");
42
+ const node_os_1 = require("node:os");
43
+ const node_path_1 = require("node:path");
44
+ const node_test_1 = require("node:test");
45
+ const shared_1 = require("@estela/shared");
46
+ const schema_js_1 = require("./db/schema.js");
47
+ const store = __importStar(require("./db/store.js"));
48
+ const paths_js_1 = require("./paths.js");
49
+ /**
50
+ * `estela import` y las horas de subcarpetas y worktrees, como lo vive quien
51
+ * actualiza: la primera vez que cambiarían horas ya importadas se enseñan y se
52
+ * pide permiso; sin terminal no se aplica nada; con --yes, sí.
53
+ */
54
+ const BIN = (0, node_path_1.join)(__dirname, "bin.js");
55
+ const n = (p) => (0, paths_js_1.normalizePath)(p);
56
+ function escenario() {
57
+ const home = (0, node_fs_1.realpathSync)((0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), "estela-recover-")));
58
+ const main = (0, node_path_1.join)(home, "repos", "web");
59
+ (0, node_fs_1.mkdirSync)((0, node_path_1.join)(main, ".git", "worktrees", "wt"), { recursive: true });
60
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(main, ".git", "worktrees", "wt", "commondir"), "../..\n");
61
+ const wt = (0, node_path_1.join)(home, "repos", "web-wt");
62
+ (0, node_fs_1.mkdirSync)(wt, { recursive: true });
63
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(wt, ".git"), `gitdir: ${(0, node_path_1.join)(main, ".git", "worktrees", "wt")}\n`);
64
+ const db = (0, node_path_1.join)(home, ".estela", "estela.db");
65
+ (0, node_fs_1.mkdirSync)((0, node_path_1.join)(home, ".estela"), { recursive: true });
66
+ const conn = (0, schema_js_1.openDatabase)(db);
67
+ try {
68
+ store.upsertClient(conn, { id: "c", name: "C", currency: "EUR" });
69
+ store.upsertProject(conn, { id: "web", clientId: "c", name: "Web", repoPaths: [n(main)], billable: true,
70
+ roundingMinutes: 0, aiCostPolicy: "absorbed", kind: "client" });
71
+ }
72
+ finally {
73
+ conn.close();
74
+ }
75
+ const transcript = (0, node_path_1.join)(home, ".claude", "projects", "-repos", "s.jsonl");
76
+ (0, node_fs_1.mkdirSync)((0, node_path_1.join)(transcript, ".."), { recursive: true });
77
+ (0, node_fs_1.writeFileSync)(transcript, "");
78
+ return { home, main, wt, db, transcript, marca: (0, node_path_1.join)(home, ".estela", ".recover-git-root") };
79
+ }
80
+ let k = 0;
81
+ /** `minutos` turnos de Claude Code, uno por minuto, en `cwd` desde `start`. */
82
+ function sesion(file, cwd, start, minutos, branch = "main") {
83
+ let out = "";
84
+ for (let i = 0; i < minutos; i++) {
85
+ out += JSON.stringify({
86
+ type: "assistant", timestamp: new Date(start.getTime() + i * 60_000).toISOString(), cwd, gitBranch: branch,
87
+ version: "2.1.238", sessionId: `s-${cwd}`,
88
+ message: { id: `m${k++}`, model: "claude-sonnet-4-6",
89
+ usage: { input_tokens: 1, output_tokens: 1, cache_read_input_tokens: 1, cache_creation_input_tokens: 0 } },
90
+ }) + "\n";
91
+ }
92
+ (0, node_fs_1.appendFileSync)(file, out);
93
+ }
94
+ function estela(home, ...args) {
95
+ const r = (0, node_child_process_1.spawnSync)(process.execPath, [BIN, ...args], {
96
+ encoding: "utf8", input: "",
97
+ env: { ...process.env, HOME: home, USERPROFILE: home, ESTELA_LANG: "es", NO_COLOR: "1" },
98
+ });
99
+ return { code: r.status, out: r.stdout + r.stderr };
100
+ }
101
+ function ramas(db) {
102
+ const c = (0, schema_js_1.openDatabase)(db);
103
+ try {
104
+ return store.getTimeEntries(c, "web").map((e) => e.branch ?? "").sort();
105
+ }
106
+ finally {
107
+ c.close();
108
+ }
109
+ }
110
+ const dia = (d, h = 10) => new Date(2026, 9, d, h, 0);
111
+ (0, node_test_1.test)("tras actualizar: vista previa, sin terminal no se aplica, con --yes sí, y no se vuelve a preguntar", () => {
112
+ const { home, main, wt, db, transcript, marca } = escenario();
113
+ sesion(transcript, main, dia(5), 30);
114
+ strict_1.default.equal(estela(home, "import", "--db", db).code, 0);
115
+ // Una base de antes de esta versión: con horas, y sin la marca.
116
+ (0, node_fs_1.rmSync)(marca, { force: true });
117
+ sesion(transcript, wt, dia(6, 15), 45, "feature");
118
+ const previa = estela(home, "import", "--db", db);
119
+ strict_1.default.equal(previa.code, 0, previa.out);
120
+ strict_1.default.match(previa.out, /Estela ahora reconoce las sesiones en subcarpetas y worktrees/);
121
+ strict_1.default.match(previa.out, /Web\s+\+\d+m/);
122
+ strict_1.default.match(previa.out, /No se ha tocado nada\. Cuando quieras: estela import --yes/);
123
+ // A esos bloques no les falta registrarse: les falta el --yes.
124
+ strict_1.default.match(previa.out, /1 de esos bloques son de subcarpetas o worktrees de un proyecto: estela import --yes los imputa/);
125
+ strict_1.default.doesNotMatch(previa.out, /Regístralos con/);
126
+ strict_1.default.deepEqual(ramas(db), ["main"], "sin confirmar, nada cambia");
127
+ strict_1.default.ok(!(0, node_fs_1.existsSync)(marca));
128
+ const si = estela(home, "import", "--db", db, "--yes");
129
+ strict_1.default.equal(si.code, 0, si.out);
130
+ strict_1.default.deepEqual(ramas(db), ["feature", "main"]);
131
+ strict_1.default.match(si.out, /recuperadas de sesiones en subcarpetas y worktrees/);
132
+ strict_1.default.ok((0, node_fs_1.existsSync)(marca));
133
+ const otra = estela(home, "import", "--db", db);
134
+ strict_1.default.doesNotMatch(otra.out, /Estela ahora reconoce/, "la vista previa es solo la primera vez");
135
+ });
136
+ (0, node_test_1.test)("una base nueva no tiene nada que cambiar: se aplica sin preguntar", () => {
137
+ const { home, main, wt, db, transcript, marca } = escenario();
138
+ sesion(transcript, main, dia(5), 30);
139
+ sesion(transcript, wt, dia(5, 15), 30, "feature");
140
+ const r = estela(home, "import", "--db", db);
141
+ strict_1.default.doesNotMatch(r.out, /Estela ahora reconoce/);
142
+ strict_1.default.deepEqual(ramas(db), ["feature", "main"]);
143
+ strict_1.default.ok((0, node_fs_1.existsSync)(marca));
144
+ });
145
+ (0, node_test_1.test)("un día aprobado no se toca: aviso con la fecha, las horas y el comando", () => {
146
+ const { home, main, wt, db, transcript, marca } = escenario();
147
+ sesion(transcript, main, dia(5), 30);
148
+ estela(home, "import", "--db", db);
149
+ (0, node_fs_1.rmSync)(marca, { force: true });
150
+ const c = (0, schema_js_1.openDatabase)(db);
151
+ const antes = (() => {
152
+ try {
153
+ c.prepare("UPDATE time_entries SET approved = 1").run();
154
+ return store.getTimeEntries(c, "web")[0].seconds;
155
+ }
156
+ finally {
157
+ c.close();
158
+ }
159
+ })();
160
+ sesion(transcript, wt, dia(5, 15), 40); // mismo día aprobado, misma rama
161
+ sesion(transcript, wt, dia(7, 9), 20, "feature"); // día libre
162
+ const r = estela(home, "import", "--db", db, "--yes");
163
+ strict_1.default.equal(r.code, 0, r.out);
164
+ strict_1.default.match(r.out, new RegExp(`${(0, shared_1.localDate)(dia(5))} · Web: \\d+m recuperables\\. Revísalo con: estela entries --project web`));
165
+ const d = (0, schema_js_1.openDatabase)(db);
166
+ try {
167
+ const entradas = store.getTimeEntries(d, "web");
168
+ strict_1.default.equal(entradas.find((e) => e.branch === "main").seconds, antes, "el día aprobado sigue igual");
169
+ strict_1.default.ok(entradas.some((e) => e.branch === "feature"), "el día libre sí se recupera");
170
+ }
171
+ finally {
172
+ d.close();
173
+ }
174
+ });
175
+ (0, node_test_1.test)("el import automático del panel solo recupera si ya se confirmó desde la terminal", () => {
176
+ const { home, main, wt, db, transcript, marca } = escenario();
177
+ sesion(transcript, main, dia(5), 30);
178
+ estela(home, "import", "--db", db);
179
+ (0, node_fs_1.rmSync)(marca, { force: true });
180
+ sesion(transcript, wt, dia(6, 15), 30, "feature");
181
+ const panel = () => (0, node_child_process_1.spawnSync)(process.execPath, ["-e", `
182
+ require(${JSON.stringify((0, node_path_1.join)(__dirname, "server.js"))})
183
+ .startServer({ port: ${4900 + Math.floor(Math.random() * 90)}, dbPath: ${JSON.stringify(db)}, autoImportMinutes: 0 })
184
+ .then(async (u) => { await fetch(u + "/api/import", { method: "POST" }); process.exit(0); });`], { encoding: "utf8", env: { ...process.env, HOME: home, USERPROFILE: home } });
185
+ panel();
186
+ strict_1.default.deepEqual(ramas(db), ["main"], "sin la marca, el panel no cambia horas por su cuenta");
187
+ (0, node_fs_1.writeFileSync)(marca, "x");
188
+ panel();
189
+ strict_1.default.deepEqual(ramas(db), ["feature", "main"]);
190
+ });
191
+ //# sourceMappingURL=cli-import-recover.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-import-recover.test.js","sourceRoot":"","sources":["../src/cli-import-recover.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gEAAwC;AACxC,2DAA+C;AAC/C,qCAAkH;AAClH,qCAAiC;AACjC,yCAAiC;AACjC,yCAAiC;AAEjC,2CAA2C;AAE3C,8CAA8C;AAC9C,qDAAuC;AACvC,yCAA2C;AAE3C;;;;GAIG;AAEH,MAAM,GAAG,GAAG,IAAA,gBAAI,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACtC,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAA,wBAAa,EAAC,CAAC,CAAC,CAAC;AAE1C,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,IAAA,sBAAY,EAAC,IAAA,qBAAW,EAAC,IAAA,gBAAI,EAAC,IAAA,gBAAM,GAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,IAAA,gBAAI,EAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACxC,IAAA,mBAAS,EAAC,IAAA,gBAAI,EAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,IAAA,uBAAa,EAAC,IAAA,gBAAI,EAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7E,MAAM,EAAE,GAAG,IAAA,gBAAI,EAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACzC,IAAA,mBAAS,EAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnC,IAAA,uBAAa,EAAC,IAAA,gBAAI,EAAC,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,IAAA,gBAAI,EAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACtF,MAAM,EAAE,GAAG,IAAA,gBAAI,EAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC9C,IAAA,mBAAS,EAAC,IAAA,gBAAI,EAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAA,wBAAY,EAAC,EAAE,CAAC,CAAC;IAC9B,IAAI,CAAC;QACH,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI;YACrG,eAAe,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;YAAS,CAAC;QAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;IAC3B,MAAM,UAAU,GAAG,IAAA,gBAAI,EAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC1E,IAAA,mBAAS,EAAC,IAAA,gBAAI,EAAC,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,IAAA,uBAAa,EAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC9B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,IAAA,gBAAI,EAAC,IAAI,EAAE,SAAS,EAAE,mBAAmB,CAAC,EAAE,CAAC;AAC/F,CAAC;AAED,IAAI,CAAC,GAAG,CAAC,CAAC;AACV,+EAA+E;AAC/E,SAAS,MAAM,CAAC,IAAY,EAAE,GAAW,EAAE,KAAW,EAAE,OAAe,EAAE,MAAM,GAAG,MAAM;IACtF,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC;YACpB,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM;YAC1G,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,GAAG,EAAE;YACzC,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,mBAAmB;gBAClD,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,uBAAuB,EAAE,CAAC,EAAE,2BAA2B,EAAE,CAAC,EAAE,EAAE;SAC7G,CAAC,GAAG,IAAI,CAAC;IACZ,CAAC;IACD,IAAA,wBAAc,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,MAAM,CAAC,IAAY,EAAE,GAAG,IAAc;IAC7C,MAAM,CAAC,GAAG,IAAA,8BAAS,EAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE;QACpD,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;QAC3B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE;KACzF,CAAC,CAAC;IACH,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,MAAM,CAAC,GAAG,IAAA,wBAAY,EAAC,EAAE,CAAC,CAAC;IAC3B,IAAI,CAAC;QAAC,OAAO,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAAC,CAAC;YAAS,CAAC;QAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACzG,CAAC;AAED,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAE9D,IAAA,gBAAI,EAAC,oGAAoG,EAAE,GAAG,EAAE;IAC9G,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,CAAC;IAC9D,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrC,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACzD,gEAAgE;IAChE,IAAA,gBAAM,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/B,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;IAElD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAClD,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACzC,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,+DAA+D,CAAC,CAAC;IAC1F,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACzC,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,4DAA4D,CAAC,CAAC;IACvF,+DAA+D;IAC/D,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,iGAAiG,CAAC,CAAC;IAC5H,gBAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IACnD,gBAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,4BAA4B,CAAC,CAAC;IACpE,gBAAM,CAAC,EAAE,CAAC,CAAC,IAAA,oBAAU,EAAC,KAAK,CAAC,CAAC,CAAC;IAE9B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACvD,gBAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,gBAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,gBAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,oDAAoD,CAAC,CAAC;IAC3E,gBAAM,CAAC,EAAE,CAAC,IAAA,oBAAU,EAAC,KAAK,CAAC,CAAC,CAAC;IAE7B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAChD,gBAAM,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,uBAAuB,EAAE,wCAAwC,CAAC,CAAC;AACnG,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,mEAAmE,EAAE,GAAG,EAAE;IAC7E,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,CAAC;IAC9D,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;IAClD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAC7C,gBAAM,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;IACpD,gBAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,gBAAM,CAAC,EAAE,CAAC,IAAA,oBAAU,EAAC,KAAK,CAAC,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,wEAAwE,EAAE,GAAG,EAAE;IAClF,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,CAAC;IAC9D,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACnC,IAAA,gBAAM,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/B,MAAM,CAAC,GAAG,IAAA,wBAAY,EAAC,EAAE,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE;QAClB,IAAI,CAAC;YACH,CAAC,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC;QACpD,CAAC;gBAAS,CAAC;YAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;IAC1B,CAAC,CAAC,EAAE,CAAC;IACL,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAU,iCAAiC;IAClF,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,YAAY;IAE9D,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACtD,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/B,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,GAAG,IAAA,kBAAS,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,0EAA0E,CAAC,CAAC,CAAC;IAChI,MAAM,CAAC,GAAG,IAAA,wBAAY,EAAC,EAAE,CAAC,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAChD,gBAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAE,CAAC,OAAO,EAAE,KAAK,EAAE,6BAA6B,CAAC,CAAC;QACvG,gBAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,6BAA6B,CAAC,CAAC;IACzF,CAAC;YAAS,CAAC;QAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,kFAAkF,EAAE,GAAG,EAAE;IAC5F,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,CAAC;IAC9D,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACnC,IAAA,gBAAM,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/B,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;IAElD,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAA,8BAAS,EAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;cAC3C,IAAI,CAAC,SAAS,CAAC,IAAA,gBAAI,EAAC,SAAS,EAAE,WAAW,CAAC,CAAC;6BAC7B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;oGACG,CAAC,EACjG,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAEhF,KAAK,EAAE,CAAC;IACR,gBAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,sDAAsD,CAAC,CAAC;IAC9F,IAAA,uBAAa,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1B,KAAK,EAAE,CAAC;IACR,gBAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli-quota.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-quota.test.d.ts","sourceRoot":"","sources":["../src/cli-quota.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,281 @@
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_child_process_1 = require("node:child_process");
41
+ const node_fs_1 = require("node:fs");
42
+ const node_os_1 = require("node:os");
43
+ const node_path_1 = require("node:path");
44
+ const node_test_1 = require("node:test");
45
+ const schema_js_1 = require("./db/schema.js");
46
+ const store = __importStar(require("./db/store.js"));
47
+ const quota_js_1 = require("./metrics/quota.js");
48
+ /**
49
+ * `estela quota`, ejecutando la CLI de verdad.
50
+ *
51
+ * Cada prueba corre con un HOME temporal: el refresco lee los transcripts de
52
+ * ~/.claude, y un test no puede ni leer los de quien lo ejecuta ni depender de
53
+ * que existan.
54
+ */
55
+ const BIN = (0, node_path_1.join)(__dirname, "bin.js");
56
+ function estela(home, lang, ...args) {
57
+ const r = (0, node_child_process_1.spawnSync)(process.execPath, [BIN, ...args], {
58
+ encoding: "utf8",
59
+ env: { ...process.env, HOME: home, USERPROFILE: home, ESTELA_LANG: lang, NO_COLOR: "1" },
60
+ });
61
+ return { code: r.status, out: r.stdout, err: r.stderr };
62
+ }
63
+ /**
64
+ * Datos fijos para la cuota, válidos a cualquier hora de cualquier día.
65
+ *
66
+ * No sirve la demo: pone las sesiones de Codex por la tarde, y un lunes por
67
+ * la mañana la semana aún no tiene ninguna — estos tests fallaban según el
68
+ * momento en que se ejecutaran. Aquí todo cae a mitad de camino entre el
69
+ * lunes a las 00:00 y ahora, que siempre es esta semana.
70
+ */
71
+ function sembrarCuota(dbPath) {
72
+ const ahora = new Date();
73
+ const lunes = (0, quota_js_1.weekStart)(ahora);
74
+ const enEstaSemana = new Date((lunes.getTime() + ahora.getTime()) / 2);
75
+ const haceSemanas = (n) => new Date(lunes.getTime() - n * 7 * 86_400_000 + 3600_000);
76
+ let n = 0;
77
+ const t = (agent, at, repo, cacheRead) => ({
78
+ agent, turnId: `q${n++}`, sessionId: "s", at, model: agent === "codex" ? "gpt-5.6-sol" : "claude-sonnet-4-6", repoPath: repo, branch: "main",
79
+ tokens: { input: 1, output: 10, cacheRead, cacheWrite5m: 0, cacheWrite1h: 0 }, producerVersion: null,
80
+ });
81
+ const db = (0, schema_js_1.openDatabase)(dbPath);
82
+ try {
83
+ store.upsertClient(db, { id: "c", name: "C", currency: "EUR" });
84
+ for (const id of ["web", "api"]) {
85
+ store.upsertProject(db, { id, clientId: "c", name: id, repoPaths: [`/repos/${id}`], billable: true,
86
+ roundingMinutes: 0, aiCostPolicy: "absorbed", kind: "client" });
87
+ }
88
+ store.saveTurns(db, [
89
+ // Claude Code: seis semanas de historial, así que compara.
90
+ t("claude-code", haceSemanas(6), "/repos/web", 100),
91
+ t("claude-code", enEstaSemana, "/repos/web", 3000),
92
+ t("claude-code", enEstaSemana, "/repos/api", 1000),
93
+ // Uno reciente, para que haya una ventana de 5 h abierta (estimada).
94
+ t("claude-code", new Date(Math.max(lunes.getTime(), ahora.getTime() - 30 * 60_000)), "/repos/web", 10),
95
+ // Codex: empezó esta semana, así que no hay con qué comparar.
96
+ t("codex", enEstaSemana, "/repos/api", 500),
97
+ ]);
98
+ }
99
+ finally {
100
+ db.close();
101
+ }
102
+ }
103
+ function entorno() {
104
+ const home = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), "estela-quota-"));
105
+ return { home, db: (0, node_path_1.join)(home, "estela.db") };
106
+ }
107
+ /** Un transcript de Claude Code con un turno de hace media hora, en `cwd`. */
108
+ function transcript(home, cwd, id, cacheRead) {
109
+ const dir = (0, node_path_1.join)(home, ".claude", "projects", "-proyecto");
110
+ (0, node_fs_1.mkdirSync)(dir, { recursive: true });
111
+ const at = new Date(Date.now() - 30 * 60_000).toISOString();
112
+ const linea = JSON.stringify({
113
+ type: "assistant", timestamp: at, cwd, gitBranch: "main", version: "2.1.238", sessionId: "s1",
114
+ message: { id, model: "claude-sonnet-4-6",
115
+ usage: { input_tokens: 10, output_tokens: 100, cache_read_input_tokens: cacheRead,
116
+ cache_creation_input_tokens: 0 } },
117
+ });
118
+ // Dos veces la misma fila: Claude Code repite el turno en el transcript.
119
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(dir, "sesion.jsonl"), `${linea}\n${linea}\n`);
120
+ }
121
+ (0, node_test_1.test)("sin nada guardado, lo dice y sugiere setup en vez de enseñar una tabla vacía", () => {
122
+ const { home, db } = entorno();
123
+ const r = estela(home, "es", "quota", "--db", db, "--no-refresh");
124
+ strict_1.default.equal(r.code, 0, r.err);
125
+ strict_1.default.match(r.out, /Sin turnos de agente guardados\. Empieza con: estela setup/);
126
+ strict_1.default.match(r.out, /no es el límite de tu plan/);
127
+ });
128
+ (0, node_test_1.test)("refresca los transcripts de esta semana antes de calcular, y un turno repetido cuenta una vez", () => {
129
+ const { home, db } = entorno();
130
+ transcript(home, "/repos/web", "msg_cuota_1", 5000);
131
+ const r = estela(home, "es", "quota", "--db", db, "--json");
132
+ strict_1.default.equal(r.code, 0, r.err);
133
+ const j = JSON.parse(r.out);
134
+ strict_1.default.equal(j.agents[0].agent, "claude-code");
135
+ // 10 + 100 + 5000, una sola vez aunque el transcript traiga la fila dos veces.
136
+ strict_1.default.equal(j.agents[0].week.total.total, 5110);
137
+ // Repetirlo no duplica: el turno ya está guardado.
138
+ const otra = JSON.parse(estela(home, "es", "quota", "--db", db, "--json").out);
139
+ strict_1.default.equal(otra.agents[0].week.total.total, 5110);
140
+ });
141
+ (0, node_test_1.test)("--no-refresh no lee transcripts: usa solo lo ya guardado", () => {
142
+ const { home, db } = entorno();
143
+ transcript(home, "/repos/web", "msg_cuota_2", 5000);
144
+ const r = estela(home, "es", "quota", "--db", db, "--no-refresh", "--json");
145
+ strict_1.default.equal(r.code, 0, r.err);
146
+ strict_1.default.deepEqual(JSON.parse(r.out).agents, []);
147
+ });
148
+ (0, node_test_1.test)("sobre la base de la demo nunca lee tus transcripts, aunque no se pase --no-refresh", () => {
149
+ // Mezclaría tu trabajo real con los datos inventados, justo lo que la demo
150
+ // promete no hacer.
151
+ const { home } = entorno();
152
+ const demo = (0, node_path_1.join)(home, "estela-demo.db");
153
+ (0, schema_js_1.openDatabase)(demo).close();
154
+ transcript(home, "/repos/web", "msg_real", 5000);
155
+ const r = estela(home, "es", "quota", "--db", demo, "--json");
156
+ strict_1.default.equal(r.code, 0, r.err);
157
+ const conn = (0, schema_js_1.openDatabase)(demo);
158
+ try {
159
+ strict_1.default.equal(store.firstTurnByAgent(conn).size, 0, "no se guardó ningún turno real en la demo");
160
+ }
161
+ finally {
162
+ conn.close();
163
+ }
164
+ });
165
+ (0, node_test_1.test)("--json es JSON y nada más: ni avisos ni cabeceras en la salida", () => {
166
+ const { home, db } = entorno();
167
+ sembrarCuota(db);
168
+ const r = estela(home, "es", "quota", "--db", db, "--no-refresh", "--json");
169
+ strict_1.default.equal(r.code, 0, r.err);
170
+ const j = JSON.parse(r.out);
171
+ strict_1.default.equal(j.windowIsEstimate, true);
172
+ strict_1.default.equal(j.windowHours, 5);
173
+ strict_1.default.deepEqual(j.agents.map((a) => a.agent), ["claude-code", "codex"]);
174
+ // Seis semanas de Claude Code y Codex recién empezado: uno compara, el otro no.
175
+ strict_1.default.equal(j.agents[0].comparison.status, "ok");
176
+ strict_1.default.equal(j.agents[1].comparison.status, "insufficient");
177
+ const shares = j.agents[0].week.projects.map((p) => p.share);
178
+ strict_1.default.ok(Math.abs(shares.reduce((s, x) => s + x, 0) - 1) < 0.001, "los porcentajes suman el 100 %");
179
+ });
180
+ (0, node_test_1.test)("la salida en texto, en los dos idiomas, sin promesas sobre lo que queda", () => {
181
+ const { home, db } = entorno();
182
+ sembrarCuota(db);
183
+ const es = estela(home, "es", "quota", "--db", db, "--no-refresh").out;
184
+ strict_1.default.match(es, /Claude Code — esta semana \(lun \d+ \w+ → hoy\)/);
185
+ strict_1.default.match(es, /Proyecto\s+Entrada\s+Salida\s+Lect\. caché\s+Escr\. caché\s+Total\s+%/);
186
+ strict_1.default.match(es, /Sin historial suficiente para comparar: hacen falta 4 semanas completas y hay \d\./);
187
+ strict_1.default.match(es, /La ventana de 5 h es una estimación/);
188
+ const en = estela(home, "en", "quota", "--db", db, "--no-refresh").out;
189
+ strict_1.default.match(en, /Claude Code — this week \(Mon \w+ \d+ → today\)/);
190
+ strict_1.default.match(en, /Project\s+Input\s+Output\s+Cache read\s+Cache write\s+Total\s+%/);
191
+ strict_1.default.match(en, /The 5-hour window is an estimate/);
192
+ // La regla que no se rompe: nada de "te quedan" ni de cuándo se acaba.
193
+ for (const out of [es, en]) {
194
+ strict_1.default.doesNotMatch(out, /te quedan|quedan \d|se te acaba|you have \d|left until|runs out/i);
195
+ }
196
+ });
197
+ (0, node_test_1.test)("Copilot queda fuera, y se dice en una línea", () => {
198
+ const { home, db } = entorno();
199
+ const conn = (0, schema_js_1.openDatabase)(db);
200
+ try {
201
+ store.saveTurns(conn, [{
202
+ agent: "copilot", turnId: "copilot:1:end", sessionId: "s", at: new Date(Date.now() - 60_000),
203
+ model: "gpt-4o", repoPath: "/repos/web", branch: null,
204
+ tokens: { input: 900, output: 100, cacheRead: 0, cacheWrite5m: 0, cacheWrite1h: 0 },
205
+ producerVersion: null,
206
+ }]);
207
+ }
208
+ finally {
209
+ conn.close();
210
+ }
211
+ const r = estela(home, "es", "quota", "--db", db, "--no-refresh");
212
+ strict_1.default.match(r.out, /Copilot no guarda tokens fiables y queda fuera de este cálculo\./);
213
+ strict_1.default.match(r.out, /Sin consumo de Claude Code ni Codex esta semana\./);
214
+ const j = JSON.parse(estela(home, "es", "quota", "--db", db, "--no-refresh", "--json").out);
215
+ strict_1.default.deepEqual(j.agents, []);
216
+ strict_1.default.deepEqual(j.excluded.map((e) => e.agent), ["copilot"]);
217
+ });
218
+ // ── La ventana que dio Claude Code ──────────────────────────────────────
219
+ /** Lo que haría Claude Code: llamar a la status line con su rate_limits. */
220
+ function statusline(home, db, resetsAt) {
221
+ (0, node_child_process_1.spawnSync)(process.execPath, [BIN, "statusline", "--db", db, "--no-color"], {
222
+ encoding: "utf8",
223
+ input: JSON.stringify({ workspace: { project_dir: "/repos/web" },
224
+ rate_limits: { five_hour: { used_percentage: 40, resets_at: Math.floor(resetsAt.getTime() / 1000) } } }),
225
+ env: { ...process.env, HOME: home, USERPROFILE: home },
226
+ });
227
+ }
228
+ (0, node_test_1.test)("con el resets_at que guardó la status line, quota dice 'ventana actual' sin 'estimada'", () => {
229
+ const { home, db } = entorno();
230
+ sembrarCuota(db);
231
+ const reinicio = new Date(Date.now() + 2 * 3600_000);
232
+ statusline(home, db, reinicio);
233
+ strict_1.default.ok((0, node_fs_1.existsSync)((0, node_path_1.join)(home, "statusline.json")), "la status line lo guardó junto a la base");
234
+ const es = estela(home, "es", "quota", "--db", db, "--no-refresh").out;
235
+ strict_1.default.match(es, /Claude Code — ventana de 5 h actual: desde las \d\d:\d\d, termina a las \d\d:\d\d/);
236
+ strict_1.default.doesNotMatch(es, /Claude Code — ventana de 5 h actual \(estimada\)/);
237
+ strict_1.default.match(es, /La ventana de 5 h es la que da Claude Code/);
238
+ const j = JSON.parse(estela(home, "es", "quota", "--db", db, "--no-refresh", "--json").out);
239
+ const w = j.agents.find((a) => a.agent === "claude-code").window;
240
+ strict_1.default.equal(w.estimated, false);
241
+ strict_1.default.equal(new Date(w.start).getTime(), Math.floor(reinicio.getTime() / 1000) * 1000 - 5 * 3600_000, "empieza 5 h antes del reinicio");
242
+ });
243
+ (0, node_test_1.test)("un resets_at guardado hace más de 5 h ya no vale: vuelve la estimación", () => {
244
+ const { home, db } = entorno();
245
+ sembrarCuota(db);
246
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(home, "statusline.json"), JSON.stringify({ files: {}, fiveHour: {
247
+ resetsAt: new Date(Date.now() + 3600_000).toISOString(),
248
+ seenAt: new Date(Date.now() - 6 * 3600_000).toISOString(),
249
+ } }));
250
+ const es = estela(home, "es", "quota", "--db", db, "--no-refresh").out;
251
+ strict_1.default.match(es, /Claude Code — ventana de 5 h actual \(estimada\)/);
252
+ });
253
+ (0, node_test_1.test)("la status line no enseña nunca el resets_at, aunque lo guarde", () => {
254
+ const { home, db } = entorno();
255
+ sembrarCuota(db);
256
+ const r = (0, node_child_process_1.spawnSync)(process.execPath, [BIN, "statusline", "--db", db, "--no-color"], {
257
+ encoding: "utf8", env: { ...process.env, HOME: home, USERPROFILE: home, ESTELA_LANG: "es" },
258
+ input: JSON.stringify({ workspace: { project_dir: "/repos/web" },
259
+ rate_limits: { five_hour: { used_percentage: 40, resets_at: Math.floor(Date.now() / 1000) + 3600 } } }),
260
+ });
261
+ strict_1.default.match(r.stdout, /5 h 40 %/);
262
+ strict_1.default.doesNotMatch(r.stdout, /\d\d:\d\d|reinicia|resets/);
263
+ });
264
+ // ── --weighted ──────────────────────────────────────────────────────────
265
+ (0, node_test_1.test)("--weighted: % por precio de lista, con su nota; sin la bandera, por tokens", () => {
266
+ const { home, db } = entorno();
267
+ sembrarCuota(db);
268
+ const normal = estela(home, "es", "quota", "--db", db, "--no-refresh");
269
+ strict_1.default.doesNotMatch(normal.out, /Ponderado por precio de lista/);
270
+ const p = estela(home, "es", "quota", "--db", db, "--no-refresh", "--weighted");
271
+ strict_1.default.equal(p.code, 0, p.err);
272
+ strict_1.default.match(p.out, /Ponderado por precio de lista; no es cómo el proveedor cuenta tu límite\./);
273
+ const en = estela(home, "en", "quota", "--db", db, "--no-refresh", "--weighted");
274
+ strict_1.default.match(en.out, /Weighted by list price; this is not how the provider counts your limit\./);
275
+ const base = JSON.parse(estela(home, "es", "quota", "--db", db, "--no-refresh", "--json").out);
276
+ const pond = JSON.parse(estela(home, "es", "quota", "--db", db, "--no-refresh", "--json", "--weighted").out);
277
+ strict_1.default.equal(base.shareBasis, "tokens");
278
+ strict_1.default.equal(pond.shareBasis, "list-price");
279
+ strict_1.default.ok(pond.agents[0].week.projects.every((r) => typeof r.listCostMicroUsd === "number"));
280
+ });
281
+ //# sourceMappingURL=cli-quota.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-quota.test.js","sourceRoot":"","sources":["../src/cli-quota.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli-statusline.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-statusline.test.d.ts","sourceRoot":"","sources":["../src/cli-statusline.test.ts"],"names":[],"mappings":""}