Soniva
下载桌面端
← 返回开发日志
开发日志2026-10-29

桌面端开发日志 · 2026-10-29

desktop 仓库 git log · 原文照录,未做改写

当日 30 个提交(修复 11 个,文档 10 个,新功能 8 个,重构 1 个)。主要涉及:桌面端、素材库、划词气泡。

提交记录

  • 40bf8a75 fix(library): 卡片挪去别的文件夹后网格错位重叠——virtual-core 只在行数变时重算位置,排版一变就 measure();feat: 选中卡片后方向键换选中(←→ 按顺序,↑↓ 找上下行横向最近的那张,Shift 圈选;预览/弹窗/输入框/文件夹树后点时让路);删掉或挪走选中的卡片后自动选中挨着的下一张(没有就上一张)
  • 7ce78928 feat(library): 图片裁切加水平、垂直翻转(裁切框跟着镜像,不丢);「尺寸与压缩」图标从视图缩小换成文件变小(顶栏、裁切工具条、批量右键菜单、多选详情栏四处一起换)
  • 7020e26a fix(library): 文件夹「导出到电脑」原来只复制这一层的直属文件、平铺——改成在选的目录里建同名文件夹,子文件夹一层层照建(空的也建)、文件各回各层;目标已有同名文件夹加 (2);体积预警按整棵子树算;导完打开新建的那个文件夹
  • f6b15221 docs: 输入记录补 10-29 一条(desktop/promo);desktop STATUS 记网格错位等五项与两处未做;opus 日志
  • ae121bf7 fix(library): 导出分享包导文件夹只带直属一层(事故:上一批改了「导出到电脑」、看到分享包同病却只记待办没改)——pack.json 加 folders + 每条 folderPath(可选字段,老包照旧能导),导出带整棵子树含空文件夹,导入按路径照建、导到根时同名文件夹合并;整库导出同样保留层级;三条文件夹出库路共用 folder-subtree.ts,并写 🔗 联动清单
  • f0954df1 feat(library): 按画面认重复——重新下载、复制粘贴过的同一张图字节不同、SHA-256 认不出,补一层画面指纹(缩略图 9×8 灰度 dHash,差 ≤6 位且宽高比一致算一样,存 asset_visual_hash 纯索引表,老库首次导入时补算);导入时配上的进同一个逐条确认窗,标「看起来一样,文件不同」(跳过=这次的进回收站,替换=留这次的、旧的评分标签注释网址搬过来);素材库右键加「找出看起来一样的图」整库扫一遍,确认窗 scan 模式:留先有的 / 留后来的 / 都留着;确认窗零件拆到 ImportDuplicatesParts.tsx
  • 5eed3d28 feat(board): 画布工具条加吸管——点一下进 Chromium 取色,屏幕上任意一处(画布里的图片、别的窗口)都能吸,#RRGGBB 写进剪贴板并弹通知,Esc 取消不打扰;吸完回到原工具
  • 566fcccb fix(selection-bubble): 电子书划一整章点全局气泡朗读只念一部分——三道闸叠着:电子书把划到的字截成 500(那是标注引文的长度)、气泡入口超 2 万字直接不出、划词朗读缺省只念 2000 字;电子书改送全文(标注仍 500),气泡四个入口与朗读上限统一 20 万字(limits.ts / SPEAK_FROM_MAX_CHARS,🔗 两边同数)
  • d27bb402 feat(selection-bubble): 气泡「提问」默认就地回答——回答流式出现在气泡旁的回答卡(同一个窗口的第三种形态,可拖动),不切到工作室、不落库;卡上「存进库」把问答存成一份 MD、「去工作室接着问」照旧建会话;设置「就在气泡旁边回答」可关回去工作室;主进程不再替提问抢前台,去工作室那条由主窗口自己请求带到前台;refactor: bubble-sidecar-host 周边上行指令纯搬运到 sidecar-aux-ops.ts(守 300 行)
  • 4dbf81d7 fix(selection-bubble): 空格预览电子书全局气泡时灵时不灵、有时不在最上面——①拖着划过正文边缘、松手落在 iframe 外时 iframe 收不到 pointerup,这次划词什么气泡都不出;父窗口补听一次,选区还在且是新的才补报;②面板只设了 floating 层级,前台是全屏空间时气泡留在原空间里看不见;划词气泡、听写条、剪贴板快捷面板统一走 floatAboveEverything(visibleOnFullScreen);refactor: 气泡建窗参数纯搬运到 bubble-window-create.ts(守 300 行)
  • b241dcae docs: desktop STATUS 记 10-29 第二批六项;输入记录补提交号;opus 日志
  • c767fcbc fix(local-tts): 数字路由剥首尾标点取核心 + 中文语境改窗口判定——《1844年》不再读英文
  • 198bb5f0 feat(desktop): 右下角提示卡片点一下就复制标题和描述——挂在共用的 Toaster 上(所有卡片、直接用 sonner 的也算),卡片里的按钮照旧不触发;复制后弹“已复制这条提示”,卡片光标改成复制样式
  • 08a0010f fix(studio): web 服务关了合成却报“请检查网络代理”、批量停下说“如请求过于频繁”——主进程转发层早写好了“连不上哪个地址、多半是 web 的 pnpm dev 没开”,工作室单段和分段两条(🔗)原来都换成泛泛文案;现在照原因说,ipcErrorMessage 顺带剥掉 Electron 的 Error invoking remote method 前缀;批量停下改成“原因看旁边那条提示”
  • cf1944c2 fix(studio): 批量命中缓存的确认框改成排队——原来下一句来问时把还没回答的上一句直接当“只用缓存”,那句静默少落一个文件;收队账单加“缺第几句”“几个没带编号(新合成 / 缓存再存分开数)”,下次复现直接对上是哪条路径
  • f066efa7 docs: desktop STATUS 记第三批;输入记录补提交号
  • 2a8b7bcb fix(studio): 批量合成新句子不编号、文件名落回台词——编号原来靠合成起跑那一刻队列还开着、正轮到这句(读全局当前位次),起跑晚于队列放行 / 队列已收尾 / 开发时热更新重置队列模块都会读成“不在批量里”:不编号、也不按批量规则存。改成队列放出这句、发送管线回报消息 id(原文、译文两张卡)时按 id 登记位次(batch-line-registry.ts),单段 / 分段 / 本机引擎三处(🔗)合成起跑时按消息 id 取一次、取完即删(之后手动再播放是普通播放,不多存)
  • 878438bd fix(library): 导出到电脑、用默认程序打开时后缀多一个(松鼠.png.png / 松鼠.png (3).png)——导入的文件拿原文件名当标题,这两处又拼一次后缀;标题已以同一后缀结尾先去掉(plainFileBase),🔗 与拖出窗口 buildExportFilename 口径一致;加单测
  • ec45a0d1 docs(desktop): STATUS 与输入记录补批量编号、导出后缀两条
  • 4425d0b2 docs(desktop): 输入记录
  • f466a080 fix(library): 选中一张按 Delete 删掉后没选中相邻那张——Delete / 批量删除走 handleBatchTrash,删完 selection.clear() 把“选中的没了就选下一张”的兜底盖掉;批量删除 / 彻底删除 / 恢复改成删除前按当前列表算好相邻那张、完成后选中(没有才清空);找相邻的算法合成一份 neighborAfterRemoval(🔗 选中兜底同用);批量处理函数纯搬运到 batch-removal-actions.ts(守 300 行);加单测
  • 5c9701ac docs(desktop): 输入记录
  • ca1f4f12 docs: 音频补充时长
  • 0ab33b19 feat(desktop): AI 会话加「自定义(OpenAI 兼容)」——填接口地址、Key、模型,主进程直连不经 Soniva、不扣积分
  • cfbe2d0d docs(desktop): STATUS 记自定义(OpenAI 兼容)与收窄项;输入记录
  • 44f0fae8 feat(desktop): 自定义(OpenAI 兼容)补坑——可填多组接口,比稿和看板 AI 也能用
  • 2a0055e6 refactor(desktop): run-ai-chat-send-turn.ts 378→295 行——拼用户消息、组请求消息、停止收尾、请求报错四段拆进 ai-chat-send-turn-parts.ts(纯搬运,逻辑注释原样),顺手删四个没用的引用
  • 1ca59c3e docs(desktop): STATUS 记自定义接口第二轮;输入记录
  • 69a2d2d7 feat(desktop): 套餐加 Go 卡片、文案按现状重写;订阅栏加「邀请与兑换」;会员和平台 AI 分开判断
  • 95f6efcc docs: web STATUS 记 Go 与授权层迁移待推生产;各子项目输入记录