@hasna/economy 0.5.1 → 0.5.3
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/CHANGELOG.md +12 -0
- package/dist/chunks/{billing-bkpxy4kv.js → billing-22az60hy.js} +2 -2
- package/dist/chunks/{config-j9mv3ehk.js → config-hsp7ndhj.js} +2 -2
- package/dist/chunks/{index-d480p2wh.js → index-1vz1arz5.js} +14 -13
- package/dist/chunks/{index-hesxq90g.js → index-9wa1f2kv.js} +1 -1
- package/dist/chunks/{index-49f12css.js → index-bn04v378.js} +2 -2
- package/dist/chunks/{index-zpvea08j.js → index-c7h2rxx1.js} +38 -12
- package/dist/chunks/{index-k540hfww.js → index-dk5rq1rq.js} +1 -1
- package/dist/chunks/{index-ez9thsr7.js → index-f5jv6q5q.js} +38 -12
- package/dist/chunks/{index-r1jv3kpy.js → index-mhrkwvtk.js} +3 -3
- package/dist/chunks/{index-xsah93s2.js → index-s9mvven6.js} +2 -2
- package/dist/chunks/{index-2hwzmfgv.js → index-vajzfzgv.js} +38 -12
- package/dist/chunks/{open-projects-6z4pq6mx.js → open-projects-8qm46m3d.js} +1 -1
- package/dist/chunks/{pricing-vf2pycmh.js → pricing-462f8xkm.js} +1 -1
- package/dist/chunks/{pricing-f80p81gr.js → pricing-k9wsjwbz.js} +1 -1
- package/dist/chunks/{pricing-y21mcjsa.js → pricing-vxejj1qa.js} +1 -1
- package/dist/chunks/{serve-2knem98x.js → serve-8yqe7nhs.js} +44 -11
- package/dist/chunks/{sqlite-store-501f32ts.js → sqlite-store-13nhr1z0.js} +2 -2
- package/dist/chunks/{sqlite-store-st99garx.js → sqlite-store-gamn65xp.js} +2 -2
- package/dist/chunks/{sqlite-store-fq4natnf.js → sqlite-store-ht6frztj.js} +2 -2
- package/dist/chunks/{tui-khmnkat2.js → tui-fe94bvp9.js} +4 -4
- package/dist/chunks/{watch-4y064yys.js → watch-ct8dvrpr.js} +5 -5
- package/dist/chunks/{webhooks-k4fh2t9c.js → webhooks-nw4daw9y.js} +20 -9
- package/dist/cli/index.js +27 -27
- package/dist/db/database.d.ts +2 -2
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/legacy-large-schema.d.ts +6 -0
- package/dist/db/legacy-large-schema.d.ts.map +1 -0
- package/dist/db/pg-migrations.d.ts.map +1 -1
- package/dist/db/sync-pg.d.ts.map +1 -1
- package/dist/index.js +15 -14
- package/dist/lib/analytics.d.ts +1 -1
- package/dist/lib/analytics.d.ts.map +1 -1
- package/dist/lib/periods.d.ts +20 -1
- package/dist/lib/periods.d.ts.map +1 -1
- package/dist/lib/spikes.d.ts +3 -3
- package/dist/lib/spikes.d.ts.map +1 -1
- package/dist/mcp/index.js +18 -17
- package/dist/otel/index.js +1 -1
- package/dist/server/index.js +213 -74
- package/dist/server/legacy-limits.d.ts +51 -0
- package/dist/server/legacy-limits.d.ts.map +1 -0
- package/dist/server/legacy-operations.d.ts +2 -1
- package/dist/server/legacy-operations.d.ts.map +1 -1
- package/dist/server/legacy-plan.d.ts +2 -1
- package/dist/server/legacy-plan.d.ts.map +1 -1
- package/dist/server/legacy-preservation.d.ts +2 -1
- package/dist/server/legacy-preservation.d.ts.map +1 -1
- package/dist/server/service-operations.d.ts.map +1 -1
- package/dist/server/service-worker.js +78 -33
- package/docs/historical-data-reconciliation.md +38 -0
- package/package.json +1 -1
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
} from "./index-w3bvv0ns.js";
|
|
6
6
|
import {
|
|
7
7
|
syncAll
|
|
8
|
-
} from "./index-
|
|
8
|
+
} from "./index-s9mvven6.js";
|
|
9
9
|
import {
|
|
10
10
|
buildBrief,
|
|
11
11
|
packageMetadata,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
queryProjectDetail,
|
|
17
17
|
queryRangeStats,
|
|
18
18
|
querySavingsSummary
|
|
19
|
-
} from "./index-
|
|
19
|
+
} from "./index-1vz1arz5.js";
|
|
20
20
|
import {
|
|
21
21
|
AGENTS,
|
|
22
22
|
INGEST_SCHEMA_SQL,
|
|
@@ -59,6 +59,7 @@ import {
|
|
|
59
59
|
queryTopSessions,
|
|
60
60
|
queryUsageSnapshots,
|
|
61
61
|
reconcileIngestReceipt,
|
|
62
|
+
resolveReportingInterval,
|
|
62
63
|
subscriptionId,
|
|
63
64
|
upsertBudget,
|
|
64
65
|
upsertGoal,
|
|
@@ -66,7 +67,7 @@ import {
|
|
|
66
67
|
upsertProject,
|
|
67
68
|
upsertSubscription,
|
|
68
69
|
usageSnapshotFilterForPeriod
|
|
69
|
-
} from "./index-
|
|
70
|
+
} from "./index-f5jv6q5q.js";
|
|
70
71
|
import {
|
|
71
72
|
__require
|
|
72
73
|
} from "./index-p35cyhc4.js";
|
|
@@ -133,15 +134,16 @@ function translateSqliteDates(sql) {
|
|
|
133
134
|
s = s.replace(/DATE\('now',\s*(\$\d+)\s*\|\|\s*' days'\)/gi, (_m, p) => isoDate(`now() + ((${p}) || ' days')::interval`));
|
|
134
135
|
s = s.replace(/DATETIME\('now',\s*(\$\d+)\)/gi, (_m, p) => `(now() + (${p})::interval)`);
|
|
135
136
|
s = s.replace(/DATETIME\('now',\s*'([^']+)'\)/gi, (_m, lit) => `(now() + interval '${lit}')`);
|
|
137
|
+
s = s.replace(/STRFTIME\('%Y-%m-%dT%H:%M:%fZ',\s*([A-Za-z_][A-Za-z0-9_]*)\)/gi, (_m, col) => `to_char(CAST("${col}" AS timestamptz) AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"')`);
|
|
136
138
|
const strftimeMap = { "%H": "HH24", "%Y": "YYYY", "%m": "MM", "%d": "DD", "%M": "MI", "%S": "SS" };
|
|
137
139
|
s = s.replace(/STRFTIME\('([^']+)',\s*([A-Za-z_][A-Za-z0-9_]*)\)/gi, (_m, fmt, col) => {
|
|
138
140
|
const pgFmt = Object.entries(strftimeMap).reduce((acc, [k, v]) => acc.split(k).join(v), fmt);
|
|
139
|
-
return `to_char(CAST("${col}" AS timestamptz), '${pgFmt}')`;
|
|
141
|
+
return `to_char(CAST("${col}" AS timestamptz) AT TIME ZONE 'UTC', '${pgFmt}')`;
|
|
140
142
|
});
|
|
141
143
|
s = s.replace(/\bDATE\('now'\)/gi, isoDate("now()"));
|
|
142
144
|
s = s.replace(/\bDATETIME\('now'\)/gi, "now()");
|
|
143
145
|
s = s.replace(/\bDATETIME\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)/gi, (_m, col) => `CAST("${col}" AS timestamptz)`);
|
|
144
|
-
s = s.replace(/\bDATE\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)/gi, (_m, col) => `substr("${
|
|
146
|
+
s = s.replace(/\bDATE\(\s*([A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)?)\s*\)/gi, (_m, col) => `substr(${col.split(".").map((part) => `"${part}"`).join(".")}, 1, 10)`);
|
|
145
147
|
return s;
|
|
146
148
|
}
|
|
147
149
|
function resolveWorkerPath() {
|
|
@@ -348,6 +350,30 @@ function resolvePgConnection(dsn) {
|
|
|
348
350
|
}
|
|
349
351
|
}
|
|
350
352
|
|
|
353
|
+
// src/db/legacy-large-schema.ts
|
|
354
|
+
var LEGACY_LARGE_SESSION_PG_SQL = `
|
|
355
|
+
CREATE INDEX idx_legacy_targets_session_operation
|
|
356
|
+
ON legacy_reconciliation_targets(session_id,operation_key);
|
|
357
|
+
CREATE OR REPLACE FUNCTION economy_legacy_target_guard() RETURNS trigger LANGUAGE plpgsql AS $body$
|
|
358
|
+
BEGIN
|
|
359
|
+
IF EXISTS(
|
|
360
|
+
SELECT 1 FROM (SELECT DISTINCT session_id,operation_key FROM inserted_legacy_targets) n
|
|
361
|
+
JOIN economy_legacy_active a ON a.session_id=n.session_id AND a.operation_key<>n.operation_key
|
|
362
|
+
) OR EXISTS(
|
|
363
|
+
SELECT 1 FROM inserted_legacy_targets n
|
|
364
|
+
JOIN economy_legacy_active a ON a.request_id=n.request_id AND a.operation_key<>n.operation_key
|
|
365
|
+
) THEN
|
|
366
|
+
RAISE EXCEPTION 'legacy reconciliation is already active for this session' USING ERRCODE='23000';
|
|
367
|
+
END IF;
|
|
368
|
+
RETURN NULL;
|
|
369
|
+
END
|
|
370
|
+
$body$;
|
|
371
|
+
DROP TRIGGER legacy_target_no_overlap ON legacy_reconciliation_targets;
|
|
372
|
+
CREATE TRIGGER legacy_target_no_overlap AFTER INSERT ON legacy_reconciliation_targets
|
|
373
|
+
REFERENCING NEW TABLE AS inserted_legacy_targets
|
|
374
|
+
FOR EACH STATEMENT EXECUTE FUNCTION economy_legacy_target_guard();
|
|
375
|
+
`;
|
|
376
|
+
|
|
351
377
|
// src/db/pg-migrations.ts
|
|
352
378
|
var PG_MIGRATIONS = [
|
|
353
379
|
`CREATE TABLE IF NOT EXISTS cost_centers (
|
|
@@ -579,7 +605,8 @@ var PG_MIGRATIONS = [
|
|
|
579
605
|
...OBSERVATION_PG_MIGRATIONS,
|
|
580
606
|
`ALTER TABLE budgets ADD COLUMN IF NOT EXISTS metric TEXT NOT NULL DEFAULT 'legacy_request_cost_usd'
|
|
581
607
|
CHECK (metric IN ('legacy_request_cost_usd', 'metered_api_usd'))`,
|
|
582
|
-
LEGACY_PG_SQL
|
|
608
|
+
LEGACY_PG_SQL,
|
|
609
|
+
LEGACY_LARGE_SESSION_PG_SQL
|
|
583
610
|
];
|
|
584
611
|
|
|
585
612
|
// src/db/cloud.ts
|
|
@@ -3811,7 +3838,13 @@ function createDataHandler(db, actorId) {
|
|
|
3811
3838
|
if (path === "/api/daily" && method === "GET") {
|
|
3812
3839
|
const days = Number(url.searchParams.get("days") ?? 30);
|
|
3813
3840
|
const machine = url.searchParams.get("machine") ?? undefined;
|
|
3814
|
-
|
|
3841
|
+
const now = new Date;
|
|
3842
|
+
try {
|
|
3843
|
+
resolveReportingInterval({ kind: "rolling", unit: "day", count: days }, now);
|
|
3844
|
+
} catch {
|
|
3845
|
+
return err("days must be a positive integer within the supported UTC date range");
|
|
3846
|
+
}
|
|
3847
|
+
return ok(queryDailyBreakdown(db, days, machine, now));
|
|
3815
3848
|
}
|
|
3816
3849
|
if (path === "/api/hourly" && method === "GET") {
|
|
3817
3850
|
const machine = url.searchParams.get("machine") ?? undefined;
|
|
@@ -3877,7 +3910,7 @@ function createDataHandler(db, actorId) {
|
|
|
3877
3910
|
if (providers.some((provider) => !allowedProviders.has(provider)))
|
|
3878
3911
|
return err("invalid billing provider");
|
|
3879
3912
|
const results = {};
|
|
3880
|
-
const { syncAnthropicBilling, syncOpenAIBilling, syncGeminiBilling } = await import("./billing-
|
|
3913
|
+
const { syncAnthropicBilling, syncOpenAIBilling, syncGeminiBilling } = await import("./billing-22az60hy.js");
|
|
3881
3914
|
async function capture(provider, fn) {
|
|
3882
3915
|
try {
|
|
3883
3916
|
results[provider] = await fn();
|
|
@@ -4032,7 +4065,7 @@ function createDataHandler(db, actorId) {
|
|
|
4032
4065
|
const results = {};
|
|
4033
4066
|
if (sources === "all") {
|
|
4034
4067
|
try {
|
|
4035
|
-
const { syncOpenProjectsRegistry } = await import("./open-projects-
|
|
4068
|
+
const { syncOpenProjectsRegistry } = await import("./open-projects-8qm46m3d.js");
|
|
4036
4069
|
results["projects"] = await syncOpenProjectsRegistry(db);
|
|
4037
4070
|
} catch {}
|
|
4038
4071
|
}
|
|
@@ -4040,7 +4073,7 @@ function createDataHandler(db, actorId) {
|
|
|
4040
4073
|
const syncResult = await syncAll(db, selected);
|
|
4041
4074
|
Object.assign(results, syncResult);
|
|
4042
4075
|
try {
|
|
4043
|
-
const { checkAndFireWebhooks } = await import("./webhooks-
|
|
4076
|
+
const { checkAndFireWebhooks } = await import("./webhooks-nw4daw9y.js");
|
|
4044
4077
|
await checkAndFireWebhooks(db);
|
|
4045
4078
|
} catch {}
|
|
4046
4079
|
return ok(results);
|
|
@@ -4064,7 +4097,7 @@ function createDataHandler(db, actorId) {
|
|
|
4064
4097
|
return err("invalid JSON body");
|
|
4065
4098
|
const result = bulkIngest(db, body, { actorId });
|
|
4066
4099
|
try {
|
|
4067
|
-
const { checkAndFireWebhooks } = await import("./webhooks-
|
|
4100
|
+
const { checkAndFireWebhooks } = await import("./webhooks-nw4daw9y.js");
|
|
4068
4101
|
if (body["budget_mode"] !== "create")
|
|
4069
4102
|
await checkAndFireWebhooks(db);
|
|
4070
4103
|
} catch {}
|
|
@@ -69,7 +69,7 @@ import {
|
|
|
69
69
|
upsertSession,
|
|
70
70
|
upsertSubscription,
|
|
71
71
|
upsertUsageSnapshot
|
|
72
|
-
} from "./index-
|
|
72
|
+
} from "./index-f5jv6q5q.js";
|
|
73
73
|
import {
|
|
74
74
|
__require
|
|
75
75
|
} from "./index-p35cyhc4.js";
|
|
@@ -180,7 +180,7 @@ function openDatabase(dbPath, skipSeed = false) {
|
|
|
180
180
|
}
|
|
181
181
|
}, `opening ${path}`);
|
|
182
182
|
if (!skipSeed) {
|
|
183
|
-
import("./pricing-
|
|
183
|
+
import("./pricing-462f8xkm.js").then(({ ensurePricingSeeded }) => ensurePricingSeeded(db)).catch(() => {});
|
|
184
184
|
}
|
|
185
185
|
return db;
|
|
186
186
|
}
|
|
@@ -69,7 +69,7 @@ import {
|
|
|
69
69
|
upsertSession,
|
|
70
70
|
upsertSubscription,
|
|
71
71
|
upsertUsageSnapshot
|
|
72
|
-
} from "./index-
|
|
72
|
+
} from "./index-vajzfzgv.js";
|
|
73
73
|
import {
|
|
74
74
|
__require
|
|
75
75
|
} from "./index-p35cyhc4.js";
|
|
@@ -180,7 +180,7 @@ function openDatabase(dbPath, skipSeed = false) {
|
|
|
180
180
|
}
|
|
181
181
|
}, `opening ${path}`);
|
|
182
182
|
if (!skipSeed) {
|
|
183
|
-
import("./pricing-
|
|
183
|
+
import("./pricing-vxejj1qa.js").then(({ ensurePricingSeeded }) => ensurePricingSeeded(db)).catch(() => {});
|
|
184
184
|
}
|
|
185
185
|
return db;
|
|
186
186
|
}
|
|
@@ -70,7 +70,7 @@ import {
|
|
|
70
70
|
upsertSession,
|
|
71
71
|
upsertSubscription,
|
|
72
72
|
upsertUsageSnapshot
|
|
73
|
-
} from "./index-
|
|
73
|
+
} from "./index-c7h2rxx1.js";
|
|
74
74
|
|
|
75
75
|
// src/db/sqlite-adapter.ts
|
|
76
76
|
import { Database } from "bun:sqlite";
|
|
@@ -178,7 +178,7 @@ function openDatabase(dbPath, skipSeed = false) {
|
|
|
178
178
|
}
|
|
179
179
|
}, `opening ${path}`);
|
|
180
180
|
if (!skipSeed) {
|
|
181
|
-
import("./pricing-
|
|
181
|
+
import("./pricing-k9wsjwbz.js").then(({ ensurePricingSeeded }) => ensurePricingSeeded(db)).catch(() => {});
|
|
182
182
|
}
|
|
183
183
|
return db;
|
|
184
184
|
}
|
|
@@ -6,11 +6,11 @@ import {
|
|
|
6
6
|
printStatusLine,
|
|
7
7
|
printWaybarJson,
|
|
8
8
|
runTui
|
|
9
|
-
} from "./index-
|
|
9
|
+
} from "./index-bn04v378.js";
|
|
10
10
|
import"./index-w3bvv0ns.js";
|
|
11
|
-
import"./index-
|
|
12
|
-
import"./index-
|
|
13
|
-
import"./index-
|
|
11
|
+
import"./index-mhrkwvtk.js";
|
|
12
|
+
import"./index-1vz1arz5.js";
|
|
13
|
+
import"./index-f5jv6q5q.js";
|
|
14
14
|
import"./index-p35cyhc4.js";
|
|
15
15
|
export {
|
|
16
16
|
runTui,
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
import {
|
|
3
3
|
agentPaths,
|
|
4
4
|
syncAll
|
|
5
|
-
} from "./index-
|
|
5
|
+
} from "./index-s9mvven6.js";
|
|
6
6
|
import {
|
|
7
7
|
getStore,
|
|
8
8
|
isCloudStore
|
|
9
|
-
} from "./index-
|
|
10
|
-
import"./index-
|
|
9
|
+
} from "./index-mhrkwvtk.js";
|
|
10
|
+
import"./index-1vz1arz5.js";
|
|
11
11
|
import {
|
|
12
12
|
formatSummaryValue
|
|
13
|
-
} from "./index-
|
|
13
|
+
} from "./index-f5jv6q5q.js";
|
|
14
14
|
import {
|
|
15
15
|
__require
|
|
16
16
|
} from "./index-p35cyhc4.js";
|
|
@@ -86,7 +86,7 @@ function agentLabel(agent) {
|
|
|
86
86
|
async function watchCosts(opts) {
|
|
87
87
|
const store = getStore();
|
|
88
88
|
const cloud = isCloudStore();
|
|
89
|
-
const db = cloud ? null : (await import("./sqlite-store-
|
|
89
|
+
const db = cloud ? null : (await import("./sqlite-store-13nhr1z0.js")).openDatabase();
|
|
90
90
|
let lastCheck = new Date(Date.now() - opts.interval * 1000).toISOString();
|
|
91
91
|
const lines = [];
|
|
92
92
|
const MAX_LINES = 20;
|
|
@@ -1,24 +1,34 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
3
|
loadConfig
|
|
4
|
-
} from "./index-
|
|
4
|
+
} from "./index-9wa1f2kv.js";
|
|
5
5
|
import {
|
|
6
6
|
getBudgetStatuses,
|
|
7
7
|
getIngestState,
|
|
8
|
+
resolveReportingInterval,
|
|
8
9
|
setIngestState
|
|
9
|
-
} from "./index-
|
|
10
|
+
} from "./index-f5jv6q5q.js";
|
|
10
11
|
import"./index-p35cyhc4.js";
|
|
11
12
|
|
|
12
13
|
// src/lib/spikes.ts
|
|
13
14
|
function detectCostSpikes(dailyTotals, opts) {
|
|
14
15
|
const windowDays = opts?.windowDays ?? 7;
|
|
15
16
|
const multiplier = opts?.multiplier ?? 2;
|
|
17
|
+
if (!Number.isSafeInteger(windowDays) || windowDays < 1)
|
|
18
|
+
throw new RangeError("Invalid spike window");
|
|
19
|
+
if (!Number.isFinite(multiplier) || multiplier <= 0)
|
|
20
|
+
throw new RangeError("Invalid spike multiplier");
|
|
16
21
|
const sorted = [...dailyTotals].sort((a, b) => a.date.localeCompare(b.date));
|
|
17
22
|
const spikes = [];
|
|
18
23
|
for (let i = windowDays;i < sorted.length; i++) {
|
|
19
24
|
const window = sorted.slice(i - windowDays, i);
|
|
20
|
-
const avg = window.reduce((s, d) => s + d.cost_usd, 0) / window.length;
|
|
21
25
|
const current = sorted[i];
|
|
26
|
+
const previous = new Date(current.date + "T00:00:00.000Z");
|
|
27
|
+
previous.setUTCDate(previous.getUTCDate() - 1);
|
|
28
|
+
const bounds = resolveReportingInterval({ kind: "rolling", unit: "day", count: windowDays }, previous);
|
|
29
|
+
if (window[0].date !== bounds.start || window[window.length - 1].date !== previous.toISOString().slice(0, 10) || new Set(window.map((day) => day.date)).size !== windowDays)
|
|
30
|
+
continue;
|
|
31
|
+
const avg = window.reduce((s, d) => s + d.cost_usd, 0) / window.length;
|
|
22
32
|
if (avg > 0 && current.cost_usd > avg * multiplier) {
|
|
23
33
|
spikes.push({
|
|
24
34
|
date: current.date,
|
|
@@ -30,19 +40,20 @@ function detectCostSpikes(dailyTotals, opts) {
|
|
|
30
40
|
}
|
|
31
41
|
return spikes;
|
|
32
42
|
}
|
|
33
|
-
function queryRecentSpikes(db, days = 14) {
|
|
43
|
+
function queryRecentSpikes(db, days = 14, now = new Date) {
|
|
44
|
+
const bounds = resolveReportingInterval({ kind: "rolling", unit: "day", count: days }, now);
|
|
34
45
|
const rows = db.prepare(`
|
|
35
46
|
SELECT DATE(timestamp) as date, COALESCE(SUM(cost_usd), 0) as cost_usd
|
|
36
47
|
FROM economy_effective_requests
|
|
37
|
-
WHERE timestamp >=
|
|
48
|
+
WHERE timestamp >= ? AND timestamp < ?
|
|
38
49
|
GROUP BY DATE(timestamp)
|
|
39
50
|
ORDER BY date ASC
|
|
40
|
-
`).all(
|
|
51
|
+
`).all(bounds.start, bounds.end_exclusive);
|
|
41
52
|
return detectCostSpikes(rows);
|
|
42
53
|
}
|
|
43
|
-
function getTodaySpike(db) {
|
|
44
|
-
const today =
|
|
45
|
-
const spikes = queryRecentSpikes(db, 14);
|
|
54
|
+
function getTodaySpike(db, now = new Date) {
|
|
55
|
+
const today = resolveReportingInterval({ kind: "calendar", period: "today" }, now).start;
|
|
56
|
+
const spikes = queryRecentSpikes(db, 14, now);
|
|
46
57
|
return spikes.find((s) => s.date === today) ?? null;
|
|
47
58
|
}
|
|
48
59
|
|
package/dist/cli/index.js
CHANGED
|
@@ -4,26 +4,26 @@ import {
|
|
|
4
4
|
syncAnthropicBilling,
|
|
5
5
|
syncGeminiBilling,
|
|
6
6
|
syncOpenAIBilling
|
|
7
|
-
} from "../chunks/index-
|
|
7
|
+
} from "../chunks/index-dk5rq1rq.js";
|
|
8
8
|
import {
|
|
9
9
|
buildStatusLine,
|
|
10
10
|
gatherStatusData
|
|
11
|
-
} from "../chunks/index-
|
|
11
|
+
} from "../chunks/index-bn04v378.js";
|
|
12
12
|
import"../chunks/index-w3bvv0ns.js";
|
|
13
13
|
import {
|
|
14
14
|
agentPaths,
|
|
15
15
|
syncAll
|
|
16
|
-
} from "../chunks/index-
|
|
16
|
+
} from "../chunks/index-s9mvven6.js";
|
|
17
17
|
import {
|
|
18
18
|
getStore,
|
|
19
19
|
isCloudStore
|
|
20
|
-
} from "../chunks/index-
|
|
20
|
+
} from "../chunks/index-mhrkwvtk.js";
|
|
21
21
|
import {
|
|
22
22
|
billingDriftCheck,
|
|
23
23
|
economyCloudStorage,
|
|
24
24
|
economyTransportReport,
|
|
25
25
|
packageMetadata
|
|
26
|
-
} from "../chunks/index-
|
|
26
|
+
} from "../chunks/index-1vz1arz5.js";
|
|
27
27
|
import {
|
|
28
28
|
AGENTS,
|
|
29
29
|
MAX_INGEST_BYTES,
|
|
@@ -46,7 +46,7 @@ import {
|
|
|
46
46
|
setIngestState,
|
|
47
47
|
stableJson,
|
|
48
48
|
validateIngest
|
|
49
|
-
} from "../chunks/index-
|
|
49
|
+
} from "../chunks/index-f5jv6q5q.js";
|
|
50
50
|
import {
|
|
51
51
|
__require
|
|
52
52
|
} from "../chunks/index-p35cyhc4.js";
|
|
@@ -1279,7 +1279,7 @@ function registerExtendedCommands(program) {
|
|
|
1279
1279
|
}
|
|
1280
1280
|
}
|
|
1281
1281
|
if (!cloud) {
|
|
1282
|
-
const { openDatabase } = await import("../chunks/sqlite-store-
|
|
1282
|
+
const { openDatabase } = await import("../chunks/sqlite-store-13nhr1z0.js");
|
|
1283
1283
|
const db = openDatabase();
|
|
1284
1284
|
ensurePricingSeeded(db);
|
|
1285
1285
|
const zeroCostBuckets = queryZeroCostTokenizedModels(db, 5);
|
|
@@ -1357,23 +1357,23 @@ function registerExtendedCommands(program) {
|
|
|
1357
1357
|
console.log();
|
|
1358
1358
|
});
|
|
1359
1359
|
program.command("tui").description("Terminal status dashboard (Linux/SSH friendly)").option("--watch", "Live refresh").option("--interval <seconds>", "Refresh interval", "30").action(async (opts) => {
|
|
1360
|
-
const { runTui } = await import("../chunks/tui-
|
|
1360
|
+
const { runTui } = await import("../chunks/tui-fe94bvp9.js");
|
|
1361
1361
|
await runTui({
|
|
1362
1362
|
watch: Boolean(opts.watch),
|
|
1363
1363
|
interval: Number(opts.interval ?? 30)
|
|
1364
1364
|
});
|
|
1365
1365
|
});
|
|
1366
1366
|
program.command("waybar").description("Print waybar-compatible JSON status line").action(async () => {
|
|
1367
|
-
const { printWaybarJson } = await import("../chunks/tui-
|
|
1367
|
+
const { printWaybarJson } = await import("../chunks/tui-fe94bvp9.js");
|
|
1368
1368
|
await printWaybarJson();
|
|
1369
1369
|
});
|
|
1370
1370
|
const barCmd = program.command("bar").description("Status bar helpers (Linux)");
|
|
1371
1371
|
barCmd.command("tui").description("Alias for economy tui").option("--watch", "Live refresh").action(async (opts) => {
|
|
1372
|
-
const { runTui } = await import("../chunks/tui-
|
|
1372
|
+
const { runTui } = await import("../chunks/tui-fe94bvp9.js");
|
|
1373
1373
|
await runTui({ watch: Boolean(opts.watch) });
|
|
1374
1374
|
});
|
|
1375
1375
|
barCmd.command("waybar").description("Alias for economy waybar").action(async () => {
|
|
1376
|
-
const { printWaybarJson } = await import("../chunks/tui-
|
|
1376
|
+
const { printWaybarJson } = await import("../chunks/tui-fe94bvp9.js");
|
|
1377
1377
|
await printWaybarJson();
|
|
1378
1378
|
});
|
|
1379
1379
|
program.command("estimate").description("Estimate cost for token counts").requiredOption("--model <model>", "Model name").option("--input <n>", "Input tokens", "0").option("--output <n>", "Output tokens", "0").action(async (opts) => {
|
|
@@ -2335,7 +2335,7 @@ function backfillMachineId(db) {
|
|
|
2335
2335
|
return { requests: Number(reqCount.changes), sessions: Number(sessCount.changes) };
|
|
2336
2336
|
}
|
|
2337
2337
|
async function recalculateZeroCostRequests(db) {
|
|
2338
|
-
const { assessCostFromDb } = await import("../chunks/pricing-
|
|
2338
|
+
const { assessCostFromDb } = await import("../chunks/pricing-462f8xkm.js");
|
|
2339
2339
|
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
|
|
2340
2340
|
FROM requests
|
|
2341
2341
|
WHERE cost_usd = 0
|
|
@@ -2544,7 +2544,7 @@ async function postIngest(cloud, body) {
|
|
|
2544
2544
|
}
|
|
2545
2545
|
async function syncAllToCloud(cloud, opts = {}) {
|
|
2546
2546
|
await runIngestJournalOperation(cloud, { action: "reconcile" });
|
|
2547
|
-
const { openDatabase } = await import("../chunks/sqlite-store-
|
|
2547
|
+
const { openDatabase } = await import("../chunks/sqlite-store-13nhr1z0.js");
|
|
2548
2548
|
const scratch = openDatabase(":memory:", true);
|
|
2549
2549
|
ensurePricingSeeded(scratch);
|
|
2550
2550
|
const cachePath = opts.cachePath ?? getIngestCachePath();
|
|
@@ -2571,7 +2571,7 @@ async function syncAllToCloud(cloud, opts = {}) {
|
|
|
2571
2571
|
}
|
|
2572
2572
|
async function billingSyncToCloud(cloud, opts = {}) {
|
|
2573
2573
|
await runIngestJournalOperation(cloud, { action: "reconcile" });
|
|
2574
|
-
const { openDatabase } = await import("../chunks/sqlite-store-
|
|
2574
|
+
const { openDatabase } = await import("../chunks/sqlite-store-13nhr1z0.js");
|
|
2575
2575
|
const scratch = openDatabase(":memory:", true);
|
|
2576
2576
|
try {
|
|
2577
2577
|
const days = opts.days ?? 31;
|
|
@@ -2630,7 +2630,7 @@ function autosyncIntervalMs(env = process.env) {
|
|
|
2630
2630
|
return Math.round(seconds * 1000);
|
|
2631
2631
|
}
|
|
2632
2632
|
async function autosyncMarkerStore(env = process.env) {
|
|
2633
|
-
const { openDatabase } = await import("../chunks/sqlite-store-
|
|
2633
|
+
const { openDatabase } = await import("../chunks/sqlite-store-13nhr1z0.js");
|
|
2634
2634
|
if (isCloudStore(env))
|
|
2635
2635
|
return openDatabase(getIngestCachePath());
|
|
2636
2636
|
return openDatabase();
|
|
@@ -2663,7 +2663,7 @@ async function autoSync(opts = {}) {
|
|
|
2663
2663
|
return;
|
|
2664
2664
|
if (!await autoSyncDue(undefined, process.env))
|
|
2665
2665
|
return;
|
|
2666
|
-
const { openDatabase } = await import("../chunks/sqlite-store-
|
|
2666
|
+
const { openDatabase } = await import("../chunks/sqlite-store-13nhr1z0.js");
|
|
2667
2667
|
const db = openDatabase();
|
|
2668
2668
|
ensurePricingSeeded(db);
|
|
2669
2669
|
await syncAll(db, opts);
|
|
@@ -2931,13 +2931,13 @@ program.command("sync").description("Ingest cost data from all coding agents").o
|
|
|
2931
2931
|
}
|
|
2932
2932
|
return;
|
|
2933
2933
|
}
|
|
2934
|
-
const { openDatabase } = await import("../chunks/sqlite-store-
|
|
2934
|
+
const { openDatabase } = await import("../chunks/sqlite-store-13nhr1z0.js");
|
|
2935
2935
|
const db = openDatabase();
|
|
2936
2936
|
ensurePricingSeeded(db);
|
|
2937
2937
|
const anySpecific = opts.claude || opts.takumi || opts.codex || opts.gemini || opts.opencode || opts.cursor || opts.pi || opts.hermes || opts.loops;
|
|
2938
2938
|
if (!anySpecific || opts.verbose) {
|
|
2939
2939
|
try {
|
|
2940
|
-
const { syncOpenProjectsRegistry } = await import("../chunks/open-projects-
|
|
2940
|
+
const { syncOpenProjectsRegistry } = await import("../chunks/open-projects-8qm46m3d.js");
|
|
2941
2941
|
const p = await syncOpenProjectsRegistry(db);
|
|
2942
2942
|
if (opts.verbose)
|
|
2943
2943
|
console.log(chalk3.dim(`Synced open-projects registry: ${p.imported} imported, ${p.skipped} skipped`));
|
|
@@ -2972,7 +2972,7 @@ program.command("sync").description("Ingest cost data from all coding agents").o
|
|
|
2972
2972
|
console.log(chalk3.cyan(`\u2192 Backfilled machine_id='${machine}': ${r.requests} requests, ${r.sessions} sessions`));
|
|
2973
2973
|
}
|
|
2974
2974
|
if (opts.recalculate) {
|
|
2975
|
-
const { getPricingFromDb: getPricingFromDb2 } = await import("../chunks/pricing-
|
|
2975
|
+
const { getPricingFromDb: getPricingFromDb2 } = await import("../chunks/pricing-462f8xkm.js");
|
|
2976
2976
|
const r = await recalculateZeroCostRequests(db);
|
|
2977
2977
|
console.log(chalk3.cyan(`\u2192 Recalculated: ${r.fixed}/${r.total} zero-cost requests now have pricing`));
|
|
2978
2978
|
const zeroCostBuckets = r.buckets;
|
|
@@ -2987,7 +2987,7 @@ program.command("sync").description("Ingest cost data from all coding agents").o
|
|
|
2987
2987
|
}
|
|
2988
2988
|
}
|
|
2989
2989
|
try {
|
|
2990
|
-
const { checkAndFireWebhooks } = await import("../chunks/webhooks-
|
|
2990
|
+
const { checkAndFireWebhooks } = await import("../chunks/webhooks-nw4daw9y.js");
|
|
2991
2991
|
await checkAndFireWebhooks(db);
|
|
2992
2992
|
} catch {}
|
|
2993
2993
|
for (const line of syncOutcomeLines(result))
|
|
@@ -3198,7 +3198,7 @@ program.command("accounts [period]").description("List account usage by email ad
|
|
|
3198
3198
|
console.log();
|
|
3199
3199
|
});
|
|
3200
3200
|
program.command("watch").description("Live stream of incoming costs").option("--interval <seconds>", "Poll interval in seconds", "10").option("--daemon", "Watch agent data directories and sync on change").option("--agent <agent>", `Filter by agent (${AGENTS.join("|")})`).option("--notify <amount>", "Fire macOS notification when cumulative cost crosses this USD threshold").action(async (opts) => {
|
|
3201
|
-
const { watchCosts } = await import("../chunks/watch-
|
|
3201
|
+
const { watchCosts } = await import("../chunks/watch-ct8dvrpr.js");
|
|
3202
3202
|
await watchCosts({
|
|
3203
3203
|
interval: parsePositiveCliInteger(opts.interval ?? "10", "--interval"),
|
|
3204
3204
|
daemon: Boolean(opts.daemon),
|
|
@@ -3339,16 +3339,16 @@ projectCmd.command("show <nameOrPath>").description("Detailed project breakdown
|
|
|
3339
3339
|
});
|
|
3340
3340
|
var configCmd = program.command("config").description("Manage economy configuration");
|
|
3341
3341
|
configCmd.command("set <key> <value>").description("Set a config value").action(async (_key, _value) => {
|
|
3342
|
-
const { setConfigValue } = await import("../chunks/config-
|
|
3342
|
+
const { setConfigValue } = await import("../chunks/config-hsp7ndhj.js");
|
|
3343
3343
|
setConfigValue(_key, _value);
|
|
3344
3344
|
console.log(chalk3.green(`\u2713 ${_key} = ${_value}`));
|
|
3345
3345
|
});
|
|
3346
3346
|
configCmd.command("get <key>").description("Get a config value").action(async (key) => {
|
|
3347
|
-
const { getConfigValue } = await import("../chunks/config-
|
|
3347
|
+
const { getConfigValue } = await import("../chunks/config-hsp7ndhj.js");
|
|
3348
3348
|
console.log(getConfigValue(key) ?? chalk3.dim("(not set)"));
|
|
3349
3349
|
});
|
|
3350
3350
|
configCmd.command("webhook-test").description("Send a test payload to the configured webhook URL").action(async () => {
|
|
3351
|
-
const { loadConfig } = await import("../chunks/config-
|
|
3351
|
+
const { loadConfig } = await import("../chunks/config-hsp7ndhj.js");
|
|
3352
3352
|
const config = loadConfig();
|
|
3353
3353
|
const url = config["webhook-url"];
|
|
3354
3354
|
if (!url) {
|
|
@@ -3382,7 +3382,7 @@ configCmd.command("webhook-test").description("Send a test payload to the config
|
|
|
3382
3382
|
}
|
|
3383
3383
|
});
|
|
3384
3384
|
configCmd.action(async () => {
|
|
3385
|
-
const { loadConfig } = await import("../chunks/config-
|
|
3385
|
+
const { loadConfig } = await import("../chunks/config-hsp7ndhj.js");
|
|
3386
3386
|
const config = loadConfig();
|
|
3387
3387
|
console.log();
|
|
3388
3388
|
printTable(["Key", "Value"], Object.entries(config).map(([k, v]) => [k, String(v)]));
|
|
@@ -3434,7 +3434,7 @@ pricingCmd.command("remove <model>").description("Remove pricing for a model").a
|
|
|
3434
3434
|
});
|
|
3435
3435
|
program.command("serve").description("Start the REST API server").option("-p, --port <port>", "Port", "3456").action(async (opts) => {
|
|
3436
3436
|
const port = parseCliPort(opts.port ?? "3456", "--port");
|
|
3437
|
-
const { startServer } = await import("../chunks/serve-
|
|
3437
|
+
const { startServer } = await import("../chunks/serve-8yqe7nhs.js");
|
|
3438
3438
|
startServer(port);
|
|
3439
3439
|
});
|
|
3440
3440
|
program.command("mcp").description("Show MCP server install commands").option("--claude", "Install into Claude Code").option("--codex", "Install into Codex").option("--gemini", "Install into Gemini CLI").option("--all", "Install into all agents").action(async (opts) => {
|
|
@@ -3795,7 +3795,7 @@ billingCmd.command("sync").description("Sync actual billing from Anthropic, Open
|
|
|
3795
3795
|
console.log(chalk3.green(`\u2713 pushed ${result.total} billing rows to the shared API`));
|
|
3796
3796
|
return;
|
|
3797
3797
|
}
|
|
3798
|
-
const { openDatabase } = await import("../chunks/sqlite-store-
|
|
3798
|
+
const { openDatabase } = await import("../chunks/sqlite-store-13nhr1z0.js");
|
|
3799
3799
|
const db = openDatabase();
|
|
3800
3800
|
const doAll = !opts.anthropic && !opts.openai && !opts.gemini;
|
|
3801
3801
|
if (opts.anthropic || doAll) {
|
package/dist/db/database.d.ts
CHANGED
|
@@ -77,12 +77,12 @@ export declare function queryProjectBreakdownSince(db: Database, since: string,
|
|
|
77
77
|
export declare function queryAgentBreakdownSince(db: Database, since: string): AgentBreakdown[];
|
|
78
78
|
export declare function queryModelBreakdownSince(db: Database, since: string): ModelBreakdown[];
|
|
79
79
|
export declare function queryAccountBreakdownSince(db: Database, since: string): AccountBreakdown[];
|
|
80
|
-
export declare function queryDailyBreakdown(db: Database, days?: number, machine?: string): Array<{
|
|
80
|
+
export declare function queryDailyBreakdown(db: Database, days?: number, machine?: string, now?: Date): Array<{
|
|
81
81
|
date: string;
|
|
82
82
|
cost_usd: number;
|
|
83
83
|
agent: string;
|
|
84
84
|
}>;
|
|
85
|
-
export declare function queryHourlyBreakdown(db: Database, machine?: string, hours?: number): Array<{
|
|
85
|
+
export declare function queryHourlyBreakdown(db: Database, machine?: string, hours?: number, now?: Date): Array<{
|
|
86
86
|
hour: string;
|
|
87
87
|
cost_usd: number;
|
|
88
88
|
agent: string;
|
|
@@ -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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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Append-only PostgreSQL optimization. Keep the original migration bytes fixed.
|
|
2
|
+
* Check the complete inserted set once: per-row checks can become quadratic
|
|
3
|
+
* with stale or small-table statistics even when suitable indexes exist.
|
|
4
|
+
* Same-operation request duplicates remain prohibited by the primary key. */
|
|
5
|
+
export declare const LEGACY_LARGE_SESSION_PG_SQL = "\nCREATE INDEX idx_legacy_targets_session_operation\n ON legacy_reconciliation_targets(session_id,operation_key);\nCREATE OR REPLACE FUNCTION economy_legacy_target_guard() RETURNS trigger LANGUAGE plpgsql AS $body$\nBEGIN\n IF EXISTS(\n SELECT 1 FROM (SELECT DISTINCT session_id,operation_key FROM inserted_legacy_targets) n\n JOIN economy_legacy_active a ON a.session_id=n.session_id AND a.operation_key<>n.operation_key\n ) OR EXISTS(\n SELECT 1 FROM inserted_legacy_targets n\n JOIN economy_legacy_active a ON a.request_id=n.request_id AND a.operation_key<>n.operation_key\n ) THEN\n RAISE EXCEPTION 'legacy reconciliation is already active for this session' USING ERRCODE='23000';\n END IF;\n RETURN NULL;\nEND\n$body$;\nDROP TRIGGER legacy_target_no_overlap ON legacy_reconciliation_targets;\nCREATE TRIGGER legacy_target_no_overlap AFTER INSERT ON legacy_reconciliation_targets\n REFERENCING NEW TABLE AS inserted_legacy_targets\n FOR EACH STATEMENT EXECUTE FUNCTION economy_legacy_target_guard();\n";
|
|
6
|
+
//# sourceMappingURL=legacy-large-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-large-schema.d.ts","sourceRoot":"","sources":["../../src/db/legacy-large-schema.ts"],"names":[],"mappings":"AAAA;;;6EAG6E;AAC7E,eAAO,MAAM,2BAA2B,ygCAqBvC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg-migrations.d.ts","sourceRoot":"","sources":["../../src/db/pg-migrations.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pg-migrations.d.ts","sourceRoot":"","sources":["../../src/db/pg-migrations.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AAEH,eAAO,MAAM,aAAa,EAAE,MAAM,EAiRjC,CAAC"}
|
package/dist/db/sync-pg.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-pg.d.ts","sourceRoot":"","sources":["../../src/db/sync-pg.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAIlF;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"sync-pg.d.ts","sourceRoot":"","sources":["../../src/db/sync-pg.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAIlF;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAoCxD;AAwBD,MAAM,WAAW,aAAa;IAC5B,qFAAqF;IACrF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,4EAA4E;IAC5E,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAUD,qBAAa,aAAc,YAAW,SAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2C;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IACnE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAQ;IAC7C,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,mBAAmB,CAAW;IACtC,OAAO,CAAC,KAAK,CAAI;IACjB,OAAO,CAAC,MAAM,CAAQ;gBAEV,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB;IAiBpD,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,OAAO;IAkDf,OAAO,CAAC,KAAK;IAGb,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS;IAIjD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO;IAC/C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE;IACjD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IACvB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB;IAQvC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAgC9B,KAAK,IAAI,IAAI;CACd"}
|