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 @@
1
+ {"version":3,"file":"quota.d.ts","sourceRoot":"","sources":["../../src/metrics/quota.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,291 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HISTORY_WEEKS = exports.WINDOW_HOURS = exports.QUOTA_AGENTS = void 0;
4
+ exports.isQuotaAgent = isQuotaAgent;
5
+ exports.breakdown = breakdown;
6
+ exports.fiveHourWindows = fiveHourWindows;
7
+ exports.windowAt = windowAt;
8
+ exports.weekStart = weekStart;
9
+ exports.sameStretch = sameStretch;
10
+ exports.compareWithHistory = compareWithHistory;
11
+ exports.buildQuota = buildQuota;
12
+ exports.officialWindow = officialWindow;
13
+ exports.quotaRange = quotaRange;
14
+ exports.quotaToJson = quotaToJson;
15
+ const cost_js_1 = require("../pricing/cost.js");
16
+ /**
17
+ * "¿Qué proyecto se come mi cuota?"
18
+ *
19
+ * Quien paga Claude Max/Pro o Codex con suscripción agota la cuota antes de
20
+ * tiempo y no sabe en qué. Estela ya tiene cada turno con su carpeta, así que
21
+ * puede repartir el consumo por proyecto. Funciones puras, como el resto de
22
+ * `metrics/`: entran turnos, salen cifras, y cada cifra tiene un test.
23
+ *
24
+ * Lo que esto NO hace, a propósito: decir cuánto te queda. Ni Anthropic ni
25
+ * OpenAI publican los límites exactos de cada plan, y la cuota se comparte con
26
+ * lo que uses fuera de esta máquina (claude.ai, el móvil, otro portátil), que
27
+ * Estela no ve. Un "te quedan X tokens" sería inventado. Lo único que se puede
28
+ * defender es el consumo real y la comparación con tu propio historial.
29
+ *
30
+ * Los turnos llegan ya deduplicados: los lectores de `watchers/` descartan las
31
+ * filas repetidas (Claude Code por `message.id`, Codex por su ordinal sobre
32
+ * `last_token_usage`) y `agent_turns` los guarda con `turn_id` como clave
33
+ * primaria. Aquí no se repite esa lógica.
34
+ */
35
+ /**
36
+ * Los agentes que cuentan para la cuota.
37
+ *
38
+ * Copilot no: guarda `promptTokens`/`completionTokens` sin caché ni nada que
39
+ * permita fiarse de ellos (ver `watchers/copilot.ts`), y además se paga por
40
+ * peticiones, no por tokens. Cursor y Gemini CLI no tienen lector todavía.
41
+ *
42
+ * Cada agente va por separado y no se suman nunca: Claude Code gasta la cuota
43
+ * de Anthropic y Codex la de OpenAI. Un "% del total" mezclando los dos no
44
+ * describiría ninguna cuota que exista.
45
+ */
46
+ exports.QUOTA_AGENTS = ["claude-code", "codex"];
47
+ function isQuotaAgent(agent) {
48
+ return exports.QUOTA_AGENTS.includes(agent);
49
+ }
50
+ const ZERO = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 };
51
+ function add(u, t) {
52
+ const cacheWrite = t.cacheWrite5m + t.cacheWrite1h;
53
+ return {
54
+ input: u.input + t.input,
55
+ output: u.output + t.output,
56
+ cacheRead: u.cacheRead + t.cacheRead,
57
+ cacheWrite: u.cacheWrite + cacheWrite,
58
+ total: u.total + t.input + t.output + t.cacheRead + cacheWrite,
59
+ };
60
+ }
61
+ function bucketKey(b) {
62
+ return b.kind === "project" ? `p:${b.projectId}` : b.kind === "folder" ? `f:${b.path}` : "-";
63
+ }
64
+ /** Precio de lista de un turno, en micro-USD, o null si su modelo no tiene precio. */
65
+ function listCostOf(t) {
66
+ if (!t.model)
67
+ return null;
68
+ return (0, cost_js_1.costOfTurn)(t.tokens, t.model, t.at)?.microUsd ?? null;
69
+ }
70
+ /**
71
+ * Reparto por proyecto de los turnos con `from <= at < to`, de mayor a menor.
72
+ * Un proyecto sin actividad en el periodo no sale: una fila a cero en una
73
+ * tabla de "quién se come la cuota" es ruido.
74
+ */
75
+ function breakdown(turns, from, to, bucketOf, options = {}) {
76
+ const acc = new Map();
77
+ let total = ZERO;
78
+ let listCost = 0;
79
+ let unpriced = 0;
80
+ for (const t of turns) {
81
+ if (t.at < from || t.at >= to)
82
+ continue;
83
+ const bucket = bucketOf(t.repoPath);
84
+ const key = bucketKey(bucket);
85
+ const cost = listCostOf(t);
86
+ if (cost === null)
87
+ unpriced++;
88
+ const prev = acc.get(key) ?? { bucket, usage: ZERO, listCost: 0 };
89
+ acc.set(key, { bucket, usage: add(prev.usage, t.tokens), listCost: prev.listCost + (cost ?? 0) });
90
+ total = add(total, t.tokens);
91
+ listCost += cost ?? 0;
92
+ }
93
+ const weighted = options.weighted === true;
94
+ const base = (r) => (weighted ? r.listCost : r.usage.total);
95
+ const whole = weighted ? listCost : total.total;
96
+ const rows = [...acc.values()]
97
+ .map((r) => ({ ...r, share: whole > 0 ? base(r) / whole : 0 }))
98
+ .sort((a, b) => base(b) - base(a));
99
+ return { rows, total, listCost, unpriced, weighted };
100
+ }
101
+ // ---------------------------------------------------------------------------
102
+ // La ventana de 5 horas
103
+ // ---------------------------------------------------------------------------
104
+ exports.WINDOW_HOURS = 5;
105
+ const WINDOW_MS = exports.WINDOW_HOURS * 3600_000;
106
+ /**
107
+ * Las ventanas de 5 h que se deducen de unos turnos ordenados en el tiempo.
108
+ *
109
+ * Es una ESTIMACIÓN, y por eso se dice en la ayuda y en la salida:
110
+ *
111
+ * - Una ventana empieza con el primer mensaje después de que acabe la
112
+ * anterior, y dura 5 horas. Es lo que describen Anthropic y OpenAI, pero
113
+ * ninguno publica cómo redondea el inicio (ccusage, por ejemplo, lo lleva a
114
+ * la hora en punto). Aquí se usa la hora exacta del primer turno: no
115
+ * inventar un redondeo es preferible a acertar por casualidad.
116
+ * - La cuota se comparte con lo que uses fuera de esta máquina. Un mensaje en
117
+ * claude.ai puede haber abierto la ventana antes, y Estela no lo ve: la
118
+ * ventana real puede empezar antes, nunca después, de la que sale aquí.
119
+ */
120
+ function fiveHourWindows(times) {
121
+ const sorted = [...times].sort((a, b) => a.getTime() - b.getTime());
122
+ const out = [];
123
+ for (const at of sorted) {
124
+ const last = out[out.length - 1];
125
+ if (last && at < last.end)
126
+ continue;
127
+ out.push({ start: at, end: new Date(at.getTime() + WINDOW_MS) });
128
+ }
129
+ return out;
130
+ }
131
+ /** La ventana abierta ahora, o null. Y si no hay, cuándo acabó la última. */
132
+ function windowAt(times, now) {
133
+ const windows = fiveHourWindows(times.filter((t) => t <= now));
134
+ const last = windows[windows.length - 1];
135
+ if (!last)
136
+ return { current: null, lastEnded: null };
137
+ return last.end > now ? { current: last, lastEnded: null } : { current: null, lastEnded: last.end };
138
+ }
139
+ // ---------------------------------------------------------------------------
140
+ // La semana y el historial
141
+ // ---------------------------------------------------------------------------
142
+ /**
143
+ * El lunes de esta semana a las 00:00, en la hora de quien pregunta.
144
+ *
145
+ * Con el calendario local (`new Date(año, mes, día)`) y no restando
146
+ * milisegundos: la semana del cambio de hora tiene 167 o 169 horas, y restar
147
+ * 7 × 24 h dejaría el "lunes" a las 23:00 del domingo.
148
+ */
149
+ function weekStart(now) {
150
+ const back = (now.getDay() + 6) % 7; // lunes = 0, domingo = 6
151
+ return new Date(now.getFullYear(), now.getMonth(), now.getDate() - back);
152
+ }
153
+ /**
154
+ * El mismo tramo de la semana, `weeksBack` semanas atrás: si hoy es miércoles a
155
+ * las 15:00, de lunes 00:00 a miércoles 15:00 de aquella semana. Así se compara
156
+ * lo comparable: un miércoles no puede llevar lo que lleva una semana entera.
157
+ */
158
+ function sameStretch(now, weeksBack) {
159
+ const monday = weekStart(now);
160
+ const day = (now.getDay() + 6) % 7;
161
+ const start = new Date(monday.getFullYear(), monday.getMonth(), monday.getDate() - 7 * weeksBack);
162
+ const end = new Date(start.getFullYear(), start.getMonth(), start.getDate() + day, now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());
163
+ return { start, end };
164
+ }
165
+ /** Las semanas completas con las que se compara. */
166
+ exports.HISTORY_WEEKS = 4;
167
+ /**
168
+ * Esta semana frente a la media de las cuatro anteriores, en el mismo tramo.
169
+ *
170
+ * Una semana pasada solo cuenta como historial si empezó el día del primer
171
+ * turno de ese agente o después: antes de eso no había nada que medir, y
172
+ * meter un cero inventado bajaría la media y haría parecer excesiva una semana
173
+ * normal. Una semana posterior sin uso sí cuenta como cero: es real.
174
+ */
175
+ function compareWithHistory(times, firstTurnAt, now) {
176
+ const sum = (w) => times.reduce((s, t) => (t.at >= w.start && t.at < w.end ? s + t.total : s), 0);
177
+ const firstDay = firstTurnAt
178
+ ? new Date(firstTurnAt.getFullYear(), firstTurnAt.getMonth(), firstTurnAt.getDate())
179
+ : null;
180
+ const past = Array.from({ length: exports.HISTORY_WEEKS }, (_, i) => sameStretch(now, i + 1));
181
+ const covered = past.filter((w) => firstDay !== null && w.start >= firstDay);
182
+ if (covered.length < exports.HISTORY_WEEKS) {
183
+ return { status: "insufficient", completeWeeks: covered.length, weeks: exports.HISTORY_WEEKS };
184
+ }
185
+ const current = sum({ start: weekStart(now), end: new Date(now.getTime() + 1) });
186
+ const average = past.reduce((s, w) => s + sum(w), 0) / exports.HISTORY_WEEKS;
187
+ return { status: "ok", current, average, ratio: average > 0 ? current / average : null, weeks: exports.HISTORY_WEEKS };
188
+ }
189
+ /**
190
+ * Monta el informe. `turns` debe cubrir al menos las cuatro semanas anteriores
191
+ * a esta (ver `quotaRange`); `firstTurnAt`, el primer turno que hay guardado de
192
+ * cada agente, sea de cuando sea.
193
+ */
194
+ function buildQuota(input) {
195
+ const { now, bucketOf } = input;
196
+ const opts = { weighted: input.weighted === true };
197
+ const monday = weekStart(now);
198
+ const until = new Date(now.getTime() + 1);
199
+ const turns = input.turns.filter((t) => t.at <= now);
200
+ const agents = [];
201
+ for (const agent of exports.QUOTA_AGENTS) {
202
+ const own = turns.filter((t) => t.agent === agent);
203
+ const official = agent === "claude-code" && input.claudeWindow &&
204
+ input.claudeWindow.start <= now && now < input.claudeWindow.end ? input.claudeWindow : null;
205
+ const estimate = windowAt(own.map((t) => t.at), now);
206
+ const current = official ?? estimate.current;
207
+ const week = breakdown(own, monday, until, bucketOf, opts);
208
+ if (!current && week.rows.length === 0)
209
+ continue;
210
+ agents.push({
211
+ agent,
212
+ window: current
213
+ ? { ...current, ...breakdown(own, current.start, until, bucketOf, opts), estimated: !official }
214
+ : null,
215
+ lastWindowEnded: current ? null : estimate.lastEnded,
216
+ week,
217
+ comparison: compareWithHistory(own.map((t) => ({ at: t.at, total: add(ZERO, t.tokens).total })), input.firstTurnAt.get(agent) ?? null, now),
218
+ });
219
+ }
220
+ return {
221
+ generatedAt: now,
222
+ weekStart: monday,
223
+ agents,
224
+ copilotExcluded: turns.some((t) => t.agent === "copilot" && t.at >= monday),
225
+ };
226
+ }
227
+ /**
228
+ * La ventana de 5 h que dio Claude Code, a partir del último `resets_at` que
229
+ * vio la status line: empieza 5 h antes de su reinicio.
230
+ *
231
+ * Solo vale si el dato tiene menos de 5 h (uno más viejo puede ser de otra
232
+ * ventana) y si el reinicio aún no ha llegado (pasado ese momento, la ventana
233
+ * en curso es otra que nadie ha visto). Si no, null: se estima como siempre.
234
+ */
235
+ function officialWindow(seen, now) {
236
+ if (!seen)
237
+ return null;
238
+ const age = now.getTime() - seen.seenAt.getTime();
239
+ if (age < 0 || age >= WINDOW_MS)
240
+ return null;
241
+ if (seen.resetsAt <= now)
242
+ return null;
243
+ const start = new Date(seen.resetsAt.getTime() - WINDOW_MS);
244
+ return start <= now ? { start, end: seen.resetsAt } : null;
245
+ }
246
+ /** Desde cuándo hay que leer turnos para montar el informe de `now`. */
247
+ function quotaRange(now) {
248
+ return { start: sameStretch(now, exports.HISTORY_WEEKS).start, end: new Date(now.getTime() + 1) };
249
+ }
250
+ // ---------------------------------------------------------------------------
251
+ // Salida para máquinas
252
+ // ---------------------------------------------------------------------------
253
+ /**
254
+ * El informe como JSON estable, para `--json` y para el panel web. Fechas en
255
+ * ISO, y las filas con `projectId`/`projectName`/`folder` a null cuando no
256
+ * aplican, para que un script no tenga que mirar de qué tipo es cada una.
257
+ */
258
+ function quotaToJson(report) {
259
+ const rows = (b) => b.rows.map((r) => ({
260
+ projectId: r.bucket.kind === "project" ? r.bucket.projectId : null,
261
+ projectName: r.bucket.kind === "project" ? r.bucket.projectName : null,
262
+ folder: r.bucket.kind === "folder" ? r.bucket.folder : null,
263
+ ...r.usage,
264
+ listCostMicroUsd: r.listCost,
265
+ share: Math.round(r.share * 10_000) / 10_000,
266
+ }));
267
+ const weighted = report.agents.some((a) => a.week.weighted);
268
+ return {
269
+ generatedAt: report.generatedAt.toISOString(),
270
+ weekStart: report.weekStart.toISOString(),
271
+ // Para que ningún script lo trate como un dato exacto sin haberlo leído:
272
+ // false solo si todas las ventanas que salen las dio Claude Code.
273
+ windowIsEstimate: report.agents.some((a) => !a.window || a.window.estimated),
274
+ windowHours: exports.WINDOW_HOURS,
275
+ shareBasis: weighted ? "list-price" : "tokens",
276
+ agents: report.agents.map((a) => ({
277
+ agent: a.agent,
278
+ window: a.window
279
+ ? { start: a.window.start.toISOString(), end: a.window.end.toISOString(),
280
+ estimated: a.window.estimated, projects: rows(a.window), total: a.window.total }
281
+ : null,
282
+ lastWindowEnded: a.lastWindowEnded?.toISOString() ?? null,
283
+ week: { projects: rows(a.week), total: a.week.total },
284
+ comparison: a.comparison.status === "ok"
285
+ ? { ...a.comparison, ratio: a.comparison.ratio === null ? null : Math.round(a.comparison.ratio * 1000) / 1000 }
286
+ : a.comparison,
287
+ })),
288
+ excluded: report.copilotExcluded ? [{ agent: "copilot", reason: "no-reliable-tokens" }] : [],
289
+ };
290
+ }
291
+ //# sourceMappingURL=quota.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota.js","sourceRoot":"","sources":["../../src/metrics/quota.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=quota.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota.test.d.ts","sourceRoot":"","sources":["../../src/metrics/quota.test.ts"],"names":[],"mappings":""}