[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-92596":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":8,"htmlUrl":8,"language":9,"languages":8,"totalLinesOfCode":8,"stars":10,"forks":11,"watchers":12,"openIssues":13,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":14,"stars30d":15,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":16,"rankGlobal":8,"rankLanguage":8,"license":8,"archived":17,"fork":17,"defaultBranch":18,"hasWiki":17,"hasPages":17,"topics":19,"createdAt":8,"pushedAt":8,"updatedAt":20,"readmeContent":21,"aiSummary":22,"trendingCount":14,"starSnapshotCount":14,"syncStatus":23,"lastSyncTime":24,"discoverSource":25},92596,"esp8266-ai","pengchujin\u002Fesp8266-ai","pengchujin",null,"C",77,10,66,1,0,11,38.22,false,"main",[],"2026-07-22 04:02:06","# ESP8266 AI 状态时钟\n\n一个 ESP8266 WiFi 时钟固件：显示时间 + Claude Code \u002F Codex CLI 的实时工作状态和用量。\n不需要任何官方账单 API key —— 数据来自两处本地已有的来源：\n\n- **工作状态**（working\u002Fidle\u002Foffline）：本地会话日志的新旧程度\n  - `~\u002F.claude\u002Fprojects\u002F**\u002F*.jsonl`（Claude Code 会话记录）\n  - `~\u002F.codex\u002Fsessions\u002F**\u002F*.jsonl`（Codex CLI 会话记录）\n- **真实额度**（5h \u002F 周窗口用量百分比 + 重置时间）：复用两个 CLI 已经存在本机的\n  OAuth 登录凭据，直接调各自官方用量接口（做法与\n  [CodexBar](https:\u002F\u002Fgithub.com\u002Fsteipete\u002FCodexBar) 相同，token 只发给各自官方 API）：\n  - Claude：Keychain 里的 `Claude Code-credentials` → `api.anthropic.com\u002Fapi\u002Foauth\u002Fusage`\n  - Codex：`~\u002F.codex\u002Fauth.json` → `chatgpt.com\u002Fbackend-api\u002Fwham\u002Fusage`\n\n架构：`mac-app\u002F` 是一个 **Swift 原生菜单栏 app**（Windows 用户用 `windows-app\u002F`，\n功能一致的 C# 托盘移植版），读日志、开一个本地 HTTP 服务；\n`firmware\u002F` 是 ESP8266 固件，联网后每 15 秒轮询这个服务，把时间 + 状态画到 240x240\nST7789 彩屏上。桌宠动画（GIF）的上传和解码**全部在 ESP8266 板子上完成**，换形象不再需要\n电脑参与（详见第 4 节）。\n\n## 目录结构\n\n```\nmac-app\u002F      Mac 原生菜单栏 app (Swift \u002F SPM，仅用系统框架，无第三方依赖)\nwindows-app\u002F  Windows 托盘 app (C# \u002F .NET 8 WinForms)，功能与 mac-app 一致（见其 README）\nfirmware\u002F     ESP8266 固件 (PlatformIO + Arduino framework)，含板上 GIF 解码\ntools\u002F        GIF -> RGB565 默认精灵图头文件的转换脚本（改编译进固件的默认动画时用）\n```\n\n## 1. 跑起 Mac 端菜单栏 app\n\n> Windows 用户：功能一致的托盘版见 [`windows-app\u002FREADME.md`](windows-app\u002FREADME.md)，\n> 本节其余说明（左右键交互、自动配对、数据来源）同样适用。\n\n需要 Xcode \u002F Swift 工具链（macOS 自带 `swift`）。\n\n```bash\ncd mac-app\nswift run                # 前台运行；或 swift build 后跑 .build\u002Fdebug\u002FAIClockBridge\n```\n\n菜单栏会出现一个**复古麦金塔小电脑图标**（代码画的模板图，自动适配深浅色菜单栏，\n不占宽度显示额度数字）：\n\n- **左键点击** → 弹出 ESP8266 屏幕的**实时镜像**：Mac 端用与固件完全相同的数据\n  重绘同一个画面（方形额度环 + 当前桌宠动画 + logo + 额度文字），动画帧直接从设备\n  `GET \u002Fsprite\u002F\u003Capp>\u002Fraw` 拉取（设备正在用什么就播什么，自定义\u002F内置都一样），\n  working 时同步播放走路循环，随设备 2s\u002F6s 切换同步换角色；底部附\n  自动\u002FClaude\u002FCodex 快速切换。\n- **右键点击** → 控制菜单：完整额度（5h\u002F周 用量 + 重置倒计时）+ 设备遥控：\n\n- **自动查找并配对设备**：一般不用手动——设备本来就在轮询本机的 `\u002Fstatus`，\n  bridge 记下来访 IP 即完成发现（零扫描）；地址为空时自动配对，设备 DHCP 换了 IP\n  也会自愈。菜单项走完整流程：最近来访 IP → 已配置地址复验 → 子网 \u002F24 扫描兜底\n  （覆盖\"刚配完 WiFi、还没设过桥接\"的全新设备）。\n- **设置设备地址…**：手动填时钟的 IP（开机时屏幕会显示；有自动配对后基本用不上）\n- **屏幕显示**：自动（谁在干活显示谁）\u002F 固定 Claude \u002F 固定 Codex\n- **音乐播放**：显示 Mac 当前播放的专辑封面、歌曲、歌手和进度\n- **更换桌宠动画…**：内置 [petdex.dev](https:\u002F\u002Fpetdex.dev) 画廊（3300+ 开源桌宠），\n  搜索 → 选动画（待机\u002F跑步\u002F挥手…9 种）→ 预览 → 一键上传到设备\n- **恢复默认动画**：删掉自定义 GIF，回到固件内置形象\n- **把本机设为设备桥接**：一键把设备的 Bridge host 指到这台 Mac\n\n验证服务是否正常：\n\n```bash\ncurl -s http:\u002F\u002Flocalhost:8765\u002Fstatus | python3 -m json.tool\n```\n\n已验证返回示例（真实数据）：\n\n```json\n{\n  \"claude\": {\"status\": \"working\", \"tokens_today\": 4868001, \"session_min\": 26, \"session_window_min\": 300},\n  \"codex\":  {\"status\": \"offline\", \"tokens_today\": 61471, \"primary_pct\": 1.0, \"primary_window_min\": 300,\n             \"primary_reset_min\": 0, \"weekly_pct\": 2.0, \"weekly_window_min\": 10080, \"weekly_reset_min\": 8729}\n}\n```\n\n想要开机自启：`swift build -c release` 得到 `.build\u002Frelease\u002FAIClockBridge`，把它包成\nLaunchAgent（`~\u002FLibrary\u002FLaunchAgents\u002F`）即可，未内置，按需再加。\n\n**注意**：HTTP 服务监听 `0.0.0.0:8765`，同一局域网内的设备都能读到（只是状态和 token\n计数，不含任何 API key），如果在意，建议只在家庭可信网络下跑，或用系统防火墙限制。\n\n### 数据来源与局限\n\n- **额度（两家都是真实值）**：app 每 2 分钟调一次官方用量接口（见开头），拿到\n  5h \u002F 周窗口的已用百分比和重置时间，合并进 `\u002Fstatus` 下发给设备。接口 429 限流时\n  自动退避 5 分钟并沿用上一次的数值。\n- Claude 的 OAuth token 存在 Keychain，app 通过 `security` CLI 读取，第一次运行\n  macOS 可能弹一次授权框（选\"始终允许\"即可）；`~\u002F.claude\u002F.credentials.json` 存在时\n  优先读文件。\n- 若凭据缺失\u002F过期，额度显示\"?\"，工作状态仍照常工作（来自日志，不依赖网络）。\n\n## 2. 烧录 ESP8266 固件\n\n已确认的硬件：ESP8266EX（ESP-12S 模组）\u002F 4MB flash \u002F CH340C 转串口，设备节点\n`\u002Fdev\u002Fcu.usbserial-130`。这是拼多多\"WiFi天气时钟 MG01\"成品板，本质是 oshwhub 上\n[\"SD2\u002F小电视\"开源方案](https:\u002F\u002Foshwhub.com\u002Fq21182889\u002Fsd2) 的量产版。\n\n**接线是厂家固定的，一体成型无法重接**，网上能搜到的几份\"看起来像\"的教程接线图实测\n都是错的——真正正确的引脚来自该开源项目附带的厂家参考固件源码\n（`TFT_eSPI\u002FUser_Setup.h` + `SmallDesktopDisplay.ino`），已在实机验证点亮：\n\n| 屏幕引脚 | 说明 | ESP-12S | GPIO |\n|---|---|---|---|\n| SCLK | SPI 时钟 | D5 | GPIO14（硬件 SPI）|\n| MOSI | SPI 数据 | D7 | GPIO13（硬件 SPI）|\n| CS   | 片选 | D8 | GPIO15 |\n| DC   | 数据\u002F命令选择 | D3 | GPIO0  |\n| RESET| 复位 | D4 | GPIO2  |\n| 背光 | LED 背光，**低电平点亮**，厂家固件用 PWM 调光 | D1 | GPIO5  |\n| VCC  | 电源 | 3V3 | - |\n| GND  | 地 | GND | - |\n\n驱动型号也有讲究：要用 TFT_eSPI 的 `ST7789_2_DRIVER`（一个专门的简化初始化变体），\n用普通的 `ST7789_DRIVER` 配合正确引脚依然点不亮。`platformio.ini` 里已经按这个组合\n配置好了。\n\n如果你买到的是完全不同的板子，改 `firmware\u002Fplatformio.ini` 里 `build_flags` 的\n`TFT_*` 几行即可；但如果就是这款\"WiFi天气时钟 MG01\"，直接用现在的配置就行，不用再猜。\n\n```bash\ncd firmware\npython3 -m venv .pio-venv && source .pio-venv\u002Fbin\u002Factivate\npip install platformio\npio run -t upload          # 已验证：编译成功，Flash 45.7%，RAM 39.7%\n```\n\n烧录后串口会打印调试日志（这版固件不再是\"静默\"的）：\n\n```\n[wifi] starting WiFiManager autoConnect...\n*wm:AutoConnect\n*wm:No wifi saved, skipping\n*wm:StartAP with SSID:  AI-Clock-Setup\n*wm:AP IP address: 192.168.4.1\n```\n\n首次开机（或 WiFi 配置丢失时）会开一个热点 `AI-Clock-Setup`，手机连上后自动弹出配置页\n（或手动访问 `192.168.4.1`），选择你的 WiFi，并在 \"Bridge host (ip:port)\" 里填这台 Mac\n的局域网 IP，例如 `192.168.1.23:8765`。保存后设备会记住配置（存在 LittleFS 里），下次\n开机自动连线。\n\n查看串口日志：\n\n```bash\npio device monitor -b 115200\n```\n\n## 3. 屏幕布局\n\n全屏单应用视图（不显示时钟），一次只显示 Claude 或 Codex 其中一个，规则：\n\n- **只有一方在工作** → 固定显示正在工作的那个\n- **两方都在工作** → 每 2 秒交替\n- **都空闲** → 每 6 秒慢速交替\n- Mac 菜单栏里也可以强制固定显示某一方（`POST \u002Fapi\u002Fdisplay`），固定后忽略上述规则\n\n视觉元素：\n\n- 屏幕中央：对应角色的大幅像素动画（Claude = 跑步的 Dario，Codex = 戴耳机的宠物），\n  仅在该角色 `working` 时播放动画，否则停在静止帧。\n- 屏幕四周一圈方形进度环：环的填充长度 = 用量百分比（Claude 用 5 小时滚动窗口已用\n  比例近似，Codex 用真实的 5h `primary_pct`）；环的颜色\u002F动画参考\n  [vibecoding-signal-light](https:\u002F\u002Fgithub.com\u002Fstarlight36\u002Fvibecoding-signal-light)\n  的红绿灯设计：\n  - **常亮绿** = 空闲\u002F离线，不需要关注\n  - **绿→黄→红缓慢循环** = 正在工作\n  - **红色闪烁**（最高优先级，覆盖其他状态）= 桥接服务连不上或数据过期（超过\n    2 个轮询周期没更新），需要马上看一眼\n- **整圈边框红色闪烁 = 需要你确认操作**：Claude \u002F Codex 弹出权限\u002F审批选择时（Claude\n  的 `Notification`、Codex 的 `PermissionRequest` hook），设备整圈边框红色闪烁提醒你去\n  确认；AUTO 模式还会自动切到那个待审批的角色（优先级高于音乐自动切换）。你在 CLI 里\n  做出选择后（下一个工具调用\u002F回合事件到达）自动停止闪烁，5 分钟无响应也会自动超时清除。\n  Mac 弹窗镜像同步显示红色边框闪烁。\n\n## 4. 自定义桌宠形象\n\n两个入口，推荐 Mac 菜单栏（petdex 画廊 + 预览），设备网页作为兜底：\n\n1. **Mac 菜单栏 →「更换桌宠动画…」**：从 [petdex.dev](https:\u002F\u002Fpetdex.dev) 的公开\n   manifest（`assets.petdex.dev\u002Fmanifests\u002Fpetdex-v1.json`，3300+ 开源桌宠）搜索选择。\n   每个桌宠是一张 1536x1872 的 WebP 精灵图（8 列 x 9 行，每帧 192x208，每行一种动画：\n   待机\u002F左右跑\u002F挥手\u002F跳跃\u002F失败\u002F等待\u002F原地跑\u002F思考）。app 在本地裁出所选动画行、缩放到\n   目标插槽尺寸、合成黑底循环 GIF，然后 POST 到设备的 `\u002Fsprite\u002Fclaude|codex`。\n2. **设备网页** `http:\u002F\u002F\u003C设备IP>\u002F`：手动上传任意 `.gif`，适合用自己的图。\n\n两条路最终都走同一条链路：设备收到 GIF 后**自己在板上解码并缩放**，立刻替换该角色的\n动画，重启后也记得，**不需要重新编译或烧录固件**。\n\n### 设备 HTTP API（Mac app 用的就是这套）\n\n| 方法 | 路径 | 说明 |\n|---|---|---|\n| GET | `\u002Fapi\u002Finfo` | 设备状态 JSON：ip\u002Fssid\u002Fbridge\u002F显示模式\u002F当前显示\u002F自定义精灵标记 |\n| POST | `\u002Fapi\u002Fdisplay` | `mode=auto\\|claude\\|codex\\|net\\|music` 切换屏幕显示（net=网速曲线页，music=音乐播放页）|\n| POST | `\u002Fapi\u002Fbridge` | `host=ip:port` 设置桥接地址 |\n| POST | `\u002Fsprite\u002Fclaude`、`\u002Fsprite\u002Fcodex` | multipart 上传 GIF 并板上解码替换 |\n| POST | `\u002Fsprite\u002Fclaude\u002Freset`、`\u002Fsprite\u002Fcodex\u002Freset` | 删除自定义动画，恢复内置形象 |\n| GET | `\u002Fsprite\u002Fclaude\u002Fraw`、`\u002Fsprite\u002Fcodex\u002Fraw` | 当前生效动画的原始帧流 `[1B帧数][RGB565大端帧...]`（镜像窗口用）|\n\n`\u002Fapi\u002Finfo` 里的 `sprite_rev` 在每次上传\u002F重置动画后自增，镜像端据此决定是否重新拉帧。\n\n## 5. 网速曲线页（Mac + 设备同步显示）\n\nMac app 每 250ms（4Hz）读一次内核的网卡字节计数（getifaddrs\u002FAF_LINK，只统计物理\n`en*` 网卡，避免 VPN\u002Futun 重复计数），保留 3 分钟历史。\n\n显示模式切到「网速曲线」后，设备端**渲染与网络完全解耦**：`GET \u002Fnet` 返回带全局\n序号（seq）的最近 12 个 250ms 样本，设备每 2 秒拉一次补进队列（按 seq 去重），\n渲染以固定 250ms\u002F列的节奏消费队列，HTTP 延迟不会体现在画面上。\n\n界面是任务管理器风格的**滚动填充面积图**（224 列 x 128px，56 秒窗口，最新在右）：\n下载 = 暗绿填充 + 亮绿顶边，上传 = 2px 黄线，背景 25\u002F50\u002F75% 暗格线；整图共享一个\n1\u002F2\u002F5 阶梯的\"整数量程\"（10K\u002F20K\u002F50K\u002F…），高度全图可比，量程标签显示在图外右上。\n每帧从 224 个样本的数据环逐行合成像素、每行一次 `pushImage` 整行写屏——没有\n\"先清屏再画\"的过程，所以完全无闪烁。顶部大号 DL\u002FUL 读数取 1 秒平均，只在数值\n变化时局部重绘。Mac 弹窗镜像用同一套数据模型和布局同步渲染。\n\nMac 端常驻进程由 LaunchAgent（`~\u002FLibrary\u002FLaunchAgents\u002Flocal.AIClockBridge.plist`，\n每 60 秒拉活 `mac-app\u002F.build\u002FAIClockBridge.app`）管理；**改代码后要把新二进制和\n资源包同步进这个 .app**（`cp .build\u002Fdebug\u002FAIClockBridge .build\u002FAIClockBridge.app\u002FContents\u002FMacOS\u002F`），\n否则 LaunchAgent 会不断复活旧版本、和手动启动的新版本抢 8765 端口轮流应答。\n\n## 6. 音乐播放页（Mac + 设备同步显示，自动切换）\n\n**AUTO 模式下自动切换**：Mac 一有音频在播放（放歌、看视频都算），设备自动切到音乐\n页；停止后自动切回桌宠\u002F额度页。机制：`\u002Fstatus` 带 `music_playing` 字段（状态轮询\n5 秒一次 → 开始播放约 5 秒内切入），音乐页显示时靠 `\u002Fmusic` 的 2 秒轮询快速检测停止\n（约 2 秒切回）。仅 AUTO 生效；手动固定某模式（含固定「音乐播放」）时不受影响。\n`\u002Fapi\u002Finfo` 里 `mode` 是配置的模式、`effective` 是当前实际渲染的模式，Mac 镜像按\n`effective` 跟随。\n\n\n显示模式切到「音乐播放」（弹窗底部分段控件 \u002F 右键菜单 \u002F `POST \u002Fapi\u002Fdisplay mode=music`）\n后，Mac app 通过系统 Now Playing 信息读取当前播放的歌曲、歌手、播放进度和专辑封面，\n桥接服务提供：\n\n- `GET \u002Fmusic`：歌曲、歌手、专辑、播放状态、进度、封面版本号\n- `GET \u002Fmusic\u002Fcover.raw`：128x128 RGB565 封面原始像素，设备逐行读取后直接绘制\n\n设备每 2 秒刷新一次音乐信息；封面只有在版本号变化时重新拉取。Mac 弹窗镜像同样显示\n音乐页，方便不用看设备也能确认布局。\n\n## 7. Hooks 实时状态（秒级，参考 clawd-on-desk 的做法）\n\n除了日志 mtime 轮询（保留为兜底），bridge 还接收两个 CLI 官方 hooks 的事件推送，\n状态切换从\"最多迟滞 20 秒\"变成\"毫秒级\"：\n\n- bridge 新增 `POST \u002Fevent`，body：`{\"agent\":\"claude|codex\",\"event\":\"PreToolUse\"}`\n- `~\u002F.claude\u002Fsettings.json` 已注册 8 个事件的 curl hook（UserPromptSubmit\u002FPreToolUse\u002F\n  PostToolUse\u002FStop\u002FSessionEnd\u002FNotification\u002FPreCompact\u002FSubagentStop，每条 `-m 1` 超时，\n  不会拖慢 Claude Code；与已有 hooks 共存，靠命令里的 `8765\u002Fevent` 标记幂等）\n- 映射：UserPromptSubmit\u002FPre\u002FPostToolUse 等 → working（TTL 10 分钟，覆盖长工具调用）；\n  Stop\u002FNotification 等 → idle（TTL 60 秒，只用来立刻压掉 mtime 的\"工作尾巴\"）\n- Codex 侧已写入 `~\u002F.codex\u002Fhooks.json` + `config.toml [features] hooks = true`，\n  但 Codex 要求在 TUI 里跑一次 `\u002Fhooks` 信任新命令后才生效；未信任前走 mtime 兜底。\n- 局限：事件是全局的不分会话——A 会话 Stop 会把还在干活的 B 会话压成 idle 最多 60 秒\n  （B 的下一个工具调用事件会立刻翻回 working）。\n\n### GIF 上传架构\n\n架构：GIF 通过 `ESP8266WebServer` 的 multipart 文件上传（`HTTPUpload` 回调）边收边流式\n写进 LittleFS 的临时文件（`\u002Fc.gif` \u002F `\u002Fx.gif`），然后固件用\n[AnimatedGIF](https:\u002F\u002Fgithub.com\u002Fbitbank2\u002FAnimatedGIF) 库**逐行解码**成设备要的 RGB565\n帧，写入 `\u002Fc.bin` \u002F `\u002Fx.bin`（格式 `[1字节帧数][各帧像素...]`），最后删掉临时 GIF。\n\nESP8266 总共只有 ~80KB RAM，一帧 120x120 的 RGB565 就 ~28KB，AnimatedGIF 自己也要\n~24KB，两个大缓冲塞不下，所以整条链路都是**逐行流式、不常驻整帧**：\n\n- 上传：multipart 分块写文件，不把整个 body 攒进一个 `String`（那样体积必炸内存）。\n- 解码：AnimatedGIF 逐行回调，只用两条「一行」缓冲把源行最近邻缩放到目标尺寸，直接\n  逐行写进 `.bin`；不覆盖到的区域用**上一帧**补齐（读回刚写进 `.bin` 的上一帧），\n  这样被优化器裁成小矩形的 GIF（disposal method 1）也能拼对。解码期间才在堆上\n  临时 `new` 出 AnimatedGIF，用完就 `delete`。\n- 显示：每次也只把「当前要画的一帧」从 LittleFS 逐行读出来 `pushImage`，不整帧驻留内存。\n- 没有自定义素材时，退回固件里编译好的默认动画（`firmware\u002Finclude\u002Fimg\u002F*.h`）。\n\n**注意事项 \u002F 局限**：\n\n- GIF 太大（尺寸很大、颜色\u002F帧很多）可能因内存不足解码失败，页面会报错，换小一点的即可。\n- 目标插槽尺寸固定：Claude 111x120、Codex 120x120，板上会最近邻缩放匹配（质量不如\n  PIL 的 LANCZOS，像素风 GIF 通常没问题）。\n- 最多取 GIF 的**前 8 帧**（没有整体帧数信息，就不做均匀抽帧了）。\n- disposal method 2（\"恢复到背景色\"）没有单独区分，未覆盖像素保留上一帧而不是清空；\n  对循环角色动画来说无所谓。\n- WiFi 上传大文件偶尔会瞬时掉线（broken pipe 之类），失败重新上传一次即可。\n\n## 已知限制 \u002F TODO\n\n- 参考项目里的“黄色闪烁-需要处理”“红色闪烁-需要批准”这类更细的状态，目前本地日志\n  拿不到可靠信号，没有实现，只做了 working\u002Fidle-离线\u002F桥接离线 三档。\n- Mac 端 app 无鉴权，HTTP `\u002Fstatus` 监听 `0.0.0.0:8765`，仅建议在可信局域网使用；\n  设备的 HTTP API 同样无鉴权。\n- Claude 用量接口有较严格的服务端限流（429），app 已做 60s 节流 + 429 后 5 分钟退避 +\n  沿用旧值，偶尔菜单里额度会显示为几分钟前的数据。\n- 未做开机自启 LaunchAgent，需要的话可以再加（见第 1 节）。\n- 改**默认**编译进固件的动画（`firmware\u002Finclude\u002Fimg\u002Fclaude_sprite.h` \u002F\n  `codex_sprite.h`）仍可用 `tools\u002Fconvert_sprites.py` 生成新的 `.h` 后 `pio run -t upload`；\n  日常换形象用菜单栏 petdex 选择器或设备网页即可，无需烧录。\n","这是一个基于 ESP8266 的硬件状态时钟项目，用于实时可视化本地 Claude Code 和 Codex CLI 的工作状态（working\u002Fidle\u002Foffline）及真实 API 使用额度（周用量百分比与重置倒计时）。其核心特点是完全复用用户本机已有的 OAuth 凭据，通过 macOS Keychain 或 ~\u002F.codex\u002Fauth.json 安全调用官方用量接口，不接触 API key；配套的 Swift\u002FmacOS 和 C#\u002FWindows 桥接应用提供菜单栏控制、自动设备发现、GIF 桌宠上传及 ESP8266 屏幕镜像预览。适用于开发者监控本地 AI 开发工具使用情况，尤其适合桌面常驻、多模型切换、低干扰状态感知场景。",2,"2026-07-09 02:30:27","CREATED_QUERY"]