tokentracker-cli 1.3.5 → 1.3.7
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/THIRD_PARTY_NOTICES.md +39 -0
- package/dashboard/dist/THIRD_PARTY_NOTICES.txt +39 -0
- package/dashboard/dist/assets/{AchievementBadge-Dazs3pEa.js → AchievementBadge-B6Ys-Iv6.js} +1 -1
- package/dashboard/dist/assets/{AchievementsPage-LWnxZvmw.js → AchievementsPage-C7EJYb05.js} +2 -2
- package/dashboard/dist/assets/{AchievementsSection-BLqczmU9.js → AchievementsSection-KjJeaWDP.js} +1 -1
- package/dashboard/dist/assets/{BadgeDetailModal-B_n4aj2S.js → BadgeDetailModal-BdoapwT5.js} +1 -1
- package/dashboard/dist/assets/{BotAnimated-KDWI_YcZ.js → BotAnimated-coLP7eiI.js} +1 -1
- package/dashboard/dist/assets/{Card-BYoxd4OC.js → Card-CMShFKqX.js} +1 -1
- package/dashboard/dist/assets/{CloudCheckoutPage-BR2_B03P.js → CloudCheckoutPage-DQ16a4Ui.js} +1 -1
- package/dashboard/dist/assets/CloudPage-D1PEMzr2.js +2 -0
- package/dashboard/dist/assets/{CloudUsageExport-C_DqZKo1.js → CloudUsageExport-Dn7_qVGy.js} +1 -1
- package/dashboard/dist/assets/{CommandPalette-DkCaIQI4.js → CommandPalette-t3sXFKqr.js} +1 -1
- package/dashboard/dist/assets/{CommunityStatsModal-pX9OePi4.js → CommunityStatsModal-DHyreMHY.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-tkgZwz4u.js → ConfirmModal-DiguIoDY.js} +1 -1
- package/dashboard/dist/assets/{Controls-MTUhGWy8.js → Controls-D6267L_q.js} +1 -1
- package/dashboard/dist/assets/{DashboardPage-SOx-A7lH.js → DashboardPage-0xC6i2rZ.js} +1 -1
- package/dashboard/dist/assets/{DateRangePopover-B-BMOm3O.js → DateRangePopover-CVZTfOUX.js} +1 -1
- package/dashboard/dist/assets/{DevicePage-DSK9lm7v.js → DevicePage-BagH0rTy.js} +1 -1
- package/dashboard/dist/assets/{DialogClose-uVUNu4rg.js → DialogClose-IWs31AbB.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-JwE-wyWI.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-B-VifiA3.js → DialogTitle-CI8xcLkd.js} +1 -1
- package/dashboard/dist/assets/ElectricLogo-CakZnEiu.js +282 -0
- package/dashboard/dist/assets/ElectricLogo-D0wiAojj.css +1 -0
- package/dashboard/dist/assets/{FadeIn-B6lrj4uo.js → FadeIn-BJiqknMG.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-Cx5zOhXa.js → HeaderGithubStar-Bo6VoGCl.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-DY1ENf69.js → HoverTooltip-DjJmYzbc.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-D6TEq64d.js → IpCheckPage-Cp2ELhP8.js} +1 -1
- package/dashboard/dist/assets/{LandingPage-OdZUfq--.js → LandingPage-gvBFMTKh.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardPage-DCK5xcAt.js → LeaderboardPage-CbWwclwl.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardProBadge-CBXJ1u_m.js → LeaderboardProBadge-QK4hLmn1.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardProfileModal-Ccdzb7QK.js → LeaderboardProfileModal-DuggTNlv.js} +3 -3
- package/dashboard/dist/assets/{LeaderboardProfilePage-CFXlZ0fL.js → LeaderboardProfilePage-CZZAm33s.js} +1 -1
- package/dashboard/dist/assets/{LimitsPage-5krjm-g9.js → LimitsPage-DJkws70g.js} +1 -1
- package/dashboard/dist/assets/{LocalOnlyNotice-Rk1B8PaZ.js → LocalOnlyNotice-Cf9NPAL1.js} +1 -1
- package/dashboard/dist/assets/{LoginCard-DTTIm8vk.js → LoginCard-s3qsEOET.js} +1 -1
- package/dashboard/dist/assets/{LoginModal-BNcDdjfr.js → LoginModal-BTLHl4eP.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-CQgXP7Ee.js → LoginPage-DDqQpy85.js} +1 -1
- package/dashboard/dist/assets/{PetPage-Cw_kAPRs.js → PetPage-D4P5yDL8.js} +1 -1
- package/dashboard/dist/assets/{PopoverPopup-NYiGE8A2.js → PopoverPopup-B_fwRpm_.js} +1 -1
- package/dashboard/dist/assets/{ProviderIcon-Bp7iFJ_m.js → ProviderIcon-B1oef_V8.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-Cf9kAWDW.js → ResetPasswordPage-BduujSou.js} +1 -1
- package/dashboard/dist/assets/{Select-kIcvQFAo.js → Select-ClkKzKsi.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-BpIsAg3b.js → SelectItemText-D_4VNKEi.js} +1 -1
- package/dashboard/dist/assets/{SelfHostPage-Ch2vvSwI.js → SelfHostPage-CDNLHmOx.js} +1 -1
- package/dashboard/dist/assets/{ServiceStatusPage-hoYBvGbu.js → ServiceStatusPage-V1exv7gK.js} +1 -1
- package/dashboard/dist/assets/{SessionsPage-BzRB6q-Z.js → SessionsPage-BR5gBSc1.js} +2 -2
- package/dashboard/dist/assets/SettingsPage-LJJCS1G0.js +2 -0
- package/dashboard/dist/assets/{SkillsPage-CkqThTZL.js → SkillsPage-D0oeWRew.js} +1 -1
- package/dashboard/dist/assets/{TokenGalaxy-eLG-UIZY.js → TokenGalaxy-h5USfWnF.js} +1 -1
- package/dashboard/dist/assets/{TooltipPopup-bnMJyilQ.js → TooltipPopup-1KxZ_iHu.js} +1 -1
- package/dashboard/dist/assets/{TrendMonitor-X7-aGzIv.js → TrendMonitor-gMTrGZzH.js} +1 -1
- package/dashboard/dist/assets/{WidgetsPage-CGznIzrW.js → WidgetsPage-xghIyvm_.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-p31-uUoF.js → WrappedPage-O4zzP87x.js} +1 -1
- package/dashboard/dist/assets/__vite-browser-external-DKVGjnxf.js +45 -0
- package/dashboard/dist/assets/__vite-browser-external-DvNSoTb8.css +1 -0
- package/dashboard/dist/assets/{agent-logos-2TVT3fIE.js → agent-logos-CyXPIQ5S.js} +1 -1
- package/dashboard/dist/assets/{arrow-left-DL0hAp_7.js → arrow-left-BqMZ7dgK.js} +1 -1
- package/dashboard/dist/assets/{arrow-right-DFCpnV_9.js → arrow-right-D2cfRUf2.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-DLvfE0Wu.js → arrow-up-right-DSJpQHMH.js} +1 -1
- package/dashboard/dist/assets/{calendar-days-B0aDoKSG.js → calendar-days-Cpu5CPAM.js} +1 -1
- package/dashboard/dist/assets/{check-C_cfrxiz.js → check-BTSG8HIW.js} +1 -1
- package/dashboard/dist/assets/{chevron-down-Ck8ml43e.js → chevron-down-0nuZGQbD.js} +1 -1
- package/dashboard/dist/assets/{cloud-checkout-PYnwNfdH.js → cloud-checkout-Jv0vhd5v.js} +1 -1
- package/dashboard/dist/assets/{composite-INW-ELWX.js → composite-_t6vz49X.js} +1 -1
- package/dashboard/dist/assets/{download-B7uokeIo.js → download-CzxvhDR9.js} +1 -1
- package/dashboard/dist/assets/{external-link-CI3crg4K.js → external-link-BwKhoPLM.js} +1 -1
- package/dashboard/dist/assets/{flame-DCzvFKV1.js → flame-Bni4FlSO.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-CSTEYK2m.js → format-tokens-BLPhLm4w.js} +1 -1
- package/dashboard/dist/assets/{gift-dEHDFMc6.js → gift-lj3smodH.js} +1 -1
- package/dashboard/dist/assets/{host-mode-r2SW9Mdv.js → host-mode-DluVCV7W.js} +1 -1
- package/dashboard/dist/assets/{icons-q-3zvEkh.js → icons-BThVE2Zq.js} +1 -1
- package/dashboard/dist/assets/{index-CyHYj9XI.js → index-CETYrL7R.js} +1 -1
- package/dashboard/dist/assets/{index-BbrsgHf4.js → index-CarMa6Pv.js} +1 -1
- package/dashboard/dist/assets/{index-BV7qwUw4.js → index-D_ERbEBI.js} +1 -1
- package/dashboard/dist/assets/{info-BBdY9hV4.js → info-DSgWF_40.js} +1 -1
- package/dashboard/dist/assets/{link-2-CLPePfXs.js → link-2-C7H_UH8Q.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-ETrjzfmn.js → loader-circle-B2ln5DKm.js} +1 -1
- package/dashboard/dist/assets/{modifiers.esm-DHqnp2ol.js → modifiers.esm-DHEGy9eE.js} +1 -1
- package/dashboard/dist/assets/{monitor-smartphone-D1kdzrdb.js → monitor-smartphone-BI3aJPNi.js} +1 -1
- package/dashboard/dist/assets/{play-Cxp-ronD.js → play-CVxzAkNo.js} +1 -1
- package/dashboard/dist/assets/{plus-4n94VzDK.js → plus-UGoZah-U.js} +1 -1
- package/dashboard/dist/assets/{provider-display-CRlbeO7t.js → provider-display-C-ibpm5u.js} +1 -1
- package/dashboard/dist/assets/{react-DlHjGQFN.js → react-_bbDNdaT.js} +1 -1
- package/dashboard/dist/assets/{safePolygon-CVZ27a2_.js → safePolygon-DeLf2a7a.js} +1 -1
- package/dashboard/dist/assets/{search-BDPr56_h.js → search-BzL7DvcZ.js} +1 -1
- package/dashboard/dist/assets/{server-Bm7fHvVa.js → server-BsilXoLs.js} +1 -1
- package/dashboard/dist/assets/{shield-check-DtT8ACzI.js → shield-check-Dx8cSMB0.js} +1 -1
- package/dashboard/dist/assets/{skills-api-Dc1-2qu6.js → skills-api-CnOpyIPR.js} +1 -1
- package/dashboard/dist/assets/{sortable.esm-B-qN-Xk2.js → sortable.esm-DrIfxJ2p.js} +1 -1
- package/dashboard/dist/assets/{store-gHeBU8dQ.js → store-CjkDYjXp.js} +1 -1
- package/dashboard/dist/assets/{terminal-D4VZbvhg.js → terminal-CExBqXDx.js} +1 -1
- package/dashboard/dist/assets/{trash-BZtLAFQy.js → trash-DSHRpaMy.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-BdqndrbB.js → use-community-stats-B1W63PCE.js} +1 -1
- package/dashboard/dist/assets/{use-latest-request-guard-DhGg1cDS.js → use-latest-request-guard-8-lur0NI.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-D3HOcRFv.js → use-limits-display-prefs-Dq0e_5PV.js} +1 -1
- package/dashboard/dist/assets/{use-native-settings-BniKwA_n.js → use-native-settings-CkPyWn4W.js} +1 -1
- package/dashboard/dist/assets/{use-ordered-list-b09H7EHq.js → use-ordered-list-Cul7GZDv.js} +1 -1
- package/dashboard/dist/assets/{use-pet-settings-CPZdlq_e.js → use-pet-settings-DkNURWe6.js} +2 -2
- package/dashboard/dist/assets/use-reduced-motion-CkHJN2uY.js +1 -0
- package/dashboard/dist/assets/{use-transform-CIdxjmI8.js → use-transform-DzUhSbxH.js} +1 -1
- package/dashboard/dist/assets/{use-usage-limits-eJlU65yY.js → use-usage-limits-3ZkgTe7n.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-CM22CmAq.js → useCurrency-EbqxSlEF.js} +1 -1
- package/dashboard/dist/assets/{usePositioner-B3l2ulTw.js → usePositioner-cTX1WPQP.js} +1 -1
- package/dashboard/dist/assets/{useTokenFormat-D7nzgxKw.js → useTokenFormat-CanmWK4w.js} +1 -1
- package/dashboard/dist/assets/{zap-Daxct1WV.js → zap-DQHYg9o6.js} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/dashboard/dist/ip-check.html +2 -2
- package/dashboard/dist/leaderboard.html +2 -2
- package/dashboard/dist/share.html +2 -2
- package/dashboard/dist/token-tracker-bolt-outline.svg +3 -0
- package/dashboard/dist/token-tracker-bolt.svg +3 -0
- package/package.json +1 -1
- package/src/cli.js +1 -1
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/rollout.js +49 -16
- package/src/lib/session-analytics.js +546 -52
- package/src/lib/session-performance.js +24 -1
- package/dashboard/dist/assets/CloudPage-DL5RkJKK.js +0 -1
- package/dashboard/dist/assets/DialogDescription-DBqGGWNj.js +0 -1
- package/dashboard/dist/assets/SettingsPage-DRl2uX-i.js +0 -2
- package/dashboard/dist/assets/__vite-browser-external-2g_4s3ot.js +0 -45
- package/dashboard/dist/assets/__vite-browser-external-LpFw4zXh.css +0 -1
- package/dashboard/dist/assets/use-reduced-motion-D1gcKJUo.js +0 -1
package/src/lib/rollout.js
CHANGED
|
@@ -5127,16 +5127,21 @@ function buildV2Sql(sessionTable, watermark = null) {
|
|
|
5127
5127
|
// sessionTable (which session table exists, session_v2 preferred over session
|
|
5128
5128
|
// via DESC). Returns null when the probe itself fails — callers treat that as
|
|
5129
5129
|
// v1-only, matching the pre-existing silent-degradation contract.
|
|
5130
|
-
function detectOpencodeMessageLayout(dbPath, sqliteOptions = {}) {
|
|
5130
|
+
function detectOpencodeMessageLayout(dbPath, sqliteOptions = {}, { propagateReadFailure = false } = {}) {
|
|
5131
5131
|
let rows;
|
|
5132
5132
|
try {
|
|
5133
5133
|
rows = readSqliteJsonRows(
|
|
5134
5134
|
dbPath,
|
|
5135
5135
|
`SELECT (SELECT 1 FROM session_message LIMIT 1) AS hasRows,
|
|
5136
5136
|
(SELECT name FROM sqlite_master WHERE name IN ('session','session_v2') ORDER BY name DESC LIMIT 1) AS sessionTable`,
|
|
5137
|
-
{ label: "OpenCode", timeout: 10_000, maxBuffer: 1024 * 1024, ...sqliteOptions },
|
|
5137
|
+
{ label: "OpenCode", timeout: 10_000, maxBuffer: 1024 * 1024, ...sqliteOptions, throwOnReadFailure: true },
|
|
5138
5138
|
);
|
|
5139
|
-
} catch (
|
|
5139
|
+
} catch (error) {
|
|
5140
|
+
// A missing session_message table is the normal v1-only miss; with
|
|
5141
|
+
// propagateReadFailure a real read failure must reach the caller — the
|
|
5142
|
+
// session scanner would otherwise skip the v2 generation silently and
|
|
5143
|
+
// cache a zero-token inventory over a readable-in-principle database.
|
|
5144
|
+
if (propagateReadFailure && !isMissingSqliteTableError(error)) throw error;
|
|
5140
5145
|
return null;
|
|
5141
5146
|
}
|
|
5142
5147
|
if (!Array.isArray(rows) || rows.length === 0) return null;
|
|
@@ -5156,7 +5161,17 @@ function opencodeMessageProvider(data) {
|
|
|
5156
5161
|
return data?.providerID || data?.model?.providerID || "";
|
|
5157
5162
|
}
|
|
5158
5163
|
|
|
5159
|
-
|
|
5164
|
+
// readSqliteJsonRows wraps its two backend errors into the thrown Error, so a
|
|
5165
|
+
// "table genuinely absent" miss and a "database unreadable" failure look the
|
|
5166
|
+
// same to a caller that only catches. Both backends spell a missing table
|
|
5167
|
+
// "no such table" — use that to keep the normal miss on the tolerant path
|
|
5168
|
+
// while real read failures can propagate.
|
|
5169
|
+
function isMissingSqliteTableError(error) {
|
|
5170
|
+
const messages = [error?.message, error?.cliError?.message, error?.nodeSqliteError?.message];
|
|
5171
|
+
return messages.some((m) => typeof m === "string" && m.includes("no such table"));
|
|
5172
|
+
}
|
|
5173
|
+
|
|
5174
|
+
function readOpencodeDbMessagesIncremental(dbPath, previousCursor = null, sqliteOptions = {}, { propagateReadFailure = false } = {}) {
|
|
5160
5175
|
if (!dbPath || !fssync.existsSync(dbPath)) return { messages: [], cursor: null };
|
|
5161
5176
|
|
|
5162
5177
|
const identity = opencodeDbIdentity(dbPath);
|
|
@@ -5223,7 +5238,11 @@ function readOpencodeDbMessagesIncremental(dbPath, previousCursor = null, sqlite
|
|
|
5223
5238
|
throwOnReadFailure: true,
|
|
5224
5239
|
});
|
|
5225
5240
|
return Array.isArray(rows) ? rows : [];
|
|
5226
|
-
} catch (
|
|
5241
|
+
} catch (error) {
|
|
5242
|
+
// A missing table is the normal "other generation's layout" miss; an
|
|
5243
|
+
// unreadable database is not — with propagateReadFailure the session
|
|
5244
|
+
// scan aborts instead of caching a zero-token inventory over it.
|
|
5245
|
+
if (propagateReadFailure && !isMissingSqliteTableError(error)) throw error;
|
|
5227
5246
|
return null; // query-level failure (e.g. wrong generation's table)
|
|
5228
5247
|
}
|
|
5229
5248
|
};
|
|
@@ -5301,7 +5320,7 @@ function readOpencodeDbMessagesIncremental(dbPath, previousCursor = null, sqlite
|
|
|
5301
5320
|
// baseline every database carries or degrades to), v2 runs only when the
|
|
5302
5321
|
// probe confirms session_message has rows — this avoids firing a JOIN
|
|
5303
5322
|
// against a non-existent session table on type-A databases.
|
|
5304
|
-
const probe = detectOpencodeMessageLayout(effectiveDbPath, sqliteOptions);
|
|
5323
|
+
const probe = detectOpencodeMessageLayout(effectiveDbPath, sqliteOptions, { propagateReadFailure });
|
|
5305
5324
|
const out = [];
|
|
5306
5325
|
const nextCursor = {
|
|
5307
5326
|
version: OPENCODE_DB_CURSOR_VERSION,
|
|
@@ -5341,8 +5360,8 @@ function readOpencodeDbMessagesIncremental(dbPath, previousCursor = null, sqlite
|
|
|
5341
5360
|
}
|
|
5342
5361
|
}
|
|
5343
5362
|
|
|
5344
|
-
function readOpencodeDbMessages(dbPath, sqliteOptions = {}) {
|
|
5345
|
-
return readOpencodeDbMessagesIncremental(dbPath, null, sqliteOptions).messages;
|
|
5363
|
+
function readOpencodeDbMessages(dbPath, sqliteOptions = {}, { propagateReadFailure = false } = {}) {
|
|
5364
|
+
return readOpencodeDbMessagesIncremental(dbPath, null, sqliteOptions, { propagateReadFailure }).messages;
|
|
5346
5365
|
}
|
|
5347
5366
|
|
|
5348
5367
|
// mimocode mirrors the user's Claude Code + claude-mem history into its own
|
|
@@ -5458,7 +5477,7 @@ const ZCODE_NATIVE_USAGE_COLUMNS = new Set([
|
|
|
5458
5477
|
"cache_read_input_tokens",
|
|
5459
5478
|
]);
|
|
5460
5479
|
|
|
5461
|
-
function detectZcodeNativeUsageLayout(dbPath, sqliteOptions = {}) {
|
|
5480
|
+
function detectZcodeNativeUsageLayout(dbPath, sqliteOptions = {}, { propagateReadFailure = false } = {}) {
|
|
5462
5481
|
if (!dbPath || !fssync.existsSync(dbPath)) return null;
|
|
5463
5482
|
let rows;
|
|
5464
5483
|
try {
|
|
@@ -5475,7 +5494,11 @@ function detectZcodeNativeUsageLayout(dbPath, sqliteOptions = {}) {
|
|
|
5475
5494
|
throwOnReadFailure: true,
|
|
5476
5495
|
},
|
|
5477
5496
|
);
|
|
5478
|
-
} catch (
|
|
5497
|
+
} catch (error) {
|
|
5498
|
+
// propagateReadFailure: an unreadable db is a failure, not "no native
|
|
5499
|
+
// layout" — the session scanner must skip the file, not fall back to an
|
|
5500
|
+
// empty legacy read and cache zero tokens.
|
|
5501
|
+
if (propagateReadFailure) throw error;
|
|
5479
5502
|
return null;
|
|
5480
5503
|
}
|
|
5481
5504
|
const modelUsageColumns = new Set(
|
|
@@ -5545,7 +5568,13 @@ function buildZcodeNativeUsageSql({ hasSessionDirectory }) {
|
|
|
5545
5568
|
ORDER BY mu.started_at ASC, mu.id ASC`;
|
|
5546
5569
|
}
|
|
5547
5570
|
|
|
5548
|
-
|
|
5571
|
+
// `propagateReadFailure` (off by default): when the native usage layout is
|
|
5572
|
+
// present but its row query fails, throw instead of returning null. The usage
|
|
5573
|
+
// queue treats that fallthrough as "no native table, use legacy" — correct for
|
|
5574
|
+
// its own resilience — but the session scanner must not cache a zero-token
|
|
5575
|
+
// inventory over a failed read (the browser then hides the sessions entirely
|
|
5576
|
+
// instead of reporting the db as skipped).
|
|
5577
|
+
function readZcodeNativeUsageMessages(dbPath, sqliteOptions = {}, { propagateReadFailure = false } = {}) {
|
|
5549
5578
|
let snapshot = null;
|
|
5550
5579
|
let effectiveDbPath = dbPath;
|
|
5551
5580
|
if (isUncPath(dbPath)) {
|
|
@@ -5560,7 +5589,7 @@ function readZcodeNativeUsageMessages(dbPath, sqliteOptions = {}) {
|
|
|
5560
5589
|
|
|
5561
5590
|
let rows;
|
|
5562
5591
|
try {
|
|
5563
|
-
const layout = detectZcodeNativeUsageLayout(effectiveDbPath, sqliteOptions);
|
|
5592
|
+
const layout = detectZcodeNativeUsageLayout(effectiveDbPath, sqliteOptions, { propagateReadFailure });
|
|
5564
5593
|
if (!layout) return null;
|
|
5565
5594
|
rows = readSqliteJsonRows(effectiveDbPath, buildZcodeNativeUsageSql(layout), {
|
|
5566
5595
|
label: "ZCode",
|
|
@@ -5569,7 +5598,8 @@ function readZcodeNativeUsageMessages(dbPath, sqliteOptions = {}) {
|
|
|
5569
5598
|
...sqliteOptions,
|
|
5570
5599
|
throwOnReadFailure: true,
|
|
5571
5600
|
});
|
|
5572
|
-
} catch (
|
|
5601
|
+
} catch (error) {
|
|
5602
|
+
if (propagateReadFailure) throw error;
|
|
5573
5603
|
return null;
|
|
5574
5604
|
} finally {
|
|
5575
5605
|
if (snapshot) snapshot.cleanup();
|
|
@@ -5621,10 +5651,10 @@ function readZcodeNativeUsageMessages(dbPath, sqliteOptions = {}) {
|
|
|
5621
5651
|
// table is authoritative from its first completed row onward, but it is not a
|
|
5622
5652
|
// historical backfill. Keep legacy rows before that boundary so merely adding
|
|
5623
5653
|
// the new table cannot make older usage disappear from TokenTracker.
|
|
5624
|
-
function readZcodeDbMessages(dbPath, sqliteOptions = {}) {
|
|
5654
|
+
function readZcodeDbMessages(dbPath, sqliteOptions = {}, { propagateReadFailure = false } = {}) {
|
|
5625
5655
|
if (!dbPath || !fssync.existsSync(dbPath)) return [];
|
|
5626
|
-
const nativeMessages = readZcodeNativeUsageMessages(dbPath, sqliteOptions);
|
|
5627
|
-
const legacyMessages = readOpencodeDbMessages(dbPath, sqliteOptions)
|
|
5656
|
+
const nativeMessages = readZcodeNativeUsageMessages(dbPath, sqliteOptions, { propagateReadFailure });
|
|
5657
|
+
const legacyMessages = readOpencodeDbMessages(dbPath, sqliteOptions, { propagateReadFailure })
|
|
5628
5658
|
.filter((message) => isZcodeNativeMessage(message.data))
|
|
5629
5659
|
.map(normalizeZcodeLegacyMessage);
|
|
5630
5660
|
if (nativeMessages === null) return legacyMessages;
|
|
@@ -24559,6 +24589,8 @@ module.exports = {
|
|
|
24559
24589
|
readOpencodeDbMessagesIncremental,
|
|
24560
24590
|
readMimoDbMessages,
|
|
24561
24591
|
readZcodeDbMessages,
|
|
24592
|
+
coerceEpochMs,
|
|
24593
|
+
normalizeOpencodeModelFields,
|
|
24562
24594
|
hasZcodeNativeUsageSchema,
|
|
24563
24595
|
resolveQoderDbPath,
|
|
24564
24596
|
resolveQoderDbPaths,
|
|
@@ -24593,6 +24625,7 @@ module.exports = {
|
|
|
24593
24625
|
parseGeminiIncremental,
|
|
24594
24626
|
parseOpencodeIncremental,
|
|
24595
24627
|
parseOpencodeDbIncremental,
|
|
24628
|
+
deriveOpencodeMessageFingerprint,
|
|
24596
24629
|
parseQoderDbIncremental,
|
|
24597
24630
|
openclawCursorKey,
|
|
24598
24631
|
parseOpenclawIncremental,
|