tokentracker-cli 1.4.10 → 1.4.11
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/README.de.md +1 -1
- package/README.ja.md +1 -1
- package/README.ko.md +1 -1
- package/README.zh-CN.md +1 -1
- package/dashboard/dist/assets/{AchievementBadge-BTqlXUP1.js → AchievementBadge-DALWiLQQ.js} +1 -1
- package/dashboard/dist/assets/{AchievementsPage-DbKUhaY-.js → AchievementsPage-CjWobmn1.js} +2 -2
- package/dashboard/dist/assets/{AchievementsSection-El1F-OC7.js → AchievementsSection-CTryGWII.js} +1 -1
- package/dashboard/dist/assets/{BadgeDetailModal--8PySLzP.js → BadgeDetailModal-D4lMxewA.js} +1 -1
- package/dashboard/dist/assets/{BotAnimated-DBcOS4vh.js → BotAnimated-CsLNf9WH.js} +1 -1
- package/dashboard/dist/assets/{Card-CeGs8TaY.js → Card-BOnNTrmF.js} +1 -1
- package/dashboard/dist/assets/{CloudCheckoutPage-DCg3VVAi.js → CloudCheckoutPage-CrY15xqT.js} +1 -1
- package/dashboard/dist/assets/{CloudPage-CmeFDrmk.js → CloudPage-hNSCMzVG.js} +2 -2
- package/dashboard/dist/assets/{CommandPalette-CrSNoZW9.js → CommandPalette-CE4UfPXk.js} +1 -1
- package/dashboard/dist/assets/{CommunityStatsModal-ynB4j0Qb.js → CommunityStatsModal-CLUegC6z.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-DDTUf-My.js → ConfirmModal-D3wwfiYB.js} +1 -1
- package/dashboard/dist/assets/{Controls-DXsJjEU1.js → Controls-B_ta_8zw.js} +1 -1
- package/dashboard/dist/assets/{DashboardPage-fr4sgbLB.js → DashboardPage-RevVPZFt.js} +1 -1
- package/dashboard/dist/assets/{DateRangePopover-gTiPISL_.js → DateRangePopover-CYud1FKu.js} +1 -1
- package/dashboard/dist/assets/{DevicePage-DvHVjCCH.js → DevicePage-D_eSLfM3.js} +1 -1
- package/dashboard/dist/assets/{DialogClose-CXwouQe4.js → DialogClose-Bu1ct4DA.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-GUHQVNGf.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-Cd_k-Nyw.js → DialogTitle-BJxM52J1.js} +1 -1
- package/dashboard/dist/assets/{ElectricLogo-C4vUNTCI.js → ElectricLogo-DYVZebgD.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-CGM5RBFy.js → FadeIn-CVaq5ALh.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-el5-DhVb.js → HeaderGithubStar-BCwYSguq.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-C7YaWwJx.js → HoverTooltip-YsG-TdOX.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-EKhbH9hJ.js → IpCheckPage-C0qiyZXr.js} +1 -1
- package/dashboard/dist/assets/{LandingPage-DJYOv1AM.js → LandingPage-BlRJWwvx.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardPage-CwzJxA8p.js → LeaderboardPage-DcCCKL2q.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardProBadge-DYLp9pJY.js → LeaderboardProBadge-I_oW0KCc.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardProfileModal-DqD2h9dD.js → LeaderboardProfileModal-DM5Vc7MB.js} +3 -3
- package/dashboard/dist/assets/{LeaderboardProfilePage-CarYvpYe.js → LeaderboardProfilePage-DnYBBGNe.js} +1 -1
- package/dashboard/dist/assets/{LimitsPage-4T0BpfYS.js → LimitsPage-Cyy3PI8p.js} +1 -1
- package/dashboard/dist/assets/{LocalOnlyNotice-CAR-mqy0.js → LocalOnlyNotice-083BoEX9.js} +1 -1
- package/dashboard/dist/assets/{LoginCard-Czq-UgAU.js → LoginCard-CN1db2Rj.js} +1 -1
- package/dashboard/dist/assets/{LoginModal-D4uxfzZb.js → LoginModal-Dfi7_ory.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-Bg3BG0Wv.js → LoginPage-BzMdiYlx.js} +1 -1
- package/dashboard/dist/assets/{PetPage-BgwBxRyx.js → PetPage-CsE95lfJ.js} +2 -2
- package/dashboard/dist/assets/{PopoverPopup-k3o_Jp2b.js → PopoverPopup-U7DTTTE0.js} +1 -1
- package/dashboard/dist/assets/{ProviderIcon-Bbw6MUSf.js → ProviderIcon-CnLfT5d9.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-DIKPVu5K.js → ResetPasswordPage-De2RzCj-.js} +1 -1
- package/dashboard/dist/assets/{Select-kA0dV5Qw.js → Select-BS5MWHdB.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-D4YCIn1x.js → SelectItemText-D3i379K-.js} +1 -1
- package/dashboard/dist/assets/{SelfHostPage-C3Y9qF3P.js → SelfHostPage-CTL0dnp5.js} +1 -1
- package/dashboard/dist/assets/{ServiceStatusPage-o1G3SJhV.js → ServiceStatusPage-BmEvOk3B.js} +1 -1
- package/dashboard/dist/assets/{SessionsPage-CA-efxhU.js → SessionsPage-DIog3JA_.js} +2 -2
- package/dashboard/dist/assets/{SettingsPage-Mr84vxQL.js → SettingsPage-Cgpiwh-C.js} +3 -3
- package/dashboard/dist/assets/{SkillsPage-BtRhLSpz.js → SkillsPage-DpagshiB.js} +1 -1
- package/dashboard/dist/assets/{TokenGalaxy-CcFjCCuC.js → TokenGalaxy-Do1U_-E3.js} +1 -1
- package/dashboard/dist/assets/{TooltipPopup-6aTx3jDf.js → TooltipPopup-MOAnEqf3.js} +1 -1
- package/dashboard/dist/assets/{TrendMonitor-DoywXr8h.js → TrendMonitor-B55RUbQm.js} +1 -1
- package/dashboard/dist/assets/{WidgetsPage-BuGSzvR0.js → WidgetsPage-CehbGk-6.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-Bm6X-SUZ.js → WrappedPage-Cqt-U0Zx.js} +1 -1
- package/dashboard/dist/assets/{__vite-browser-external-ClVJNQu3.js → __vite-browser-external-CR0vo15z.js} +2 -2
- package/dashboard/dist/assets/{agent-logos-Sc8Sejgx.js → agent-logos-DuW-DWAl.js} +1 -1
- package/dashboard/dist/assets/{arrow-left-Cm1LG2i_.js → arrow-left-DIvQjuji.js} +1 -1
- package/dashboard/dist/assets/{arrow-right-WP3kIwiy.js → arrow-right-BURLycHb.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-CjyprVMj.js → arrow-up-right-Bl1QMMkY.js} +1 -1
- package/dashboard/dist/assets/{calendar-days-Bm88-Gcb.js → calendar-days-CmIWJC3A.js} +1 -1
- package/dashboard/dist/assets/{check-CzIxFg0I.js → check-DB2ZTWor.js} +1 -1
- package/dashboard/dist/assets/{chevron-down-bfGK8629.js → chevron-down-BflN3NJt.js} +1 -1
- package/dashboard/dist/assets/{cloud-checkout-C9DFQ7yM.js → cloud-checkout-BugQolSC.js} +1 -1
- package/dashboard/dist/assets/{composite-CdExmgTx.js → composite-DJsqXsjA.js} +1 -1
- package/dashboard/dist/assets/{copy-CPPdujn2.js → copy-CtB-GPN2.js} +1 -1
- package/dashboard/dist/assets/{download-Cl6_dKeK.js → download-x5Botpqc.js} +1 -1
- package/dashboard/dist/assets/{external-link-B0r6Wo4e.js → external-link-DH9sRkJW.js} +1 -1
- package/dashboard/dist/assets/{flame-wEezvzXx.js → flame-DEcsokoL.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-vWpBpKpM.js → format-tokens-BH0jc1MG.js} +1 -1
- package/dashboard/dist/assets/{gift-BFjblRqU.js → gift-BZk9muk9.js} +1 -1
- package/dashboard/dist/assets/{icons-DX3dCNJP.js → icons-BMf9-bfS.js} +1 -1
- package/dashboard/dist/assets/{index-DBF1bJlm.js → index-BEtrik3j.js} +1 -1
- package/dashboard/dist/assets/{index-D1Zdrpom.js → index-Cm-9apOR.js} +1 -1
- package/dashboard/dist/assets/{index-D-TnqdBv.js → index-TErx-xPb.js} +1 -1
- package/dashboard/dist/assets/{index-p8Gt3NFg.js → index-axJYocSc.js} +1 -1
- package/dashboard/dist/assets/{info-Cqi971MA.js → info-DWdPAxu8.js} +1 -1
- package/dashboard/dist/assets/{link-2-79sm__cT.js → link-2-c3ZZd-w-.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-CDoVfOUb.js → loader-circle-BKdtxfky.js} +1 -1
- package/dashboard/dist/assets/{local-usage-transfer-EcXnuwCj.js → local-usage-transfer-BFTJyQl3.js} +1 -1
- package/dashboard/dist/assets/{modifiers.esm-v5_BKSmY.js → modifiers.esm-C3yIfOiP.js} +1 -1
- package/dashboard/dist/assets/{monitor-smartphone-CO67DffO.js → monitor-smartphone-DbdL7Mei.js} +1 -1
- package/dashboard/dist/assets/{play-CbvuGtc3.js → play-qtWt2ArI.js} +1 -1
- package/dashboard/dist/assets/{plus-jc2gXlRM.js → plus-C_-__5vi.js} +1 -1
- package/dashboard/dist/assets/{provider-display-BK3EbRLM.js → provider-display-IKHnhvaj.js} +1 -1
- package/dashboard/dist/assets/{react-DMs4C4qS.js → react-H6DfeMUm.js} +1 -1
- package/dashboard/dist/assets/{safePolygon-cY9H0GBN.js → safePolygon-OEQJQTVa.js} +1 -1
- package/dashboard/dist/assets/{search-fqTJoYYA.js → search-MZE76qNU.js} +1 -1
- package/dashboard/dist/assets/{server-jpBtvTvr.js → server-CUWYLMjG.js} +1 -1
- package/dashboard/dist/assets/{shield-check-DQiBlJbN.js → shield-check-lA0Ja0RB.js} +1 -1
- package/dashboard/dist/assets/{skills-api-CN2r_rmt.js → skills-api-CJJIPvSe.js} +1 -1
- package/dashboard/dist/assets/{sortable.esm-DrS52yOK.js → sortable.esm-DTnvt1IN.js} +1 -1
- package/dashboard/dist/assets/{store-K2Mk6aMn.js → store-CC0YKrxA.js} +1 -1
- package/dashboard/dist/assets/{terminal-Q4SruAlh.js → terminal-yc2l_-3m.js} +1 -1
- package/dashboard/dist/assets/{trash-C1Ob-g8E.js → trash-Dl9f-o2h.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-C-Gxpp9D.js → use-community-stats-CZCKWCO7.js} +1 -1
- package/dashboard/dist/assets/{use-latest-request-guard-DK-A4bBp.js → use-latest-request-guard-DTrOu0gD.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-ZauQzxE_.js → use-limits-display-prefs-DGqP231e.js} +1 -1
- package/dashboard/dist/assets/{use-native-settings-BZLEIUK8.js → use-native-settings-BEATnxB6.js} +1 -1
- package/dashboard/dist/assets/{use-ordered-list-De_Mcm_H.js → use-ordered-list-C_HTFP5C.js} +1 -1
- package/dashboard/dist/assets/use-reduced-motion-CfCWjE-a.js +1 -0
- package/dashboard/dist/assets/{use-transform-XCDD5IrX.js → use-transform-DM0QGq_O.js} +1 -1
- package/dashboard/dist/assets/{use-usage-limits-BncGDhoF.js → use-usage-limits-BnjBG2fM.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-DXPclxBT.js → useCurrency-xQrRFokb.js} +1 -1
- package/dashboard/dist/assets/{usePositioner-C-E1npCy.js → usePositioner-DkVdsypM.js} +1 -1
- package/dashboard/dist/assets/{useTokenFormat-B70xhy9u.js → useTokenFormat-CvA_kIPe.js} +1 -1
- package/dashboard/dist/assets/{zap-D7gRgGCj.js → zap-BJNS4i_u.js} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/dashboard/dist/ip-check.html +1 -1
- package/dashboard/dist/leaderboard.html +1 -1
- package/dashboard/dist/share.html +1 -1
- package/package.json +1 -1
- package/src/lib/omp-session.js +480 -0
- package/src/lib/pricing/curated-overrides.json +35 -0
- package/src/lib/pricing/matcher.js +44 -15
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/session-analytics.js +54 -8
- package/dashboard/dist/assets/DialogDescription-BzbzETUC.js +0 -1
- package/dashboard/dist/assets/use-reduced-motion-DatTtp2N.js +0 -1
|
@@ -38,6 +38,7 @@ const { readCursorStateSummary } = require("./cursor-store");
|
|
|
38
38
|
const { USD_TICKS_PER_USD, normalizeGrokUsage } = require("./grok-usage");
|
|
39
39
|
const wsl = require("./wsl-probe");
|
|
40
40
|
const { discoverKimiWireFiles, kimiSessionDependencies, readKimiSessions } = require("./kimi-session");
|
|
41
|
+
const { discoverOmpSessionFiles, ompSessionDependencies, readOmpSessions } = require("./omp-session");
|
|
41
42
|
const {
|
|
42
43
|
appendUniqueDirs,
|
|
43
44
|
dedupeDirsByRealpath,
|
|
@@ -89,7 +90,8 @@ const {
|
|
|
89
90
|
// v25 adds Kimi wire sessions, including official/legacy migration dedup.
|
|
90
91
|
// v26 retains Codex Ultrafast (service_tier ultrafast) subset columns so
|
|
91
92
|
// date-filtered session views and cached sidecars keep the 6x premium.
|
|
92
|
-
|
|
93
|
+
// v27 adds oh-my-pi (omp) sessions from ~/.omp/agent/sessions/**/*.jsonl.
|
|
94
|
+
const SIDECAR_VERSION = 27;
|
|
93
95
|
const EDIT_TOOLS = new Set([
|
|
94
96
|
"apply_patch",
|
|
95
97
|
"edit",
|
|
@@ -1948,6 +1950,26 @@ async function scanKimiSessions(filePaths) {
|
|
|
1948
1950
|
}));
|
|
1949
1951
|
}
|
|
1950
1952
|
|
|
1953
|
+
async function scanOmpSessions(filePaths) {
|
|
1954
|
+
// Batch the whole OMP inventory so fork copies that reuse entry ids are
|
|
1955
|
+
// counted once across sessions (same contract as the hourly seenIds set).
|
|
1956
|
+
const rows = await readOmpSessions(Array.isArray(filePaths) ? filePaths : [filePaths]);
|
|
1957
|
+
return rows.map(({ identity, files, title, ...row }) => finalizeRecord({
|
|
1958
|
+
...row,
|
|
1959
|
+
title: cleanSessionTitle(title),
|
|
1960
|
+
version: SIDECAR_VERSION,
|
|
1961
|
+
source: "omp",
|
|
1962
|
+
session_hash: sessionHash("omp", identity),
|
|
1963
|
+
project_key: projectKey(row.project_ref, files[0]),
|
|
1964
|
+
...sessionStorageUsage(files),
|
|
1965
|
+
}));
|
|
1966
|
+
}
|
|
1967
|
+
|
|
1968
|
+
async function scanOmpSession(filePath) {
|
|
1969
|
+
const rows = await scanOmpSessions([filePath]);
|
|
1970
|
+
return rows[0] || null;
|
|
1971
|
+
}
|
|
1972
|
+
|
|
1951
1973
|
async function discoverSessionFiles(home, env = process.env, deps = {}) {
|
|
1952
1974
|
const grokHome = resolveGrokHome(home);
|
|
1953
1975
|
// config.scanRoots (#657): read from the tracker config unless the caller
|
|
@@ -2040,7 +2062,12 @@ async function discoverSessionFiles(home, env = process.env, deps = {}) {
|
|
|
2040
2062
|
return roots;
|
|
2041
2063
|
});
|
|
2042
2064
|
const kimi = discoverKimiWireFiles(dedupeDirsByRealpath(kimiRoots), incomplete);
|
|
2043
|
-
|
|
2065
|
+
const usingMachineHome = path.resolve(home) === path.resolve((deps.homedir || os.homedir)());
|
|
2066
|
+
const ompEnv = usingMachineHome
|
|
2067
|
+
? { ...env, HOME: home }
|
|
2068
|
+
: { HOME: home, OMP_HOME: path.join(home, ".omp") };
|
|
2069
|
+
const omp = discoverOmpSessionFiles(ompEnv, incomplete);
|
|
2070
|
+
return { claude, codex: groupCodexFiles([...codex, ...archived]), grok, zcode, opencode, kimi, omp, incomplete };
|
|
2044
2071
|
}
|
|
2045
2072
|
|
|
2046
2073
|
// Warn once per unreadable directory per process: the dashboard polls this
|
|
@@ -2144,6 +2171,9 @@ function analyticsEntryStatKey(source, filePath) {
|
|
|
2144
2171
|
if (source === "kimi") {
|
|
2145
2172
|
return `${sessionStat}|metadata:${filesSignature(kimiSessionDependencies(filePaths))}`;
|
|
2146
2173
|
}
|
|
2174
|
+
if (source === "omp") {
|
|
2175
|
+
return `${sessionStat}|metadata:${filesSignature(ompSessionDependencies([filePaths].flat()))}`;
|
|
2176
|
+
}
|
|
2147
2177
|
if (source === "grok") {
|
|
2148
2178
|
const primary = filePaths[0];
|
|
2149
2179
|
return `${sessionStat}|summary:${sessionFileStatKey(grokSummaryPathFor(primary)) || "missing"}|signals:${sessionFileStatKey(grokSignalsPathFor(primary)) || "missing"}`;
|
|
@@ -2185,13 +2215,15 @@ async function buildSessionAnalyticsInternal({ home = os.homedir(), force = fals
|
|
|
2185
2215
|
const retryOpencodeScan = fs.existsSync(incompleteOpencodePath);
|
|
2186
2216
|
const incompleteKimiPath = `${metaPath}.kimi-incomplete`;
|
|
2187
2217
|
const retryKimiScan = fs.existsSync(incompleteKimiPath);
|
|
2218
|
+
const incompleteOmpPath = `${metaPath}.omp-incomplete`;
|
|
2219
|
+
const retryOmpScan = fs.existsSync(incompleteOmpPath);
|
|
2188
2220
|
let previousMeta = null;
|
|
2189
2221
|
if (!force) {
|
|
2190
2222
|
try {
|
|
2191
2223
|
previousMeta = JSON.parse(fs.readFileSync(metaPath, "utf8"));
|
|
2192
2224
|
const checkedAt = Date.parse(previousMeta.checked_at || previousMeta.generated_at || "");
|
|
2193
2225
|
if (
|
|
2194
|
-
!retryZcodeScan && !retryOpencodeScan && !retryKimiScan && previousMeta.version === SIDECAR_VERSION &&
|
|
2226
|
+
!retryZcodeScan && !retryOpencodeScan && !retryKimiScan && !retryOmpScan && previousMeta.version === SIDECAR_VERSION &&
|
|
2195
2227
|
Number.isFinite(checkedAt) &&
|
|
2196
2228
|
Date.now() - checkedAt < Math.max(0, Number(cacheTtlMs) || 0)
|
|
2197
2229
|
) {
|
|
@@ -2223,13 +2255,15 @@ async function buildSessionAnalyticsInternal({ home = os.homedir(), force = fals
|
|
|
2223
2255
|
...discovered.codex.flat().map(codexTitleIndexPathFor).filter(Boolean),
|
|
2224
2256
|
...discovered.kimi,
|
|
2225
2257
|
...kimiSessionDependencies(discovered.kimi),
|
|
2258
|
+
...discovered.omp,
|
|
2259
|
+
...ompSessionDependencies(discovered.omp),
|
|
2226
2260
|
...discovered.grok,
|
|
2227
2261
|
...discovered.grok.map(grokSummaryPathFor),
|
|
2228
2262
|
...discovered.grok.map(grokSignalsPathFor),
|
|
2229
2263
|
// db + its WAL sidecars: the trio is one logical file for change detection.
|
|
2230
2264
|
...[...(discovered.zcode || []), ...(discovered.opencode || [])].flatMap((dbPath) => [dbPath, `${dbPath}-wal`, `${dbPath}-shm`]),
|
|
2231
2265
|
]);
|
|
2232
|
-
if (!force && !retryZcodeScan && !retryOpencodeScan && !retryKimiScan && previousMeta?.version === SIDECAR_VERSION && previousMeta.signature === signature) {
|
|
2266
|
+
if (!force && !retryZcodeScan && !retryOpencodeScan && !retryKimiScan && !retryOmpScan && previousMeta?.version === SIDECAR_VERSION && previousMeta.signature === signature) {
|
|
2233
2267
|
await writeAtomic(metaPath, `${JSON.stringify({ ...previousMeta, checked_at: new Date().toISOString() })}\n`);
|
|
2234
2268
|
return readSidecar(sidecarPath);
|
|
2235
2269
|
}
|
|
@@ -2252,6 +2286,7 @@ async function buildSessionAnalyticsInternal({ home = os.homedir(), force = fals
|
|
|
2252
2286
|
...(discovered.zcode.length ? [{ source: "zcode", filePath: discovered.zcode, scan: scanZcodeSessions }] : []),
|
|
2253
2287
|
...(discovered.opencode.length ? [{ source: "opencode", filePath: discovered.opencode, scan: scanOpencodeSessions }] : []),
|
|
2254
2288
|
...(discovered.kimi.length ? [{ source: "kimi", filePath: discovered.kimi, scan: scanKimiSessions }] : []),
|
|
2289
|
+
...(discovered.omp.length ? [{ source: "omp", filePath: discovered.omp, scan: scanOmpSessions }] : []),
|
|
2255
2290
|
];
|
|
2256
2291
|
// Files we could not turn into a row (permission denied, half-written line,
|
|
2257
2292
|
// vanished mid-scan). Swallowing these silently made sessions disappear with
|
|
@@ -2260,6 +2295,7 @@ async function buildSessionAnalyticsInternal({ home = os.homedir(), force = fals
|
|
|
2260
2295
|
let incompleteZcodeScan = false;
|
|
2261
2296
|
let incompleteOpencodeScan = false;
|
|
2262
2297
|
let incompleteKimiScan = false;
|
|
2298
|
+
let incompleteOmpScan = false;
|
|
2263
2299
|
for (const entry of entries) {
|
|
2264
2300
|
const cacheKey = sessionFileCacheKey(entry.source, entry.filePath);
|
|
2265
2301
|
const statKey = analyticsEntryStatKey(entry.source, entry.filePath);
|
|
@@ -2268,11 +2304,12 @@ async function buildSessionAnalyticsInternal({ home = os.homedir(), force = fals
|
|
|
2268
2304
|
if (entry.source === "zcode") incompleteZcodeScan = true;
|
|
2269
2305
|
if (entry.source === "opencode") incompleteOpencodeScan = true;
|
|
2270
2306
|
if (entry.source === "kimi") incompleteKimiScan = true;
|
|
2307
|
+
if (entry.source === "omp") incompleteOmpScan = true;
|
|
2271
2308
|
continue;
|
|
2272
2309
|
}
|
|
2273
2310
|
let rows = null;
|
|
2274
|
-
if (!force && !(entry.source === "zcode" && retryZcodeScan) && !(entry.source === "opencode" && retryOpencodeScan) && !(entry.source === "kimi" && retryKimiScan) && previousFiles[cacheKey]?.stat_key === statKey) {
|
|
2275
|
-
if (entry.source === "zcode" || entry.source === "opencode" || entry.source === "kimi") {
|
|
2311
|
+
if (!force && !(entry.source === "zcode" && retryZcodeScan) && !(entry.source === "opencode" && retryOpencodeScan) && !(entry.source === "kimi" && retryKimiScan) && !(entry.source === "omp" && retryOmpScan) && previousFiles[cacheKey]?.stat_key === statKey) {
|
|
2312
|
+
if (entry.source === "zcode" || entry.source === "opencode" || entry.source === "kimi" || entry.source === "omp") {
|
|
2276
2313
|
// One db scans to many cached rows; recover them all from the previous
|
|
2277
2314
|
// pass. An empty recovery means the sidecar lost its rows — rescan.
|
|
2278
2315
|
const cached = previousRows.filter((row) => row?.source === entry.source);
|
|
@@ -2293,6 +2330,7 @@ async function buildSessionAnalyticsInternal({ home = os.homedir(), force = fals
|
|
|
2293
2330
|
if (entry.source === "zcode") incompleteZcodeScan = true;
|
|
2294
2331
|
if (entry.source === "opencode") incompleteOpencodeScan = true;
|
|
2295
2332
|
if (entry.source === "kimi") incompleteKimiScan = true;
|
|
2333
|
+
if (entry.source === "omp") incompleteOmpScan = true;
|
|
2296
2334
|
if (!process.env.NODE_TEST_CONTEXT) {
|
|
2297
2335
|
console.warn(`[session-analytics] skipped ${entry.source} session file: ${error?.message || error}`);
|
|
2298
2336
|
}
|
|
@@ -2306,7 +2344,7 @@ async function buildSessionAnalyticsInternal({ home = os.homedir(), force = fals
|
|
|
2306
2344
|
// so key each by the db path plus its session id; a bare session id as a
|
|
2307
2345
|
// separate path element would be path.resolve()d against the process cwd
|
|
2308
2346
|
// and never match across runs.
|
|
2309
|
-
row._cache_key = (entry.source === "zcode" || entry.source === "opencode" || entry.source === "kimi") && (row.session_id || row.session_hash)
|
|
2347
|
+
row._cache_key = (entry.source === "zcode" || entry.source === "opencode" || entry.source === "kimi" || entry.source === "omp") && (row.session_id || row.session_hash)
|
|
2310
2348
|
? `${cacheKey}#${sessionHash(entry.source, row.session_id || row.session_hash)}`
|
|
2311
2349
|
: cacheKey;
|
|
2312
2350
|
sessions.push(row);
|
|
@@ -2330,10 +2368,14 @@ async function buildSessionAnalyticsInternal({ home = os.homedir(), force = fals
|
|
|
2330
2368
|
await writeAtomic(incompleteKimiPath, "1\n");
|
|
2331
2369
|
sessions.push(...readSidecar(sidecarPath).filter((row) => row.source === "kimi" && row.version === SIDECAR_VERSION));
|
|
2332
2370
|
}
|
|
2371
|
+
if (incompleteOmpScan) {
|
|
2372
|
+
await writeAtomic(incompleteOmpPath, "1\n");
|
|
2373
|
+
sessions.push(...readSidecar(sidecarPath).filter((row) => row.source === "omp" && row.version === SIDECAR_VERSION));
|
|
2374
|
+
}
|
|
2333
2375
|
sessions.sort((a, b) => String(b.ended_at || "").localeCompare(String(a.ended_at || "")));
|
|
2334
2376
|
// A failed database scan is an incomplete inventory. Keep the last complete
|
|
2335
2377
|
// snapshot and signature so an unchanged database is retried next build.
|
|
2336
|
-
if (incompleteDirs.length === 0 && !incompleteZcodeScan && !incompleteOpencodeScan && !incompleteKimiScan) {
|
|
2378
|
+
if (incompleteDirs.length === 0 && !incompleteZcodeScan && !incompleteOpencodeScan && !incompleteKimiScan && !incompleteOmpScan) {
|
|
2337
2379
|
const content = sessions.map(serializeSessionRecord).join("\n") + (sessions.length ? "\n" : "");
|
|
2338
2380
|
await writeAtomic(sidecarPath, content);
|
|
2339
2381
|
const generatedAt = new Date().toISOString();
|
|
@@ -2347,6 +2389,7 @@ async function buildSessionAnalyticsInternal({ home = os.homedir(), force = fals
|
|
|
2347
2389
|
await fsp.rm(incompleteZcodePath, { force: true });
|
|
2348
2390
|
await fsp.rm(incompleteOpencodePath, { force: true });
|
|
2349
2391
|
await fsp.rm(incompleteKimiPath, { force: true });
|
|
2392
|
+
await fsp.rm(incompleteOmpPath, { force: true });
|
|
2350
2393
|
}
|
|
2351
2394
|
// Non-enumerable so the array still behaves exactly like a plain row list
|
|
2352
2395
|
// for every existing caller (map/filter/JSON of the rows is unaffected).
|
|
@@ -2632,6 +2675,7 @@ function resumeCommandFor(source, sessionId) {
|
|
|
2632
2675
|
// Grok Build: `grok --resume <session-id>` (also accepts a title). The
|
|
2633
2676
|
// command must still be run from the session's project_ref cwd.
|
|
2634
2677
|
if (source === "grok") return `grok --resume ${id}`;
|
|
2678
|
+
if (source === "omp") return `omp --resume ${id}`;
|
|
2635
2679
|
return null;
|
|
2636
2680
|
}
|
|
2637
2681
|
|
|
@@ -2973,6 +3017,8 @@ module.exports = {
|
|
|
2973
3017
|
scanZcodeSessions,
|
|
2974
3018
|
scanOpencodeSessions,
|
|
2975
3019
|
scanKimiSessions,
|
|
3020
|
+
scanOmpSessions,
|
|
3021
|
+
scanOmpSession,
|
|
2976
3022
|
buildSessionAnalytics,
|
|
2977
3023
|
summarizeSessions,
|
|
2978
3024
|
listSessionsForBrowser,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as n,J as a}from"./__vite-browser-external-ClVJNQu3.js";import{u as p}from"./DialogTitle-Cd_k-Nyw.js";import{u as c}from"./composite-CdExmgTx.js";const x=n.forwardRef(function(e,r){const{render:l,className:u,style:m,id:s,...t}=e,i=p(),o=c(s);return i.useSyncedValueWithCleanup("descriptionElementId",o),a("p",e,{ref:r,props:[{id:o},t]})});export{x as D};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as o}from"./__vite-browser-external-ClVJNQu3.js";import{h as r,i as t,p as s}from"./react-DMs4C4qS.js";function i(){!r.current&&t();const[e]=o.useState(s.current);return e}export{i as u};
|