estela 0.1.39 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -0
- package/dist/billing/assign.d.ts +45 -0
- package/dist/billing/assign.d.ts.map +1 -0
- package/dist/billing/assign.js +159 -0
- package/dist/billing/assign.js.map +1 -0
- package/dist/billing/assign.test.d.ts +2 -0
- package/dist/billing/assign.test.d.ts.map +1 -0
- package/dist/billing/assign.test.js +153 -0
- package/dist/billing/assign.test.js.map +1 -0
- package/dist/bin.js +23 -1
- package/dist/bin.js.map +1 -1
- package/dist/cli-import-recover.test.d.ts +2 -0
- package/dist/cli-import-recover.test.d.ts.map +1 -0
- package/dist/cli-import-recover.test.js +191 -0
- package/dist/cli-import-recover.test.js.map +1 -0
- package/dist/cli-quota.test.d.ts +2 -0
- package/dist/cli-quota.test.d.ts.map +1 -0
- package/dist/cli-quota.test.js +281 -0
- package/dist/cli-quota.test.js.map +1 -0
- package/dist/cli-statusline.test.d.ts +2 -0
- package/dist/cli-statusline.test.d.ts.map +1 -0
- package/dist/cli-statusline.test.js +333 -0
- package/dist/cli-statusline.test.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +350 -49
- package/dist/cli.js.map +1 -1
- package/dist/db/store.d.ts +12 -1
- package/dist/db/store.d.ts.map +1 -1
- package/dist/db/store.js +52 -0
- package/dist/db/store.js.map +1 -1
- package/dist/demo.d.ts.map +1 -1
- package/dist/demo.js +53 -0
- package/dist/demo.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +68 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/metrics/quota.d.ts +226 -0
- package/dist/metrics/quota.d.ts.map +1 -0
- package/dist/metrics/quota.js +291 -0
- package/dist/metrics/quota.js.map +1 -0
- package/dist/metrics/quota.test.d.ts +2 -0
- package/dist/metrics/quota.test.d.ts.map +1 -0
- package/dist/metrics/quota.test.js +325 -0
- package/dist/metrics/quota.test.js.map +1 -0
- package/dist/project-of.d.ts +52 -0
- package/dist/project-of.d.ts.map +1 -0
- package/dist/project-of.js +124 -0
- package/dist/project-of.js.map +1 -0
- package/dist/project-of.test.d.ts +2 -0
- package/dist/project-of.test.d.ts.map +1 -0
- package/dist/project-of.test.js +203 -0
- package/dist/project-of.test.js.map +1 -0
- package/dist/quota.d.ts +27 -0
- package/dist/quota.d.ts.map +1 -0
- package/dist/quota.js +79 -0
- package/dist/quota.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +17 -26
- package/dist/server.js.map +1 -1
- package/dist/server.test.js +37 -0
- package/dist/server.test.js.map +1 -1
- package/dist/statusline-cache.d.ts +35 -0
- package/dist/statusline-cache.d.ts.map +1 -0
- package/dist/statusline-cache.js +57 -0
- package/dist/statusline-cache.js.map +1 -0
- package/dist/statusline-install.d.ts +52 -0
- package/dist/statusline-install.d.ts.map +1 -0
- package/dist/statusline-install.js +115 -0
- package/dist/statusline-install.js.map +1 -0
- package/dist/statusline-run.d.ts +8 -0
- package/dist/statusline-run.d.ts.map +1 -0
- package/dist/statusline-run.js +256 -0
- package/dist/statusline-run.js.map +1 -0
- package/dist/statusline.d.ts +71 -0
- package/dist/statusline.d.ts.map +1 -0
- package/dist/statusline.js +139 -0
- package/dist/statusline.js.map +1 -0
- package/dist/statusline.test.d.ts +2 -0
- package/dist/statusline.test.d.ts.map +1 -0
- package/dist/statusline.test.js +197 -0
- package/dist/statusline.test.js.map +1 -0
- package/dist/watchers/claude.d.ts +11 -1
- package/dist/watchers/claude.d.ts.map +1 -1
- package/dist/watchers/claude.js +32 -15
- package/dist/watchers/claude.js.map +1 -1
- package/package.json +1 -1
- package/web/app.css +36 -0
- package/web/app.js +61 -1
- package/web/i18n.js +28 -0
- package/web/index.html +4 -1
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OUR_COMMAND = void 0;
|
|
4
|
+
exports.claudeSettingsPath = claudeSettingsPath;
|
|
5
|
+
exports.isOurs = isOurs;
|
|
6
|
+
exports.shellQuote = shellQuote;
|
|
7
|
+
exports.appendedCommand = appendedCommand;
|
|
8
|
+
exports.planInstall = planInstall;
|
|
9
|
+
exports.planUninstall = planUninstall;
|
|
10
|
+
exports.estelaOnPath = estelaOnPath;
|
|
11
|
+
exports.backupName = backupName;
|
|
12
|
+
const node_fs_1 = require("node:fs");
|
|
13
|
+
const node_os_1 = require("node:os");
|
|
14
|
+
const node_path_1 = require("node:path");
|
|
15
|
+
/**
|
|
16
|
+
* `estela statusline install | uninstall`: el bloque `statusLine` de
|
|
17
|
+
* `~/.claude/settings.json`.
|
|
18
|
+
*
|
|
19
|
+
* Ese fichero es de quien usa Claude Code, con sus permisos, sus hooks y sus
|
|
20
|
+
* plugins. Se toca lo justo: se lee, se cambia una clave y se reescribe el
|
|
21
|
+
* resto tal cual; antes, una copia. Si ya hay otra status line, no se pisa.
|
|
22
|
+
*
|
|
23
|
+
* Funciones puras sobre el texto del fichero: quien llama lee y escribe.
|
|
24
|
+
*/
|
|
25
|
+
exports.OUR_COMMAND = "estela statusline";
|
|
26
|
+
/** Dónde vive la configuración de Claude Code (`CLAUDE_CONFIG_DIR` la mueve). */
|
|
27
|
+
function claudeSettingsPath(env = process.env) {
|
|
28
|
+
return (0, node_path_1.join)(env["CLAUDE_CONFIG_DIR"] || (0, node_path_1.join)((0, node_os_1.homedir)(), ".claude"), "settings.json");
|
|
29
|
+
}
|
|
30
|
+
function parse(text) {
|
|
31
|
+
if (text === null || !text.trim())
|
|
32
|
+
return {};
|
|
33
|
+
try {
|
|
34
|
+
const v = JSON.parse(text);
|
|
35
|
+
return v && typeof v === "object" && !Array.isArray(v) ? v : null;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function commandOf(statusLine) {
|
|
42
|
+
if (!statusLine || typeof statusLine !== "object")
|
|
43
|
+
return null;
|
|
44
|
+
const c = statusLine["command"];
|
|
45
|
+
return typeof c === "string" ? c : null;
|
|
46
|
+
}
|
|
47
|
+
function isOurs(command) {
|
|
48
|
+
return !!command && /(^|[\s/\\])estela(\.cmd)?\s+statusline(\s|$)/.test(command);
|
|
49
|
+
}
|
|
50
|
+
/** Comillas simples de shell: lo que va dentro se pasa tal cual. */
|
|
51
|
+
function shellQuote(text) {
|
|
52
|
+
return `'${text.replace(/'/g, `'\\''`)}'`;
|
|
53
|
+
}
|
|
54
|
+
/** El comando encadenado dentro de `--append '…'`, si lo hay. */
|
|
55
|
+
function appendedCommand(command) {
|
|
56
|
+
const m = /--append\s+'((?:[^']|'\\'')*)'\s*$/.exec(command);
|
|
57
|
+
return m ? m[1].replace(/'\\''/g, "'") : null;
|
|
58
|
+
}
|
|
59
|
+
function write(settings) {
|
|
60
|
+
return JSON.stringify(settings, null, 2) + "\n";
|
|
61
|
+
}
|
|
62
|
+
function planInstall(text, options = {}) {
|
|
63
|
+
const settings = parse(text);
|
|
64
|
+
if (!settings)
|
|
65
|
+
return { status: "invalid" };
|
|
66
|
+
const existing = commandOf(settings["statusLine"]);
|
|
67
|
+
if (existing && isOurs(existing) && !options.force)
|
|
68
|
+
return { status: "already" };
|
|
69
|
+
let command = exports.OUR_COMMAND;
|
|
70
|
+
let status = "installed";
|
|
71
|
+
if (existing && !isOurs(existing)) {
|
|
72
|
+
if (options.append) {
|
|
73
|
+
command = `${exports.OUR_COMMAND} --append ${shellQuote(existing)}`;
|
|
74
|
+
status = "chained";
|
|
75
|
+
}
|
|
76
|
+
else if (options.force)
|
|
77
|
+
status = "replaced";
|
|
78
|
+
else
|
|
79
|
+
return { status: "conflict", existing };
|
|
80
|
+
}
|
|
81
|
+
settings["statusLine"] = { type: "command", command, padding: 0 };
|
|
82
|
+
return { status, text: write(settings), previous: existing };
|
|
83
|
+
}
|
|
84
|
+
function planUninstall(text) {
|
|
85
|
+
const settings = parse(text);
|
|
86
|
+
if (!settings)
|
|
87
|
+
return { status: "invalid" };
|
|
88
|
+
const existing = commandOf(settings["statusLine"]);
|
|
89
|
+
if (!existing)
|
|
90
|
+
return { status: "absent" };
|
|
91
|
+
if (!isOurs(existing))
|
|
92
|
+
return { status: "foreign", existing };
|
|
93
|
+
// Si al instalar se encadenó otra, se devuelve esa: quitar Estela no puede
|
|
94
|
+
// dejarte sin la status line que ya tenías.
|
|
95
|
+
const before = appendedCommand(existing);
|
|
96
|
+
if (before) {
|
|
97
|
+
settings["statusLine"] = { type: "command", command: before };
|
|
98
|
+
return { status: "restored", text: write(settings), restored: before };
|
|
99
|
+
}
|
|
100
|
+
delete settings["statusLine"];
|
|
101
|
+
return { status: "removed", text: write(settings), restored: null };
|
|
102
|
+
}
|
|
103
|
+
/** `estela` en el PATH. Con `npx` cada evento tardaría cientos de milisegundos. */
|
|
104
|
+
function estelaOnPath(env = process.env, platform = process.platform) {
|
|
105
|
+
const names = platform === "win32" ? ["estela.cmd", "estela.exe", "estela"] : ["estela"];
|
|
106
|
+
return (env["PATH"] ?? "").split(node_path_1.delimiter).filter(Boolean)
|
|
107
|
+
.some((dir) => names.some((n) => (0, node_fs_1.existsSync)((0, node_path_1.join)(dir, n))));
|
|
108
|
+
}
|
|
109
|
+
/** "settings.json.bak-20261014-161230": una copia por instalación, sin pisar las anteriores. */
|
|
110
|
+
function backupName(path, now = new Date()) {
|
|
111
|
+
const p = (n) => String(n).padStart(2, "0");
|
|
112
|
+
return `${path}.bak-${now.getFullYear()}${p(now.getMonth() + 1)}${p(now.getDate())}-` +
|
|
113
|
+
`${p(now.getHours())}${p(now.getMinutes())}${p(now.getSeconds())}`;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=statusline-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusline-install.js","sourceRoot":"","sources":["../src/statusline-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type StatusData, type StatusInput } from "./statusline.js";
|
|
2
|
+
export declare function runStatusline(argv: readonly string[]): Promise<void>;
|
|
3
|
+
/**
|
|
4
|
+
* Los datos de la línea para un directorio. Sin base de Estela no se crea
|
|
5
|
+
* ninguna: la status line no es quien debe empezar a guardar datos.
|
|
6
|
+
*/
|
|
7
|
+
export declare function computeStatus(input: StatusInput, dbPath: string, now: Date): StatusData;
|
|
8
|
+
//# sourceMappingURL=statusline-run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusline-run.d.ts","sourceRoot":"","sources":["../src/statusline-run.ts"],"names":[],"mappings":"AAYA,OAAO,EAA2B,KAAK,UAAU,EAAE,KAAK,WAAW,EAAoB,MAAM,iBAAiB,CAAC;AAoB/G,wBAAsB,aAAa,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB1E;AA4CD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,UAAU,CA0DvF"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.runStatusline = runStatusline;
|
|
37
|
+
exports.computeStatus = computeStatus;
|
|
38
|
+
const node_child_process_1 = require("node:child_process");
|
|
39
|
+
const node_fs_1 = require("node:fs");
|
|
40
|
+
const sessionize_js_1 = require("./billing/sessionize.js");
|
|
41
|
+
const schema_js_1 = require("./db/schema.js");
|
|
42
|
+
const store = __importStar(require("./db/store.js"));
|
|
43
|
+
const quota_js_1 = require("./metrics/quota.js");
|
|
44
|
+
const paths_js_1 = require("./paths.js");
|
|
45
|
+
const project_of_js_1 = require("./project-of.js");
|
|
46
|
+
const statusline_cache_js_1 = require("./statusline-cache.js");
|
|
47
|
+
const statusline_js_1 = require("./statusline.js");
|
|
48
|
+
const claude_js_1 = require("./watchers/claude.js");
|
|
49
|
+
async function runStatusline(argv) {
|
|
50
|
+
try {
|
|
51
|
+
const flags = parseFlags(argv);
|
|
52
|
+
const text = await readStdin();
|
|
53
|
+
const input = text.trim() ? (0, statusline_js_1.parseStatusInput)(text) : manualInput();
|
|
54
|
+
const extra = flags.append ? runAppended(flags.append, text) : null;
|
|
55
|
+
const reserved = extra ? (0, statusline_js_1.stripAnsi)(extra).length + 3 : 0;
|
|
56
|
+
const columns = Number(process.env["COLUMNS"]) || null;
|
|
57
|
+
const now = new Date();
|
|
58
|
+
if (input.fiveHourResetsAt) {
|
|
59
|
+
try {
|
|
60
|
+
(0, statusline_cache_js_1.recordFiveHourReset)(flags.db, input.fiveHourResetsAt, now);
|
|
61
|
+
}
|
|
62
|
+
catch { /* es una caché */ }
|
|
63
|
+
}
|
|
64
|
+
const data = computeStatus(input, flags.db, now);
|
|
65
|
+
const ours = (0, statusline_js_1.renderStatus)(data, { columns, color: flags.color, reserved });
|
|
66
|
+
process.stdout.write((extra ? `${ours}${flags.color ? "\x1b[90m | \x1b[0m" : " | "}${extra}` : ours) + "\n");
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
process.stdout.write("estela\n");
|
|
70
|
+
}
|
|
71
|
+
process.exitCode = 0;
|
|
72
|
+
}
|
|
73
|
+
function parseFlags(argv) {
|
|
74
|
+
const value = (name) => {
|
|
75
|
+
const i = argv.indexOf(`--${name}`);
|
|
76
|
+
return i >= 0 && i + 1 < argv.length ? argv[i + 1] : null;
|
|
77
|
+
};
|
|
78
|
+
return {
|
|
79
|
+
db: value("db") ?? schema_js_1.DEFAULT_DB_PATH,
|
|
80
|
+
color: !argv.includes("--no-color") && !process.env["NO_COLOR"],
|
|
81
|
+
append: value("append"),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/** Ejecutado a mano en una terminal, sin nada por stdin: el directorio actual. */
|
|
85
|
+
function manualInput() {
|
|
86
|
+
return { dir: process.cwd(), transcriptPath: null, fiveHour: null, sevenDay: null, fiveHourResetsAt: null };
|
|
87
|
+
}
|
|
88
|
+
function readStdin() {
|
|
89
|
+
if (process.stdin.isTTY)
|
|
90
|
+
return Promise.resolve("");
|
|
91
|
+
return new Promise((resolve) => {
|
|
92
|
+
let data = "";
|
|
93
|
+
process.stdin.setEncoding("utf8");
|
|
94
|
+
process.stdin.on("data", (chunk) => { data += chunk; });
|
|
95
|
+
process.stdin.on("end", () => resolve(data));
|
|
96
|
+
process.stdin.on("error", () => resolve(data));
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Otra status line encadenada (la que había antes de instalar la de Estela).
|
|
101
|
+
* Recibe el mismo stdin. Si tarda o falla, se enseña solo la nuestra.
|
|
102
|
+
*/
|
|
103
|
+
function runAppended(command, stdin) {
|
|
104
|
+
try {
|
|
105
|
+
const r = (0, node_child_process_1.spawnSync)(command, { shell: true, input: stdin, encoding: "utf8", timeout: 1500 });
|
|
106
|
+
const line = (r.stdout ?? "").split("\n")[0]?.trimEnd();
|
|
107
|
+
return line ? line : null;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
/**
|
|
115
|
+
* Los datos de la línea para un directorio. Sin base de Estela no se crea
|
|
116
|
+
* ninguna: la status line no es quien debe empezar a guardar datos.
|
|
117
|
+
*/
|
|
118
|
+
function computeStatus(input, dbPath, now) {
|
|
119
|
+
const sinProyecto = (root) => ({
|
|
120
|
+
project: null, unassignedRoot: root, todaySeconds: 0, projectShare: null,
|
|
121
|
+
fiveHour: input.fiveHour, sevenDay: input.sevenDay
|
|
122
|
+
});
|
|
123
|
+
if (!input.dir)
|
|
124
|
+
return sinProyecto(null);
|
|
125
|
+
if (!(0, node_fs_1.existsSync)(dbPath)) {
|
|
126
|
+
const root = (0, project_of_js_1.gitRoot)(input.dir);
|
|
127
|
+
return sinProyecto(root ? (0, project_of_js_1.folderName)(root) : null);
|
|
128
|
+
}
|
|
129
|
+
const db = (0, schema_js_1.openDatabase)(dbPath);
|
|
130
|
+
try {
|
|
131
|
+
// Si `import` o el panel están escribiendo, se espera muy poco y se sigue.
|
|
132
|
+
db.exec("PRAGMA busy_timeout = 50");
|
|
133
|
+
const dir = (0, paths_js_1.normalizePath)(input.dir);
|
|
134
|
+
// La carpeta, y si no, su raíz git (worktrees, subcarpetas): ver project-of.ts.
|
|
135
|
+
const ownerOf = (0, project_of_js_1.ownerResolver)(db);
|
|
136
|
+
const owner = ownerOf(dir);
|
|
137
|
+
if (owner.kind !== "project")
|
|
138
|
+
return sinProyecto(owner.kind === "folder" && owner.inGit ? owner.name : null);
|
|
139
|
+
const projectId = owner.projectId;
|
|
140
|
+
const project = store.getProject(db, projectId);
|
|
141
|
+
if (!project)
|
|
142
|
+
return sinProyecto(null);
|
|
143
|
+
const client = project.kind === "client" ? store.getClient(db, project.clientId) : null;
|
|
144
|
+
const fresh = input.transcriptPath ? readNewTurns(db, dbPath, input.transcriptPath, dir) : [];
|
|
145
|
+
const projectOf = (repo) => {
|
|
146
|
+
const o = ownerOf(repo);
|
|
147
|
+
return o.kind === "project" ? o.projectId : null;
|
|
148
|
+
};
|
|
149
|
+
// Horas medidas de hoy: lo mismo que hace `import` — sessionize y luego
|
|
150
|
+
// la unión de intervalos por proyecto, día y rama — sobre los turnos de
|
|
151
|
+
// hoy de este proyecto. Solo medidas: nada estimado ni anotado a mano.
|
|
152
|
+
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
153
|
+
const todayTurns = merge(store.turnsBetween(db, today, new Date(now.getTime() + 1)), fresh, today, now)
|
|
154
|
+
.filter((t) => projectOf(t.repoPath) === projectId);
|
|
155
|
+
const blocks = (0, sessionize_js_1.groupByBranchAndDay)((0, sessionize_js_1.sessionize)(todayTurns), () => projectId);
|
|
156
|
+
const todaySeconds = blocks.reduce((s, b) => s + b.seconds, 0);
|
|
157
|
+
// Parte de la semana: la misma suma de tokens que `estela quota`, solo de
|
|
158
|
+
// Claude Code (Codex gasta otra cuota).
|
|
159
|
+
const monday = (0, quota_js_1.weekStart)(now);
|
|
160
|
+
const week = merge(store.turnsBetween(db, monday, new Date(now.getTime() + 1)), fresh, monday, now)
|
|
161
|
+
.filter((t) => t.agent === "claude-code");
|
|
162
|
+
const bucketOf = (repo) => {
|
|
163
|
+
const p = projectOf(repo);
|
|
164
|
+
return p ? { kind: "project", projectId: p, projectName: p } : { kind: "none" };
|
|
165
|
+
};
|
|
166
|
+
const split = (0, quota_js_1.breakdown)(week, monday, new Date(now.getTime() + 1), bucketOf);
|
|
167
|
+
const row = split.rows.find((r) => r.bucket.kind === "project" && r.bucket.projectId === projectId);
|
|
168
|
+
const projectShare = split.total.total > 0 ? (row?.share ?? 0) : null;
|
|
169
|
+
return {
|
|
170
|
+
project: { name: project.name, client: client?.name ?? null },
|
|
171
|
+
todaySeconds, projectShare, fiveHour: input.fiveHour, sevenDay: input.sevenDay,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
db.close();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/** Los turnos guardados más los recién leídos, sin repetir y dentro del rango. */
|
|
179
|
+
function merge(saved, fresh, from, to) {
|
|
180
|
+
const seen = new Set(saved.map((t) => t.turnId));
|
|
181
|
+
return [...saved, ...fresh.filter((t) => !seen.has(t.turnId) && t.at >= from && t.at <= to)]
|
|
182
|
+
.sort((a, b) => a.at.getTime() - b.at.getTime());
|
|
183
|
+
}
|
|
184
|
+
// ---------------------------------------------------------------------------
|
|
185
|
+
// Lectura incremental del transcript de la sesión
|
|
186
|
+
// ---------------------------------------------------------------------------
|
|
187
|
+
/** Lo más que se lee de un transcript que se ve por primera vez. */
|
|
188
|
+
const FIRST_READ_BYTES = 4 * 1024 * 1024;
|
|
189
|
+
/**
|
|
190
|
+
* Lee solo lo nuevo del transcript de esta sesión desde la última vez, y lo
|
|
191
|
+
* guarda en la base.
|
|
192
|
+
*
|
|
193
|
+
* - Se avanza hasta el último salto de línea: Claude Code puede estar
|
|
194
|
+
* escribiendo la última, y una línea a medias se leerá entera la próxima.
|
|
195
|
+
* - Si el fichero encoge, se empieza de nuevo.
|
|
196
|
+
* - La primera vez se leen como mucho los últimos 4 MB: el resto ya lo trajo
|
|
197
|
+
* `import`, y una sesión larga no puede costar segundos.
|
|
198
|
+
* - `INSERT OR IGNORE` sobre el `turn_id`: el siguiente `import` no duplica.
|
|
199
|
+
* - Un turno de scratchpad que no se pudo devolver a su repositorio NO se
|
|
200
|
+
* guarda: con esa ruta se quedaría así para siempre, porque el `import`
|
|
201
|
+
* que sí sabría devolverlo ya no podría reescribirlo.
|
|
202
|
+
*/
|
|
203
|
+
function readNewTurns(db, dbPath, file, dir) {
|
|
204
|
+
const cache = (0, statusline_cache_js_1.loadCache)(dbPath);
|
|
205
|
+
const entry = cache.files[file];
|
|
206
|
+
let fd;
|
|
207
|
+
try {
|
|
208
|
+
fd = (0, node_fs_1.openSync)(file, "r");
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return [];
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
const size = (0, node_fs_1.fstatSync)(fd).size;
|
|
215
|
+
let start = entry && entry.offset <= size ? entry.offset : Math.max(0, size - FIRST_READ_BYTES);
|
|
216
|
+
const midFile = !entry && start > 0;
|
|
217
|
+
if (start >= size) {
|
|
218
|
+
cache.files[file] = { offset: size, seenAt: new Date().toISOString() };
|
|
219
|
+
(0, statusline_cache_js_1.saveCache)(dbPath, cache);
|
|
220
|
+
return [];
|
|
221
|
+
}
|
|
222
|
+
const buf = Buffer.alloc(size - start);
|
|
223
|
+
(0, node_fs_1.readSync)(fd, buf, 0, buf.length, start);
|
|
224
|
+
const lastNl = buf.lastIndexOf(0x0a);
|
|
225
|
+
if (lastNl < 0)
|
|
226
|
+
return [];
|
|
227
|
+
let text = buf.subarray(0, lastNl + 1).toString("utf8");
|
|
228
|
+
// Empezando a mitad de fichero, la primera línea casi seguro está cortada.
|
|
229
|
+
if (midFile)
|
|
230
|
+
text = text.slice(text.indexOf("\n") + 1);
|
|
231
|
+
const byId = new Map();
|
|
232
|
+
for (const line of text.split("\n")) {
|
|
233
|
+
const t = (0, claude_js_1.parseTranscriptLine)(line);
|
|
234
|
+
if (t && typeof t === "object" && !byId.has(t.turnId))
|
|
235
|
+
byId.set(t.turnId, t);
|
|
236
|
+
}
|
|
237
|
+
const known = [...store.allProjectRepoPaths(db), dir];
|
|
238
|
+
const turns = (0, claude_js_1.resolveScratchpads)([...byId.values()], known)
|
|
239
|
+
.filter((t) => !t.repoPath || !(0, claude_js_1.isScratchpad)(t.repoPath));
|
|
240
|
+
try {
|
|
241
|
+
store.saveTurns(db, turns);
|
|
242
|
+
start += lastNl + 1;
|
|
243
|
+
cache.files[file] = { offset: start, seenAt: new Date().toISOString() };
|
|
244
|
+
(0, statusline_cache_js_1.saveCache)(dbPath, cache);
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
// Base ocupada: no se avanza, para volver a intentarlo. Los turnos sirven
|
|
248
|
+
// igual para esta línea, desde la memoria.
|
|
249
|
+
}
|
|
250
|
+
return turns;
|
|
251
|
+
}
|
|
252
|
+
finally {
|
|
253
|
+
(0, node_fs_1.closeSync)(fd);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=statusline-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusline-run.js","sourceRoot":"","sources":["../src/statusline-run.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,sCAoBC;AAgDD,sCA0DC;AA9JD,2DAA+C;AAC/C,qCAA+E;AAI/E,2DAA0E;AAC1E,8CAA+D;AAC/D,qDAAuC;AACvC,iDAA4E;AAC5E,yCAA2C;AAC3C,mDAAqE;AACrE,+DAAkF;AAClF,mDAA+G;AAC/G,oDAA6F;AAmBtF,KAAK,UAAU,aAAa,CAAC,IAAuB;IACzD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAA,gCAAgB,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACnE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpE,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAA,yBAAS,EAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC;QAEvD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC3B,IAAI,CAAC;gBAAC,IAAA,yCAAmB,EAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAClG,CAAC;QACD,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,IAAA,4BAAY,EAAC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/G,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,UAAU,CAAC,IAAuB;IACzC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE;QAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,CAAC,CAAC;IACF,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,2BAAe;QAClC,KAAK,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QAC/D,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC;KACxB,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,SAAS,WAAW;IAClB,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;AAC9G,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,OAAe,EAAE,KAAa;IACjD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAA,8BAAS,EAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7F,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAE9E;;;GAGG;AACH,SAAgB,aAAa,CAAC,KAAkB,EAAE,MAAc,EAAE,GAAS;IACzE,MAAM,WAAW,GAAG,CAAC,IAAmB,EAAc,EAAE,CAAC,CAAC;QACxD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI;QACxE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ;KAAE,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK,CAAC,GAAG;QAAE,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,IAAA,oBAAU,EAAC,MAAM,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,IAAA,uBAAO,EAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,0BAAU,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,EAAE,GAAG,IAAA,wBAAY,EAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,2EAA2E;QAC3E,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,IAAA,wBAAa,EAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,gFAAgF;QAChF,MAAM,OAAO,GAAG,IAAA,6BAAa,EAAC,EAAE,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7G,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAClC,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAExF,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAE9F,MAAM,SAAS,GAAG,CAAC,IAAmB,EAAiB,EAAE;YACvD,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QACnD,CAAC,CAAC;QAEF,wEAAwE;QACxE,wEAAwE;QACxE,uEAAuE;QACvE,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACzE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC;aACpG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,IAAA,mCAAmB,EAAC,IAAA,0BAAU,EAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5E,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAE/D,0EAA0E;QAC1E,wCAAwC;QACxC,MAAM,MAAM,GAAG,IAAA,oBAAS,EAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC;aAChG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,CAAC,IAAmB,EAAe,EAAE;YACpD,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1B,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAClF,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,IAAA,oBAAS,EAAC,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC7E,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QACpG,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEtE,OAAO;YACL,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,IAAI,IAAI,EAAE;YAC7D,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ;SAC/E,CAAC;IACJ,CAAC;YAAS,CAAC;QAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AAC3B,CAAC;AAED,kFAAkF;AAClF,SAAS,KAAK,CAAC,KAA2B,EAAE,KAA2B,EAAE,IAAU,EAAE,EAAQ;IAC3F,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;SACzF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,8EAA8E;AAC9E,kDAAkD;AAClD,8EAA8E;AAE9E,oEAAoE;AACpE,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzC;;;;;;;;;;;;;GAaG;AACH,SAAS,YAAY,CAAC,EAAmC,EAAE,MAAc,EAAE,IAAY,EAAE,GAAW;IAClG,MAAM,KAAK,GAAG,IAAA,+BAAS,EAAC,MAAM,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,EAAU,CAAC;IACf,IAAI,CAAC;QAAC,EAAE,GAAG,IAAA,kBAAQ,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAA,mBAAS,EAAC,EAAE,CAAC,CAAC,IAAI,CAAC;QAChC,IAAI,KAAK,GAAG,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,gBAAgB,CAAC,CAAC;QAChG,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC;QACpC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACvE,IAAA,+BAAS,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;QACvC,IAAA,kBAAQ,EAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QAC1B,IAAI,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACxD,2EAA2E;QAC3E,IAAI,OAAO;YAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAEvD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAqB,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,IAAA,+BAAmB,EAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAA,8BAAkB,EAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC;aACxD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAA,wBAAY,EAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE3D,IAAI,CAAC;YACH,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC3B,KAAK,IAAI,MAAM,GAAG,CAAC,CAAC;YACpB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACxE,IAAA,+BAAS,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,0EAA0E;YAC1E,2CAA2C;QAC7C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QAAC,IAAA,mBAAS,EAAC,EAAE,CAAC,CAAC;IAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `estela statusline`: la línea que Claude Code pinta bajo cada sesión.
|
|
3
|
+
*
|
|
4
|
+
* Funciones puras, sin disco ni base de datos: qué llega por stdin, qué se
|
|
5
|
+
* enseña y cómo se recorta. Lo que lee datos vive en `statusline-run.ts`.
|
|
6
|
+
*
|
|
7
|
+
* La regla de siempre: nada de "te queda X" ni cuentas atrás. Los porcentajes
|
|
8
|
+
* de límite son los que manda Claude Code (`rate_limits`), tal cual; si no
|
|
9
|
+
* los manda, no se enseña nada de límites. Estela no estima ninguno.
|
|
10
|
+
*/
|
|
11
|
+
/** Lo que interesa del JSON que Claude Code pasa por stdin. Todo opcional. */
|
|
12
|
+
export interface StatusInput {
|
|
13
|
+
readonly dir: string | null;
|
|
14
|
+
readonly transcriptPath: string | null;
|
|
15
|
+
/** 0–100, de `rate_limits.five_hour.used_percentage`. */
|
|
16
|
+
readonly fiveHour: number | null;
|
|
17
|
+
/** 0–100, de `rate_limits.seven_day.used_percentage`. */
|
|
18
|
+
readonly sevenDay: number | null;
|
|
19
|
+
/**
|
|
20
|
+
* `rate_limits.five_hour.resets_at`. No se enseña nunca (nada de cuentas
|
|
21
|
+
* atrás): se guarda para que `estela quota` sepa dónde empieza la ventana.
|
|
22
|
+
*/
|
|
23
|
+
readonly fiveHourResetsAt?: Date | null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Lee la entrada. Lanza si no es un objeto JSON: quien llama imprime
|
|
27
|
+
* "estela" y sale con 0, que es lo que hay que hacer con una entrada rota.
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseStatusInput(text: string): StatusInput;
|
|
30
|
+
/** Lo que se sabe del proyecto del directorio actual. */
|
|
31
|
+
export interface StatusData {
|
|
32
|
+
/** null: el directorio no es de ningún proyecto de Estela. */
|
|
33
|
+
readonly project: {
|
|
34
|
+
readonly name: string;
|
|
35
|
+
readonly client: string | null;
|
|
36
|
+
} | null;
|
|
37
|
+
/**
|
|
38
|
+
* Sin proyecto: el nombre de la raíz git de la carpeta, para decir cuál
|
|
39
|
+
* es. null si está fuera de git.
|
|
40
|
+
*/
|
|
41
|
+
readonly unassignedRoot?: string | null;
|
|
42
|
+
/** Horas medidas hoy en este proyecto. */
|
|
43
|
+
readonly todaySeconds: number;
|
|
44
|
+
/** Parte de los tokens de Claude Code de esta semana que son de este proyecto (0–1), o null si no hubo consumo. */
|
|
45
|
+
readonly projectShare: number | null;
|
|
46
|
+
readonly fiveHour: number | null;
|
|
47
|
+
readonly sevenDay: number | null;
|
|
48
|
+
}
|
|
49
|
+
export interface RenderOptions {
|
|
50
|
+
/** Ancho del terminal (`COLUMNS`). Sin él, no se recorta. */
|
|
51
|
+
readonly columns?: number | null;
|
|
52
|
+
readonly color?: boolean;
|
|
53
|
+
/** Ancho que ya ocupa otra status line encadenada con --append. */
|
|
54
|
+
readonly reserved?: number;
|
|
55
|
+
}
|
|
56
|
+
/** Desde qué porcentaje la ventana de 5 h se pinta en ámbar. */
|
|
57
|
+
export declare const FIVE_HOUR_WARN = 80;
|
|
58
|
+
/** "2h14", "3h", "45m": corto, que la línea es estrecha. */
|
|
59
|
+
export declare function compactDuration(seconds: number): string;
|
|
60
|
+
/**
|
|
61
|
+
* La línea, ya recortada al ancho.
|
|
62
|
+
*
|
|
63
|
+
* Orden visual: estela · nombre · hoy · este proyecto · semana · 5 h.
|
|
64
|
+
* Lo que se quita si no cabe, en este orden: la 5 h, la semana, el nombre se
|
|
65
|
+
* queda en el cliente y luego se acorta con "…", "este proyecto" y "hoy".
|
|
66
|
+
* "estela" no se quita nunca: es lo que anuncia la herramienta en cada captura.
|
|
67
|
+
*/
|
|
68
|
+
export declare function renderStatus(data: StatusData, options?: RenderOptions): string;
|
|
69
|
+
/** Lo visible de una cadena con color: para medir y para los tests. */
|
|
70
|
+
export declare function stripAnsi(text: string): string;
|
|
71
|
+
//# sourceMappingURL=statusline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusline.d.ts","sourceRoot":"","sources":["../src/statusline.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,8EAA8E;AAC9E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAa1D;AAkBD,yDAAyD;AACzD,MAAM,WAAW,UAAU;IACzB,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IACnF;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,0CAA0C;IAC1C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,mHAAmH;IACnH,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,gEAAgE;AAChE,eAAO,MAAM,cAAc,KAAK,CAAC;AAYjC,4DAA4D;AAC5D,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAkElF;AAED,uEAAuE;AACvE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG9C"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FIVE_HOUR_WARN = void 0;
|
|
4
|
+
exports.parseStatusInput = parseStatusInput;
|
|
5
|
+
exports.compactDuration = compactDuration;
|
|
6
|
+
exports.renderStatus = renderStatus;
|
|
7
|
+
exports.stripAnsi = stripAnsi;
|
|
8
|
+
const index_js_1 = require("./i18n/index.js");
|
|
9
|
+
/**
|
|
10
|
+
* Lee la entrada. Lanza si no es un objeto JSON: quien llama imprime
|
|
11
|
+
* "estela" y sale con 0, que es lo que hay que hacer con una entrada rota.
|
|
12
|
+
*/
|
|
13
|
+
function parseStatusInput(text) {
|
|
14
|
+
const raw = JSON.parse(text);
|
|
15
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
16
|
+
throw new Error("bad-input");
|
|
17
|
+
const o = raw;
|
|
18
|
+
const ws = obj(o["workspace"]);
|
|
19
|
+
const limits = obj(o["rate_limits"]);
|
|
20
|
+
return {
|
|
21
|
+
dir: str(ws["project_dir"]) ?? str(ws["current_dir"]) ?? str(o["cwd"]),
|
|
22
|
+
transcriptPath: str(o["transcript_path"]),
|
|
23
|
+
fiveHour: pct(obj(limits["five_hour"])["used_percentage"]),
|
|
24
|
+
sevenDay: pct(obj(limits["seven_day"])["used_percentage"]),
|
|
25
|
+
fiveHourResetsAt: epoch(obj(limits["five_hour"])["resets_at"]),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/** Segundos desde 1970 (lo que manda Claude Code); por si acaso, también milisegundos. */
|
|
29
|
+
function epoch(v) {
|
|
30
|
+
if (typeof v !== "number" || !Number.isFinite(v) || v <= 0)
|
|
31
|
+
return null;
|
|
32
|
+
return new Date(v > 1e12 ? v : v * 1000);
|
|
33
|
+
}
|
|
34
|
+
function obj(v) {
|
|
35
|
+
return v && typeof v === "object" && !Array.isArray(v) ? v : {};
|
|
36
|
+
}
|
|
37
|
+
function str(v) {
|
|
38
|
+
return typeof v === "string" && v ? v : null;
|
|
39
|
+
}
|
|
40
|
+
function pct(v) {
|
|
41
|
+
return typeof v === "number" && Number.isFinite(v) && v >= 0 ? Math.min(v, 100) : null;
|
|
42
|
+
}
|
|
43
|
+
/** Desde qué porcentaje la ventana de 5 h se pinta en ámbar. */
|
|
44
|
+
exports.FIVE_HOUR_WARN = 80;
|
|
45
|
+
const SEP = " · ";
|
|
46
|
+
const ESC = "\x1b[";
|
|
47
|
+
const JADE = `${ESC}38;2;70;192;167m`; // #46C0A7
|
|
48
|
+
const GRAY = `${ESC}90m`;
|
|
49
|
+
const AMBER = `${ESC}38;2;221;168;90m`; // el ámbar del panel en modo oscuro
|
|
50
|
+
const RESET = `${ESC}0m`;
|
|
51
|
+
/** "2h14", "3h", "45m": corto, que la línea es estrecha. */
|
|
52
|
+
function compactDuration(seconds) {
|
|
53
|
+
const total = Math.round(seconds / 60);
|
|
54
|
+
const h = Math.floor(total / 60), m = total % 60;
|
|
55
|
+
if (h === 0)
|
|
56
|
+
return `${m}m`;
|
|
57
|
+
return m === 0 ? `${h}h` : `${h}h${String(m).padStart(2, "0")}`;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* La línea, ya recortada al ancho.
|
|
61
|
+
*
|
|
62
|
+
* Orden visual: estela · nombre · hoy · este proyecto · semana · 5 h.
|
|
63
|
+
* Lo que se quita si no cabe, en este orden: la 5 h, la semana, el nombre se
|
|
64
|
+
* queda en el cliente y luego se acorta con "…", "este proyecto" y "hoy".
|
|
65
|
+
* "estela" no se quita nunca: es lo que anuncia la herramienta en cada captura.
|
|
66
|
+
*/
|
|
67
|
+
function renderStatus(data, options = {}) {
|
|
68
|
+
const color = options.color !== false;
|
|
69
|
+
const paint = (c, t) => (color ? `${c}${t}${RESET}` : t);
|
|
70
|
+
const width = options.columns && options.columns > 0
|
|
71
|
+
? Math.max(0, options.columns - (options.reserved ?? 0)) : Infinity;
|
|
72
|
+
if (!data.project) {
|
|
73
|
+
// Fuera de git no hay nombre que dar ni nada que configurar ahí.
|
|
74
|
+
const root = data.unassignedRoot ?? null;
|
|
75
|
+
if (!root) {
|
|
76
|
+
const line = `${SEP}${(0, index_js_1.tr) `sin proyecto`}`;
|
|
77
|
+
return "estela".length + line.length <= width ? paint(JADE, "estela") + paint(GRAY, line) : paint(JADE, "estela");
|
|
78
|
+
}
|
|
79
|
+
// Un repo sin proyecto: "estela · web sin proyecto · estela setup". Lo
|
|
80
|
+
// primero que se va es la pista; luego se acorta el nombre de la raíz.
|
|
81
|
+
const withHint = `${SEP}${(0, index_js_1.tr) `${root} (sin proyecto)`}${SEP}estela setup`;
|
|
82
|
+
if ("estela".length + withHint.length <= width)
|
|
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)`}`);
|
|
89
|
+
}
|
|
90
|
+
return paint(JADE, "estela");
|
|
91
|
+
}
|
|
92
|
+
const segs = [{ key: "today", text: (0, index_js_1.tr) `hoy ${compactDuration(data.todaySeconds)}` }];
|
|
93
|
+
if (data.projectShare !== null)
|
|
94
|
+
segs.push({ key: "project", text: (0, index_js_1.tr) `este proyecto ${Math.round(data.projectShare * 100)} %` });
|
|
95
|
+
if (data.sevenDay !== null)
|
|
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
|
+
const { name, client } = data.project;
|
|
101
|
+
const full = client ? `${client} › ${name}` : name;
|
|
102
|
+
const short = client ?? name;
|
|
103
|
+
const steps = [
|
|
104
|
+
{ drop: [], name: "full" },
|
|
105
|
+
{ drop: ["fiveHour"], name: "full" },
|
|
106
|
+
{ drop: ["fiveHour", "week"], name: "full" },
|
|
107
|
+
{ drop: ["fiveHour", "week"], name: "short" },
|
|
108
|
+
{ drop: ["fiveHour", "week"], name: "trunc", min: 6 },
|
|
109
|
+
{ drop: ["fiveHour", "week", "project"], name: "trunc", min: 6 },
|
|
110
|
+
{ drop: ["fiveHour", "week", "project", "today"], name: "trunc", min: 2 },
|
|
111
|
+
];
|
|
112
|
+
for (const step of steps) {
|
|
113
|
+
const kept = segs.filter((s) => !step.drop.includes(s.key));
|
|
114
|
+
const tail = kept.map((s) => SEP + s.text).join("");
|
|
115
|
+
const fixed = "estela".length + SEP.length + tail.length;
|
|
116
|
+
let shown;
|
|
117
|
+
if (step.name === "full")
|
|
118
|
+
shown = full;
|
|
119
|
+
else if (step.name === "short")
|
|
120
|
+
shown = short;
|
|
121
|
+
else {
|
|
122
|
+
const room = width - fixed;
|
|
123
|
+
if (room < (step.min ?? 1))
|
|
124
|
+
continue;
|
|
125
|
+
shown = short.length <= room ? short : short.slice(0, Math.max(0, room - 1)).trimEnd() + "…";
|
|
126
|
+
}
|
|
127
|
+
if (fixed + shown.length > width)
|
|
128
|
+
continue;
|
|
129
|
+
return paint(JADE, "estela") + paint(GRAY, SEP + shown) +
|
|
130
|
+
kept.map((s) => paint(GRAY, SEP) + paint(s.warn ? AMBER : GRAY, s.text)).join("");
|
|
131
|
+
}
|
|
132
|
+
return paint(JADE, "estela");
|
|
133
|
+
}
|
|
134
|
+
/** Lo visible de una cadena con color: para medir y para los tests. */
|
|
135
|
+
function stripAnsi(text) {
|
|
136
|
+
// eslint-disable-next-line no-control-regex
|
|
137
|
+
return text.replace(/\x1b\[[0-9;]*m/g, "");
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=statusline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusline.js","sourceRoot":"","sources":["../src/statusline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusline.test.d.ts","sourceRoot":"","sources":["../src/statusline.test.ts"],"names":[],"mappings":""}
|