@hasna/economy 0.2.43 → 0.3.1
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/dashboard/README.md +73 -0
- package/dist/cli/commands/brief.d.ts +4 -69
- package/dist/cli/commands/brief.d.ts.map +1 -1
- package/dist/cli/commands/extras.d.ts.map +1 -1
- package/dist/cli/commands/tui.d.ts +21 -5
- package/dist/cli/commands/tui.d.ts.map +1 -1
- package/dist/cli/commands/watch.d.ts.map +1 -1
- package/dist/cli/index.js +8227 -6395
- package/dist/db/database.d.ts +18 -0
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/pg-migrations.d.ts.map +1 -1
- package/dist/index.d.ts +1 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1855 -1613
- package/dist/lib/analytics.d.ts +68 -0
- package/dist/lib/analytics.d.ts.map +1 -0
- package/dist/lib/brief.d.ts +72 -0
- package/dist/lib/brief.d.ts.map +1 -0
- package/dist/lib/cloud-storage.d.ts +48 -0
- package/dist/lib/cloud-storage.d.ts.map +1 -0
- package/dist/lib/contracts-client/index.d.ts +3 -0
- package/dist/lib/contracts-client/index.d.ts.map +1 -0
- package/dist/lib/contracts-client/mode.d.ts +20 -0
- package/dist/lib/contracts-client/mode.d.ts.map +1 -0
- package/dist/lib/contracts-client/storage.d.ts +83 -0
- package/dist/lib/contracts-client/storage.d.ts.map +1 -0
- package/dist/lib/contracts-client/transport.d.ts +148 -0
- package/dist/lib/contracts-client/transport.d.ts.map +1 -0
- package/dist/lib/pricing.d.ts +3 -0
- package/dist/lib/pricing.d.ts.map +1 -1
- package/dist/lib/store/index.d.ts +283 -0
- package/dist/lib/store/index.d.ts.map +1 -0
- package/dist/lib/sync-all.d.ts +0 -2
- package/dist/lib/sync-all.d.ts.map +1 -1
- package/dist/mcp/http.d.ts.map +1 -1
- package/dist/mcp/index.js +1934 -536
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/openapi.d.ts.map +1 -1
- package/dist/otel/index.js +21 -267
- package/dist/server/index.js +2794 -331
- package/dist/server/serve.d.ts.map +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +4 -2
- package/dashboard/dist/assets/charts-BtCbslx4.js +0 -36
- package/dashboard/dist/assets/index-BDmtt3RI.css +0 -1
- package/dashboard/dist/assets/index-BFwRLqg7.js +0 -6
- package/dashboard/dist/assets/vendor-Cz8jb743.js +0 -53
- package/dashboard/dist/index.html +0 -16
- package/dashboard/dist/logo.jpg +0 -0
- package/dashboard/dist/vite.svg +0 -1
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,QAAQ,YAAY,CAAA;AACjC,eAAO,MAAM,qBAAqB,OAAO,CAAA;AAEzC,wBAAgB,WAAW,IAAI,GAAG,CA8oBjC"}
|
package/dist/openapi.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAwjD/C,CAAA;AACD,eAAe,WAAW,CAAA"}
|
package/dist/otel/index.js
CHANGED
|
@@ -15,14 +15,15 @@ var __export = (target, all) => {
|
|
|
15
15
|
});
|
|
16
16
|
};
|
|
17
17
|
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
18
|
-
var __require = import.meta.require;
|
|
19
18
|
|
|
20
19
|
// src/lib/pricing.ts
|
|
21
20
|
var exports_pricing = {};
|
|
22
21
|
__export(exports_pricing, {
|
|
23
22
|
normalizeModelName: () => normalizeModelName,
|
|
23
|
+
getPricingFromRows: () => getPricingFromRows,
|
|
24
24
|
getPricingFromDb: () => getPricingFromDb,
|
|
25
25
|
getPricing: () => getPricing,
|
|
26
|
+
estimateCostFromRows: () => estimateCostFromRows,
|
|
26
27
|
ensurePricingSeeded: () => ensurePricingSeeded,
|
|
27
28
|
computeCostFromDb: () => computeCostFromDb,
|
|
28
29
|
computeCost: () => computeCost,
|
|
@@ -213,6 +214,25 @@ function computeCostFromDb(db, model, inputTokens, outputTokens, cacheReadTokens
|
|
|
213
214
|
return 0;
|
|
214
215
|
return computeCostWithPricing(model, pricing, inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens, cacheWrite1hTokens, cacheStorageTokenHours);
|
|
215
216
|
}
|
|
217
|
+
function getPricingFromRows(rows, model) {
|
|
218
|
+
if (isFreeModel(model))
|
|
219
|
+
return FREE_PRICING;
|
|
220
|
+
for (const key of modelLookupKeys(model)) {
|
|
221
|
+
const row = rows.find((r) => r.model === key);
|
|
222
|
+
if (row)
|
|
223
|
+
return modelPricingFromDbRow(row);
|
|
224
|
+
}
|
|
225
|
+
const match = bestModelMatch(model, rows.map((r) => [r.model, r]));
|
|
226
|
+
if (!match)
|
|
227
|
+
return null;
|
|
228
|
+
return modelPricingFromDbRow(match);
|
|
229
|
+
}
|
|
230
|
+
function estimateCostFromRows(rows, model, inputTokens, outputTokens, cacheReadTokens = 0, cacheWriteTokens = 0, cacheWrite1hTokens = 0, cacheStorageTokenHours = 0) {
|
|
231
|
+
const pricing = getPricingFromRows(rows, model) ?? getPricing(model);
|
|
232
|
+
if (!pricing)
|
|
233
|
+
return 0;
|
|
234
|
+
return computeCostWithPricing(model, pricing, inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens, cacheWrite1hTokens, cacheStorageTokenHours);
|
|
235
|
+
}
|
|
216
236
|
function computeCostWithPricing(model, pricing, inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens, cacheWrite1hTokens, cacheStorageTokenHours) {
|
|
217
237
|
if (isFreeModel(model))
|
|
218
238
|
return 0;
|
|
@@ -931,194 +951,6 @@ function seedModelPricing(db, defaults) {
|
|
|
931
951
|
}
|
|
932
952
|
var init_database = () => {};
|
|
933
953
|
|
|
934
|
-
// src/db/pg-migrations.ts
|
|
935
|
-
var exports_pg_migrations = {};
|
|
936
|
-
__export(exports_pg_migrations, {
|
|
937
|
-
PG_MIGRATIONS: () => PG_MIGRATIONS
|
|
938
|
-
});
|
|
939
|
-
var PG_MIGRATIONS;
|
|
940
|
-
var init_pg_migrations = __esm(() => {
|
|
941
|
-
PG_MIGRATIONS = [
|
|
942
|
-
`CREATE TABLE IF NOT EXISTS requests (
|
|
943
|
-
id TEXT PRIMARY KEY,
|
|
944
|
-
agent TEXT NOT NULL,
|
|
945
|
-
session_id TEXT NOT NULL,
|
|
946
|
-
model TEXT NOT NULL,
|
|
947
|
-
input_tokens INTEGER DEFAULT 0,
|
|
948
|
-
output_tokens INTEGER DEFAULT 0,
|
|
949
|
-
cache_read_tokens INTEGER DEFAULT 0,
|
|
950
|
-
cache_create_tokens INTEGER DEFAULT 0,
|
|
951
|
-
cache_create_5m_tokens INTEGER DEFAULT 0,
|
|
952
|
-
cache_create_1h_tokens INTEGER DEFAULT 0,
|
|
953
|
-
cost_usd REAL NOT NULL DEFAULT 0,
|
|
954
|
-
duration_ms INTEGER DEFAULT 0,
|
|
955
|
-
timestamp TEXT NOT NULL,
|
|
956
|
-
source_request_id TEXT,
|
|
957
|
-
machine_id TEXT DEFAULT '',
|
|
958
|
-
account_key TEXT DEFAULT '',
|
|
959
|
-
account_tool TEXT DEFAULT '',
|
|
960
|
-
account_name TEXT DEFAULT '',
|
|
961
|
-
account_email TEXT DEFAULT '',
|
|
962
|
-
account_source TEXT DEFAULT ''
|
|
963
|
-
)`,
|
|
964
|
-
`CREATE TABLE IF NOT EXISTS sessions (
|
|
965
|
-
id TEXT PRIMARY KEY,
|
|
966
|
-
agent TEXT NOT NULL,
|
|
967
|
-
project_path TEXT DEFAULT '',
|
|
968
|
-
project_name TEXT DEFAULT '',
|
|
969
|
-
started_at TEXT NOT NULL,
|
|
970
|
-
ended_at TEXT,
|
|
971
|
-
total_cost_usd REAL DEFAULT 0,
|
|
972
|
-
total_tokens INTEGER DEFAULT 0,
|
|
973
|
-
request_count INTEGER DEFAULT 0,
|
|
974
|
-
machine_id TEXT DEFAULT '',
|
|
975
|
-
account_key TEXT DEFAULT '',
|
|
976
|
-
account_tool TEXT DEFAULT '',
|
|
977
|
-
account_name TEXT DEFAULT '',
|
|
978
|
-
account_email TEXT DEFAULT '',
|
|
979
|
-
account_source TEXT DEFAULT ''
|
|
980
|
-
)`,
|
|
981
|
-
`CREATE TABLE IF NOT EXISTS projects (
|
|
982
|
-
id TEXT PRIMARY KEY,
|
|
983
|
-
path TEXT UNIQUE NOT NULL,
|
|
984
|
-
name TEXT NOT NULL,
|
|
985
|
-
description TEXT,
|
|
986
|
-
tags TEXT DEFAULT '[]',
|
|
987
|
-
created_at TEXT NOT NULL
|
|
988
|
-
)`,
|
|
989
|
-
`CREATE TABLE IF NOT EXISTS budgets (
|
|
990
|
-
id TEXT PRIMARY KEY,
|
|
991
|
-
project_path TEXT,
|
|
992
|
-
agent TEXT,
|
|
993
|
-
period TEXT NOT NULL,
|
|
994
|
-
limit_usd REAL NOT NULL,
|
|
995
|
-
alert_at_percent INTEGER DEFAULT 80,
|
|
996
|
-
created_at TEXT NOT NULL,
|
|
997
|
-
updated_at TEXT NOT NULL
|
|
998
|
-
)`,
|
|
999
|
-
`CREATE TABLE IF NOT EXISTS goals (
|
|
1000
|
-
id TEXT PRIMARY KEY,
|
|
1001
|
-
period TEXT NOT NULL,
|
|
1002
|
-
project_path TEXT,
|
|
1003
|
-
agent TEXT,
|
|
1004
|
-
limit_usd REAL NOT NULL,
|
|
1005
|
-
created_at TEXT NOT NULL,
|
|
1006
|
-
updated_at TEXT NOT NULL
|
|
1007
|
-
)`,
|
|
1008
|
-
`CREATE TABLE IF NOT EXISTS ingest_state (
|
|
1009
|
-
source TEXT NOT NULL,
|
|
1010
|
-
key TEXT NOT NULL,
|
|
1011
|
-
value TEXT NOT NULL,
|
|
1012
|
-
PRIMARY KEY (source, key)
|
|
1013
|
-
)`,
|
|
1014
|
-
`CREATE INDEX IF NOT EXISTS idx_requests_session ON requests(session_id)`,
|
|
1015
|
-
`CREATE INDEX IF NOT EXISTS idx_requests_timestamp ON requests(timestamp)`,
|
|
1016
|
-
`CREATE INDEX IF NOT EXISTS idx_requests_agent ON requests(agent)`,
|
|
1017
|
-
`CREATE INDEX IF NOT EXISTS idx_requests_machine ON requests(machine_id)`,
|
|
1018
|
-
`CREATE INDEX IF NOT EXISTS idx_sessions_agent ON sessions(agent)`,
|
|
1019
|
-
`CREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project_path)`,
|
|
1020
|
-
`CREATE INDEX IF NOT EXISTS idx_sessions_started ON sessions(started_at)`,
|
|
1021
|
-
`CREATE INDEX IF NOT EXISTS idx_sessions_machine ON sessions(machine_id)`,
|
|
1022
|
-
`CREATE TABLE IF NOT EXISTS model_pricing (
|
|
1023
|
-
model TEXT PRIMARY KEY,
|
|
1024
|
-
input_per_1m REAL NOT NULL DEFAULT 0,
|
|
1025
|
-
output_per_1m REAL NOT NULL DEFAULT 0,
|
|
1026
|
-
cache_read_per_1m REAL NOT NULL DEFAULT 0,
|
|
1027
|
-
cache_write_per_1m REAL NOT NULL DEFAULT 0,
|
|
1028
|
-
cache_write_1h_per_1m REAL NOT NULL DEFAULT 0,
|
|
1029
|
-
cache_storage_per_1m_hour REAL NOT NULL DEFAULT 0,
|
|
1030
|
-
updated_at TEXT NOT NULL
|
|
1031
|
-
)`,
|
|
1032
|
-
`ALTER TABLE requests ADD COLUMN IF NOT EXISTS cache_create_5m_tokens INTEGER DEFAULT 0`,
|
|
1033
|
-
`ALTER TABLE requests ADD COLUMN IF NOT EXISTS cache_create_1h_tokens INTEGER DEFAULT 0`,
|
|
1034
|
-
`ALTER TABLE model_pricing ADD COLUMN IF NOT EXISTS cache_write_1h_per_1m REAL NOT NULL DEFAULT 0`,
|
|
1035
|
-
`ALTER TABLE model_pricing ADD COLUMN IF NOT EXISTS cache_storage_per_1m_hour REAL NOT NULL DEFAULT 0`,
|
|
1036
|
-
`CREATE TABLE IF NOT EXISTS feedback (
|
|
1037
|
-
id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,
|
|
1038
|
-
message TEXT NOT NULL,
|
|
1039
|
-
email TEXT,
|
|
1040
|
-
category TEXT DEFAULT 'general',
|
|
1041
|
-
version TEXT,
|
|
1042
|
-
machine_id TEXT,
|
|
1043
|
-
created_at TEXT NOT NULL DEFAULT NOW()::text
|
|
1044
|
-
)`,
|
|
1045
|
-
`CREATE TABLE IF NOT EXISTS billing_daily (
|
|
1046
|
-
date TEXT NOT NULL,
|
|
1047
|
-
provider TEXT NOT NULL,
|
|
1048
|
-
description TEXT DEFAULT '',
|
|
1049
|
-
cost_usd REAL NOT NULL DEFAULT 0,
|
|
1050
|
-
updated_at TEXT NOT NULL,
|
|
1051
|
-
PRIMARY KEY (date, provider, description)
|
|
1052
|
-
)`,
|
|
1053
|
-
`CREATE INDEX IF NOT EXISTS idx_billing_date ON billing_daily(date)`,
|
|
1054
|
-
`CREATE INDEX IF NOT EXISTS idx_billing_provider ON billing_daily(provider)`,
|
|
1055
|
-
`CREATE TABLE IF NOT EXISTS subscriptions (
|
|
1056
|
-
id TEXT PRIMARY KEY,
|
|
1057
|
-
agent TEXT,
|
|
1058
|
-
provider TEXT NOT NULL,
|
|
1059
|
-
plan TEXT NOT NULL,
|
|
1060
|
-
monthly_fee_usd REAL NOT NULL DEFAULT 0,
|
|
1061
|
-
included_usage_usd REAL NOT NULL DEFAULT 0,
|
|
1062
|
-
billing_cycle_start TEXT,
|
|
1063
|
-
reset_policy TEXT DEFAULT 'monthly',
|
|
1064
|
-
active INTEGER NOT NULL DEFAULT 1,
|
|
1065
|
-
created_at TEXT NOT NULL,
|
|
1066
|
-
updated_at TEXT NOT NULL
|
|
1067
|
-
)`,
|
|
1068
|
-
`CREATE TABLE IF NOT EXISTS usage_snapshots (
|
|
1069
|
-
id TEXT PRIMARY KEY,
|
|
1070
|
-
agent TEXT NOT NULL,
|
|
1071
|
-
date TEXT NOT NULL,
|
|
1072
|
-
metric TEXT NOT NULL,
|
|
1073
|
-
value REAL NOT NULL DEFAULT 0,
|
|
1074
|
-
unit TEXT DEFAULT '',
|
|
1075
|
-
machine_id TEXT DEFAULT '',
|
|
1076
|
-
updated_at TEXT NOT NULL
|
|
1077
|
-
)`,
|
|
1078
|
-
`CREATE TABLE IF NOT EXISTS savings_daily (
|
|
1079
|
-
date TEXT NOT NULL,
|
|
1080
|
-
agent TEXT DEFAULT '',
|
|
1081
|
-
api_equivalent_usd REAL NOT NULL DEFAULT 0,
|
|
1082
|
-
subscription_fee_usd REAL NOT NULL DEFAULT 0,
|
|
1083
|
-
included_consumed_usd REAL NOT NULL DEFAULT 0,
|
|
1084
|
-
on_demand_usd REAL NOT NULL DEFAULT 0,
|
|
1085
|
-
saved_usd REAL NOT NULL DEFAULT 0,
|
|
1086
|
-
updated_at TEXT NOT NULL,
|
|
1087
|
-
PRIMARY KEY (date, agent)
|
|
1088
|
-
)`,
|
|
1089
|
-
`CREATE TABLE IF NOT EXISTS machines (
|
|
1090
|
-
machine_id TEXT PRIMARY KEY,
|
|
1091
|
-
hostname TEXT NOT NULL,
|
|
1092
|
-
last_seen_at TEXT,
|
|
1093
|
-
last_push_at TEXT,
|
|
1094
|
-
last_pull_at TEXT,
|
|
1095
|
-
economy_version TEXT,
|
|
1096
|
-
updated_at TEXT NOT NULL
|
|
1097
|
-
)`,
|
|
1098
|
-
`ALTER TABLE requests ADD COLUMN IF NOT EXISTS cost_basis TEXT DEFAULT 'estimated'`,
|
|
1099
|
-
`ALTER TABLE requests ADD COLUMN IF NOT EXISTS attribution_tag TEXT DEFAULT ''`,
|
|
1100
|
-
`ALTER TABLE requests ADD COLUMN IF NOT EXISTS account_key TEXT DEFAULT ''`,
|
|
1101
|
-
`ALTER TABLE requests ADD COLUMN IF NOT EXISTS account_tool TEXT DEFAULT ''`,
|
|
1102
|
-
`ALTER TABLE requests ADD COLUMN IF NOT EXISTS account_name TEXT DEFAULT ''`,
|
|
1103
|
-
`ALTER TABLE requests ADD COLUMN IF NOT EXISTS account_email TEXT DEFAULT ''`,
|
|
1104
|
-
`ALTER TABLE requests ADD COLUMN IF NOT EXISTS account_source TEXT DEFAULT ''`,
|
|
1105
|
-
`ALTER TABLE requests ADD COLUMN IF NOT EXISTS updated_at TEXT DEFAULT ''`,
|
|
1106
|
-
`ALTER TABLE requests ADD COLUMN IF NOT EXISTS synced_at TEXT DEFAULT ''`,
|
|
1107
|
-
`ALTER TABLE sessions ADD COLUMN IF NOT EXISTS attribution_tag TEXT DEFAULT ''`,
|
|
1108
|
-
`ALTER TABLE sessions ADD COLUMN IF NOT EXISTS account_key TEXT DEFAULT ''`,
|
|
1109
|
-
`ALTER TABLE sessions ADD COLUMN IF NOT EXISTS account_tool TEXT DEFAULT ''`,
|
|
1110
|
-
`ALTER TABLE sessions ADD COLUMN IF NOT EXISTS account_name TEXT DEFAULT ''`,
|
|
1111
|
-
`ALTER TABLE sessions ADD COLUMN IF NOT EXISTS account_email TEXT DEFAULT ''`,
|
|
1112
|
-
`ALTER TABLE sessions ADD COLUMN IF NOT EXISTS account_source TEXT DEFAULT ''`,
|
|
1113
|
-
`ALTER TABLE sessions ADD COLUMN IF NOT EXISTS updated_at TEXT DEFAULT ''`,
|
|
1114
|
-
`ALTER TABLE sessions ADD COLUMN IF NOT EXISTS synced_at TEXT DEFAULT ''`,
|
|
1115
|
-
`CREATE INDEX IF NOT EXISTS idx_usage_agent_date ON usage_snapshots(agent, date)`,
|
|
1116
|
-
`CREATE INDEX IF NOT EXISTS idx_savings_date ON savings_daily(date)`,
|
|
1117
|
-
`CREATE INDEX IF NOT EXISTS idx_requests_account ON requests(account_key)`,
|
|
1118
|
-
`CREATE INDEX IF NOT EXISTS idx_sessions_account ON sessions(account_key)`
|
|
1119
|
-
];
|
|
1120
|
-
});
|
|
1121
|
-
|
|
1122
954
|
// src/otel/index.ts
|
|
1123
955
|
init_database();
|
|
1124
956
|
|
|
@@ -1327,9 +1159,6 @@ async function ingestOtelRows(db, rows) {
|
|
|
1327
1159
|
return { requests, sessions: sessions.size };
|
|
1328
1160
|
}
|
|
1329
1161
|
|
|
1330
|
-
// src/lib/cloud-sync.ts
|
|
1331
|
-
init_database();
|
|
1332
|
-
|
|
1333
1162
|
// src/lib/package-metadata.ts
|
|
1334
1163
|
import { readFileSync } from "fs";
|
|
1335
1164
|
var cachedMetadata = null;
|
|
@@ -1346,80 +1175,6 @@ function getPackageMetadata() {
|
|
|
1346
1175
|
}
|
|
1347
1176
|
var packageMetadata = getPackageMetadata();
|
|
1348
1177
|
|
|
1349
|
-
// src/lib/cloud-sync.ts
|
|
1350
|
-
var CLOUD_TABLES = [
|
|
1351
|
-
"requests",
|
|
1352
|
-
"sessions",
|
|
1353
|
-
"projects",
|
|
1354
|
-
"budgets",
|
|
1355
|
-
"goals",
|
|
1356
|
-
"model_pricing",
|
|
1357
|
-
"billing_daily",
|
|
1358
|
-
"subscriptions",
|
|
1359
|
-
"usage_snapshots",
|
|
1360
|
-
"savings_daily",
|
|
1361
|
-
"machines",
|
|
1362
|
-
"ingest_state"
|
|
1363
|
-
];
|
|
1364
|
-
function getCloudDatabaseUrl() {
|
|
1365
|
-
return process.env["ECONOMY_CLOUD_DATABASE_URL"] ?? process.env["HASNA_ECONOMY_CLOUD_DATABASE_URL"] ?? null;
|
|
1366
|
-
}
|
|
1367
|
-
function isCloudAutoEnabled() {
|
|
1368
|
-
return process.env["ECONOMY_CLOUD_AUTO"] === "1" || process.env["ECONOMY_CLOUD_AUTO"] === "true";
|
|
1369
|
-
}
|
|
1370
|
-
async function getCloudPg() {
|
|
1371
|
-
const url = getCloudDatabaseUrl();
|
|
1372
|
-
if (!url) {
|
|
1373
|
-
throw new Error("Missing ECONOMY_CLOUD_DATABASE_URL (or HASNA_ECONOMY_CLOUD_DATABASE_URL)");
|
|
1374
|
-
}
|
|
1375
|
-
const { PgAdapterAsync } = await import("@hasna/cloud");
|
|
1376
|
-
return new PgAdapterAsync(url);
|
|
1377
|
-
}
|
|
1378
|
-
async function runCloudMigrations(cloud) {
|
|
1379
|
-
const { PG_MIGRATIONS: PG_MIGRATIONS2 } = await Promise.resolve().then(() => (init_pg_migrations(), exports_pg_migrations));
|
|
1380
|
-
for (const sql of PG_MIGRATIONS2) {
|
|
1381
|
-
await cloud.run(sql);
|
|
1382
|
-
}
|
|
1383
|
-
}
|
|
1384
|
-
async function cloudPush(opts) {
|
|
1385
|
-
const { syncPush, SqliteAdapter } = await import("@hasna/cloud");
|
|
1386
|
-
const cloud = await getCloudPg();
|
|
1387
|
-
const local = new SqliteAdapter(getDbPath());
|
|
1388
|
-
await runCloudMigrations(cloud);
|
|
1389
|
-
const tables = opts?.tables ?? [...CLOUD_TABLES];
|
|
1390
|
-
const results = await syncPush(local, cloud, { tables, conflictColumn: "updated_at" });
|
|
1391
|
-
const rows = results.reduce((s, r) => s + r.rowsWritten, 0);
|
|
1392
|
-
touchMachineRegistry(local, "push");
|
|
1393
|
-
local.close();
|
|
1394
|
-
await cloud.close();
|
|
1395
|
-
return { rows, machine: getMachineId() };
|
|
1396
|
-
}
|
|
1397
|
-
async function maybePushAfterIngest() {
|
|
1398
|
-
if (!isCloudAutoEnabled() || !getCloudDatabaseUrl())
|
|
1399
|
-
return false;
|
|
1400
|
-
try {
|
|
1401
|
-
await cloudPush();
|
|
1402
|
-
return true;
|
|
1403
|
-
} catch {
|
|
1404
|
-
return false;
|
|
1405
|
-
}
|
|
1406
|
-
}
|
|
1407
|
-
function touchMachineRegistry(db, direction) {
|
|
1408
|
-
const now = new Date().toISOString();
|
|
1409
|
-
const machine = getMachineId();
|
|
1410
|
-
db.prepare(`
|
|
1411
|
-
INSERT INTO machines (machine_id, hostname, last_seen_at, last_push_at, last_pull_at, economy_version, updated_at)
|
|
1412
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
1413
|
-
ON CONFLICT(machine_id) DO UPDATE SET
|
|
1414
|
-
hostname = excluded.hostname,
|
|
1415
|
-
last_seen_at = excluded.last_seen_at,
|
|
1416
|
-
last_push_at = CASE WHEN ? = 'push' THEN excluded.last_push_at ELSE machines.last_push_at END,
|
|
1417
|
-
last_pull_at = CASE WHEN ? = 'pull' THEN excluded.last_pull_at ELSE machines.last_pull_at END,
|
|
1418
|
-
economy_version = excluded.economy_version,
|
|
1419
|
-
updated_at = excluded.updated_at
|
|
1420
|
-
`).run(machine, machine, now, direction === "push" ? now : null, direction === "pull" ? now : null, packageMetadata.version, now, direction, direction);
|
|
1421
|
-
}
|
|
1422
|
-
|
|
1423
1178
|
// src/otel/index.ts
|
|
1424
1179
|
function resolvePort(argv) {
|
|
1425
1180
|
for (let i = 0;i < argv.length; i++) {
|
|
@@ -1468,7 +1223,6 @@ var server = Bun.serve({
|
|
|
1468
1223
|
return Response.json({ ingested: 0, message: "no matching metrics" });
|
|
1469
1224
|
}
|
|
1470
1225
|
const result = await ingestOtelRows(db, rows);
|
|
1471
|
-
await maybePushAfterIngest();
|
|
1472
1226
|
return Response.json({ ingested: result.requests, sessions: result.sessions });
|
|
1473
1227
|
}
|
|
1474
1228
|
});
|