@hasna/economy 0.3.10 → 0.3.15

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.
@@ -16,9 +16,7 @@ export declare function getCloudDatabaseUrl(env?: Env): string | undefined;
16
16
  * (CONTRACT.md section 2), so a half-migrated deployment fails loudly at startup
17
17
  * instead of quietly serving the wrong store.
18
18
  *
19
- * The rejection is delegated to the contract package so the migration hint stays
20
- * identical to the one the `server_backend_configuration` conformance gate emits.
21
- * DSN resolution stays local because economy also honours the bare `DATABASE_URL`
19
+ * The rejection stays local because economy also honours the bare `DATABASE_URL`
22
20
  * alias, which the contract's own resolver does not read — deferring to it
23
21
  * wholesale would silently downgrade such a deployment to sqlite.
24
22
  */
@@ -1 +1 @@
1
- {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/db/cloud.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAE5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAK/E,wDAAwD;AACxD,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;AAE7C,8DAA8D;AAC9D,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,GAAiB,GAAG,MAAM,GAAG,SAAS,CAO9E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,GAAE,GAAiB,GAAG,iBAAiB,CAGrF;AAED,gEAAgE;AAChE,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,GAAiB,GAAG,OAAO,CAEjE;AAED,oFAAoF;AACpF,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAOzD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,qBAAwB,GAAG,QAAQ,CASvE;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,GAAG,qBAAwB,GAAG,EAAE,CAAC,IAAI,CAWpE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,eAAe,CAcjE;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED,YAAY,EAAE,SAAS,EAAE,CAAA"}
1
+ {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/db/cloud.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAK/E,wDAAwD;AACxD,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;AAqB7C,8DAA8D;AAC9D,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,GAAiB,GAAG,MAAM,GAAG,SAAS,CAO9E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,GAAE,GAAiB,GAAG,iBAAiB,CAGrF;AAED,gEAAgE;AAChE,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,GAAiB,GAAG,OAAO,CAEjE;AAED,oFAAoF;AACpF,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAOzD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,qBAAwB,GAAG,QAAQ,CASvE;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,GAAG,qBAAwB,GAAG,EAAE,CAAC,IAAI,CAWpE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,eAAe,CAcjE;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED,YAAY,EAAE,SAAS,EAAE,CAAA"}
@@ -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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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * PostgreSQL migrations for open-economy cloud sync.
2
+ * PostgreSQL migrations for economy cloud sync.
3
3
  *
4
4
  * Equivalent to the SQLite schema in database.ts, translated for PostgreSQL.
5
5
  */
package/dist/index.js CHANGED
@@ -2971,442 +2971,15 @@ function queryModelEfficiency(db) {
2971
2971
  FROM requests GROUP BY model ORDER BY cost DESC`).all();
2972
2972
  }
2973
2973
 
2974
- // src/lib/contracts-client/mode.ts
2975
- var DEPRECATED_STORAGE_MODE_ALIASES = ["remote", "hybrid", "self_hosted"];
2976
- function normalizeStorageMode(value) {
2977
- const normalized = value.trim().toLowerCase().replace(/-/g, "_");
2978
- if (normalized === "local")
2979
- return { mode: "local", deprecatedAlias: null };
2980
- if (normalized === "cloud")
2981
- return { mode: "cloud", deprecatedAlias: null };
2982
- if (DEPRECATED_STORAGE_MODE_ALIASES.includes(normalized)) {
2983
- return { mode: "cloud", deprecatedAlias: normalized };
2984
- }
2985
- throw new Error(`Unknown storage mode: ${value}. Use local or cloud.`);
2986
- }
2987
- function envToken(name) {
2988
- return name.toUpperCase().replace(/-/g, "_");
2989
- }
2990
-
2991
- // src/lib/contracts-client/transport.ts
2992
- function defaultCloudBaseUrl(name) {
2993
- return `https://${name}.hasna.xyz`;
2994
- }
2995
- function clientTransportEnvKeys(name) {
2996
- const token = envToken(name);
2997
- return {
2998
- modeKeys: [
2999
- `HASNA_${token}_STORAGE_MODE`,
3000
- `HASNA_${token}_MODE`,
3001
- `${token}_STORAGE_MODE`,
3002
- `${token}_MODE`
3003
- ],
3004
- apiUrlKeys: [`HASNA_${token}_API_URL`, `${token}_API_URL`],
3005
- apiKeyKeys: [`HASNA_${token}_API_KEY`, `${token}_API_KEY`]
3006
- };
3007
- }
3008
- function firstEnv(env, keys) {
3009
- for (const key of keys) {
3010
- const value = env[key]?.trim();
3011
- if (value)
3012
- return { key, value };
3013
- }
3014
- return null;
3015
- }
3016
- function toV1BaseUrl(apiUrl) {
3017
- const url = new URL(apiUrl);
3018
- if (url.protocol !== "http:" && url.protocol !== "https:") {
3019
- throw new Error("API URL must use http or https.");
3020
- }
3021
- let path = url.pathname.replace(/\/+$/, "");
3022
- if (path.endsWith("/v1"))
3023
- path = path.slice(0, -"/v1".length);
3024
- url.pathname = `${path}/v1`;
3025
- url.search = "";
3026
- url.hash = "";
3027
- return url.toString().replace(/\/+$/, "");
3028
- }
3029
- function resolveClientTransport(name, env = process.env) {
3030
- const keys = clientTransportEnvKeys(name);
3031
- const modeHit = firstEnv(env, keys.modeKeys);
3032
- const urlHit = firstEnv(env, keys.apiUrlKeys);
3033
- const keyHit = firstEnv(env, keys.apiKeyKeys);
3034
- let mode = "local";
3035
- let deprecatedAlias = null;
3036
- let modeSource = "default";
3037
- const warnings = [];
3038
- if (modeHit) {
3039
- const normalized = normalizeStorageMode(modeHit.value);
3040
- mode = normalized.mode;
3041
- deprecatedAlias = normalized.deprecatedAlias;
3042
- modeSource = modeHit.key;
3043
- if (deprecatedAlias) {
3044
- warnings.push(`Deprecated mode '${deprecatedAlias}' from ${modeHit.key} is treated as 'cloud'. Prefer ${keys.modeKeys[0]}=cloud.`);
3045
- }
3046
- } else if (urlHit && keyHit) {
3047
- mode = "cloud";
3048
- modeSource = `${urlHit.key}+${keyHit.key}`;
3049
- } else if (urlHit) {
3050
- warnings.push(`${urlHit.key} is set but no API key is present (${keys.apiKeyKeys[0]}). ` + `Refusing to fall back to the local store, which would silently serve a different dataset. ` + `Set ${keys.apiKeyKeys[0]} to enable the cloud client, or set ${keys.modeKeys[0]}=local ` + `to use the local store deliberately.`);
3051
- return {
3052
- transport: "local",
3053
- mode: "local",
3054
- deprecatedAlias,
3055
- modeSource: urlHit.key,
3056
- baseUrl: null,
3057
- apiUrlSource: null,
3058
- apiKeyPresent: false,
3059
- apiKeySource: null,
3060
- misconfigured: true,
3061
- warning: warnings.join(" ")
3062
- };
3063
- }
3064
- if (mode === "local") {
3065
- return {
3066
- transport: "local",
3067
- mode,
3068
- deprecatedAlias,
3069
- modeSource,
3070
- baseUrl: null,
3071
- apiUrlSource: null,
3072
- apiKeyPresent: Boolean(keyHit),
3073
- apiKeySource: keyHit ? keyHit.key : null,
3074
- misconfigured: false,
3075
- warning: warnings.length > 0 ? warnings.join(" ") : null
3076
- };
3077
- }
3078
- if (!keyHit) {
3079
- warnings.push(`${modeSource}=cloud but no API key is set (${keys.apiKeyKeys[0]}). Refusing to route to cloud; using local store. Set ${keys.apiKeyKeys[0]} to enable the cloud client.`);
3080
- return {
3081
- transport: "local",
3082
- mode,
3083
- deprecatedAlias,
3084
- modeSource,
3085
- baseUrl: null,
3086
- apiUrlSource: null,
3087
- apiKeyPresent: false,
3088
- apiKeySource: null,
3089
- misconfigured: true,
3090
- warning: warnings.join(" ")
3091
- };
3092
- }
3093
- const rawUrl = urlHit?.value ?? defaultCloudBaseUrl(name);
3094
- const apiUrlSource = urlHit ? urlHit.key : "default";
3095
- let baseUrl;
3096
- try {
3097
- baseUrl = toV1BaseUrl(rawUrl);
3098
- } catch (error) {
3099
- const message = error instanceof Error ? error.message : String(error);
3100
- warnings.push(`Invalid API URL from ${apiUrlSource}: ${message}. Using local store.`);
3101
- return {
3102
- transport: "local",
3103
- mode,
3104
- deprecatedAlias,
3105
- modeSource,
3106
- baseUrl: null,
3107
- apiUrlSource: null,
3108
- apiKeyPresent: true,
3109
- apiKeySource: keyHit.key,
3110
- misconfigured: true,
3111
- warning: warnings.join(" ")
3112
- };
3113
- }
3114
- return {
3115
- transport: "cloud-http",
3116
- mode,
3117
- deprecatedAlias,
3118
- modeSource,
3119
- baseUrl,
3120
- apiUrlSource,
3121
- apiKeyPresent: true,
3122
- apiKeySource: keyHit.key,
3123
- misconfigured: false,
3124
- warning: warnings.length > 0 ? warnings.join(" ") : null
3125
- };
3126
- }
3127
-
3128
- class HasnaHttpError extends Error {
3129
- status;
3130
- method;
3131
- path;
3132
- body;
3133
- constructor(method, path, status, body) {
3134
- super(`Hasna cloud request failed: ${method} ${path} -> ${status}`);
3135
- this.name = "HasnaHttpError";
3136
- this.status = status;
3137
- this.method = method;
3138
- this.path = path;
3139
- this.body = body;
3140
- }
3141
- }
3142
- var DEFAULT_RETRY_STATUSES = [408, 425, 429, 500, 502, 503, 504];
3143
- var IDEMPOTENT_METHODS = new Set(["GET", "HEAD", "PUT", "DELETE", "OPTIONS"]);
3144
- function appendQuery(path, query) {
3145
- if (!query)
3146
- return path;
3147
- const params = query instanceof URLSearchParams ? query : new URLSearchParams;
3148
- if (!(query instanceof URLSearchParams)) {
3149
- for (const [key, value] of Object.entries(query)) {
3150
- if (value === null || value === undefined)
3151
- continue;
3152
- if (Array.isArray(value)) {
3153
- for (const v of value)
3154
- params.append(key, String(v));
3155
- } else {
3156
- params.append(key, String(value));
3157
- }
3158
- }
3159
- }
3160
- const qs = params.toString();
3161
- if (!qs)
3162
- return path;
3163
- return `${path}${path.includes("?") ? "&" : "?"}${qs}`;
3164
- }
3165
- var defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
3166
- function createHasnaHttpTransport(options) {
3167
- const fetchImpl = options.fetchImpl ?? ((input, init) => fetch(input, init));
3168
- const base = options.baseUrl.replace(/\/+$/, "");
3169
- const timeoutMs = options.timeoutMs ?? 30000;
3170
- const sleep = options.sleepImpl ?? defaultSleep;
3171
- const defaultRetry = options.retry;
3172
- function resolveRetry(callRetry) {
3173
- const chosen = callRetry !== undefined ? callRetry : defaultRetry;
3174
- if (chosen === false)
3175
- return null;
3176
- const r = chosen ?? {};
3177
- return {
3178
- retries: r.retries ?? 2,
3179
- baseDelayMs: r.baseDelayMs ?? 200,
3180
- maxDelayMs: r.maxDelayMs ?? 2000,
3181
- retryStatuses: r.retryStatuses ?? [...DEFAULT_RETRY_STATUSES]
3182
- };
3183
- }
3184
- async function once(method, rel, url, body, opts) {
3185
- const headers = {
3186
- "x-api-key": options.apiKey,
3187
- Authorization: `Bearer ${options.apiKey}`,
3188
- Accept: "application/json",
3189
- ...options.headers ?? {},
3190
- ...opts.headers ?? {}
3191
- };
3192
- if (opts.idempotencyKey)
3193
- headers["Idempotency-Key"] = opts.idempotencyKey;
3194
- const init = { method, headers };
3195
- if (body !== undefined) {
3196
- headers["Content-Type"] = "application/json";
3197
- init.body = JSON.stringify(body);
3198
- }
3199
- const controller = new AbortController;
3200
- const onAbort = () => controller.abort();
3201
- if (opts.signal) {
3202
- if (opts.signal.aborted)
3203
- controller.abort();
3204
- else
3205
- opts.signal.addEventListener("abort", onAbort, { once: true });
3206
- }
3207
- const timer = setTimeout(() => controller.abort(), opts.timeoutMs ?? timeoutMs);
3208
- init.signal = controller.signal;
3209
- let response;
3210
- try {
3211
- response = await fetchImpl(url, init);
3212
- } catch (error) {
3213
- const err = error instanceof Error ? error : new Error(String(error));
3214
- if (opts.signal?.aborted)
3215
- return { ok: false, retryable: false, error: err };
3216
- return { ok: false, retryable: true, error: err };
3217
- } finally {
3218
- clearTimeout(timer);
3219
- if (opts.signal)
3220
- opts.signal.removeEventListener("abort", onAbort);
3221
- }
3222
- const text = await response.text();
3223
- let parsed = undefined;
3224
- if (text.length > 0) {
3225
- try {
3226
- parsed = JSON.parse(text);
3227
- } catch {
3228
- parsed = text;
3229
- }
3230
- }
3231
- if (!response.ok) {
3232
- const retry = resolveRetry(opts.retry);
3233
- const retryable = retry ? retry.retryStatuses.includes(response.status) : false;
3234
- return { ok: false, retryable, error: new HasnaHttpError(method, rel, response.status, parsed) };
3235
- }
3236
- return { ok: true, value: parsed };
3237
- }
3238
- async function request(method, path, body, opts = {}) {
3239
- const upper = method.toUpperCase();
3240
- const rel = appendQuery(path.startsWith("/") ? path : `/${path}`, opts.query);
3241
- const url = `${base}${rel}`;
3242
- const retry = resolveRetry(opts.retry);
3243
- const methodRetryable = IDEMPOTENT_METHODS.has(upper) || Boolean(opts.idempotencyKey);
3244
- const maxAttempts = retry && methodRetryable ? retry.retries + 1 : 1;
3245
- let last = null;
3246
- for (let attempt = 1;attempt <= maxAttempts; attempt++) {
3247
- const result = await once(upper, rel, url, body, opts);
3248
- if (result.ok)
3249
- return result.value;
3250
- last = result;
3251
- const canRetry = retry !== null && methodRetryable && result.retryable && attempt < maxAttempts;
3252
- if (!canRetry)
3253
- break;
3254
- const backoff = Math.min(retry.maxDelayMs, retry.baseDelayMs * 2 ** (attempt - 1));
3255
- const jitter = Math.floor(Math.random() * (backoff / 2 + 1));
3256
- await sleep(backoff + jitter);
3257
- }
3258
- throw last.error;
3259
- }
3260
- return {
3261
- baseUrl: base,
3262
- request,
3263
- get: (path, opts) => request("GET", path, undefined, opts),
3264
- post: (path, body, opts) => request("POST", path, body, opts),
3265
- put: (path, body, opts) => request("PUT", path, body, opts),
3266
- patch: (path, body, opts) => request("PATCH", path, body, opts),
3267
- del: (path, body, opts) => request("DELETE", path, body, opts)
3268
- };
3269
- }
3270
- function createClientTransport(name, env = process.env, overrides) {
3271
- const resolution = resolveClientTransport(name, env);
3272
- if (resolution.misconfigured) {
3273
- throw new Error(resolution.warning ?? `Client for '${name}' is misconfigured for cloud mode.`);
3274
- }
3275
- if (resolution.transport === "local" || !resolution.baseUrl) {
3276
- return { transport: "local", client: null, resolution };
3277
- }
3278
- const keys = clientTransportEnvKeys(name);
3279
- const apiKey = firstEnv(env, keys.apiKeyKeys)?.value;
3280
- if (!apiKey) {
3281
- throw new Error(`Client for '${name}' resolved to cloud-http without an API key.`);
3282
- }
3283
- return {
3284
- transport: "cloud-http",
3285
- client: createHasnaHttpTransport({
3286
- name,
3287
- baseUrl: resolution.baseUrl,
3288
- apiKey,
3289
- ...overrides?.fetchImpl ? { fetchImpl: overrides.fetchImpl } : {},
3290
- ...overrides?.headers ? { headers: overrides.headers } : {},
3291
- ...overrides?.timeoutMs ? { timeoutMs: overrides.timeoutMs } : {},
3292
- ...overrides?.retry !== undefined ? { retry: overrides.retry } : {},
3293
- ...overrides?.sleepImpl ? { sleepImpl: overrides.sleepImpl } : {}
3294
- }),
3295
- resolution
3296
- };
3297
- }
3298
-
3299
2974
  // src/lib/contracts-client/storage.ts
3300
- function resourcePath(resource) {
3301
- const trimmed = resource.replace(/^\/+|\/+$/g, "");
3302
- if (!trimmed)
3303
- throw new Error("resource must be a non-empty path segment");
3304
- return `/${trimmed}`;
3305
- }
3306
- function entityPath(resource, id) {
3307
- if (id === undefined || id === null || `${id}`.length === 0) {
3308
- throw new Error("id must be a non-empty string");
3309
- }
3310
- return `${resourcePath(resource)}/${encodeURIComponent(String(id))}`;
3311
- }
3312
- function newIdempotencyKey() {
3313
- const g = globalThis;
3314
- if (g.crypto?.randomUUID)
3315
- return g.crypto.randomUUID();
3316
- return `idmp_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 12)}`;
3317
- }
3318
- function extractItems(raw) {
3319
- if (Array.isArray(raw))
3320
- return raw;
3321
- if (raw && typeof raw === "object") {
3322
- const obj = raw;
3323
- for (const key of ["items", "data", "results", "rows", "records"]) {
3324
- if (Array.isArray(obj[key]))
3325
- return obj[key];
3326
- }
3327
- }
3328
- return [];
3329
- }
3330
- function extractTotal(raw) {
3331
- if (raw && typeof raw === "object") {
3332
- const obj = raw;
3333
- for (const key of ["total", "count", "totalCount", "total_count"]) {
3334
- if (typeof obj[key] === "number")
3335
- return obj[key];
3336
- }
3337
- }
3338
- return null;
3339
- }
3340
- function extractCursor(raw) {
3341
- if (raw && typeof raw === "object") {
3342
- const obj = raw;
3343
- for (const key of ["cursor", "nextCursor", "next_cursor", "next"]) {
3344
- if (typeof obj[key] === "string")
3345
- return obj[key];
3346
- }
3347
- }
3348
- return null;
3349
- }
3350
- function createHasnaStorageClient(name, transport) {
3351
- return {
3352
- name,
3353
- baseUrl: transport.baseUrl,
3354
- transport,
3355
- async list(resource, options = {}) {
3356
- const raw = await transport.get(resourcePath(resource), options);
3357
- return {
3358
- items: extractItems(raw),
3359
- total: extractTotal(raw),
3360
- cursor: extractCursor(raw),
3361
- raw
3362
- };
3363
- },
3364
- async get(resource, id, options = {}) {
3365
- try {
3366
- return await transport.get(entityPath(resource, id), options);
3367
- } catch (error) {
3368
- if (error instanceof HasnaHttpError && error.status === 404)
3369
- return null;
3370
- throw error;
3371
- }
3372
- },
3373
- async create(resource, body, options = {}) {
3374
- const { idempotencyKey, ...rest } = options;
3375
- return transport.post(resourcePath(resource), body, {
3376
- ...rest,
3377
- idempotencyKey: idempotencyKey ?? newIdempotencyKey()
3378
- });
3379
- },
3380
- async update(resource, id, patch, options = {}) {
3381
- const { method = "PATCH", idempotencyKey, ...rest } = options;
3382
- const call = method === "PUT" ? transport.put : transport.patch;
3383
- return call(entityPath(resource, id), patch, { ...rest, ...idempotencyKey ? { idempotencyKey } : {} });
3384
- },
3385
- async delete(resource, id, options = {}) {
3386
- try {
3387
- await transport.del(entityPath(resource, id), undefined, options);
3388
- } catch (error) {
3389
- if (error instanceof HasnaHttpError && error.status === 404)
3390
- return;
3391
- throw error;
3392
- }
3393
- }
3394
- };
3395
- }
3396
- function resolveStorageClient(name, env = process.env, overrides) {
3397
- const wired = createClientTransport(name, env, overrides);
3398
- if (wired.transport === "cloud-http") {
3399
- return { transport: "cloud-http", client: createHasnaStorageClient(name, wired.client) };
3400
- }
3401
- return { transport: "local", client: null };
3402
- }
2975
+ import { resolveStorageClient } from "@hasna/contracts/client/storage";
3403
2976
 
3404
2977
  // src/lib/cloud-storage.ts
3405
2978
  var ECONOMY_APP = "economy";
3406
2979
  var cache;
3407
2980
  function resolveEconomyCloudStorage(env = process.env, overrides) {
3408
2981
  const resolved = resolveStorageClient(ECONOMY_APP, env, overrides);
3409
- return resolved.transport === "cloud-http" ? { active: true, client: resolved.client } : { active: false, client: null };
2982
+ return resolved.transport === "http" ? { active: true, client: resolved.client } : { active: false, client: null };
3410
2983
  }
3411
2984
  function economyCloudStorage(env = process.env) {
3412
2985
  if (cache === undefined)
@@ -0,0 +1,57 @@
1
+ import type { SyncAllResult } from './sync-all.js';
2
+ import type { ActiveEconomyCloudStorage } from './cloud-storage.js';
3
+ import type { SyncOptions } from '../types/index.js';
4
+ /** Machine-local mtime cache path (override for tests via HASNA_ECONOMY_INGEST_CACHE). */
5
+ export declare function getIngestCachePath(): string;
6
+ export interface CloudSyncOptions extends SyncOptions {
7
+ /** Claude/Takumi JSONL root override (tests). */
8
+ projectsDir?: string;
9
+ /** Ingest-state cache path override (tests). Defaults to getIngestCachePath(). */
10
+ cachePath?: string;
11
+ /** Re-process every file (ignore the mtime cache). */
12
+ force?: boolean;
13
+ /** Tag this run's rows with the current machine id. */
14
+ backfillMachine?: boolean;
15
+ /** Recalculate zero-cost requests from pricing before pushing. */
16
+ recalculate?: boolean;
17
+ }
18
+ export interface CloudSyncResult extends SyncAllResult {
19
+ /** True when at least one row was pushed to the shared API in this run. */
20
+ posted: boolean;
21
+ /** Per-table row counts accepted by /v1/ingest (absent when nothing posted). */
22
+ ingested?: Record<string, number>;
23
+ /** Total rows accepted by /v1/ingest (absent when nothing posted). */
24
+ total?: number;
25
+ }
26
+ /**
27
+ * Cloud-client equivalent of `economy sync`: read this machine's on-box
28
+ * provider files, ingest them through the existing readers, and push the
29
+ * produced rows to the shared API. Returns the same per-source result shape as
30
+ * the local syncAll, plus what the server accepted.
31
+ */
32
+ export declare function syncAllToCloud(cloud: ActiveEconomyCloudStorage, opts?: CloudSyncOptions): Promise<CloudSyncResult>;
33
+ export interface CloudBillingSyncOptions {
34
+ days?: number;
35
+ anthropic?: boolean;
36
+ openai?: boolean;
37
+ gemini?: boolean;
38
+ }
39
+ export interface CloudBillingSyncResult {
40
+ /** Per-provider outcome; a provider failure does not stop the others. */
41
+ providers: Record<string, {
42
+ ok: boolean;
43
+ days?: number;
44
+ totalUsd?: number;
45
+ error?: string;
46
+ }>;
47
+ totalUsd: number;
48
+ posted: boolean;
49
+ ingested?: Record<string, number>;
50
+ total?: number;
51
+ }
52
+ /**
53
+ * Cloud-client equivalent of `economy billing sync`: fetch provider billing
54
+ * from the provider APIs and push the billing_daily rows to the shared API.
55
+ */
56
+ export declare function billingSyncToCloud(cloud: ActiveEconomyCloudStorage, opts?: CloudBillingSyncOptions): Promise<CloudBillingSyncResult>;
57
+ //# sourceMappingURL=cloud-ingest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-ingest.d.ts","sourceRoot":"","sources":["../../src/lib/cloud-ingest.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AAGnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAKpD,0FAA0F;AAC1F,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AA6CD,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sDAAsD;IACtD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,uDAAuD;IACvD,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,kEAAkE;IAClE,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,2EAA2E;IAC3E,MAAM,EAAE,OAAO,CAAA;IACf,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,yBAAyB,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAyB5H;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC5F,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,yBAAyB,EAAE,IAAI,GAAE,uBAA4B,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA+B9I"}
@@ -15,10 +15,10 @@ export type EconomyCloudStorage = {
15
15
  /**
16
16
  * Resolve the economy client storage transport for the current environment.
17
17
  *
18
- * Returns `{ active: true, client }` only when mode=self_hosted/cloud AND
19
- * HASNA_ECONOMY_API_URL + HASNA_ECONOMY_API_KEY are set. Otherwise
20
- * `{ active: false }` (local store). Throws if cloud was requested but is
21
- * misconfigured.
18
+ * Returns `{ active: true, client }` only when the contracts seam resolves to
19
+ * the http transport (HASNA_ECONOMY_API_URL + HASNA_ECONOMY_API_KEY set).
20
+ * Otherwise `{ active: false }` (local store). Throws when an API URL is set
21
+ * without a key (the seam reports the resolution as misconfigured).
22
22
  */
23
23
  export declare function resolveEconomyCloudStorage(env?: NodeJS.ProcessEnv, overrides?: StorageClientOverrides): EconomyCloudStorage;
24
24
  /** Memoized {@link resolveEconomyCloudStorage} for the process lifetime. */
@@ -35,7 +35,7 @@ export type CloudQuery = Record<string, string | number | boolean | null | undef
35
35
  * Read a collection resource from the cloud API and return the extracted array
36
36
  * (the serve envelope's `data`/`items`). Used by the read commands (sessions,
37
37
  * top, breakdown, accounts) so they render cloud data — never the local store —
38
- * when the client is in self_hosted/cloud mode.
38
+ * when the client is on the http transport.
39
39
  */
40
40
  export declare function cloudListItems<T = unknown>(storage: ActiveEconomyCloudStorage, resource: string, query?: CloudQuery): Promise<T[]>;
41
41
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-storage.d.ts","sourceRoot":"","sources":["../../src/lib/cloud-storage.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,oBAAoB,EAAE,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAE9F,gFAAgF;AAChF,KAAK,sBAAsB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;AAEzE,mEAAmE;AACnE,eAAO,MAAM,WAAW,YAAY,CAAC;AAErC,MAAM,MAAM,mBAAmB,GAC3B;IACE,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;CACrC,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;CACvB,CAAC;AAIN;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,CAAC,EAAE,sBAAsB,GACjC,mBAAmB,CAKrB;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,mBAAmB,CAG7F;AAED,4EAA4E;AAC5E,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD;AAED,+DAA+D;AAC/D,MAAM,MAAM,yBAAyB,GAAG,OAAO,CAAC,mBAAmB,EAAE;IAAE,MAAM,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC;AAEvF,uDAAuD;AACvD,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AAYtF;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,CAAC,GAAG,OAAO,EAC9C,OAAO,EAAE,yBAAyB,EAClC,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,UAAU,GACjB,OAAO,CAAC,CAAC,EAAE,CAAC,CAId;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,EAC3C,OAAO,EAAE,yBAAyB,EAClC,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,UAAU,GACjB,OAAO,CAAC,CAAC,CAAC,CAOZ"}
1
+ {"version":3,"file":"cloud-storage.d.ts","sourceRoot":"","sources":["../../src/lib/cloud-storage.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,oBAAoB,EAAE,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAE9F,gFAAgF;AAChF,KAAK,sBAAsB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;AAEzE,mEAAmE;AACnE,eAAO,MAAM,WAAW,YAAY,CAAC;AAErC,MAAM,MAAM,mBAAmB,GAC3B;IACE,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;CACrC,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;CACvB,CAAC;AAIN;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,CAAC,EAAE,sBAAsB,GACjC,mBAAmB,CAKrB;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,mBAAmB,CAG7F;AAED,4EAA4E;AAC5E,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD;AAED,+DAA+D;AAC/D,MAAM,MAAM,yBAAyB,GAAG,OAAO,CAAC,mBAAmB,EAAE;IAAE,MAAM,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC;AAEvF,uDAAuD;AACvD,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AAYtF;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,CAAC,GAAG,OAAO,EAC9C,OAAO,EAAE,yBAAyB,EAClC,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,UAAU,GACjB,OAAO,CAAC,CAAC,EAAE,CAAC,CAId;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,EAC3C,OAAO,EAAE,yBAAyB,EAClC,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,UAAU,GACjB,OAAO,CAAC,CAAC,CAAC,CAOZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/contracts-client/index.ts"],"names":[],"mappings":"AAGA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/contracts-client/index.ts"],"names":[],"mappings":"AAEA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}