Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
6a58890
refactor(linux): move shared runtime assets out of Tauri
aeoform Sep 4, 2026
759d188
feat(linux-egui): adopt redesigned native shell
aeoform Sep 4, 2026
94ff585
feat(linux-egui): add typed popup process bridge
aeoform Sep 5, 2026
33128ec
feat(linux-egui): add native desktop services
aeoform Sep 5, 2026
deb18d4
feat(linux-egui): add verified AppImage replacement
aeoform Sep 5, 2026
84bd210
feat(linux-egui): render native popup processes
aeoform Sep 5, 2026
c61188c
feat(linux-egui): bind vocabulary corrections and styles
aeoform Sep 5, 2026
d631bfd
feat(linux-egui): add real history actions
aeoform Sep 5, 2026
1d029a6
feat(linux-egui): wire native popup supervisors
aeoform Sep 5, 2026
239c63a
feat(linux-egui): bind marketplace and device login
aeoform Sep 5, 2026
685ca63
fix(linux-egui): do not overreport update capability
aeoform Sep 5, 2026
09fb8ff
feat(linux-egui): honor minimized startup
aeoform Sep 5, 2026
91cfbc2
test(linux-egui): lock Tauri-free parity contracts
aeoform Sep 5, 2026
baf0234
fix(core): keep provider URL validation clippy-clean
aeoform Sep 5, 2026
fedfabd
refactor(linux-egui): keep view data clippy-clean
aeoform Sep 5, 2026
43ca9c2
feat(settings): transact launch at login effects
aeoform Sep 5, 2026
5f5dc83
feat(linux-egui): complete verified AppImage updater
aeoform Sep 5, 2026
f635084
feat(linux-egui): restore native desktop lifecycle
aeoform Sep 5, 2026
a940d19
feat(linux-egui): restore history audio workflows
aeoform Sep 5, 2026
4139c7c
feat(linux-egui): complete local model controls
aeoform Sep 5, 2026
07dbf6e
feat(linux-egui): add native style pack editor
aeoform Sep 5, 2026
83d090b
feat(linux-egui): complete marketplace workflows
aeoform Sep 5, 2026
234cc06
feat(linux-egui): merge dirty settings on revision conflict
aeoform Sep 5, 2026
8e95ce5
feat(linux-egui): complete fcitx5 desktop hotkeys
aeoform Sep 5, 2026
2f12d88
feat(linux-egui): harden and restore native popups
aeoform Sep 5, 2026
9af7c3b
feat(linux-egui): bind shared vocabulary presets
aeoform Sep 5, 2026
f932b0e
feat(linux-egui): edit style hotkeys without blocking frames
aeoform Sep 5, 2026
23b04f6
feat(linux-egui): persist and export diagnostic logs
aeoform Sep 5, 2026
6f8672f
feat(linux-egui): edit all fcitx5 hotkeys
aeoform Sep 5, 2026
a779417
fix(linux-egui): follow terminal capture cancellation
aeoform Sep 5, 2026
eb1121f
docs(linux-egui): record parity and device limits
aeoform Sep 5, 2026
e95e365
docs(linux-egui): track latest 1019 head
aeoform Sep 6, 2026
b594a60
fix(linux-egui): reload fcitx5 after addon update
aeoform Sep 6, 2026
aedd7de
feat(linux-egui): restore recording and appearance settings
aeoform Sep 6, 2026
a30f7ed
feat(linux-egui): restore Core-backed overview
aeoform Sep 6, 2026
051553b
feat(linux-egui): restore native recording feedback
aeoform Sep 6, 2026
d241b1e
ci(linux-egui): lock release artifacts and checksums
aeoform Sep 6, 2026
d14a304
feat(linux-egui): localize native interface
aeoform Sep 6, 2026
649e60f
fix(linux-egui): tolerate legacy fcitx addon methods
aeoform Sep 6, 2026
3c2ced4
[pi] Work in progress
aeoform Sep 7, 2026
2f2eb63
[pi] Work in progress
aeoform Sep 7, 2026
213e547
[pi] All tasks are complete. Here's a summary of what w...
aeoform Sep 7, 2026
1b58a39
fix(linux-egui): preserve original frontend content geometry
aeoform Sep 7, 2026
40980c1
Merge branch 'beta' into feat/linux-egui-tauri-parity
aeoform Sep 11, 2026
4ad4b41
fix(linux-egui): align beta contracts and slim release
aeoform Sep 11, 2026
b4d29a6
ci: make Linux PR and release gates reliable
aeoform Sep 11, 2026
7e93d47
fix(linux): remove dead frontend artifacts and restore autostart
aeoform Sep 11, 2026
b2a306f
fix(settings): handle launch-at-login in Tauri restore
aeoform Sep 11, 2026
2724e96
fix(ci): follow relocated Linux remote input assets
aeoform Sep 11, 2026
72c5927
fix(ci): normalize Windows contract paths
aeoform Sep 11, 2026
4987d7a
refactor(linux): rely on packaged fcitx addon
aeoform Sep 11, 2026
92ab5b4
feat(linux): add audio backend fallback and fcitx clipboard
aeoform Sep 11, 2026
73a76c2
ci(linux): use native deb and rpm packaging
aeoform Sep 11, 2026
fcebd1d
fix(linux): bound addon reload and use app version
aeoform Sep 11, 2026
04c97af
fix(linux-egui): restore input and CI build
aeoform Sep 11, 2026
fbde862
fix(linux-egui): align window input regions
aeoform Sep 11, 2026
0303488
fix(linux-egui): restore frontend input routing
aeoform Sep 11, 2026
70c35c1
wip(linux-egui): 2.0 parity checkpoint before parallel page rewrites
Sep 13, 2026
5be7d66
chore: parity agent orchestration script
Sep 13, 2026
1157fe5
[pi] 我负责的三个功能性 bug 全部修完,全量测试通过。报告如下。
aeoform Sep 14, 2026
718e640
[pi] 全绿(24 个 test binary 全 ok;`coding_agent` 那条是已知时序 fl...
aeoform Sep 14, 2026
a6110c9
[pi] 快捷键与选区做完了,全量验证通过。
aeoform Sep 14, 2026
7e44b1d
[pi] 三个浮窗按 Tauri 重做完了,旧的臆造实现已整段删除。
aeoform Sep 14, 2026
e10d472
[pi] 四项遗留全部做完,并回答了 Vulkan 的问题。
aeoform Sep 14, 2026
567b09e
[pi] Siri 光效 GPU 化(GLSL 移植)+ 圆角矩形扫光着色器,接胶囊与思考态;Vulkan 结论附证据
aeoform Sep 14, 2026
bb654d2
[pi] 实现完成,验证全绿并打好包。
aeoform Sep 14, 2026
a18a80f
[pi] Work in progress
aeoform Sep 15, 2026
778b5f4
[pi] Work in progress
aeoform Sep 15, 2026
378c726
[pi] **任务 1(胶囊 wlr-layer-shell 主路径)完成并出包。**
aeoform Sep 15, 2026
983fd62
[pi] 任务 2 完成。**开工时先核对了前任的产物,结果发现任务 1 其实从未真正生效**——两个阻塞性 ...
aeoform Sep 15, 2026
114bec8
[pi] 三个问题里属于我这个工单的(③ 吞键、④ 选区助手)已经修完并出包。**其中「吞键」我现在就把你机器...
aeoform Sep 15, 2026
a5a016a
[pi] 任务2:静音失败归一化 + 胶囊终态自动收起
aeoform Sep 15, 2026
857341d
[pi] 修复热键:修饰键触发不再吞键、Shift+符号键匹配(Ctrl+Shift+;),插件更新后自动重启 fcitx5
aeoform Sep 15, 2026
7fce1fb
[pi] 任务2:报错路径胶囊收回(Core reset 时序 + 宿主兜底 + 宿主断开自退场)
aeoform Sep 15, 2026
eae372b
[pi] Work in progress
aeoform Sep 15, 2026
fd91463
[pi] 执行完了。取证结论很明确,而且**deb 打包没问题**。
aeoform Sep 15, 2026
0f59c27
[pi] Work in progress
aeoform Sep 15, 2026
a0104ba
[pi] 修复:启动不再被插件探测/重载阻塞(主窗口必现)+ /usr/local 手工残留不再冒充随包插件 + 指纹持久化(消除每次启动…
aeoform Sep 15, 2026
67843ad
fix(linux-egui): 胶囊去掉自造外圈扫光(Tauri 经典药丸只有 1px 中性描边)+ 风格包草稿行不再误改已有行 + 打…
aeoform Sep 15, 2026
5358d04
fix(linux-egui): Ctrl+Shift+; 热键被 CapsLock 状态位吃掉——插件按 fcitx 的 normali…
aeoform Sep 15, 2026
500859e
fix(linux-egui): fcitx5 缺席/插件过旧不再拖死后端——启动链对 fcitx5 失败改为警告降级(heatkey l…
aeoform Sep 16, 2026
e731f93
ci(release): 共用一条跨平台发布流水线(-tauri/-egui 按后缀分流)+ 末端聚合 zip
Sep 16, 2026
30d5f3c
fix(linux-egui): 关闭键改为退回托盘(不退出进程)+ 托盘唤起按 最小化恢复→显示→聚焦 回任务栏;QA 热键主键被输入法…
aeoform Sep 16, 2026
3242999
ci(release): Linux egui 发布 job 换到 ubuntu-24.04(与 ci.yml 同因)
Sep 16, 2026
3d1221b
ci(release): 单一 -egui tag 触发同一 run 内四平台并发(macOS arm64/x64 + Windows +…
Sep 16, 2026
9a8d6cb
fix(linux-egui): 关闭键真正隐藏(Wayland 塌缩 1x1,不能 unmap/最小化)+ 事件泵用真线程保活 + Ct…
aeoform Sep 16, 2026
96824e9
ci(release): 四平台真正并发——egui job 去掉 needs: build,Linux 资产的 release 写入交给…
Sep 16, 2026
cf18715
ci(release): 聚合 zip 只装 Linux 平台产物(用户口径:all 指 Linux 各产物)
Sep 17, 2026
8a76c32
fix(linux-egui): 最小化键改为退回托盘(Wayland 无法取消最小化,最小化的窗口会永久停掉 egui 重绘循环 → 热…
aeoform Sep 17, 2026
d477c5e
fix(linux-egui): 发布门禁单测不再依赖宿主是否装了 deb
aeoform Sep 17, 2026
4fb6816
fix(linux-egui): 删除自动改写输入法配置的逻辑,并用契约测试锁死
aeoform Sep 17, 2026
02f2935
Merge origin/beta into feat/linux-egui-tauri-parity
aeoform Sep 17, 2026
d77cf86
[pi] Work in progress
aeoform Sep 17, 2026
b5b6b7d
fix(linux-egui): 恢复被清理删掉的 provider/凭据编辑能力,发布门禁不再被拦
aeoform Sep 17, 2026
56957f2
ci(release): 聚合 zip 改成「手动安装」散装包(不再装 deb/rpm)+ 附 install.sh
aeoform Sep 17, 2026
ede7a79
ci(release): Linux 腿内联成平级 job(不再折叠)+ deb/rpm 与 manual zip 合并到一个 job +…
aeoform Sep 17, 2026
5fd40ab
ci(release): 统一发布语义——任何 v* 标签都出全平台(Tauri 三平台 + Linux egui + 安卓)
aeoform Sep 17, 2026
cd0f659
feat(linux-egui): 关窗后切到无窗口宿主(窗口进程真退出)+ 事件泵不再依赖窗口绘制
aeoform Sep 17, 2026
927d959
feat(linux-egui): 常驻无窗口宿主 + 独立 UI 窗口进程(真实时 IPC,关窗不再重开后端)
aeoform Sep 18, 2026
57010ea
feat(linux-egui): 设置页排版对齐 Tauri(行=200px 标签列+1fr 控件列/左对齐、卡片与分区标题 14px)…
aeoform Sep 18, 2026
e863394
feat(linux-egui): 补齐设置页剩余排版对齐(行标签 500 字重 / 输入框 32·13.5 / 分段选中片阴影 / 无热…
aeoform Sep 18, 2026
337aeed
feat(linux-egui): 在 Linux 实现 Less Computer 浮窗(420×540 / 常驻宿主唯一所有者 / 事…
aeoform Sep 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
129 changes: 129 additions & 0 deletions .agents/run-parity-agents.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
// One-off orchestration script for the Linux egui 2.0 parity rewrites.
// Loaded by the pi-subagents workflow sandbox via workflowScriptPath.

const rules = [
'# 项目背景',
'仓库:/opt/openless-src/openless-all/app (Rust + egui 0.33 + eframe)。',
'Linux 端 UI 正在从旧版 egui 迁到与 Tauri 版一致的设计。**唯一设计来源是 Tauri/React 源码**:src/pages/*.tsx、src/pages/settings/*.tsx(含中文文案与 i18n key)。',
'',
'# egui 前端架构(务必先读这些文件当范式)',
'- linux-egui/src/ui/frontend/ 一个页面一个模块,mod.rs 里 render() 路由。',
'- 页面是**纯渲染**:只读 FrontendViewModel,点击时往 actions: &mut Vec<FrontendAction> push 意图,由 main.rs 的 apply_frontend_actions 处理。不要在页面里改业务状态(输入框本地缓冲除外)。',
'- 先读 overview.rs 与 history.rs,照它们的风格写:显式 rect + painter + layout:: 共享控件。',
'- 共享控件在 ui/frontend/layout.rs:page_header / card / paint_card / section_title / segmented / segmented_width / action_button(ButtonKind) / toggle / pill_size / paint_pill(PillTone) / text_width / text_galley / fixed_ui / card_salt / soft_separator / unsupported_page。',
'- 颜色与圆角用 ui/theme.rs:SURFACE SURFACE_2 CANVAS LINE INK INK_2 INK_3 INK_4 BLUE BLUE_SOFT OK。卡片圆角 14,内边距 18~20,行高 32~36。',
'',
'# 硬性规则',
'1. **禁止写死任何用户可见的中文或其它语言字符串**。一律 tr_l10n(lang, "key") / fmt_l10n(lang, "key", &[&arg])(来自 openless_linux_egui)。key 用 snake_case,尽量对应 Tauri 的 camelCase key(Tauri vocab.searchPlaceholder 对应 vocab.search_placeholder),这样我能用脚本从 src/i18n/*.ts 自动补齐 5 种语言。',
'2. **不要修改 linux-egui/src/i18n.rs**,不要运行 scripts/sync-egui-i18n.mjs(我统一做)。',
'3. **只改任务里列出的文件**(多个代理并行,改别人的文件会冲突)。',
'4. tests/localization_contract.rs 禁止新增裸中文字面量(注释可以,字符串不行)。',
'5. 编译测试用共享 target 省时间:所有 cargo 命令前加环境变量 CARGO_TARGET_DIR=/data-win/openless-cache/app-target 。',
'6. 完成前必须跑:cargo fmt,然后 CARGO_TARGET_DIR=... cargo test --bin openless-linux-egui(要求全绿)。',
'7. 结论必须包含:① 改了哪些文件 ② 引用到的、Tauri 目录里可能不存在的 i18n key(我手工补译文)③ 需要但 VM 里缺失的字段或动作(不要自己乱加,列出来)④ 测试结果。',
'',
].join('\n');

const settingsTask = rules + [
'# 你的任务:重写设置弹窗的内容',
'改动文件(只能改这三个):',
'- linux-egui/src/ui/frontend/settings.rs',
'- linux-egui/src/ui/frontend/view_model.rs (只加设置相关的字段和动作)',
'- linux-egui/src/main.rs (只加这些动作的处理,以及把 Core 数据塞进 VM)',
'',
'现状:弹窗左栏我已经改成 Tauri 的样子(顶部搜索框 查找设置分类…、7 个分区顺序 录音与输入 / 快捷键与选区 / AI 服务与模型 / 外观与语言 / 权限与数据 / 实验与扩展 / 关于与更新、底部 帮助中心 和 发布日志、内容区右上 修改后自动保存 加 ×)。**左栏保留,别推倒重来。**',
'',
'要做的是**每个分区的内容卡片对齐 Tauri 的 settings 页面**(读 src/pages/settings/tabs.tsx 看每个 tab 由哪些 Section 组成,再读对应 Section.tsx 的卡片标题、描述、行):',
'1. 录音与输入 = RecordingInputSection + RemoteInputSection',
'2. 快捷键与选区 = ShortcutsSection + SelectionWorkspaceSection',
'3. AI 服务与模型 = ServicesTab(语言模型 / 语音识别 / 本地模型 / 连接与扩展 子标签 + 渠道列表 + + 添加渠道;渠道行显示 名称 + 当前使用标记 + model + 上次验证 + 验证 / 启用开关 / 编辑)',
'4. 外观与语言 = ThemeSection + LanguageSection',
'5. 权限与数据 = PermissionsSection + DataStorageSection',
'6. 实验与扩展 = 多模态管线 / 流式输入 / Less Computer / Claude 控制台 / Beta 渠道 / 调试工具',
'7. 关于与更新 = AboutSection + AutoUpdateSection',
'',
'优先级(时间不够按此顺序保):',
'(a) 先把 7 个分区的卡片标题、描述、行标签全部按 Tauri 文案对齐,每行都接真实 prefs 读写;',
'(b) 再做 AI 服务与模型的渠道列表:main.rs 里旧的 shell UI 已有完整的 Core 渠道面板接线(搜 provider_management_ui / ProviderPanel / load_provider_panel / list_channels / ChannelSummary / ProviderDescriptor),把它复用到 VM 和弹窗里(列表 + 启用开关 + 验证 + 打开编辑框可简化为最小可用版本),+ 添加渠道 至少能创建或打开编辑器;',
'(c) 做完再加主题行、自动更新渠道等。',
'',
'可用的 Core Preferences 字段(openless_core::shared_types::Preferences,已在 main.rs 的 self.preferences 里):',
'launch_at_login, mute_during_recording, audio_cue_on_record, silence_auto_stop_enabled, microphone_device_name, multimodal_pipeline_enabled, use_system_proxy, remote_input_enabled/port/default_mode, history_retention_days, streaming_insert, streaming_insert_save_clipboard, auto_update_check, record_audio_for_debug, translation_target_language, theme_mode, locale。',
'参考已存在的 VM:view_model.rs 里的 SettingsFields / SettingsField / SettingsComboField / SettingsTextField / SettingsActionField。',
'',
'设置弹窗渲染在 settings.rs 的 settings_overlay()(Backdrop + Tooltip 层 + rail + panel)。panel() 已把 section 分发到 general/shortcuts/appearance/services/privacy/advanced/about 七个函数。',
].join('\n');

const styleTask = rules + [
'# 你的任务:重写 润色模式 页,并微调 划词追问 版式',
'改动文件(只能改这四个):',
'- 新建 linux-egui/src/ui/frontend/style.rs (新的风格页)',
'- linux-egui/src/ui/frontend/mod.rs (加 pub mod style; 并把 Page::Style 路由到 style::page)',
'- linux-egui/src/ui/frontend/pages.rs (删掉 style_page / style_pack_card / new_style_pack_card / style_editor_overlay / StyleCardAction;correction_chip 保留别动)',
'- linux-egui/src/ui/frontend/selection_ask.rs (版式对齐)',
'',
'## 1) 风格页(主要工作)',
'照 src/pages/Style.tsx 移植到 style.rs。已知参考画面(我截图看过 Tauri 版):',
'- 头部:kicker 风格 + 标题 输出风格 + 描述 选择录音的默认输出风格。,右上 [刷新] [导入 ZIP](导入是蓝色主按钮)',
'- 主卡片顶部:标题 风格包 + 左侧一个 原文 小 tab(选中态蓝色),右侧一个**分段按钮组**:录音 / ASR 风格 与 选区润色(选中项蓝底白字),最右一个 N 个风格包 的灰色小徽标',
'- 风格包网格(每行 3 张卡):卡内 = 名称 + [内置] + [当前] 徽标 + 描述 + 一个模式 pill(原文 / 轻度润色 等)+ 底部三个按钮 [激活] [导出 ZIP] [编辑]',
'- **已知 BUG 必须修**:现在会有两张卡同时是激活态(淡蓝底)。激活只应由 当前默认风格 决定(VM 的 StylePack.is_active 与 style_selected,注意 style_selected == usize::MAX 表示 原文 那一项),悬停才用 hover 底色;两者不要混。',
'- 末尾一张 新建风格包 虚线卡(含 从模板开始创建自己的风格)',
'- 编辑弹窗(风格包编辑器):标题、风格描述输入、提示词多行、[保存] [恢复默认] [取消]',
'- 已有 i18n key:style.kicker / style.title / style.desc / nav.styles / style.pack.selection_tab / style.pack.dictation_tab / style.pack.current / style.pack.builtin / style.pack_count / style.new_pack_hint / style.pack.dictation_prompt_title / style.pack.new_description / style.custom_prompt_save / btn.new_style / btn.import_zip / btn.export_zip / btn.activate / btn.edit / btn.reset_builtin / head.style_pack_editor / lbl.description / lbl.style_note / overview.mode_raw / overview.mode_light / overview.mode_structured / overview.mode_formal / common.refresh / common.cancel / status.style_switched',
'可用的 VM:style_packs: Vec<StylePack{name,description,tags,accent,is_builtin,is_active}>、style_selected: usize、style_selection_workflow: bool、style_editor_open: bool、style_prompt: String、style_notice: Option<String>、style_unsupported: bool',
'可用动作:StyleActivate(usize)、StyleExport(usize)、StyleEdit(usize)、StyleSaveEditor(String)、StyleCloseEditor、StyleNewPack、StyleImport、Navigate(Page::)',
'',
'## 2) 划词追问版式(小改)',
'照 src/pages/SelectionAsk.tsx 加我截的 Tauri 画面:',
'- 头部右侧:先一个 已保存 小 toast(可只在有 notice 时显示),下面一行右对齐的 [快捷键设置] 按钮',
'- 使用方法 **不是卡片**,是一段普通区块:标题 使用方法 + 三列(01 打开追问浮窗 / 02 选中想了解的内容 / 03 开口说出问题),每列标题加描述,快捷键用内联 kbd 小胶囊显示(VM 的 qa_hotkey / dictation_hotkey)',
'- 下面一行:左侧 [刷新图标] 继续使用录音快捷键,即可多轮追问。,右侧 Esc 胶囊 加 关闭浮窗,结束本次对话',
'- 再下面才是 保存历史 卡片:左侧时钟图标 + 标题 保存历史 + 描述 开启后在本地保存问答记录,默认关闭。,右侧开关',
'现有 key:selection_ask.title/desc/shortcut_settings/howto_title/guide_open_title/guide_open_desc/guide_unset_desc/guide_select_title/howto_step2/guide_ask_title/guide_ask_desc/guide_followup/guide_dismiss/history_title/history_desc',
].join('\n');

const pagesTask = rules + [
'# 你的任务:对齐 词典 与 翻译 页版式',
'改动文件(只能改这两个):',
'- linux-egui/src/ui/frontend/vocab.rs',
'- linux-egui/src/ui/frontend/translation.rs',
'',
'## 1) 词典(照 src/pages/Vocab.tsx 加我截的 Tauri 画面)',
'必须有的元素:',
'- 头部:kicker 词典 + 标题 词典 + 描述 添加生词或专业术语,提高识别准确率。,右上**黑色主按钮** + 新词(点击聚焦到输入框)',
'- 一张大卡片内:',
' - 一行:左边**带图标的标签页** 所有 / 自动添加(铅笔图标)/ 手动添加(选中项浅灰底加深色文字,不是蓝色分段);右边一个 选择当前结果 勾选框 加 一个**圆形放大镜按钮**(点击展开或聚焦搜索输入框)',
' - 空态文案(居中):还没有词条。在上面输入一个生词或专业术语,让模型在听写时优先匹配。',
' - 底部一行:输入框 输入词语,按 Enter 或点添加… 加 黑色 + 添加 按钮',
' - 输入框下方灰色小字:支持中英混合 · 数字开头按字面识别 · 命中次数自动计数',
'- 词条 pills(可换行):词 + 命中数小徽标 + 点击启停 + × 删除;上方有 自动收集(N)分组 加 全部删除',
'- 下方一张 场景预设 卡片(可折叠标题 + 描述 + 预设 pills + 新建预设 + 编辑/保存)',
'现有 VM:vocab_entries: Vec<VocabEntry{phrase,hits,enabled,learned}>、vocab_filter: usize(0/1/2)、vocab_query、vocab_input、vocab_selected_presets、vocab_editing_preset、vocab_saved_presets、vocab_preset_name/phrases、vocab_error、vocab_unsupported',
'现有动作:VocabAddPhrase(String)、VocabRemovePhrase(usize)、VocabTogglePhrase(usize)、VocabFilter(usize)、VocabSearch(String)、VocabApplyPreset(usize)、VocabCreatePreset{name,phrases}',
'现有 key:vocab.kicker/title/desc/new_word/placeholder/tip/empty/search_placeholder/search_empty/filter_all/filter_auto/filter_manual/learned_section/remove_all_learned/section_title/presets_title/presets_tip/presets_create/presets_apply/presets_save/presets_edit/presets_new_preset/presets_name_placeholder/presets_words_placeholder/presets_dev_tools/presets_products/presets_terms/presets_english、btn.add、common.cancel',
'选择当前结果的 key 可能是 vocab.select_all_visible,新词 是 vocab.new_word。',
'',
'## 2) 翻译(照 src/pages/Translation.tsx 加我截的 Tauri 画面)',
'必须有的元素:',
'- 头部:kicker 翻译 + 标题 翻译 + 描述 录音后自动翻译为目标语言再插入。',
'- 顶部一行:左 搜索语言… 输入框(宽) 加 右 已选择 N 种语言',
'- 两栏(宽屏并排、窄屏堆叠):',
' - 左卡 工作语言 加 描述 勾选日常使用的语言,影响润色与翻译效果。,里面是**两列网格**的语言行:每行左=粗体语言名 加 下面灰色母语小字(如 阿拉伯语 加 العربية),右=方形勾选框(选中黑色打勾);没有匹配时显示 没有匹配的语言;卡片底部灰色小字 语音服务支持的语种可能不同;翻译目标不受界面语言限制。',
' - 右卡 翻译目标语言 加 描述 加 右上 未启用/已启用 徽标;下面一个下拉 不启用(Shift 按下不触发翻译);分隔线;翻译风格 加 描述 自动继承「风格」页当前激活的风格包。 加 右侧蓝色小胶囊显示当前风格名;若目标语言与唯一工作语言相同,显示琥珀色告警条。',
'- 下方整宽卡 使用方法:编号 1~5 的步骤**排成 4 列流式**(不是一行一个),然后两条小注(翻译模式指示 / 安全兜底)。',
'现有 VM:translation_working_languages: Vec<String>、translation_target_language、translation_query、style_packs 与 style_selected、dictation_hotkey、translation_hotkey、translation_unsupported',
'现有动作:TranslationToggleLanguage(String)、TranslationSetTarget(String)',
'现有 key:translation.kicker/title/desc/search_languages/selected_languages/no_matching_languages/language_support_hint/working_title/working_desc/target_title/target_desc/target_disabled/target_same_as_working/status_enabled/status_disabled/style_title/style_desc/howto_title/howto_step1 到 howto_step5/howto_indicator_title/howto_indicator_desc/howto_fallback_title/howto_fallback_desc、overview.mode_raw/overview.mode_light',
'语言列表目前是 translation.rs 里的 const SUPPORTED_LANGUAGES(15 个母语名),可以保留。',
].join('\n');

const results = await runs.all([
{ key: 'settings', agent: 'worker', task: settingsTask },
{ key: 'style', agent: 'worker', task: styleTask },
{ key: 'pages', agent: 'worker', task: pagesTask },
]);

return results.map(function (run) {
return { key: run.key, runId: run.runId, status: run.status, output: run.output };
});
34 changes: 21 additions & 13 deletions .github/workflows/android-apk.yml
Original file line number Diff line number Diff line change
@@ -1,19 +1,26 @@
name: Android APK (debug)

# Triggers:
# - push v*-tauri tag → signed release APK + minisign + updater manifest → GitHub Release
# - workflow_dispatch → signed release APK when ANDROID_KEYSTORE_* secrets exist
# (overlay install + user data preserved); otherwise unsigned debug APK (annotated, non-blocking)
# 统一发布语义(与 release-tauri.yml 一致):任何发布标签 `v*` 都出全平台产物,
# `-tauri` / `-egui` 只是**命名约定**,不再是「只构建哪一半」的开关。
# - push v* tag → 签名 release APK + minisign + updater manifest → GitHub Release
# (安卓是独立 workflow,所以它与 Tauri/Linux 那次 run 并行,但资产落在**同一个
# release** 上:release-tauri.yml 里没有 android job,也不必往里塞一套 JDK/Gradle。)
# - workflow_dispatch → 有 ANDROID_KEYSTORE_* 就出签名 release APK(覆盖安装、保数据);
# 否则出未签名 debug APK(annotated,非阻塞)—— 该 fallback 语义保持不变。
#
# 为什么要 Android 单独一条 workflow 而不是 matrix 里的一腿:它用的是另一套工具链
# (JDK + Android SDK + Gradle),塞进 Tauri 的 matrix 会让每一步都长满 `if:` 分支。
#
# Scope: full overlay/accessibility APK for ADB testing and tag releases.

on:
push:
tags:
- 'v*-tauri'
- 'v*'
workflow_dispatch:

# 同一 tag 重复推送只跑最新一次;workflow_dispatch 用 run_id 隔离避免互相取消。
# 这条 group 带 workflow 名,所以不会和 release-tauri.yml 的 run 互相取消。
concurrency:
group: ${{ github.workflow }}-${{ github.event_name == 'workflow_dispatch' && github.run_id || github.ref }}
cancel-in-progress: ${{ github.event_name == 'push' }}
Expand All @@ -27,9 +34,9 @@ jobs:
CI: true
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
OPENLESS_RELEASE_CHANNEL: ${{ (endsWith(github.ref_name, '-beta-tauri') || contains(github.ref_name, '-Beta.')) && 'beta' || 'stable' }}
OPENLESS_RELEASE_CHANNEL: ${{ (endsWith(github.ref_name, '-beta-tauri') || endsWith(github.ref_name, '-beta-egui') || contains(github.ref_name, '-Beta.')) && 'beta' || 'stable' }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
# Android 不使用本地 Qwen3/Whisper C 子模块。
submodules: false
Expand All @@ -48,8 +55,9 @@ jobs:
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
run: |
set -euo pipefail
# 任意发布标签都算 tag release(统一语义):不再要求 -tauri 后缀。
is_tag=false
if [[ "${{ github.ref }}" == refs/tags/v* ]] && [[ "${{ github.ref_name }}" == *-tauri ]]; then
if [[ "${{ github.ref }}" == refs/tags/v* ]]; then
is_tag=true
fi
echo "is_tag_release=$is_tag" >> "$GITHUB_OUTPUT"
Expand Down Expand Up @@ -144,7 +152,7 @@ jobs:
exit "$sdkmanager_exit"
fi

- uses: actions/setup-node@v4
- uses: actions/setup-node@v7
with:
node-version: "22"
cache: npm
Expand Down Expand Up @@ -377,28 +385,28 @@ jobs:
echo "EOF" >> "$GITHUB_OUTPUT"

- name: Upload Android APK artifact (arm64-v8a)
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: ${{ steps.mode.outputs.mode == 'release' && 'openless-android-release-arm64-v8a' || 'openless-android-debug-arm64-v8a' }}
path: ${{ steps.apk.outputs.arm64_v8a_path }}
if-no-files-found: error

- name: Upload Android APK artifact (armeabi-v7a)
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: ${{ steps.mode.outputs.mode == 'release' && 'openless-android-release-armeabi-v7a' || 'openless-android-debug-armeabi-v7a' }}
path: ${{ steps.apk.outputs.armeabi_v7a_path }}
if-no-files-found: error

- name: Upload Android APK artifact (x86)
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: ${{ steps.mode.outputs.mode == 'release' && 'openless-android-release-x86' || 'openless-android-debug-x86' }}
path: ${{ steps.apk.outputs.x86_path }}
if-no-files-found: error

- name: Upload Android APK artifact (x86_64)
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: ${{ steps.mode.outputs.mode == 'release' && 'openless-android-release-x86_64' || 'openless-android-debug-x86_64' }}
path: ${{ steps.apk.outputs.x86_64_path }}
Expand Down
Loading