estela 0.2.0 → 0.2.2
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 +5 -2
- package/dist/statusline-cache.d.ts +39 -10
- package/dist/statusline-cache.js +47 -14
- package/dist/statusline-run.js +11 -7
- package/dist/statusline.d.ts +2 -0
- package/dist/statusline.js +35 -21
- package/package.json +3 -1
- package/dist/billing/amortize.d.ts.map +0 -1
- package/dist/billing/amortize.js.map +0 -1
- package/dist/billing/amortize.test.d.ts +0 -2
- package/dist/billing/amortize.test.d.ts.map +0 -1
- package/dist/billing/amortize.test.js +0 -121
- package/dist/billing/amortize.test.js.map +0 -1
- package/dist/billing/assign.d.ts.map +0 -1
- package/dist/billing/assign.js.map +0 -1
- package/dist/billing/assign.test.d.ts +0 -2
- package/dist/billing/assign.test.d.ts.map +0 -1
- package/dist/billing/assign.test.js +0 -153
- package/dist/billing/assign.test.js.map +0 -1
- package/dist/billing/format.test.d.ts +0 -2
- package/dist/billing/format.test.d.ts.map +0 -1
- package/dist/billing/format.test.js +0 -110
- package/dist/billing/format.test.js.map +0 -1
- package/dist/billing/invoice.d.ts.map +0 -1
- package/dist/billing/invoice.js.map +0 -1
- package/dist/billing/invoice.test.d.ts +0 -2
- package/dist/billing/invoice.test.d.ts.map +0 -1
- package/dist/billing/invoice.test.js +0 -200
- package/dist/billing/invoice.test.js.map +0 -1
- package/dist/billing/localize.d.ts.map +0 -1
- package/dist/billing/localize.js.map +0 -1
- package/dist/billing/localize.test.d.ts +0 -2
- package/dist/billing/localize.test.d.ts.map +0 -1
- package/dist/billing/localize.test.js +0 -144
- package/dist/billing/localize.test.js.map +0 -1
- package/dist/billing/sessionize.d.ts.map +0 -1
- package/dist/billing/sessionize.js.map +0 -1
- package/dist/billing/sessionize.test.d.ts +0 -2
- package/dist/billing/sessionize.test.d.ts.map +0 -1
- package/dist/billing/sessionize.test.js +0 -187
- package/dist/billing/sessionize.test.js.map +0 -1
- package/dist/billing.d.ts.map +0 -1
- package/dist/billing.js.map +0 -1
- package/dist/bin.d.ts.map +0 -1
- package/dist/bin.js.map +0 -1
- package/dist/cli-badge.test.d.ts +0 -2
- package/dist/cli-badge.test.d.ts.map +0 -1
- package/dist/cli-badge.test.js +0 -118
- package/dist/cli-badge.test.js.map +0 -1
- package/dist/cli-idioma.test.d.ts +0 -2
- package/dist/cli-idioma.test.d.ts.map +0 -1
- package/dist/cli-idioma.test.js +0 -190
- package/dist/cli-idioma.test.js.map +0 -1
- package/dist/cli-import-recover.test.d.ts +0 -2
- package/dist/cli-import-recover.test.d.ts.map +0 -1
- package/dist/cli-import-recover.test.js +0 -191
- package/dist/cli-import-recover.test.js.map +0 -1
- package/dist/cli-quota.test.d.ts +0 -2
- package/dist/cli-quota.test.d.ts.map +0 -1
- package/dist/cli-quota.test.js +0 -281
- package/dist/cli-quota.test.js.map +0 -1
- package/dist/cli-statusline.test.d.ts +0 -2
- package/dist/cli-statusline.test.d.ts.map +0 -1
- package/dist/cli-statusline.test.js +0 -333
- package/dist/cli-statusline.test.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/cloud/auth.d.ts.map +0 -1
- package/dist/cloud/auth.js.map +0 -1
- package/dist/cloud/client.d.ts.map +0 -1
- package/dist/cloud/client.js.map +0 -1
- package/dist/cloud/errors.test.d.ts +0 -2
- package/dist/cloud/errors.test.d.ts.map +0 -1
- package/dist/cloud/errors.test.js +0 -34
- package/dist/cloud/errors.test.js.map +0 -1
- package/dist/db/schema.d.ts.map +0 -1
- package/dist/db/schema.js.map +0 -1
- package/dist/db/schema.test.d.ts +0 -2
- package/dist/db/schema.test.d.ts.map +0 -1
- package/dist/db/schema.test.js +0 -825
- package/dist/db/schema.test.js.map +0 -1
- package/dist/db/store.d.ts.map +0 -1
- package/dist/db/store.js.map +0 -1
- package/dist/demo.d.ts.map +0 -1
- package/dist/demo.js.map +0 -1
- package/dist/demo.test.d.ts +0 -2
- package/dist/demo.test.d.ts.map +0 -1
- package/dist/demo.test.js +0 -148
- package/dist/demo.test.js.map +0 -1
- package/dist/doctor.d.ts.map +0 -1
- package/dist/doctor.js.map +0 -1
- package/dist/doctor.test.d.ts +0 -2
- package/dist/doctor.test.d.ts.map +0 -1
- package/dist/doctor.test.js +0 -167
- package/dist/doctor.test.js.map +0 -1
- package/dist/export/badge.d.ts.map +0 -1
- package/dist/export/badge.js.map +0 -1
- package/dist/export/badge.test.d.ts +0 -2
- package/dist/export/badge.test.d.ts.map +0 -1
- package/dist/export/badge.test.js +0 -32
- package/dist/export/badge.test.js.map +0 -1
- package/dist/export/clockify.d.ts.map +0 -1
- package/dist/export/clockify.js.map +0 -1
- package/dist/export/clockify.test.d.ts +0 -2
- package/dist/export/clockify.test.d.ts.map +0 -1
- package/dist/export/clockify.test.js +0 -51
- package/dist/export/clockify.test.js.map +0 -1
- package/dist/export/csv.d.ts.map +0 -1
- package/dist/export/csv.js.map +0 -1
- package/dist/export/dates.d.ts.map +0 -1
- package/dist/export/dates.js.map +0 -1
- package/dist/export/idioma.test.d.ts +0 -2
- package/dist/export/idioma.test.d.ts.map +0 -1
- package/dist/export/idioma.test.js +0 -255
- package/dist/export/idioma.test.js.map +0 -1
- package/dist/export/invoice-pdf.d.ts.map +0 -1
- package/dist/export/invoice-pdf.js.map +0 -1
- package/dist/export/panel.d.ts.map +0 -1
- package/dist/export/panel.js.map +0 -1
- package/dist/export/panel.test.d.ts +0 -2
- package/dist/export/panel.test.d.ts.map +0 -1
- package/dist/export/panel.test.js +0 -386
- package/dist/export/panel.test.js.map +0 -1
- package/dist/export/pdf.d.ts.map +0 -1
- package/dist/export/pdf.js.map +0 -1
- package/dist/export/pdf.test.d.ts +0 -2
- package/dist/export/pdf.test.d.ts.map +0 -1
- package/dist/export/pdf.test.js +0 -172
- package/dist/export/pdf.test.js.map +0 -1
- package/dist/export/pixelfont.d.ts.map +0 -1
- package/dist/export/pixelfont.js.map +0 -1
- package/dist/export/png.d.ts.map +0 -1
- package/dist/export/png.js.map +0 -1
- package/dist/export/receipt.d.ts.map +0 -1
- package/dist/export/receipt.js.map +0 -1
- package/dist/export/receipt.test.d.ts +0 -2
- package/dist/export/receipt.test.d.ts.map +0 -1
- package/dist/export/receipt.test.js +0 -207
- package/dist/export/receipt.test.js.map +0 -1
- package/dist/export/share.d.ts.map +0 -1
- package/dist/export/share.js.map +0 -1
- package/dist/export/share.test.d.ts +0 -2
- package/dist/export/share.test.d.ts.map +0 -1
- package/dist/export/share.test.js +0 -116
- package/dist/export/share.test.js.map +0 -1
- package/dist/i18n/en.d.ts.map +0 -1
- package/dist/i18n/en.js.map +0 -1
- package/dist/i18n/i18n.test.d.ts +0 -2
- package/dist/i18n/i18n.test.d.ts.map +0 -1
- package/dist/i18n/i18n.test.js +0 -226
- package/dist/i18n/i18n.test.js.map +0 -1
- package/dist/i18n/index.d.ts.map +0 -1
- package/dist/i18n/index.js.map +0 -1
- package/dist/i18n/labels.d.ts.map +0 -1
- package/dist/i18n/labels.js.map +0 -1
- package/dist/metrics/index.d.ts.map +0 -1
- package/dist/metrics/index.js.map +0 -1
- package/dist/metrics/metrics.test.d.ts +0 -2
- package/dist/metrics/metrics.test.d.ts.map +0 -1
- package/dist/metrics/metrics.test.js +0 -162
- package/dist/metrics/metrics.test.js.map +0 -1
- package/dist/metrics/people.d.ts.map +0 -1
- package/dist/metrics/people.js.map +0 -1
- package/dist/metrics/people.test.d.ts +0 -2
- package/dist/metrics/people.test.d.ts.map +0 -1
- package/dist/metrics/people.test.js +0 -92
- package/dist/metrics/people.test.js.map +0 -1
- package/dist/metrics/quota.d.ts.map +0 -1
- package/dist/metrics/quota.js.map +0 -1
- package/dist/metrics/quota.test.d.ts +0 -2
- package/dist/metrics/quota.test.d.ts.map +0 -1
- package/dist/metrics/quota.test.js +0 -325
- package/dist/metrics/quota.test.js.map +0 -1
- package/dist/metrics/team.d.ts.map +0 -1
- package/dist/metrics/team.js.map +0 -1
- package/dist/metrics/team.test.d.ts +0 -2
- package/dist/metrics/team.test.d.ts.map +0 -1
- package/dist/metrics/team.test.js +0 -90
- package/dist/metrics/team.test.js.map +0 -1
- package/dist/node-version.d.ts.map +0 -1
- package/dist/node-version.js.map +0 -1
- package/dist/node-version.test.d.ts +0 -2
- package/dist/node-version.test.d.ts.map +0 -1
- package/dist/node-version.test.js +0 -53
- package/dist/node-version.test.js.map +0 -1
- package/dist/paths.d.ts.map +0 -1
- package/dist/paths.js.map +0 -1
- package/dist/paths.test.d.ts +0 -2
- package/dist/paths.test.d.ts.map +0 -1
- package/dist/paths.test.js +0 -32
- package/dist/paths.test.js.map +0 -1
- package/dist/pricing/catalog.d.ts.map +0 -1
- package/dist/pricing/catalog.js.map +0 -1
- package/dist/pricing/cost.d.ts.map +0 -1
- package/dist/pricing/cost.js.map +0 -1
- package/dist/pricing/cost.test.d.ts +0 -2
- package/dist/pricing/cost.test.d.ts.map +0 -1
- package/dist/pricing/cost.test.js +0 -100
- package/dist/pricing/cost.test.js.map +0 -1
- package/dist/project-of.d.ts.map +0 -1
- package/dist/project-of.js.map +0 -1
- package/dist/project-of.test.d.ts +0 -2
- package/dist/project-of.test.d.ts.map +0 -1
- package/dist/project-of.test.js +0 -203
- package/dist/project-of.test.js.map +0 -1
- package/dist/publish.d.ts.map +0 -1
- package/dist/publish.js.map +0 -1
- package/dist/publish.test.d.ts +0 -2
- package/dist/publish.test.d.ts.map +0 -1
- package/dist/publish.test.js +0 -113
- package/dist/publish.test.js.map +0 -1
- package/dist/quota.d.ts.map +0 -1
- package/dist/quota.js.map +0 -1
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/server.test.d.ts +0 -2
- package/dist/server.test.d.ts.map +0 -1
- package/dist/server.test.js +0 -402
- package/dist/server.test.js.map +0 -1
- package/dist/setup.d.ts.map +0 -1
- package/dist/setup.js.map +0 -1
- package/dist/setup.test.d.ts +0 -2
- package/dist/setup.test.d.ts.map +0 -1
- package/dist/setup.test.js +0 -144
- package/dist/setup.test.js.map +0 -1
- package/dist/statusline-cache.d.ts.map +0 -1
- package/dist/statusline-cache.js.map +0 -1
- package/dist/statusline-install.d.ts.map +0 -1
- package/dist/statusline-install.js.map +0 -1
- package/dist/statusline-run.d.ts.map +0 -1
- package/dist/statusline-run.js.map +0 -1
- package/dist/statusline.d.ts.map +0 -1
- package/dist/statusline.js.map +0 -1
- package/dist/statusline.test.d.ts +0 -2
- package/dist/statusline.test.d.ts.map +0 -1
- package/dist/statusline.test.js +0 -197
- package/dist/statusline.test.js.map +0 -1
- package/dist/sync/team.d.ts.map +0 -1
- package/dist/sync/team.js.map +0 -1
- package/dist/sync/team.test.d.ts +0 -2
- package/dist/sync/team.test.d.ts.map +0 -1
- package/dist/sync/team.test.js +0 -102
- package/dist/sync/team.test.js.map +0 -1
- package/dist/sync.d.ts.map +0 -1
- package/dist/sync.js.map +0 -1
- package/dist/sync.test.d.ts +0 -2
- package/dist/sync.test.d.ts.map +0 -1
- package/dist/sync.test.js +0 -151
- package/dist/sync.test.js.map +0 -1
- package/dist/team.d.ts.map +0 -1
- package/dist/team.js.map +0 -1
- package/dist/team.test.d.ts +0 -2
- package/dist/team.test.d.ts.map +0 -1
- package/dist/team.test.js +0 -163
- package/dist/team.test.js.map +0 -1
- package/dist/updateCheck.d.ts.map +0 -1
- package/dist/updateCheck.js.map +0 -1
- package/dist/updateCheck.test.d.ts +0 -2
- package/dist/updateCheck.test.d.ts.map +0 -1
- package/dist/updateCheck.test.js +0 -27
- package/dist/updateCheck.test.js.map +0 -1
- package/dist/watchers/agents.d.ts.map +0 -1
- package/dist/watchers/agents.js.map +0 -1
- package/dist/watchers/agents.test.d.ts +0 -2
- package/dist/watchers/agents.test.d.ts.map +0 -1
- package/dist/watchers/agents.test.js +0 -96
- package/dist/watchers/agents.test.js.map +0 -1
- package/dist/watchers/claude.d.ts.map +0 -1
- package/dist/watchers/claude.js.map +0 -1
- package/dist/watchers/claude.test.d.ts +0 -2
- package/dist/watchers/claude.test.d.ts.map +0 -1
- package/dist/watchers/claude.test.js +0 -180
- package/dist/watchers/claude.test.js.map +0 -1
- package/dist/watchers/codex.d.ts.map +0 -1
- package/dist/watchers/codex.js.map +0 -1
- package/dist/watchers/codex.test.d.ts +0 -2
- package/dist/watchers/codex.test.d.ts.map +0 -1
- package/dist/watchers/codex.test.js +0 -207
- package/dist/watchers/codex.test.js.map +0 -1
- package/dist/watchers/copilot.d.ts.map +0 -1
- package/dist/watchers/copilot.js.map +0 -1
- package/dist/watchers/copilot.test.d.ts +0 -2
- package/dist/watchers/copilot.test.d.ts.map +0 -1
- package/dist/watchers/copilot.test.js +0 -98
- package/dist/watchers/copilot.test.js.map +0 -1
- package/dist/watchers/git.d.ts.map +0 -1
- package/dist/watchers/git.js.map +0 -1
- package/dist/watchers/git.test.d.ts +0 -2
- package/dist/watchers/git.test.d.ts.map +0 -1
- package/dist/watchers/git.test.js +0 -75
- package/dist/watchers/git.test.js.map +0 -1
- package/dist/watchers/identity.d.ts.map +0 -1
- package/dist/watchers/identity.js.map +0 -1
- package/dist/watchers/identity.test.d.ts +0 -2
- package/dist/watchers/identity.test.d.ts.map +0 -1
- package/dist/watchers/identity.test.js +0 -48
- package/dist/watchers/identity.test.js.map +0 -1
- package/dist/web-ui.test.d.ts +0 -2
- package/dist/web-ui.test.d.ts.map +0 -1
- package/dist/web-ui.test.js +0 -414
- package/dist/web-ui.test.js.map +0 -1
- package/dist/workitems.test.d.ts +0 -2
- package/dist/workitems.test.d.ts.map +0 -1
- package/dist/workitems.test.js +0 -59
- package/dist/workitems.test.js.map +0 -1
package/README.md
CHANGED
|
@@ -276,7 +276,8 @@ estela statusline install
|
|
|
276
276
|
```
|
|
277
277
|
|
|
278
278
|
In a repository that isn't a project yet it shows `estela · web (no project) ·
|
|
279
|
-
estela setup`, and outside git just `estela · no project
|
|
279
|
+
estela setup`, and outside git just `estela · no project` — plus the week and
|
|
280
|
+
5-hour figures when Claude Code sends them. Each Claude Code
|
|
280
281
|
session in a project shows a line like this:
|
|
281
282
|
|
|
282
283
|
```
|
|
@@ -287,7 +288,9 @@ Hours measured today on this project (the same number the report will
|
|
|
287
288
|
give), this project's share of your Claude Code usage this week, and — only
|
|
288
289
|
if Claude Code sends them — its own weekly and 5-hour limit percentages, as
|
|
289
290
|
they come. Estela never estimates a limit or counts down to a reset. The
|
|
290
|
-
5-hour figure turns amber from 80%.
|
|
291
|
+
5-hour figure turns amber from 80%. A new session shows the last figures Claude
|
|
292
|
+
Code sent until fresh ones arrive, if that window hasn't reset yet. On a
|
|
293
|
+
narrow terminal the line drops the
|
|
291
294
|
5-hour figure first, then the week, then shortens the name, then this
|
|
292
295
|
project, then today; `estela` always stays. It runs in about 50 ms and only
|
|
293
296
|
reads what's new in the current session's transcript.
|
|
@@ -3,31 +3,60 @@
|
|
|
3
3
|
* llamadas.
|
|
4
4
|
*
|
|
5
5
|
* - `files`: hasta qué byte se leyó cada transcript, para leer solo lo nuevo.
|
|
6
|
-
* - `fiveHour`:
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* - `fiveHour` y `sevenDay`: lo último que mandó Claude Code en rate_limits
|
|
7
|
+
* (porcentaje y reinicio) y cuándo se vio. La status line lo enseña al
|
|
8
|
+
* arrancar una sesión, antes de que lleguen datos nuevos, y `estela quota`
|
|
9
|
+
* usa el reinicio de la 5 h para saber dónde empieza de verdad la ventana.
|
|
9
10
|
*
|
|
10
11
|
* Es una caché: si se pierde o se corrompe, todo sigue funcionando, solo que
|
|
11
12
|
* relee más o vuelve a estimar.
|
|
12
13
|
*/
|
|
14
|
+
/** Una ventana de límite tal como la mandó Claude Code, y cuándo se vio. */
|
|
15
|
+
export interface SeenLimit {
|
|
16
|
+
resetsAt: string;
|
|
17
|
+
seenAt: string;
|
|
18
|
+
/** El porcentaje usado. Falta si Claude Code mandó el reinicio sin él. */
|
|
19
|
+
usedPercentage?: number;
|
|
20
|
+
}
|
|
13
21
|
export interface StatuslineCache {
|
|
14
22
|
files: Record<string, {
|
|
15
23
|
offset: number;
|
|
16
24
|
seenAt: string;
|
|
17
25
|
}>;
|
|
18
|
-
fiveHour?:
|
|
19
|
-
|
|
20
|
-
seenAt: string;
|
|
21
|
-
};
|
|
26
|
+
fiveHour?: SeenLimit;
|
|
27
|
+
sevenDay?: SeenLimit;
|
|
22
28
|
}
|
|
23
29
|
export declare function cachePath(dbPath: string): string;
|
|
24
30
|
export declare function loadCache(dbPath: string): StatuslineCache;
|
|
25
31
|
export declare function saveCache(dbPath: string, cache: StatuslineCache): void;
|
|
32
|
+
/** Lo que llega de rate_limits para una ventana (cualquiera de los dos puede faltar). */
|
|
33
|
+
export interface LimitInput {
|
|
34
|
+
readonly usedPercentage: number | null;
|
|
35
|
+
readonly resetsAt: Date | null;
|
|
36
|
+
}
|
|
26
37
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
38
|
+
* Guarda lo nuevo de rate_limits y, para la ventana que no venga, devuelve el
|
|
39
|
+
* último porcentaje guardado si su reinicio aún no ha llegado.
|
|
40
|
+
*
|
|
41
|
+
* Es para el arranque de una sesión: Claude Code no manda rate_limits hasta la
|
|
42
|
+
* primera respuesta, y mientras tanto la línea perdía la semana y la 5 h que se
|
|
43
|
+
* sabían hace un momento. Un valor guardado cuyo reinicio ya pasó es de una
|
|
44
|
+
* ventana que terminó: no se enseña. En cuanto llega un dato nuevo, lo
|
|
45
|
+
* reemplaza.
|
|
46
|
+
*
|
|
47
|
+
* Usar lo guardado no cuenta como verlo otra vez: `seenAt` solo cambia con un
|
|
48
|
+
* dato nuevo, que es lo que `estela quota` mira para fiarse de la ventana.
|
|
49
|
+
*
|
|
50
|
+
* Solo escribe si existe ya el directorio de Estela: la status line no es
|
|
51
|
+
* quien empieza a guardar datos.
|
|
29
52
|
*/
|
|
30
|
-
export declare function
|
|
53
|
+
export declare function rememberLimits(dbPath: string, input: {
|
|
54
|
+
readonly fiveHour: LimitInput;
|
|
55
|
+
readonly sevenDay: LimitInput;
|
|
56
|
+
}, now: Date): {
|
|
57
|
+
fiveHour: number | null;
|
|
58
|
+
sevenDay: number | null;
|
|
59
|
+
};
|
|
31
60
|
export declare function readFiveHourReset(dbPath: string): {
|
|
32
61
|
resetsAt: Date;
|
|
33
62
|
seenAt: Date;
|
package/dist/statusline-cache.js
CHANGED
|
@@ -3,13 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.cachePath = cachePath;
|
|
4
4
|
exports.loadCache = loadCache;
|
|
5
5
|
exports.saveCache = saveCache;
|
|
6
|
-
exports.
|
|
6
|
+
exports.rememberLimits = rememberLimits;
|
|
7
7
|
exports.readFiveHourReset = readFiveHourReset;
|
|
8
8
|
const node_fs_1 = require("node:fs");
|
|
9
9
|
const node_path_1 = require("node:path");
|
|
10
10
|
const MAX_FILES = 30;
|
|
11
|
-
/** Con el mismo reinicio, no se reescribe más a menudo que esto. */
|
|
12
|
-
const
|
|
11
|
+
/** Con el mismo reinicio y el mismo porcentaje, no se reescribe más a menudo que esto. */
|
|
12
|
+
const REFRESH_MS = 10 * 60_000;
|
|
13
13
|
function cachePath(dbPath) {
|
|
14
14
|
return (0, node_path_1.join)((0, node_path_1.dirname)(dbPath), "statusline.json");
|
|
15
15
|
}
|
|
@@ -33,19 +33,52 @@ function saveCache(dbPath, cache) {
|
|
|
33
33
|
catch { /* sin caché, la próxima vez se relee: más lento, no incorrecto */ }
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
36
|
+
* Guarda lo nuevo de rate_limits y, para la ventana que no venga, devuelve el
|
|
37
|
+
* último porcentaje guardado si su reinicio aún no ha llegado.
|
|
38
|
+
*
|
|
39
|
+
* Es para el arranque de una sesión: Claude Code no manda rate_limits hasta la
|
|
40
|
+
* primera respuesta, y mientras tanto la línea perdía la semana y la 5 h que se
|
|
41
|
+
* sabían hace un momento. Un valor guardado cuyo reinicio ya pasó es de una
|
|
42
|
+
* ventana que terminó: no se enseña. En cuanto llega un dato nuevo, lo
|
|
43
|
+
* reemplaza.
|
|
44
|
+
*
|
|
45
|
+
* Usar lo guardado no cuenta como verlo otra vez: `seenAt` solo cambia con un
|
|
46
|
+
* dato nuevo, que es lo que `estela quota` mira para fiarse de la ventana.
|
|
47
|
+
*
|
|
48
|
+
* Solo escribe si existe ya el directorio de Estela: la status line no es
|
|
49
|
+
* quien empieza a guardar datos.
|
|
38
50
|
*/
|
|
39
|
-
function
|
|
40
|
-
if (!(0, node_fs_1.existsSync)((0, node_path_1.dirname)(dbPath)))
|
|
41
|
-
return;
|
|
51
|
+
function rememberLimits(dbPath, input, now) {
|
|
42
52
|
const cache = loadCache(dbPath);
|
|
43
|
-
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
53
|
+
let changed = false;
|
|
54
|
+
const pick = (key, fresh) => {
|
|
55
|
+
const prev = cache[key];
|
|
56
|
+
if (fresh.resetsAt) {
|
|
57
|
+
const sameReset = !!prev && new Date(prev.resetsAt).getTime() === fresh.resetsAt.getTime();
|
|
58
|
+
// Un reinicio sin porcentaje de la misma ventana no borra el que había.
|
|
59
|
+
const pct = fresh.usedPercentage ?? (sameReset ? prev.usedPercentage ?? null : null);
|
|
60
|
+
const samePct = (prev?.usedPercentage ?? null) === pct;
|
|
61
|
+
const recent = !!prev && now.getTime() - new Date(prev.seenAt).getTime() < REFRESH_MS;
|
|
62
|
+
if (!(sameReset && samePct && recent)) {
|
|
63
|
+
cache[key] = {
|
|
64
|
+
resetsAt: fresh.resetsAt.toISOString(), seenAt: now.toISOString(),
|
|
65
|
+
...(pct !== null ? { usedPercentage: pct } : {}),
|
|
66
|
+
};
|
|
67
|
+
changed = true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (fresh.usedPercentage !== null)
|
|
71
|
+
return fresh.usedPercentage;
|
|
72
|
+
// Sin dato nuevo: lo último que se vio, si su ventana sigue abierta.
|
|
73
|
+
const last = cache[key];
|
|
74
|
+
if (!last || last.usedPercentage === undefined)
|
|
75
|
+
return null;
|
|
76
|
+
return new Date(last.resetsAt) > now ? last.usedPercentage : null;
|
|
77
|
+
};
|
|
78
|
+
const out = { fiveHour: pick("fiveHour", input.fiveHour), sevenDay: pick("sevenDay", input.sevenDay) };
|
|
79
|
+
if (changed && (0, node_fs_1.existsSync)((0, node_path_1.dirname)(dbPath)))
|
|
80
|
+
saveCache(dbPath, cache);
|
|
81
|
+
return out;
|
|
49
82
|
}
|
|
50
83
|
function readFiveHourReset(dbPath) {
|
|
51
84
|
const f = loadCache(dbPath).fiveHour;
|
package/dist/statusline-run.js
CHANGED
|
@@ -55,13 +55,17 @@ async function runStatusline(argv) {
|
|
|
55
55
|
const reserved = extra ? (0, statusline_js_1.stripAnsi)(extra).length + 3 : 0;
|
|
56
56
|
const columns = Number(process.env["COLUMNS"]) || null;
|
|
57
57
|
const now = new Date();
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
58
|
+
// Lo nuevo de rate_limits se guarda; lo que no venga (al arrancar una
|
|
59
|
+
// sesión) se toma de lo último visto, si su ventana sigue abierta.
|
|
60
|
+
let limits = { fiveHour: input.fiveHour, sevenDay: input.sevenDay };
|
|
61
|
+
try {
|
|
62
|
+
limits = (0, statusline_cache_js_1.rememberLimits)(flags.db, {
|
|
63
|
+
fiveHour: { usedPercentage: input.fiveHour, resetsAt: input.fiveHourResetsAt ?? null },
|
|
64
|
+
sevenDay: { usedPercentage: input.sevenDay, resetsAt: input.sevenDayResetsAt ?? null },
|
|
65
|
+
}, now);
|
|
63
66
|
}
|
|
64
|
-
|
|
67
|
+
catch { /* es una caché: sin ella, la línea sale con lo que llegó */ }
|
|
68
|
+
const data = computeStatus({ ...input, ...limits }, flags.db, now);
|
|
65
69
|
const ours = (0, statusline_js_1.renderStatus)(data, { columns, color: flags.color, reserved });
|
|
66
70
|
process.stdout.write((extra ? `${ours}${flags.color ? "\x1b[90m | \x1b[0m" : " | "}${extra}` : ours) + "\n");
|
|
67
71
|
}
|
|
@@ -83,7 +87,7 @@ function parseFlags(argv) {
|
|
|
83
87
|
}
|
|
84
88
|
/** Ejecutado a mano en una terminal, sin nada por stdin: el directorio actual. */
|
|
85
89
|
function manualInput() {
|
|
86
|
-
return { dir: process.cwd(), transcriptPath: null, fiveHour: null, sevenDay: null, fiveHourResetsAt: null };
|
|
90
|
+
return { dir: process.cwd(), transcriptPath: null, fiveHour: null, sevenDay: null, fiveHourResetsAt: null, sevenDayResetsAt: null };
|
|
87
91
|
}
|
|
88
92
|
function readStdin() {
|
|
89
93
|
if (process.stdin.isTTY)
|
package/dist/statusline.d.ts
CHANGED
|
@@ -21,6 +21,8 @@ export interface StatusInput {
|
|
|
21
21
|
* atrás): se guarda para que `estela quota` sepa dónde empieza la ventana.
|
|
22
22
|
*/
|
|
23
23
|
readonly fiveHourResetsAt?: Date | null;
|
|
24
|
+
/** `rate_limits.seven_day.resets_at`: tampoco se enseña nunca. */
|
|
25
|
+
readonly sevenDayResetsAt?: Date | null;
|
|
24
26
|
}
|
|
25
27
|
/**
|
|
26
28
|
* Lee la entrada. Lanza si no es un objeto JSON: quien llama imprime
|
package/dist/statusline.js
CHANGED
|
@@ -23,6 +23,7 @@ function parseStatusInput(text) {
|
|
|
23
23
|
fiveHour: pct(obj(limits["five_hour"])["used_percentage"]),
|
|
24
24
|
sevenDay: pct(obj(limits["seven_day"])["used_percentage"]),
|
|
25
25
|
fiveHourResetsAt: epoch(obj(limits["five_hour"])["resets_at"]),
|
|
26
|
+
sevenDayResetsAt: epoch(obj(limits["seven_day"])["resets_at"]),
|
|
26
27
|
};
|
|
27
28
|
}
|
|
28
29
|
/** Segundos desde 1970 (lo que manda Claude Code); por si acaso, también milisegundos. */
|
|
@@ -69,34 +70,34 @@ function renderStatus(data, options = {}) {
|
|
|
69
70
|
const paint = (c, t) => (color ? `${c}${t}${RESET}` : t);
|
|
70
71
|
const width = options.columns && options.columns > 0
|
|
71
72
|
? Math.max(0, options.columns - (options.reserved ?? 0)) : Infinity;
|
|
73
|
+
const line = (shown, kept) => paint(JADE, "estela") + paint(GRAY, SEP + shown) +
|
|
74
|
+
kept.map((x) => paint(GRAY, SEP) + paint(x.warn ? AMBER : GRAY, x.text)).join("");
|
|
75
|
+
const tailOf = (kept) => kept.map((x) => SEP + x.text).join("").length;
|
|
72
76
|
if (!data.project) {
|
|
73
|
-
//
|
|
77
|
+
// "estela · web (sin proyecto) · semana 38 % · 5 h 62 % · estela setup".
|
|
78
|
+
// Fuera de git no hay nombre que dar ni nada que configurar ahí, así que
|
|
79
|
+
// sin raíz y sin pista: "estela · sin proyecto · semana 38 % · 5 h 62 %".
|
|
80
|
+
// Se recorta la pista, luego 5 h y semana, y por último se acorta la raíz.
|
|
74
81
|
const root = data.unassignedRoot ?? null;
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
82
|
+
const segs = [...limitSegments(data), ...(root ? [{ key: "hint", text: "estela setup" }] : [])];
|
|
83
|
+
const steps = [[], ["hint"], ["hint", "fiveHour"], ["hint", "fiveHour", "week"]];
|
|
84
|
+
for (const drop of steps) {
|
|
85
|
+
const kept = segs.filter((x) => !drop.includes(x.key));
|
|
86
|
+
const shown = root ? (0, index_js_1.tr) `${root} (sin proyecto)` : (0, index_js_1.tr) `sin proyecto`;
|
|
87
|
+
if ("estela".length + SEP.length + shown.length + tailOf(kept) <= width)
|
|
88
|
+
return line(shown, kept);
|
|
78
89
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return paint(JADE, "estela") + paint(GRAY, withHint);
|
|
84
|
-
const sinRoot = (0, index_js_1.tr) `${""} (sin proyecto)`;
|
|
85
|
-
const room = width - "estela".length - SEP.length - sinRoot.length;
|
|
86
|
-
if (room >= 2) {
|
|
87
|
-
const r = root.length <= room ? root : root.slice(0, room - 1).trimEnd() + "…";
|
|
88
|
-
return paint(JADE, "estela") + paint(GRAY, `${SEP}${(0, index_js_1.tr) `${r} (sin proyecto)`}`);
|
|
90
|
+
if (root) {
|
|
91
|
+
const room = width - "estela".length - SEP.length - (0, index_js_1.tr) `${""} (sin proyecto)`.length;
|
|
92
|
+
if (room >= 2)
|
|
93
|
+
return line((0, index_js_1.tr) `${root.slice(0, room - 1).trimEnd() + "…"} (sin proyecto)`, []);
|
|
89
94
|
}
|
|
90
95
|
return paint(JADE, "estela");
|
|
91
96
|
}
|
|
92
97
|
const segs = [{ key: "today", text: (0, index_js_1.tr) `hoy ${compactDuration(data.todaySeconds)}` }];
|
|
93
98
|
if (data.projectShare !== null)
|
|
94
99
|
segs.push({ key: "project", text: (0, index_js_1.tr) `este proyecto ${Math.round(data.projectShare * 100)} %` });
|
|
95
|
-
|
|
96
|
-
segs.push({ key: "week", text: (0, index_js_1.tr) `semana ${Math.round(data.sevenDay)} %` });
|
|
97
|
-
if (data.fiveHour !== null) {
|
|
98
|
-
segs.push({ key: "fiveHour", text: (0, index_js_1.tr) `5 h ${Math.round(data.fiveHour)} %`, warn: data.fiveHour >= exports.FIVE_HOUR_WARN });
|
|
99
|
-
}
|
|
100
|
+
segs.push(...limitSegments(data));
|
|
100
101
|
const { name, client } = data.project;
|
|
101
102
|
const full = client ? `${client} › ${name}` : name;
|
|
102
103
|
const short = client ?? name;
|
|
@@ -126,11 +127,24 @@ function renderStatus(data, options = {}) {
|
|
|
126
127
|
}
|
|
127
128
|
if (fixed + shown.length > width)
|
|
128
129
|
continue;
|
|
129
|
-
return
|
|
130
|
-
kept.map((s) => paint(GRAY, SEP) + paint(s.warn ? AMBER : GRAY, s.text)).join("");
|
|
130
|
+
return line(shown, kept);
|
|
131
131
|
}
|
|
132
132
|
return paint(JADE, "estela");
|
|
133
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* Los porcentajes de límite que manda Claude Code, tal cual: semana y 5 h, la
|
|
136
|
+
* de 5 h en ámbar desde el 80 %. Sin rate_limits, ninguno. Los comparten la
|
|
137
|
+
* línea con proyecto y la de sin proyecto.
|
|
138
|
+
*/
|
|
139
|
+
function limitSegments(data) {
|
|
140
|
+
const out = [];
|
|
141
|
+
if (data.sevenDay !== null)
|
|
142
|
+
out.push({ key: "week", text: (0, index_js_1.tr) `semana ${Math.round(data.sevenDay)} %` });
|
|
143
|
+
if (data.fiveHour !== null) {
|
|
144
|
+
out.push({ key: "fiveHour", text: (0, index_js_1.tr) `5 h ${Math.round(data.fiveHour)} %`, warn: data.fiveHour >= exports.FIVE_HOUR_WARN });
|
|
145
|
+
}
|
|
146
|
+
return out;
|
|
147
|
+
}
|
|
134
148
|
/** Lo visible de una cadena con color: para medir y para los tests. */
|
|
135
149
|
function stripAnsi(text) {
|
|
136
150
|
// eslint-disable-next-line no-control-regex
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "estela",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Time tracking you never fill in: rebuilds your billable hours from Claude Code, Codex and GitHub Copilot sessions and your Git history, and splits what the AI cost per project.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"time-tracking",
|
|
@@ -36,6 +36,8 @@
|
|
|
36
36
|
"homepage": "https://getestela.dev",
|
|
37
37
|
"files": [
|
|
38
38
|
"dist",
|
|
39
|
+
"!dist/**/*.test.*",
|
|
40
|
+
"!dist/**/*.map",
|
|
39
41
|
"web",
|
|
40
42
|
"README.md"
|
|
41
43
|
],
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"amortize.d.ts","sourceRoot":"","sources":["../../src/billing/amortize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAIlF;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,8BAA8B;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,SAAS,cAAc,EAAE,EAC/B,aAAa,EAAE,SAAS,YAAY,EAAE,EACtC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACxC,cAAc,EAAE,CAiClB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,aAAa,EAAE,SAAS,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAkB/F;AAED,0CAA0C;AAC1C,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE1C;AAED,gEAAgE;AAChE,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,cAAc,EAAE,EACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,MAAM,EAAE,GACxB,KAAK,GAAG,IAAI,CAMd"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"amortize.js","sourceRoot":"","sources":["../../src/billing/amortize.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"amortize.test.d.ts","sourceRoot":"","sources":["../../src/billing/amortize.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
7
|
-
const node_test_1 = require("node:test");
|
|
8
|
-
const shared_1 = require("@estela/shared");
|
|
9
|
-
const amortize_js_1 = require("./amortize.js");
|
|
10
|
-
const CLAUDE_MAX = {
|
|
11
|
-
id: "claude-max", name: "Claude Max",
|
|
12
|
-
monthlyFee: (0, shared_1.parseMoney)("200", "USD"),
|
|
13
|
-
effectiveFrom: new Date("2025-01-01T00:00:00Z"), effectiveTo: null,
|
|
14
|
-
};
|
|
15
|
-
(0, node_test_1.test)("reparte la cuota en proporción al consumo", () => {
|
|
16
|
-
const shares = (0, amortize_js_1.amortize)([
|
|
17
|
-
{ projectId: "a", month: "2026-08", consumption: { microUsd: 75_000_000 } }, // 75%
|
|
18
|
-
{ projectId: "b", month: "2026-08", consumption: { microUsd: 25_000_000 } }, // 25%
|
|
19
|
-
], [CLAUDE_MAX]);
|
|
20
|
-
const a = shares.find((s) => s.projectId === "a");
|
|
21
|
-
const b = shares.find((s) => s.projectId === "b");
|
|
22
|
-
strict_1.default.equal(a.share, 0.75);
|
|
23
|
-
strict_1.default.equal((0, shared_1.formatMoney)(a.amount), "$150,00");
|
|
24
|
-
strict_1.default.equal((0, shared_1.formatMoney)(b.amount), "$50,00");
|
|
25
|
-
strict_1.default.equal(a.amount.amount + b.amount.amount, 20_000, "el reparto suma la cuota entera");
|
|
26
|
-
});
|
|
27
|
-
(0, node_test_1.test)("lo no facturable también consume cuota, y por eso entra en el denominador", () => {
|
|
28
|
-
// Si tus experimentos se comen la mitad, al cliente solo le toca la otra mitad.
|
|
29
|
-
const shares = (0, amortize_js_1.amortize)([
|
|
30
|
-
{ projectId: "cliente", month: "2026-08", consumption: { microUsd: 50_000_000 } },
|
|
31
|
-
{ projectId: "experimentos", month: "2026-08", consumption: { microUsd: 50_000_000 } },
|
|
32
|
-
], [CLAUDE_MAX]);
|
|
33
|
-
const cliente = shares.find((s) => s.projectId === "cliente");
|
|
34
|
-
strict_1.default.equal((0, shared_1.formatMoney)(cliente.amount), "$100,00");
|
|
35
|
-
strict_1.default.equal(cliente.share, 0.5);
|
|
36
|
-
});
|
|
37
|
-
(0, node_test_1.test)("el trabajo sin asignar a proyecto también diluye la cuota", () => {
|
|
38
|
-
// El fallo que esto previene: con un solo proyecto configurado y el 90% del
|
|
39
|
-
// consumo en repos sin registrar, ese proyecto cargaba con la cuota entera.
|
|
40
|
-
const shares = (0, amortize_js_1.amortize)([{ projectId: "nebula", month: "2026-08", consumption: { microUsd: 10_000_000 } }], [CLAUDE_MAX], new Map([["2026-08", { microUsd: 100_000_000 }]])); // total real de la máquina
|
|
41
|
-
strict_1.default.equal(shares[0].share, 0.1);
|
|
42
|
-
strict_1.default.equal((0, shared_1.formatMoney)(shares[0].amount), "$20,00");
|
|
43
|
-
strict_1.default.equal(shares[0].monthTotal.microUsd, 100_000_000, "el denominador es el consumo real de la máquina, no la suma de proyectos");
|
|
44
|
-
});
|
|
45
|
-
(0, node_test_1.test)("un total incoherente nunca hace que las partes pasen del 100%", () => {
|
|
46
|
-
const shares = (0, amortize_js_1.amortize)([{ projectId: "a", month: "2026-08", consumption: { microUsd: 50_000_000 } }], [CLAUDE_MAX], new Map([["2026-08", { microUsd: 10_000_000 }]])); // menor que lo asignado
|
|
47
|
-
strict_1.default.equal(shares[0].share, 1, "se limita al 100%, no al 500%");
|
|
48
|
-
strict_1.default.equal((0, shared_1.formatMoney)(shares[0].amount), "$200,00");
|
|
49
|
-
});
|
|
50
|
-
(0, node_test_1.test)("el reparto es por mes, no acumulado", () => {
|
|
51
|
-
const shares = (0, amortize_js_1.amortize)([
|
|
52
|
-
{ projectId: "a", month: "2026-07", consumption: { microUsd: 10_000_000 } },
|
|
53
|
-
{ projectId: "a", month: "2026-08", consumption: { microUsd: 30_000_000 } },
|
|
54
|
-
{ projectId: "b", month: "2026-08", consumption: { microUsd: 10_000_000 } },
|
|
55
|
-
], [CLAUDE_MAX]);
|
|
56
|
-
const julio = shares.find((s) => s.projectId === "a" && s.month === "2026-07");
|
|
57
|
-
const agosto = shares.find((s) => s.projectId === "a" && s.month === "2026-08");
|
|
58
|
-
strict_1.default.equal((0, shared_1.formatMoney)(julio.amount), "$200,00", "único proyecto en julio: cuota entera");
|
|
59
|
-
strict_1.default.equal((0, shared_1.formatMoney)(agosto.amount), "$150,00", "75% de agosto");
|
|
60
|
-
});
|
|
61
|
-
(0, node_test_1.test)("varias suscripciones a la vez se suman", () => {
|
|
62
|
-
const cursor = {
|
|
63
|
-
id: "cursor", name: "Cursor", monthlyFee: (0, shared_1.parseMoney)("20", "USD"),
|
|
64
|
-
effectiveFrom: new Date("2025-01-01T00:00:00Z"), effectiveTo: null,
|
|
65
|
-
};
|
|
66
|
-
strict_1.default.equal((0, shared_1.formatMoney)((0, amortize_js_1.feeForMonth)([CLAUDE_MAX, cursor], "2026-08")), "$220,00");
|
|
67
|
-
});
|
|
68
|
-
(0, node_test_1.test)("una suscripción no vigente no cuenta", () => {
|
|
69
|
-
const antigua = {
|
|
70
|
-
...CLAUDE_MAX, id: "vieja",
|
|
71
|
-
effectiveTo: new Date("2026-01-01T00:00:00Z"),
|
|
72
|
-
};
|
|
73
|
-
strict_1.default.equal((0, amortize_js_1.feeForMonth)([antigua], "2026-08"), null);
|
|
74
|
-
strict_1.default.equal((0, shared_1.formatMoney)((0, amortize_js_1.feeForMonth)([antigua], "2025-06")), "$200,00");
|
|
75
|
-
});
|
|
76
|
-
(0, node_test_1.test)("suscripciones en monedas distintas se rechazan en vez de convertirse", () => {
|
|
77
|
-
const enEuros = {
|
|
78
|
-
id: "x", name: "X", monthlyFee: (0, shared_1.money)(2000, "EUR"),
|
|
79
|
-
effectiveFrom: new Date("2025-01-01T00:00:00Z"), effectiveTo: null,
|
|
80
|
-
};
|
|
81
|
-
strict_1.default.throws(() => (0, amortize_js_1.feeForMonth)([CLAUDE_MAX, enEuros], "2026-08"), /monedas distintas/);
|
|
82
|
-
});
|
|
83
|
-
(0, node_test_1.test)("sin suscripción, el reparto sale a cero en vez de inventar un coste", () => {
|
|
84
|
-
const shares = (0, amortize_js_1.amortize)([{ projectId: "a", month: "2026-08", consumption: { microUsd: 8_016_655 } }], []);
|
|
85
|
-
strict_1.default.equal(shares[0].amount.amount, 0);
|
|
86
|
-
strict_1.default.equal(shares[0].consumption.microUsd, 8_016_655, "el consumo sí se conserva");
|
|
87
|
-
});
|
|
88
|
-
(0, node_test_1.test)("consumo cero no divide por cero", () => {
|
|
89
|
-
const shares = (0, amortize_js_1.amortize)([{ projectId: "a", month: "2026-08", consumption: { microUsd: 0 } }], [CLAUDE_MAX]);
|
|
90
|
-
strict_1.default.equal(shares[0].share, 0);
|
|
91
|
-
strict_1.default.equal(shares[0].amount.amount, 0);
|
|
92
|
-
});
|
|
93
|
-
(0, node_test_1.test)("suma de un proyecto a lo largo de varios meses", () => {
|
|
94
|
-
const shares = (0, amortize_js_1.amortize)([
|
|
95
|
-
{ projectId: "a", month: "2026-07", consumption: { microUsd: 100_000_000 } },
|
|
96
|
-
{ projectId: "a", month: "2026-08", consumption: { microUsd: 100_000_000 } },
|
|
97
|
-
], [CLAUDE_MAX]);
|
|
98
|
-
const total = (0, amortize_js_1.shareForProject)(shares, "a", ["2026-07", "2026-08"]);
|
|
99
|
-
strict_1.default.equal((0, shared_1.formatMoney)(total), "$400,00");
|
|
100
|
-
const soloJulio = (0, amortize_js_1.shareForProject)(shares, "a", ["2026-07"]);
|
|
101
|
-
strict_1.default.equal((0, shared_1.formatMoney)(soloJulio), "$200,00");
|
|
102
|
-
});
|
|
103
|
-
(0, node_test_1.test)("monthOf usa UTC de forma consistente", () => {
|
|
104
|
-
strict_1.default.equal((0, amortize_js_1.monthOf)(new Date("2026-08-26T23:30:00Z")), "2026-08");
|
|
105
|
-
strict_1.default.equal((0, amortize_js_1.monthOf)(new Date("2026-09-01T00:00:00Z")), "2026-09");
|
|
106
|
-
});
|
|
107
|
-
(0, node_test_1.test)("el reparto de la cuota se congela en el informe", () => {
|
|
108
|
-
// El fallo que esto previene: el reparto es un valor derivado que cambia al
|
|
109
|
-
// entrar más consumo del mismo mes. Sin congelarlo, reimprimir un informe de
|
|
110
|
-
// agosto en diciembre daría otra cifra, y un documento que cambia solo no es
|
|
111
|
-
// un documento.
|
|
112
|
-
const enAgosto = (0, amortize_js_1.amortize)([{ projectId: "a", month: "2026-08", consumption: { microUsd: 50_000_000 } }], [CLAUDE_MAX], new Map([["2026-08", { microUsd: 100_000_000 }]]));
|
|
113
|
-
const congelado = (0, amortize_js_1.shareForProject)(enAgosto, "a", ["2026-08"]);
|
|
114
|
-
strict_1.default.equal((0, shared_1.formatMoney)(congelado), "$100,00");
|
|
115
|
-
// En diciembre se conoce el doble de consumo de ese mismo mes.
|
|
116
|
-
const enDiciembre = (0, amortize_js_1.amortize)([{ projectId: "a", month: "2026-08", consumption: { microUsd: 50_000_000 } }], [CLAUDE_MAX], new Map([["2026-08", { microUsd: 200_000_000 }]]));
|
|
117
|
-
const recalculado = (0, amortize_js_1.shareForProject)(enDiciembre, "a", ["2026-08"]);
|
|
118
|
-
strict_1.default.equal((0, shared_1.formatMoney)(recalculado), "$50,00");
|
|
119
|
-
strict_1.default.notEqual(congelado.amount, recalculado.amount, "el recálculo cambia: por eso hay que guardar el de su día");
|
|
120
|
-
});
|
|
121
|
-
//# sourceMappingURL=amortize.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"amortize.test.js","sourceRoot":"","sources":["../../src/billing/amortize.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"assign.d.ts","sourceRoot":"","sources":["../../src/billing/assign.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAKhD,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAErF;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,0EAA0E;IAC1E,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAC1C,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,4DAA4D;IAC5D,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;CAC9C;AAED,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAKrF;AAED,wBAAgB,WAAW,CACzB,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,SAAS,EAAE,EAAE,OAAO,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAClF,cAAc,CAwEhB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"assign.js","sourceRoot":"","sources":["../../src/billing/assign.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"assign.test.d.ts","sourceRoot":"","sources":["../../src/billing/assign.test.ts"],"names":[],"mappings":""}
|