diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1c6fbb5..70bfc99 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,16 +1,19 @@ # Koring Launcher 构建 & 发布流水线(手动触发):构建 → SignPath 签名 → 发布 GitHub Release # # 手动触发(Actions 页面 -> Run workflow): -# mode 选择构建模式:beta(测试)或 run(正式) -# version 基础版本号,如 1.2.0 -# 自动生成 BUILD ID(Action 运行的 UTC 时刻,格式 YYMMDDHHMM,如 2608280224), -# 最终版本号 = {version}-{BUILD ID}(如 1.2.0-2608280224),tag = v{version}-{BUILD ID}。 +# mode 构建模式:beta(测试)或 run(正式) +# ref 构建来源分支/tag/commit(留空 = 默认分支) +# sign 是否使用 SignPath 签名 +# 无 version 输入:base 自动读 package.json(版本单一事实源,消除本地/CI 版本双轨)。 +# BUILD ID = GitHub Run Number(严格递增,无分钟级冲突), +# 最终版本号 = {base}-{buildId}(如 1.2.0-12),tag = v{base}-{buildId}。 # # 发布行为: # - beta:创建 GitHub prerelease(不占用 "Latest" 位) # - run :创建正式 release -# - Release 正文为中文:版本信息(当前版本 / 编译状态)+ 自上个 release tag 以来的提交记录(默认折叠) -# - 上传产物:koring-launcher-{version}-{BUILD ID}-setup.exe + latest.yml(electron-updater 更新清单) +# - Release 正文为中文:版本信息(当前版本 / 编译状态 / 构建来源 commit)+ 提交记录(默认折叠) +# - 上传产物:koring-launcher-{base}-{buildId}-setup.exe + latest.yml(electron-updater 更新清单) +# - 构建元数据(commit / buildId)写入 src/lib/buildInfo.ts,打包进渲染层供 UI 显示 # # Secrets: # SIGNPATH_API_TOKEN SignPath API Token(必填;放在 Environment "BUILDER" 的环境 Secrets 中) @@ -27,8 +30,10 @@ # 正式对外发布需生产证书(OV/EV)+ 对应生产签名策略,届时只换 SIGNPATH_SIGNING_POLICY_SLUG。 # # ⚠️ 版本号注意(electron-updater 语义): -# - {version}-{BUILD ID} 属于 semver prerelease;已安装同格式版本的用户可正常收到更高 BUILD ID 的更新。 -# - 若未来发布不带 BUILD ID 的稳定版本(如 1.2.0),稳定版用户不会自动升级到带 BUILD ID 的构建。 +# - {base}-{buildId} 属于 semver prerelease;已安装同格式版本的用户可正常收到更高 buildId 的更新。 +# - 若未来发布不带 buildId 的稳定版本(如 1.2.0),稳定版用户不会自动升级到带 buildId 的构建。 +# - 切换 BUILD ID 方案(时间 ID → Run Number)时,旧格式数值更大(2608271921 > 12), +# 老用户不会自动升级 —— 切换时应同时提升 base(如 1.3.0-12 > 1.2.0-2608271921)。 name: BUILD & Release (SignPath) @@ -42,10 +47,10 @@ on: options: - beta - run - version: - description: '基础版本号,如 1.2.0' - required: true - default: '1.2.0' + ref: + description: '构建来源分支 / tag / commit(留空 = 默认分支)' + required: false + default: '' sign: description: '是否使用 SignPath 签名(配额不足时自动跳过)' required: true @@ -75,6 +80,8 @@ jobs: with: # 需要完整历史:生成中文提交记录(自上个 release tag 以来) fetch-depth: 0 + # 构建来源:默认默认分支,可指定分支/tag/commit + ref: ${{ inputs.ref || '' }} - uses: pnpm/action-setup@v4 with: @@ -88,17 +95,26 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile - # BUILD ID = Action 运行时刻(UTC, YYMMDDHHMM),如 2608280224 + # BUILD ID = GitHub Run Number(严格递增,无分钟级冲突) + # base 自动读 package.json(版本单一事实源,消除本地/CI 版本双轨) - name: Generate BUILD ID & set version id: version shell: pwsh run: | - $buildId = [DateTime]::UtcNow.ToString('yyMMddHHmm') - $full = "${{ inputs.version }}-$buildId" - node scripts/version.js $full + $buildId = "$env:GITHUB_RUN_NUMBER" + $base = node scripts/version.js get + $full = node scripts/version.js build ci $buildId "build_id=$buildId" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + "base=$base" | Out-File -FilePath $env:GITHUB_OUTPUT -Append "full=$full" | Out-File -FilePath $env:GITHUB_OUTPUT -Append - Write-Host "BUILD ID: $buildId -> version: $full" + Write-Host "BUILD ID: $buildId -> version: $full (base: $base)" + + # 生成构建元数据(commit / 编译号)→ 打包进渲染层,UI 显示构建来源 + - name: Generate build info + shell: pwsh + run: node scripts/gen-build-info.js ${{ inputs.mode }} + env: + BUILD_ID: ${{ steps.version.outputs.build_id }} - name: Build renderer + main (${{ inputs.mode }}) shell: pwsh @@ -119,10 +135,11 @@ jobs: shell: pwsh run: | ./scripts/release-notes.ps1 ` - -BaseVersion "${{ inputs.version }}" ` + -BaseVersion "${{ steps.version.outputs.base }}" ` -FullVersion "${{ steps.version.outputs.full }}" ` -Mode "${{ inputs.mode }}" ` -SigningStatus "${{ inputs.sign && '已签名' || '未签名' }}" ` + -Commit "${{ github.sha }}" ` -OutputPath release-notes.md - name: Publish GitHub Release @@ -135,6 +152,7 @@ jobs: gh release create $tag ` "dist-electron/koring-launcher-${{ steps.version.outputs.full }}-setup.exe" ` "dist-electron/latest.yml" ` - --title "Koring Launcher Releases ${{ inputs.version }}" ` + "release-notes.md" ` + --title "Koring Launcher Releases ${{ steps.version.outputs.base }}" ` --notes-file release-notes.md ` $prerelease diff --git a/.gitignore b/.gitignore index 3b1004a..405ee17 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,4 @@ electron-dist/ # Build resources (generated by switch-icon.js) build/ dsh-usage/usage-records.json +Koring.yml diff --git a/Koring.yml b/Koring.yml index 5d0649e..055ce30 100644 --- a/Koring.yml +++ b/Koring.yml @@ -1,5 +1 @@ oobe: false -theme: - darkMode: light -game: - gameDirs: [] diff --git a/docs/auto-update-plan.md b/docs/auto-update-plan.md index 4b1a1ca..c085224 100644 --- a/docs/auto-update-plan.md +++ b/docs/auto-update-plan.md @@ -1,11 +1,11 @@ # Koring Launcher 自动更新方案(v1 规划稿) -> 状态:**M1 已完成(2026-08-28)**;M2 待开始 +> 状态:**M1 完成;M2 主进程更新模块完成(2026-08-28,UI 待做)** > 目标平台:**Windows 优先**(NSIS exe 安装包),macOS/Linux 后续复用同一套架构 > 决策记录: > - 安装器模式:**保持 assisted 安装器(`oneClick: false` + 可改安装目录)→ 每次更新整包下载** > - 更新托管:**GitHub Releases** -> - 当前交付:**M1 基础设施已完成**(electron-updater 依赖 + publish 配置 + 1.2.0 打包验证) +> - 当前交付:**M1 基础设施 + M2 主进程更新模块(GitHub 优先 + 加速源兜底)已完成** --- @@ -292,20 +292,68 @@ src/ **触发方式**:Actions 页面 → Run workflow,仅手动触发(不再使用 tag 触发)。 - `mode`:`beta`(测试,发布为 GitHub prerelease)/ `run`(正式,发布为普通 release) -- `version`:基础版本号(如 `1.2.0`) +- `ref`:构建来源分支/tag/commit(留空 = 默认分支) +- `sign`:是否使用 SignPath 签名 +- **无 `version` 输入**:base 自动读 `package.json`(版本单一事实源,消除本地/CI 版本双轨) -**版本号与 BUILD ID**: -- BUILD ID = Action 运行的 **UTC 时刻**,格式 `YYMMDDHHMM`(如 `2608280224`) -- 最终版本 = `{version}-{BUILD ID}`(如 `1.2.0-2608280224`),tag = `v{version}-{BUILD ID}`, - electron-builder 产物 = `koring-launcher-{version}-{BUILD ID}-setup.exe`,`latest.yml` 同步更新 +**版本号与 BUILD ID(2026-08-30 起改为 GitHub Run Number)**: +- BUILD ID = `github.run_number`(严格递增、无分钟级冲突) +- 最终版本 = `{base}-{buildId}`(如 `1.2.0-12`),tag = `v{base}-{buildId}`, + electron-builder 产物 = `koring-launcher-{base}-{buildId}-setup.exe`,`latest.yml` 同步更新 +- 构建元数据(commit / buildId)由 `scripts/gen-build-info.js` 写入 `src/lib/buildInfo.ts` → + 打包进渲染层,VersionCard / 关于页显示**构建来源 commit**(`scripts/version.js build ci` 负责统一设版本) **发布内容**(`gh release create`,中文正文由 `scripts/release-notes.ps1` 生成): -- `# Koring Launcher Releases {version}` + 版本信息(当前版本 / 编译状态 BETA/RUN) +- `# Koring Launcher Releases {base}` + 版本信息(当前版本 / 编译状态 BETA/RUN / 签名状态 / **构建来源 commit**) - `## 更新了什么内容`:自上个 `v*` tag 以来的提交记录,每条默认折叠 (`
·Commit 1cf906d
`) -- 上传产物:setup.exe + latest.yml(electron-updater 更新清单) +- 上传产物:setup.exe + latest.yml + release-notes.md(electron-updater 更新清单) **⚠️ 版本语义注意(electron-updater)**: -- `{version}-{BUILD ID}` 属 semver prerelease:同格式版本之间可正常升级(BUILD ID 更大者胜) -- 若未来发布**不带** BUILD ID 的稳定版本(如 `1.2.0`),稳定版用户不会自动升级到带 BUILD ID 的构建 -- 同一分钟内重复触发会产生相同 BUILD ID → tag 冲突,`gh release create` 会失败,稍候重试即可 +- `{base}-{buildId}` 属 semver prerelease:同格式版本之间可正常升级(buildId 更大者胜) +- 若未来发布**不带** buildId 的稳定版本(如 `1.2.0`),稳定版用户不会自动升级到带 buildId 的构建 +- **迁移注意**:从时间 ID(`2608271921`)切换到 Run Number 后,旧格式数值更大(`2608271921 > 12`), + 老用户不会自动升级到新格式——切换时应同时提升 base(如 `1.3.0-12 > 1.2.0-2608271921`) + +## 14. M2 主进程更新模块(2026-08-28,UI 待做) + +**新增/改动**: +- `electron/updater.ts` — 更新服务:electron-updater(GitHub provider)优先,失败后加速源兜底; + 状态机 idle/checking/available/not-available/downloading/downloaded/error,进度事件,`quitAndInstall` +- `electron/handlers/update.ts` — IPC:`update:check` / `update:download` / `update:quitAndInstall` / `update:getState`, + 状态变化广播 `update:status` 到所有窗口 +- `electron/main.ts` — 注册 handler + 启动后 12s 延迟静默检查(开发模式自动跳过) +- `electron/preload.ts` + `src/types/electron.d.ts` — 暴露更新 API(UI 未接,待 M3) + +**加速源兜底(实测)**: +- GitHub 直连在本机网络不可用;`gh.ddlc.top` 已实测可代理 `releases/download`(latest.yml + 102MB 安装包)与 `/releases/latest` 页面 +- 发现机制(无需 GitHub API):`{镜像}/https://github.com/{owner}/{repo}/releases/latest` 页面 HTML 提取 tag → + `autoUpdater.setFeedURL({ provider: 'generic', url: '{镜像}/.../download/{tag}/' })` → 检查/下载 +- 镜像列表可用环境变量 `UPDATE_MIRRORS` 覆盖;后续建议自建 OSS/CDN(generic 直连镜像根目录) + +**状态机与 IPC 契约**(前端 M3 实现时使用): +``` +idle → checking → available → downloading → downloaded → quitAndInstall() + └─not-available→ idle └─ error → idle(可重试) +``` +`update:status` payload:`{ state, manual, version?, currentVersion?, percent?, transferred?, total?, bytesPerSecond?, source?, error? }` + +## 15. 更新日志独立页面(2026-08-28) + +- **独立路由页面** `src/pages/update/index.tsx`(route key `update`),不使用设置页 layout +- 顶栏(TitleBar)在 sub 模式下**只显示「返回」+ 页面标题「更新日志」**(routeStore 新增 `titleInBar`, + 其余页面仍显示品牌名) +- 页面内容:顶部 `VersionCard`,下方 Markdown 渲染当前版本发布说明 + (主进程 `update:getReleaseNotes`:GitHub 直连优先 + 加速源兜底,读 release 附件 `release-notes.md`; + 当前版本无发布说明时回退最新版本并标注) +- **入口**:除 OOBE 与更新日志页本身外,所有 VersionCard 的「检查更新」按钮点击后**跳转到本页**; + 在本页内点击则直接执行检查 +- **完整下载流程(2026-08-30)**:底部遮罩驱动 —— 检查更新 → 「下载版本更新」→ + 进度条(百分比/已下载/总大小/速度)+ **暂停/继续/取消**(基于 electron-updater CancellationToken)→ + 「安装更新」(先写入 installing 状态并 flush 配置,再 quitAndInstall) +- **发布说明切换**:默认显示当前版本;检测到可用更新后自动切到最新版本(`getReleaseNotes(v{version})`), + 退出重进回到当前版本 +- **进度持久化**:每次状态/进度变化写入 `Koring.yml` 的 `update` 段 + (state/version/percent/transferred/total/source/error);应用启动时清理上次的进行中状态 +- 配套改动:发布流水线 `gh release create` 上传 `release-notes.md` 附件 + (旧版本发布的 release 无此附件,页面会显示回退/空态) diff --git a/dsh-usage/usage-records.json b/dsh-usage/usage-records.json index 1179610..5a97856 100644 --- a/dsh-usage/usage-records.json +++ b/dsh-usage/usage-records.json @@ -1 +1 @@ -[{"time":1787418340884,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":47749,"outputTokens":679,"cacheReadTokens":0,"cacheWriteTokens":0,"reasoningTokens":481,"finishReason":"tool-calls"},{"time":1787418348699,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1751,"outputTokens":144,"cacheReadTokens":48384,"cacheWriteTokens":0,"reasoningTokens":28,"finishReason":"tool-calls"},{"time":1787418350551,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2603,"outputTokens":212,"cacheReadTokens":50176,"cacheWriteTokens":0,"reasoningTokens":87,"finishReason":"tool-calls"},{"time":1787418352583,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3019,"outputTokens":243,"cacheReadTokens":52864,"cacheWriteTokens":0,"reasoningTokens":58,"finishReason":"tool-calls"},{"time":1787418354887,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3759,"outputTokens":262,"cacheReadTokens":56064,"cacheWriteTokens":0,"reasoningTokens":137,"finishReason":"tool-calls"},{"time":1787418357576,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":6970,"outputTokens":369,"cacheReadTokens":60032,"cacheWriteTokens":0,"reasoningTokens":197,"finishReason":"tool-calls"},{"time":1787418361073,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":5599,"outputTokens":302,"cacheReadTokens":67328,"cacheWriteTokens":0,"reasoningTokens":66,"finishReason":"tool-calls"},{"time":1787418365967,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":709,"outputTokens":231,"cacheReadTokens":73216,"cacheWriteTokens":0,"reasoningTokens":107,"finishReason":"tool-calls"},{"time":1787418372365,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3472,"outputTokens":220,"cacheReadTokens":74112,"cacheWriteTokens":0,"reasoningTokens":44,"finishReason":"tool-calls"},{"time":1787418377727,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":4157,"outputTokens":283,"cacheReadTokens":77696,"cacheWriteTokens":0,"reasoningTokens":58,"finishReason":"tool-calls"},{"time":1787418383582,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":582,"outputTokens":202,"cacheReadTokens":82048,"cacheWriteTokens":0,"reasoningTokens":64,"finishReason":"tool-calls"},{"time":1787418390125,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1555,"outputTokens":407,"cacheReadTokens":82816,"cacheWriteTokens":0,"reasoningTokens":278,"finishReason":"tool-calls"},{"time":1787418394973,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1353,"outputTokens":377,"cacheReadTokens":84736,"cacheWriteTokens":0,"reasoningTokens":256,"finishReason":"tool-calls"},{"time":1787418399028,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":4471,"outputTokens":800,"cacheReadTokens":86400,"cacheWriteTokens":0,"reasoningTokens":674,"finishReason":"tool-calls"},{"time":1787418406673,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":5702,"outputTokens":358,"cacheReadTokens":91648,"cacheWriteTokens":0,"reasoningTokens":128,"finishReason":"tool-calls"},{"time":1787418417400,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1880,"outputTokens":200,"cacheReadTokens":97664,"cacheWriteTokens":0,"reasoningTokens":51,"finishReason":"tool-calls"},{"time":1787418424298,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1836,"outputTokens":3441,"cacheReadTokens":99712,"cacheWriteTokens":0,"reasoningTokens":3356,"finishReason":"tool-calls"},{"time":1787418458047,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1132,"outputTokens":4282,"cacheReadTokens":104960,"cacheWriteTokens":0,"reasoningTokens":4155,"finishReason":"tool-calls"},{"time":1787418498954,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":344,"outputTokens":4881,"cacheReadTokens":110336,"cacheWriteTokens":0,"reasoningTokens":1650,"finishReason":"tool-calls"},{"time":1787418563208,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":5006,"outputTokens":107,"cacheReadTokens":110592,"cacheWriteTokens":0,"reasoningTokens":27,"finishReason":"stop"},{"time":1787418611584,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":156,"outputTokens":2884,"cacheReadTokens":115584,"cacheWriteTokens":0,"reasoningTokens":2292,"finishReason":"tool-calls"},{"time":1787418679492,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":150,"outputTokens":1326,"cacheReadTokens":118528,"cacheWriteTokens":0,"reasoningTokens":1171,"finishReason":"tool-calls"},{"time":1787418693492,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1186,"outputTokens":4853,"cacheReadTokens":119936,"cacheWriteTokens":0,"reasoningTokens":1746,"finishReason":"tool-calls"},{"time":1787418756804,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":78449,"outputTokens":961,"cacheReadTokens":47104,"cacheWriteTokens":0,"reasoningTokens":494,"finishReason":"tool-calls"},{"time":1787418765960,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":78,"outputTokens":125,"cacheReadTokens":126464,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418768051,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2993,"outputTokens":5111,"cacheReadTokens":126592,"cacheWriteTokens":0,"reasoningTokens":3208,"finishReason":"tool-calls"},{"time":1787418800491,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":92,"outputTokens":462,"cacheReadTokens":134656,"cacheWriteTokens":0,"reasoningTokens":15,"finishReason":"tool-calls"},{"time":1787418805877,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":94,"outputTokens":129,"cacheReadTokens":135168,"cacheWriteTokens":0,"reasoningTokens":47,"finishReason":"tool-calls"},{"time":1787418808175,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":285,"outputTokens":216,"cacheReadTokens":135296,"cacheWriteTokens":0,"reasoningTokens":23,"finishReason":"tool-calls"},{"time":1787418811257,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":160,"outputTokens":194,"cacheReadTokens":135680,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418814542,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":142,"outputTokens":359,"cacheReadTokens":135936,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418818377,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":161,"outputTokens":364,"cacheReadTokens":136320,"cacheWriteTokens":0,"reasoningTokens":109,"finishReason":"tool-calls"},{"time":1787418822062,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":62,"outputTokens":140,"cacheReadTokens":136832,"cacheWriteTokens":0,"reasoningTokens":60,"finishReason":"tool-calls"},{"time":1787418824931,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":855,"outputTokens":231,"cacheReadTokens":136960,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418827966,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":100,"outputTokens":749,"cacheReadTokens":137984,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418833388,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":119,"outputTokens":136,"cacheReadTokens":138752,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418835694,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":165,"outputTokens":201,"cacheReadTokens":138880,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418838747,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":148,"outputTokens":134,"cacheReadTokens":139136,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418841634,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":64,"outputTokens":256,"cacheReadTokens":139392,"cacheWriteTokens":0,"reasoningTokens":121,"finishReason":"tool-calls"},{"time":1787418845367,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":102,"outputTokens":620,"cacheReadTokens":139648,"cacheWriteTokens":0,"reasoningTokens":24,"finishReason":"tool-calls"},{"time":1787418849611,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":137,"outputTokens":319,"cacheReadTokens":140288,"cacheWriteTokens":0,"reasoningTokens":118,"finishReason":"tool-calls"},{"time":1787418853189,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":113,"outputTokens":492,"cacheReadTokens":140672,"cacheWriteTokens":0,"reasoningTokens":103,"finishReason":"tool-calls"},{"time":1787418857395,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":133,"outputTokens":127,"cacheReadTokens":141184,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418860705,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":44,"outputTokens":1458,"cacheReadTokens":141440,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418869021,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":150,"outputTokens":111,"cacheReadTokens":142848,"cacheWriteTokens":0,"reasoningTokens":28,"finishReason":"tool-calls"},{"time":1787418872030,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":242,"outputTokens":1444,"cacheReadTokens":143104,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418880222,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":77,"outputTokens":421,"cacheReadTokens":144768,"cacheWriteTokens":0,"reasoningTokens":23,"finishReason":"tool-calls"},{"time":1787418884509,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":164,"outputTokens":97,"cacheReadTokens":145152,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418893248,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":384,"outputTokens":372,"cacheReadTokens":145408,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418897477,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":155,"outputTokens":180,"cacheReadTokens":146048,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418900414,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":120,"outputTokens":410,"cacheReadTokens":146304,"cacheWriteTokens":0,"reasoningTokens":257,"finishReason":"tool-calls"},{"time":1787418905946,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1450,"outputTokens":366,"cacheReadTokens":146816,"cacheWriteTokens":0,"reasoningTokens":297,"finishReason":"tool-calls"},{"time":1787418916817,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":593,"outputTokens":584,"cacheReadTokens":148608,"cacheWriteTokens":0,"reasoningTokens":39,"finishReason":"tool-calls"},{"time":1787418924122,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":75,"outputTokens":97,"cacheReadTokens":149760,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418926332,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":400,"outputTokens":262,"cacheReadTokens":149888,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418931109,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":61,"outputTokens":496,"cacheReadTokens":150528,"cacheWriteTokens":0,"reasoningTokens":32,"finishReason":"tool-calls"},{"time":1787418935733,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":73,"outputTokens":326,"cacheReadTokens":151040,"cacheWriteTokens":0,"reasoningTokens":233,"finishReason":"tool-calls"},{"time":1787418941258,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":810,"outputTokens":4509,"cacheReadTokens":151424,"cacheWriteTokens":0,"reasoningTokens":2830,"finishReason":"tool-calls"},{"time":1787418973669,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":128,"outputTokens":3313,"cacheReadTokens":156672,"cacheWriteTokens":0,"reasoningTokens":1791,"finishReason":"tool-calls"},{"time":1787418995282,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":169,"outputTokens":83,"cacheReadTokens":160000,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418997989,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":327,"outputTokens":1502,"cacheReadTokens":160128,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419007651,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":92,"outputTokens":647,"cacheReadTokens":161920,"cacheWriteTokens":0,"reasoningTokens":12,"finishReason":"tool-calls"},{"time":1787419012763,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":155,"outputTokens":673,"cacheReadTokens":162560,"cacheWriteTokens":0,"reasoningTokens":47,"finishReason":"tool-calls"},{"time":1787419017935,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":100,"outputTokens":238,"cacheReadTokens":163328,"cacheWriteTokens":0,"reasoningTokens":156,"finishReason":"tool-calls"},{"time":1787419021338,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":495,"outputTokens":134,"cacheReadTokens":163584,"cacheWriteTokens":0,"reasoningTokens":50,"finishReason":"tool-calls"},{"time":1787419024147,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":194,"outputTokens":140,"cacheReadTokens":164096,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419026251,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":118,"outputTokens":299,"cacheReadTokens":164352,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419029292,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":74,"outputTokens":434,"cacheReadTokens":164736,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419033105,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":165,"outputTokens":753,"cacheReadTokens":165120,"cacheWriteTokens":0,"reasoningTokens":582,"finishReason":"tool-calls"},{"time":1787419040965,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1455,"outputTokens":383,"cacheReadTokens":166016,"cacheWriteTokens":0,"reasoningTokens":238,"finishReason":"tool-calls"},{"time":1787419046648,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":328,"outputTokens":1174,"cacheReadTokens":167808,"cacheWriteTokens":0,"reasoningTokens":537,"finishReason":"tool-calls"},{"time":1787419055171,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":149,"outputTokens":244,"cacheReadTokens":169216,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419057983,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":47,"outputTokens":132,"cacheReadTokens":169600,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419060169,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":89,"outputTokens":1199,"cacheReadTokens":169728,"cacheWriteTokens":0,"reasoningTokens":1112,"finishReason":"tool-calls"},{"time":1787419067802,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":454,"outputTokens":515,"cacheReadTokens":171008,"cacheWriteTokens":0,"reasoningTokens":12,"finishReason":"tool-calls"},{"time":1787419072229,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":128,"outputTokens":249,"cacheReadTokens":171904,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419075096,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":175,"outputTokens":115,"cacheReadTokens":172160,"cacheWriteTokens":0,"reasoningTokens":41,"finishReason":"tool-calls"},{"time":1787419077877,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":275,"outputTokens":316,"cacheReadTokens":172416,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419080916,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":128,"outputTokens":134,"cacheReadTokens":172928,"cacheWriteTokens":0,"reasoningTokens":36,"finishReason":"tool-calls"},{"time":1787419083459,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":377,"outputTokens":316,"cacheReadTokens":173184,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419086631,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":93,"outputTokens":98,"cacheReadTokens":173824,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419089146,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":480,"outputTokens":319,"cacheReadTokens":173952,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419092653,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":71,"outputTokens":751,"cacheReadTokens":174720,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419098537,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":110,"outputTokens":229,"cacheReadTokens":175488,"cacheWriteTokens":0,"reasoningTokens":22,"finishReason":"tool-calls"},{"time":1787419101561,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":125,"outputTokens":213,"cacheReadTokens":175744,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419104467,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":124,"outputTokens":609,"cacheReadTokens":176000,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419108659,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":134,"outputTokens":385,"cacheReadTokens":176640,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419111854,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":48,"outputTokens":1747,"cacheReadTokens":177152,"cacheWriteTokens":0,"reasoningTokens":881,"finishReason":"tool-calls"},{"time":1787419124610,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":61,"outputTokens":944,"cacheReadTokens":178944,"cacheWriteTokens":0,"reasoningTokens":75,"finishReason":"tool-calls"},{"time":1787419130671,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":153,"outputTokens":540,"cacheReadTokens":179840,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419135195,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":106,"outputTokens":121,"cacheReadTokens":180480,"cacheWriteTokens":0,"reasoningTokens":19,"finishReason":"tool-calls"},{"time":1787419137780,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":614,"outputTokens":515,"cacheReadTokens":180608,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419141678,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":149,"outputTokens":265,"cacheReadTokens":181632,"cacheWriteTokens":0,"reasoningTokens":185,"finishReason":"tool-calls"},{"time":1787419145527,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":126,"outputTokens":351,"cacheReadTokens":182016,"cacheWriteTokens":0,"reasoningTokens":250,"finishReason":"tool-calls"},{"time":1787419150678,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1287,"outputTokens":219,"cacheReadTokens":182400,"cacheWriteTokens":0,"reasoningTokens":116,"finishReason":"tool-calls"},{"time":1787419153902,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":823,"outputTokens":276,"cacheReadTokens":183808,"cacheWriteTokens":0,"reasoningTokens":117,"finishReason":"tool-calls"},{"time":1787419159337,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":182,"outputTokens":122,"cacheReadTokens":184832,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419163567,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1125,"outputTokens":311,"cacheReadTokens":185088,"cacheWriteTokens":0,"reasoningTokens":151,"finishReason":"tool-calls"},{"time":1787419169385,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2799,"outputTokens":2443,"cacheReadTokens":186496,"cacheWriteTokens":0,"reasoningTokens":2340,"finishReason":"tool-calls"},{"time":1787419188338,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":665,"outputTokens":2291,"cacheReadTokens":191616,"cacheWriteTokens":0,"reasoningTokens":105,"finishReason":"tool-calls"},{"time":1787419201504,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":69,"outputTokens":266,"cacheReadTokens":194560,"cacheWriteTokens":0,"reasoningTokens":8,"finishReason":"tool-calls"},{"time":1787419204801,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":121,"outputTokens":3846,"cacheReadTokens":194816,"cacheWriteTokens":0,"reasoningTokens":1380,"finishReason":"tool-calls"},{"time":1787419226809,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":188,"outputTokens":1515,"cacheReadTokens":198656,"cacheWriteTokens":0,"reasoningTokens":345,"finishReason":"tool-calls"},{"time":1787419236902,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":98,"outputTokens":386,"cacheReadTokens":200320,"cacheWriteTokens":0,"reasoningTokens":239,"finishReason":"tool-calls"},{"time":1787419242891,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":987,"outputTokens":939,"cacheReadTokens":200704,"cacheWriteTokens":0,"reasoningTokens":852,"finishReason":"tool-calls"},{"time":1787419249673,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1193,"outputTokens":1028,"cacheReadTokens":202624,"cacheWriteTokens":0,"reasoningTokens":32,"finishReason":"tool-calls"},{"time":1787419256219,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":106,"outputTokens":574,"cacheReadTokens":204800,"cacheWriteTokens":0,"reasoningTokens":109,"finishReason":"tool-calls"},{"time":1787419261240,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":68,"outputTokens":102,"cacheReadTokens":205440,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419263854,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":62,"outputTokens":1292,"cacheReadTokens":205568,"cacheWriteTokens":0,"reasoningTokens":1148,"finishReason":"tool-calls"},{"time":1787419276141,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":293,"outputTokens":135,"cacheReadTokens":206848,"cacheWriteTokens":0,"reasoningTokens":52,"finishReason":"tool-calls"},{"time":1787419282773,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":332,"outputTokens":228,"cacheReadTokens":207232,"cacheWriteTokens":0,"reasoningTokens":80,"finishReason":"tool-calls"},{"time":1787419286230,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":86,"outputTokens":99,"cacheReadTokens":207744,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419288988,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":77,"outputTokens":83,"cacheReadTokens":207872,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419294142,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":280,"outputTokens":259,"cacheReadTokens":208000,"cacheWriteTokens":0,"reasoningTokens":143,"finishReason":"tool-calls"},{"time":1787419302163,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":44,"outputTokens":527,"cacheReadTokens":208512,"cacheWriteTokens":0,"reasoningTokens":434,"finishReason":"tool-calls"},{"time":1787419307822,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":397,"outputTokens":1142,"cacheReadTokens":209024,"cacheWriteTokens":0,"reasoningTokens":992,"finishReason":"tool-calls"},{"time":1787419317163,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":23,"outputTokens":83,"cacheReadTokens":210560,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419327871,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2920,"outputTokens":1458,"cacheReadTokens":210560,"cacheWriteTokens":0,"reasoningTokens":1259,"finishReason":"tool-calls"},{"time":1787419340951,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":613,"outputTokens":1018,"cacheReadTokens":214912,"cacheWriteTokens":0,"reasoningTokens":744,"finishReason":"tool-calls"},{"time":1787419351551,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":619,"outputTokens":110,"cacheReadTokens":216448,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419355736,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":419,"outputTokens":173,"cacheReadTokens":217088,"cacheWriteTokens":0,"reasoningTokens":25,"finishReason":"tool-calls"},{"time":1787419361841,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":156,"outputTokens":240,"cacheReadTokens":217600,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419366492,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":443,"outputTokens":178,"cacheReadTokens":217984,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419371138,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":708,"outputTokens":290,"cacheReadTokens":218496,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419376119,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":246,"outputTokens":297,"cacheReadTokens":219392,"cacheWriteTokens":0,"reasoningTokens":84,"finishReason":"tool-calls"},{"time":1787419380449,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":48,"outputTokens":167,"cacheReadTokens":219904,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419384449,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":135,"outputTokens":199,"cacheReadTokens":220032,"cacheWriteTokens":0,"reasoningTokens":28,"finishReason":"tool-calls"},{"time":1787419390280,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":92,"outputTokens":108,"cacheReadTokens":220288,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419400401,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":86,"outputTokens":898,"cacheReadTokens":220416,"cacheWriteTokens":0,"reasoningTokens":652,"finishReason":"tool-calls"},{"time":1787419410040,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":102,"outputTokens":234,"cacheReadTokens":221312,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419414604,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1005,"outputTokens":514,"cacheReadTokens":221568,"cacheWriteTokens":0,"reasoningTokens":400,"finishReason":"tool-calls"},{"time":1787419419589,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":472,"outputTokens":1045,"cacheReadTokens":222976,"cacheWriteTokens":0,"reasoningTokens":613,"finishReason":"tool-calls"},{"time":1787419428232,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":152,"outputTokens":506,"cacheReadTokens":224384,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419432624,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":61,"outputTokens":240,"cacheReadTokens":225024,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419436169,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":88,"outputTokens":184,"cacheReadTokens":225280,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419438722,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":59,"outputTokens":223,"cacheReadTokens":225536,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419441674,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":73,"outputTokens":451,"cacheReadTokens":225792,"cacheWriteTokens":0,"reasoningTokens":22,"finishReason":"tool-calls"},{"time":1787419446418,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":51,"outputTokens":302,"cacheReadTokens":226304,"cacheWriteTokens":0,"reasoningTokens":142,"finishReason":"tool-calls"},{"time":1787419450099,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":137,"outputTokens":188,"cacheReadTokens":226560,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419464312,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":988,"outputTokens":718,"cacheReadTokens":226816,"cacheWriteTokens":0,"reasoningTokens":513,"finishReason":"tool-calls"},{"time":1787419471869,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":85,"outputTokens":211,"cacheReadTokens":228480,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419476529,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":140,"outputTokens":351,"cacheReadTokens":228736,"cacheWriteTokens":0,"reasoningTokens":46,"finishReason":"tool-calls"},{"time":1787419481910,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":432,"outputTokens":721,"cacheReadTokens":229120,"cacheWriteTokens":0,"reasoningTokens":589,"finishReason":"tool-calls"},{"time":1787419489367,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":583,"outputTokens":228,"cacheReadTokens":230272,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419492311,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":91,"outputTokens":246,"cacheReadTokens":231040,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419495612,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":129,"outputTokens":242,"cacheReadTokens":231296,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419498881,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":163,"outputTokens":106,"cacheReadTokens":231552,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419501590,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":336,"outputTokens":238,"cacheReadTokens":231808,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419504782,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":110,"outputTokens":73,"cacheReadTokens":232320,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419507459,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":787,"outputTokens":135,"cacheReadTokens":232448,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419510601,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":73,"outputTokens":188,"cacheReadTokens":233344,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419513924,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":51,"outputTokens":188,"cacheReadTokens":233600,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419517016,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":157,"outputTokens":285,"cacheReadTokens":233728,"cacheWriteTokens":0,"reasoningTokens":56,"finishReason":"tool-calls"},{"time":1787419531758,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":407,"outputTokens":407,"cacheReadTokens":234112,"cacheWriteTokens":0,"reasoningTokens":295,"finishReason":"tool-calls"},{"time":1787419537626,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":501,"outputTokens":188,"cacheReadTokens":234880,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419540856,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":94,"outputTokens":193,"cacheReadTokens":235520,"cacheWriteTokens":0,"reasoningTokens":78,"finishReason":"tool-calls"},{"time":1787419544665,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":51,"outputTokens":518,"cacheReadTokens":235776,"cacheWriteTokens":0,"reasoningTokens":435,"finishReason":"tool-calls"},{"time":1787419550232,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1068,"outputTokens":706,"cacheReadTokens":236288,"cacheWriteTokens":0,"reasoningTokens":481,"finishReason":"tool-calls"},{"time":1787419726919,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":130,"outputTokens":83,"cacheReadTokens":237952,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419788755,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":750,"outputTokens":536,"cacheReadTokens":238080,"cacheWriteTokens":0,"reasoningTokens":291,"finishReason":"tool-calls"},{"time":1787419810192,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":26,"outputTokens":83,"cacheReadTokens":239360,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419824956,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":173,"outputTokens":1022,"cacheReadTokens":239360,"cacheWriteTokens":0,"reasoningTokens":906,"finishReason":"tool-calls"},{"time":1787419833964,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1194,"outputTokens":1037,"cacheReadTokens":240512,"cacheWriteTokens":0,"reasoningTokens":676,"finishReason":"tool-calls"},{"time":1787419843513,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":93,"outputTokens":922,"cacheReadTokens":242688,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419849670,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":176,"outputTokens":169,"cacheReadTokens":243584,"cacheWriteTokens":0,"reasoningTokens":50,"finishReason":"tool-calls"},{"time":1787419856871,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":283,"outputTokens":330,"cacheReadTokens":243840,"cacheWriteTokens":0,"reasoningTokens":74,"finishReason":"tool-calls"},{"time":1787419860604,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":139,"outputTokens":114,"cacheReadTokens":244352,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419867023,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":142,"outputTokens":575,"cacheReadTokens":244480,"cacheWriteTokens":0,"reasoningTokens":107,"finishReason":"tool-calls"},{"time":1787419872580,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":124,"outputTokens":94,"cacheReadTokens":245120,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419875211,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":710,"outputTokens":302,"cacheReadTokens":245248,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419878582,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":152,"outputTokens":94,"cacheReadTokens":246144,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419881324,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":954,"outputTokens":770,"cacheReadTokens":246272,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419887162,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":96,"outputTokens":94,"cacheReadTokens":247936,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419889960,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":682,"outputTokens":1177,"cacheReadTokens":248064,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419897622,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":103,"outputTokens":237,"cacheReadTokens":249856,"cacheWriteTokens":0,"reasoningTokens":124,"finishReason":"tool-calls"},{"time":1787419901176,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":885,"outputTokens":1587,"cacheReadTokens":250112,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419911189,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":76,"outputTokens":117,"cacheReadTokens":252544,"cacheWriteTokens":0,"reasoningTokens":23,"finishReason":"tool-calls"},{"time":1787419913861,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":944,"outputTokens":1299,"cacheReadTokens":252672,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419922237,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":103,"outputTokens":436,"cacheReadTokens":254848,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419926702,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":63,"outputTokens":163,"cacheReadTokens":255360,"cacheWriteTokens":0,"reasoningTokens":69,"finishReason":"tool-calls"},{"time":1787419929760,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1186,"outputTokens":1650,"cacheReadTokens":255488,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419938603,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":61,"outputTokens":925,"cacheReadTokens":258304,"cacheWriteTokens":0,"reasoningTokens":583,"finishReason":"tool-calls"},{"time":1787419945842,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":131,"outputTokens":139,"cacheReadTokens":259200,"cacheWriteTokens":0,"reasoningTokens":63,"finishReason":"tool-calls"},{"time":1787419949257,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":285,"outputTokens":677,"cacheReadTokens":259456,"cacheWriteTokens":0,"reasoningTokens":528,"finishReason":"tool-calls"},{"time":1787419955685,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":102,"outputTokens":207,"cacheReadTokens":260352,"cacheWriteTokens":0,"reasoningTokens":78,"finishReason":"tool-calls"},{"time":1787420048586,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":135264,"outputTokens":1960,"cacheReadTokens":125952,"cacheWriteTokens":0,"reasoningTokens":1782,"finishReason":"tool-calls"},{"time":1787420070729,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":96,"outputTokens":224,"cacheReadTokens":263168,"cacheWriteTokens":0,"reasoningTokens":150,"finishReason":"tool-calls"},{"time":1787420074260,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2568,"outputTokens":2778,"cacheReadTokens":263424,"cacheWriteTokens":0,"reasoningTokens":2590,"finishReason":"tool-calls"},{"time":1787420099484,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":989,"outputTokens":155,"cacheReadTokens":268672,"cacheWriteTokens":0,"reasoningTokens":59,"finishReason":"tool-calls"},{"time":1787420102771,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":942,"outputTokens":803,"cacheReadTokens":269696,"cacheWriteTokens":0,"reasoningTokens":677,"finishReason":"tool-calls"},{"time":1787420111631,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1224,"outputTokens":742,"cacheReadTokens":271360,"cacheWriteTokens":0,"reasoningTokens":590,"finishReason":"tool-calls"},{"time":1787420119768,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1574,"outputTokens":2803,"cacheReadTokens":273280,"cacheWriteTokens":0,"reasoningTokens":2665,"finishReason":"tool-calls"},{"time":1787420145120,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":39,"outputTokens":227,"cacheReadTokens":277632,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420149688,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":330,"outputTokens":163,"cacheReadTokens":277888,"cacheWriteTokens":0,"reasoningTokens":48,"finishReason":"tool-calls"},{"time":1787420153910,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":303,"outputTokens":317,"cacheReadTokens":278272,"cacheWriteTokens":0,"reasoningTokens":180,"finishReason":"tool-calls"},{"time":1787420159033,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1148,"outputTokens":216,"cacheReadTokens":278784,"cacheWriteTokens":0,"reasoningTokens":112,"finishReason":"tool-calls"},{"time":1787420162555,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":688,"outputTokens":5725,"cacheReadTokens":280064,"cacheWriteTokens":0,"reasoningTokens":3333,"finishReason":"tool-calls"},{"time":1787420239046,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":5810,"outputTokens":158,"cacheReadTokens":280704,"cacheWriteTokens":0,"reasoningTokens":14,"finishReason":"stop"},{"time":1787420256979,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":102,"outputTokens":2745,"cacheReadTokens":286592,"cacheWriteTokens":0,"reasoningTokens":837,"finishReason":"tool-calls"},{"time":1787420286331,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":28409,"outputTokens":650,"cacheReadTokens":260608,"cacheWriteTokens":0,"reasoningTokens":294,"finishReason":"tool-calls"},{"time":1787420292483,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":31,"outputTokens":89,"cacheReadTokens":289664,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420295611,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":686,"outputTokens":920,"cacheReadTokens":289664,"cacheWriteTokens":0,"reasoningTokens":705,"finishReason":"tool-calls"},{"time":1787420306331,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":969,"outputTokens":136,"cacheReadTokens":291200,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420310412,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":621,"outputTokens":2532,"cacheReadTokens":292224,"cacheWriteTokens":0,"reasoningTokens":2111,"finishReason":"tool-calls"},{"time":1787420329266,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":139,"outputTokens":142,"cacheReadTokens":295296,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420332310,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":83,"outputTokens":513,"cacheReadTokens":295552,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420337030,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":141,"outputTokens":306,"cacheReadTokens":296064,"cacheWriteTokens":0,"reasoningTokens":35,"finishReason":"tool-calls"},{"time":1787420341237,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":121,"outputTokens":246,"cacheReadTokens":296448,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420344539,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":169,"outputTokens":493,"cacheReadTokens":296704,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420349064,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":81,"outputTokens":208,"cacheReadTokens":297344,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420353013,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":89,"outputTokens":572,"cacheReadTokens":297600,"cacheWriteTokens":0,"reasoningTokens":280,"finishReason":"tool-calls"},{"time":1787420359300,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":69,"outputTokens":174,"cacheReadTokens":298240,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420362808,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":163,"outputTokens":1400,"cacheReadTokens":298368,"cacheWriteTokens":0,"reasoningTokens":1097,"finishReason":"tool-calls"},{"time":1787420375224,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1493,"outputTokens":148,"cacheReadTokens":298496,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420378251,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":147,"outputTokens":790,"cacheReadTokens":300032,"cacheWriteTokens":0,"reasoningTokens":104,"finishReason":"tool-calls"},{"time":1787420384463,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":88,"outputTokens":189,"cacheReadTokens":300928,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420388082,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":68,"outputTokens":970,"cacheReadTokens":301184,"cacheWriteTokens":0,"reasoningTokens":297,"finishReason":"tool-calls"},{"time":1787420395492,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":59,"outputTokens":1383,"cacheReadTokens":302208,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420404175,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":81,"outputTokens":758,"cacheReadTokens":303616,"cacheWriteTokens":0,"reasoningTokens":634,"finishReason":"tool-calls"},{"time":1787420410196,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1177,"outputTokens":1313,"cacheReadTokens":304384,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420417779,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":105,"outputTokens":137,"cacheReadTokens":306816,"cacheWriteTokens":0,"reasoningTokens":23,"finishReason":"tool-calls"},{"time":1787420421078,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":754,"outputTokens":322,"cacheReadTokens":306944,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420425059,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":99,"outputTokens":769,"cacheReadTokens":307968,"cacheWriteTokens":0,"reasoningTokens":243,"finishReason":"tool-calls"},{"time":1787420431213,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":140,"outputTokens":145,"cacheReadTokens":308736,"cacheWriteTokens":0,"reasoningTokens":23,"finishReason":"tool-calls"},{"time":1787420434393,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":237,"outputTokens":99,"cacheReadTokens":308992,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420437082,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":272,"outputTokens":394,"cacheReadTokens":309248,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420440985,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":67,"outputTokens":355,"cacheReadTokens":309888,"cacheWriteTokens":0,"reasoningTokens":23,"finishReason":"tool-calls"},{"time":1787420444884,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":78,"outputTokens":313,"cacheReadTokens":310272,"cacheWriteTokens":0,"reasoningTokens":26,"finishReason":"tool-calls"},{"time":1787420448497,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":61,"outputTokens":293,"cacheReadTokens":310656,"cacheWriteTokens":0,"reasoningTokens":192,"finishReason":"tool-calls"},{"time":1787420452818,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1997,"outputTokens":453,"cacheReadTokens":310912,"cacheWriteTokens":0,"reasoningTokens":152,"finishReason":"tool-calls"},{"time":1787420458424,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":59,"outputTokens":1267,"cacheReadTokens":313344,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420466000,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":87,"outputTokens":285,"cacheReadTokens":314624,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420470236,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":157,"outputTokens":303,"cacheReadTokens":314880,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420474235,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":117,"outputTokens":255,"cacheReadTokens":315264,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420477739,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":157,"outputTokens":213,"cacheReadTokens":315520,"cacheWriteTokens":0,"reasoningTokens":16,"finishReason":"tool-calls"},{"time":1787420480936,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":156,"outputTokens":184,"cacheReadTokens":315776,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420484094,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":126,"outputTokens":335,"cacheReadTokens":316032,"cacheWriteTokens":0,"reasoningTokens":114,"finishReason":"tool-calls"},{"time":1787420488361,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":117,"outputTokens":241,"cacheReadTokens":316416,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420491476,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":142,"outputTokens":1139,"cacheReadTokens":316672,"cacheWriteTokens":0,"reasoningTokens":978,"finishReason":"tool-calls"},{"time":1787420499755,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":48,"outputTokens":1142,"cacheReadTokens":317952,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420507437,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":85,"outputTokens":244,"cacheReadTokens":319104,"cacheWriteTokens":0,"reasoningTokens":117,"finishReason":"tool-calls"},{"time":1787420516176,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":92,"outputTokens":152,"cacheReadTokens":319360,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420535884,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":222,"outputTokens":273,"cacheReadTokens":319488,"cacheWriteTokens":0,"reasoningTokens":58,"finishReason":"tool-calls"},{"time":1787420617620,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":114,"outputTokens":2367,"cacheReadTokens":320000,"cacheWriteTokens":0,"reasoningTokens":2239,"finishReason":"tool-calls"},{"time":1787420643233,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":644,"outputTokens":1817,"cacheReadTokens":322432,"cacheWriteTokens":0,"reasoningTokens":1716,"finishReason":"tool-calls"},{"time":1787420663701,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2621,"outputTokens":940,"cacheReadTokens":323072,"cacheWriteTokens":0,"reasoningTokens":555,"finishReason":"tool-calls"},{"time":1787420673253,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":148,"outputTokens":508,"cacheReadTokens":326528,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420678223,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":59,"outputTokens":1290,"cacheReadTokens":327168,"cacheWriteTokens":0,"reasoningTokens":124,"finishReason":"tool-calls"},{"time":1787420686934,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":128,"outputTokens":581,"cacheReadTokens":328448,"cacheWriteTokens":0,"reasoningTokens":266,"finishReason":"tool-calls"},{"time":1787420693124,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":116,"outputTokens":197,"cacheReadTokens":329088,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420696506,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":104,"outputTokens":208,"cacheReadTokens":329344,"cacheWriteTokens":0,"reasoningTokens":78,"finishReason":"tool-calls"},{"time":1787420702346,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":527,"outputTokens":557,"cacheReadTokens":329600,"cacheWriteTokens":0,"reasoningTokens":355,"finishReason":"tool-calls"},{"time":1787420710913,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":219,"outputTokens":222,"cacheReadTokens":330624,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420715950,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":536,"outputTokens":994,"cacheReadTokens":331008,"cacheWriteTokens":0,"reasoningTokens":843,"finishReason":"tool-calls"},{"time":1787420727388,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":747,"outputTokens":171,"cacheReadTokens":332416,"cacheWriteTokens":0,"reasoningTokens":70,"finishReason":"tool-calls"},{"time":1787420731161,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1780,"outputTokens":604,"cacheReadTokens":333312,"cacheWriteTokens":0,"reasoningTokens":345,"finishReason":"tool-calls"},{"time":1787420738013,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":123,"outputTokens":239,"cacheReadTokens":335616,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420741855,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":149,"outputTokens":180,"cacheReadTokens":335872,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420745337,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":116,"outputTokens":168,"cacheReadTokens":336128,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420748763,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":71,"outputTokens":442,"cacheReadTokens":336384,"cacheWriteTokens":0,"reasoningTokens":101,"finishReason":"tool-calls"},{"time":1787420753694,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":44,"outputTokens":185,"cacheReadTokens":336896,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420757053,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":143,"outputTokens":230,"cacheReadTokens":337024,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420760840,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":162,"outputTokens":194,"cacheReadTokens":337280,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420764197,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":145,"outputTokens":472,"cacheReadTokens":337536,"cacheWriteTokens":0,"reasoningTokens":248,"finishReason":"tool-calls"},{"time":1787420771109,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":535,"outputTokens":201,"cacheReadTokens":337664,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420774820,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":142,"outputTokens":239,"cacheReadTokens":338304,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420778539,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":172,"outputTokens":174,"cacheReadTokens":338560,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420781717,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":137,"outputTokens":576,"cacheReadTokens":338816,"cacheWriteTokens":0,"reasoningTokens":459,"finishReason":"tool-calls"},{"time":1787420789570,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1018,"outputTokens":416,"cacheReadTokens":339456,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420794710,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":62,"outputTokens":94,"cacheReadTokens":340864,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420797919,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":803,"outputTokens":725,"cacheReadTokens":340992,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420804013,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":165,"outputTokens":737,"cacheReadTokens":342400,"cacheWriteTokens":0,"reasoningTokens":12,"finishReason":"tool-calls"},{"time":1787420810061,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":42,"outputTokens":221,"cacheReadTokens":343296,"cacheWriteTokens":0,"reasoningTokens":135,"finishReason":"tool-calls"},{"time":1787420814209,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":385,"outputTokens":94,"cacheReadTokens":343552,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420817122,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":614,"outputTokens":996,"cacheReadTokens":343936,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420826388,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1134,"outputTokens":567,"cacheReadTokens":344448,"cacheWriteTokens":0,"reasoningTokens":87,"finishReason":"tool-calls"},{"time":1787420843965,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":73,"outputTokens":1444,"cacheReadTokens":346112,"cacheWriteTokens":0,"reasoningTokens":1120,"finishReason":"tool-calls"},{"time":1787420859727,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":137,"outputTokens":762,"cacheReadTokens":347520,"cacheWriteTokens":0,"reasoningTokens":36,"finishReason":"stop"},{"time":1787420994978,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":59537,"outputTokens":2020,"cacheReadTokens":289408,"cacheWriteTokens":0,"reasoningTokens":1758,"finishReason":"tool-calls"},{"time":1787421014784,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":517,"outputTokens":1507,"cacheReadTokens":350848,"cacheWriteTokens":0,"reasoningTokens":1257,"finishReason":"tool-calls"},{"time":1787421029901,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1052,"outputTokens":398,"cacheReadTokens":352768,"cacheWriteTokens":0,"reasoningTokens":218,"finishReason":"tool-calls"},{"time":1787421037119,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2671,"outputTokens":2463,"cacheReadTokens":354176,"cacheWriteTokens":0,"reasoningTokens":2394,"finishReason":"tool-calls"},{"time":1787421062898,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":337,"outputTokens":256,"cacheReadTokens":359296,"cacheWriteTokens":0,"reasoningTokens":184,"finishReason":"tool-calls"},{"time":1787421068810,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":831,"outputTokens":259,"cacheReadTokens":359808,"cacheWriteTokens":0,"reasoningTokens":184,"finishReason":"tool-calls"},{"time":1787421074721,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":269,"outputTokens":328,"cacheReadTokens":360832,"cacheWriteTokens":0,"reasoningTokens":261,"finishReason":"tool-calls"},{"time":1787421081674,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":457,"outputTokens":321,"cacheReadTokens":361344,"cacheWriteTokens":0,"reasoningTokens":255,"finishReason":"tool-calls"},{"time":1787421087649,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1912,"outputTokens":1767,"cacheReadTokens":362112,"cacheWriteTokens":0,"reasoningTokens":991,"finishReason":"tool-calls"},{"time":1787421171333,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":162,"outputTokens":4290,"cacheReadTokens":365696,"cacheWriteTokens":0,"reasoningTokens":2416,"finishReason":"tool-calls"},{"time":1787421420702,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":21310,"outputTokens":534,"cacheReadTokens":348416,"cacheWriteTokens":0,"reasoningTokens":218,"finishReason":"tool-calls"},{"time":1787421430369,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":112,"outputTokens":512,"cacheReadTokens":370176,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421436345,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":167,"outputTokens":744,"cacheReadTokens":370688,"cacheWriteTokens":0,"reasoningTokens":342,"finishReason":"tool-calls"},{"time":1787421444444,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":53,"outputTokens":806,"cacheReadTokens":371584,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421452354,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":129,"outputTokens":396,"cacheReadTokens":372352,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421457572,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":53,"outputTokens":259,"cacheReadTokens":372864,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421463217,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":96,"outputTokens":331,"cacheReadTokens":373120,"cacheWriteTokens":0,"reasoningTokens":26,"finishReason":"tool-calls"},{"time":1787421469203,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":84,"outputTokens":1063,"cacheReadTokens":373504,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421477127,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":164,"outputTokens":164,"cacheReadTokens":374528,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421481257,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":113,"outputTokens":242,"cacheReadTokens":374784,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421490416,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":140,"outputTokens":422,"cacheReadTokens":375040,"cacheWriteTokens":0,"reasoningTokens":114,"finishReason":"tool-calls"},{"time":1787421496229,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":92,"outputTokens":2229,"cacheReadTokens":375552,"cacheWriteTokens":0,"reasoningTokens":528,"finishReason":"tool-calls"},{"time":1787421510769,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":78,"outputTokens":229,"cacheReadTokens":377856,"cacheWriteTokens":0,"reasoningTokens":122,"finishReason":"tool-calls"},{"time":1787421515412,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2830,"outputTokens":125,"cacheReadTokens":378112,"cacheWriteTokens":0,"reasoningTokens":64,"finishReason":"tool-calls"},{"time":1787421520309,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":156,"outputTokens":183,"cacheReadTokens":381056,"cacheWriteTokens":0,"reasoningTokens":97,"finishReason":"tool-calls"},{"time":1787421525055,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1778,"outputTokens":250,"cacheReadTokens":381312,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421529085,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":152,"outputTokens":189,"cacheReadTokens":383232,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421540114,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":129,"outputTokens":150,"cacheReadTokens":383488,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421545869,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":67,"outputTokens":315,"cacheReadTokens":383744,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421551260,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":184,"outputTokens":577,"cacheReadTokens":384000,"cacheWriteTokens":0,"reasoningTokens":54,"finishReason":"tool-calls"},{"time":1787421557779,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":181,"outputTokens":787,"cacheReadTokens":384640,"cacheWriteTokens":0,"reasoningTokens":233,"finishReason":"tool-calls"},{"time":1787421565907,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":132,"outputTokens":312,"cacheReadTokens":385536,"cacheWriteTokens":0,"reasoningTokens":124,"finishReason":"tool-calls"},{"time":1787421571679,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":99,"outputTokens":417,"cacheReadTokens":385920,"cacheWriteTokens":0,"reasoningTokens":165,"finishReason":"tool-calls"},{"time":1787421578642,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":49,"outputTokens":429,"cacheReadTokens":386432,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421584150,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":139,"outputTokens":1007,"cacheReadTokens":386816,"cacheWriteTokens":0,"reasoningTokens":110,"finishReason":"tool-calls"},{"time":1787421593604,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":158,"outputTokens":685,"cacheReadTokens":387840,"cacheWriteTokens":0,"reasoningTokens":256,"finishReason":"tool-calls"},{"time":1787421602051,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":111,"outputTokens":705,"cacheReadTokens":388608,"cacheWriteTokens":0,"reasoningTokens":109,"finishReason":"tool-calls"},{"time":1787421609555,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":84,"outputTokens":230,"cacheReadTokens":389376,"cacheWriteTokens":0,"reasoningTokens":95,"finishReason":"tool-calls"},{"time":1787421619948,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":77,"outputTokens":161,"cacheReadTokens":389632,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421637153,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":471,"outputTokens":285,"cacheReadTokens":389760,"cacheWriteTokens":0,"reasoningTokens":92,"finishReason":"tool-calls"},{"time":1787421642370,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":163,"outputTokens":161,"cacheReadTokens":390400,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421658521,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":391,"outputTokens":635,"cacheReadTokens":390656,"cacheWriteTokens":0,"reasoningTokens":311,"finishReason":"tool-calls"},{"time":1787421666474,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":30,"outputTokens":498,"cacheReadTokens":391680,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"stop"},{"time":1787847771415,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"session-title","inputTokens":153,"outputTokens":7,"cacheReadTokens":0,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"stop"},{"time":1787847771415,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":10340,"outputTokens":677,"cacheReadTokens":0,"cacheWriteTokens":0,"reasoningTokens":514,"finishReason":"tool-calls"},{"time":1787847791602,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1631,"outputTokens":379,"cacheReadTokens":11008,"cacheWriteTokens":0,"reasoningTokens":224,"finishReason":"tool-calls"},{"time":1787847811372,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1216,"outputTokens":246,"cacheReadTokens":12928,"cacheWriteTokens":0,"reasoningTokens":131,"finishReason":"tool-calls"},{"time":1787847815194,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3675,"outputTokens":2374,"cacheReadTokens":14336,"cacheWriteTokens":0,"reasoningTokens":2225,"finishReason":"tool-calls"},{"time":1787847847444,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":435,"outputTokens":3081,"cacheReadTokens":20352,"cacheWriteTokens":0,"reasoningTokens":2949,"finishReason":"tool-calls"},{"time":1787847888796,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":4188,"outputTokens":3762,"cacheReadTokens":20736,"cacheWriteTokens":0,"reasoningTokens":1613,"finishReason":"tool-calls"},{"time":1787847986452,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3927,"outputTokens":1995,"cacheReadTokens":24832,"cacheWriteTokens":0,"reasoningTokens":1911,"finishReason":"tool-calls"},{"time":1787848010448,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":49,"outputTokens":3485,"cacheReadTokens":30720,"cacheWriteTokens":0,"reasoningTokens":23,"finishReason":"tool-calls"},{"time":1787848041488,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":133,"outputTokens":558,"cacheReadTokens":34176,"cacheWriteTokens":0,"reasoningTokens":32,"finishReason":"stop"},{"time":1787848082788,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":58,"outputTokens":2756,"cacheReadTokens":34816,"cacheWriteTokens":0,"reasoningTokens":2461,"finishReason":"tool-calls"},{"time":1787848112346,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":310,"outputTokens":541,"cacheReadTokens":37504,"cacheWriteTokens":0,"reasoningTokens":200,"finishReason":"tool-calls"},{"time":1787848117169,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":137,"outputTokens":170,"cacheReadTokens":38272,"cacheWriteTokens":0,"reasoningTokens":87,"finishReason":"tool-calls"},{"time":1787848120649,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":332,"outputTokens":931,"cacheReadTokens":38528,"cacheWriteTokens":0,"reasoningTokens":676,"finishReason":"tool-calls"},{"time":1787848131768,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":800,"outputTokens":1958,"cacheReadTokens":39680,"cacheWriteTokens":0,"reasoningTokens":1684,"finishReason":"tool-calls"},{"time":1787848151120,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1130,"outputTokens":2780,"cacheReadTokens":42368,"cacheWriteTokens":0,"reasoningTokens":2458,"finishReason":"tool-calls"},{"time":1787848178264,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":452,"outputTokens":2264,"cacheReadTokens":46208,"cacheWriteTokens":0,"reasoningTokens":2059,"finishReason":"tool-calls"},{"time":1787848202416,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":445,"outputTokens":2039,"cacheReadTokens":48896,"cacheWriteTokens":0,"reasoningTokens":1755,"finishReason":"tool-calls"},{"time":1787848222562,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":181,"outputTokens":2842,"cacheReadTokens":51328,"cacheWriteTokens":0,"reasoningTokens":2581,"finishReason":"tool-calls"},{"time":1787848251756,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":243,"outputTokens":2139,"cacheReadTokens":54272,"cacheWriteTokens":0,"reasoningTokens":1880,"finishReason":"tool-calls"},{"time":1787848271428,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":98,"outputTokens":83,"cacheReadTokens":56576,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787848294021,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":875,"outputTokens":1801,"cacheReadTokens":57344,"cacheWriteTokens":0,"reasoningTokens":1574,"finishReason":"tool-calls"},{"time":1787848311283,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":136,"outputTokens":83,"cacheReadTokens":59904,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787848399977,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1951,"outputTokens":510,"cacheReadTokens":60032,"cacheWriteTokens":0,"reasoningTokens":328,"finishReason":"tool-calls"},{"time":1787848405748,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":603,"outputTokens":687,"cacheReadTokens":62464,"cacheWriteTokens":0,"reasoningTokens":485,"finishReason":"tool-calls"},{"time":1787848412281,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":972,"outputTokens":342,"cacheReadTokens":63744,"cacheWriteTokens":0,"reasoningTokens":138,"finishReason":"tool-calls"},{"time":1787848415831,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":103,"outputTokens":628,"cacheReadTokens":65024,"cacheWriteTokens":0,"reasoningTokens":430,"finishReason":"tool-calls"},{"time":1787848422560,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":111,"outputTokens":353,"cacheReadTokens":65664,"cacheWriteTokens":0,"reasoningTokens":85,"finishReason":"tool-calls"},{"time":1787848428842,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":179,"outputTokens":412,"cacheReadTokens":66048,"cacheWriteTokens":0,"reasoningTokens":294,"finishReason":"tool-calls"},{"time":1787848597616,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1708,"outputTokens":3795,"cacheReadTokens":66560,"cacheWriteTokens":0,"reasoningTokens":3498,"finishReason":"tool-calls"},{"time":1787848632546,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":715,"outputTokens":3155,"cacheReadTokens":71936,"cacheWriteTokens":0,"reasoningTokens":2907,"finishReason":"tool-calls"},{"time":1787848661577,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":50,"outputTokens":83,"cacheReadTokens":75776,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787849083870,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":147,"outputTokens":150,"cacheReadTokens":75904,"cacheWriteTokens":0,"reasoningTokens":50,"finishReason":"tool-calls"},{"time":1787849188408,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":341,"outputTokens":747,"cacheReadTokens":76160,"cacheWriteTokens":0,"reasoningTokens":483,"finishReason":"tool-calls"},{"time":1787849196710,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":480,"outputTokens":556,"cacheReadTokens":77184,"cacheWriteTokens":0,"reasoningTokens":323,"finishReason":"tool-calls"},{"time":1787849202972,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":217,"outputTokens":1342,"cacheReadTokens":78208,"cacheWriteTokens":0,"reasoningTokens":758,"finishReason":"tool-calls"},{"time":1787849212443,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":88,"outputTokens":766,"cacheReadTokens":79744,"cacheWriteTokens":0,"reasoningTokens":71,"finishReason":"stop"},{"time":1787849220721,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":327,"outputTokens":4420,"cacheReadTokens":80512,"cacheWriteTokens":0,"reasoningTokens":4258,"finishReason":"tool-calls"},{"time":1787849276956,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":399,"outputTokens":500,"cacheReadTokens":85248,"cacheWriteTokens":0,"reasoningTokens":351,"finishReason":"tool-calls"},{"time":1787849293766,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":371,"outputTokens":5463,"cacheReadTokens":86144,"cacheWriteTokens":0,"reasoningTokens":5273,"finishReason":"tool-calls"},{"time":1787849354798,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":361,"outputTokens":3860,"cacheReadTokens":91904,"cacheWriteTokens":0,"reasoningTokens":2592,"finishReason":"tool-calls"},{"time":1787849423176,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":197,"outputTokens":4986,"cacheReadTokens":96000,"cacheWriteTokens":0,"reasoningTokens":4827,"finishReason":"tool-calls"},{"time":1787849465507,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":91,"outputTokens":1396,"cacheReadTokens":101120,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787849475684,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":133,"outputTokens":845,"cacheReadTokens":102528,"cacheWriteTokens":0,"reasoningTokens":15,"finishReason":"tool-calls"},{"time":1787849484475,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":137,"outputTokens":246,"cacheReadTokens":103424,"cacheWriteTokens":0,"reasoningTokens":21,"finishReason":"tool-calls"},{"time":1787849488244,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":165,"outputTokens":200,"cacheReadTokens":103680,"cacheWriteTokens":0,"reasoningTokens":117,"finishReason":"tool-calls"},{"time":1787849492253,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2046,"outputTokens":1163,"cacheReadTokens":103936,"cacheWriteTokens":0,"reasoningTokens":237,"finishReason":"tool-calls"},{"time":1787849503173,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":87,"outputTokens":605,"cacheReadTokens":107136,"cacheWriteTokens":0,"reasoningTokens":463,"finishReason":"tool-calls"},{"time":1787849512033,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":68,"outputTokens":182,"cacheReadTokens":107776,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787849514402,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":142,"outputTokens":83,"cacheReadTokens":107904,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787849741843,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":221,"outputTokens":849,"cacheReadTokens":108032,"cacheWriteTokens":0,"reasoningTokens":637,"finishReason":"tool-calls"},{"time":1787849752042,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":74,"outputTokens":658,"cacheReadTokens":109056,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"stop"},{"time":1787850579977,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":588,"outputTokens":2714,"cacheReadTokens":109696,"cacheWriteTokens":0,"reasoningTokens":2498,"finishReason":"tool-calls"},{"time":1787850617342,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":608,"outputTokens":2289,"cacheReadTokens":112896,"cacheWriteTokens":0,"reasoningTokens":1239,"finishReason":"tool-calls"},{"time":1787850636042,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":122,"outputTokens":777,"cacheReadTokens":115712,"cacheWriteTokens":0,"reasoningTokens":37,"finishReason":"tool-calls"},{"time":1787850641890,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":44,"outputTokens":596,"cacheReadTokens":116608,"cacheWriteTokens":0,"reasoningTokens":175,"finishReason":"tool-calls"},{"time":1787850700692,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":66,"outputTokens":1466,"cacheReadTokens":117248,"cacheWriteTokens":0,"reasoningTokens":1109,"finishReason":"tool-calls"},{"time":1787850715229,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":144,"outputTokens":83,"cacheReadTokens":118656,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787850845968,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":233,"outputTokens":1245,"cacheReadTokens":118784,"cacheWriteTokens":0,"reasoningTokens":1125,"finishReason":"tool-calls"},{"time":1787850865340,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":212,"outputTokens":869,"cacheReadTokens":120192,"cacheWriteTokens":0,"reasoningTokens":555,"finishReason":"tool-calls"},{"time":1787850892511,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":221,"outputTokens":330,"cacheReadTokens":121216,"cacheWriteTokens":0,"reasoningTokens":83,"finishReason":"tool-calls"},{"time":1787850903324,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":73,"outputTokens":299,"cacheReadTokens":121728,"cacheWriteTokens":0,"reasoningTokens":96,"finishReason":"tool-calls"},{"time":1787850912594,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":162,"outputTokens":401,"cacheReadTokens":121984,"cacheWriteTokens":0,"reasoningTokens":225,"finishReason":"tool-calls"},{"time":1787850925169,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":80,"outputTokens":1032,"cacheReadTokens":122496,"cacheWriteTokens":0,"reasoningTokens":845,"finishReason":"tool-calls"},{"time":1787850953402,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":282,"outputTokens":456,"cacheReadTokens":123520,"cacheWriteTokens":0,"reasoningTokens":250,"finishReason":"tool-calls"},{"time":1787850964725,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":233,"outputTokens":213,"cacheReadTokens":124160,"cacheWriteTokens":0,"reasoningTokens":29,"finishReason":"tool-calls"},{"time":1787850969657,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":267,"outputTokens":106,"cacheReadTokens":124544,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787850972527,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1007,"outputTokens":275,"cacheReadTokens":124800,"cacheWriteTokens":0,"reasoningTokens":142,"finishReason":"tool-calls"},{"time":1787850976894,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":695,"outputTokens":438,"cacheReadTokens":126080,"cacheWriteTokens":0,"reasoningTokens":295,"finishReason":"tool-calls"},{"time":1787850985080,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":502,"outputTokens":394,"cacheReadTokens":127104,"cacheWriteTokens":0,"reasoningTokens":249,"finishReason":"tool-calls"},{"time":1787850990250,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1670,"outputTokens":570,"cacheReadTokens":128000,"cacheWriteTokens":0,"reasoningTokens":420,"finishReason":"tool-calls"},{"time":1787850997042,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2821,"outputTokens":370,"cacheReadTokens":130176,"cacheWriteTokens":0,"reasoningTokens":207,"finishReason":"tool-calls"},{"time":1787851001783,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3017,"outputTokens":3830,"cacheReadTokens":133248,"cacheWriteTokens":0,"reasoningTokens":2148,"finishReason":"tool-calls"},{"time":1787851027606,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":117,"outputTokens":316,"cacheReadTokens":140032,"cacheWriteTokens":0,"reasoningTokens":16,"finishReason":"tool-calls"},{"time":1787851031612,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":69,"outputTokens":83,"cacheReadTokens":140416,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787851334221,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":155,"outputTokens":233,"cacheReadTokens":140544,"cacheWriteTokens":0,"reasoningTokens":121,"finishReason":"tool-calls"},{"time":1787851529321,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":34,"outputTokens":1127,"cacheReadTokens":140928,"cacheWriteTokens":0,"reasoningTokens":717,"finishReason":"tool-calls"},{"time":1787851661528,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":93,"outputTokens":1348,"cacheReadTokens":142080,"cacheWriteTokens":0,"reasoningTokens":885,"finishReason":"tool-calls"},{"time":1787851676171,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":53,"outputTokens":682,"cacheReadTokens":143488,"cacheWriteTokens":0,"reasoningTokens":64,"finishReason":"tool-calls"},{"time":1787851682644,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":135,"outputTokens":83,"cacheReadTokens":144128,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787852105562,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":119,"outputTokens":184,"cacheReadTokens":144256,"cacheWriteTokens":0,"reasoningTokens":101,"finishReason":"tool-calls"},{"time":1787852529786,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":68,"outputTokens":387,"cacheReadTokens":144512,"cacheWriteTokens":0,"reasoningTokens":304,"finishReason":"tool-calls"},{"time":1787852955884,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":133,"outputTokens":1323,"cacheReadTokens":144896,"cacheWriteTokens":0,"reasoningTokens":1155,"finishReason":"tool-calls"},{"time":1787852971222,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":69,"outputTokens":293,"cacheReadTokens":146304,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787852978771,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":126,"outputTokens":83,"cacheReadTokens":146560,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787853023624,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":213,"outputTokens":233,"cacheReadTokens":146688,"cacheWriteTokens":0,"reasoningTokens":68,"finishReason":"tool-calls"},{"time":1787853029333,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":168,"outputTokens":1397,"cacheReadTokens":147072,"cacheWriteTokens":0,"reasoningTokens":1025,"finishReason":"tool-calls"},{"time":1787853046393,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":49,"outputTokens":83,"cacheReadTokens":148608,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787853049379,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":445,"outputTokens":417,"cacheReadTokens":148736,"cacheWriteTokens":0,"reasoningTokens":199,"finishReason":"tool-calls"},{"time":1787853055393,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":192,"outputTokens":2898,"cacheReadTokens":149504,"cacheWriteTokens":0,"reasoningTokens":2623,"finishReason":"tool-calls"},{"time":1787853083921,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":150,"outputTokens":1705,"cacheReadTokens":152576,"cacheWriteTokens":0,"reasoningTokens":1141,"finishReason":"tool-calls"},{"time":1787853102381,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1747,"outputTokens":293,"cacheReadTokens":152704,"cacheWriteTokens":0,"reasoningTokens":210,"finishReason":"tool-calls"},{"time":1787853106534,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":952,"outputTokens":1025,"cacheReadTokens":154624,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787853114227,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":98,"outputTokens":83,"cacheReadTokens":156544,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787853417375,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":74,"outputTokens":240,"cacheReadTokens":156672,"cacheWriteTokens":0,"reasoningTokens":157,"finishReason":"tool-calls"},{"time":1787853630737,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":77,"outputTokens":505,"cacheReadTokens":156928,"cacheWriteTokens":0,"reasoningTokens":223,"finishReason":"tool-calls"},{"time":1787853639520,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":91,"outputTokens":796,"cacheReadTokens":157440,"cacheWriteTokens":0,"reasoningTokens":356,"finishReason":"stop"},{"time":1787853956415,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":410,"outputTokens":1400,"cacheReadTokens":158208,"cacheWriteTokens":0,"reasoningTokens":1050,"finishReason":"tool-calls"},{"time":1787853970550,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":76,"outputTokens":193,"cacheReadTokens":160000,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787853973952,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":54,"outputTokens":348,"cacheReadTokens":160256,"cacheWriteTokens":0,"reasoningTokens":220,"finishReason":"tool-calls"},{"time":1787853980639,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1233,"outputTokens":689,"cacheReadTokens":160640,"cacheWriteTokens":0,"reasoningTokens":325,"finishReason":"tool-calls"},{"time":1787853988606,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":52,"outputTokens":419,"cacheReadTokens":162560,"cacheWriteTokens":0,"reasoningTokens":88,"finishReason":"tool-calls"},{"time":1787853994185,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":128,"outputTokens":746,"cacheReadTokens":162944,"cacheWriteTokens":0,"reasoningTokens":261,"finishReason":"stop"},{"time":1787855320366,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":529,"outputTokens":11827,"cacheReadTokens":163840,"cacheWriteTokens":0,"reasoningTokens":11623,"finishReason":"tool-calls"},{"time":1787855417009,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":96,"outputTokens":1540,"cacheReadTokens":176128,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787855429037,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":155,"outputTokens":1841,"cacheReadTokens":177664,"cacheWriteTokens":0,"reasoningTokens":999,"finishReason":"tool-calls"},{"time":1787855443518,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":132,"outputTokens":219,"cacheReadTokens":179584,"cacheWriteTokens":0,"reasoningTokens":47,"finishReason":"tool-calls"},{"time":1787855448923,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":508,"outputTokens":986,"cacheReadTokens":179840,"cacheWriteTokens":0,"reasoningTokens":698,"finishReason":"tool-calls"},{"time":1787855460751,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":481,"outputTokens":861,"cacheReadTokens":181248,"cacheWriteTokens":0,"reasoningTokens":656,"finishReason":"tool-calls"},{"time":1787855472416,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":131,"outputTokens":711,"cacheReadTokens":182528,"cacheWriteTokens":0,"reasoningTokens":515,"finishReason":"tool-calls"},{"time":1787855481083,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":704,"outputTokens":354,"cacheReadTokens":183296,"cacheWriteTokens":0,"reasoningTokens":62,"finishReason":"tool-calls"},{"time":1787855489990,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":75,"outputTokens":627,"cacheReadTokens":184320,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787855497309,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":103,"outputTokens":136,"cacheReadTokens":184960,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787855501455,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":139,"outputTokens":911,"cacheReadTokens":185088,"cacheWriteTokens":0,"reasoningTokens":332,"finishReason":"stop"},{"time":1787856405452,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":5726,"outputTokens":10601,"cacheReadTokens":186112,"cacheWriteTokens":0,"reasoningTokens":10250,"finishReason":"tool-calls"},{"time":1787856502898,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":276,"outputTokens":147,"cacheReadTokens":202368,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787856506988,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1068,"outputTokens":618,"cacheReadTokens":202752,"cacheWriteTokens":0,"reasoningTokens":423,"finishReason":"tool-calls"},{"time":1787856514804,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":672,"outputTokens":266,"cacheReadTokens":204416,"cacheWriteTokens":0,"reasoningTokens":115,"finishReason":"tool-calls"},{"time":1787856520332,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1244,"outputTokens":2008,"cacheReadTokens":205312,"cacheWriteTokens":0,"reasoningTokens":1501,"finishReason":"tool-calls"},{"time":1787856538345,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":90,"outputTokens":325,"cacheReadTokens":208512,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787856543201,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":71,"outputTokens":300,"cacheReadTokens":208896,"cacheWriteTokens":0,"reasoningTokens":80,"finishReason":"tool-calls"},{"time":1787856548498,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":135,"outputTokens":83,"cacheReadTokens":209152,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787856851627,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":140,"outputTokens":108,"cacheReadTokens":209280,"cacheWriteTokens":0,"reasoningTokens":25,"finishReason":"tool-calls"},{"time":1787856942002,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":192,"outputTokens":1379,"cacheReadTokens":209408,"cacheWriteTokens":0,"reasoningTokens":537,"finishReason":"tool-calls"},{"time":1787856954099,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":76,"outputTokens":251,"cacheReadTokens":210944,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787857255675,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":105,"outputTokens":2048,"cacheReadTokens":211200,"cacheWriteTokens":0,"reasoningTokens":1310,"finishReason":"tool-calls"},{"time":1787857277151,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":145,"outputTokens":402,"cacheReadTokens":213248,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787857282741,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":76,"outputTokens":160,"cacheReadTokens":213760,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787857289525,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":128,"outputTokens":456,"cacheReadTokens":213888,"cacheWriteTokens":0,"reasoningTokens":60,"finishReason":"tool-calls"},{"time":1787857296193,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":113,"outputTokens":837,"cacheReadTokens":214400,"cacheWriteTokens":0,"reasoningTokens":303,"finishReason":"stop"},{"time":1787857307411,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":68,"outputTokens":1556,"cacheReadTokens":215296,"cacheWriteTokens":0,"reasoningTokens":1432,"finishReason":"tool-calls"},{"time":1787857326158,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":874,"outputTokens":910,"cacheReadTokens":216832,"cacheWriteTokens":0,"reasoningTokens":496,"finishReason":"tool-calls"},{"time":1787857335233,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":198,"outputTokens":99,"cacheReadTokens":218496,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787857339027,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":459,"outputTokens":262,"cacheReadTokens":218752,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787857343663,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":122,"outputTokens":496,"cacheReadTokens":219392,"cacheWriteTokens":0,"reasoningTokens":67,"finishReason":"tool-calls"},{"time":1787857349614,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":218,"outputTokens":162,"cacheReadTokens":219904,"cacheWriteTokens":0,"reasoningTokens":70,"finishReason":"tool-calls"},{"time":1787857359763,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1110,"outputTokens":429,"cacheReadTokens":220160,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787857365253,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":83,"outputTokens":483,"cacheReadTokens":221696,"cacheWriteTokens":0,"reasoningTokens":85,"finishReason":"tool-calls"},{"time":1787857373518,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":207,"outputTokens":678,"cacheReadTokens":222208,"cacheWriteTokens":0,"reasoningTokens":253,"finishReason":"stop"}] \ No newline at end of file +[{"time":1787418340884,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":47749,"outputTokens":679,"cacheReadTokens":0,"cacheWriteTokens":0,"reasoningTokens":481,"finishReason":"tool-calls"},{"time":1787418348699,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1751,"outputTokens":144,"cacheReadTokens":48384,"cacheWriteTokens":0,"reasoningTokens":28,"finishReason":"tool-calls"},{"time":1787418350551,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2603,"outputTokens":212,"cacheReadTokens":50176,"cacheWriteTokens":0,"reasoningTokens":87,"finishReason":"tool-calls"},{"time":1787418352583,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3019,"outputTokens":243,"cacheReadTokens":52864,"cacheWriteTokens":0,"reasoningTokens":58,"finishReason":"tool-calls"},{"time":1787418354887,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3759,"outputTokens":262,"cacheReadTokens":56064,"cacheWriteTokens":0,"reasoningTokens":137,"finishReason":"tool-calls"},{"time":1787418357576,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":6970,"outputTokens":369,"cacheReadTokens":60032,"cacheWriteTokens":0,"reasoningTokens":197,"finishReason":"tool-calls"},{"time":1787418361073,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":5599,"outputTokens":302,"cacheReadTokens":67328,"cacheWriteTokens":0,"reasoningTokens":66,"finishReason":"tool-calls"},{"time":1787418365967,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":709,"outputTokens":231,"cacheReadTokens":73216,"cacheWriteTokens":0,"reasoningTokens":107,"finishReason":"tool-calls"},{"time":1787418372365,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3472,"outputTokens":220,"cacheReadTokens":74112,"cacheWriteTokens":0,"reasoningTokens":44,"finishReason":"tool-calls"},{"time":1787418377727,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":4157,"outputTokens":283,"cacheReadTokens":77696,"cacheWriteTokens":0,"reasoningTokens":58,"finishReason":"tool-calls"},{"time":1787418383582,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":582,"outputTokens":202,"cacheReadTokens":82048,"cacheWriteTokens":0,"reasoningTokens":64,"finishReason":"tool-calls"},{"time":1787418390125,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1555,"outputTokens":407,"cacheReadTokens":82816,"cacheWriteTokens":0,"reasoningTokens":278,"finishReason":"tool-calls"},{"time":1787418394973,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1353,"outputTokens":377,"cacheReadTokens":84736,"cacheWriteTokens":0,"reasoningTokens":256,"finishReason":"tool-calls"},{"time":1787418399028,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":4471,"outputTokens":800,"cacheReadTokens":86400,"cacheWriteTokens":0,"reasoningTokens":674,"finishReason":"tool-calls"},{"time":1787418406673,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":5702,"outputTokens":358,"cacheReadTokens":91648,"cacheWriteTokens":0,"reasoningTokens":128,"finishReason":"tool-calls"},{"time":1787418417400,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1880,"outputTokens":200,"cacheReadTokens":97664,"cacheWriteTokens":0,"reasoningTokens":51,"finishReason":"tool-calls"},{"time":1787418424298,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1836,"outputTokens":3441,"cacheReadTokens":99712,"cacheWriteTokens":0,"reasoningTokens":3356,"finishReason":"tool-calls"},{"time":1787418458047,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1132,"outputTokens":4282,"cacheReadTokens":104960,"cacheWriteTokens":0,"reasoningTokens":4155,"finishReason":"tool-calls"},{"time":1787418498954,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":344,"outputTokens":4881,"cacheReadTokens":110336,"cacheWriteTokens":0,"reasoningTokens":1650,"finishReason":"tool-calls"},{"time":1787418563208,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":5006,"outputTokens":107,"cacheReadTokens":110592,"cacheWriteTokens":0,"reasoningTokens":27,"finishReason":"stop"},{"time":1787418611584,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":156,"outputTokens":2884,"cacheReadTokens":115584,"cacheWriteTokens":0,"reasoningTokens":2292,"finishReason":"tool-calls"},{"time":1787418679492,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":150,"outputTokens":1326,"cacheReadTokens":118528,"cacheWriteTokens":0,"reasoningTokens":1171,"finishReason":"tool-calls"},{"time":1787418693492,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1186,"outputTokens":4853,"cacheReadTokens":119936,"cacheWriteTokens":0,"reasoningTokens":1746,"finishReason":"tool-calls"},{"time":1787418756804,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":78449,"outputTokens":961,"cacheReadTokens":47104,"cacheWriteTokens":0,"reasoningTokens":494,"finishReason":"tool-calls"},{"time":1787418765960,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":78,"outputTokens":125,"cacheReadTokens":126464,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418768051,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2993,"outputTokens":5111,"cacheReadTokens":126592,"cacheWriteTokens":0,"reasoningTokens":3208,"finishReason":"tool-calls"},{"time":1787418800491,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":92,"outputTokens":462,"cacheReadTokens":134656,"cacheWriteTokens":0,"reasoningTokens":15,"finishReason":"tool-calls"},{"time":1787418805877,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":94,"outputTokens":129,"cacheReadTokens":135168,"cacheWriteTokens":0,"reasoningTokens":47,"finishReason":"tool-calls"},{"time":1787418808175,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":285,"outputTokens":216,"cacheReadTokens":135296,"cacheWriteTokens":0,"reasoningTokens":23,"finishReason":"tool-calls"},{"time":1787418811257,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":160,"outputTokens":194,"cacheReadTokens":135680,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418814542,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":142,"outputTokens":359,"cacheReadTokens":135936,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418818377,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":161,"outputTokens":364,"cacheReadTokens":136320,"cacheWriteTokens":0,"reasoningTokens":109,"finishReason":"tool-calls"},{"time":1787418822062,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":62,"outputTokens":140,"cacheReadTokens":136832,"cacheWriteTokens":0,"reasoningTokens":60,"finishReason":"tool-calls"},{"time":1787418824931,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":855,"outputTokens":231,"cacheReadTokens":136960,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418827966,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":100,"outputTokens":749,"cacheReadTokens":137984,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418833388,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":119,"outputTokens":136,"cacheReadTokens":138752,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418835694,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":165,"outputTokens":201,"cacheReadTokens":138880,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418838747,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":148,"outputTokens":134,"cacheReadTokens":139136,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418841634,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":64,"outputTokens":256,"cacheReadTokens":139392,"cacheWriteTokens":0,"reasoningTokens":121,"finishReason":"tool-calls"},{"time":1787418845367,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":102,"outputTokens":620,"cacheReadTokens":139648,"cacheWriteTokens":0,"reasoningTokens":24,"finishReason":"tool-calls"},{"time":1787418849611,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":137,"outputTokens":319,"cacheReadTokens":140288,"cacheWriteTokens":0,"reasoningTokens":118,"finishReason":"tool-calls"},{"time":1787418853189,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":113,"outputTokens":492,"cacheReadTokens":140672,"cacheWriteTokens":0,"reasoningTokens":103,"finishReason":"tool-calls"},{"time":1787418857395,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":133,"outputTokens":127,"cacheReadTokens":141184,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418860705,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":44,"outputTokens":1458,"cacheReadTokens":141440,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418869021,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":150,"outputTokens":111,"cacheReadTokens":142848,"cacheWriteTokens":0,"reasoningTokens":28,"finishReason":"tool-calls"},{"time":1787418872030,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":242,"outputTokens":1444,"cacheReadTokens":143104,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418880222,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":77,"outputTokens":421,"cacheReadTokens":144768,"cacheWriteTokens":0,"reasoningTokens":23,"finishReason":"tool-calls"},{"time":1787418884509,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":164,"outputTokens":97,"cacheReadTokens":145152,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418893248,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":384,"outputTokens":372,"cacheReadTokens":145408,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418897477,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":155,"outputTokens":180,"cacheReadTokens":146048,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418900414,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":120,"outputTokens":410,"cacheReadTokens":146304,"cacheWriteTokens":0,"reasoningTokens":257,"finishReason":"tool-calls"},{"time":1787418905946,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1450,"outputTokens":366,"cacheReadTokens":146816,"cacheWriteTokens":0,"reasoningTokens":297,"finishReason":"tool-calls"},{"time":1787418916817,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":593,"outputTokens":584,"cacheReadTokens":148608,"cacheWriteTokens":0,"reasoningTokens":39,"finishReason":"tool-calls"},{"time":1787418924122,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":75,"outputTokens":97,"cacheReadTokens":149760,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418926332,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":400,"outputTokens":262,"cacheReadTokens":149888,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418931109,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":61,"outputTokens":496,"cacheReadTokens":150528,"cacheWriteTokens":0,"reasoningTokens":32,"finishReason":"tool-calls"},{"time":1787418935733,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":73,"outputTokens":326,"cacheReadTokens":151040,"cacheWriteTokens":0,"reasoningTokens":233,"finishReason":"tool-calls"},{"time":1787418941258,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":810,"outputTokens":4509,"cacheReadTokens":151424,"cacheWriteTokens":0,"reasoningTokens":2830,"finishReason":"tool-calls"},{"time":1787418973669,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":128,"outputTokens":3313,"cacheReadTokens":156672,"cacheWriteTokens":0,"reasoningTokens":1791,"finishReason":"tool-calls"},{"time":1787418995282,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":169,"outputTokens":83,"cacheReadTokens":160000,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787418997989,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":327,"outputTokens":1502,"cacheReadTokens":160128,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419007651,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":92,"outputTokens":647,"cacheReadTokens":161920,"cacheWriteTokens":0,"reasoningTokens":12,"finishReason":"tool-calls"},{"time":1787419012763,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":155,"outputTokens":673,"cacheReadTokens":162560,"cacheWriteTokens":0,"reasoningTokens":47,"finishReason":"tool-calls"},{"time":1787419017935,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":100,"outputTokens":238,"cacheReadTokens":163328,"cacheWriteTokens":0,"reasoningTokens":156,"finishReason":"tool-calls"},{"time":1787419021338,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":495,"outputTokens":134,"cacheReadTokens":163584,"cacheWriteTokens":0,"reasoningTokens":50,"finishReason":"tool-calls"},{"time":1787419024147,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":194,"outputTokens":140,"cacheReadTokens":164096,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419026251,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":118,"outputTokens":299,"cacheReadTokens":164352,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419029292,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":74,"outputTokens":434,"cacheReadTokens":164736,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419033105,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":165,"outputTokens":753,"cacheReadTokens":165120,"cacheWriteTokens":0,"reasoningTokens":582,"finishReason":"tool-calls"},{"time":1787419040965,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1455,"outputTokens":383,"cacheReadTokens":166016,"cacheWriteTokens":0,"reasoningTokens":238,"finishReason":"tool-calls"},{"time":1787419046648,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":328,"outputTokens":1174,"cacheReadTokens":167808,"cacheWriteTokens":0,"reasoningTokens":537,"finishReason":"tool-calls"},{"time":1787419055171,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":149,"outputTokens":244,"cacheReadTokens":169216,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419057983,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":47,"outputTokens":132,"cacheReadTokens":169600,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419060169,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":89,"outputTokens":1199,"cacheReadTokens":169728,"cacheWriteTokens":0,"reasoningTokens":1112,"finishReason":"tool-calls"},{"time":1787419067802,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":454,"outputTokens":515,"cacheReadTokens":171008,"cacheWriteTokens":0,"reasoningTokens":12,"finishReason":"tool-calls"},{"time":1787419072229,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":128,"outputTokens":249,"cacheReadTokens":171904,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419075096,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":175,"outputTokens":115,"cacheReadTokens":172160,"cacheWriteTokens":0,"reasoningTokens":41,"finishReason":"tool-calls"},{"time":1787419077877,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":275,"outputTokens":316,"cacheReadTokens":172416,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419080916,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":128,"outputTokens":134,"cacheReadTokens":172928,"cacheWriteTokens":0,"reasoningTokens":36,"finishReason":"tool-calls"},{"time":1787419083459,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":377,"outputTokens":316,"cacheReadTokens":173184,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419086631,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":93,"outputTokens":98,"cacheReadTokens":173824,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419089146,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":480,"outputTokens":319,"cacheReadTokens":173952,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419092653,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":71,"outputTokens":751,"cacheReadTokens":174720,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419098537,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":110,"outputTokens":229,"cacheReadTokens":175488,"cacheWriteTokens":0,"reasoningTokens":22,"finishReason":"tool-calls"},{"time":1787419101561,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":125,"outputTokens":213,"cacheReadTokens":175744,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419104467,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":124,"outputTokens":609,"cacheReadTokens":176000,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419108659,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":134,"outputTokens":385,"cacheReadTokens":176640,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419111854,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":48,"outputTokens":1747,"cacheReadTokens":177152,"cacheWriteTokens":0,"reasoningTokens":881,"finishReason":"tool-calls"},{"time":1787419124610,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":61,"outputTokens":944,"cacheReadTokens":178944,"cacheWriteTokens":0,"reasoningTokens":75,"finishReason":"tool-calls"},{"time":1787419130671,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":153,"outputTokens":540,"cacheReadTokens":179840,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419135195,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":106,"outputTokens":121,"cacheReadTokens":180480,"cacheWriteTokens":0,"reasoningTokens":19,"finishReason":"tool-calls"},{"time":1787419137780,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":614,"outputTokens":515,"cacheReadTokens":180608,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419141678,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":149,"outputTokens":265,"cacheReadTokens":181632,"cacheWriteTokens":0,"reasoningTokens":185,"finishReason":"tool-calls"},{"time":1787419145527,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":126,"outputTokens":351,"cacheReadTokens":182016,"cacheWriteTokens":0,"reasoningTokens":250,"finishReason":"tool-calls"},{"time":1787419150678,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1287,"outputTokens":219,"cacheReadTokens":182400,"cacheWriteTokens":0,"reasoningTokens":116,"finishReason":"tool-calls"},{"time":1787419153902,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":823,"outputTokens":276,"cacheReadTokens":183808,"cacheWriteTokens":0,"reasoningTokens":117,"finishReason":"tool-calls"},{"time":1787419159337,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":182,"outputTokens":122,"cacheReadTokens":184832,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419163567,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1125,"outputTokens":311,"cacheReadTokens":185088,"cacheWriteTokens":0,"reasoningTokens":151,"finishReason":"tool-calls"},{"time":1787419169385,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2799,"outputTokens":2443,"cacheReadTokens":186496,"cacheWriteTokens":0,"reasoningTokens":2340,"finishReason":"tool-calls"},{"time":1787419188338,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":665,"outputTokens":2291,"cacheReadTokens":191616,"cacheWriteTokens":0,"reasoningTokens":105,"finishReason":"tool-calls"},{"time":1787419201504,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":69,"outputTokens":266,"cacheReadTokens":194560,"cacheWriteTokens":0,"reasoningTokens":8,"finishReason":"tool-calls"},{"time":1787419204801,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":121,"outputTokens":3846,"cacheReadTokens":194816,"cacheWriteTokens":0,"reasoningTokens":1380,"finishReason":"tool-calls"},{"time":1787419226809,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":188,"outputTokens":1515,"cacheReadTokens":198656,"cacheWriteTokens":0,"reasoningTokens":345,"finishReason":"tool-calls"},{"time":1787419236902,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":98,"outputTokens":386,"cacheReadTokens":200320,"cacheWriteTokens":0,"reasoningTokens":239,"finishReason":"tool-calls"},{"time":1787419242891,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":987,"outputTokens":939,"cacheReadTokens":200704,"cacheWriteTokens":0,"reasoningTokens":852,"finishReason":"tool-calls"},{"time":1787419249673,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1193,"outputTokens":1028,"cacheReadTokens":202624,"cacheWriteTokens":0,"reasoningTokens":32,"finishReason":"tool-calls"},{"time":1787419256219,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":106,"outputTokens":574,"cacheReadTokens":204800,"cacheWriteTokens":0,"reasoningTokens":109,"finishReason":"tool-calls"},{"time":1787419261240,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":68,"outputTokens":102,"cacheReadTokens":205440,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419263854,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":62,"outputTokens":1292,"cacheReadTokens":205568,"cacheWriteTokens":0,"reasoningTokens":1148,"finishReason":"tool-calls"},{"time":1787419276141,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":293,"outputTokens":135,"cacheReadTokens":206848,"cacheWriteTokens":0,"reasoningTokens":52,"finishReason":"tool-calls"},{"time":1787419282773,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":332,"outputTokens":228,"cacheReadTokens":207232,"cacheWriteTokens":0,"reasoningTokens":80,"finishReason":"tool-calls"},{"time":1787419286230,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":86,"outputTokens":99,"cacheReadTokens":207744,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419288988,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":77,"outputTokens":83,"cacheReadTokens":207872,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419294142,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":280,"outputTokens":259,"cacheReadTokens":208000,"cacheWriteTokens":0,"reasoningTokens":143,"finishReason":"tool-calls"},{"time":1787419302163,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":44,"outputTokens":527,"cacheReadTokens":208512,"cacheWriteTokens":0,"reasoningTokens":434,"finishReason":"tool-calls"},{"time":1787419307822,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":397,"outputTokens":1142,"cacheReadTokens":209024,"cacheWriteTokens":0,"reasoningTokens":992,"finishReason":"tool-calls"},{"time":1787419317163,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":23,"outputTokens":83,"cacheReadTokens":210560,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419327871,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2920,"outputTokens":1458,"cacheReadTokens":210560,"cacheWriteTokens":0,"reasoningTokens":1259,"finishReason":"tool-calls"},{"time":1787419340951,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":613,"outputTokens":1018,"cacheReadTokens":214912,"cacheWriteTokens":0,"reasoningTokens":744,"finishReason":"tool-calls"},{"time":1787419351551,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":619,"outputTokens":110,"cacheReadTokens":216448,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419355736,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":419,"outputTokens":173,"cacheReadTokens":217088,"cacheWriteTokens":0,"reasoningTokens":25,"finishReason":"tool-calls"},{"time":1787419361841,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":156,"outputTokens":240,"cacheReadTokens":217600,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419366492,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":443,"outputTokens":178,"cacheReadTokens":217984,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419371138,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":708,"outputTokens":290,"cacheReadTokens":218496,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419376119,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":246,"outputTokens":297,"cacheReadTokens":219392,"cacheWriteTokens":0,"reasoningTokens":84,"finishReason":"tool-calls"},{"time":1787419380449,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":48,"outputTokens":167,"cacheReadTokens":219904,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419384449,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":135,"outputTokens":199,"cacheReadTokens":220032,"cacheWriteTokens":0,"reasoningTokens":28,"finishReason":"tool-calls"},{"time":1787419390280,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":92,"outputTokens":108,"cacheReadTokens":220288,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419400401,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":86,"outputTokens":898,"cacheReadTokens":220416,"cacheWriteTokens":0,"reasoningTokens":652,"finishReason":"tool-calls"},{"time":1787419410040,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":102,"outputTokens":234,"cacheReadTokens":221312,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419414604,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1005,"outputTokens":514,"cacheReadTokens":221568,"cacheWriteTokens":0,"reasoningTokens":400,"finishReason":"tool-calls"},{"time":1787419419589,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":472,"outputTokens":1045,"cacheReadTokens":222976,"cacheWriteTokens":0,"reasoningTokens":613,"finishReason":"tool-calls"},{"time":1787419428232,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":152,"outputTokens":506,"cacheReadTokens":224384,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419432624,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":61,"outputTokens":240,"cacheReadTokens":225024,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419436169,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":88,"outputTokens":184,"cacheReadTokens":225280,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419438722,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":59,"outputTokens":223,"cacheReadTokens":225536,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419441674,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":73,"outputTokens":451,"cacheReadTokens":225792,"cacheWriteTokens":0,"reasoningTokens":22,"finishReason":"tool-calls"},{"time":1787419446418,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":51,"outputTokens":302,"cacheReadTokens":226304,"cacheWriteTokens":0,"reasoningTokens":142,"finishReason":"tool-calls"},{"time":1787419450099,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":137,"outputTokens":188,"cacheReadTokens":226560,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419464312,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":988,"outputTokens":718,"cacheReadTokens":226816,"cacheWriteTokens":0,"reasoningTokens":513,"finishReason":"tool-calls"},{"time":1787419471869,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":85,"outputTokens":211,"cacheReadTokens":228480,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419476529,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":140,"outputTokens":351,"cacheReadTokens":228736,"cacheWriteTokens":0,"reasoningTokens":46,"finishReason":"tool-calls"},{"time":1787419481910,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":432,"outputTokens":721,"cacheReadTokens":229120,"cacheWriteTokens":0,"reasoningTokens":589,"finishReason":"tool-calls"},{"time":1787419489367,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":583,"outputTokens":228,"cacheReadTokens":230272,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419492311,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":91,"outputTokens":246,"cacheReadTokens":231040,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419495612,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":129,"outputTokens":242,"cacheReadTokens":231296,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419498881,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":163,"outputTokens":106,"cacheReadTokens":231552,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419501590,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":336,"outputTokens":238,"cacheReadTokens":231808,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419504782,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":110,"outputTokens":73,"cacheReadTokens":232320,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419507459,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":787,"outputTokens":135,"cacheReadTokens":232448,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419510601,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":73,"outputTokens":188,"cacheReadTokens":233344,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419513924,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":51,"outputTokens":188,"cacheReadTokens":233600,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419517016,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":157,"outputTokens":285,"cacheReadTokens":233728,"cacheWriteTokens":0,"reasoningTokens":56,"finishReason":"tool-calls"},{"time":1787419531758,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":407,"outputTokens":407,"cacheReadTokens":234112,"cacheWriteTokens":0,"reasoningTokens":295,"finishReason":"tool-calls"},{"time":1787419537626,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":501,"outputTokens":188,"cacheReadTokens":234880,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419540856,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":94,"outputTokens":193,"cacheReadTokens":235520,"cacheWriteTokens":0,"reasoningTokens":78,"finishReason":"tool-calls"},{"time":1787419544665,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":51,"outputTokens":518,"cacheReadTokens":235776,"cacheWriteTokens":0,"reasoningTokens":435,"finishReason":"tool-calls"},{"time":1787419550232,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1068,"outputTokens":706,"cacheReadTokens":236288,"cacheWriteTokens":0,"reasoningTokens":481,"finishReason":"tool-calls"},{"time":1787419726919,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":130,"outputTokens":83,"cacheReadTokens":237952,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419788755,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":750,"outputTokens":536,"cacheReadTokens":238080,"cacheWriteTokens":0,"reasoningTokens":291,"finishReason":"tool-calls"},{"time":1787419810192,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":26,"outputTokens":83,"cacheReadTokens":239360,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419824956,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":173,"outputTokens":1022,"cacheReadTokens":239360,"cacheWriteTokens":0,"reasoningTokens":906,"finishReason":"tool-calls"},{"time":1787419833964,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1194,"outputTokens":1037,"cacheReadTokens":240512,"cacheWriteTokens":0,"reasoningTokens":676,"finishReason":"tool-calls"},{"time":1787419843513,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":93,"outputTokens":922,"cacheReadTokens":242688,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419849670,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":176,"outputTokens":169,"cacheReadTokens":243584,"cacheWriteTokens":0,"reasoningTokens":50,"finishReason":"tool-calls"},{"time":1787419856871,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":283,"outputTokens":330,"cacheReadTokens":243840,"cacheWriteTokens":0,"reasoningTokens":74,"finishReason":"tool-calls"},{"time":1787419860604,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":139,"outputTokens":114,"cacheReadTokens":244352,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419867023,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":142,"outputTokens":575,"cacheReadTokens":244480,"cacheWriteTokens":0,"reasoningTokens":107,"finishReason":"tool-calls"},{"time":1787419872580,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":124,"outputTokens":94,"cacheReadTokens":245120,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419875211,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":710,"outputTokens":302,"cacheReadTokens":245248,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419878582,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":152,"outputTokens":94,"cacheReadTokens":246144,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419881324,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":954,"outputTokens":770,"cacheReadTokens":246272,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419887162,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":96,"outputTokens":94,"cacheReadTokens":247936,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419889960,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":682,"outputTokens":1177,"cacheReadTokens":248064,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419897622,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":103,"outputTokens":237,"cacheReadTokens":249856,"cacheWriteTokens":0,"reasoningTokens":124,"finishReason":"tool-calls"},{"time":1787419901176,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":885,"outputTokens":1587,"cacheReadTokens":250112,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419911189,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":76,"outputTokens":117,"cacheReadTokens":252544,"cacheWriteTokens":0,"reasoningTokens":23,"finishReason":"tool-calls"},{"time":1787419913861,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":944,"outputTokens":1299,"cacheReadTokens":252672,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419922237,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":103,"outputTokens":436,"cacheReadTokens":254848,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419926702,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":63,"outputTokens":163,"cacheReadTokens":255360,"cacheWriteTokens":0,"reasoningTokens":69,"finishReason":"tool-calls"},{"time":1787419929760,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1186,"outputTokens":1650,"cacheReadTokens":255488,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787419938603,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":61,"outputTokens":925,"cacheReadTokens":258304,"cacheWriteTokens":0,"reasoningTokens":583,"finishReason":"tool-calls"},{"time":1787419945842,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":131,"outputTokens":139,"cacheReadTokens":259200,"cacheWriteTokens":0,"reasoningTokens":63,"finishReason":"tool-calls"},{"time":1787419949257,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":285,"outputTokens":677,"cacheReadTokens":259456,"cacheWriteTokens":0,"reasoningTokens":528,"finishReason":"tool-calls"},{"time":1787419955685,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":102,"outputTokens":207,"cacheReadTokens":260352,"cacheWriteTokens":0,"reasoningTokens":78,"finishReason":"tool-calls"},{"time":1787420048586,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":135264,"outputTokens":1960,"cacheReadTokens":125952,"cacheWriteTokens":0,"reasoningTokens":1782,"finishReason":"tool-calls"},{"time":1787420070729,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":96,"outputTokens":224,"cacheReadTokens":263168,"cacheWriteTokens":0,"reasoningTokens":150,"finishReason":"tool-calls"},{"time":1787420074260,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2568,"outputTokens":2778,"cacheReadTokens":263424,"cacheWriteTokens":0,"reasoningTokens":2590,"finishReason":"tool-calls"},{"time":1787420099484,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":989,"outputTokens":155,"cacheReadTokens":268672,"cacheWriteTokens":0,"reasoningTokens":59,"finishReason":"tool-calls"},{"time":1787420102771,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":942,"outputTokens":803,"cacheReadTokens":269696,"cacheWriteTokens":0,"reasoningTokens":677,"finishReason":"tool-calls"},{"time":1787420111631,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1224,"outputTokens":742,"cacheReadTokens":271360,"cacheWriteTokens":0,"reasoningTokens":590,"finishReason":"tool-calls"},{"time":1787420119768,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1574,"outputTokens":2803,"cacheReadTokens":273280,"cacheWriteTokens":0,"reasoningTokens":2665,"finishReason":"tool-calls"},{"time":1787420145120,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":39,"outputTokens":227,"cacheReadTokens":277632,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420149688,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":330,"outputTokens":163,"cacheReadTokens":277888,"cacheWriteTokens":0,"reasoningTokens":48,"finishReason":"tool-calls"},{"time":1787420153910,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":303,"outputTokens":317,"cacheReadTokens":278272,"cacheWriteTokens":0,"reasoningTokens":180,"finishReason":"tool-calls"},{"time":1787420159033,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1148,"outputTokens":216,"cacheReadTokens":278784,"cacheWriteTokens":0,"reasoningTokens":112,"finishReason":"tool-calls"},{"time":1787420162555,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":688,"outputTokens":5725,"cacheReadTokens":280064,"cacheWriteTokens":0,"reasoningTokens":3333,"finishReason":"tool-calls"},{"time":1787420239046,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":5810,"outputTokens":158,"cacheReadTokens":280704,"cacheWriteTokens":0,"reasoningTokens":14,"finishReason":"stop"},{"time":1787420256979,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":102,"outputTokens":2745,"cacheReadTokens":286592,"cacheWriteTokens":0,"reasoningTokens":837,"finishReason":"tool-calls"},{"time":1787420286331,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":28409,"outputTokens":650,"cacheReadTokens":260608,"cacheWriteTokens":0,"reasoningTokens":294,"finishReason":"tool-calls"},{"time":1787420292483,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":31,"outputTokens":89,"cacheReadTokens":289664,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420295611,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":686,"outputTokens":920,"cacheReadTokens":289664,"cacheWriteTokens":0,"reasoningTokens":705,"finishReason":"tool-calls"},{"time":1787420306331,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":969,"outputTokens":136,"cacheReadTokens":291200,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420310412,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":621,"outputTokens":2532,"cacheReadTokens":292224,"cacheWriteTokens":0,"reasoningTokens":2111,"finishReason":"tool-calls"},{"time":1787420329266,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":139,"outputTokens":142,"cacheReadTokens":295296,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420332310,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":83,"outputTokens":513,"cacheReadTokens":295552,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420337030,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":141,"outputTokens":306,"cacheReadTokens":296064,"cacheWriteTokens":0,"reasoningTokens":35,"finishReason":"tool-calls"},{"time":1787420341237,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":121,"outputTokens":246,"cacheReadTokens":296448,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420344539,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":169,"outputTokens":493,"cacheReadTokens":296704,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420349064,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":81,"outputTokens":208,"cacheReadTokens":297344,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420353013,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":89,"outputTokens":572,"cacheReadTokens":297600,"cacheWriteTokens":0,"reasoningTokens":280,"finishReason":"tool-calls"},{"time":1787420359300,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":69,"outputTokens":174,"cacheReadTokens":298240,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420362808,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":163,"outputTokens":1400,"cacheReadTokens":298368,"cacheWriteTokens":0,"reasoningTokens":1097,"finishReason":"tool-calls"},{"time":1787420375224,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1493,"outputTokens":148,"cacheReadTokens":298496,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420378251,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":147,"outputTokens":790,"cacheReadTokens":300032,"cacheWriteTokens":0,"reasoningTokens":104,"finishReason":"tool-calls"},{"time":1787420384463,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":88,"outputTokens":189,"cacheReadTokens":300928,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420388082,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":68,"outputTokens":970,"cacheReadTokens":301184,"cacheWriteTokens":0,"reasoningTokens":297,"finishReason":"tool-calls"},{"time":1787420395492,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":59,"outputTokens":1383,"cacheReadTokens":302208,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420404175,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":81,"outputTokens":758,"cacheReadTokens":303616,"cacheWriteTokens":0,"reasoningTokens":634,"finishReason":"tool-calls"},{"time":1787420410196,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1177,"outputTokens":1313,"cacheReadTokens":304384,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420417779,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":105,"outputTokens":137,"cacheReadTokens":306816,"cacheWriteTokens":0,"reasoningTokens":23,"finishReason":"tool-calls"},{"time":1787420421078,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":754,"outputTokens":322,"cacheReadTokens":306944,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420425059,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":99,"outputTokens":769,"cacheReadTokens":307968,"cacheWriteTokens":0,"reasoningTokens":243,"finishReason":"tool-calls"},{"time":1787420431213,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":140,"outputTokens":145,"cacheReadTokens":308736,"cacheWriteTokens":0,"reasoningTokens":23,"finishReason":"tool-calls"},{"time":1787420434393,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":237,"outputTokens":99,"cacheReadTokens":308992,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420437082,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":272,"outputTokens":394,"cacheReadTokens":309248,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420440985,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":67,"outputTokens":355,"cacheReadTokens":309888,"cacheWriteTokens":0,"reasoningTokens":23,"finishReason":"tool-calls"},{"time":1787420444884,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":78,"outputTokens":313,"cacheReadTokens":310272,"cacheWriteTokens":0,"reasoningTokens":26,"finishReason":"tool-calls"},{"time":1787420448497,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":61,"outputTokens":293,"cacheReadTokens":310656,"cacheWriteTokens":0,"reasoningTokens":192,"finishReason":"tool-calls"},{"time":1787420452818,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1997,"outputTokens":453,"cacheReadTokens":310912,"cacheWriteTokens":0,"reasoningTokens":152,"finishReason":"tool-calls"},{"time":1787420458424,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":59,"outputTokens":1267,"cacheReadTokens":313344,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420466000,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":87,"outputTokens":285,"cacheReadTokens":314624,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420470236,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":157,"outputTokens":303,"cacheReadTokens":314880,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420474235,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":117,"outputTokens":255,"cacheReadTokens":315264,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420477739,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":157,"outputTokens":213,"cacheReadTokens":315520,"cacheWriteTokens":0,"reasoningTokens":16,"finishReason":"tool-calls"},{"time":1787420480936,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":156,"outputTokens":184,"cacheReadTokens":315776,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420484094,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":126,"outputTokens":335,"cacheReadTokens":316032,"cacheWriteTokens":0,"reasoningTokens":114,"finishReason":"tool-calls"},{"time":1787420488361,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":117,"outputTokens":241,"cacheReadTokens":316416,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420491476,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":142,"outputTokens":1139,"cacheReadTokens":316672,"cacheWriteTokens":0,"reasoningTokens":978,"finishReason":"tool-calls"},{"time":1787420499755,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":48,"outputTokens":1142,"cacheReadTokens":317952,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420507437,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":85,"outputTokens":244,"cacheReadTokens":319104,"cacheWriteTokens":0,"reasoningTokens":117,"finishReason":"tool-calls"},{"time":1787420516176,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":92,"outputTokens":152,"cacheReadTokens":319360,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420535884,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":222,"outputTokens":273,"cacheReadTokens":319488,"cacheWriteTokens":0,"reasoningTokens":58,"finishReason":"tool-calls"},{"time":1787420617620,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":114,"outputTokens":2367,"cacheReadTokens":320000,"cacheWriteTokens":0,"reasoningTokens":2239,"finishReason":"tool-calls"},{"time":1787420643233,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":644,"outputTokens":1817,"cacheReadTokens":322432,"cacheWriteTokens":0,"reasoningTokens":1716,"finishReason":"tool-calls"},{"time":1787420663701,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2621,"outputTokens":940,"cacheReadTokens":323072,"cacheWriteTokens":0,"reasoningTokens":555,"finishReason":"tool-calls"},{"time":1787420673253,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":148,"outputTokens":508,"cacheReadTokens":326528,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420678223,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":59,"outputTokens":1290,"cacheReadTokens":327168,"cacheWriteTokens":0,"reasoningTokens":124,"finishReason":"tool-calls"},{"time":1787420686934,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":128,"outputTokens":581,"cacheReadTokens":328448,"cacheWriteTokens":0,"reasoningTokens":266,"finishReason":"tool-calls"},{"time":1787420693124,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":116,"outputTokens":197,"cacheReadTokens":329088,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420696506,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":104,"outputTokens":208,"cacheReadTokens":329344,"cacheWriteTokens":0,"reasoningTokens":78,"finishReason":"tool-calls"},{"time":1787420702346,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":527,"outputTokens":557,"cacheReadTokens":329600,"cacheWriteTokens":0,"reasoningTokens":355,"finishReason":"tool-calls"},{"time":1787420710913,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":219,"outputTokens":222,"cacheReadTokens":330624,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420715950,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":536,"outputTokens":994,"cacheReadTokens":331008,"cacheWriteTokens":0,"reasoningTokens":843,"finishReason":"tool-calls"},{"time":1787420727388,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":747,"outputTokens":171,"cacheReadTokens":332416,"cacheWriteTokens":0,"reasoningTokens":70,"finishReason":"tool-calls"},{"time":1787420731161,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1780,"outputTokens":604,"cacheReadTokens":333312,"cacheWriteTokens":0,"reasoningTokens":345,"finishReason":"tool-calls"},{"time":1787420738013,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":123,"outputTokens":239,"cacheReadTokens":335616,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420741855,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":149,"outputTokens":180,"cacheReadTokens":335872,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420745337,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":116,"outputTokens":168,"cacheReadTokens":336128,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420748763,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":71,"outputTokens":442,"cacheReadTokens":336384,"cacheWriteTokens":0,"reasoningTokens":101,"finishReason":"tool-calls"},{"time":1787420753694,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":44,"outputTokens":185,"cacheReadTokens":336896,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420757053,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":143,"outputTokens":230,"cacheReadTokens":337024,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420760840,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":162,"outputTokens":194,"cacheReadTokens":337280,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420764197,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":145,"outputTokens":472,"cacheReadTokens":337536,"cacheWriteTokens":0,"reasoningTokens":248,"finishReason":"tool-calls"},{"time":1787420771109,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":535,"outputTokens":201,"cacheReadTokens":337664,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420774820,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":142,"outputTokens":239,"cacheReadTokens":338304,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420778539,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":172,"outputTokens":174,"cacheReadTokens":338560,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420781717,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":137,"outputTokens":576,"cacheReadTokens":338816,"cacheWriteTokens":0,"reasoningTokens":459,"finishReason":"tool-calls"},{"time":1787420789570,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1018,"outputTokens":416,"cacheReadTokens":339456,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420794710,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":62,"outputTokens":94,"cacheReadTokens":340864,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420797919,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":803,"outputTokens":725,"cacheReadTokens":340992,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420804013,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":165,"outputTokens":737,"cacheReadTokens":342400,"cacheWriteTokens":0,"reasoningTokens":12,"finishReason":"tool-calls"},{"time":1787420810061,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":42,"outputTokens":221,"cacheReadTokens":343296,"cacheWriteTokens":0,"reasoningTokens":135,"finishReason":"tool-calls"},{"time":1787420814209,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":385,"outputTokens":94,"cacheReadTokens":343552,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420817122,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":614,"outputTokens":996,"cacheReadTokens":343936,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787420826388,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1134,"outputTokens":567,"cacheReadTokens":344448,"cacheWriteTokens":0,"reasoningTokens":87,"finishReason":"tool-calls"},{"time":1787420843965,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":73,"outputTokens":1444,"cacheReadTokens":346112,"cacheWriteTokens":0,"reasoningTokens":1120,"finishReason":"tool-calls"},{"time":1787420859727,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":137,"outputTokens":762,"cacheReadTokens":347520,"cacheWriteTokens":0,"reasoningTokens":36,"finishReason":"stop"},{"time":1787420994978,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":59537,"outputTokens":2020,"cacheReadTokens":289408,"cacheWriteTokens":0,"reasoningTokens":1758,"finishReason":"tool-calls"},{"time":1787421014784,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":517,"outputTokens":1507,"cacheReadTokens":350848,"cacheWriteTokens":0,"reasoningTokens":1257,"finishReason":"tool-calls"},{"time":1787421029901,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1052,"outputTokens":398,"cacheReadTokens":352768,"cacheWriteTokens":0,"reasoningTokens":218,"finishReason":"tool-calls"},{"time":1787421037119,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2671,"outputTokens":2463,"cacheReadTokens":354176,"cacheWriteTokens":0,"reasoningTokens":2394,"finishReason":"tool-calls"},{"time":1787421062898,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":337,"outputTokens":256,"cacheReadTokens":359296,"cacheWriteTokens":0,"reasoningTokens":184,"finishReason":"tool-calls"},{"time":1787421068810,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":831,"outputTokens":259,"cacheReadTokens":359808,"cacheWriteTokens":0,"reasoningTokens":184,"finishReason":"tool-calls"},{"time":1787421074721,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":269,"outputTokens":328,"cacheReadTokens":360832,"cacheWriteTokens":0,"reasoningTokens":261,"finishReason":"tool-calls"},{"time":1787421081674,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":457,"outputTokens":321,"cacheReadTokens":361344,"cacheWriteTokens":0,"reasoningTokens":255,"finishReason":"tool-calls"},{"time":1787421087649,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1912,"outputTokens":1767,"cacheReadTokens":362112,"cacheWriteTokens":0,"reasoningTokens":991,"finishReason":"tool-calls"},{"time":1787421171333,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":162,"outputTokens":4290,"cacheReadTokens":365696,"cacheWriteTokens":0,"reasoningTokens":2416,"finishReason":"tool-calls"},{"time":1787421420702,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":21310,"outputTokens":534,"cacheReadTokens":348416,"cacheWriteTokens":0,"reasoningTokens":218,"finishReason":"tool-calls"},{"time":1787421430369,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":112,"outputTokens":512,"cacheReadTokens":370176,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421436345,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":167,"outputTokens":744,"cacheReadTokens":370688,"cacheWriteTokens":0,"reasoningTokens":342,"finishReason":"tool-calls"},{"time":1787421444444,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":53,"outputTokens":806,"cacheReadTokens":371584,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421452354,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":129,"outputTokens":396,"cacheReadTokens":372352,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421457572,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":53,"outputTokens":259,"cacheReadTokens":372864,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421463217,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":96,"outputTokens":331,"cacheReadTokens":373120,"cacheWriteTokens":0,"reasoningTokens":26,"finishReason":"tool-calls"},{"time":1787421469203,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":84,"outputTokens":1063,"cacheReadTokens":373504,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421477127,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":164,"outputTokens":164,"cacheReadTokens":374528,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421481257,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":113,"outputTokens":242,"cacheReadTokens":374784,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421490416,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":140,"outputTokens":422,"cacheReadTokens":375040,"cacheWriteTokens":0,"reasoningTokens":114,"finishReason":"tool-calls"},{"time":1787421496229,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":92,"outputTokens":2229,"cacheReadTokens":375552,"cacheWriteTokens":0,"reasoningTokens":528,"finishReason":"tool-calls"},{"time":1787421510769,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":78,"outputTokens":229,"cacheReadTokens":377856,"cacheWriteTokens":0,"reasoningTokens":122,"finishReason":"tool-calls"},{"time":1787421515412,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2830,"outputTokens":125,"cacheReadTokens":378112,"cacheWriteTokens":0,"reasoningTokens":64,"finishReason":"tool-calls"},{"time":1787421520309,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":156,"outputTokens":183,"cacheReadTokens":381056,"cacheWriteTokens":0,"reasoningTokens":97,"finishReason":"tool-calls"},{"time":1787421525055,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1778,"outputTokens":250,"cacheReadTokens":381312,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421529085,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":152,"outputTokens":189,"cacheReadTokens":383232,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421540114,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":129,"outputTokens":150,"cacheReadTokens":383488,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421545869,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":67,"outputTokens":315,"cacheReadTokens":383744,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421551260,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":184,"outputTokens":577,"cacheReadTokens":384000,"cacheWriteTokens":0,"reasoningTokens":54,"finishReason":"tool-calls"},{"time":1787421557779,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":181,"outputTokens":787,"cacheReadTokens":384640,"cacheWriteTokens":0,"reasoningTokens":233,"finishReason":"tool-calls"},{"time":1787421565907,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":132,"outputTokens":312,"cacheReadTokens":385536,"cacheWriteTokens":0,"reasoningTokens":124,"finishReason":"tool-calls"},{"time":1787421571679,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":99,"outputTokens":417,"cacheReadTokens":385920,"cacheWriteTokens":0,"reasoningTokens":165,"finishReason":"tool-calls"},{"time":1787421578642,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":49,"outputTokens":429,"cacheReadTokens":386432,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421584150,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":139,"outputTokens":1007,"cacheReadTokens":386816,"cacheWriteTokens":0,"reasoningTokens":110,"finishReason":"tool-calls"},{"time":1787421593604,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":158,"outputTokens":685,"cacheReadTokens":387840,"cacheWriteTokens":0,"reasoningTokens":256,"finishReason":"tool-calls"},{"time":1787421602051,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":111,"outputTokens":705,"cacheReadTokens":388608,"cacheWriteTokens":0,"reasoningTokens":109,"finishReason":"tool-calls"},{"time":1787421609555,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":84,"outputTokens":230,"cacheReadTokens":389376,"cacheWriteTokens":0,"reasoningTokens":95,"finishReason":"tool-calls"},{"time":1787421619948,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":77,"outputTokens":161,"cacheReadTokens":389632,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421637153,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":471,"outputTokens":285,"cacheReadTokens":389760,"cacheWriteTokens":0,"reasoningTokens":92,"finishReason":"tool-calls"},{"time":1787421642370,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":163,"outputTokens":161,"cacheReadTokens":390400,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787421658521,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":391,"outputTokens":635,"cacheReadTokens":390656,"cacheWriteTokens":0,"reasoningTokens":311,"finishReason":"tool-calls"},{"time":1787421666474,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":30,"outputTokens":498,"cacheReadTokens":391680,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"stop"},{"time":1787847771415,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"session-title","inputTokens":153,"outputTokens":7,"cacheReadTokens":0,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"stop"},{"time":1787847791602,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1631,"outputTokens":379,"cacheReadTokens":11008,"cacheWriteTokens":0,"reasoningTokens":224,"finishReason":"tool-calls"},{"time":1787847811372,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1216,"outputTokens":246,"cacheReadTokens":12928,"cacheWriteTokens":0,"reasoningTokens":131,"finishReason":"tool-calls"},{"time":1787847815194,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3675,"outputTokens":2374,"cacheReadTokens":14336,"cacheWriteTokens":0,"reasoningTokens":2225,"finishReason":"tool-calls"},{"time":1787847847444,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":435,"outputTokens":3081,"cacheReadTokens":20352,"cacheWriteTokens":0,"reasoningTokens":2949,"finishReason":"tool-calls"},{"time":1787847888796,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":4188,"outputTokens":3762,"cacheReadTokens":20736,"cacheWriteTokens":0,"reasoningTokens":1613,"finishReason":"tool-calls"},{"time":1787847986452,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3927,"outputTokens":1995,"cacheReadTokens":24832,"cacheWriteTokens":0,"reasoningTokens":1911,"finishReason":"tool-calls"},{"time":1787848010448,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":49,"outputTokens":3485,"cacheReadTokens":30720,"cacheWriteTokens":0,"reasoningTokens":23,"finishReason":"tool-calls"},{"time":1787848041488,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":133,"outputTokens":558,"cacheReadTokens":34176,"cacheWriteTokens":0,"reasoningTokens":32,"finishReason":"stop"},{"time":1787848082788,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":58,"outputTokens":2756,"cacheReadTokens":34816,"cacheWriteTokens":0,"reasoningTokens":2461,"finishReason":"tool-calls"},{"time":1787848112346,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":310,"outputTokens":541,"cacheReadTokens":37504,"cacheWriteTokens":0,"reasoningTokens":200,"finishReason":"tool-calls"},{"time":1787848117169,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":137,"outputTokens":170,"cacheReadTokens":38272,"cacheWriteTokens":0,"reasoningTokens":87,"finishReason":"tool-calls"},{"time":1787848120649,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":332,"outputTokens":931,"cacheReadTokens":38528,"cacheWriteTokens":0,"reasoningTokens":676,"finishReason":"tool-calls"},{"time":1787848131768,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":800,"outputTokens":1958,"cacheReadTokens":39680,"cacheWriteTokens":0,"reasoningTokens":1684,"finishReason":"tool-calls"},{"time":1787848151120,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1130,"outputTokens":2780,"cacheReadTokens":42368,"cacheWriteTokens":0,"reasoningTokens":2458,"finishReason":"tool-calls"},{"time":1787848178264,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":452,"outputTokens":2264,"cacheReadTokens":46208,"cacheWriteTokens":0,"reasoningTokens":2059,"finishReason":"tool-calls"},{"time":1787848202416,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":445,"outputTokens":2039,"cacheReadTokens":48896,"cacheWriteTokens":0,"reasoningTokens":1755,"finishReason":"tool-calls"},{"time":1787848222562,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":181,"outputTokens":2842,"cacheReadTokens":51328,"cacheWriteTokens":0,"reasoningTokens":2581,"finishReason":"tool-calls"},{"time":1787848251756,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":243,"outputTokens":2139,"cacheReadTokens":54272,"cacheWriteTokens":0,"reasoningTokens":1880,"finishReason":"tool-calls"},{"time":1787848271428,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":98,"outputTokens":83,"cacheReadTokens":56576,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787848294021,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":875,"outputTokens":1801,"cacheReadTokens":57344,"cacheWriteTokens":0,"reasoningTokens":1574,"finishReason":"tool-calls"},{"time":1787848311283,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":136,"outputTokens":83,"cacheReadTokens":59904,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787848399977,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1951,"outputTokens":510,"cacheReadTokens":60032,"cacheWriteTokens":0,"reasoningTokens":328,"finishReason":"tool-calls"},{"time":1787848405748,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":603,"outputTokens":687,"cacheReadTokens":62464,"cacheWriteTokens":0,"reasoningTokens":485,"finishReason":"tool-calls"},{"time":1787848412281,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":972,"outputTokens":342,"cacheReadTokens":63744,"cacheWriteTokens":0,"reasoningTokens":138,"finishReason":"tool-calls"},{"time":1787848415831,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":103,"outputTokens":628,"cacheReadTokens":65024,"cacheWriteTokens":0,"reasoningTokens":430,"finishReason":"tool-calls"},{"time":1787848422560,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":111,"outputTokens":353,"cacheReadTokens":65664,"cacheWriteTokens":0,"reasoningTokens":85,"finishReason":"tool-calls"},{"time":1787848428842,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":179,"outputTokens":412,"cacheReadTokens":66048,"cacheWriteTokens":0,"reasoningTokens":294,"finishReason":"tool-calls"},{"time":1787848597616,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1708,"outputTokens":3795,"cacheReadTokens":66560,"cacheWriteTokens":0,"reasoningTokens":3498,"finishReason":"tool-calls"},{"time":1787848632546,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":715,"outputTokens":3155,"cacheReadTokens":71936,"cacheWriteTokens":0,"reasoningTokens":2907,"finishReason":"tool-calls"},{"time":1787848661577,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":50,"outputTokens":83,"cacheReadTokens":75776,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787849083870,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":147,"outputTokens":150,"cacheReadTokens":75904,"cacheWriteTokens":0,"reasoningTokens":50,"finishReason":"tool-calls"},{"time":1787849188408,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":341,"outputTokens":747,"cacheReadTokens":76160,"cacheWriteTokens":0,"reasoningTokens":483,"finishReason":"tool-calls"},{"time":1787849196710,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":480,"outputTokens":556,"cacheReadTokens":77184,"cacheWriteTokens":0,"reasoningTokens":323,"finishReason":"tool-calls"},{"time":1787849202972,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":217,"outputTokens":1342,"cacheReadTokens":78208,"cacheWriteTokens":0,"reasoningTokens":758,"finishReason":"tool-calls"},{"time":1787849212443,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":88,"outputTokens":766,"cacheReadTokens":79744,"cacheWriteTokens":0,"reasoningTokens":71,"finishReason":"stop"},{"time":1787849220721,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":327,"outputTokens":4420,"cacheReadTokens":80512,"cacheWriteTokens":0,"reasoningTokens":4258,"finishReason":"tool-calls"},{"time":1787849276956,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":399,"outputTokens":500,"cacheReadTokens":85248,"cacheWriteTokens":0,"reasoningTokens":351,"finishReason":"tool-calls"},{"time":1787849293766,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":371,"outputTokens":5463,"cacheReadTokens":86144,"cacheWriteTokens":0,"reasoningTokens":5273,"finishReason":"tool-calls"},{"time":1787849354798,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":361,"outputTokens":3860,"cacheReadTokens":91904,"cacheWriteTokens":0,"reasoningTokens":2592,"finishReason":"tool-calls"},{"time":1787849423176,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":197,"outputTokens":4986,"cacheReadTokens":96000,"cacheWriteTokens":0,"reasoningTokens":4827,"finishReason":"tool-calls"},{"time":1787849465507,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":91,"outputTokens":1396,"cacheReadTokens":101120,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787849475684,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":133,"outputTokens":845,"cacheReadTokens":102528,"cacheWriteTokens":0,"reasoningTokens":15,"finishReason":"tool-calls"},{"time":1787849484475,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":137,"outputTokens":246,"cacheReadTokens":103424,"cacheWriteTokens":0,"reasoningTokens":21,"finishReason":"tool-calls"},{"time":1787849488244,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":165,"outputTokens":200,"cacheReadTokens":103680,"cacheWriteTokens":0,"reasoningTokens":117,"finishReason":"tool-calls"},{"time":1787849492253,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2046,"outputTokens":1163,"cacheReadTokens":103936,"cacheWriteTokens":0,"reasoningTokens":237,"finishReason":"tool-calls"},{"time":1787849503173,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":87,"outputTokens":605,"cacheReadTokens":107136,"cacheWriteTokens":0,"reasoningTokens":463,"finishReason":"tool-calls"},{"time":1787849512033,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":68,"outputTokens":182,"cacheReadTokens":107776,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787849514402,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":142,"outputTokens":83,"cacheReadTokens":107904,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787849741843,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":221,"outputTokens":849,"cacheReadTokens":108032,"cacheWriteTokens":0,"reasoningTokens":637,"finishReason":"tool-calls"},{"time":1787849752042,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":74,"outputTokens":658,"cacheReadTokens":109056,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"stop"},{"time":1787850579977,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":588,"outputTokens":2714,"cacheReadTokens":109696,"cacheWriteTokens":0,"reasoningTokens":2498,"finishReason":"tool-calls"},{"time":1787850617342,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":608,"outputTokens":2289,"cacheReadTokens":112896,"cacheWriteTokens":0,"reasoningTokens":1239,"finishReason":"tool-calls"},{"time":1787850636042,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":122,"outputTokens":777,"cacheReadTokens":115712,"cacheWriteTokens":0,"reasoningTokens":37,"finishReason":"tool-calls"},{"time":1787850641890,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":44,"outputTokens":596,"cacheReadTokens":116608,"cacheWriteTokens":0,"reasoningTokens":175,"finishReason":"tool-calls"},{"time":1787850700692,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":66,"outputTokens":1466,"cacheReadTokens":117248,"cacheWriteTokens":0,"reasoningTokens":1109,"finishReason":"tool-calls"},{"time":1787850715229,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":144,"outputTokens":83,"cacheReadTokens":118656,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787850845968,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":233,"outputTokens":1245,"cacheReadTokens":118784,"cacheWriteTokens":0,"reasoningTokens":1125,"finishReason":"tool-calls"},{"time":1787850865340,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":212,"outputTokens":869,"cacheReadTokens":120192,"cacheWriteTokens":0,"reasoningTokens":555,"finishReason":"tool-calls"},{"time":1787850892511,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":221,"outputTokens":330,"cacheReadTokens":121216,"cacheWriteTokens":0,"reasoningTokens":83,"finishReason":"tool-calls"},{"time":1787850903324,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":73,"outputTokens":299,"cacheReadTokens":121728,"cacheWriteTokens":0,"reasoningTokens":96,"finishReason":"tool-calls"},{"time":1787850912594,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":162,"outputTokens":401,"cacheReadTokens":121984,"cacheWriteTokens":0,"reasoningTokens":225,"finishReason":"tool-calls"},{"time":1787850925169,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":80,"outputTokens":1032,"cacheReadTokens":122496,"cacheWriteTokens":0,"reasoningTokens":845,"finishReason":"tool-calls"},{"time":1787850953402,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":282,"outputTokens":456,"cacheReadTokens":123520,"cacheWriteTokens":0,"reasoningTokens":250,"finishReason":"tool-calls"},{"time":1787850964725,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":233,"outputTokens":213,"cacheReadTokens":124160,"cacheWriteTokens":0,"reasoningTokens":29,"finishReason":"tool-calls"},{"time":1787850969657,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":267,"outputTokens":106,"cacheReadTokens":124544,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787850972527,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1007,"outputTokens":275,"cacheReadTokens":124800,"cacheWriteTokens":0,"reasoningTokens":142,"finishReason":"tool-calls"},{"time":1787850976894,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":695,"outputTokens":438,"cacheReadTokens":126080,"cacheWriteTokens":0,"reasoningTokens":295,"finishReason":"tool-calls"},{"time":1787850985080,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":502,"outputTokens":394,"cacheReadTokens":127104,"cacheWriteTokens":0,"reasoningTokens":249,"finishReason":"tool-calls"},{"time":1787850990250,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1670,"outputTokens":570,"cacheReadTokens":128000,"cacheWriteTokens":0,"reasoningTokens":420,"finishReason":"tool-calls"},{"time":1787850997042,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2821,"outputTokens":370,"cacheReadTokens":130176,"cacheWriteTokens":0,"reasoningTokens":207,"finishReason":"tool-calls"},{"time":1787851001783,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3017,"outputTokens":3830,"cacheReadTokens":133248,"cacheWriteTokens":0,"reasoningTokens":2148,"finishReason":"tool-calls"},{"time":1787851027606,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":117,"outputTokens":316,"cacheReadTokens":140032,"cacheWriteTokens":0,"reasoningTokens":16,"finishReason":"tool-calls"},{"time":1787851031612,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":69,"outputTokens":83,"cacheReadTokens":140416,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787851334221,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":155,"outputTokens":233,"cacheReadTokens":140544,"cacheWriteTokens":0,"reasoningTokens":121,"finishReason":"tool-calls"},{"time":1787851529321,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":34,"outputTokens":1127,"cacheReadTokens":140928,"cacheWriteTokens":0,"reasoningTokens":717,"finishReason":"tool-calls"},{"time":1787851661528,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":93,"outputTokens":1348,"cacheReadTokens":142080,"cacheWriteTokens":0,"reasoningTokens":885,"finishReason":"tool-calls"},{"time":1787851676171,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":53,"outputTokens":682,"cacheReadTokens":143488,"cacheWriteTokens":0,"reasoningTokens":64,"finishReason":"tool-calls"},{"time":1787851682644,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":135,"outputTokens":83,"cacheReadTokens":144128,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787852105562,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":119,"outputTokens":184,"cacheReadTokens":144256,"cacheWriteTokens":0,"reasoningTokens":101,"finishReason":"tool-calls"},{"time":1787852529786,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":68,"outputTokens":387,"cacheReadTokens":144512,"cacheWriteTokens":0,"reasoningTokens":304,"finishReason":"tool-calls"},{"time":1787852955884,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":133,"outputTokens":1323,"cacheReadTokens":144896,"cacheWriteTokens":0,"reasoningTokens":1155,"finishReason":"tool-calls"},{"time":1787852971222,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":69,"outputTokens":293,"cacheReadTokens":146304,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787852978771,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":126,"outputTokens":83,"cacheReadTokens":146560,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787853023624,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":213,"outputTokens":233,"cacheReadTokens":146688,"cacheWriteTokens":0,"reasoningTokens":68,"finishReason":"tool-calls"},{"time":1787853029333,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":168,"outputTokens":1397,"cacheReadTokens":147072,"cacheWriteTokens":0,"reasoningTokens":1025,"finishReason":"tool-calls"},{"time":1787853046393,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":49,"outputTokens":83,"cacheReadTokens":148608,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787853049379,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":445,"outputTokens":417,"cacheReadTokens":148736,"cacheWriteTokens":0,"reasoningTokens":199,"finishReason":"tool-calls"},{"time":1787853055393,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":192,"outputTokens":2898,"cacheReadTokens":149504,"cacheWriteTokens":0,"reasoningTokens":2623,"finishReason":"tool-calls"},{"time":1787853083921,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":150,"outputTokens":1705,"cacheReadTokens":152576,"cacheWriteTokens":0,"reasoningTokens":1141,"finishReason":"tool-calls"},{"time":1787853102381,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1747,"outputTokens":293,"cacheReadTokens":152704,"cacheWriteTokens":0,"reasoningTokens":210,"finishReason":"tool-calls"},{"time":1787853106534,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":952,"outputTokens":1025,"cacheReadTokens":154624,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787853114227,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":98,"outputTokens":83,"cacheReadTokens":156544,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787853417375,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":74,"outputTokens":240,"cacheReadTokens":156672,"cacheWriteTokens":0,"reasoningTokens":157,"finishReason":"tool-calls"},{"time":1787853630737,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":77,"outputTokens":505,"cacheReadTokens":156928,"cacheWriteTokens":0,"reasoningTokens":223,"finishReason":"tool-calls"},{"time":1787853639520,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":91,"outputTokens":796,"cacheReadTokens":157440,"cacheWriteTokens":0,"reasoningTokens":356,"finishReason":"stop"},{"time":1787853956415,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":410,"outputTokens":1400,"cacheReadTokens":158208,"cacheWriteTokens":0,"reasoningTokens":1050,"finishReason":"tool-calls"},{"time":1787853970550,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":76,"outputTokens":193,"cacheReadTokens":160000,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787853973952,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":54,"outputTokens":348,"cacheReadTokens":160256,"cacheWriteTokens":0,"reasoningTokens":220,"finishReason":"tool-calls"},{"time":1787853980639,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1233,"outputTokens":689,"cacheReadTokens":160640,"cacheWriteTokens":0,"reasoningTokens":325,"finishReason":"tool-calls"},{"time":1787853988606,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":52,"outputTokens":419,"cacheReadTokens":162560,"cacheWriteTokens":0,"reasoningTokens":88,"finishReason":"tool-calls"},{"time":1787853994185,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":128,"outputTokens":746,"cacheReadTokens":162944,"cacheWriteTokens":0,"reasoningTokens":261,"finishReason":"stop"},{"time":1787855320366,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":529,"outputTokens":11827,"cacheReadTokens":163840,"cacheWriteTokens":0,"reasoningTokens":11623,"finishReason":"tool-calls"},{"time":1787855417009,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":96,"outputTokens":1540,"cacheReadTokens":176128,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787855429037,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":155,"outputTokens":1841,"cacheReadTokens":177664,"cacheWriteTokens":0,"reasoningTokens":999,"finishReason":"tool-calls"},{"time":1787855443518,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":132,"outputTokens":219,"cacheReadTokens":179584,"cacheWriteTokens":0,"reasoningTokens":47,"finishReason":"tool-calls"},{"time":1787855448923,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":508,"outputTokens":986,"cacheReadTokens":179840,"cacheWriteTokens":0,"reasoningTokens":698,"finishReason":"tool-calls"},{"time":1787855460751,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":481,"outputTokens":861,"cacheReadTokens":181248,"cacheWriteTokens":0,"reasoningTokens":656,"finishReason":"tool-calls"},{"time":1787855472416,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":131,"outputTokens":711,"cacheReadTokens":182528,"cacheWriteTokens":0,"reasoningTokens":515,"finishReason":"tool-calls"},{"time":1787855481083,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":704,"outputTokens":354,"cacheReadTokens":183296,"cacheWriteTokens":0,"reasoningTokens":62,"finishReason":"tool-calls"},{"time":1787855489990,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":75,"outputTokens":627,"cacheReadTokens":184320,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787855497309,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":103,"outputTokens":136,"cacheReadTokens":184960,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787855501455,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":139,"outputTokens":911,"cacheReadTokens":185088,"cacheWriteTokens":0,"reasoningTokens":332,"finishReason":"stop"},{"time":1787856405452,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":5726,"outputTokens":10601,"cacheReadTokens":186112,"cacheWriteTokens":0,"reasoningTokens":10250,"finishReason":"tool-calls"},{"time":1787856502898,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":276,"outputTokens":147,"cacheReadTokens":202368,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787856506988,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1068,"outputTokens":618,"cacheReadTokens":202752,"cacheWriteTokens":0,"reasoningTokens":423,"finishReason":"tool-calls"},{"time":1787856514804,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":672,"outputTokens":266,"cacheReadTokens":204416,"cacheWriteTokens":0,"reasoningTokens":115,"finishReason":"tool-calls"},{"time":1787856520332,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1244,"outputTokens":2008,"cacheReadTokens":205312,"cacheWriteTokens":0,"reasoningTokens":1501,"finishReason":"tool-calls"},{"time":1787856538345,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":90,"outputTokens":325,"cacheReadTokens":208512,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787856543201,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":71,"outputTokens":300,"cacheReadTokens":208896,"cacheWriteTokens":0,"reasoningTokens":80,"finishReason":"tool-calls"},{"time":1787856548498,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":135,"outputTokens":83,"cacheReadTokens":209152,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787856851627,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":140,"outputTokens":108,"cacheReadTokens":209280,"cacheWriteTokens":0,"reasoningTokens":25,"finishReason":"tool-calls"},{"time":1787856942002,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":192,"outputTokens":1379,"cacheReadTokens":209408,"cacheWriteTokens":0,"reasoningTokens":537,"finishReason":"tool-calls"},{"time":1787856954099,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":76,"outputTokens":251,"cacheReadTokens":210944,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787857255675,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":105,"outputTokens":2048,"cacheReadTokens":211200,"cacheWriteTokens":0,"reasoningTokens":1310,"finishReason":"tool-calls"},{"time":1787857277151,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":145,"outputTokens":402,"cacheReadTokens":213248,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787857282741,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":76,"outputTokens":160,"cacheReadTokens":213760,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787857289525,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":128,"outputTokens":456,"cacheReadTokens":213888,"cacheWriteTokens":0,"reasoningTokens":60,"finishReason":"tool-calls"},{"time":1787857296193,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":113,"outputTokens":837,"cacheReadTokens":214400,"cacheWriteTokens":0,"reasoningTokens":303,"finishReason":"stop"},{"time":1787857307411,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":68,"outputTokens":1556,"cacheReadTokens":215296,"cacheWriteTokens":0,"reasoningTokens":1432,"finishReason":"tool-calls"},{"time":1787857326158,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":874,"outputTokens":910,"cacheReadTokens":216832,"cacheWriteTokens":0,"reasoningTokens":496,"finishReason":"tool-calls"},{"time":1787857335233,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":198,"outputTokens":99,"cacheReadTokens":218496,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787857339027,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":459,"outputTokens":262,"cacheReadTokens":218752,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787857343663,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":122,"outputTokens":496,"cacheReadTokens":219392,"cacheWriteTokens":0,"reasoningTokens":67,"finishReason":"tool-calls"},{"time":1787857349614,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":218,"outputTokens":162,"cacheReadTokens":219904,"cacheWriteTokens":0,"reasoningTokens":70,"finishReason":"tool-calls"},{"time":1787857359763,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1110,"outputTokens":429,"cacheReadTokens":220160,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1787857365253,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":83,"outputTokens":483,"cacheReadTokens":221696,"cacheWriteTokens":0,"reasoningTokens":85,"finishReason":"tool-calls"},{"time":1787857373518,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":207,"outputTokens":678,"cacheReadTokens":222208,"cacheWriteTokens":0,"reasoningTokens":253,"finishReason":"stop"},{"time":1788087898608,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":246,"outputTokens":3095,"cacheReadTokens":222976,"cacheWriteTokens":0,"reasoningTokens":2854,"finishReason":"tool-calls"},{"time":1788087926945,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3853,"outputTokens":395,"cacheReadTokens":226304,"cacheWriteTokens":0,"reasoningTokens":202,"finishReason":"tool-calls"},{"time":1788087933974,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2653,"outputTokens":210,"cacheReadTokens":230528,"cacheWriteTokens":0,"reasoningTokens":55,"finishReason":"tool-calls"},{"time":1788087937294,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3798,"outputTokens":8095,"cacheReadTokens":233344,"cacheWriteTokens":0,"reasoningTokens":7919,"finishReason":"tool-calls"},{"time":1788088003994,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":7170,"outputTokens":531,"cacheReadTokens":239232,"cacheWriteTokens":0,"reasoningTokens":319,"finishReason":"tool-calls"},{"time":1788088010358,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":49,"outputTokens":2029,"cacheReadTokens":246912,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788088023870,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":87,"outputTokens":1055,"cacheReadTokens":248960,"cacheWriteTokens":0,"reasoningTokens":506,"finishReason":"tool-calls"},{"time":1788088032675,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1197,"outputTokens":307,"cacheReadTokens":248960,"cacheWriteTokens":0,"reasoningTokens":45,"finishReason":"tool-calls"},{"time":1788088036486,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":190,"outputTokens":131,"cacheReadTokens":250368,"cacheWriteTokens":0,"reasoningTokens":51,"finishReason":"tool-calls"},{"time":1788088039190,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":669,"outputTokens":296,"cacheReadTokens":250624,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788088043106,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":141,"outputTokens":145,"cacheReadTokens":251520,"cacheWriteTokens":0,"reasoningTokens":49,"finishReason":"tool-calls"},{"time":1788088045971,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":507,"outputTokens":237,"cacheReadTokens":251776,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788088049305,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":142,"outputTokens":112,"cacheReadTokens":252416,"cacheWriteTokens":0,"reasoningTokens":31,"finishReason":"tool-calls"},{"time":1788088051883,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":616,"outputTokens":303,"cacheReadTokens":252544,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788088055737,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":62,"outputTokens":83,"cacheReadTokens":253440,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788088058450,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":222,"outputTokens":201,"cacheReadTokens":253568,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788088061446,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":80,"outputTokens":632,"cacheReadTokens":253952,"cacheWriteTokens":0,"reasoningTokens":466,"finishReason":"tool-calls"},{"time":1788088075681,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":88,"outputTokens":1217,"cacheReadTokens":254592,"cacheWriteTokens":0,"reasoningTokens":734,"finishReason":"tool-calls"},{"time":1788088093945,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":189,"outputTokens":894,"cacheReadTokens":255872,"cacheWriteTokens":0,"reasoningTokens":398,"finishReason":"tool-calls"},{"time":1788088106094,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":119,"outputTokens":1595,"cacheReadTokens":256896,"cacheWriteTokens":0,"reasoningTokens":1189,"finishReason":"tool-calls"},{"time":1788088125096,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":126,"outputTokens":1188,"cacheReadTokens":258560,"cacheWriteTokens":0,"reasoningTokens":750,"finishReason":"tool-calls"},{"time":1788088141013,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":86,"outputTokens":1245,"cacheReadTokens":259840,"cacheWriteTokens":0,"reasoningTokens":899,"finishReason":"tool-calls"},{"time":1788088153887,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":731,"outputTokens":412,"cacheReadTokens":261120,"cacheWriteTokens":0,"reasoningTokens":75,"finishReason":"tool-calls"},{"time":1788088157795,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":175,"outputTokens":91,"cacheReadTokens":262144,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788088166248,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":67,"outputTokens":2423,"cacheReadTokens":262400,"cacheWriteTokens":0,"reasoningTokens":1299,"finishReason":"tool-calls"},{"time":1788088182955,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":132,"outputTokens":159,"cacheReadTokens":264832,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788088189895,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":51,"outputTokens":451,"cacheReadTokens":265088,"cacheWriteTokens":0,"reasoningTokens":161,"finishReason":"tool-calls"},{"time":1788088194419,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":218,"outputTokens":83,"cacheReadTokens":265472,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788088196894,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":388,"outputTokens":385,"cacheReadTokens":265728,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788088200974,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":46,"outputTokens":136,"cacheReadTokens":266496,"cacheWriteTokens":0,"reasoningTokens":53,"finishReason":"tool-calls"},{"time":1788088203903,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":500,"outputTokens":780,"cacheReadTokens":266624,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788088210650,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":41,"outputTokens":192,"cacheReadTokens":267904,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788088213970,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":133,"outputTokens":984,"cacheReadTokens":268032,"cacheWriteTokens":0,"reasoningTokens":367,"finishReason":"stop"},{"time":1788088747246,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":139,"outputTokens":5536,"cacheReadTokens":269056,"cacheWriteTokens":0,"reasoningTokens":5087,"finishReason":"tool-calls"},{"time":1788088795400,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":87,"outputTokens":138,"cacheReadTokens":274688,"cacheWriteTokens":0,"reasoningTokens":55,"finishReason":"tool-calls"},{"time":1788088798618,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":345,"outputTokens":239,"cacheReadTokens":274816,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788088801971,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":113,"outputTokens":167,"cacheReadTokens":275328,"cacheWriteTokens":0,"reasoningTokens":39,"finishReason":"tool-calls"},{"time":1788088804909,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":893,"outputTokens":2638,"cacheReadTokens":275584,"cacheWriteTokens":0,"reasoningTokens":1951,"finishReason":"tool-calls"},{"time":1788088823532,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":195,"outputTokens":344,"cacheReadTokens":279040,"cacheWriteTokens":0,"reasoningTokens":72,"finishReason":"tool-calls"},{"time":1788088827727,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":646,"outputTokens":275,"cacheReadTokens":279552,"cacheWriteTokens":0,"reasoningTokens":122,"finishReason":"tool-calls"},{"time":1788088834110,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":421,"outputTokens":776,"cacheReadTokens":280448,"cacheWriteTokens":0,"reasoningTokens":68,"finishReason":"tool-calls"},{"time":1788088840844,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":158,"outputTokens":407,"cacheReadTokens":281600,"cacheWriteTokens":0,"reasoningTokens":94,"finishReason":"tool-calls"},{"time":1788088845368,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":108,"outputTokens":66,"cacheReadTokens":282112,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788088848021,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":312,"outputTokens":425,"cacheReadTokens":282240,"cacheWriteTokens":0,"reasoningTokens":290,"finishReason":"tool-calls"},{"time":1788088854525,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":168,"outputTokens":217,"cacheReadTokens":282880,"cacheWriteTokens":0,"reasoningTokens":91,"finishReason":"tool-calls"},{"time":1788088857785,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3141,"outputTokens":818,"cacheReadTokens":283264,"cacheWriteTokens":0,"reasoningTokens":665,"finishReason":"tool-calls"},{"time":1788088866381,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":616,"outputTokens":3935,"cacheReadTokens":287104,"cacheWriteTokens":0,"reasoningTokens":3685,"finishReason":"tool-calls"},{"time":1788088897405,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1439,"outputTokens":2715,"cacheReadTokens":291584,"cacheWriteTokens":0,"reasoningTokens":1890,"finishReason":"tool-calls"},{"time":1788088916039,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":112,"outputTokens":921,"cacheReadTokens":295680,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788088922951,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":64,"outputTokens":1389,"cacheReadTokens":296704,"cacheWriteTokens":0,"reasoningTokens":21,"finishReason":"tool-calls"},{"time":1788088931787,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":104,"outputTokens":515,"cacheReadTokens":298112,"cacheWriteTokens":0,"reasoningTokens":51,"finishReason":"tool-calls"},{"time":1788088936535,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":228,"outputTokens":467,"cacheReadTokens":298624,"cacheWriteTokens":0,"reasoningTokens":220,"finishReason":"tool-calls"},{"time":1788088963454,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1755,"outputTokens":642,"cacheReadTokens":299264,"cacheWriteTokens":0,"reasoningTokens":476,"finishReason":"tool-calls"},{"time":1788088970666,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":454,"outputTokens":330,"cacheReadTokens":301568,"cacheWriteTokens":0,"reasoningTokens":110,"finishReason":"tool-calls"},{"time":1788088974837,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":55,"outputTokens":157,"cacheReadTokens":302336,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788088982468,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":101,"outputTokens":252,"cacheReadTokens":302464,"cacheWriteTokens":0,"reasoningTokens":82,"finishReason":"tool-calls"},{"time":1788088986059,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":117,"outputTokens":83,"cacheReadTokens":302720,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788089002382,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":717,"outputTokens":1633,"cacheReadTokens":302848,"cacheWriteTokens":0,"reasoningTokens":1439,"finishReason":"tool-calls"},{"time":1788089019406,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":87,"outputTokens":172,"cacheReadTokens":305152,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788089049777,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":25,"outputTokens":986,"cacheReadTokens":305408,"cacheWriteTokens":0,"reasoningTokens":288,"finishReason":"tool-calls"},{"time":1788089059089,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":180,"outputTokens":1214,"cacheReadTokens":306304,"cacheWriteTokens":0,"reasoningTokens":504,"finishReason":"stop"},{"time":1788089596038,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":181,"outputTokens":1714,"cacheReadTokens":307584,"cacheWriteTokens":0,"reasoningTokens":1529,"finishReason":"tool-calls"},{"time":1788089614239,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3135,"outputTokens":378,"cacheReadTokens":309376,"cacheWriteTokens":0,"reasoningTokens":259,"finishReason":"tool-calls"},{"time":1788089620214,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2836,"outputTokens":2613,"cacheReadTokens":312832,"cacheWriteTokens":0,"reasoningTokens":2489,"finishReason":"tool-calls"},{"time":1788089646959,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3288,"outputTokens":1443,"cacheReadTokens":315648,"cacheWriteTokens":0,"reasoningTokens":807,"finishReason":"tool-calls"},{"time":1788089658807,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":238,"outputTokens":433,"cacheReadTokens":320256,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788089663441,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":115,"outputTokens":343,"cacheReadTokens":320896,"cacheWriteTokens":0,"reasoningTokens":58,"finishReason":"tool-calls"},{"time":1788089667773,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":148,"outputTokens":1435,"cacheReadTokens":321280,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788089676428,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":104,"outputTokens":860,"cacheReadTokens":322816,"cacheWriteTokens":0,"reasoningTokens":241,"finishReason":"tool-calls"},{"time":1788089683539,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":186,"outputTokens":538,"cacheReadTokens":323712,"cacheWriteTokens":0,"reasoningTokens":70,"finishReason":"tool-calls"},{"time":1788089688547,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":205,"outputTokens":230,"cacheReadTokens":324352,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788089703929,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":99,"outputTokens":741,"cacheReadTokens":324736,"cacheWriteTokens":0,"reasoningTokens":512,"finishReason":"tool-calls"},{"time":1788089723352,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":398,"outputTokens":398,"cacheReadTokens":325504,"cacheWriteTokens":0,"reasoningTokens":188,"finishReason":"tool-calls"},{"time":1788089728253,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":48,"outputTokens":83,"cacheReadTokens":326272,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788089744803,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":51,"outputTokens":648,"cacheReadTokens":326400,"cacheWriteTokens":0,"reasoningTokens":74,"finishReason":"tool-calls"},{"time":1788089751205,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":100,"outputTokens":897,"cacheReadTokens":327040,"cacheWriteTokens":0,"reasoningTokens":330,"finishReason":"stop"},{"time":1788089917609,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":222,"outputTokens":4670,"cacheReadTokens":327936,"cacheWriteTokens":0,"reasoningTokens":4508,"finishReason":"tool-calls"},{"time":1788089958188,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":246,"outputTokens":1431,"cacheReadTokens":332800,"cacheWriteTokens":0,"reasoningTokens":152,"finishReason":"tool-calls"},{"time":1788089967090,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":95,"outputTokens":161,"cacheReadTokens":334464,"cacheWriteTokens":0,"reasoningTokens":37,"finishReason":"tool-calls"},{"time":1788089970658,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":100,"outputTokens":497,"cacheReadTokens":334720,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788089975286,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":128,"outputTokens":209,"cacheReadTokens":335232,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788090006400,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":125,"outputTokens":792,"cacheReadTokens":335488,"cacheWriteTokens":0,"reasoningTokens":335,"finishReason":"stop"},{"time":1788090056921,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":54,"outputTokens":2067,"cacheReadTokens":336384,"cacheWriteTokens":0,"reasoningTokens":1733,"finishReason":"tool-calls"},{"time":1788090080802,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2196,"outputTokens":351,"cacheReadTokens":336384,"cacheWriteTokens":0,"reasoningTokens":164,"finishReason":"tool-calls"},{"time":1788090086632,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":207,"outputTokens":666,"cacheReadTokens":338816,"cacheWriteTokens":0,"reasoningTokens":336,"finishReason":"stop"},{"time":1788090216787,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":154,"outputTokens":2923,"cacheReadTokens":339584,"cacheWriteTokens":0,"reasoningTokens":2336,"finishReason":"tool-calls"},{"time":1788090242110,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":62,"outputTokens":94,"cacheReadTokens":342656,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788090273114,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":165,"outputTokens":1577,"cacheReadTokens":342784,"cacheWriteTokens":0,"reasoningTokens":785,"finishReason":"tool-calls"},{"time":1788090285502,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":152,"outputTokens":132,"cacheReadTokens":344448,"cacheWriteTokens":0,"reasoningTokens":21,"finishReason":"tool-calls"},{"time":1788090289977,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":594,"outputTokens":655,"cacheReadTokens":344704,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788090296270,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":139,"outputTokens":784,"cacheReadTokens":345856,"cacheWriteTokens":0,"reasoningTokens":668,"finishReason":"tool-calls"},{"time":1788090304877,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":205,"outputTokens":250,"cacheReadTokens":346752,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788090308266,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":113,"outputTokens":265,"cacheReadTokens":347136,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788090349842,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":215,"outputTokens":755,"cacheReadTokens":347392,"cacheWriteTokens":0,"reasoningTokens":262,"finishReason":"stop"},{"time":1788090440493,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":106,"outputTokens":2458,"cacheReadTokens":348288,"cacheWriteTokens":0,"reasoningTokens":1389,"finishReason":"tool-calls"},{"time":1788090458244,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":93,"outputTokens":1287,"cacheReadTokens":350848,"cacheWriteTokens":0,"reasoningTokens":611,"finishReason":"tool-calls"},{"time":1788090467877,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":143,"outputTokens":205,"cacheReadTokens":352128,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788090545561,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":222,"outputTokens":1025,"cacheReadTokens":352384,"cacheWriteTokens":0,"reasoningTokens":726,"finishReason":"tool-calls"},{"time":1788090558891,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":510,"outputTokens":332,"cacheReadTokens":353536,"cacheWriteTokens":0,"reasoningTokens":123,"finishReason":"tool-calls"},{"time":1788090570769,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1862,"outputTokens":78,"cacheReadTokens":354304,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788090574335,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":274,"outputTokens":475,"cacheReadTokens":356224,"cacheWriteTokens":0,"reasoningTokens":263,"finishReason":"tool-calls"},{"time":1788090581430,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":826,"outputTokens":130,"cacheReadTokens":356864,"cacheWriteTokens":0,"reasoningTokens":50,"finishReason":"tool-calls"},{"time":1788090584976,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":659,"outputTokens":1079,"cacheReadTokens":357760,"cacheWriteTokens":0,"reasoningTokens":649,"finishReason":"tool-calls"},{"time":1788090593872,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":117,"outputTokens":205,"cacheReadTokens":359424,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788090625975,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":107,"outputTokens":411,"cacheReadTokens":359680,"cacheWriteTokens":0,"reasoningTokens":153,"finishReason":"stop"},{"time":1788090701987,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":19,"outputTokens":507,"cacheReadTokens":360192,"cacheWriteTokens":0,"reasoningTokens":266,"finishReason":"tool-calls"},{"time":1788090709042,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":478,"outputTokens":759,"cacheReadTokens":360704,"cacheWriteTokens":0,"reasoningTokens":534,"finishReason":"tool-calls"},{"time":1788090718632,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":261,"outputTokens":173,"cacheReadTokens":361856,"cacheWriteTokens":0,"reasoningTokens":68,"finishReason":"tool-calls"},{"time":1788090724372,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":822,"outputTokens":107,"cacheReadTokens":362240,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788090727777,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":593,"outputTokens":853,"cacheReadTokens":363136,"cacheWriteTokens":0,"reasoningTokens":744,"finishReason":"tool-calls"},{"time":1788090739429,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":59,"outputTokens":115,"cacheReadTokens":364544,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788090742524,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":320,"outputTokens":1483,"cacheReadTokens":364672,"cacheWriteTokens":0,"reasoningTokens":1334,"finishReason":"tool-calls"},{"time":1788090756024,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":631,"outputTokens":720,"cacheReadTokens":366464,"cacheWriteTokens":0,"reasoningTokens":336,"finishReason":"tool-calls"},{"time":1788090762581,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":114,"outputTokens":205,"cacheReadTokens":367744,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788090793658,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":104,"outputTokens":469,"cacheReadTokens":368000,"cacheWriteTokens":0,"reasoningTokens":147,"finishReason":"stop"},{"time":1788090913823,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":111,"outputTokens":2626,"cacheReadTokens":368512,"cacheWriteTokens":0,"reasoningTokens":2436,"finishReason":"tool-calls"},{"time":1788090938340,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":2918,"outputTokens":100,"cacheReadTokens":368512,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788090942088,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":245,"outputTokens":268,"cacheReadTokens":371456,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788090946033,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":43,"outputTokens":815,"cacheReadTokens":371968,"cacheWriteTokens":0,"reasoningTokens":604,"finishReason":"tool-calls"},{"time":1788090982091,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":163,"outputTokens":620,"cacheReadTokens":372736,"cacheWriteTokens":0,"reasoningTokens":249,"finishReason":"stop"},{"time":1788091214430,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":776,"outputTokens":3467,"cacheReadTokens":372864,"cacheWriteTokens":0,"reasoningTokens":3240,"finishReason":"tool-calls"},{"time":1788091248324,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":12445,"outputTokens":3650,"cacheReadTokens":377088,"cacheWriteTokens":0,"reasoningTokens":3516,"finishReason":"tool-calls"},{"time":1788091286423,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1204,"outputTokens":789,"cacheReadTokens":393088,"cacheWriteTokens":0,"reasoningTokens":151,"finishReason":"tool-calls"},{"time":1788091294475,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":145,"outputTokens":676,"cacheReadTokens":395008,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788091300454,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":130,"outputTokens":198,"cacheReadTokens":395776,"cacheWriteTokens":0,"reasoningTokens":100,"finishReason":"tool-calls"},{"time":1788091305805,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":3778,"outputTokens":5841,"cacheReadTokens":396032,"cacheWriteTokens":0,"reasoningTokens":2006,"finishReason":"tool-calls"},{"time":1788091344779,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":72,"outputTokens":677,"cacheReadTokens":405632,"cacheWriteTokens":0,"reasoningTokens":73,"finishReason":"tool-calls"},{"time":1788091350690,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":150,"outputTokens":493,"cacheReadTokens":406272,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788091356893,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":79,"outputTokens":683,"cacheReadTokens":406912,"cacheWriteTokens":0,"reasoningTokens":37,"finishReason":"tool-calls"},{"time":1788091363546,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":198,"outputTokens":1196,"cacheReadTokens":407552,"cacheWriteTokens":0,"reasoningTokens":249,"finishReason":"tool-calls"},{"time":1788091374075,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":229,"outputTokens":687,"cacheReadTokens":408832,"cacheWriteTokens":0,"reasoningTokens":527,"finishReason":"tool-calls"},{"time":1788091382413,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":61,"outputTokens":1600,"cacheReadTokens":409728,"cacheWriteTokens":0,"reasoningTokens":1491,"finishReason":"tool-calls"},{"time":1788091399085,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":771,"outputTokens":5761,"cacheReadTokens":411264,"cacheWriteTokens":0,"reasoningTokens":2811,"finishReason":"tool-calls"},{"time":1788091436663,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":61,"outputTokens":316,"cacheReadTokens":417792,"cacheWriteTokens":0,"reasoningTokens":33,"finishReason":"tool-calls"},{"time":1788091477746,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":212,"outputTokens":262,"cacheReadTokens":418048,"cacheWriteTokens":0,"reasoningTokens":32,"finishReason":"tool-calls"},{"time":1788091482144,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":131,"outputTokens":204,"cacheReadTokens":418432,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788091503312,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":105,"outputTokens":579,"cacheReadTokens":418688,"cacheWriteTokens":0,"reasoningTokens":112,"finishReason":"tool-calls"},{"time":1788091510275,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":85,"outputTokens":1165,"cacheReadTokens":419328,"cacheWriteTokens":0,"reasoningTokens":517,"finishReason":"stop"},{"time":1788091570240,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":128,"outputTokens":1724,"cacheReadTokens":420480,"cacheWriteTokens":0,"reasoningTokens":1027,"finishReason":"tool-calls"},{"time":1788091584462,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":142,"outputTokens":398,"cacheReadTokens":422272,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788091589561,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":110,"outputTokens":204,"cacheReadTokens":422784,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788091620927,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":99,"outputTokens":442,"cacheReadTokens":423040,"cacheWriteTokens":0,"reasoningTokens":151,"finishReason":"stop"},{"time":1788091688483,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":46,"outputTokens":1148,"cacheReadTokens":423552,"cacheWriteTokens":0,"reasoningTokens":378,"finishReason":"tool-calls"},{"time":1788091698732,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":200,"outputTokens":214,"cacheReadTokens":424704,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788091729780,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":342,"outputTokens":186,"cacheReadTokens":425088,"cacheWriteTokens":0,"reasoningTokens":34,"finishReason":"stop"},{"time":1788091820431,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":70,"outputTokens":4398,"cacheReadTokens":425600,"cacheWriteTokens":0,"reasoningTokens":4273,"finishReason":"tool-calls"},{"time":1788091865628,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":5477,"outputTokens":2161,"cacheReadTokens":425600,"cacheWriteTokens":0,"reasoningTokens":901,"finishReason":"tool-calls"},{"time":1788091960063,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":150,"outputTokens":4076,"cacheReadTokens":433152,"cacheWriteTokens":0,"reasoningTokens":3901,"finishReason":"tool-calls"},{"time":1788091996959,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":340,"outputTokens":4214,"cacheReadTokens":437376,"cacheWriteTokens":0,"reasoningTokens":3658,"finishReason":"tool-calls"},{"time":1788092030847,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":123,"outputTokens":64,"cacheReadTokens":441856,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788092033974,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":662,"outputTokens":489,"cacheReadTokens":441984,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788092039539,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":165,"outputTokens":521,"cacheReadTokens":443008,"cacheWriteTokens":0,"reasoningTokens":13,"finishReason":"tool-calls"},{"time":1788092045573,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":151,"outputTokens":150,"cacheReadTokens":443648,"cacheWriteTokens":0,"reasoningTokens":28,"finishReason":"tool-calls"},{"time":1788092049392,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":780,"outputTokens":528,"cacheReadTokens":443904,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788092054683,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":106,"outputTokens":1306,"cacheReadTokens":445184,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788092063743,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":45,"outputTokens":129,"cacheReadTokens":446592,"cacheWriteTokens":0,"reasoningTokens":33,"finishReason":"tool-calls"},{"time":1788092068367,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":580,"outputTokens":640,"cacheReadTokens":446720,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788092074132,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":186,"outputTokens":492,"cacheReadTokens":447872,"cacheWriteTokens":0,"reasoningTokens":46,"finishReason":"tool-calls"},{"time":1788092080142,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":118,"outputTokens":531,"cacheReadTokens":448512,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788092085725,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":95,"outputTokens":1826,"cacheReadTokens":449152,"cacheWriteTokens":0,"reasoningTokens":906,"finishReason":"tool-calls"},{"time":1788092103189,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1973,"outputTokens":261,"cacheReadTokens":449152,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788092110849,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":295,"outputTokens":1239,"cacheReadTokens":451328,"cacheWriteTokens":0,"reasoningTokens":638,"finishReason":"tool-calls"},{"time":1788092125307,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":294,"outputTokens":303,"cacheReadTokens":452736,"cacheWriteTokens":0,"reasoningTokens":176,"finishReason":"tool-calls"},{"time":1788092131138,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":140,"outputTokens":67,"cacheReadTokens":453248,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788092135116,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":123,"outputTokens":531,"cacheReadTokens":453376,"cacheWriteTokens":0,"reasoningTokens":300,"finishReason":"tool-calls"},{"time":1788092143182,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":78,"outputTokens":233,"cacheReadTokens":454016,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788092173961,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":138,"outputTokens":731,"cacheReadTokens":454272,"cacheWriteTokens":0,"reasoningTokens":612,"finishReason":"tool-calls"},{"time":1788092182752,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":805,"outputTokens":1354,"cacheReadTokens":455040,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788092192885,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":152,"outputTokens":115,"cacheReadTokens":457088,"cacheWriteTokens":0,"reasoningTokens":16,"finishReason":"tool-calls"},{"time":1788092196811,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":1092,"outputTokens":1136,"cacheReadTokens":457344,"cacheWriteTokens":0,"reasoningTokens":0,"finishReason":"tool-calls"},{"time":1788092206124,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":93,"outputTokens":309,"cacheReadTokens":459520,"cacheWriteTokens":0,"reasoningTokens":66,"finishReason":"tool-calls"},{"time":1788092213317,"model":"deepseek-v4-flash","provider":"deepseek-official","purpose":"","inputTokens":139,"outputTokens":1264,"cacheReadTokens":459904,"cacheWriteTokens":0,"reasoningTokens":497,"finishReason":"stop"}] \ No newline at end of file diff --git a/electron/config.ts b/electron/config.ts index c2a05ea..60b9b75 100644 --- a/electron/config.ts +++ b/electron/config.ts @@ -112,6 +112,21 @@ export interface NetworkConfig { securityId: SecurityIdConfig; } +/** 更新进度持久化(主进程 updater 写入;重启后可恢复/展示) */ +export interface UpdateConfig { + /** 状态:idle/checking/available/not-available/downloading/paused/downloaded/installing/error */ + state: string; + /** 目标版本号 */ + version: string; + /** 下载进度百分比 0-100 */ + percent: number; + transferred: number; + total: number; + /** 更新源:github / 加速源域名 */ + source: string; + error: string; +} + export interface AppConfig { version: number; oobe: boolean; @@ -125,6 +140,7 @@ export interface AppConfig { download: DownloadConfig; network: NetworkConfig; ui: UiConfig; + update: UpdateConfig; instances: InstanceMeta[]; } @@ -141,6 +157,7 @@ const DEFAULTS: AppConfig = { download: { fileSource: 'mirror', versionSource: 'mirror', threads: 16, speedLimit: 0 }, network: { securityId: { enabled: false, authUrl: '' } }, ui: { showInstanceTitle: true, showTaskButton: true }, + update: { state: 'idle', version: '', percent: 0, transferred: 0, total: 0, source: 'github', error: '' }, instances: [], }; diff --git a/electron/handlers/update.ts b/electron/handlers/update.ts new file mode 100644 index 0000000..830ce98 --- /dev/null +++ b/electron/handlers/update.ts @@ -0,0 +1,91 @@ +import electron from 'electron'; +import { updateService } from '../updater'; + +const { ipcMain } = electron; + +/** + * 更新 IPC handler。 + * - 主进程更新服务初始化后,状态变化广播到所有窗口(update:status) + * - 渲染进程通过 update:check / update:download / update:quitAndInstall / update:getState 交互 + */ +export function registerUpdateHandlers() { + updateService.init((payload) => { + for (const win of electron.BrowserWindow.getAllWindows()) { + if (!win.isDestroyed()) { + win.webContents.send('update:status', payload); + } + } + }); + + ipcMain.handle('update:check', async (_event, payload?: { manual?: boolean }) => { + try { + const state = await updateService.check(payload?.manual === true); + return { success: true, data: state, error: null }; + } catch (e: unknown) { + return { success: false, data: null, error: String(e) }; + } + }); + + ipcMain.handle('update:download', async () => { + try { + await updateService.download(); + return { success: true, data: null, error: null }; + } catch (e: unknown) { + return { success: false, data: null, error: String(e) }; + } + }); + + ipcMain.handle('update:pause', () => { + try { + updateService.pause(); + return { success: true, data: null, error: null }; + } catch (e: unknown) { + return { success: false, data: null, error: String(e) }; + } + }); + + ipcMain.handle('update:resume', async () => { + try { + await updateService.download(); // paused → download() 即继续 + return { success: true, data: null, error: null }; + } catch (e: unknown) { + return { success: false, data: null, error: String(e) }; + } + }); + + ipcMain.handle('update:cancel', () => { + try { + updateService.cancel(); + return { success: true, data: null, error: null }; + } catch (e: unknown) { + return { success: false, data: null, error: String(e) }; + } + }); + + ipcMain.handle('update:quitAndInstall', () => { + try { + updateService.quitAndInstall(); + return { success: true, data: null, error: null }; + } catch (e: unknown) { + return { success: false, data: null, error: String(e) }; + } + }); + + ipcMain.handle('update:getState', () => { + try { + return { success: true, data: updateService.getState(), error: null }; + } catch (e: unknown) { + return { success: false, data: null, error: String(e) }; + } + }); + + // 读取发布说明(release-notes.md 附件,原始 Markdown;GitHub 优先 + 加速源兜底) + ipcMain.handle('update:getReleaseNotes', async (_event, payload?: { tag?: string }) => { + try { + const data = await updateService.getReleaseNotes(payload?.tag); + return { success: true, data, error: null }; + } catch (e: unknown) { + return { success: false, data: null, error: String(e) }; + } + }); +} diff --git a/electron/main.ts b/electron/main.ts index d170e59..72d4b89 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -14,6 +14,8 @@ import { registerWindowHandlers } from './handlers/window'; import { registerCrashHandlers, setupCrashListeners, testCrashDialog } from './handlers/crash-monitor'; import { registerKoringAuthHandlers } from './handlers/koring-auth'; import { registerJavaHandlers } from './handlers/java'; +import { registerUpdateHandlers } from './handlers/update'; +import { updateService } from './updater'; import { saveConfig, configExists, getConfig, flushConfig, configPath } from './config'; import { authPath } from './auth'; @@ -167,6 +169,7 @@ function registerAllHandlers() { registerCrashHandlers(); registerKoringAuthHandlers(); registerJavaHandlers(); + registerUpdateHandlers(); } app.whenReady().then(() => { @@ -219,6 +222,13 @@ app.whenReady().then(() => { splashMinTimeDone = true; tryTransition(); }, 1500); + + // 延迟静默检查更新(避开启动加载,不抢带宽;开发模式在 updater.init 内自动跳过) + setTimeout(() => { + updateService.check(false).catch((e) => { + console.error('[updater] 启动静默检查失败:', e); + }); + }, 12000); }); app.on('window-all-closed', () => { diff --git a/electron/preload.ts b/electron/preload.ts index f5bfa94..f6965dd 100644 --- a/electron/preload.ts +++ b/electron/preload.ts @@ -94,4 +94,19 @@ contextBridge.exposeInMainWorld('electronAPI', { // Config reset resetConfig: () => ipcRenderer.invoke('config:reset'), + + // Auto-update (main process: electron/updater.ts) + checkForUpdates: (manual = false) => ipcRenderer.invoke('update:check', { manual }), + downloadUpdate: () => ipcRenderer.invoke('update:download'), + pauseUpdate: () => ipcRenderer.invoke('update:pause'), + resumeUpdate: () => ipcRenderer.invoke('update:resume'), + cancelUpdate: () => ipcRenderer.invoke('update:cancel'), + quitAndInstall: () => ipcRenderer.invoke('update:quitAndInstall'), + getUpdateState: () => ipcRenderer.invoke('update:getState'), + getReleaseNotes: (tag?: string) => ipcRenderer.invoke('update:getReleaseNotes', { tag }), + onUpdateStatus: (callback: (data: unknown) => void) => { + const handler = (_event: Electron.IpcRendererEvent, data: unknown) => callback(data); + ipcRenderer.on('update:status', handler); + return () => ipcRenderer.removeListener('update:status', handler); + }, }); diff --git a/electron/updater.ts b/electron/updater.ts new file mode 100644 index 0000000..f44e8e6 --- /dev/null +++ b/electron/updater.ts @@ -0,0 +1,417 @@ +import { autoUpdater, CancellationToken, type ProgressInfo } from 'electron-updater'; +import electron from 'electron'; +import * as os from 'os'; +import { getConfig, updateConfig, flushConfig } from './config'; + +const { app } = electron; + +export type UpdateState = + | 'idle' + | 'checking' + | 'available' + | 'not-available' + | 'downloading' + | 'paused' + | 'downloaded' + | 'installing' + | 'error'; + +export interface UpdateStatusPayload { + state: UpdateState; + /** 是否为手动触发(手动触发时前端不弹提示) */ + manual: boolean; + /** 目标版本号 */ + version?: string; + /** 当前安装版本 */ + currentVersion?: string; + percent?: number; + transferred?: number; + total?: number; + bytesPerSecond?: number; + /** 当前使用的更新源(github=官方 / 加速源域名) */ + source?: string; + error?: string; +} + +export interface ReleaseNotesResult { + /** release tag,如 v1.2.0-2608271921 */ + tag: string; + /** 版本号(去 v 前缀) */ + version: string; + /** 发布说明原始 Markdown */ + notes: string; + /** 读取来源:github / 加速源域名 */ + source: string; + /** 是否为最新版本的说明(当前版本无发布说明时回退) */ + isLatest: boolean; +} + +const OWNER = 'dream-pep'; +const REPO = 'koring-launcher'; +const DISCOVER_TIMEOUT_MS = 15000; + +/** + * 内置加速源(ghproxy 类,代理完整 GitHub URL;latest.yml 的相对路径可解析)。 + * 实测(2026-08-30):gh.ddlc.top / gh-proxy.com / ghfast.top 行为正确(按原状转发,404 即 404); + * ghps.cc 已被移除——它对任何请求都返回 200 + HTML 跳转拦截页,会污染 latest.yml / release-notes.md。 + * 第三方服务稳定性有限,可用环境变量 UPDATE_MIRRORS 覆盖(逗号分隔), + * 后续建议换成自建 OSS/CDN 镜像(generic provider 直接指向镜像根目录)。 + */ +const DEFAULT_MIRRORS: string[] = ['https://gh.ddlc.top', 'https://gh-proxy.com', 'https://ghfast.top']; + +function getMirrors(): string[] { + const env = process.env.UPDATE_MIRRORS; + if (env) { + return env.split(',').map((s) => s.trim()).filter(Boolean); + } + return DEFAULT_MIRRORS; +} + +/** + * 更新服务:electron-updater(GitHub provider)+ 加速源兜底。 + * 状态:idle → checking → available → downloading ⇄ paused → downloaded → installing → quitAndInstall + * 下载控制:CancellationToken 实现暂停(中断)/继续/取消。 + * 进度持久化:每次状态/进度变化写入 Koring.yml 的 update 段(下载与安装进度落盘)。 + */ +class UpdateService { + private state: UpdateState = 'idle'; + private manual = false; + private version: string | undefined; + private currentVersion = ''; + private progress: ProgressInfo | null = null; + private source = 'github'; + private error: string | undefined; + private listener: ((payload: UpdateStatusPayload) => void) | null = null; + private ready = false; + /** 检查过程中屏蔽 error 事件(避免 GitHub 失败被当成最终错误) */ + private suppressErrors = false; + /** 当前下载的取消令牌(暂停/取消时 cancel) */ + private downloadToken: CancellationToken | null = null; + + init(listener: (payload: UpdateStatusPayload) => void): void { + this.listener = listener; + this.currentVersion = app.getVersion(); + + if (!app.isPackaged) { + console.log('[updater] 开发模式:跳过自动更新'); + this.emit(); + return; + } + + // 应用能启动即说明上次安装已完成/已结束,清理持久化的进行中状态 + const persisted = getConfig().update; + if (persisted && persisted.state && persisted.state !== 'idle') { + console.log(`[updater] 上次更新状态 ${persisted.state} (v${persisted.version}),已重置`); + this.persistIdleConfig(); + } + + autoUpdater.autoDownload = false; + autoUpdater.autoInstallOnAppQuit = true; + autoUpdater.logger = console; + autoUpdater.on('checking-for-update', () => { + this.state = 'checking'; + this.emit(); + }); + autoUpdater.on('update-available', (info) => { + this.state = 'available'; + this.version = info.version; + this.error = undefined; + this.emit(); + }); + autoUpdater.on('update-not-available', () => { + this.state = 'not-available'; + this.version = undefined; + this.emit(); + }); + autoUpdater.on('download-progress', (p) => { + this.state = 'downloading'; + this.progress = p; + this.emit(); + }); + autoUpdater.on('update-downloaded', (info) => { + this.state = 'downloaded'; + this.version = info.version; + this.emit(); + }); + autoUpdater.on('error', (err: Error) => { + const message = String(err?.message ?? err); + console.warn(`[updater] electron-updater error: ${message}`); + if (this.suppressErrors) return; // 兜底循环内,忽略 + if (this.downloadToken?.cancelled) return; // 主动暂停/取消,忽略 + this.state = 'error'; + this.error = message; + this.emit(); + }); + + this.ready = true; + } + + private emit(): void { + const payload = this.buildPayload(); + this.listener?.(payload); + this.persist(payload); + } + + private buildPayload(): UpdateStatusPayload { + return { + state: this.state, + manual: this.manual, + version: this.version, + currentVersion: this.currentVersion, + percent: this.progress?.percent, + transferred: this.progress?.transferred, + total: this.progress?.total, + bytesPerSecond: this.progress?.bytesPerSecond, + source: this.source, + error: this.error, + }; + } + + /** 将当前状态与下载进度写入配置(下载/安装进度落盘) */ + private persist(payload: UpdateStatusPayload): void { + try { + updateConfig({ + update: { + state: payload.state, + version: payload.version ?? '', + percent: payload.percent ?? 0, + transferred: payload.transferred ?? 0, + total: payload.total ?? 0, + source: payload.source ?? 'github', + error: payload.error ?? '', + }, + }); + } catch (e) { + console.warn('[updater] 更新进度写入配置失败:', e); + } + } + + private persistIdleConfig(): void { + try { + updateConfig({ + update: { state: 'idle', version: '', percent: 0, transferred: 0, total: 0, source: 'github', error: '' }, + }); + } catch { + /* ignore */ + } + } + + getState(): UpdateStatusPayload { + return this.buildPayload(); + } + + /** + * 检查更新:GitHub 官方优先,失败后依次尝试加速源。 + */ + async check(manual = false): Promise { + if (!this.ready) return this.buildPayload(); + if (['downloading', 'paused', 'downloaded', 'installing'].includes(this.state)) { + return this.buildPayload(); // 已有更新在进行中/已完成 + } + + this.manual = manual; + this.suppressErrors = true; + + // 1) GitHub 官方(app-update.yml 内置 github provider) + this.source = 'github'; + this.state = 'checking'; + this.emit(); + try { + await autoUpdater.checkForUpdates(); + this.suppressErrors = false; + return this.buildPayload(); + } catch (err) { + console.warn(`[updater] GitHub 官方更新源不可用: ${String((err as Error)?.message ?? err)}`); + } + + // 2) 加速源兜底:镜像页面发现最新 tag → generic feed → 检查 + for (const mirror of getMirrors()) { + try { + const tag = await this.discoverLatestTag(mirror); + if (!tag) { + console.warn(`[updater] ${mirror} 无法发现最新版本,跳过`); + continue; + } + const feedUrl = `${mirror}/https://github.com/${OWNER}/${REPO}/releases/download/${tag}/`; + console.log(`[updater] 切换加速源: ${mirror} (feed: ${feedUrl})`); + autoUpdater.setFeedURL({ provider: 'generic', url: feedUrl }); + this.source = mirror; + this.state = 'checking'; + this.emit(); + await autoUpdater.checkForUpdates(); + this.suppressErrors = false; + return this.buildPayload(); + } catch (err) { + console.warn(`[updater] 加速源 ${mirror} 检查失败: ${String((err as Error)?.message ?? err)}`); + } + } + + this.suppressErrors = false; + this.state = 'error'; + this.error = '无法连接更新服务器(GitHub 与所有加速源均不可用),请稍后重试'; + this.emit(); + return this.buildPayload(); + } + + /** + * 通过加速源发现最新 release tag(不需要 GitHub API): + * 1) /releases/latest 页面 HTML 中提取 tag(多数下载型加速源可代理该页面) + * 2) 少数加速源可代理 api.github.com,作为备选 + */ + private async discoverLatestTag(mirror: string): Promise { + // 方式 1:HTML 页面 + try { + const pageUrl = `${mirror}/https://github.com/${OWNER}/${REPO}/releases/latest`; + const res = await fetch(pageUrl, { + headers: { 'User-Agent': 'koring-launcher-updater' }, + signal: AbortSignal.timeout(DISCOVER_TIMEOUT_MS), + }); + if (res.ok) { + const html = await res.text(); + const m = html.match(/\/releases\/tag\/(v[^"<]+)/); + if (m?.[1]) return m[1]; + } + } catch { + /* 尝试下一种方式 */ + } + + // 方式 2:GitHub API(经加速源代理) + try { + const apiUrl = `${mirror}/https://api.github.com/repos/${OWNER}/${REPO}/releases?per_page=20`; + const res = await fetch(apiUrl, { + headers: { Accept: 'application/vnd.github+json', 'User-Agent': 'koring-launcher-updater' }, + signal: AbortSignal.timeout(DISCOVER_TIMEOUT_MS), + }); + if (res.ok) { + const releases: { draft?: boolean; tag_name?: string }[] = await res.json(); + const release = (releases ?? []).find((r) => !r.draft && !!r.tag_name); + if (release?.tag_name) return release.tag_name; + } + } catch { + /* ignore */ + } + + return null; + } + + /** + * 获取指定版本(默认当前安装版本)的发布说明(release-notes.md 附件,原始 Markdown)。 + * GitHub 直连优先,失败后依次尝试加速源;当前版本没有发布说明时回退到最新版本。 + */ + async getReleaseNotes(requestedTag?: string): Promise { + const tag = (requestedTag?.trim() || `v${app.getVersion()}`).replace(/^v(?=\d)/, 'v'); + const found = await this.fetchNotesForTag(tag); + if (found) return found; + + // 回退:最新版本(通过 /releases/latest 页面发现 tag) + for (const mirror of getMirrors()) { + const latestTag = await this.discoverLatestTag(mirror); + if (latestTag && latestTag !== tag) { + const foundLatest = await this.fetchNotesForTag(latestTag); + if (foundLatest) { + return { ...foundLatest, isLatest: true }; + } + } + } + return null; + } + + private async fetchNotesForTag(tag: string): Promise { + const bases: { source: string; base: string }[] = [ + { source: 'github', base: `https://github.com/${OWNER}/${REPO}` }, + ...getMirrors().map((m) => ({ source: m, base: `${m}/https://github.com/${OWNER}/${REPO}` })), + ]; + for (const { source, base } of bases) { + try { + const url = `${base}/releases/download/${tag}/release-notes.md`; + const res = await fetch(url, { + headers: { 'User-Agent': 'koring-launcher-updater' }, + signal: AbortSignal.timeout(DISCOVER_TIMEOUT_MS), + }); + if (res.ok) { + // 部分加速源对任意 URL 返回 200 + HTML 跳转/拦截页,必须校验内容 + const contentType = res.headers.get('content-type') ?? ''; + if (/^text\/html/i.test(contentType)) continue; + const notes = await res.text(); + if (!notes.trim()) continue; + if (/^\s*]/i.test(notes)) continue; + console.log(`[updater] 发布说明来源: ${source} (${tag})`); + return { tag, version: tag.replace(/^v/, ''), notes, source, isLatest: false }; + } + } catch { + /* 尝试下一个源 */ + } + } + return null; + } + + /** + * 下载更新(触发下载,进度经 update:status 上报并写入配置)。 + * available → 开始下载;paused → 继续下载。 + */ + async download(): Promise { + if (!this.ready) return; + if (this.state === 'downloading' || this.state === 'downloaded' || this.state === 'installing') return; + if (this.state === 'paused') { + // 继续下载(可能从断点续传,也可能重新开始,取决于 electron-updater 缓存) + console.log('[updater] 继续下载'); + } + this.state = 'downloading'; + this.progress = null; + this.emit(); + + const token = new CancellationToken(); + this.downloadToken = token; + try { + await autoUpdater.downloadUpdate(token); + } catch (err) { + if (token.cancelled) return; // 主动暂停/取消,不是错误 + this.state = 'error'; + this.error = String((err as Error)?.message ?? err); + this.emit(); + } + } + + /** 暂停下载(中断当前请求,保留进度;再次下载即继续) */ + pause(): void { + if (!this.ready || this.state !== 'downloading') return; + this.state = 'paused'; + this.emit(); + this.downloadToken?.cancel(); + } + + /** 取消下载:中断并清除进度,回到 available(可重新下载) */ + cancel(): void { + if (!this.ready) return; + this.downloadToken?.cancel(); + this.downloadToken = null; + if (this.state === 'downloading' || this.state === 'paused') { + this.state = 'available'; + this.progress = null; + this.emit(); + } + } + + /** + * 退出并安装(NSIS 静默安装,安装完成自动重启)。 + * 安装状态先写入配置并立即落盘,避免退出时 debounce 未写盘。 + */ + quitAndInstall(): void { + if (!this.ready || this.state !== 'downloaded') return; + this.state = 'installing'; + this.emit(); + try { + flushConfig(); + } catch { + /* ignore */ + } + autoUpdater.quitAndInstall(); + } + + /** 获取系统下载临时目录(用于清理提示,暂未启用) */ + getCacheDir(): string { + return os.tmpdir(); + } +} + +export const updateService = new UpdateService(); diff --git a/package.json b/package.json index a2181b2..6aa0c7e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "koring-launcher", "private": true, - "version": "1.2.0", + "version": "1.2.1", "description": "Koring Launcher - Minecraft launcher built with Electron + React", "author": "Shenzhen Lingke Network Technology Co., Ltd.", "license": "LL-1.0", @@ -57,6 +57,9 @@ "qrcode.react": "^4.2.0", "react": "^19.1.0", "react-dom": "^19.1.0", + "react-markdown": "^10.1.0", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", "sonner": "^2.0.7", "tailwind-merge": "^3.6.0", "three": "^0.184.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 61bf67a..d50267f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -61,7 +61,7 @@ importers: version: 2.1.1 electron-updater: specifier: ^6.8.9 - version: 6.8.9 + version: 6.8.9(supports-color@8.1.1) js-yaml: specifier: ^4.1.0 version: 4.2.0 @@ -83,6 +83,15 @@ importers: react-dom: specifier: ^19.1.0 version: 19.2.7(react@19.2.7) + react-markdown: + specifier: ^10.1.0 + version: 10.1.0(@types/react@19.2.17)(react@19.2.7) + rehype-raw: + specifier: ^7.0.0 + version: 7.0.0 + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 sonner: specifier: ^2.0.7 version: 2.0.8(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -776,6 +785,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -1295,12 +1307,18 @@ packages: '@types/debug@4.1.13': resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} '@types/fs-extra@9.0.13': resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} + '@types/http-cache-semantics@4.2.0': resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} @@ -1310,6 +1328,9 @@ packages: '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -1344,6 +1365,12 @@ packages: '@types/three@0.184.1': resolution: {integrity: sha512-6q4VdiqVsrTRqmk62/BnlcAvIrnDM0zf2ZDVKI5kZiniWrSaOHaQzmbp+BNzoggc/8tgW412pL//wZIxu2PPTA==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/validate-npm-package-name@4.0.2': resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} @@ -1356,6 +1383,9 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@ungap/structured-clone@1.4.0': + resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} + '@vitejs/plugin-react@4.7.0': resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -1533,6 +1563,9 @@ packages: resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==} engines: {node: '>=10.12.0'} + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1645,6 +1678,9 @@ packages: caniuse-lite@1.0.30001799: resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -1653,6 +1689,18 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -1723,6 +1771,9 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -1854,6 +1905,9 @@ packages: decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -1912,6 +1966,10 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -1919,6 +1977,9 @@ packages: detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff@8.0.4: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} @@ -2089,11 +2150,18 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -2365,6 +2433,27 @@ packages: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -2377,6 +2466,12 @@ packages: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} @@ -2457,6 +2552,9 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + input-otp@1.4.2: resolution: {integrity: sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==} peerDependencies: @@ -2474,6 +2572,12 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -2481,6 +2585,9 @@ packages: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -2503,6 +2610,9 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-in-ssh@1.0.0: resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} engines: {node: '>=20'} @@ -2788,6 +2898,9 @@ packages: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2822,6 +2935,9 @@ packages: resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} @@ -2830,6 +2946,51 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.0.0: + resolution: {integrity: sha512-Ov3aWCYpb31/SkHNRlREvSZsF9ETBW/rXw4PooawZO8qy2MviDq4TI6kxX6zFmGa/zUX36STKIC/IpASQk596w==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} @@ -2848,6 +3009,90 @@ packages: meshoptimizer@1.1.1: resolution: {integrity: sha512-oRFNWJRDA/WTrVj7NWvqa5HqE1t9MYDj2VaWirQCzCCrAd2GHrqR/sQezCxiWATPNlKTcRaPRHPJwIRoPBAp5g==} + micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@2.0.0: + resolution: {integrity: sha512-DtHHqgTRz32ylwiGSZwoK+BTx4gaq//ig71g20pwBwRLxo3CfInyD+NyTrriLOhPz5WQOfAOSLLbKOaaGXWz9Q==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@2.0.0: + resolution: {integrity: sha512-pIgcsGxpHEtTG/rPJRz/HOLSqp5VTuIIjXlPI+6JSDlK2oljApusG6KzpS8AF0ENUMCHlC/IBb5B9xdFiVlm5Q==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -3132,6 +3377,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -3140,6 +3388,9 @@ packages: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} + parse5@7.0.0: + resolution: {integrity: sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -3242,6 +3493,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -3297,6 +3551,12 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-markdown@10.1.0: + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + react-refresh@0.17.0: resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} @@ -3343,6 +3603,21 @@ packages: resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} engines: {node: '>= 4'} + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -3549,6 +3824,9 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} @@ -3586,6 +3864,9 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + stringify-object@5.0.0: resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} engines: {node: '>=14.16'} @@ -3610,6 +3891,12 @@ packages: resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} engines: {node: '>=18'} + style-to-js@1.0.0: + resolution: {integrity: sha512-OiaJVLD+ybcul+6oAdwTOKLFewvYapPLG4H3JiYBYUS0yoi29Ag1IiqprbVARaxiAXvkk+4B8aNcG7lyEDKebg==} + + style-to-object@0.3.0: + resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} + sumchecker@3.0.1: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} @@ -3700,6 +3987,12 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + truncate-utf8-bytes@1.0.2: resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} @@ -3752,6 +4045,9 @@ packages: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} + unified@11.0.0: + resolution: {integrity: sha512-65zgPyv0vyXnJpw4fbGmoXjP0/6cBmnnesl4lSPGU2tYuzLWtuicRBFcaV6kgzitGrBHj6pgXYomMw1VQe/cQg==} + unique-filename@2.0.1: resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -3760,6 +4056,21 @@ packages: resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -3804,6 +4115,15 @@ packages: resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} engines: {node: '>=0.6.0'} + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite@7.3.5: resolution: {integrity: sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3847,6 +4167,9 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -3953,6 +4276,9 @@ packages: use-sync-external-store: optional: true + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: 7zip-bin@5.2.0: {} @@ -4582,7 +4908,7 @@ snapshots: '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/remapping@2.3.5': @@ -4594,10 +4920,12 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@malept/cross-spawn-promise@2.0.0': dependencies: @@ -5039,12 +5367,20 @@ snapshots: dependencies: '@types/ms': 2.1.0 + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.9 + '@types/estree@1.0.9': {} '@types/fs-extra@9.0.13': dependencies: '@types/node': 26.0.1 + '@types/hast@3.0.5': + dependencies: + '@types/unist': 3.0.3 + '@types/http-cache-semantics@4.2.0': {} '@types/js-yaml@4.0.9': {} @@ -5053,6 +5389,10 @@ snapshots: dependencies: '@types/node': 26.0.1 + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/ms@2.1.0': {} '@types/node@20.19.43': @@ -5096,6 +5436,10 @@ snapshots: fflate: 0.8.3 meshoptimizer: 1.1.1 + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + '@types/validate-npm-package-name@4.0.2': {} '@types/verror@1.10.11': @@ -5107,6 +5451,8 @@ snapshots: dependencies: '@types/node': 26.0.1 + '@ungap/structured-clone@1.4.0': {} + '@vitejs/plugin-react@4.7.0(vite@7.3.5(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4))': dependencies: '@babel/core': 7.29.7 @@ -5331,6 +5677,8 @@ snapshots: atomically@1.7.0: {} + bail@2.0.2: {} + balanced-match@1.0.2: {} balanced-match@4.0.4: {} @@ -5416,7 +5764,7 @@ snapshots: transitivePeerDependencies: - supports-color - builder-util-runtime@9.7.0: + builder-util-runtime@9.7.0(supports-color@8.1.1): dependencies: debug: 4.4.3(supports-color@8.1.1) sax: 1.6.0 @@ -5499,6 +5847,8 @@ snapshots: caniuse-lite@1.0.30001799: {} + ccount@2.0.1: {} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -5506,6 +5856,14 @@ snapshots: chalk@5.6.2: {} + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + chownr@2.0.0: {} chromium-pickle-js@0.2.0: {} @@ -5564,6 +5922,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + comma-separated-tokens@2.0.3: {} + commander@11.1.0: {} commander@14.0.3: {} @@ -5687,6 +6047,10 @@ snapshots: decimal.js@10.6.0: {} + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 @@ -5732,11 +6096,17 @@ snapshots: depd@2.0.0: {} + dequal@2.0.3: {} + detect-libc@2.1.2: {} detect-node@2.1.0: optional: true + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + diff@8.0.4: {} dir-compare@4.2.0: @@ -5869,9 +6239,9 @@ snapshots: electron-to-chromium@1.5.376: {} - electron-updater@6.8.9: + electron-updater@6.8.9(supports-color@8.1.1): dependencies: - builder-util-runtime: 9.7.0 + builder-util-runtime: 9.7.0(supports-color@8.1.1) fs-extra: 10.1.0 js-yaml: 4.2.0 lazy-val: 1.0.5 @@ -6010,8 +6380,12 @@ snapshots: escape-string-regexp@4.0.0: optional: true + escape-string-regexp@5.0.0: {} + esprima@4.0.1: {} + estree-util-is-identifier-name@3.0.0: {} + etag@1.8.1: {} eventsource-parser@3.1.0: {} @@ -6370,6 +6744,79 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.2.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.5 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.4.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.0.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.9 + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.0.0 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.5 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.5 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.5 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + he@1.2.0: {} hono@4.12.26: {} @@ -6378,6 +6825,10 @@ snapshots: dependencies: lru-cache: 6.0.0 + html-url-attributes@3.0.1: {} + + html-void-elements@3.0.0: {} + http-cache-semantics@4.2.0: {} http-errors@2.0.1: @@ -6466,6 +6917,8 @@ snapshots: inherits@2.0.4: {} + inline-style-parser@0.1.1: {} + input-otp@1.4.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: react: 19.2.7 @@ -6482,12 +6935,21 @@ snapshots: ipaddr.js@1.9.1: {} + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + is-arrayish@0.2.1: {} is-ci@3.0.1: dependencies: ci-info: 3.9.0 + is-decimal@2.0.1: {} + is-docker@2.2.1: {} is-docker@3.0.0: {} @@ -6500,6 +6962,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hexadecimal@2.0.1: {} + is-in-ssh@1.0.0: {} is-inside-container@1.0.0: @@ -6706,6 +7170,8 @@ snapshots: chalk: 5.6.2 is-unicode-supported: 1.3.0 + longest-streak@3.1.0: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -6754,6 +7220,8 @@ snapshots: - bluebird - supports-color + markdown-table@3.0.4: {} + matcher@3.0.0: dependencies: escape-string-regexp: 4.0.0 @@ -6761,6 +7229,158 @@ snapshots: math-intrinsics@1.1.0: {} + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.0 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.0.0 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.0.0 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.4.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + media-typer@1.1.0: {} merge-descriptors@2.0.0: {} @@ -6771,6 +7391,197 @@ snapshots: meshoptimizer@1.1.1: {} + micromark-core-commonmark@2.0.0: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.0.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-destination@2.0.0: + dependencies: + micromark-util-character: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-label@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-space@2.0.0: + dependencies: + micromark-util-character: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-title@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-whitespace@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-character@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-chunked@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-classify-character@2.0.0: + dependencies: + micromark-util-character: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-combine-extensions@2.0.0: + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-decode-numeric-character-reference@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.0 + micromark-util-symbol: 2.0.0 + + micromark-util-encode@2.0.0: {} + + micromark-util-html-tag-name@2.0.0: {} + + micromark-util-normalize-identifier@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-resolve-all@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-util-sanitize-uri@2.0.0: + dependencies: + micromark-util-character: 2.0.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + micromark-util-subtokenize@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-symbol@2.0.0: {} + + micromark-util-types@2.0.0: {} + + micromark@4.0.0: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3(supports-color@8.1.1) + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.0 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -7045,6 +7856,16 @@ snapshots: dependencies: callsites: 3.1.0 + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.29.7 @@ -7054,6 +7875,10 @@ snapshots: parse-ms@4.0.0: {} + parse5@7.0.0: + dependencies: + entities: 4.5.0 + parseurl@1.3.3: {} path-browserify@1.0.1: {} @@ -7134,6 +7959,8 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + property-information@7.2.0: {} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -7199,6 +8026,24 @@ snapshots: react-is@16.13.1: {} + react-markdown@10.1.0(@types/react@19.2.17)(react@19.2.7): + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@types/react': 19.2.17 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.1 + react: 19.2.7 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + react-refresh@0.17.0: {} react-stately@3.48.0(react@19.2.7): @@ -7262,6 +8107,46 @@ snapshots: tiny-invariant: 1.3.3 tslib: 2.8.1 + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.5 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.0 + unified: 11.0.0 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.0 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.0.0 + unified: 11.0.0 + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -7541,6 +8426,8 @@ snapshots: source-map@0.6.1: {} + space-separated-tokens@2.0.2: {} + sprintf-js@1.1.3: optional: true @@ -7580,6 +8467,11 @@ snapshots: dependencies: safe-buffer: 5.2.1 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + stringify-object@5.0.0: dependencies: get-own-enumerable-keys: 1.0.0 @@ -7600,6 +8492,14 @@ snapshots: strip-final-newline@4.0.0: {} + style-to-js@1.0.0: + dependencies: + style-to-object: 0.3.0 + + style-to-object@0.3.0: + dependencies: + inline-style-parser: 0.1.1 + sumchecker@3.0.1(supports-color@8.1.1): dependencies: debug: 4.4.3(supports-color@8.1.1) @@ -7687,6 +8587,10 @@ snapshots: tree-kill@1.2.2: {} + trim-lines@3.0.1: {} + + trough@2.2.0: {} + truncate-utf8-bytes@1.0.2: dependencies: utf8-byte-length: 1.0.5 @@ -7733,6 +8637,16 @@ snapshots: unicorn-magic@0.3.0: {} + unified@11.0.0: + dependencies: + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.4.0 + bail: 2.0.2 + devlop: 1.1.0 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + unique-filename@2.0.1: dependencies: unique-slug: 3.0.0 @@ -7741,6 +8655,29 @@ snapshots: dependencies: imurmurhash: 0.1.4 + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + universalify@0.1.2: {} universalify@2.0.1: {} @@ -7776,6 +8713,21 @@ snapshots: extsprintf: 1.4.1 optional: true + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + vite@7.3.5(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4): dependencies: esbuild: 0.27.7 @@ -7795,6 +8747,8 @@ snapshots: dependencies: defaults: 1.0.4 + web-namespaces@2.0.1: {} + web-streams-polyfill@3.3.3: {} which@2.0.2: @@ -7892,3 +8846,5 @@ snapshots: '@types/react': 19.2.17 react: 19.2.7 use-sync-external-store: 1.6.0(react@19.2.7) + + zwitch@2.0.4: {} diff --git a/scripts/gen-build-info.js b/scripts/gen-build-info.js new file mode 100644 index 0000000..715a5eb --- /dev/null +++ b/scripts/gen-build-info.js @@ -0,0 +1,34 @@ +/** + * 生成构建元数据文件 src/lib/buildInfo.ts(CI 构建时调用)。 + * + * 用法: + * node scripts/gen-build-info.js # mode: dev | beta | run + * + * 环境变量: + * BUILD_ID 编译号(CI 传 GITHUB_RUN_NUMBER;缺省 "local") + * 本地 git HEAD 短哈希作为构建来源 commit。 + */ +'use strict'; + +const { execSync } = require('child_process'); +const fs = require('fs'); +const path = require('path'); + +const mode = process.argv[2] || 'run'; + +let commit = ''; +try { + commit = execSync('git rev-parse --short HEAD').toString().trim(); +} catch { + /* 非 git 环境,保持空 */ +} + +const buildId = process.env.BUILD_ID || process.env.GITHUB_RUN_NUMBER || 'local'; + +const content = `// 构建元数据:由 scripts/gen-build-info.js 自动生成(CI 覆盖;本地开发为默认值) +export const BUILD_COMMIT: string = ${JSON.stringify(commit)}; +export const BUILD_ID: string = ${JSON.stringify(buildId)}; +`; + +fs.writeFileSync(path.join(__dirname, '..', 'src', 'lib', 'buildInfo.ts'), content); +console.log(`[build-info] mode=${mode} commit=${commit || '(none)'} buildId=${buildId}`); diff --git a/scripts/release-notes.ps1 b/scripts/release-notes.ps1 index 1461e4b..840053a 100644 --- a/scripts/release-notes.ps1 +++ b/scripts/release-notes.ps1 @@ -16,10 +16,12 @@ param( [Parameter(Mandatory = $true)][string] $FullVersion, [Parameter(Mandatory = $true)][string] $Mode, [string] $SigningStatus = "已签名", + [string] $Commit = "", [string] $OutputPath = "release-notes.md" ) $status = if ($Mode -eq 'beta') { 'BETA' } else { 'RUN' } +$commitShort = if ($Commit) { $Commit.Substring(0, [Math]::Min(7, $Commit.Length)) } else { '' } $rec = [char]0x1e # 记录分隔符(每个 commit 一条) $sep = [char]0x1f # 字段分隔符(hash / subject / body) @@ -68,6 +70,7 @@ $content = @" 当前版本 $FullVersion 编译状态:$status 签名状态:$SigningStatus +$(if ($commitShort) { "构建来源:commit $commitShort" }) ## 更新了什么内容 $commitsSection diff --git a/scripts/version.js b/scripts/version.js index bf9c7f7..fa55364 100644 --- a/scripts/version.js +++ b/scripts/version.js @@ -9,14 +9,11 @@ function getCurrentVersion() { return pkg.version; } +/** 仅写文件,不打印(stdout 纯净,供脚本/CI 捕获) */ function setVersion(version) { - // Update package.json const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')); pkg.version = version; writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n'); - - console.log(`Version updated to ${version}`); - console.log(` - package.json`); } // Parse args @@ -27,15 +24,45 @@ if (args.length === 0) { process.exit(0); } +// 输出裸版本号(供脚本/CI 使用) +if (args[0] === 'get') { + console.log(getCurrentVersion()); + process.exit(0); +} + +// 构建版本:统一「base + 构建号」规则,消除本地/CI 版本双轨 +// version.js build ci [buildId] [base] CI:base 缺省读 package.json → 设置并输出 base-buildId +// version.js build local 本地:输出当前 base(不修改) +if (args[0] === 'build') { + const kind = args[1]; + if (kind === 'ci') { + const buildId = args[2] || process.env.GITHUB_RUN_NUMBER || '0'; + const base = args[3] || getCurrentVersion(); + const full = `${base}-${buildId}`; + setVersion(full); + console.log(full); // stdout 仅版本号 + process.exit(0); + } + if (kind === 'local') { + console.log(getCurrentVersion()); + process.exit(0); + } + console.error('Usage: node scripts/version.js build ci [buildId] [base] | node scripts/version.js build local'); + process.exit(1); +} + if (args[0] === '--help' || args[0] === '-h') { console.log('Usage:'); console.log(' node scripts/version.js Set version'); console.log(' node scripts/version.js Show current version'); + console.log(' node scripts/version.js get Print raw version'); + console.log(' node scripts/version.js build ci [buildId] [base] CI build version (base-buildId)'); + console.log(' node scripts/version.js build local Print local base version'); console.log(''); console.log('Examples:'); console.log(' node scripts/version.js 1.0.0'); console.log(' node scripts/version.js 1.1.0-beta.1'); - console.log(' node scripts/version.js 2.0.0-rc.1'); + console.log(' node scripts/version.js build ci 12'); process.exit(0); } @@ -51,3 +78,5 @@ if (!/^\d+\.\d+\.\d+/.test(newVersion)) { const current = getCurrentVersion(); console.log(`Current version: ${current}`); setVersion(newVersion); +console.log(`Version updated to ${newVersion}`); +console.log(' - package.json'); diff --git a/src/App.tsx b/src/App.tsx index 8b2a7b7..c3b384e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -17,6 +17,7 @@ import { Setting } from "./pages/setting"; import { SettingLogin } from "./pages/setting/login"; import { Gallery } from "./pages/gallery"; import { TaskQueue } from "./pages/task-queue"; +import { UpdatePage } from "./pages/update"; import { Debug } from "./pages/debug"; import { SplashDebug } from "./pages/debug/splash-debug"; import { DisplayDebug } from "./pages/debug/display-debug"; @@ -43,6 +44,7 @@ const pageMap = { "setting/login": SettingLogin, gallery: Gallery, "task-queue": TaskQueue, + update: UpdatePage, oobe: Oobe, "oobe/language": OobeLanguage, "oobe/agreement": OobeAgreement, diff --git a/src/api/config.ts b/src/api/config.ts index 8e18bc6..a3c83e4 100644 --- a/src/api/config.ts +++ b/src/api/config.ts @@ -81,6 +81,17 @@ export interface NetworkConfig { securityId: SecurityIdConfig; } +/** 更新进度持久化(主进程 updater 写入) */ +export interface UpdateConfig { + state: string; + version: string; + percent: number; + transferred: number; + total: number; + source: string; + error: string; +} + export interface InstanceMeta { name: string; displayName: string; @@ -106,6 +117,7 @@ export interface AppConfig { download: DownloadConfig; network: NetworkConfig; ui: UiConfig; + update: UpdateConfig; instances: InstanceMeta[]; } diff --git a/src/api/update.ts b/src/api/update.ts index ace6114..28a23ae 100644 --- a/src/api/update.ts +++ b/src/api/update.ts @@ -1,23 +1,88 @@ +import { ipcInvoke, onIpcEvent } from "./ipc"; + +/** 更新状态(主进程 electron/updater.ts 的状态机) */ +export type UpdateState = + | "idle" + | "checking" + | "available" + | "not-available" + | "downloading" + | "paused" + | "downloaded" + | "installing" + | "error"; + +/** 主进程广播的更新状态 payload(update:status) */ +export interface UpdateStatusPayload { + state: UpdateState; + /** 是否为手动触发(手动触发时前端不弹提示) */ + manual: boolean; + /** 最新版本号 */ + version?: string; + /** 当前安装版本 */ + currentVersion?: string; + percent?: number; + transferred?: number; + total?: number; + bytesPerSecond?: number; + /** 当前使用的更新源(github / 加速源域名) */ + source?: string; + error?: string; +} + +/** 兼容旧调用方的下载进度结构 */ export interface DownloadProgress { downloaded: number; contentLength: number; percent: number; } -export async function checkForUpdates(): Promise<{ version: string; releaseNotes?: string } | null> { - try { - return await window.electronAPI?.invoke('update:check') as { version: string; releaseNotes?: string } | null; - } catch { - return null; - } +/** 主进程 update:getReleaseNotes 返回的发布说明数据 */ +export interface ReleaseNotesResult { + /** release tag,如 v1.2.0-2608271921 */ + tag: string; + /** 版本号(去 v 前缀) */ + version: string; + /** 发布说明原始 Markdown */ + notes: string; + /** 读取来源:github / 加速源域名 */ + source: string; + /** 是否为最新版本的说明(当前版本无发布说明时回退) */ + isLatest: boolean; } -export async function downloadAndInstall( - onProgress?: (progress: DownloadProgress) => void -): Promise { - await window.electronAPI?.invoke('update:install'); -} +/** 检查更新(manual=true 表示用户手动点击,前端不弹提示) */ +export const checkForUpdates = (manual = false): Promise => + ipcInvoke("update:check", { manual }); -export async function relaunchApp(): Promise { - await window.electronAPI?.invoke('app:relaunch'); -} +/** 触发下载更新(进度经 update:status 事件上报);paused 状态下调用即继续 */ +export const downloadUpdate = (): Promise => ipcInvoke("update:download"); + +/** 暂停下载(中断当前请求,保留进度) */ +export const pauseUpdate = (): Promise => ipcInvoke("update:pause"); + +/** 继续下载 */ +export const resumeUpdate = (): Promise => ipcInvoke("update:resume"); + +/** 取消下载(清除进度,回到可重新下载状态) */ +export const cancelUpdate = (): Promise => ipcInvoke("update:cancel"); + +/** 退出并安装(NSIS 静默安装,安装完成自动重启) */ +export const quitAndInstall = (): Promise => ipcInvoke("update:quitAndInstall"); + +/** 兼容旧调用(VersionCard「立即更新」按钮) */ +export const relaunchApp = quitAndInstall; + +/** 查询当前更新状态快照 */ +export const getUpdateState = (): Promise => ipcInvoke("update:getState"); + +/** + * 读取指定版本(默认当前安装版本)的发布说明。 + * 主进程内部:GitHub 直连优先,失败自动切换加速源;当前版本无说明时回退最新版本。 + */ +export const getReleaseNotes = (tag?: string): Promise => + ipcInvoke("update:getReleaseNotes", { tag }); + +/** 订阅更新状态变化 */ +export const onUpdateStatus = (cb: (status: UpdateStatusPayload) => void): (() => void) => + onIpcEvent("update:status", cb); diff --git a/src/components/VersionCard.tsx b/src/components/VersionCard.tsx index a3ec1ee..1d6fa31 100644 --- a/src/components/VersionCard.tsx +++ b/src/components/VersionCard.tsx @@ -1,6 +1,8 @@ import { BUILD_MODE, LOGO_SVG } from "@/lib/mode"; import { VERSION } from "@/lib/version"; +import { BUILD_COMMIT, BUILD_ID } from "@/lib/buildInfo"; import { useUpdateStore } from "@/stores/updateStore"; +import { useRouteStore } from "@/stores/routeStore"; import { relaunchApp } from "@/api/update"; import Silk from "@/components/silk/Silk"; import { Button } from "@heroui/react"; @@ -49,6 +51,18 @@ export function VersionCard({ const { checking, downloading, installed, update, check, install } = useUpdateStore(); + // 检查更新按钮:除 OOBE 与更新日志页本身外,点击跳转到更新日志页 + const current = useRouteStore((s) => s.current); + const navigate = useRouteStore((s) => s.navigate); + const isOnUpdatePage = current === "update"; + const handleCheck = () => { + if (isOnUpdatePage) { + check(); + } else { + navigate("update"); + } + }; + const effectiveState: UpdateState = overrideState ?? (installed ? "installed" : update ? "hasUpdate" : "latest"); const Btn = (props: React.ComponentProps) => ( @@ -61,7 +75,12 @@ export function VersionCard({ ); return ( -
+
{/* 背景层 */}
@@ -85,7 +104,19 @@ export function VersionCard({ />

v{VERSION}

- {/* OOBE 模式:仅显示查看亮点按钮 */} + {/* 构建来源(CI 构建时写入;本地开发不显示) */} + {(BUILD_COMMIT || BUILD_ID !== "local") && ( +

+ {BUILD_COMMIT && `commit ${BUILD_COMMIT}`} + {BUILD_COMMIT && BUILD_ID !== "local" && " · "} + {BUILD_ID !== "local" && `#${BUILD_ID}`} +

+ )} + + {/* 更新日志页内不显示任何按钮(更新操作由页面底部遮罩负责) */} + {!isOnUpdatePage && ( + <> + {/* OOBE 模式:仅显示查看亮点按钮 */} {oobe ? (
查看亮点 @@ -94,7 +125,7 @@ export function VersionCard({
{effectiveState === "latest" && ( <> - + {checking ? "检查中..." : "检查更新"} 查看亮点 @@ -118,6 +149,8 @@ export function VersionCard({ )}
)} + + )}
); diff --git a/src/lib/buildInfo.ts b/src/lib/buildInfo.ts new file mode 100644 index 0000000..076dda7 --- /dev/null +++ b/src/lib/buildInfo.ts @@ -0,0 +1,3 @@ +// 构建元数据:由 scripts/gen-build-info.js 自动生成(CI 覆盖;本地开发为默认值) +export const BUILD_COMMIT: string = ""; +export const BUILD_ID: string = "local"; diff --git a/src/pages/setting/general/about.tsx b/src/pages/setting/general/about.tsx index 5f9bb23..25c65a2 100644 --- a/src/pages/setting/general/about.tsx +++ b/src/pages/setting/general/about.tsx @@ -1,6 +1,7 @@ import { useState, useEffect } from "react"; import { VersionCard } from "@/components/VersionCard"; import { BUILD_MODE } from "@/lib/mode"; +import { BUILD_COMMIT, BUILD_ID } from "@/lib/buildInfo"; import { ExternalLink, GitFork, RotateCcw } from "lucide-react"; import { Link } from "@heroui/react"; import { SettingCard, SettingRow, PageHeader, SectionTitle } from "@/components/setting"; @@ -70,6 +71,14 @@ export function AboutSetting() { {modeLabels[BUILD_MODE] ?? BUILD_MODE} + + + + {BUILD_COMMIT ? `commit ${BUILD_COMMIT}` : "本地构建"} + {BUILD_ID !== "local" ? ` · #${BUILD_ID}` : ""} + + + Node.js diff --git a/src/pages/update/index.tsx b/src/pages/update/index.tsx new file mode 100644 index 0000000..449287f --- /dev/null +++ b/src/pages/update/index.tsx @@ -0,0 +1,300 @@ +import { useCallback, useEffect, useState } from "react"; +import { VersionCard } from "@/components/VersionCard"; +import { SectionTitle, SettingCard } from "@/components/setting"; +import { Progress } from "@/components/ui/progress"; +import { BUILD_MODE } from "@/lib/mode"; +import { + cancelUpdate, + checkForUpdates, + downloadUpdate, + getReleaseNotes, + getUpdateState, + onUpdateStatus, + pauseUpdate, + quitAndInstall, + resumeUpdate, + type ReleaseNotesResult, + type UpdateStatusPayload, +} from "@/api/update"; +import { ExternalLink, Loader2, RefreshCw } from "lucide-react"; +import { Button, Link } from "@heroui/react"; +import { toast } from "sonner"; +import ReactMarkdown from "react-markdown"; +import remarkGfm from "remark-gfm"; +import rehypeRaw from "rehype-raw"; + +const GITHUB_RELEASES = "https://github.com/dream-pep/koring-launcher/releases"; + +/** 主按钮颜色随构建模式:dev 橙 / beta 绿 / run 蓝(与 VersionCard 一致) */ +const MODE_BUTTON_COLORS: Record = { + dev: { bg: "#F59E0B", hover: "#D97706" }, + beta: { bg: "#10B981", hover: "#059669" }, + run: { bg: "#3b82f6", hover: "#2563eb" }, +}; + +const modeColors = MODE_BUTTON_COLORS[BUILD_MODE] ?? MODE_BUTTON_COLORS.run; + +/** 主题 accent 为灰色系,内联覆盖按钮 CSS 变量 */ +const BUTTON_STYLE = { + "--button-bg": modeColors.bg, + "--button-bg-hover": modeColors.hover, + "--button-bg-pressed": modeColors.hover, + "--button-fg": "#ffffff", +} as React.CSSProperties; + +function formatMB(bytes?: number): string { + if (!bytes || bytes <= 0) return "0 MB"; + return `${(bytes / 1024 / 1024).toFixed(1)} MB`; +} + +/** + * 更新日志(独立页面,不走设置 layout): + * - 顶栏由路由切换为「返回 + 更新日志」(routeStore 的 titleInBar) + * - 顶部 VersionCard(此页面不显示按钮,更新操作由底部遮罩负责) + * - 发布说明:默认当前版本;检测到可用更新后自动切到最新版本 + * - 底部遮罩:检查更新 → 下载(进度条 + 暂停/继续/取消)→ 安装更新 + * - 下载/安装进度由主进程写入 Koring.yml(update 段) + */ +export function UpdatePage() { + // 发布说明:notesTag 为空 = 当前版本;有可用更新后切到对应 tag + const [notes, setNotes] = useState(null); + const [notesLoading, setNotesLoading] = useState(true); + const [notesError, setNotesError] = useState(null); + const [notesTag, setNotesTag] = useState(undefined); + + // 更新状态:事件驱动,主进程为唯一真相源 + const [status, setStatus] = useState(null); + + useEffect(() => { + const unsub = onUpdateStatus(setStatus); + getUpdateState().then(setStatus).catch(() => {}); + return unsub; + }, []); + + const loadNotes = useCallback(async (tag?: string) => { + setNotesLoading(true); + setNotesError(null); + try { + setNotes(await getReleaseNotes(tag)); + } catch (e) { + setNotesError(e instanceof Error ? e.message : String(e)); + } finally { + setNotesLoading(false); + } + }, []); + + useEffect(() => { + loadNotes(notesTag); + }, [notesTag, loadNotes]); + + // 检测到可用更新 → 发布说明切到最新版本(退出重进自动回到当前版本) + useEffect(() => { + if (status?.state === "available" && status.version && notesTag !== `v${status.version}`) { + setNotesTag(`v${status.version}`); + } + }, [status, notesTag]); + + const st = status?.state ?? "idle"; + const pct = status?.percent ?? 0; + const isDownloading = st === "downloading"; + const isPaused = st === "paused"; + + const handleCheck = async () => { + try { + await checkForUpdates(true); + } catch (e) { + toast.error(e instanceof Error ? e.message : String(e)); + } + }; + + const handleDownload = async () => { + try { + await downloadUpdate(); + } catch (e) { + toast.error(e instanceof Error ? e.message : String(e)); + } + }; + + const handlePause = async () => { + try { + await pauseUpdate(); + } catch (e) { + toast.error(e instanceof Error ? e.message : String(e)); + } + }; + + const handleResume = async () => { + try { + await resumeUpdate(); + } catch (e) { + toast.error(e instanceof Error ? e.message : String(e)); + } + }; + + const handleCancel = async () => { + try { + await cancelUpdate(); + } catch (e) { + toast.error(e instanceof Error ? e.message : String(e)); + } + }; + + const handleInstall = async () => { + try { + await quitAndInstall(); + } catch (e) { + toast.error(e instanceof Error ? e.message : String(e)); + } + }; + + const openGithub = () => { + window.electronAPI?.openExternal(GITHUB_RELEASES); + }; + + const primaryAction = + st === "available" ? handleDownload : st === "downloaded" ? handleInstall : handleCheck; + + const statusText = + st === "checking" + ? "正在检查更新..." + : st === "available" + ? `发现新版本 v${status?.version}` + : st === "downloading" + ? `正在下载 ${pct.toFixed(0)}% · ${formatMB(status?.transferred)} / ${formatMB(status?.total)}${status?.bytesPerSecond ? ` · ${formatMB(status.bytesPerSecond)}/s` : ""}` + : st === "paused" + ? `下载已暂停(${pct.toFixed(0)}%)` + : st === "downloaded" + ? "更新已下载完成" + : st === "installing" + ? "正在安装更新,应用即将重启..." + : st === "error" + ? `更新失败:${status?.error ?? "未知错误"}` + : ""; + + return ( +
+
+ + +
+ 更新内容 + + {notesLoading ? ( + +
+ + 正在获取发布说明... +
+
+ ) : notesError ? ( + +
+

获取发布说明失败:{notesError}

+ +
+
+ ) : notes ? ( + +
+ + 版本 v{notes.version} + {notesTag ? "(最新)" : "(当前)"} + + · 来源:{notes.source === "github" ? "GitHub" : `加速源 ${notes.source}`} + + + +
+ +
+ + {notes.notes} + +
+
+ ) : ( + +
+

+ 未获取到发布说明(GitHub 与加速源均不可用,或该版本尚未发布) +

+ + 打开 GitHub Releases + + +
+
+ )} +
+
+ + {/* 底部遮罩:fixed 吸附底部,样式与顶栏一致;驱动整个更新流程 */} +
+
+ {statusText && ( +
{statusText}
+ )} + + {isDownloading || isPaused ? ( +
+ +
+ + +
+
+ ) : ( + + )} +
+
+
+ ); +} diff --git a/src/stores/configStore.ts b/src/stores/configStore.ts index 0250a5f..b54f8d7 100644 --- a/src/stores/configStore.ts +++ b/src/stores/configStore.ts @@ -59,6 +59,7 @@ const DEFAULT_CONFIG: AppConfig = { download: { fileSource: "mirror", versionSource: "mirror", threads: 16, speedLimit: 0 }, network: { securityId: { enabled: false, authUrl: "" } }, ui: { showInstanceTitle: true, showTaskButton: true }, + update: { state: "idle", version: "", percent: 0, transferred: 0, total: 0, source: "github", error: "" }, instances: [], }; diff --git a/src/stores/routeStore.ts b/src/stores/routeStore.ts index c475789..13eaa50 100644 --- a/src/stores/routeStore.ts +++ b/src/stores/routeStore.ts @@ -9,6 +9,7 @@ export type RouteKey = | "setting/login" | "gallery" | "task-queue" + | "update" | "oobe" | "oobe/language" | "oobe/agreement" @@ -51,6 +52,7 @@ export const allRoutes: RouteItem[] = [ ...routes, { key: "setting/login", label: "登录", path: "/setting/login", hidden: true, backable: true }, { key: "task-queue", label: "任务队列", path: "/task-queue", hidden: true }, + { key: "update", label: "更新日志", path: "/update", hidden: true, backable: true }, { key: "oobe", label: "OOBE", path: "/oobe", hidden: true }, { key: "oobe/language", label: "语言设置", path: "/oobe/language", hidden: true }, { key: "oobe/agreement", label: "同意协议", path: "/oobe/agreement", hidden: true }, diff --git a/src/stores/updateStore.ts b/src/stores/updateStore.ts index f71f650..0cae6d1 100644 --- a/src/stores/updateStore.ts +++ b/src/stores/updateStore.ts @@ -1,51 +1,157 @@ import { create } from "zustand"; import { checkForUpdates, - downloadAndInstall, - type DownloadProgress, + downloadUpdate, + getUpdateState, + onUpdateStatus, + quitAndInstall, + resumeUpdate, + type UpdateStatusPayload, } from "../api/update"; -interface UpdateState { +/** + * 更新 store(与主进程 electron/updater.ts 的状态机联动): + * - 模块加载即订阅 update:status 事件 + 拉取一次状态快照 + * - check() / install() 触发主进程操作,状态由事件驱动更新 + */ + +interface UpdateProgress { + percent: number; + transferred: number; + total: number; + bytesPerSecond: number; +} + +interface UpdateStoreState { checking: boolean; downloading: boolean; installed: boolean; - progress: DownloadProgress | null; + progress: UpdateProgress | null; update: { version: string; releaseNotes?: string } | null; + currentVersion: string; + source: string; error: string | null; check: () => Promise; install: () => Promise; reset: () => void; } -export const useUpdateStore = create((set, get) => ({ - checking: false, - downloading: false, - installed: false, - progress: null, - update: null, - error: null, +type Setter = (partial: Partial) => void; - check: async () => { - set({ checking: true, error: null }); - try { - const update = await checkForUpdates(); - set({ update, checking: false }); - } catch (e: any) { - set({ error: e.message ?? String(e), checking: false }); - } - }, +function applyStatus(set: Setter, status: UpdateStatusPayload): void { + const next: Partial = { + currentVersion: status.currentVersion ?? "", + source: status.source ?? "github", + }; - install: async () => { - set({ downloading: true, error: null, progress: null }); - try { - await downloadAndInstall((progress) => { - set({ progress }); - }); - set({ downloading: false, installed: true }); - } catch (e: any) { - set({ error: e.message ?? String(e), downloading: false }); - } - }, + switch (status.state) { + case "checking": + next.checking = true; + next.error = null; + break; + case "available": + next.checking = false; + next.update = { version: status.version ?? "", releaseNotes: undefined }; + next.error = null; + break; + case "not-available": + next.checking = false; + next.update = null; + next.error = null; + break; + case "downloading": + next.downloading = true; + next.progress = { + percent: status.percent ?? 0, + transferred: status.transferred ?? 0, + total: status.total ?? 0, + bytesPerSecond: status.bytesPerSecond ?? 0, + }; + next.error = null; + break; + case "paused": + // 下载已暂停:保持 downloading 标记(VersionCard 按钮点击即继续) + next.downloading = true; + next.progress = { + percent: status.percent ?? 0, + transferred: status.transferred ?? 0, + total: status.total ?? 0, + bytesPerSecond: 0, + }; + next.error = null; + break; + case "downloaded": + case "installing": + next.downloading = false; + next.installed = true; + next.update = { version: status.version ?? "", releaseNotes: undefined }; + next.error = null; + break; + case "error": + next.checking = false; + next.downloading = false; + next.error = status.error ?? "更新失败"; + break; + default: + break; + } - reset: () => set({ update: null, error: null, progress: null, installed: false }), -})); + set(next); +} + +export const useUpdateStore = create((set, get) => { + // 模块加载即订阅(VersionCard 等组件引入本 store 后生效) + onUpdateStatus((status) => applyStatus(set, status)); + getUpdateState() + .then((status) => applyStatus(set, status)) + .catch((e) => console.error("[update] 获取状态失败:", e)); + + return { + checking: false, + downloading: false, + installed: false, + progress: null, + update: null, + currentVersion: "", + source: "github", + error: null, + + check: async () => { + set({ checking: true, error: null }); + try { + await checkForUpdates(true); + } catch (e) { + set({ error: e instanceof Error ? e.message : String(e), checking: false }); + } + }, + + install: async () => { + set({ downloading: true, error: null, progress: null }); + try { + // 智能分派:暂停→继续;已下载→安装;否则→开始下载 + const state = get().installed ? "downloaded" : get().update ? "available" : "idle"; + if (state === "downloaded") { + await quitAndInstall(); + return; + } + if (get().downloading && get().progress) { + await resumeUpdate(); + return; + } + await downloadUpdate(); + } catch (e) { + set({ error: e instanceof Error ? e.message : String(e), downloading: false }); + } + }, + + reset: () => + set({ + update: null, + error: null, + progress: null, + installed: false, + checking: false, + downloading: false, + }), + }; +}); diff --git a/src/types/electron.d.ts b/src/types/electron.d.ts index d76a20a..1f0693a 100644 --- a/src/types/electron.d.ts +++ b/src/types/electron.d.ts @@ -23,6 +23,17 @@ interface ElectronAPI { // Config reset resetConfig: () => Promise; + + // Auto-update + checkForUpdates: (manual?: boolean) => Promise; + downloadUpdate: () => Promise; + pauseUpdate: () => Promise; + resumeUpdate: () => Promise; + cancelUpdate: () => Promise; + quitAndInstall: () => Promise; + getUpdateState: () => Promise; + getReleaseNotes: (tag?: string) => Promise; + onUpdateStatus: (callback: (data: unknown) => void) => () => void; } declare global {