@hasna/economy 0.2.37 → 0.2.39
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/dist/cli/index.js +43 -19
- package/dist/db/database.d.ts.map +1 -1
- package/dist/index.js +30 -7
- package/dist/mcp/index.js +30 -7
- package/dist/otel/index.js +30 -7
- package/dist/server/index.js +30 -7
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -565,17 +565,40 @@ __export(exports_database, {
|
|
|
565
565
|
clearBillingRange: () => clearBillingRange
|
|
566
566
|
});
|
|
567
567
|
import { SqliteAdapter as Database } from "@hasna/cloud";
|
|
568
|
+
import { execFileSync } from "child_process";
|
|
568
569
|
import { copyFileSync, existsSync, mkdirSync, readdirSync, statSync } from "fs";
|
|
569
|
-
import { hostname } from "os";
|
|
570
|
+
import { hostname, platform } from "os";
|
|
570
571
|
import { homedir } from "os";
|
|
571
572
|
import { join } from "path";
|
|
573
|
+
function normalizeMachineId(value) {
|
|
574
|
+
const id = value?.trim().toLowerCase().split(".")[0];
|
|
575
|
+
return id && id.length > 0 ? id : null;
|
|
576
|
+
}
|
|
577
|
+
function macHostMachineId() {
|
|
578
|
+
if (platform() !== "darwin")
|
|
579
|
+
return null;
|
|
580
|
+
for (const key of ["LocalHostName", "ComputerName", "HostName"]) {
|
|
581
|
+
try {
|
|
582
|
+
const value = execFileSync("/usr/sbin/scutil", ["--get", key], {
|
|
583
|
+
encoding: "utf8",
|
|
584
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
585
|
+
timeout: 1000
|
|
586
|
+
});
|
|
587
|
+
const id = normalizeMachineId(value);
|
|
588
|
+
if (id && id !== "mac" && id !== "localhost")
|
|
589
|
+
return id;
|
|
590
|
+
} catch {}
|
|
591
|
+
}
|
|
592
|
+
return null;
|
|
593
|
+
}
|
|
572
594
|
function getMachineId() {
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
595
|
+
const envMachine = normalizeMachineId(process.env["ECONOMY_MACHINE_ID"]);
|
|
596
|
+
if (envMachine)
|
|
597
|
+
return envMachine;
|
|
598
|
+
const hostMachine = normalizeMachineId(hostname()) ?? "unknown";
|
|
599
|
+
if (hostMachine === "mac" || hostMachine === "localhost")
|
|
600
|
+
return macHostMachineId() ?? hostMachine;
|
|
601
|
+
return hostMachine;
|
|
579
602
|
}
|
|
580
603
|
function getDataDir() {
|
|
581
604
|
const home = process.env["HOME"] || process.env["USERPROFILE"] || homedir();
|
|
@@ -4425,14 +4448,14 @@ var init_watch_paths = __esm(() => {
|
|
|
4425
4448
|
});
|
|
4426
4449
|
|
|
4427
4450
|
// src/cli/commands/notification.ts
|
|
4428
|
-
import { execFileSync } from "child_process";
|
|
4451
|
+
import { execFileSync as execFileSync2 } from "child_process";
|
|
4429
4452
|
function appleScriptString(value) {
|
|
4430
4453
|
return `"${value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")}"`;
|
|
4431
4454
|
}
|
|
4432
4455
|
function notificationScript(title, body) {
|
|
4433
4456
|
return `display notification ${appleScriptString(body)} with title ${appleScriptString(title)}`;
|
|
4434
4457
|
}
|
|
4435
|
-
function sendNotification(title, body, execFile =
|
|
4458
|
+
function sendNotification(title, body, execFile = execFileSync2) {
|
|
4436
4459
|
try {
|
|
4437
4460
|
execFile("osascript", ["-e", notificationScript(title, body)], { stdio: "ignore" });
|
|
4438
4461
|
} catch {}
|
|
@@ -5073,7 +5096,7 @@ __export(exports_menubar, {
|
|
|
5073
5096
|
menubarInstall: () => menubarInstall
|
|
5074
5097
|
});
|
|
5075
5098
|
import chalk6 from "chalk";
|
|
5076
|
-
import { execFileSync as
|
|
5099
|
+
import { execFileSync as execFileSync3 } from "child_process";
|
|
5077
5100
|
import { cpSync, existsSync as existsSync16, mkdirSync as mkdirSync4, rmSync, writeFileSync as writeFileSync3 } from "fs";
|
|
5078
5101
|
import { tmpdir, arch } from "os";
|
|
5079
5102
|
import { join as join13 } from "path";
|
|
@@ -5085,7 +5108,7 @@ function isInstalled() {
|
|
|
5085
5108
|
}
|
|
5086
5109
|
function isRunning() {
|
|
5087
5110
|
try {
|
|
5088
|
-
const result =
|
|
5111
|
+
const result = execFileSync3("pgrep", ["-x", "EconomyBar"], { stdio: "pipe" }).toString().trim();
|
|
5089
5112
|
return result.length > 0;
|
|
5090
5113
|
} catch {
|
|
5091
5114
|
return false;
|
|
@@ -5136,12 +5159,12 @@ async function menubarInstall(opts) {
|
|
|
5136
5159
|
try {
|
|
5137
5160
|
rmSync(extractDir, { recursive: true, force: true });
|
|
5138
5161
|
mkdirSync4(extractDir, { recursive: true });
|
|
5139
|
-
|
|
5162
|
+
execFileSync3("unzip", ["-q", zipPath, "-d", extractDir], { stdio: "ignore" });
|
|
5140
5163
|
if (isInstalled())
|
|
5141
5164
|
rmSync(APP_PATH, { recursive: true, force: true });
|
|
5142
5165
|
cpSync(join13(extractDir, "Economy Bar.app"), APP_PATH, { recursive: true });
|
|
5143
5166
|
try {
|
|
5144
|
-
|
|
5167
|
+
execFileSync3("xattr", ["-rd", "com.apple.quarantine", APP_PATH], { stdio: "ignore" });
|
|
5145
5168
|
} catch {}
|
|
5146
5169
|
rmSync(zipPath, { force: true });
|
|
5147
5170
|
rmSync(extractDir, { recursive: true, force: true });
|
|
@@ -5152,7 +5175,7 @@ async function menubarInstall(opts) {
|
|
|
5152
5175
|
}
|
|
5153
5176
|
console.log(chalk6.cyan("\u2192 Launching Economy Bar..."));
|
|
5154
5177
|
try {
|
|
5155
|
-
|
|
5178
|
+
execFileSync3("open", [APP_PATH], { stdio: "ignore" });
|
|
5156
5179
|
console.log(chalk6.bold.green(`
|
|
5157
5180
|
\u2713 Economy Bar is running in your menu bar!`));
|
|
5158
5181
|
console.log(chalk6.dim(" Make sure economy serve is running: economy serve"));
|
|
@@ -5167,8 +5190,8 @@ function menubarUninstall() {
|
|
|
5167
5190
|
}
|
|
5168
5191
|
if (isRunning()) {
|
|
5169
5192
|
try {
|
|
5170
|
-
|
|
5171
|
-
|
|
5193
|
+
execFileSync3("osascript", ["-e", 'quit app "Economy Bar"'], { stdio: "ignore" });
|
|
5194
|
+
execFileSync3("sleep", ["1"], { stdio: "ignore" });
|
|
5172
5195
|
} catch {}
|
|
5173
5196
|
}
|
|
5174
5197
|
rmSync(APP_PATH, { recursive: true, force: true });
|
|
@@ -5179,7 +5202,7 @@ function menubarStart() {
|
|
|
5179
5202
|
console.error(chalk6.red("Economy Bar is not installed. Run: economy menubar install"));
|
|
5180
5203
|
process.exit(1);
|
|
5181
5204
|
}
|
|
5182
|
-
|
|
5205
|
+
execFileSync3("open", [APP_PATH], { stdio: "ignore" });
|
|
5183
5206
|
console.log(chalk6.green("\u2713 Economy Bar launched"));
|
|
5184
5207
|
}
|
|
5185
5208
|
function menubarStop() {
|
|
@@ -5188,7 +5211,7 @@ function menubarStop() {
|
|
|
5188
5211
|
return;
|
|
5189
5212
|
}
|
|
5190
5213
|
try {
|
|
5191
|
-
|
|
5214
|
+
execFileSync3("osascript", ["-e", 'quit app "Economy Bar"'], { stdio: "ignore" });
|
|
5192
5215
|
console.log(chalk6.green("\u2713 Economy Bar stopped"));
|
|
5193
5216
|
} catch {
|
|
5194
5217
|
console.log(chalk6.yellow("Could not quit Economy Bar gracefully"));
|
|
@@ -8014,7 +8037,8 @@ program.command("sync").description("Ingest cost data from all coding agents").o
|
|
|
8014
8037
|
}
|
|
8015
8038
|
}
|
|
8016
8039
|
if (opts.force) {
|
|
8017
|
-
|
|
8040
|
+
const ingestSources = [...AGENTS, "codex-codewith"];
|
|
8041
|
+
db.exec(`DELETE FROM ingest_state WHERE source IN (${ingestSources.map((a) => `'${a}'`).join(", ")})`);
|
|
8018
8042
|
if (opts.verbose)
|
|
8019
8043
|
console.log(chalk7.dim("Cleared ingest cache"));
|
|
8020
8044
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -514,17 +514,40 @@ var init_pricing = __esm(() => {
|
|
|
514
514
|
|
|
515
515
|
// src/db/database.ts
|
|
516
516
|
import { SqliteAdapter as Database } from "@hasna/cloud";
|
|
517
|
+
import { execFileSync } from "child_process";
|
|
517
518
|
import { copyFileSync, existsSync, mkdirSync, readdirSync, statSync } from "fs";
|
|
518
|
-
import { hostname } from "os";
|
|
519
|
+
import { hostname, platform } from "os";
|
|
519
520
|
import { homedir } from "os";
|
|
520
521
|
import { join } from "path";
|
|
522
|
+
function normalizeMachineId(value) {
|
|
523
|
+
const id = value?.trim().toLowerCase().split(".")[0];
|
|
524
|
+
return id && id.length > 0 ? id : null;
|
|
525
|
+
}
|
|
526
|
+
function macHostMachineId() {
|
|
527
|
+
if (platform() !== "darwin")
|
|
528
|
+
return null;
|
|
529
|
+
for (const key of ["LocalHostName", "ComputerName", "HostName"]) {
|
|
530
|
+
try {
|
|
531
|
+
const value = execFileSync("/usr/sbin/scutil", ["--get", key], {
|
|
532
|
+
encoding: "utf8",
|
|
533
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
534
|
+
timeout: 1000
|
|
535
|
+
});
|
|
536
|
+
const id = normalizeMachineId(value);
|
|
537
|
+
if (id && id !== "mac" && id !== "localhost")
|
|
538
|
+
return id;
|
|
539
|
+
} catch {}
|
|
540
|
+
}
|
|
541
|
+
return null;
|
|
542
|
+
}
|
|
521
543
|
function getMachineId() {
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
544
|
+
const envMachine = normalizeMachineId(process.env["ECONOMY_MACHINE_ID"]);
|
|
545
|
+
if (envMachine)
|
|
546
|
+
return envMachine;
|
|
547
|
+
const hostMachine = normalizeMachineId(hostname()) ?? "unknown";
|
|
548
|
+
if (hostMachine === "mac" || hostMachine === "localhost")
|
|
549
|
+
return macHostMachineId() ?? hostMachine;
|
|
550
|
+
return hostMachine;
|
|
528
551
|
}
|
|
529
552
|
function getDataDir() {
|
|
530
553
|
const home = process.env["HOME"] || process.env["USERPROFILE"] || homedir();
|
package/dist/mcp/index.js
CHANGED
|
@@ -515,17 +515,40 @@ var init_pricing = __esm(() => {
|
|
|
515
515
|
|
|
516
516
|
// src/db/database.ts
|
|
517
517
|
import { SqliteAdapter as Database } from "@hasna/cloud";
|
|
518
|
+
import { execFileSync } from "child_process";
|
|
518
519
|
import { copyFileSync, existsSync, mkdirSync, readdirSync, statSync } from "fs";
|
|
519
|
-
import { hostname } from "os";
|
|
520
|
+
import { hostname, platform } from "os";
|
|
520
521
|
import { homedir } from "os";
|
|
521
522
|
import { join } from "path";
|
|
523
|
+
function normalizeMachineId(value) {
|
|
524
|
+
const id = value?.trim().toLowerCase().split(".")[0];
|
|
525
|
+
return id && id.length > 0 ? id : null;
|
|
526
|
+
}
|
|
527
|
+
function macHostMachineId() {
|
|
528
|
+
if (platform() !== "darwin")
|
|
529
|
+
return null;
|
|
530
|
+
for (const key of ["LocalHostName", "ComputerName", "HostName"]) {
|
|
531
|
+
try {
|
|
532
|
+
const value = execFileSync("/usr/sbin/scutil", ["--get", key], {
|
|
533
|
+
encoding: "utf8",
|
|
534
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
535
|
+
timeout: 1000
|
|
536
|
+
});
|
|
537
|
+
const id = normalizeMachineId(value);
|
|
538
|
+
if (id && id !== "mac" && id !== "localhost")
|
|
539
|
+
return id;
|
|
540
|
+
} catch {}
|
|
541
|
+
}
|
|
542
|
+
return null;
|
|
543
|
+
}
|
|
522
544
|
function getMachineId() {
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
545
|
+
const envMachine = normalizeMachineId(process.env["ECONOMY_MACHINE_ID"]);
|
|
546
|
+
if (envMachine)
|
|
547
|
+
return envMachine;
|
|
548
|
+
const hostMachine = normalizeMachineId(hostname()) ?? "unknown";
|
|
549
|
+
if (hostMachine === "mac" || hostMachine === "localhost")
|
|
550
|
+
return macHostMachineId() ?? hostMachine;
|
|
551
|
+
return hostMachine;
|
|
529
552
|
}
|
|
530
553
|
function getDataDir() {
|
|
531
554
|
const home = process.env["HOME"] || process.env["USERPROFILE"] || homedir();
|
package/dist/otel/index.js
CHANGED
|
@@ -515,17 +515,40 @@ var init_pricing = __esm(() => {
|
|
|
515
515
|
|
|
516
516
|
// src/db/database.ts
|
|
517
517
|
import { SqliteAdapter as Database } from "@hasna/cloud";
|
|
518
|
+
import { execFileSync } from "child_process";
|
|
518
519
|
import { copyFileSync, existsSync, mkdirSync, readdirSync, statSync } from "fs";
|
|
519
|
-
import { hostname } from "os";
|
|
520
|
+
import { hostname, platform } from "os";
|
|
520
521
|
import { homedir } from "os";
|
|
521
522
|
import { join } from "path";
|
|
523
|
+
function normalizeMachineId(value) {
|
|
524
|
+
const id = value?.trim().toLowerCase().split(".")[0];
|
|
525
|
+
return id && id.length > 0 ? id : null;
|
|
526
|
+
}
|
|
527
|
+
function macHostMachineId() {
|
|
528
|
+
if (platform() !== "darwin")
|
|
529
|
+
return null;
|
|
530
|
+
for (const key of ["LocalHostName", "ComputerName", "HostName"]) {
|
|
531
|
+
try {
|
|
532
|
+
const value = execFileSync("/usr/sbin/scutil", ["--get", key], {
|
|
533
|
+
encoding: "utf8",
|
|
534
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
535
|
+
timeout: 1000
|
|
536
|
+
});
|
|
537
|
+
const id = normalizeMachineId(value);
|
|
538
|
+
if (id && id !== "mac" && id !== "localhost")
|
|
539
|
+
return id;
|
|
540
|
+
} catch {}
|
|
541
|
+
}
|
|
542
|
+
return null;
|
|
543
|
+
}
|
|
522
544
|
function getMachineId() {
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
545
|
+
const envMachine = normalizeMachineId(process.env["ECONOMY_MACHINE_ID"]);
|
|
546
|
+
if (envMachine)
|
|
547
|
+
return envMachine;
|
|
548
|
+
const hostMachine = normalizeMachineId(hostname()) ?? "unknown";
|
|
549
|
+
if (hostMachine === "mac" || hostMachine === "localhost")
|
|
550
|
+
return macHostMachineId() ?? hostMachine;
|
|
551
|
+
return hostMachine;
|
|
529
552
|
}
|
|
530
553
|
function getDataDir() {
|
|
531
554
|
const home = process.env["HOME"] || process.env["USERPROFILE"] || homedir();
|
package/dist/server/index.js
CHANGED
|
@@ -515,17 +515,40 @@ var init_pricing = __esm(() => {
|
|
|
515
515
|
|
|
516
516
|
// src/db/database.ts
|
|
517
517
|
import { SqliteAdapter as Database } from "@hasna/cloud";
|
|
518
|
+
import { execFileSync } from "child_process";
|
|
518
519
|
import { copyFileSync, existsSync, mkdirSync, readdirSync, statSync } from "fs";
|
|
519
|
-
import { hostname } from "os";
|
|
520
|
+
import { hostname, platform } from "os";
|
|
520
521
|
import { homedir } from "os";
|
|
521
522
|
import { join } from "path";
|
|
523
|
+
function normalizeMachineId(value) {
|
|
524
|
+
const id = value?.trim().toLowerCase().split(".")[0];
|
|
525
|
+
return id && id.length > 0 ? id : null;
|
|
526
|
+
}
|
|
527
|
+
function macHostMachineId() {
|
|
528
|
+
if (platform() !== "darwin")
|
|
529
|
+
return null;
|
|
530
|
+
for (const key of ["LocalHostName", "ComputerName", "HostName"]) {
|
|
531
|
+
try {
|
|
532
|
+
const value = execFileSync("/usr/sbin/scutil", ["--get", key], {
|
|
533
|
+
encoding: "utf8",
|
|
534
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
535
|
+
timeout: 1000
|
|
536
|
+
});
|
|
537
|
+
const id = normalizeMachineId(value);
|
|
538
|
+
if (id && id !== "mac" && id !== "localhost")
|
|
539
|
+
return id;
|
|
540
|
+
} catch {}
|
|
541
|
+
}
|
|
542
|
+
return null;
|
|
543
|
+
}
|
|
522
544
|
function getMachineId() {
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
545
|
+
const envMachine = normalizeMachineId(process.env["ECONOMY_MACHINE_ID"]);
|
|
546
|
+
if (envMachine)
|
|
547
|
+
return envMachine;
|
|
548
|
+
const hostMachine = normalizeMachineId(hostname()) ?? "unknown";
|
|
549
|
+
if (hostMachine === "mac" || hostMachine === "localhost")
|
|
550
|
+
return macHostMachineId() ?? hostMachine;
|
|
551
|
+
return hostMachine;
|
|
529
552
|
}
|
|
530
553
|
function getDataDir() {
|
|
531
554
|
const home = process.env["HOME"] || process.env["USERPROFILE"] || homedir();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hasna/economy",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.39",
|
|
4
4
|
"description": "AI coding cost tracker — CLI + MCP server + REST API + web dashboard for Claude Code, Codex, Gemini, OpenCode, Cursor, Pi, and Hermes",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|