codex-token-tracker 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -0
- package/README.md +40 -7
- package/dist/cli.js +709 -180
- package/dist/main.js +393 -81
- package/dist/preload.js +2 -0
- package/dist/renderer/renderer.js +131 -4
- package/dist/renderer/styles.css +30 -0
- package/package.json +17 -14
package/dist/preload.js
CHANGED
|
@@ -16,6 +16,8 @@ var bridge = {
|
|
|
16
16
|
cancelLogin: () => import_electron.ipcRenderer.invoke("auth:cancel"),
|
|
17
17
|
logout: () => import_electron.ipcRenderer.invoke("auth:logout"),
|
|
18
18
|
refresh: () => import_electron.ipcRenderer.invoke("refresh"),
|
|
19
|
+
checkUpdate: () => import_electron.ipcRenderer.invoke("update:check"),
|
|
20
|
+
installUpdate: () => import_electron.ipcRenderer.invoke("update:install"),
|
|
19
21
|
quit: () => import_electron.ipcRenderer.invoke("quit")
|
|
20
22
|
};
|
|
21
23
|
import_electron.contextBridge.exposeInMainWorld("codexTracker", bridge);
|
|
@@ -12758,6 +12758,70 @@
|
|
|
12758
12758
|
// src/renderer/App.tsx
|
|
12759
12759
|
var import_react2 = __toESM(require_react());
|
|
12760
12760
|
|
|
12761
|
+
// ../shared/src/pricing.ts
|
|
12762
|
+
var LONG_CONTEXT_THRESHOLD = 272e3;
|
|
12763
|
+
var long = (threshold, input, cachedInput, output) => ({
|
|
12764
|
+
threshold,
|
|
12765
|
+
input,
|
|
12766
|
+
cachedInput,
|
|
12767
|
+
output
|
|
12768
|
+
});
|
|
12769
|
+
var DEFAULT_PRICING = {
|
|
12770
|
+
// GPT-5.6 family
|
|
12771
|
+
"gpt-5.6-sol": { input: 4, cachedInput: 0.4, output: 20, long: long(LONG_CONTEXT_THRESHOLD, 8, 0.8, 30) },
|
|
12772
|
+
"gpt-5.6-sol-codex": { input: 4, cachedInput: 0.4, output: 20, long: long(LONG_CONTEXT_THRESHOLD, 8, 0.8, 30) },
|
|
12773
|
+
"gpt-5.6-terra": { input: 2, cachedInput: 0.2, output: 12, long: long(LONG_CONTEXT_THRESHOLD, 4, 0.4, 18) },
|
|
12774
|
+
"gpt-5.6-terra-codex": { input: 2, cachedInput: 0.2, output: 12, long: long(LONG_CONTEXT_THRESHOLD, 4, 0.4, 18) },
|
|
12775
|
+
"gpt-5.6-luna": { input: 0.2, cachedInput: 0.02, output: 1.2, long: long(LONG_CONTEXT_THRESHOLD, 0.4, 0.04, 1.8) },
|
|
12776
|
+
"gpt-5.6-cyber": { input: 12.5, cachedInput: 1.25, output: 75 },
|
|
12777
|
+
// GPT-5.5 family
|
|
12778
|
+
"gpt-5.5": { input: 5, cachedInput: 0.5, output: 30, long: long(LONG_CONTEXT_THRESHOLD, 10, 1, 45) },
|
|
12779
|
+
"gpt-5.5-codex": { input: 5, cachedInput: 0.5, output: 30, long: long(LONG_CONTEXT_THRESHOLD, 10, 1, 45) },
|
|
12780
|
+
"gpt-5.5-pro": { input: 30, cachedInput: 30, output: 180, long: long(LONG_CONTEXT_THRESHOLD, 60, 60, 270) },
|
|
12781
|
+
"gpt-5.5-cyber": { input: 12.5, cachedInput: 1.25, output: 75 },
|
|
12782
|
+
// GPT-5.4 family
|
|
12783
|
+
"gpt-5.4": { input: 2.5, cachedInput: 0.25, output: 15, long: long(LONG_CONTEXT_THRESHOLD, 5, 0.5, 22.5) },
|
|
12784
|
+
"gpt-5.4-codex": { input: 2.5, cachedInput: 0.25, output: 15, long: long(LONG_CONTEXT_THRESHOLD, 5, 0.5, 22.5) },
|
|
12785
|
+
"gpt-5.4-mini": { input: 0.75, cachedInput: 0.075, output: 4.5 },
|
|
12786
|
+
"gpt-5.4-nano": { input: 0.2, cachedInput: 0.02, output: 1.25 },
|
|
12787
|
+
"gpt-5.4-pro": { input: 30, cachedInput: 30, output: 180, long: long(LONG_CONTEXT_THRESHOLD, 60, 60, 270) },
|
|
12788
|
+
// GPT-5.3 family (Codex-only release)
|
|
12789
|
+
"gpt-5.3": { input: 1.75, cachedInput: 0.175, output: 14 },
|
|
12790
|
+
"gpt-5.3-codex": { input: 1.75, cachedInput: 0.175, output: 14 },
|
|
12791
|
+
// GPT-5.2 family
|
|
12792
|
+
"gpt-5.2": { input: 1.75, cachedInput: 0.175, output: 14 },
|
|
12793
|
+
"gpt-5.2-codex": { input: 1.75, cachedInput: 0.175, output: 14 },
|
|
12794
|
+
"gpt-5.2-pro": { input: 21, cachedInput: 21, output: 168 },
|
|
12795
|
+
// GPT-5.1 family
|
|
12796
|
+
"gpt-5.1": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
12797
|
+
"gpt-5.1-codex": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
12798
|
+
"gpt-5.1-codex-max": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
12799
|
+
"gpt-5.1-codex-mini": { input: 0.25, cachedInput: 0.025, output: 2 },
|
|
12800
|
+
// GPT-5 family
|
|
12801
|
+
"gpt-5": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
12802
|
+
"gpt-5-codex": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
12803
|
+
"gpt-5-mini": { input: 0.25, cachedInput: 0.025, output: 2 },
|
|
12804
|
+
"gpt-5-nano": { input: 0.05, cachedInput: 5e-3, output: 0.4 },
|
|
12805
|
+
"gpt-5-pro": { input: 15, cachedInput: 15, output: 120 },
|
|
12806
|
+
"gpt-5-search-api": { input: 1.25, cachedInput: 0.125, output: 10 },
|
|
12807
|
+
// ChatGPT-tuned endpoint
|
|
12808
|
+
"chat-latest": { input: 5, cachedInput: 0.5, output: 30 },
|
|
12809
|
+
// GPT-4.1 / 4o family
|
|
12810
|
+
"gpt-4.1": { input: 2, cachedInput: 0.5, output: 8 },
|
|
12811
|
+
"gpt-4.1-mini": { input: 0.4, cachedInput: 0.1, output: 1.6 },
|
|
12812
|
+
"gpt-4.1-nano": { input: 0.1, cachedInput: 0.025, output: 0.4 },
|
|
12813
|
+
"gpt-4o": { input: 2.5, cachedInput: 1.25, output: 10 },
|
|
12814
|
+
"gpt-4o-mini": { input: 0.15, cachedInput: 0.075, output: 0.6 },
|
|
12815
|
+
// Reasoning models
|
|
12816
|
+
o1: { input: 15, cachedInput: 7.5, output: 60 },
|
|
12817
|
+
"o1-pro": { input: 150, cachedInput: 150, output: 600 },
|
|
12818
|
+
o3: { input: 2, cachedInput: 0.5, output: 8 },
|
|
12819
|
+
"o3-pro": { input: 20, cachedInput: 20, output: 80 },
|
|
12820
|
+
"o3-mini": { input: 1.1, cachedInput: 0.55, output: 4.4 },
|
|
12821
|
+
"o4-mini": { input: 1.1, cachedInput: 0.275, output: 4.4 },
|
|
12822
|
+
"codex-mini-latest": { input: 1.5, cachedInput: 0.375, output: 6 }
|
|
12823
|
+
};
|
|
12824
|
+
|
|
12761
12825
|
// ../shared/src/time.ts
|
|
12762
12826
|
var SECOND = 1e3;
|
|
12763
12827
|
var MINUTE = 60 * SECOND;
|
|
@@ -12935,8 +12999,20 @@
|
|
|
12935
12999
|
never: "never",
|
|
12936
13000
|
local: "Local",
|
|
12937
13001
|
remote: "Other devices",
|
|
13002
|
+
// updates
|
|
13003
|
+
update: "Update",
|
|
13004
|
+
updateAvailable: "Update to v{version}",
|
|
13005
|
+
updateNewVersion: "Version {version} is available (you have v{current})",
|
|
13006
|
+
updateUpToDate: "Up to date",
|
|
13007
|
+
updateChecking: "Checking\u2026",
|
|
13008
|
+
updateInstalling: "Installing\u2026",
|
|
13009
|
+
updateInstalled: "Updated to v{version} \u2014 restart to apply",
|
|
13010
|
+
updateFailed: "Update failed \u2014 run this yourself:",
|
|
13011
|
+
updateCheckFailed: "Update check failed: {message}",
|
|
13012
|
+
checkForUpdates: "Check for updates",
|
|
13013
|
+
releaseNotes: "Release notes",
|
|
12938
13014
|
// CLI
|
|
12939
|
-
cliUsage: `Usage: codex-tracker [command] [options]
|
|
13015
|
+
cliUsage: `Usage: codex-token-tracker [command] [options] (alias: codex-tracker)
|
|
12940
13016
|
|
|
12941
13017
|
Commands:
|
|
12942
13018
|
(none) Start the menu bar app (falls back to agent mode without a display)
|
|
@@ -12947,10 +13023,12 @@ Commands:
|
|
|
12947
13023
|
logout Disconnect this device
|
|
12948
13024
|
status Print today's usage, live session and rate limits
|
|
12949
13025
|
paths Show detected session directories (Codex, pi, OpenCode, Cline/Roo/Kilo, Hermes, custom)
|
|
13026
|
+
update Install the newest published version (--check only reports)
|
|
12950
13027
|
config get|set Read or change settings (config set uploadIntervalSec 30, config set sources.pi false)
|
|
12951
13028
|
lang <en|zh|auto> Set the display language
|
|
12952
13029
|
|
|
12953
13030
|
Options:
|
|
13031
|
+
--check update: report the newest version without installing it
|
|
12954
13032
|
--dashboard <url> Dashboard URL (self-hosted)
|
|
12955
13033
|
--background Start the menu bar app detached and return
|
|
12956
13034
|
--version, -v Print version
|
|
@@ -12959,6 +13037,8 @@ Options:
|
|
|
12959
13037
|
cliUnknownCommand: "Unknown command: {command}",
|
|
12960
13038
|
cliNoDisplay: "No display detected \u2014 starting agent mode (run `codex-tracker menubar` on a desktop).",
|
|
12961
13039
|
cliNoElectron: "Electron is not installed (optional dependency) \u2014 starting agent mode.",
|
|
13040
|
+
cliDownloadingElectron: "Electron runtime not found \u2014 downloading it now (about 100 MB, one time)\u2026",
|
|
13041
|
+
cliElectronDownloadFailed: "Electron download failed. Retry with `npm install -g codex-token-tracker --allow-scripts=electron` or `npm rebuild -g electron`; the headless `codex-tracker agent` works without it.",
|
|
12962
13042
|
cliStartingMenubar: "Starting menu bar app\u2026",
|
|
12963
13043
|
cliLoginStart: "Connecting this device to {dashboard}",
|
|
12964
13044
|
cliLoginCode: "Your code: {code}",
|
|
@@ -12990,7 +13070,13 @@ Options:
|
|
|
12990
13070
|
cliConfigSet: "Set {key} = {value}",
|
|
12991
13071
|
cliConfigUnknownKey: "Unknown config key: {key}. Keys: {keys}",
|
|
12992
13072
|
cliLangSet: "Language set to {lang}",
|
|
12993
|
-
cliConfigDir: "Config: {dir}"
|
|
13073
|
+
cliConfigDir: "Config: {dir}",
|
|
13074
|
+
cliUpdateLatest: "codex-token-tracker {version} is the latest version.",
|
|
13075
|
+
cliUpdateAvailable: "Update available: {current} \u2192 {latest}",
|
|
13076
|
+
cliUpdateRunning: "Running: {command}",
|
|
13077
|
+
cliUpdateDone: "Updated to {version}. Restart the menu bar app (or rerun the CLI) to use it.",
|
|
13078
|
+
cliUpdateFailed: "Update failed (exit {code}). Run it yourself: {command}",
|
|
13079
|
+
cliUpdateCheckFailed: "Could not reach the npm registry: {message}"
|
|
12994
13080
|
};
|
|
12995
13081
|
|
|
12996
13082
|
// src/i18n/zh.ts
|
|
@@ -13064,7 +13150,18 @@ Options:
|
|
|
13064
13150
|
never: "\u4ECE\u672A",
|
|
13065
13151
|
local: "\u672C\u673A",
|
|
13066
13152
|
remote: "\u5176\u4ED6\u8BBE\u5907",
|
|
13067
|
-
|
|
13153
|
+
update: "\u66F4\u65B0",
|
|
13154
|
+
updateAvailable: "\u66F4\u65B0\u5230 v{version}",
|
|
13155
|
+
updateNewVersion: "\u6709\u65B0\u7248\u672C {version}\uFF08\u5F53\u524D v{current}\uFF09",
|
|
13156
|
+
updateUpToDate: "\u5DF2\u662F\u6700\u65B0\u7248\u672C",
|
|
13157
|
+
updateChecking: "\u68C0\u67E5\u4E2D\u2026",
|
|
13158
|
+
updateInstalling: "\u5B89\u88C5\u4E2D\u2026",
|
|
13159
|
+
updateInstalled: "\u5DF2\u66F4\u65B0\u5230 v{version} \u2014 \u91CD\u542F\u540E\u751F\u6548",
|
|
13160
|
+
updateFailed: "\u66F4\u65B0\u5931\u8D25 \u2014 \u8BF7\u624B\u52A8\u6267\u884C\uFF1A",
|
|
13161
|
+
updateCheckFailed: "\u68C0\u67E5\u66F4\u65B0\u5931\u8D25\uFF1A{message}",
|
|
13162
|
+
checkForUpdates: "\u68C0\u67E5\u66F4\u65B0",
|
|
13163
|
+
releaseNotes: "\u66F4\u65B0\u65E5\u5FD7",
|
|
13164
|
+
cliUsage: `\u7528\u6CD5\uFF1Acodex-token-tracker [\u547D\u4EE4] [\u9009\u9879] \uFF08\u522B\u540D\uFF1Acodex-tracker\uFF09
|
|
13068
13165
|
|
|
13069
13166
|
\u547D\u4EE4\uFF1A
|
|
13070
13167
|
(\u65E0) \u542F\u52A8\u83DC\u5355\u680F\u5E94\u7528\uFF08\u65E0\u663E\u793A\u73AF\u5883\u65F6\u81EA\u52A8\u5207\u6362\u4E3A agent \u6A21\u5F0F\uFF09
|
|
@@ -13075,10 +13172,12 @@ Options:
|
|
|
13075
13172
|
logout \u65AD\u5F00\u672C\u8BBE\u5907
|
|
13076
13173
|
status \u6253\u5370\u4ECA\u65E5\u7528\u91CF\u3001\u5B9E\u65F6\u4F1A\u8BDD\u4E0E\u9650\u989D
|
|
13077
13174
|
paths \u663E\u793A\u68C0\u6D4B\u5230\u7684\u4F1A\u8BDD\u76EE\u5F55\uFF08Codex\u3001pi\u3001OpenCode\u3001Cline/Roo/Kilo\u3001Hermes\u3001\u81EA\u5B9A\u4E49\uFF09
|
|
13175
|
+
update \u5B89\u88C5\u6700\u65B0\u53D1\u5E03\u7248\u672C\uFF08--check \u53EA\u68C0\u67E5\u4E0D\u5B89\u88C5\uFF09
|
|
13078
13176
|
config get|set \u8BFB\u53D6\u6216\u4FEE\u6539\u8BBE\u7F6E\uFF08config set uploadIntervalSec 30\uFF0Cconfig set sources.pi false\uFF09
|
|
13079
13177
|
lang <en|zh|auto> \u8BBE\u7F6E\u663E\u793A\u8BED\u8A00
|
|
13080
13178
|
|
|
13081
13179
|
\u9009\u9879\uFF1A
|
|
13180
|
+
--check update\uFF1A\u53EA\u62A5\u544A\u6700\u65B0\u7248\u672C\uFF0C\u4E0D\u6267\u884C\u5B89\u88C5
|
|
13082
13181
|
--dashboard <url> \u4EEA\u8868\u76D8\u5730\u5740\uFF08\u81EA\u6258\u7BA1\uFF09
|
|
13083
13182
|
--background \u4EE5\u540E\u53F0\u65B9\u5F0F\u542F\u52A8\u83DC\u5355\u680F\u5E94\u7528\u5E76\u7ACB\u5373\u8FD4\u56DE
|
|
13084
13183
|
--version, -v \u663E\u793A\u7248\u672C
|
|
@@ -13087,6 +13186,8 @@ Options:
|
|
|
13087
13186
|
cliUnknownCommand: "\u672A\u77E5\u547D\u4EE4\uFF1A{command}",
|
|
13088
13187
|
cliNoDisplay: "\u672A\u68C0\u6D4B\u5230\u663E\u793A\u73AF\u5883 \u2014 \u4EE5 agent \u6A21\u5F0F\u542F\u52A8\uFF08\u684C\u9762\u73AF\u5883\u8BF7\u8FD0\u884C `codex-tracker menubar`\uFF09\u3002",
|
|
13089
13188
|
cliNoElectron: "\u672A\u5B89\u88C5 Electron\uFF08\u53EF\u9009\u4F9D\u8D56\uFF09\u2014 \u4EE5 agent \u6A21\u5F0F\u542F\u52A8\u3002",
|
|
13189
|
+
cliDownloadingElectron: "\u672A\u627E\u5230 Electron \u8FD0\u884C\u65F6\uFF0C\u6B63\u5728\u4E0B\u8F7D\uFF08\u7EA6 100 MB\uFF0C\u4EC5\u9700\u4E00\u6B21\uFF09\u2026",
|
|
13190
|
+
cliElectronDownloadFailed: "Electron \u4E0B\u8F7D\u5931\u8D25\u3002\u53EF\u91CD\u8BD5 `npm install -g codex-token-tracker --allow-scripts=electron` \u6216 `npm rebuild -g electron`\uFF1B\u65E0\u754C\u9762\u7684 `codex-tracker agent` \u65E0\u9700 Electron\u3002",
|
|
13090
13191
|
cliStartingMenubar: "\u6B63\u5728\u542F\u52A8\u83DC\u5355\u680F\u5E94\u7528\u2026",
|
|
13091
13192
|
cliLoginStart: "\u6B63\u5728\u5C06\u672C\u8BBE\u5907\u8FDE\u63A5\u5230 {dashboard}",
|
|
13092
13193
|
cliLoginCode: "\u4F60\u7684\u4EE3\u7801\uFF1A{code}",
|
|
@@ -13118,7 +13219,13 @@ Options:
|
|
|
13118
13219
|
cliConfigSet: "\u5DF2\u8BBE\u7F6E {key} = {value}",
|
|
13119
13220
|
cliConfigUnknownKey: "\u672A\u77E5\u914D\u7F6E\u9879\uFF1A{key}\u3002\u53EF\u7528\uFF1A{keys}",
|
|
13120
13221
|
cliLangSet: "\u8BED\u8A00\u5DF2\u8BBE\u7F6E\u4E3A {lang}",
|
|
13121
|
-
cliConfigDir: "\u914D\u7F6E\u76EE\u5F55\uFF1A{dir}"
|
|
13222
|
+
cliConfigDir: "\u914D\u7F6E\u76EE\u5F55\uFF1A{dir}",
|
|
13223
|
+
cliUpdateLatest: "codex-token-tracker {version} \u5DF2\u662F\u6700\u65B0\u7248\u672C\u3002",
|
|
13224
|
+
cliUpdateAvailable: "\u53D1\u73B0\u65B0\u7248\u672C\uFF1A{current} \u2192 {latest}",
|
|
13225
|
+
cliUpdateRunning: "\u6B63\u5728\u6267\u884C\uFF1A{command}",
|
|
13226
|
+
cliUpdateDone: "\u5DF2\u66F4\u65B0\u5230 {version}\u3002\u8BF7\u91CD\u542F\u83DC\u5355\u680F\u5E94\u7528\uFF08\u6216\u91CD\u65B0\u8FD0\u884C CLI\uFF09\u4EE5\u751F\u6548\u3002",
|
|
13227
|
+
cliUpdateFailed: "\u66F4\u65B0\u5931\u8D25\uFF08\u9000\u51FA\u7801 {code}\uFF09\u3002\u8BF7\u624B\u52A8\u6267\u884C\uFF1A{command}",
|
|
13228
|
+
cliUpdateCheckFailed: "\u65E0\u6CD5\u8BBF\u95EE npm registry\uFF1A{message}"
|
|
13122
13229
|
};
|
|
13123
13230
|
|
|
13124
13231
|
// src/i18n/index.ts
|
|
@@ -13363,6 +13470,25 @@ Options:
|
|
|
13363
13470
|
function levelClass(pct) {
|
|
13364
13471
|
return pct >= 85 ? "critical" : pct >= 60 ? "warning" : "";
|
|
13365
13472
|
}
|
|
13473
|
+
function UpdateBar({ update, t: t2 }) {
|
|
13474
|
+
if (update.status === "installed") {
|
|
13475
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "update-bar done", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "msg", children: t2("updateInstalled", { version: update.latest ?? "?" }) }) });
|
|
13476
|
+
}
|
|
13477
|
+
if (update.status === "failed") {
|
|
13478
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "update-bar failed", children: [
|
|
13479
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "msg", title: update.log ?? "", children: t2("updateFailed") }),
|
|
13480
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "cmd", children: update.command })
|
|
13481
|
+
] });
|
|
13482
|
+
}
|
|
13483
|
+
if (update.status === "installing") {
|
|
13484
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "update-bar", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "msg", children: t2("updateInstalling") }) });
|
|
13485
|
+
}
|
|
13486
|
+
if (!update.available) return null;
|
|
13487
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "update-bar", children: [
|
|
13488
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "msg", children: t2("updateNewVersion", { version: update.latest ?? "?", current: update.current }) }),
|
|
13489
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { className: "primary", onClick: () => void bridge().installUpdate(), children: t2("update") })
|
|
13490
|
+
] });
|
|
13491
|
+
}
|
|
13366
13492
|
function App() {
|
|
13367
13493
|
const [snap, setSnap] = (0, import_react2.useState)(null);
|
|
13368
13494
|
const [, setClock] = (0, import_react2.useState)(0);
|
|
@@ -13411,6 +13537,7 @@ Options:
|
|
|
13411
13537
|
] })
|
|
13412
13538
|
] }),
|
|
13413
13539
|
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "scroll", children: [
|
|
13540
|
+
snap.update ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(UpdateBar, { update: snap.update, t: t2 }) : null,
|
|
13414
13541
|
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("section", { className: "card", children: [
|
|
13415
13542
|
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "card-title", children: [
|
|
13416
13543
|
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: t2("today") }),
|
package/dist/renderer/styles.css
CHANGED
|
@@ -543,3 +543,33 @@ button.ghost:hover {
|
|
|
543
543
|
.source-line .dot { width: 6px; height: 6px; border-radius: 50%; background: #0ca30c; flex: none; }
|
|
544
544
|
.source-line.stale .dot { background: #fab219; }
|
|
545
545
|
.source-line .err-hint { color: #d03b3b; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
|
|
546
|
+
|
|
547
|
+
/* --- update banner --- */
|
|
548
|
+
.update-bar {
|
|
549
|
+
display: flex;
|
|
550
|
+
align-items: center;
|
|
551
|
+
gap: 8px;
|
|
552
|
+
margin: 10px 12px 0;
|
|
553
|
+
padding: 8px 10px;
|
|
554
|
+
border: 1px solid var(--border);
|
|
555
|
+
border-radius: 8px;
|
|
556
|
+
background: rgba(99, 102, 241, 0.09);
|
|
557
|
+
font-size: 11px;
|
|
558
|
+
color: var(--text);
|
|
559
|
+
}
|
|
560
|
+
.update-bar .msg {
|
|
561
|
+
flex: 1;
|
|
562
|
+
min-width: 0;
|
|
563
|
+
overflow: hidden;
|
|
564
|
+
text-overflow: ellipsis;
|
|
565
|
+
white-space: nowrap;
|
|
566
|
+
}
|
|
567
|
+
.update-bar.failed { background: rgba(208, 59, 59, 0.1); }
|
|
568
|
+
.update-bar.done { background: rgba(12, 163, 12, 0.1); }
|
|
569
|
+
.update-bar button { flex: none; }
|
|
570
|
+
.update-bar .cmd {
|
|
571
|
+
font-family: var(--mono);
|
|
572
|
+
font-size: 10px;
|
|
573
|
+
color: var(--muted);
|
|
574
|
+
user-select: text;
|
|
575
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codex-token-tracker",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Menu bar / system tray app and headless agent that tracks OpenAI Codex token usage, cache hits, model mix and API-equivalent cost — and syncs it to your team dashboard.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Chen Li",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"convex"
|
|
26
26
|
],
|
|
27
27
|
"bin": {
|
|
28
|
+
"codex-token-tracker": "bin/codex-tracker.js",
|
|
28
29
|
"codex-tracker": "bin/codex-tracker.js"
|
|
29
30
|
},
|
|
30
31
|
"main": "dist/main.js",
|
|
@@ -32,7 +33,8 @@
|
|
|
32
33
|
"bin",
|
|
33
34
|
"dist",
|
|
34
35
|
"assets",
|
|
35
|
-
"README.md"
|
|
36
|
+
"README.md",
|
|
37
|
+
"CHANGELOG.md"
|
|
36
38
|
],
|
|
37
39
|
"engines": {
|
|
38
40
|
"node": ">=20"
|
|
@@ -45,6 +47,15 @@
|
|
|
45
47
|
"publishConfig": {
|
|
46
48
|
"access": "public"
|
|
47
49
|
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "node scripts/build.mjs",
|
|
52
|
+
"dev": "node scripts/build.mjs --watch",
|
|
53
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
54
|
+
"start": "node bin/codex-tracker.js",
|
|
55
|
+
"prepublishOnly": "pnpm build && pnpm typecheck",
|
|
56
|
+
"build:icons": "node scripts/gen-icons.mjs",
|
|
57
|
+
"test": "node scripts/test.mjs"
|
|
58
|
+
},
|
|
48
59
|
"dependencies": {
|
|
49
60
|
"menubar": "^9.5.3"
|
|
50
61
|
},
|
|
@@ -52,6 +63,8 @@
|
|
|
52
63
|
"electron": "^38.8.6"
|
|
53
64
|
},
|
|
54
65
|
"devDependencies": {
|
|
66
|
+
"@codex-tracker/backend": "workspace:*",
|
|
67
|
+
"@codex-tracker/shared": "workspace:*",
|
|
55
68
|
"@types/node": "^22.15.0",
|
|
56
69
|
"@types/react": "^19.2.0",
|
|
57
70
|
"@types/react-dom": "^19.2.0",
|
|
@@ -59,16 +72,6 @@
|
|
|
59
72
|
"esbuild": "^0.28.2",
|
|
60
73
|
"react": "19.2.8",
|
|
61
74
|
"react-dom": "19.2.8",
|
|
62
|
-
"typescript": "~5.9.3"
|
|
63
|
-
"@codex-tracker/backend": "0.1.0",
|
|
64
|
-
"@codex-tracker/shared": "0.1.0"
|
|
65
|
-
},
|
|
66
|
-
"scripts": {
|
|
67
|
-
"build": "node scripts/build.mjs",
|
|
68
|
-
"dev": "node scripts/build.mjs --watch",
|
|
69
|
-
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
70
|
-
"start": "node bin/codex-tracker.js",
|
|
71
|
-
"build:icons": "node scripts/gen-icons.mjs",
|
|
72
|
-
"test": "node scripts/test.mjs"
|
|
75
|
+
"typescript": "~5.9.3"
|
|
73
76
|
}
|
|
74
|
-
}
|
|
77
|
+
}
|