tokentracker-cli 0.5.85 → 0.5.87

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.
Files changed (25) hide show
  1. package/README.md +2 -0
  2. package/README.zh-CN.md +401 -0
  3. package/dashboard/dist/assets/{Card-B_KFG3oq.js → Card-BbXzY-fw.js} +1 -1
  4. package/dashboard/dist/assets/DashboardPage-B_Yvna3-.js +12 -0
  5. package/dashboard/dist/assets/{FadeIn-z9ibs7T4.js → FadeIn-Dz3MVtMG.js} +1 -1
  6. package/dashboard/dist/assets/{IpCheckPage-CWj5tnWM.js → IpCheckPage-FulDeMPC.js} +1 -1
  7. package/dashboard/dist/assets/LeaderboardPage-BQSqJVlP.js +5 -0
  8. package/dashboard/dist/assets/{LeaderboardProfilePage-DbqMAmrx.js → LeaderboardProfilePage-DP8bewz7.js} +1 -1
  9. package/dashboard/dist/assets/{LimitsPage-Bpq7_BvB.js → LimitsPage-BXDoE-jU.js} +1 -1
  10. package/dashboard/dist/assets/{ProviderIcon-DWvU1bzk.js → ProviderIcon-DChRpzX_.js} +1 -1
  11. package/dashboard/dist/assets/{SettingsPage-Deo5E2mb.js → SettingsPage-XFSmA7VB.js} +1 -1
  12. package/dashboard/dist/assets/{WidgetsPage-C7jlmd2Z.js → WidgetsPage-D5guzG01.js} +1 -1
  13. package/dashboard/dist/assets/{download-NHSHyCLK.js → download-w3j__M5u.js} +1 -1
  14. package/dashboard/dist/assets/leaderboard-columns-ChIW6uNZ.js +1 -0
  15. package/dashboard/dist/assets/{main-DMsq-RaY.js → main-CJeNIc4Q.js} +63 -41
  16. package/dashboard/dist/assets/main-Cyta3wIj.css +1 -0
  17. package/dashboard/dist/assets/{use-limits-display-prefs-D3Epcst3.js → use-limits-display-prefs-BzI5WJEo.js} +1 -1
  18. package/dashboard/dist/assets/{use-usage-limits-DeXe0IPe.js → use-usage-limits-CuoJnC-V.js} +1 -1
  19. package/dashboard/dist/index.html +2 -2
  20. package/dashboard/dist/share.html +2 -2
  21. package/package.json +1 -1
  22. package/dashboard/dist/assets/DashboardPage-47LAs21Y.js +0 -12
  23. package/dashboard/dist/assets/LeaderboardPage-DMWnWzBj.js +0 -5
  24. package/dashboard/dist/assets/leaderboard-columns-DYokl03m.js +0 -1
  25. package/dashboard/dist/assets/main-v7jzPCYG.css +0 -1
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  # Token Tracker
4
4
 
5
+ **English** · [简体中文](./README.zh-CN.md)
6
+
5
7
  ### Know exactly what you're spending on AI — across every CLI
6
8
 
7
9
  Auto-collect token counts from **10 AI coding tools**, aggregate them locally, and see real cost trends in a beautiful dashboard. No cloud account, no API keys, no setup — just one command.
@@ -0,0 +1,401 @@
1
+ <div align="center">
2
+
3
+ # Token Tracker
4
+
5
+ [English](./README.md) · **简体中文**
6
+
7
+ ### 跨所有 CLI,看清你到底在 AI 上花了多少钱
8
+
9
+ 自动采集 **10+ 款 AI 编码工具** 的 token 用量,全程本地聚合,用一套漂亮的 Dashboard 看真实成本与趋势。不需要云账号、不需要 API Key、不需要任何配置 —— 一条命令搞定。
10
+
11
+ [![npm version](https://img.shields.io/npm/v/tokentracker-cli.svg?color=blue)](https://www.npmjs.com/package/tokentracker-cli)
12
+ [![npm downloads](https://img.shields.io/npm/dm/tokentracker-cli.svg?color=brightgreen)](https://www.npmjs.com/package/tokentracker-cli)
13
+ [![Homebrew](https://img.shields.io/github/v/release/mm7894215/TokenTracker?label=brew&color=F8B73E&logo=homebrew&logoColor=white)](https://github.com/mm7894215/homebrew-tokentracker)
14
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
15
+ [![Platform](https://img.shields.io/badge/macOS-supported-lightgrey.svg)](https://www.apple.com/macos/)
16
+ [![GitHub stars](https://img.shields.io/github/stars/mm7894215/TokenTracker?style=social)](https://github.com/mm7894215/TokenTracker/stargazers)
17
+
18
+ <br/>
19
+
20
+ <img src="https://raw.githubusercontent.com/mm7894215/tokentracker/main/docs/screenshots/dashboard-dark.png" alt="Token Tracker Dashboard" width="820" />
21
+
22
+ <br/><br/>
23
+
24
+ ⭐ **如果 TokenTracker 帮你省了时间,欢迎 [在 GitHub 上 Star](https://github.com/mm7894215/TokenTracker) —— 可以让更多开发者发现它。**
25
+
26
+ <br/>
27
+
28
+ [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/M4M11XSNWD)
29
+
30
+ </div>
31
+
32
+ ---
33
+
34
+ ## ⚡ 快速开始
35
+
36
+ > **环境要求**:Node.js **20+**(CLI 支持 macOS / Linux / Windows;菜单栏 App 与 Cursor 的 SQLite 读取仅限 macOS)。
37
+
38
+ ```bash
39
+ npx tokentracker-cli
40
+ ```
41
+
42
+ 就这一行。首次运行会自动安装 hook、同步数据,并在 `http://localhost:7680` 打开 Dashboard。
43
+
44
+ **30 秒能看到什么:**
45
+ - 📊 本地 Dashboard(`localhost:7680`)—— 用量趋势、模型明细、成本分析
46
+ - 🔌 自动识别并挂接你电脑上所有已安装的 AI 工具
47
+ - 🏠 100% 本地运行 —— 无账号、无 API Key、无网络请求(排行榜是可选的)
48
+
49
+ > **想要原生 macOS 菜单栏 App?** [下载 `TokenTrackerBar.dmg`](https://github.com/mm7894215/TokenTracker/releases/latest) → 拖入「应用程序」即可。包含桌面小组件、菜单栏状态图标,以及同一套 Dashboard(跑在 WKWebView 里)。
50
+
51
+ 全局安装可以少敲字:
52
+
53
+ ```bash
54
+ npm i -g tokentracker-cli
55
+
56
+ tokentracker # 打开 Dashboard
57
+ tokentracker sync # 手动同步
58
+ tokentracker status # 查看 hook 挂接状态
59
+ tokentracker doctor # 健康检查
60
+ ```
61
+
62
+ ### 🍺 Homebrew(macOS)
63
+
64
+ 用惯 `brew` 的话可以直接装,无需额外 `tap`:
65
+
66
+ ```bash
67
+ # macOS 菜单栏 App(DMG)
68
+ brew install --cask mm7894215/tokentracker/tokentracker
69
+
70
+ # 只装 CLI
71
+ brew install mm7894215/tokentracker/tokentracker
72
+ ```
73
+
74
+ 升级:`brew upgrade --cask mm7894215/tokentracker/tokentracker`。每次新版本发布后,tap 会在一小时内自动跟上。
75
+
76
+ ---
77
+
78
+ ## ✨ 特性
79
+
80
+ - 🔌 **开箱即用支持 11 款 AI 工具** —— Claude Code、Codex CLI、Cursor、Gemini CLI、Kiro、OpenCode、OpenClaw、Every Code、Hermes Agent、GitHub Copilot、Kimi Code
81
+ - 🏠 **100% 本地** —— Token 数据绝不离开你的机器。无账号、无 API Key
82
+ - 🚀 **零配置** —— 首次运行自动安装所有 hook。30 秒从零到 Dashboard
83
+ - 📊 **漂亮的 Dashboard** —— 用量趋势、按模型的成本分解、GitHub 风格活跃度热力图、按项目归因
84
+ - 🖥️ **原生 macOS App** —— 菜单栏状态图标 + 内嵌服务 + WKWebView Dashboard
85
+ - 🎨 **4 种桌面小组件** —— 用量 / 热力图 / 热门模型 / 使用限额 直接钉桌面
86
+ - 📈 **实时限额追踪** —— Claude / Codex / Cursor / Gemini / Kiro / Copilot / Antigravity 的配额窗口与重置倒计时
87
+ - 💰 **成本引擎** —— 内置 70+ 模型定价表,精确到 USD
88
+ - 🌐 **可选排行榜** —— 与全球开发者对比;列可拖拽排序,聚焦你关心的 provider(需登录参与)
89
+ - 🔒 **隐私优先** —— 只记录 token 数量与时间戳。**绝不**收集 prompt、回复、文件内容
90
+
91
+ ---
92
+
93
+ ## 🖼️ 截图
94
+
95
+ <table>
96
+ <tr>
97
+ <td width="50%">
98
+
99
+ **Dashboard** —— 用量趋势、模型分布、成本分析
100
+
101
+ <img src="https://raw.githubusercontent.com/mm7894215/tokentracker/main/docs/screenshots/dashboard-light.png" alt="Dashboard" />
102
+
103
+ </td>
104
+ <td width="50%">
105
+
106
+ **桌面小组件** —— 把用量钉在桌面
107
+
108
+ <img src="https://raw.githubusercontent.com/mm7894215/tokentracker/main/docs/screenshots/widgets-overview.png" alt="Desktop Widgets" />
109
+
110
+ </td>
111
+ </tr>
112
+ <tr>
113
+ <td width="50%">
114
+
115
+ **菜单栏 App** —— 带动画的 Clawd 小伙伴 + 原生面板
116
+
117
+ <img src="https://raw.githubusercontent.com/mm7894215/tokentracker/main/docs/screenshots/menubar.gif" alt="Menu Bar App" />
118
+
119
+ </td>
120
+ <td width="50%">
121
+
122
+ **全球排行榜** —— 和世界各地开发者比一比
123
+
124
+ <img src="https://raw.githubusercontent.com/mm7894215/tokentracker/main/docs/screenshots/leaderboard.png" alt="Leaderboard" />
125
+
126
+ </td>
127
+ </tr>
128
+ </table>
129
+
130
+ ---
131
+
132
+ ## 🔌 已支持的 AI 工具
133
+
134
+ | 工具 | 识别方式 | 接入方式 |
135
+ |---|---|---|
136
+ | **Claude Code** | ✅ 自动 | 写入 `settings.json` 的 SessionEnd hook |
137
+ | **Codex CLI** | ✅ 自动 | 写入 `config.toml` 的 TOML notify hook |
138
+ | **Cursor** | ✅ 自动 | API + SQLite 中的 auth token |
139
+ | **Kiro** | ✅ 自动 | SQLite + JSONL 混合读取 |
140
+ | **Gemini CLI** | ✅ 自动 | SessionEnd hook |
141
+ | **OpenCode** | ✅ 自动 | 插件系统 + SQLite |
142
+ | **OpenClaw** | ✅ 自动 | Session 插件 |
143
+ | **Every Code** | ✅ 自动 | TOML notify hook |
144
+ | **Hermes Agent** | ✅ 自动 | SQLite sessions 表(`~/.hermes/state.db`) |
145
+ | **GitHub Copilot** | ✅ 自动 | OpenTelemetry 文件导出(`COPILOT_OTEL_FILE_EXPORTER_PATH`) |
146
+ | **Kimi Code** | ✅ 自动 | 被动读取 `wire.jsonl`(`~/.kimi/sessions/**/wire.jsonl`) |
147
+
148
+ > **需要手动装什么插件 / hook 吗?** 不需要。`tokentracker`(或 `tokentracker init`)第一次跑的时候会全部搞定:
149
+ > - **基于 hook 的工具**(Claude Code、Codex、Gemini、Every Code)—— 我们把 SessionEnd hook 或 TOML notify 条目写入它们自己的配置文件
150
+ > - **基于插件的工具**(OpenCode、**OpenClaw**)—— 插件随 npm 包一起分发(`~/.tokentracker/app/openclaw-plugin/`),通过对应工具自己的 CLI 挂接(`openclaw plugins install --link …` + `enable`)。无需下载、无需拖拽
151
+ > - **被动读取类**(Cursor、Kiro、Hermes、Kimi Code、Copilot)—— 完全不往它们里面塞东西,只读取它们自己产生的文件(SQLite DB、JSONL、OTEL 导出)
152
+ >
153
+ > 任何时候都可以用 `tokentracker status` 查看每个集成的状态。如果显示 `skipped`,`detail` 列会解释原因(例如某工具 CLI 不在 `PATH` 上、config 不可读等)。
154
+ >
155
+ > 更深入的资料:[OpenClaw 集成与排障](docs/openclaw-integration.md)。
156
+
157
+ 工具没在列表里?[提个 Issue](https://github.com/mm7894215/TokenTracker/issues/new) —— 加一个新 provider 通常只是加一个 parser 文件的事。
158
+
159
+ ---
160
+
161
+ ## 🆚 为什么选 TokenTracker?
162
+
163
+ | | **TokenTracker** | ccusage | Cursor 自带统计 |
164
+ |--------------------------|:---:|:---:|:---:|
165
+ | **支持的 AI 工具数** | **10+** | 1(Claude) | 1(Cursor) |
166
+ | **本地优先,无需账号** | ✅ | ✅ | ❌ |
167
+ | **原生菜单栏 App** | ✅ | ❌ | ❌ |
168
+ | **桌面小组件** | ✅ 4 个小组件 | ❌ | ❌ |
169
+ | **限额追踪** | ✅ 7 家 provider | ❌ | 只支持 Cursor |
170
+
171
+ ---
172
+
173
+ ## 🏗️ 工作原理
174
+
175
+ ```mermaid
176
+ flowchart LR
177
+ A["AI CLI 工具<br/>Claude · Codex · Cursor · Gemini · Kiro<br/>OpenCode · OpenClaw · Every Code · Hermes · Copilot · Kimi Code"]
178
+ A -->|hook 触发| B[Token Tracker]
179
+ B -->|解析日志<br/>30 分钟 UTC 桶| C[(本地 SQLite)]
180
+ C --> D[Web Dashboard]
181
+ C --> E[菜单栏 App]
182
+ C --> F[桌面小组件]
183
+ C -.->|可选| G[(云端排行榜)]
184
+ ```
185
+
186
+ 1. 正常使用 AI CLI 工具时,它们会写 log
187
+ 2. 轻量级 hook 感知日志变动并触发同步(Cursor 走 API,不走 hook)
188
+ 3. token 数量在本地解析 —— **绝不**读取 prompt 或回复内容
189
+ 4. 聚合成 30 分钟一格的 UTC 桶
190
+ 5. Dashboard、菜单栏 App 和桌面小组件都读取同一份本地快照
191
+
192
+ ---
193
+
194
+ ## 🛡️ 隐私
195
+
196
+ | 承诺 | 说明 |
197
+ |---|---|
198
+ | **不上传内容** | 只记录 token 数量和时间戳。**绝不**记录 prompt、回复或文件内容 |
199
+ | **默认纯本地** | 所有数据保留在你的机器上。排行榜是完全 opt-in |
200
+ | **可审计** | 代码开源。[`src/lib/rollout.js`](src/lib/rollout.js) 里只有数字和时间戳 |
201
+ | **零埋点** | 无分析、无崩溃上报、无任何 phone-home |
202
+
203
+ ---
204
+
205
+ ## 📦 配置项
206
+
207
+ 99% 的用户不需要改。进阶玩家可以用以下环境变量:
208
+
209
+ | 变量 | 说明 | 默认值 |
210
+ |---|---|---|
211
+ | `TOKENTRACKER_DEBUG` | 打开 debug 日志(`1` 表示打开) | — |
212
+ | `TOKENTRACKER_HTTP_TIMEOUT_MS` | HTTP 超时时间(毫秒) | `20000` |
213
+ | `CODEX_HOME` | 覆盖 Codex CLI 目录 | `~/.codex` |
214
+ | `GEMINI_HOME` | 覆盖 Gemini CLI 目录 | `~/.gemini` |
215
+
216
+ ---
217
+
218
+ ## 🛠️ 本地开发
219
+
220
+ ```bash
221
+ git clone https://github.com/mm7894215/TokenTracker.git
222
+ cd TokenTracker
223
+ npm install
224
+
225
+ # 构建 Dashboard + 跑 CLI
226
+ cd dashboard && npm install && npm run build && cd ..
227
+ node bin/tracker.js
228
+
229
+ # 跑测试
230
+ npm test
231
+ ```
232
+
233
+ ### 构建 macOS App
234
+
235
+ ```bash
236
+ cd TokenTrackerBar
237
+ npm run dashboard:build # 构建 Dashboard 前端
238
+ ./scripts/bundle-node.sh # 打包 Node.js + tokentracker 源码
239
+ xcodegen generate # 生成 Xcode 工程
240
+ ruby scripts/patch-pbxproj-icon.rb # 补一下 Icon Composer 资源
241
+ xcodebuild -scheme TokenTrackerBar -configuration Release clean build
242
+ ./scripts/create-dmg.sh # 打 DMG
243
+ ```
244
+
245
+ 需要 **Xcode 16+** 和 [XcodeGen](https://github.com/yonaskolb/XcodeGen)。
246
+
247
+ ---
248
+
249
+ ## 🔧 排障
250
+
251
+ ### CLI
252
+
253
+ <details>
254
+ <summary><b>报 "engines.node" 或版本不兼容错误</b></summary>
255
+
256
+ <br/>
257
+
258
+ TokenTracker 需要 **Node 20+**。先看看你装的是哪个版本:
259
+
260
+ ```bash
261
+ node --version
262
+ ```
263
+
264
+ 如果低于 20,用 [nvm](https://github.com/nvm-sh/nvm)、[fnm](https://github.com/Schniz/fnm) 或系统包管理器升级(`brew upgrade node`、`apt install nodejs` 等)。
265
+
266
+ </details>
267
+
268
+ <details>
269
+ <summary><b>端口 7680 被占用</b></summary>
270
+
271
+ <br/>
272
+
273
+ 被占用时 Dashboard 会自动顺延(`7681`、`7682` …),实际端口在启动日志里会打出来。如果你想强制指定端口:
274
+
275
+ ```bash
276
+ PORT=7700 tokentracker serve
277
+ ```
278
+
279
+ 查谁占着 `7680`:
280
+
281
+ ```bash
282
+ lsof -i :7680
283
+ ```
284
+
285
+ </details>
286
+
287
+ <details>
288
+ <summary><b>某个 AI 工具没被检测到</b></summary>
289
+
290
+ <br/>
291
+
292
+ 先看集成状态:
293
+
294
+ ```bash
295
+ tokentracker status
296
+ ```
297
+
298
+ 然后跑一个深度健康检查:
299
+
300
+ ```bash
301
+ tokentracker doctor
302
+ ```
303
+
304
+ 如果你明明在用某个工具却显示未配置,跑一下 `tokentracker activate-if-needed` 重新探测。还不行的话 [提个 Issue](https://github.com/mm7894215/TokenTracker/issues/new),把 `doctor` 的输出贴上。
305
+
306
+ </details>
307
+
308
+ <details>
309
+ <summary><b>怎么完全卸载所有 hook 和配置</b></summary>
310
+
311
+ <br/>
312
+
313
+ ```bash
314
+ tokentracker uninstall
315
+ ```
316
+
317
+ 这会把 TokenTracker 在所有 AI 工具里写入的 hook 全部清掉,同时删除本地配置和数据。可以安全重复执行。
318
+
319
+ </details>
320
+
321
+ ### macOS App
322
+
323
+ <details>
324
+ <summary><b>"无法打开 TokenTrackerBar,因为它来自身份不明的开发者"</b></summary>
325
+
326
+ <br/>
327
+
328
+ TokenTrackerBar 使用 **ad-hoc 签名**(没有用 Apple Developer ID 做公证,因为那需要付费账号)。Gatekeeper 会在首次启动时拦下。
329
+
330
+ 1. 打开 **系统设置 → 隐私与安全性**
331
+ 2. 滑到 **安全性** 区域 —— 你会看到提示「TokenTrackerBar 已被阻止以保护 Mac」
332
+ 3. 点击 **仍要打开**
333
+ 4. 在后续对话框中再点一次 **打开**(需要输入密码)
334
+
335
+ 只需要做一次。老版本 macOS 上的替代做法:在访达里右键 App → **打开** → 确认对话框里再点 **打开**。
336
+
337
+ </details>
338
+
339
+ <details>
340
+ <summary><b>"TokenTrackerBar 已损坏,无法打开"</b></summary>
341
+
342
+ <br/>
343
+
344
+ 其实不是真坏了 —— 这是 Gatekeeper 对 macOS 给下载文件自动贴的 `com.apple.quarantine` 属性做出的反应。清除一次即可:
345
+
346
+ ```bash
347
+ xattr -cr /Applications/TokenTrackerBar.app
348
+ ```
349
+
350
+ 之后就能正常打开了。
351
+
352
+ </details>
353
+
354
+ <details>
355
+ <summary><b>"TokenTrackerBar 想访问其他 App 的数据"</b></summary>
356
+
357
+ <br/>
358
+
359
+ 这个权限是 **Cursor** 和 **Kiro** 集成需要的。它们把 auth token / 用量数据存在自己的 `~/Library/Application Support/` 目录下,而 macOS 用 App Management 权限保护这类访问。
360
+
361
+ - ✅ 用 Cursor / Kiro:点 **允许**
362
+ - ❌ 不用:点 **不允许**,这两个 provider 会被静默跳过,其他一切正常
363
+
364
+ 授权一次即可记住。注意 ad-hoc 签名的版本每次升级后签名身份会变,所以每次升级都会重新弹一次。
365
+
366
+ </details>
367
+
368
+ ---
369
+
370
+ ## ⭐ Star 历史
371
+
372
+ <a href="https://star-history.com/#mm7894215/TokenTracker&Date">
373
+ <img src="https://api.star-history.com/svg?repos=mm7894215/TokenTracker&type=Date" alt="Star History Chart" width="600" />
374
+ </a>
375
+
376
+ ---
377
+
378
+ ## 🤝 贡献与支持
379
+
380
+ - **Bug / 功能建议**:[提个 Issue](https://github.com/mm7894215/TokenTracker/issues/new)
381
+ - **安全问题**:见 [SECURITY.md](SECURITY.md) —— 请不要在公开 Issue 里提交安全报告
382
+ - **Pull Request**:见 [CONTRIBUTING.md](CONTRIBUTING.md),里面有开发环境搭建、测试流程和新增 AI 工具集成的指南
383
+ - **提问 / 展示作品**:[GitHub Discussions](https://github.com/mm7894215/TokenTracker/discussions)
384
+
385
+ ## 🙏 致谢
386
+
387
+ Clawd 像素风形象的灵感来自 [@marciogranzotto](https://github.com/marciogranzotto) 的 [Clawd-on-Desk](https://github.com/Angel2518975237/Clawd-on-Desk)。Clawd 角色设计归属 Anthropic。本项目是社区项目,和 Anthropic 无官方隶属关系。
388
+
389
+ ## License
390
+
391
+ [MIT](LICENSE)
392
+
393
+ ---
394
+
395
+ <div align="center">
396
+
397
+ **Token Tracker** —— 把你的 AI 产出量化。
398
+
399
+ <a href="https://token.rynn.me">token.rynn.me</a> · <a href="https://www.npmjs.com/package/tokentracker-cli">npm</a> · <a href="https://github.com/mm7894215/TokenTracker">GitHub</a>
400
+
401
+ </div>
@@ -1 +1 @@
1
- import{D as r}from"./main-DMsq-RaY.js";function t({children:i,title:a,subtitle:o,className:s="",bodyClassName:d=""}){return r.jsxs("div",{className:`rounded-xl border border-oai-gray-200 dark:border-oai-gray-800 bg-white dark:bg-oai-gray-900 transition-colors duration-200 ${s}`,children:[(a||o)&&r.jsxs("div",{className:"px-5 py-4 border-b border-oai-gray-200 dark:border-oai-gray-800 transition-colors duration-200",children:[a&&r.jsx("h3",{className:"text-sm font-medium text-oai-gray-500 dark:text-oai-gray-300 uppercase tracking-wide transition-colors duration-200",children:a}),o&&r.jsx("p",{className:"text-sm text-oai-gray-500 dark:text-oai-gray-300 mt-1 transition-colors duration-200",children:o})]}),r.jsx("div",{className:`p-5 ${d}`,children:i})]})}export{t as C};
1
+ import{D as r}from"./main-CJeNIc4Q.js";function t({children:i,title:a,subtitle:o,className:s="",bodyClassName:d=""}){return r.jsxs("div",{className:`rounded-xl border border-oai-gray-200 dark:border-oai-gray-800 bg-white dark:bg-oai-gray-900 transition-colors duration-200 ${s}`,children:[(a||o)&&r.jsxs("div",{className:"px-5 py-4 border-b border-oai-gray-200 dark:border-oai-gray-800 transition-colors duration-200",children:[a&&r.jsx("h3",{className:"text-sm font-medium text-oai-gray-500 dark:text-oai-gray-300 uppercase tracking-wide transition-colors duration-200",children:a}),o&&r.jsx("p",{className:"text-sm text-oai-gray-500 dark:text-oai-gray-300 mt-1 transition-colors duration-200",children:o})]}),r.jsx("div",{className:`p-5 ${d}`,children:i})]})}export{t as C};