@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 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
- if (process.env["ECONOMY_MACHINE_ID"])
574
- return process.env["ECONOMY_MACHINE_ID"];
575
- const h = hostname().toLowerCase();
576
- if (h.startsWith("spark") || h.startsWith("apple"))
577
- return h.split(".")[0];
578
- return h.split(".")[0];
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 = execFileSync) {
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 execFileSync2 } from "child_process";
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 = execFileSync2("pgrep", ["-x", "EconomyBar"], { stdio: "pipe" }).toString().trim();
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
- execFileSync2("unzip", ["-q", zipPath, "-d", extractDir], { stdio: "ignore" });
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
- execFileSync2("xattr", ["-rd", "com.apple.quarantine", APP_PATH], { stdio: "ignore" });
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
- execFileSync2("open", [APP_PATH], { stdio: "ignore" });
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
- execFileSync2("osascript", ["-e", 'quit app "Economy Bar"'], { stdio: "ignore" });
5171
- execFileSync2("sleep", ["1"], { stdio: "ignore" });
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
- execFileSync2("open", [APP_PATH], { stdio: "ignore" });
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
- execFileSync2("osascript", ["-e", 'quit app "Economy Bar"'], { stdio: "ignore" });
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
- db.exec(`DELETE FROM ingest_state WHERE source IN (${AGENTS.map((a) => `'${a}'`).join(", ")})`);
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":"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"}
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
- if (process.env["ECONOMY_MACHINE_ID"])
523
- return process.env["ECONOMY_MACHINE_ID"];
524
- const h = hostname().toLowerCase();
525
- if (h.startsWith("spark") || h.startsWith("apple"))
526
- return h.split(".")[0];
527
- return h.split(".")[0];
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
- if (process.env["ECONOMY_MACHINE_ID"])
524
- return process.env["ECONOMY_MACHINE_ID"];
525
- const h = hostname().toLowerCase();
526
- if (h.startsWith("spark") || h.startsWith("apple"))
527
- return h.split(".")[0];
528
- return h.split(".")[0];
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();
@@ -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
- if (process.env["ECONOMY_MACHINE_ID"])
524
- return process.env["ECONOMY_MACHINE_ID"];
525
- const h = hostname().toLowerCase();
526
- if (h.startsWith("spark") || h.startsWith("apple"))
527
- return h.split(".")[0];
528
- return h.split(".")[0];
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();
@@ -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
- if (process.env["ECONOMY_MACHINE_ID"])
524
- return process.env["ECONOMY_MACHINE_ID"];
525
- const h = hostname().toLowerCase();
526
- if (h.startsWith("spark") || h.startsWith("apple"))
527
- return h.split(".")[0];
528
- return h.split(".")[0];
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.37",
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",