@hasna/economy 0.5.7 → 0.5.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/chunks/{billing-22az60hy.js → billing-7twygmtj.js} +2 -2
  3. package/dist/chunks/{config-hsp7ndhj.js → config-mjgbekxj.js} +2 -2
  4. package/dist/chunks/{index-9wa1f2kv.js → index-7ek4r0ww.js} +1 -1
  5. package/dist/chunks/{index-z2n5y111.js → index-92x56q4h.js} +5 -4
  6. package/dist/chunks/{index-wq7c4wqs.js → index-970htsxe.js} +2 -2
  7. package/dist/chunks/{index-vajzfzgv.js → index-ep1pkyr3.js} +1 -1
  8. package/dist/chunks/{index-dk5rq1rq.js → index-gtjqy0kd.js} +1 -1
  9. package/dist/chunks/{index-b6c649mq.js → index-spwpgdbb.js} +82 -7
  10. package/dist/chunks/{index-c7h2rxx1.js → index-t0n32g8r.js} +1 -1
  11. package/dist/chunks/{index-6yr4hb72.js → index-twkdyrw4.js} +2 -2
  12. package/dist/chunks/{index-f5jv6q5q.js → index-zgvmrqyc.js} +1 -1
  13. package/dist/chunks/{open-projects-8qm46m3d.js → open-projects-bj561k5j.js} +1 -1
  14. package/dist/chunks/{pricing-k9wsjwbz.js → pricing-bkgvzpe9.js} +1 -1
  15. package/dist/chunks/{pricing-462f8xkm.js → pricing-bn88mhqk.js} +1 -1
  16. package/dist/chunks/{pricing-vxejj1qa.js → pricing-nt31hf53.js} +1 -1
  17. package/dist/chunks/{serve-ms8dvf7e.js → serve-tmv8zgvh.js} +14 -8
  18. package/dist/chunks/{sqlite-store-ht6frztj.js → sqlite-store-8t4anw98.js} +2 -2
  19. package/dist/chunks/{sqlite-store-13nhr1z0.js → sqlite-store-jfy0e8b6.js} +2 -2
  20. package/dist/chunks/{sqlite-store-gamn65xp.js → sqlite-store-r219qrjt.js} +2 -2
  21. package/dist/chunks/{tui-9t7340wd.js → tui-j8brj3wf.js} +4 -4
  22. package/dist/chunks/{watch-t6ssnx30.js → watch-ksn2mezm.js} +5 -5
  23. package/dist/chunks/{webhooks-nw4daw9y.js → webhooks-td46p6gk.js} +2 -2
  24. package/dist/cli/index.js +38 -32
  25. package/dist/cost-imports/contract.d.ts +84 -0
  26. package/dist/cost-imports/contract.d.ts.map +1 -0
  27. package/dist/cost-imports/decimal.d.ts +6 -0
  28. package/dist/cost-imports/decimal.d.ts.map +1 -0
  29. package/dist/cost-imports/providers.d.ts +4 -0
  30. package/dist/cost-imports/providers.d.ts.map +1 -0
  31. package/dist/index.js +72 -12
  32. package/dist/lib/analytics.d.ts +3 -0
  33. package/dist/lib/analytics.d.ts.map +1 -1
  34. package/dist/lib/comparison-contract.d.ts +8 -0
  35. package/dist/lib/comparison-contract.d.ts.map +1 -0
  36. package/dist/lib/comparison-test-contract.d.ts +3 -0
  37. package/dist/lib/comparison-test-contract.d.ts.map +1 -0
  38. package/dist/lib/ingest-journal-maintenance.d.ts.map +1 -1
  39. package/dist/lib/store/index.d.ts.map +1 -1
  40. package/dist/mcp/index.js +75 -15
  41. package/dist/otel/index.js +7 -5
  42. package/dist/server/index.js +40 -6
  43. package/dist/server/service-operations.d.ts.map +1 -1
  44. package/dist/server/service-worker.js +40 -6
  45. package/docs/comparison-coverage.md +30 -0
  46. package/docs/ingest-journal.md +5 -1
  47. package/native/README.md +48 -0
  48. package/native/Tools/pair-qr.py +6 -1
  49. package/native/Tools/pair-qr.swift +19 -1
  50. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/store/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/store/index.ts"],"names":[],"mappings":"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"}
package/dist/mcp/index.js CHANGED
@@ -5,6 +5,7 @@ import {
5
5
  MAX_INGEST_BYTES,
6
6
  MAX_INGEST_ROWS,
7
7
  assessCostFromDb,
8
+ buildCostSummary,
8
9
  cacheDir,
9
10
  calendarPeriodBounds,
10
11
  calendarPeriodWhere,
@@ -75,7 +76,7 @@ import {
75
76
  upsertUsageSnapshot,
76
77
  usageSnapshotFilterForPeriod,
77
78
  validateIngest
78
- } from "../chunks/index-vajzfzgv.js";
79
+ } from "../chunks/index-ep1pkyr3.js";
79
80
  import {
80
81
  __require
81
82
  } from "../chunks/index-p35cyhc4.js";
@@ -85,7 +86,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
85
86
  // package.json
86
87
  var package_default = {
87
88
  name: "@hasna/economy",
88
- version: "0.5.7",
89
+ version: "0.5.9",
89
90
  description: "AI coding cost tracker \u2014 CLI + MCP server + REST API for Claude Code, Codex, OpenCode, Cursor, Pi, and Hermes, with legacy Gemini CLI session and Gemini API billing ingestion",
90
91
  repository: {
91
92
  type: "git",
@@ -1342,18 +1343,19 @@ class IngestJournalMaintenance {
1342
1343
  throw new Error("Journal maintenance limit must be 1\u201332");
1343
1344
  await this.recover();
1344
1345
  await verifyJournalAuthority(this.journal, this.cloud);
1345
- const deadline = Date.now() + 30000;
1346
+ const sweepDeadline = Date.now() + 30000;
1346
1347
  let retired = 0, bytes = 0;
1347
1348
  let backend;
1348
1349
  try {
1349
1350
  const names = this.journal.names();
1350
1351
  for (const name of names.filter((n) => n.endsWith(".intent.json"))) {
1351
- if (retired >= limit || Date.now() >= deadline || retired > 0 && bytes >= 1048576)
1352
+ if (retired >= limit || Date.now() >= sweepDeadline || retired > 0 && bytes >= 1048576)
1352
1353
  break;
1353
1354
  if (!names.includes(name.replace(".intent.", ".receipt.")))
1354
1355
  continue;
1355
1356
  const intent = this.journal.intent(name), receipt = this.journal.receipt(intent.command);
1356
- backend ??= await this.backend(deadline);
1357
+ const deadline = Date.now() + 30000;
1358
+ backend = await this.backend(deadline);
1357
1359
  const m = {
1358
1360
  version: 1,
1359
1361
  target: this.journal.target,
@@ -1389,7 +1391,8 @@ class IngestJournalMaintenance {
1389
1391
  try {
1390
1392
  await this.maintain();
1391
1393
  } catch (error) {
1392
- if (exists(this.control) || !this.journal.canStage(command))
1394
+ const deferrable = error instanceof JournalMaintenanceError && ["recovery_not_configured", "self_host_trash_authority_required", "trash_version_mismatch", "recovery_authority_unavailable"].includes(error.reason);
1395
+ if (!deferrable || exists(this.control) || !this.journal.canStage(command))
1393
1396
  throw error;
1394
1397
  }
1395
1398
  if (!this.journal.canStage(command))
@@ -3705,7 +3708,7 @@ function backfillMachineId(db) {
3705
3708
  return { requests: Number(reqCount.changes), sessions: Number(sessCount.changes) };
3706
3709
  }
3707
3710
  async function recalculateZeroCostRequests(db) {
3708
- const { assessCostFromDb: assessCostFromDb2 } = await import("../chunks/pricing-vxejj1qa.js");
3711
+ const { assessCostFromDb: assessCostFromDb2 } = await import("../chunks/pricing-nt31hf53.js");
3709
3712
  const zeroRows = db.prepare(`SELECT id, model, input_tokens, output_tokens, cache_read_tokens, cache_create_tokens, cache_create_5m_tokens, cache_create_1h_tokens
3710
3713
  FROM requests
3711
3714
  WHERE cost_usd = 0
@@ -3914,7 +3917,7 @@ async function postIngest(cloud, body) {
3914
3917
  }
3915
3918
  async function syncAllToCloud(cloud, opts = {}) {
3916
3919
  await runIngestJournalOperation(cloud, { action: "reconcile" });
3917
- const { openDatabase } = await import("../chunks/sqlite-store-gamn65xp.js");
3920
+ const { openDatabase } = await import("../chunks/sqlite-store-jfy0e8b6.js");
3918
3921
  const scratch = openDatabase(":memory:", true);
3919
3922
  ensurePricingSeeded(scratch);
3920
3923
  const cachePath = opts.cachePath ?? getIngestCachePath();
@@ -3948,6 +3951,54 @@ function syncOutcomeLines(result) {
3948
3951
  return (result.collections ?? []).map((row) => `${row.source}: ${row.status}${row.error_code ? ` (${row.error_code})` : ""}`);
3949
3952
  }
3950
3953
 
3954
+ // src/lib/comparison-contract.ts
3955
+ function comparisonDateBounds(from, to) {
3956
+ const valid = (value) => /^\d{4}-\d{2}-\d{2}$/.test(value) && Number.isFinite(Date.parse(value + "T00:00:00Z")) && new Date(value + "T00:00:00Z").toISOString().slice(0, 10) === value;
3957
+ if (!valid(from) || !valid(to) || from > to) {
3958
+ throw new RangeError("from and to must be real YYYY-MM-DD UTC dates with from <= to");
3959
+ }
3960
+ const end = new Date(to + "T00:00:00Z");
3961
+ end.setUTCDate(end.getUTCDate() + 1);
3962
+ const exclusive = end.toISOString().slice(0, 10);
3963
+ if (!valid(exclusive))
3964
+ throw new RangeError("to exceeds the supported UTC date range");
3965
+ return { time_zone: "UTC", start_date: from, end_date_exclusive: exclusive };
3966
+ }
3967
+ function requireCurrentRangeStats(value, from, to) {
3968
+ if (!value || typeof value !== "object")
3969
+ throw new Error("COMPARISON_REPORT_UNAVAILABLE: Invalid response");
3970
+ const report = value;
3971
+ let money;
3972
+ try {
3973
+ money = requireCurrentCostSummary(report.money);
3974
+ } catch {
3975
+ throw new Error("COMPARISON_REPORT_UNAVAILABLE: The service must support comparison coverage");
3976
+ }
3977
+ for (const key of ["sessions", "requests", "tokens"]) {
3978
+ if (!Number.isSafeInteger(report[key]) || report[key] < 0)
3979
+ throw new Error("COMPARISON_REPORT_UNAVAILABLE: Invalid " + key);
3980
+ }
3981
+ if (report.cost !== money.total_usd || report.requests !== money.request_rows || report.tokens !== money.tokens || money.session_only_sessions !== 0 || money.session_only_value_usd !== 0 || money.requests !== money.request_rows) {
3982
+ throw new Error("COMPARISON_REPORT_UNAVAILABLE: Inconsistent monetary coverage");
3983
+ }
3984
+ const knownRows = money.request_rows - money.unknown_price_requests;
3985
+ const completeness = money.request_rows === 0 ? "no_records" : money.unknown_price_requests === 0 ? "complete" : knownRows > 0 ? "partial" : "unavailable";
3986
+ if (money.completeness !== completeness || knownRows === 0 && money.total_usd !== 0 || money.sessions > money.request_rows || money.request_rows === 0 && money.tokens !== 0) {
3987
+ throw new Error("COMPARISON_REPORT_UNAVAILABLE: Inconsistent request coverage");
3988
+ }
3989
+ const bounds = money.period_bounds;
3990
+ if (!bounds.start_date || !bounds.end_date_exclusive || bounds.start_date >= bounds.end_date_exclusive) {
3991
+ throw new Error("COMPARISON_REPORT_UNAVAILABLE: Missing comparison dates");
3992
+ }
3993
+ if (from !== undefined || to !== undefined) {
3994
+ const expected = comparisonDateBounds(from, to);
3995
+ if (bounds.start_date !== expected.start_date || bounds.end_date_exclusive !== expected.end_date_exclusive) {
3996
+ throw new Error("COMPARISON_REPORT_UNAVAILABLE: Response dates do not match the requested range");
3997
+ }
3998
+ }
3999
+ return report;
4000
+ }
4001
+
3951
4002
  // src/lib/store/index.ts
3952
4003
  import { randomUUID } from "crypto";
3953
4004
 
@@ -4888,11 +4939,20 @@ function queryExportRows(db, type, period) {
4888
4939
  return db.prepare(`SELECT * FROM economy_effective_sessions WHERE ${where} ORDER BY started_at DESC`).all();
4889
4940
  }
4890
4941
  function queryRangeStats(db, from, to) {
4891
- const r = db.prepare(`SELECT COALESCE(SUM(cost_usd),0) as cost, COUNT(*) as requests,
4892
- COALESCE(SUM(input_tokens+output_tokens+cache_read_tokens+cache_create_tokens),0) as tokens
4893
- FROM economy_effective_requests WHERE DATE(timestamp) BETWEEN ? AND ?`).get(from, to);
4942
+ const bounds = comparisonDateBounds(from, to);
4943
+ const groups = db.prepare(`
4944
+ SELECT cost_basis, model, CASE WHEN cost_usd = 0 THEN 1 WHEN cost_usd < 0 THEN 2 ELSE 0 END AS zero_cost,
4945
+ SUM(cost_usd) AS cost_usd, COUNT(*) AS requests,
4946
+ COALESCE(SUM(input_tokens),0) AS input_tokens, COALESCE(SUM(output_tokens),0) AS output_tokens,
4947
+ COALESCE(SUM(cache_read_tokens),0) AS cache_read_tokens, COALESCE(SUM(cache_create_tokens),0) AS cache_create_tokens,
4948
+ COALESCE(SUM(cache_create_1h_tokens),0) AS cache_create_1h_tokens
4949
+ FROM economy_effective_requests WHERE DATE(timestamp) BETWEEN ? AND ?
4950
+ GROUP BY cost_basis, model, CASE WHEN cost_usd = 0 THEN 1 WHEN cost_usd < 0 THEN 2 ELSE 0 END
4951
+ `).all(from, to);
4952
+ const requestSessions = db.prepare("SELECT COUNT(DISTINCT session_id) AS sessions FROM economy_effective_requests WHERE DATE(timestamp) BETWEEN ? AND ?").get(from, to);
4953
+ const money = buildCostSummary("all", bounds, groups, { sessions: 0, requests: 0, tokens: 0, cost_usd: 0 }, requestSessions.sessions, listModelPricing(db));
4894
4954
  const s = db.prepare(`SELECT COUNT(*) as sessions FROM economy_effective_sessions WHERE DATE(started_at) BETWEEN ? AND ?`).get(from, to);
4895
- return { cost: r.cost, requests: r.requests, tokens: r.tokens, sessions: s.sessions };
4955
+ return { cost: money.total_usd, money, requests: money.request_rows, tokens: money.tokens, sessions: s.sessions };
4896
4956
  }
4897
4957
  function queryForecast(db, now2 = new Date) {
4898
4958
  const month = resolveReportingInterval({ kind: "calendar", period: "month" }, now2);
@@ -4956,7 +5016,7 @@ class LocalStore2 {
4956
5016
  _db;
4957
5017
  async db() {
4958
5018
  if (!this._db) {
4959
- const { openDatabase } = await import("../chunks/sqlite-store-gamn65xp.js");
5019
+ const { openDatabase } = await import("../chunks/sqlite-store-jfy0e8b6.js");
4960
5020
  this._db = openDatabase();
4961
5021
  ensurePricingSeeded(this._db);
4962
5022
  }
@@ -5233,7 +5293,7 @@ class ApiStore2 {
5233
5293
  return cloudListItems(this.cloud, "export", q({ type, period }));
5234
5294
  }
5235
5295
  async rangeStats(from, to) {
5236
- return cloudObject(this.cloud, "/compare", q({ from, to }));
5296
+ return requireCurrentRangeStats(await cloudObject(this.cloud, "/compare", q({ from, to })), from, to);
5237
5297
  }
5238
5298
  async forecast() {
5239
5299
  return cloudObject(this.cloud, "/forecast");
@@ -5319,7 +5379,7 @@ function buildServer() {
5319
5379
  let _db;
5320
5380
  const localDb = async () => {
5321
5381
  if (!_db) {
5322
- const { openDatabase } = await import("../chunks/sqlite-store-gamn65xp.js");
5382
+ const { openDatabase } = await import("../chunks/sqlite-store-jfy0e8b6.js");
5323
5383
  _db = openDatabase();
5324
5384
  ensurePricingSeeded(_db);
5325
5385
  }
@@ -3281,18 +3281,19 @@ class IngestJournalMaintenance {
3281
3281
  throw new Error("Journal maintenance limit must be 1\u201332");
3282
3282
  await this.recover();
3283
3283
  await verifyJournalAuthority(this.journal, this.cloud);
3284
- const deadline = Date.now() + 30000;
3284
+ const sweepDeadline = Date.now() + 30000;
3285
3285
  let retired = 0, bytes = 0;
3286
3286
  let backend;
3287
3287
  try {
3288
3288
  const names = this.journal.names();
3289
3289
  for (const name of names.filter((n) => n.endsWith(".intent.json"))) {
3290
- if (retired >= limit || Date.now() >= deadline || retired > 0 && bytes >= 1048576)
3290
+ if (retired >= limit || Date.now() >= sweepDeadline || retired > 0 && bytes >= 1048576)
3291
3291
  break;
3292
3292
  if (!names.includes(name.replace(".intent.", ".receipt.")))
3293
3293
  continue;
3294
3294
  const intent = this.journal.intent(name), receipt = this.journal.receipt(intent.command);
3295
- backend ??= await this.backend(deadline);
3295
+ const deadline = Date.now() + 30000;
3296
+ backend = await this.backend(deadline);
3296
3297
  const m = {
3297
3298
  version: 1,
3298
3299
  target: this.journal.target,
@@ -3328,7 +3329,8 @@ class IngestJournalMaintenance {
3328
3329
  try {
3329
3330
  await this.maintain();
3330
3331
  } catch (error) {
3331
- if (exists(this.control) || !this.journal.canStage(command))
3332
+ const deferrable = error instanceof JournalMaintenanceError && ["recovery_not_configured", "self_host_trash_authority_required", "trash_version_mismatch", "recovery_authority_unavailable"].includes(error.reason);
3333
+ if (!deferrable || exists(this.control) || !this.journal.canStage(command))
3332
3334
  throw error;
3333
3335
  }
3334
3336
  if (!this.journal.canStage(command))
@@ -3480,7 +3482,7 @@ async function pushIngestRows(cloud, scratch) {
3480
3482
  // package.json
3481
3483
  var package_default = {
3482
3484
  name: "@hasna/economy",
3483
- version: "0.5.7",
3485
+ version: "0.5.9",
3484
3486
  description: "AI coding cost tracker \u2014 CLI + MCP server + REST API for Claude Code, Codex, OpenCode, Cursor, Pi, and Hermes, with legacy Gemini CLI session and Gemini API billing ingestion",
3485
3487
  repository: {
3486
3488
  type: "git",
@@ -5578,7 +5578,7 @@ function isAuthorizedRequest(req, path) {
5578
5578
  // package.json
5579
5579
  var package_default = {
5580
5580
  name: "@hasna/economy",
5581
- version: "0.5.7",
5581
+ version: "0.5.9",
5582
5582
  description: "AI coding cost tracker \u2014 CLI + MCP server + REST API for Claude Code, Codex, OpenCode, Cursor, Pi, and Hermes, with legacy Gemini CLI session and Gemini API billing ingestion",
5583
5583
  repository: {
5584
5584
  type: "git",
@@ -11839,6 +11839,25 @@ function buildBrief(db, opts = {}) {
11839
11839
  };
11840
11840
  }
11841
11841
 
11842
+ // src/lib/analytics.ts
11843
+ init_database();
11844
+ init_summary_contract();
11845
+
11846
+ // src/lib/comparison-contract.ts
11847
+ init_summary_contract();
11848
+ function comparisonDateBounds(from, to) {
11849
+ const valid = (value) => /^\d{4}-\d{2}-\d{2}$/.test(value) && Number.isFinite(Date.parse(value + "T00:00:00Z")) && new Date(value + "T00:00:00Z").toISOString().slice(0, 10) === value;
11850
+ if (!valid(from) || !valid(to) || from > to) {
11851
+ throw new RangeError("from and to must be real YYYY-MM-DD UTC dates with from <= to");
11852
+ }
11853
+ const end = new Date(to + "T00:00:00Z");
11854
+ end.setUTCDate(end.getUTCDate() + 1);
11855
+ const exclusive = end.toISOString().slice(0, 10);
11856
+ if (!valid(exclusive))
11857
+ throw new RangeError("to exceeds the supported UTC date range");
11858
+ return { time_zone: "UTC", start_date: from, end_date_exclusive: exclusive };
11859
+ }
11860
+
11842
11861
  // src/lib/analytics.ts
11843
11862
  function queryProjectDetail(db, nameOrPath, now = new Date) {
11844
11863
  const dailyBounds = resolveReportingInterval({ kind: "rolling", unit: "day", count: 14 }, now);
@@ -11888,11 +11907,20 @@ function queryExportRows(db, type, period) {
11888
11907
  return db.prepare(`SELECT * FROM economy_effective_sessions WHERE ${where} ORDER BY started_at DESC`).all();
11889
11908
  }
11890
11909
  function queryRangeStats(db, from, to) {
11891
- const r = db.prepare(`SELECT COALESCE(SUM(cost_usd),0) as cost, COUNT(*) as requests,
11892
- COALESCE(SUM(input_tokens+output_tokens+cache_read_tokens+cache_create_tokens),0) as tokens
11893
- FROM economy_effective_requests WHERE DATE(timestamp) BETWEEN ? AND ?`).get(from, to);
11910
+ const bounds = comparisonDateBounds(from, to);
11911
+ const groups = db.prepare(`
11912
+ SELECT cost_basis, model, CASE WHEN cost_usd = 0 THEN 1 WHEN cost_usd < 0 THEN 2 ELSE 0 END AS zero_cost,
11913
+ SUM(cost_usd) AS cost_usd, COUNT(*) AS requests,
11914
+ COALESCE(SUM(input_tokens),0) AS input_tokens, COALESCE(SUM(output_tokens),0) AS output_tokens,
11915
+ COALESCE(SUM(cache_read_tokens),0) AS cache_read_tokens, COALESCE(SUM(cache_create_tokens),0) AS cache_create_tokens,
11916
+ COALESCE(SUM(cache_create_1h_tokens),0) AS cache_create_1h_tokens
11917
+ FROM economy_effective_requests WHERE DATE(timestamp) BETWEEN ? AND ?
11918
+ GROUP BY cost_basis, model, CASE WHEN cost_usd = 0 THEN 1 WHEN cost_usd < 0 THEN 2 ELSE 0 END
11919
+ `).all(from, to);
11920
+ const requestSessions = db.prepare("SELECT COUNT(DISTINCT session_id) AS sessions FROM economy_effective_requests WHERE DATE(timestamp) BETWEEN ? AND ?").get(from, to);
11921
+ const money = buildCostSummary("all", bounds, groups, { sessions: 0, requests: 0, tokens: 0, cost_usd: 0 }, requestSessions.sessions, listModelPricing(db));
11894
11922
  const s = db.prepare(`SELECT COUNT(*) as sessions FROM economy_effective_sessions WHERE DATE(started_at) BETWEEN ? AND ?`).get(from, to);
11895
- return { cost: r.cost, requests: r.requests, tokens: r.tokens, sessions: s.sessions };
11923
+ return { cost: money.total_usd, money, requests: money.request_rows, tokens: money.tokens, sessions: s.sessions };
11896
11924
  }
11897
11925
  function queryForecast(db, now = new Date) {
11898
11926
  const month = resolveReportingInterval({ kind: "calendar", period: "month" }, now);
@@ -12394,7 +12422,13 @@ function createDataHandler(db, actorId) {
12394
12422
  const to = url.searchParams.get("to")?.trim();
12395
12423
  if (!from || !to)
12396
12424
  return err("from and to are required (YYYY-MM-DD)");
12397
- return ok(queryRangeStats(db, from, to));
12425
+ try {
12426
+ return ok(queryRangeStats(db, from, to));
12427
+ } catch (error) {
12428
+ if (error instanceof RangeError)
12429
+ return err(error.message);
12430
+ throw error;
12431
+ }
12398
12432
  }
12399
12433
  if (path === "/api/forecast" && method === "GET") {
12400
12434
  return ok(queryForecast(db));
@@ -1 +1 @@
1
- {"version":3,"file":"service-operations.d.ts","sourceRoot":"","sources":["../../src/server/service-operations.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAuCxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAgkB5E,gHAAgH;AAChH,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,CAe/G"}
1
+ {"version":3,"file":"service-operations.d.ts","sourceRoot":"","sources":["../../src/server/service-operations.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAuCxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAokB5E,gHAAgH;AAChH,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,CAe/G"}
@@ -7264,6 +7264,25 @@ function buildBrief(db, opts = {}) {
7264
7264
  };
7265
7265
  }
7266
7266
 
7267
+ // src/lib/analytics.ts
7268
+ init_database();
7269
+ init_summary_contract();
7270
+
7271
+ // src/lib/comparison-contract.ts
7272
+ init_summary_contract();
7273
+ function comparisonDateBounds(from, to) {
7274
+ const valid = (value) => /^\d{4}-\d{2}-\d{2}$/.test(value) && Number.isFinite(Date.parse(value + "T00:00:00Z")) && new Date(value + "T00:00:00Z").toISOString().slice(0, 10) === value;
7275
+ if (!valid(from) || !valid(to) || from > to) {
7276
+ throw new RangeError("from and to must be real YYYY-MM-DD UTC dates with from <= to");
7277
+ }
7278
+ const end = new Date(to + "T00:00:00Z");
7279
+ end.setUTCDate(end.getUTCDate() + 1);
7280
+ const exclusive = end.toISOString().slice(0, 10);
7281
+ if (!valid(exclusive))
7282
+ throw new RangeError("to exceeds the supported UTC date range");
7283
+ return { time_zone: "UTC", start_date: from, end_date_exclusive: exclusive };
7284
+ }
7285
+
7267
7286
  // src/lib/analytics.ts
7268
7287
  function queryProjectDetail(db, nameOrPath, now = new Date) {
7269
7288
  const dailyBounds = resolveReportingInterval({ kind: "rolling", unit: "day", count: 14 }, now);
@@ -7313,11 +7332,20 @@ function queryExportRows(db, type, period) {
7313
7332
  return db.prepare(`SELECT * FROM economy_effective_sessions WHERE ${where} ORDER BY started_at DESC`).all();
7314
7333
  }
7315
7334
  function queryRangeStats(db, from, to) {
7316
- const r = db.prepare(`SELECT COALESCE(SUM(cost_usd),0) as cost, COUNT(*) as requests,
7317
- COALESCE(SUM(input_tokens+output_tokens+cache_read_tokens+cache_create_tokens),0) as tokens
7318
- FROM economy_effective_requests WHERE DATE(timestamp) BETWEEN ? AND ?`).get(from, to);
7335
+ const bounds = comparisonDateBounds(from, to);
7336
+ const groups = db.prepare(`
7337
+ SELECT cost_basis, model, CASE WHEN cost_usd = 0 THEN 1 WHEN cost_usd < 0 THEN 2 ELSE 0 END AS zero_cost,
7338
+ SUM(cost_usd) AS cost_usd, COUNT(*) AS requests,
7339
+ COALESCE(SUM(input_tokens),0) AS input_tokens, COALESCE(SUM(output_tokens),0) AS output_tokens,
7340
+ COALESCE(SUM(cache_read_tokens),0) AS cache_read_tokens, COALESCE(SUM(cache_create_tokens),0) AS cache_create_tokens,
7341
+ COALESCE(SUM(cache_create_1h_tokens),0) AS cache_create_1h_tokens
7342
+ FROM economy_effective_requests WHERE DATE(timestamp) BETWEEN ? AND ?
7343
+ GROUP BY cost_basis, model, CASE WHEN cost_usd = 0 THEN 1 WHEN cost_usd < 0 THEN 2 ELSE 0 END
7344
+ `).all(from, to);
7345
+ const requestSessions = db.prepare("SELECT COUNT(DISTINCT session_id) AS sessions FROM economy_effective_requests WHERE DATE(timestamp) BETWEEN ? AND ?").get(from, to);
7346
+ const money = buildCostSummary("all", bounds, groups, { sessions: 0, requests: 0, tokens: 0, cost_usd: 0 }, requestSessions.sessions, listModelPricing(db));
7319
7347
  const s = db.prepare(`SELECT COUNT(*) as sessions FROM economy_effective_sessions WHERE DATE(started_at) BETWEEN ? AND ?`).get(from, to);
7320
- return { cost: r.cost, requests: r.requests, tokens: r.tokens, sessions: s.sessions };
7348
+ return { cost: money.total_usd, money, requests: money.request_rows, tokens: money.tokens, sessions: s.sessions };
7321
7349
  }
7322
7350
  function queryForecast(db, now = new Date) {
7323
7351
  const month = resolveReportingInterval({ kind: "calendar", period: "month" }, now);
@@ -7426,7 +7454,7 @@ import { randomUUID } from "crypto";
7426
7454
  // package.json
7427
7455
  var package_default = {
7428
7456
  name: "@hasna/economy",
7429
- version: "0.5.7",
7457
+ version: "0.5.9",
7430
7458
  description: "AI coding cost tracker \u2014 CLI + MCP server + REST API for Claude Code, Codex, OpenCode, Cursor, Pi, and Hermes, with legacy Gemini CLI session and Gemini API billing ingestion",
7431
7459
  repository: {
7432
7460
  type: "git",
@@ -7945,7 +7973,13 @@ function createDataHandler(db, actorId) {
7945
7973
  const to = url.searchParams.get("to")?.trim();
7946
7974
  if (!from || !to)
7947
7975
  return err("from and to are required (YYYY-MM-DD)");
7948
- return ok(queryRangeStats(db, from, to));
7976
+ try {
7977
+ return ok(queryRangeStats(db, from, to));
7978
+ } catch (error) {
7979
+ if (error instanceof RangeError)
7980
+ return err(error.message);
7981
+ throw error;
7982
+ }
7949
7983
  }
7950
7984
  if (path === "/api/forecast" && method === "GET") {
7951
7985
  return ok(queryForecast(db));
@@ -0,0 +1,30 @@
1
+ # Historical comparison coverage
2
+
3
+ The comparison endpoint returns request/token counts and session counts as before.
4
+ Its numeric `cost` field is a **known usage value subtotal**, following the same
5
+ contract as the summary report's `total_usd`. It is not a billed or paid amount.
6
+
7
+ `money` carries the full monetary evidence:
8
+
9
+ - `complete_total_usd` is null for incomplete or empty selected request data.
10
+ - Recorded metered amounts, estimated usage value and subscription-included
11
+ value are separate subtotals.
12
+ - Unknown billing basis and unavailable pricing remain explicit counts.
13
+ - `source_coverage: "not_established"` makes clear that completeness of the
14
+ selected stored records does not establish complete provider collection.
15
+ - UTC bounds identify the selected inclusive date range through an exclusive
16
+ ending date.
17
+
18
+ The CLI displays usage value as unavailable when the complete total is null,
19
+ alongside the known subtotal and coverage. It calculates a monetary percentage
20
+ only when both selected sets are complete and the baseline is nonzero.
21
+ Genuinely recorded free usage can be complete zero; no records cannot.
22
+
23
+ The hosted SDK refuses older responses without coverage and responses for a
24
+ different date range. Deploy the service support before relying on a new
25
+ comparison client. No stored original amount or billing classification is
26
+ rewritten by this read-only reporting correction.
27
+
28
+ Comparison usage values cover request rows. Lifetime-only session amounts are
29
+ not allocated to dates by this endpoint. Session counts retain the existing
30
+ started-within-range definition.
@@ -35,7 +35,11 @@ closed. No operator input can relabel an uncertain intent as rejected.
35
35
 
36
36
  A bounded sweep starts at 64 commands, 48 MiB, or insufficient next-command
37
37
  headroom. It retires at most 32 pairs or approximately 1 MiB per pass; a single
38
- large pair is handled individually. Each pass has a 30-second network deadline.
38
+ large pair is handled individually. A sweep admits new transactions for up to
39
+ 30 seconds; each admitted transaction has its own 30-second deadline for all
40
+ three captures. The last transaction may finish after admission closes, so this
41
+ phase can take up to 60 seconds. Prerequisite recovery and authority checks have
42
+ their own bounds.
39
43
  The active journal remains bounded; Trash's recoverable remote retention and
40
44
  unfinished transfer staging are governed by Trash's own policy.
41
45
 
package/native/README.md CHANGED
@@ -149,3 +149,51 @@ fixture checks. Owner-facing screen captures go through Designs.
149
149
  Apple references: [MenuBarExtra](https://developer.apple.com/documentation/swiftui/menubarextra),
150
150
  [native design adoption](https://developer.apple.com/videos/play/wwdc2025/323/),
151
151
  [application delegate adaptor](https://developer.apple.com/documentation/swiftui/nsapplicationdelegateadaptor).
152
+
153
+ ## Vault-backed Mac release signing
154
+
155
+ When the exact approved Developer ID certificate is not in the login Keychain,
156
+ `Tools/prepare-signing.py` prepares a fresh private release Keychain. It does not
157
+ unlock the login Keychain, sign the application, submit it to Apple or install it.
158
+ Use the supported Secrets consumer to project these inputs directly to this
159
+ process: `ECONOMY_SIGNING_CERTIFICATE_B64` (DER certificate),
160
+ `ECONOMY_SIGNING_PRIVATE_KEY` (PEM), `ECONOMY_NOTARY_PRIVATE_KEY` (PEM),
161
+ `ECONOMY_NOTARY_KEY_ID` and `ECONOMY_NOTARY_ISSUER`. Resolve the approved
162
+ references and existing Apple team before execution. Never put their values in
163
+ arguments, output or repository files.
164
+
165
+ Run `python3 Tools/prepare-signing.py --output FRESH_SCRATCH_PATH --certificate EXACT_SHA1`.
166
+ The output must be a new directory under the session Scratchpad. The helper
167
+ imports credentials in memory, verifies the exact certificate, preserves the
168
+ existing ordered search-list entries and default Keychain, and binds access to codesign. Its
169
+ random password enters Apple's non-echoing prompt through its own terminal,
170
+ never the command arguments. Apple's notarytool requires a regular key file and
171
+ refuses stdin and FIFOs. The consumer writes that one input exclusively at mode
172
+ 0600 inside its fresh mode 0700 directory and passes only its path. It stores the
173
+ profile in the encrypted Keychain; credential-consumer output is suppressed.
174
+ The receipt explicitly names the sensitive input awaiting recoverable cleanup.
175
+ If macOS registers the new Keychain, that owned addition is retained and reported
176
+ in the receipt. The helper never replaces the shared search list; concurrent
177
+ additions are retained. An explicit Keychain path also works without registration.
178
+
179
+ Pass the resulting absolute Keychain path with `--keychain` to the existing
180
+ `release.py sign-mac`, `submit-mac` and `check-mac` stages. Their separate
181
+ signature, exact artifact, submission and acceptance checks still apply.
182
+ Omitting the option retains the existing login-Keychain route. Preparation is
183
+ not signing or notarization proof.
184
+
185
+ Keep the preparation receipt and any failed artifact. Do not replay an uncertain
186
+ submission. On failure, timeout, Ctrl-C, HUP or TERM, preparation settles its own
187
+ child, locks the owned Keychain and inspects the original entries and default.
188
+ An incomplete lock or inspection is explicitly recovery-unverified. SIGKILL,
189
+ power loss and a killed parent cannot guarantee cleanup; inspect the retained
190
+ artifact before retrying. After confirmed profile storage, preserve/read back
191
+ the private input and remove that exact owned file through Trash; report pending
192
+ cleanup on failure and retain its restricted permissions. Never treat preparation
193
+ as complete release acceptance while sensitive cleanup remains. After the release,
194
+ lock the exact release Keychain,
195
+ preserve and read back its encrypted bytes through Trash, then retire only its
196
+ owned registration through the supported Keychain operation. Verify other
197
+ entries and the default remain; never replace the complete list during cleanup.
198
+ The Keychain has a 15-minute idle lock; an expired lock requires a fresh
199
+ preparation, not a password copied into a command or a login-Keychain change.
@@ -50,7 +50,12 @@ def owner_terminal():
50
50
  parent, executable = int(fields[0]), fields[1]
51
51
  if executable == '/System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal':
52
52
  return True
53
- if Path(executable).name not in ['Python', 'python3', 'bash', 'zsh', 'login', 'bun', 'secrets']:
53
+ process_name = Path(executable).name
54
+ # macOS Terminal reports login shells with a leading hyphen in comm.
55
+ # Normalize only the shell names already allowed by this boundary.
56
+ if process_name in ['-bash', '-zsh']:
57
+ process_name = process_name[1:]
58
+ if process_name not in ['Python', 'python3', 'bash', 'zsh', 'login', 'bun', 'secrets']:
54
59
  return False
55
60
  if parent <= 1 or parent == pid:
56
61
  return False
@@ -116,8 +116,11 @@ func ownerTerminal(environment: [String: String], tty: Bool, parent: Int32,
116
116
  for _ in 0..<12 {
117
117
  guard let (next, executable) = lookup(pid) else { return false }
118
118
  if executable == "/System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal" { return true }
119
+ var processName = URL(fileURLWithPath: executable).lastPathComponent
120
+ // Match the Python launcher: macOS prefixes login-shell names with '-'.
121
+ if ["-bash", "-zsh"].contains(processName) { processName.removeFirst() }
119
122
  guard ["Python", "python3", "bash", "zsh", "login", "bun", "secrets", "swift", "swift-frontend"]
120
- .contains(URL(fileURLWithPath: executable).lastPathComponent), next > 1, next != pid else { return false }
123
+ .contains(processName), next > 1, next != pid else { return false }
121
124
  pid = next
122
125
  }
123
126
  return false
@@ -142,6 +145,21 @@ func parentProcess(_ pid: Int32) -> (Int32, String)? {
142
145
 
143
146
  func selfTest() {
144
147
  let terminal = "/System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal"
148
+ for shell in ["-zsh", "-/bin/zsh", "-bash"] {
149
+ guard ownerTerminal(environment: [:], tty: true, parent: 100, lookup: { pid in
150
+ switch pid {
151
+ case 100: (200, "/usr/bin/python3")
152
+ case 200: (300, shell)
153
+ case 300: (400, "login")
154
+ default: (1, terminal)
155
+ }
156
+ }) else { fail("pair-qr self-test: FAIL (owner login shell)", 1) }
157
+ }
158
+ for harness in ["-codex", "-claude", "-opencode"] {
159
+ guard !ownerTerminal(environment: [:], tty: true, parent: 100, lookup: { pid in
160
+ pid == 100 ? (200, harness) : (1, terminal)
161
+ }) else { fail("pair-qr self-test: FAIL (captured login process)", 1) }
162
+ }
145
163
  guard !ownerTerminal(environment: [:], tty: true, parent: 100, lookup: { _ in (200, "/runtime/codex") }),
146
164
  !ownerTerminal(environment: [:], tty: false, parent: 100, lookup: { _ in (200, terminal) }),
147
165
  !ownerTerminal(environment: ["CODEX_THREAD_ID": "fixture"], tty: true, parent: 100, lookup: { _ in (200, terminal) }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/economy",
3
- "version": "0.5.7",
3
+ "version": "0.5.9",
4
4
  "description": "AI coding cost tracker — CLI + MCP server + REST API for Claude Code, Codex, OpenCode, Cursor, Pi, and Hermes, with legacy Gemini CLI session and Gemini API billing ingestion",
5
5
  "repository": {
6
6
  "type": "git",