Skip to content

Releases

空谷 Ondra v1.3.0-alpha(内测版)

Choose a tag to compare

@github-actions github-actions released this 14 Nov 13:19

下载 1.3.0-alpha

平台 安装包 大小
macOS(Apple Silicon) Ondra-1.3.0-alpha-macos-arm64.dmg 56.0 MB
Windows(x64) Ondra-1.3.0-alpha-windows-x64-setup.exe 33.2 MB
Android(arm64) Ondra-1.3.0-alpha-android-arm64.apk 14.8 MB

内测版:版本号末尾的 -alpha 就是标记。不是公测版,也不是正式版。

首次打开会被系统拦下

三个包都没有正式签名(macOS 是链接器 ad-hoc 签名,Windows 没有代码签名证书,Android 是 debug 签名)。

  • macOS:右键点应用 →「打开」;或执行
    xattr -dr com.apple.quarantine "/Applications/空谷 Ondra.app"
  • Windows:SmartScreen 提示时点「更多信息」→「仍要运行」
  • Android:系统会提示「未知来源」。允许浏览器/文件管理器安装即可;
    这个包只支持 arm64(近几年的手机都是),老设备装不上是正常的。

装完之后

桌面端首次启动会拉起本机的插件宿主与内核,自带 Node 运行时,不需要另装。
安卓端不跑 Node:记忆与情绪在 WebView 里用 IndexedDB 直接算,
推理直连你在设置里填的接口,所以 APK 只有几十 MB,也不需要额外依赖。
数据全部留在本机,无账号、无遥测。推理来源在设置里三选一:在线接口 / 本地大模型 / 免费模型。


1.3.0-alpha · 安卓端接入插件系统(2026-11-14)

这一版把 75 个真插件装进了安卓 WebView。此前手机端是「手工复刻」路线,这次彻底换掉了。

复刻路线为什么必须放弃

src/lib/local/ 里原来手工重写了情绪与记忆的纯函数(emotionPad.ts、memoryStability.ts,逐字从插件源码抄来),扩展抽屉里硬编码返回 totals: { all: 0 }——用户看到的是「0 个包」。

根本缺陷是第二份真源:能抄的只有无状态纯函数,记忆链、人设链、提示词装配那些有状态的插件抄不过来;而抄过来的部分一旦桌面端改了算法、手机端不跟,同一句话在两个平台会算出不同的情绪值。

把插件本体打包进前端

验证过 cordis 是纯 ESM、零 Node 依赖,在 WebView 里能直接创建 Context 并 apply 插件。剩下唯一的问题是 30 个插件 import 了 node:*。

src/lib/browser/ 下新增 9 个替身:

模块 实现
fs 内存镜像 + IndexedDB 异步落盘,同步 API 全部可用(插件的「写临时文件 → rename」原子写模式原样成立)
path / os / url / module POSIX 语义,homedir() 返回虚拟根 /
crypto 自带 SHA-256 与 MD5(约 250 行),randomUUID 走 WebCrypto
zlib 自带 raw-deflate 解码器(约 250 行),人设包解压依赖它
process 在 main.tsx 第一个 import 注入——ESM 求值顺序决定了写在模块体里已经太晚
sqlite 故意加载失败,让 ondra-store-sqlite 走它自己的降级链

vite.config.ts 用正则别名(不是字符串——字符串前缀匹配会把 node:fs/promises 吃成 node:fs)把 node:* 与 75 个插件包接到源码位置,只在 ONDRA_LOCAL=1 时生效。

三个关键设计决定

sqlite 不实现,让它失败。 在 IndexedDB 上模拟 SQL 必然有语义缺口,而缺口会以「某类查询静默返回错数据」的形式出现。插件从设计之初就写了 loadSqliteModule() 失败时 return 且不注册服务的路径,下游用 ctx.get('ondra-store-sqlite') ?? ctx.get('ondra-store-memory') 取端口,自然落到 json / memory 版。一行插件代码都不用改。

插件模块改成动态 import。 静态 import 会让桌面端前端从 490 KB 涨到 1955 KB——全是它永远不会执行的插件代码。改成 import() 后切成独立 chunk(plugins-*.js 1471 KB),桌面端永远不会请求它。

复刻版保留但降级为兜底。 插件取不到服务时才走它,一致性由 check-local-parity 逐行比对(130 + 249 行)守着。

实测结果

  • 75/76 个插件在安卓 WebView 里装载成功(pnpm check:mobile-plugins)
  • 扩展抽屉显示「75 个包 / 75 个在跑」
  • 情绪由 ondra-emotion-core 计算:mood 0.5、energy 60、tension 0(基线正确)
  • 6 个配置文件落进 IndexedDB,刷新后仍在
  • 唯一装不上的需要 node:net 起端口探测,WebView 里没有对应物

顺带修的单位错位

companionView() 原读插件的 axes.energy(0–100),而界面按 0–1 画滑杆,60 被钳到满格显示成「精力 1.00」。改用 normalized(插件已做过除法),与桌面端 GET /api/companion/state 同源。

CI 三端全挂的修复

打 tag 后三端全部失败,报同一处:

lib/local/plugins.ts(44,35): error TS2307: Cannot find module
  '@ondra/cordis-plugin-ondra-core' or its corresponding type declarations.

本地能过、CI 全红,是两个独立的顺序问题叠在一起。

一、前端 tsc 不该依赖插件的编译产物。 tsconfig.paths 原来指向真包,tsc 要读它的 lib/index.d.ts——而 CI 的 build:web 跑在 build:plugins 之前,那时 lib/ 不存在。本地能过是因为之前构建残留了那些文件。

→ 新增 src/lib/local/ondra-core.d.ts(手写的、与插件接口对齐的存根),tsconfig.paths 指向它。实现仍由 Vite 的 pluginAliases 指向真包,两边互不依赖。存根只声明真实用到的三个成员,不是 any——插件接口改名时这里要跟着改,那是故意的摩擦。

二、桌面端不该把插件打进产物。 host.ts 里 type PluginRuntimeModule = typeof import('./plugins.ts') 看着是类型位置,但对打包器来说是一次真实的模块解析请求。改成手写接口后,桌面端构建又报 MISSING_EXPORT: loadCore:Vite 在非 localMode 时没有插件别名,退回 tsconfig.paths 的存根,而存根只有类型没有实现。

→ loadPluginModule() 加构建期守卫 if (!__ONDRA_LOCAL_MODE__)。那是 define 注入的字面量,桌面端构建时是 false,整个分支(含 import())被摇掉。

三、安卓 job 缺一步「编译插件」。 build:mobile 单独跑,那时插件的 lib/ 同样不存在。→ release.yml 的 android job 加「编译插件」步骤,放在 build:mobile 之前。

验证

模拟 CI 干净态(删掉全部 154 个插件产物)后依次跑:

  1. src 的 tsc --noEmit → exit 0(存根生效)
  2. pnpm run build:plugins → 75 个包全部 Done
  3. vite build → 492 KB,无插件
  4. ONDRA_LOCAL=1 vite build → 493 KB + plugins 1471 KB
  5. check:mobile-plugins → 15/15

check-mobile-plugins 15/15、check-mobile-drawer 126/126、check-vfs 10/10、check-ui 432/432、check-acceptance 97/97、check-contrast 67/67、check-local-parity 全过、两端 tsc 全过。

反向验证:注释掉 installProcess() → 插件全部装载失败(0 个包、0 个文件),精确报红 4 条;还原后 15/15 转绿。

空谷 Ondra v1.2.1-alpha(内测版)

Choose a tag to compare

@github-actions github-actions released this 14 Nov 11:44

下载 1.2.1-alpha

平台 安装包 大小
macOS(Apple Silicon) Ondra-1.2.1-alpha-macos-arm64.dmg 56.0 MB
Android(arm64) Ondra-1.2.1-alpha-android-arm64.apk 14.4 MB
Windows(x64) Ondra-1.2.1-alpha-windows-x64-setup.exe 33.2 MB

内测版:版本号末尾的 -alpha 就是标记。不是公测版,也不是正式版。

首次打开会被系统拦下

三个包都没有正式签名(macOS 是链接器 ad-hoc 签名,Windows 没有代码签名证书,Android 是 debug 签名)。

  • macOS:右键点应用 →「打开」;或执行
    xattr -dr com.apple.quarantine "/Applications/空谷 Ondra.app"
  • Windows:SmartScreen 提示时点「更多信息」→「仍要运行」
  • Android:系统会提示「未知来源」。允许浏览器/文件管理器安装即可;
    这个包只支持 arm64(近几年的手机都是),老设备装不上是正常的。

装完之后

桌面端首次启动会拉起本机的插件宿主与内核,自带 Node 运行时,不需要另装。
安卓端不跑 Node:记忆与情绪在 WebView 里用 IndexedDB 直接算,
推理直连你在设置里填的接口,所以 APK 只有几十 MB,也不需要额外依赖。
数据全部留在本机,无账号、无遥测。推理来源在设置里三选一:在线接口 / 本地大模型 / 免费模型。


1.2.1-alpha · 测试资产入库(2026-11-14)

新增两个测试脚本

tools/check-flows.mjs(80 条)。仓库原有 45 个脚本没有一个是从用户点下去开始的,它们各验一层(渲染 / 插件 / 算法 / HTTP)。于是「点开入口一片空白」「改了设置没生效」这类缺陷全在视野之外——每个脚本都绿,用户用不了。

这个脚本补的就是那一段:起真宿主(78 插件 / 66 段 / 629 字段全量装配),用真实点击一路验到后端请求体。

tools/check-stability.mjs(13 条)。连续 5 轮验证记忆累积、情绪收敛、提示词增长不越界。实测情绪 pleasure 0.50 → 0.56 → 0.62 → 0.68 → 0.74,每轮 +0.06 正是「单条位移上限 0.12 × 意图值 0.5」;记忆保持 1 条(重复事实被判重正确合并,不膨胀)。

补上的关键盲区

原先的设置持久化只验「直接 fetch 接口」——把 saveSetting() 里的请求删掉,测试仍然全绿。那验的是接口不是界面。

新增「界面操作真的写到了后端」:真实点分段控件 → saveSetting() → 后端。反向验证:破坏 saveSetting 后精确报红「后端 user 层没变(写入没发出去)」。

澄清六个「像缺陷但不是」

  1. 扩展抽屉的 undefined 是插件说明里的正常中文。
  2. 情绪 mood 恒 0.50:gratitude 位移表只动 pleasure / arousal / energy,不含 mood。
  3. 记忆恒 1 条:判重把重复事实判为「复述」,这是不膨胀的正确行为。
  4. 宽屏抽屉页签不可见:设计如此(左脊已有入口)。
  5. 取消键叫「返回修改」:语义更准。
  6. 设置打开时左脊可点但被拦截:待产品确认。

文档

新增 docs/TEST-REPORT-1.2.0.md 结构化报告(覆盖范围、结论、异常、复现、影响、优先级、修复方向)。

空谷 Ondra v1.2.0-alpha(内测版)

Choose a tag to compare

@github-actions github-actions released this 14 Nov 09:43

下载 1.2.0-alpha

平台 安装包 大小
macOS(Apple Silicon) Ondra-1.2.0-alpha-macos-arm64.dmg 56.0 MB
Android(arm64) Ondra-1.2.0-alpha-android-arm64.apk 14.4 MB
Windows(x64) Ondra-1.2.0-alpha-windows-x64-setup.exe 33.2 MB

内测版:版本号末尾的 -alpha 就是标记。不是公测版,也不是正式版。

首次打开会被系统拦下

三个包都没有正式签名(macOS 是链接器 ad-hoc 签名,Windows 没有代码签名证书,Android 是 debug 签名)。

  • macOS:右键点应用 →「打开」;或执行
    xattr -dr com.apple.quarantine "/Applications/空谷 Ondra.app"
  • Windows:SmartScreen 提示时点「更多信息」→「仍要运行」
  • Android:系统会提示「未知来源」。允许浏览器/文件管理器安装即可;
    这个包只支持 arm64(近几年的手机都是),老设备装不上是正常的。

装完之后

桌面端首次启动会拉起本机的插件宿主与内核,自带 Node 运行时,不需要另装。
安卓端不跑 Node:记忆与情绪在 WebView 里用 IndexedDB 直接算,
推理直连你在设置里填的接口,所以 APK 只有几十 MB,也不需要额外依赖。
数据全部留在本机,无账号、无遥测。推理来源在设置里三选一:在线接口 / 本地大模型 / 免费模型。


1.2.0-alpha · 修 mac Dock 点不开,重排设置页信息密度(2026-11-14)

一、mac Dock 点不开(功能缺陷)

RunEvent 只处理了 Opened 与 ExitRequested,没有 Reopen。而 Tauri 不会自动把窗口 show 出来——Reopen 交给我们,我们什么都不做,窗口就一直收起。

用户看到的是「点了图标,图标跳一下,窗口没出来」,反复点十次也一样。三端里只有 mac 有这个缺陷:Windows / Linux 点任务栏是系统的窗口管理动作,不需要应用参与。

修法:lib.rs 加 #[cfg(target_os = "macos")] RunEvent::Reopen 分支,调 window::reveal()(show → unminimize → set_focus 三件都做,顺带广播 window-visibility 让前端知道她回到前台了)。用 has_visible_windows 判:用户只是切 Space 时不该抢焦点。

二、设置·扩展功能的三层变两层

删掉「原始」层。它是一张 1116 行的只读表,页面自己写着「改值请回模块层」——用户点进去什么都改不了,还得再回去。留着它只有一个效果:让这个入口看起来有三层,而其中一层是死胡同。

修法:删 RawLayer.tsx(无其他引用),TABS 只剩场景 / 模块。断言改成守「它不会回来」:源码不许再出现 RawLayer,页签不许有三项。删掉的东西最容易在合并时被带回来,而带回来时不会有任何测试报错。

三、字段不再折叠,直达

「更多设置 12 项」的折叠头去掉,字段直接铺在卡片下。上一版的理由是「tts 18 项全铺开会撑成长卷」,但这一层存在的意义就是「在这一页把这件事调完」——折起来之后想调语速得先点一次,且那次点击不告诉他里面有什么。长卷用另一套办法控制:高级字段仍被 advancedOnly 挡住。

修法:SectionFields 去掉 useState 与折叠按钮,摘要行改成纯文字(不再是按钮,避免 hover 变色骗人去点)。去掉 body 的上边框——摘要行已经有一条,两条会挤成双线。

四、不显示原始数值,改「恢复默认」

场景项的 5 · 默认 3 · 已改 全部去掉。控制件本身已经显示当前值(滑块填充、开关开合、分段选中),再写一遍是重复;默认值是用户不需要知道、但会拿来比较的内部状态。

修法:改成只在改过时显示一个「恢复默认」按钮,文字级样式(退让动作,不该有和保存同等的重量)。区间项连终点一起恢复,否则会变成「默认起点 + 用户终点」的半恢复状态。

验证

check-ui 432/432(新增 2 条守 raw 层不回来)、acceptance 97/97、contrast 67/67、mobile-drawer 126/126、cargo check 通过。

反向验证:加回 raw 页签 → 精确报红「页签只剩两层」,还原后转绿。

空谷 Ondra v1.1.8-alpha(内测版)

Choose a tag to compare

@github-actions github-actions released this 14 Nov 09:03

下载 1.1.8-alpha

平台 安装包 大小
macOS(Apple Silicon) Ondra-1.1.8-alpha-macos-arm64.dmg 56.0 MB
Android(arm64) Ondra-1.1.8-alpha-android-arm64.apk 14.4 MB
Windows(x64) Ondra-1.1.8-alpha-windows-x64-setup.exe 33.2 MB

内测版:版本号末尾的 -alpha 就是标记。不是公测版,也不是正式版。

首次打开会被系统拦下

三个包都没有正式签名(macOS 是链接器 ad-hoc 签名,Windows 没有代码签名证书,Android 是 debug 签名)。

  • macOS:右键点应用 →「打开」;或执行
    xattr -dr com.apple.quarantine "/Applications/空谷 Ondra.app"
  • Windows:SmartScreen 提示时点「更多信息」→「仍要运行」
  • Android:系统会提示「未知来源」。允许浏览器/文件管理器安装即可;
    这个包只支持 arm64(近几年的手机都是),老设备装不上是正常的。

装完之后

桌面端首次启动会拉起本机的插件宿主与内核,自带 Node 运行时,不需要另装。
安卓端不跑 Node:记忆与情绪在 WebView 里用 IndexedDB 直接算,
推理直连你在设置里填的接口,所以 APK 只有几十 MB,也不需要额外依赖。
数据全部留在本机,无账号、无遥测。推理来源在设置里三选一:在线接口 / 本地大模型 / 免费模型。


1.1.8-alpha · 修手机端白屏,补设置入口(2026-11-14)

白屏的真因

点汉堡后整个 React 树被卸载,DOM 只剩 83 字节——不是「抽屉没内容」,是渲染期抛错导致整棵树崩掉。

链条:

本地实现缺 /api/sessions/:id/stats
  → 分发层兜底返回 {}
  → SessionPanel 的判据是 stats !== undefined(空对象也是真值)
  → 走进「有数据」分支
  → grouped(undefined) 在 undefined.toLocaleString() 上抛 TypeError
  → React 卸载整棵树
  → 白屏、连关闭键都没了、退不回来

两处都修:

  • src/lib/local/host.ts 补 sessionStats(),四个读数与桌面版同口径(轮数 = 用户消息条数、总字数只算 user + assistant 正文、已归档恒 0)。
  • src/components/SessionStats.tsx 加双层守卫:grouped() 挡非数返回「—」,有效性判据从 stats !== undefined 改成「rounds 是有限数」;workspace 用 typeof 判,避免 undefined 直出。

顺带修的三处手机端导航缺陷

  1. 横屏(844×390)没有顶栏。断点只量宽度 819,横屏 844 超过它,切回桌面 TitleBar——而桌面标题栏在安卓上没有任何可用按钮(红绿灯只 mac、菜单键只 win),左上角空着。改成 @media (pointer: coarse) 强制手机形态,触屏横竖都用顶栏。
  2. 手机上打不开设置。唯一入口是左脊底部齿轮,而窄屏 .rail 是 display:none。实测 390 宽下可见按钮只有 9 个,无一能进设置;Cmd+, 能开但手机没键盘。给顶栏加齿轮按钮。
  3. 设置面板被挤剩 222 宽。手机上被 168 竖排导航挤掉大半。改成单列 + 导航横排滚动。规则在触屏块与容器查询块各写一份——横屏手机只命中前者。
  4. 扩展抽屉直出「undefined 个包」。本地返回 totals.total,界面读 totals.all。契约对齐,并给界面加 typeof 兜底。

验证

新增 tools/check-mobile-drawer.mjs:五个尺寸(390×844 / 360×740 / 844×390 / 768×1024 / 320×568)各跑 25 条,共 126 条全过。判据全部量真实 DOM:抽屉矩形、可见性、正文文本长度、三个页签、设置面板宽度、以及「整棵树还在不在」。

反向验证三组:移除 stats 端点 + 守卫 → 精确报红「界面没被异常卸载」;移除齿轮 → 报红「手机上有设置入口」且可见按钮从 10 掉回 9;均还原后转绿。

回归:桌面 check-ui 零失败,手机 e2e 19/19,两端 tsc 全过。

空谷 Ondra v1.1.7-alpha(内测版)

Choose a tag to compare

@github-actions github-actions released this 14 Nov 08:17

下载 1.1.7-alpha

平台 安装包 大小
macOS(Apple Silicon) Ondra-1.1.7-alpha-macos-arm64.dmg 56.0 MB
Android(arm64) Ondra-1.1.7-alpha-android-arm64.apk 14.4 MB
Windows(x64) Ondra-1.1.7-alpha-windows-x64-setup.exe 33.2 MB

内测版:版本号末尾的 -alpha 就是标记。不是公测版,也不是正式版。

首次打开会被系统拦下

三个包都没有正式签名(macOS 是链接器 ad-hoc 签名,Windows 没有代码签名证书,Android 是 debug 签名)。

  • macOS:右键点应用 →「打开」;或执行
    xattr -dr com.apple.quarantine "/Applications/空谷 Ondra.app"
  • Windows:SmartScreen 提示时点「更多信息」→「仍要运行」
  • Android:系统会提示「未知来源」。允许浏览器/文件管理器安装即可;
    这个包只支持 arm64(近几年的手机都是),老设备装不上是正常的。

装完之后

桌面端首次启动会拉起本机的插件宿主与内核,自带 Node 运行时,不需要另装。
安卓端不跑 Node:记忆与情绪在 WebView 里用 IndexedDB 直接算,
推理直连你在设置里填的接口,所以 APK 只有几十 MB,也不需要额外依赖。
数据全部留在本机,无账号、无遥测。推理来源在设置里三选一:在线接口 / 本地大模型 / 免费模型。


1.1.7-alpha · 关窗确认框补「取消」出口(2026-11-14)

问题

原来只有「退出应用」与「隐藏到托盘」两个按钮。想「改主意、先别关」的用户没有可点的东西——只有 Esc 与点遮罩,两者都不在界面上,不可发现。

更糟的是「退出应用」正好坐在用户习惯点「取消」的位置上,一点就是不可逆的退出。

改为三个出口

按钮 位置 行为
取消 最左,原「退出应用」的位置 关掉框,窗口保持原样
隐藏到托盘 主按钮,默认焦点 窗口收起,应用继续运行
退出应用 降到勾选框下方的文字级按钮 悬停才显警示色

理由:退出不是这个框的主问题(主问题是「关窗等于隐藏」),摆进按钮行会与「取消」争夺同一块视觉位置。不可逆动作该有更低的分量。

顺带修掉一处真缺陷

onCancel 原先绑的是 resolveClose('quit'),把取消键变成了退出键——那正是误操作的来源。现在 onCancel 与 onDismiss 都只关框、无副作用。

新增静态断言

扫描全部 .tsx 里的 <Dialog> 开标签,必须有 cancelLabel 且非空值。浏览器测试只能验当前渲染的那一个,漏传不会报错、只是少个按钮,属静默退化,只有扫源码能拦。反向验证:移除 Composer 的 cancelLabel → 精确报红「有一处 <Dialog> 没给 cancelLabel」。

其他

.gitignore 补 *.jks / *.keystore / keystore.properties。生成 keystore 时 git add -A 把 docs/xxx.jks 带进了暂存区,侥幸没提交。

空谷 Ondra v1.1.6-alpha(内测版)

Choose a tag to compare

@github-actions github-actions released this 14 Nov 07:20

下载 1.1.6-alpha

平台 安装包 大小
macOS(Apple Silicon) Ondra-1.1.6-alpha-macos-arm64.dmg 56.0 MB
Android(arm64) Ondra-1.1.6-alpha-android-arm64.apk 14.4 MB
Windows(x64) Ondra-1.1.6-alpha-windows-x64-setup.exe 33.2 MB

内测版:版本号末尾的 -alpha 就是标记。不是公测版,也不是正式版。

首次打开会被系统拦下

三个包都没有正式签名(macOS 是链接器 ad-hoc 签名,Windows 没有代码签名证书,Android 是 debug 签名)。

  • macOS:右键点应用 →「打开」;或执行
    xattr -dr com.apple.quarantine "/Applications/空谷 Ondra.app"
  • Windows:SmartScreen 提示时点「更多信息」→「仍要运行」
  • Android:系统会提示「未知来源」。允许浏览器/文件管理器安装即可;
    这个包只支持 arm64(近几年的手机都是),老设备装不上是正常的。

装完之后

桌面端首次启动会拉起本机的插件宿主与内核,自带 Node 运行时,不需要另装。
安卓端不跑 Node:记忆与情绪在 WebView 里用 IndexedDB 直接算,
推理直连你在设置里填的接口,所以 APK 只有几十 MB,也不需要额外依赖。
数据全部留在本机,无账号、无遥测。推理来源在设置里三选一:在线接口 / 本地大模型 / 免费模型。


1.1.6-alpha · 修安卓图标不生效(2026-11-14)

1.1.5 的 APK 里其实没有我们的图标。

查 CI 日志:整个 android job 没有任何 mipmap 相关输出——tauri icon 只从 bundle.icon 挑桌面尺寸的 PNG 塞进 mipmap,不认 icons/android/ 下那套前景 / 背景分离的图。

而少了 foreground / background 两套时,系统会把 ic_launcher.png 直接当自适应图标用并裁成圆形——源图标是「透明底 + 白色 squircle」,裁完只剩一块边缘被切掉的白形状。这就是「图标不对」。

修法

  • init 之后加一步,把 icons/android/mipmap-* 整体同步进 gen/android/app/src/main/res/。
  • 顺带踩到一个坑:mipmap-anydpi-v26 里只有 XML 没有 PNG,直接 cp *.png 会因通配符未匹配而在 set -e 下中止整步。PNG 与 XML 分开拷。
  • 补 ic_launcher_round.xml:tauri icon 只生成了 ic_launcher.xml,圆形启动器找不到 round 那份会退回裁切传统图标。

空谷 Ondra v1.1.5-alpha(内测版)

Choose a tag to compare

@github-actions github-actions released this 14 Nov 06:57

下载 1.1.5-alpha

平台 安装包 大小
macOS(Apple Silicon) Ondra-1.1.5-alpha-macos-arm64.dmg 56.0 MB
Android(arm64) Ondra-1.1.5-alpha-android-arm64.apk 14.4 MB
Windows(x64) Ondra-1.1.5-alpha-windows-x64-setup.exe 33.2 MB

内测版:版本号末尾的 -alpha 就是标记。不是公测版,也不是正式版。

首次打开会被系统拦下

三个包都没有正式签名(macOS 是链接器 ad-hoc 签名,Windows 没有代码签名证书,Android 是 debug 签名)。

  • macOS:右键点应用 →「打开」;或执行
    xattr -dr com.apple.quarantine "/Applications/空谷 Ondra.app"
  • Windows:SmartScreen 提示时点「更多信息」→「仍要运行」
  • Android:系统会提示「未知来源」。允许浏览器/文件管理器安装即可;
    这个包只支持 arm64(近几年的手机都是),老设备装不上是正常的。

装完之后

桌面端首次启动会拉起本机的插件宿主与内核,自带 Node 运行时,不需要另装。
安卓端不跑 Node:记忆与情绪在 WebView 里用 IndexedDB 直接算,
推理直连你在设置里填的接口,所以 APK 只有几十 MB,也不需要额外依赖。
数据全部留在本机,无账号、无遥测。推理来源在设置里三选一:在线接口 / 本地大模型 / 免费模型。


1.1.5-alpha · 修 mac「已损坏」、安卓标题栏重叠、补安卓签名与图标(2026-11-14)

mac「应用已损坏」的真因

Tauri 产出的是链接器临时签名(flags=0x20002 adhoc,linker-signed),没有 Contents/_CodeSignature,即 Sealed Resources=none。下载后带 quarantine 标记,Gatekeeper 校验整个 bundle 时直接判「应用已损坏」。

修法:tools/make-dmg.mjs 在 dmg 定型前做 codesign --force --deep --sign -。实测从 Sealed Resources=none 变成 version=2 rules=13 files=4898,spctl 从 code has no resources 降级为单纯 rejected(可右键放行)。

这一条影响很大:1.1.3 及之前的 dmg 在别的机器上打开会直接被判损坏,不是「未签名需右键」那么轻。

安卓标题栏重叠

decorations:false 让 WebView 铺满整屏,但前端从未用过 env(safe-area-inset-*),状态栏压在自绘标题栏上。

修法:.shell 加四边安全区 padding。桌面端恒为 0,三端通用。

安卓签名

keystore 还原 + Gradle signingConfig 注入 + apksigner 校验 + 用后即删。keystore 走 secrets 不进仓库。

安卓自适应图标

源图标是透明底 + 白色 squircle,直接当自适应前景会被裁圆。改为拆前景 / 背景两层,tauri icon manifest 生成全套 mipmap 含 round。

注意:这一版的图标实际没有生效,问题在 1.1.6 才真正修好。

空谷 Ondra v1.1.4-alpha(内测版)

Choose a tag to compare

@github-actions github-actions released this 14 Nov 06:39

下载 1.1.4-alpha

平台 安装包 大小
macOS(Apple Silicon) Ondra-1.1.4-alpha-macos-arm64.dmg 55.8 MB
Android(arm64) Ondra-1.1.4-alpha-android-arm64.apk 14.4 MB
Windows(x64) Ondra-1.1.4-alpha-windows-x64-setup.exe 33.2 MB

内测版:版本号末尾的 -alpha 就是标记。不是公测版,也不是正式版。

首次打开会被系统拦下

三个包都没有正式签名(macOS 是链接器 ad-hoc 签名,Windows 没有代码签名证书,Android 是 debug 签名)。

  • macOS:右键点应用 →「打开」;或执行
    xattr -dr com.apple.quarantine "/Applications/空谷 Ondra.app"
  • Windows:SmartScreen 提示时点「更多信息」→「仍要运行」
  • Android:系统会提示「未知来源」。允许浏览器/文件管理器安装即可;
    这个包只支持 arm64(近几年的手机都是),老设备装不上是正常的。

装完之后

桌面端首次启动会拉起本机的插件宿主与内核,自带 Node 运行时,不需要另装。
安卓端不跑 Node:记忆与情绪在 WebView 里用 IndexedDB 直接算,
推理直连你在设置里填的接口,所以 APK 只有几十 MB,也不需要额外依赖。
数据全部留在本机,无账号、无遥测。推理来源在设置里三选一:在线接口 / 本地大模型 / 免费模型。


1.1.4-alpha · 巡检第 8 轮(2026-11-14)

不并入已发布的 1.1.3:1.1.3 已按 1af0acdc 构建并发布三端,这批改动在其之后产生,故版本前进到 1.1.4。

变更

  • sinceText 合并为单一导出。原先同一段「多久以前」的格式化逻辑在多处各写一份,改一处不会同步其余几处。
  • checkFieldUnits 补清单校验。629 个配置字段里凡是带单位的数字项,都要在清单里有对应声明;漏声明的会被这条断言拦下。

这一版是纯粹的收口版本,没有用户可见的新功能。

空谷 Ondra v1.1.3-alpha(内测版)

Choose a tag to compare

@github-actions github-actions released this 13 Nov 21:25

下载 1.1.3-alpha

平台 安装包 大小
macOS(Apple Silicon) Ondra-1.1.3-alpha-macos-arm64.dmg 55.8 MB
Android(arm64) Ondra-1.1.3-alpha-android-arm64.apk 14.4 MB
Windows(x64) Ondra-1.1.3-alpha-windows-x64-setup.exe 33.2 MB

内测版:版本号末尾的 -alpha 就是标记。不是公测版,也不是正式版。

首次打开会被系统拦下

三个包都没有正式签名(macOS 是链接器 ad-hoc 签名,Windows 没有代码签名证书,Android 是 debug 签名)。

  • macOS:右键点应用 →「打开」;或执行
    xattr -dr com.apple.quarantine "/Applications/空谷 Ondra.app"
  • Windows:SmartScreen 提示时点「更多信息」→「仍要运行」
  • Android:系统会提示「未知来源」。允许浏览器/文件管理器安装即可;
    这个包只支持 arm64(近几年的手机都是),老设备装不上是正常的。

装完之后

桌面端首次启动会拉起本机的插件宿主与内核,自带 Node 运行时,不需要另装。
安卓端不跑 Node:记忆与情绪在 WebView 里用 IndexedDB 直接算,
推理直连你在设置里填的接口,所以 APK 只有几十 MB,也不需要额外依赖。
数据全部留在本机,无账号、无遥测。推理来源在设置里三选一:在线接口 / 本地大模型 / 免费模型。


1.1.3-alpha · 手机端精简版 + 安卓 CI 修复(2026-11-14)

手机端:宿主逻辑搬进 WebView,核心不丢

Android 不能跑 Node 宿主——沙箱不允许 fork 任意可执行文件,随包的 151 MB Node 运行时也无法在 Android 上执行。所以走完全不同的架构:

文件 职责
src/lib/local/db.ts IndexedDB 替代 SQLite
src/lib/local/emotion.ts 六维 + 十标签 + 指数回归
src/lib/local/memory.ts 写入、寿命、召回、注入
src/lib/local/inference.ts 直连 OpenAI 兼容端点,流式
src/lib/local/prompt.ts 人设 / 记忆 / 情绪三层装配
src/lib/local/host.ts 28 个端点的本地分发

界面零改动:request() 与 requestStream() 是全部网络出口,在那里加一层分发即可。核心 12 个端点真实实现,其余返回空结构而不是 404——后者会让「扩展功能」页显示「读不到插件」,看起来像坏了。

算法一致性:情绪 PAD 与记忆稳定性两份纯函数从桌面版逐字复制,pnpm check:local-parity 逐行比对(130 + 249 行)。

本地模式的判定是显式开关 __ONDRA_LOCAL_MODE__(Vite 注入),不是「检测不到 Tauri 对象」的推断——后者把 check:ui 整条打挂:测试注入的是假壳,不设那个对象,于是被判成本地模式。

六处修复

  1. define 替换标识符不是属性——globalThis.xxx 会变成 globalThis.true。
  2. 一句话可命中多个信号——原先每个分支 continue,只记第一件。
  3. 住址正则缺「住在」——实际句子是逗号后的「住在杭州」。
  4. 情绪位移量纲——0–1 尺度的 0.12 加到 0–100 的 energy 上只有 4.2 点。
  5. 阈值不可达——桌面版 energy<40 是给长期累积的,手机单条最多 12 点。
  6. 日期字段名——界面读 createdAt,本地存 at,缺了渲染成 NaN 年。

修安卓 CI

sdkmanager 报 Failed to find package 'tools' 后整步退出码 1,后面 10 个步骤全部 skipped。原因是 android-actions/setup-android 装的 tools 包已下线。改为直接调 runner 自带的 sdkmanager:接受许可 → 装 platform-tools / android-34 / build-tools / NDK 27,并在 NDK 落盘失败时明确报错(sdkmanager 有时只警告不报错)。

未完成

Tauri Android 实际打包。当时 Cargo.toml 缺 [lib] 声明,而 Android 要求 Rust 编成 cdylib;本机 cargo 工具链损坏无法验证编译,故撤回那部分改动,只保留 #[cfg(mobile)] 分支与 tauri.android.conf.json。这一项在 1.1.5 补上了。

验证

check:e2e-mobile 19/19、check:local-parity 全过、桌面端 check:ui 417 条零失败。

空谷 Ondra v1.0.3-alpha(内测版)

Choose a tag to compare

@github-actions github-actions released this 13 Nov 16:22

下载 1.0.3-alpha

平台 安装包 大小
macOS(Apple Silicon) Ondra-1.0.3-alpha-macos-arm64.dmg 55.8 MB
Windows(x64) Ondra-1.0.3-alpha-windows-x64-setup.exe 33.2 MB

内测版:版本号末尾的 -alpha 就是标记。不是公测版,也不是正式版。

首次打开会被系统拦下

两个包都没有正式签名(macOS 是链接器 ad-hoc 签名,Windows 没有代码签名证书)。

  • macOS:右键点应用 →「打开」;或执行
    xattr -dr com.apple.quarantine "/Applications/空谷 Ondra.app"
  • Windows:SmartScreen 提示时点「更多信息」→「仍要运行」

装完之后

桌面端首次启动会拉起本机的插件宿主与内核,自带 Node 运行时,不需要另装。
数据全部留在本机,无账号、无遥测。推理来源在设置里三选一:在线接口 / 本地大模型 / 免费模型。


1.0.3-alpha · 间距栅格化 + 设置页信息架构重排(2026-11-14)

两轮改动合并为一版。

间距全部对齐 8 栅格

  • --s-3 从 12 改为 8,六档变成 4 / 8 / 16 / 24 / 32 / 48 / 64(4 是唯一允许的半格)。
  • 170 处 padding / margin / gap 同步调整;元件尺寸与发丝线保留,由图标与系统推算得出。
  • 三处必须手工重算:输入卡起笔对齐的同值契约、矮窗降级档、热区 padding 与负 margin 同值。
  • GRID8 断言收紧,移除 12 这一档。

设置页归属重排

  • 17 个插件配置段上移:人物设定 10 个、通用 4 个、其余按需。
  • 模块层从 66 段降到 49 段,扩展功能不再重复列出。
  • 12 个场景项按段分发:人物设定 6、通用 4、扩展功能 2。
  • 页内排法改为「一张卡 → 它的日常旋钮 → 它的完整字段」。
  • 新增 SectionFields:卡片下方原地展开整段字段,默认收起,排除 enable。
  • 原始层对已上移的段标注去向且不可点——否则点了会搜到空结果。
  • 两处过期指路文案改指新位置。

顺带修掉的五个缺陷

  1. 单字符供应商 id 让网关整个装载失败。sanitizeSourceId() 清洗后没校验最小长度,网关的 NAME_RE 要求至少 2 字符,单字符被当非法来源跳过;来源清单被过滤成空后 completeConfig() 抛 invalid config,网关整个插件装载失败,而 ondra-memory-extract 拿不到网关时事实提炼恒 no-gateway——记忆永远只有原文没有事实。修法是清洗后不足 2 字符补 -profile 后缀。
  2. 中断不断上游。信号没有打通到 readSseData,用户点了停止,上游还在生成。
  3. 流式输出攒批。首帧停顿期间到达的帧被挂在等待链尾巴上,等到最后一起放;改为攒起来跟首帧一起放,后续帧不再被首帧的停顿连坐。
  4. 待办不分句。一次说三件事只记一件,且两件事共用一次冷却。改为外层按句切分(。!?; 与英文 .!?;、换行),内层保持原逻辑。不用逗号——中文口语里逗号连接的是同一件事的分句,切开会把一件事拆成两件。
  5. 插件默认全量装载。启用判据从手写白名单换成「目录里有没有」,实测 78/78 全部 loaded,零失败。

发布形态

不再标 Pre-release。GitHub 的硬规则是 Latest release cannot be draft or prerelease,而仓库首页右栏的「发行版」区块只列 Latest——标了 Pre-release 的版本在那里只渲染成一行「N tags」,点不进任何一个版本。

代价是 GitHub 不再从徽章上区分内测与稳定,内测语义改由版本号承载:-alpha 后缀、标题里的「内测版」、正文第一段。

验证

check-ui 417 条零失败、acceptance 97/97、contrast 66/66、typecheck 全仓通过。版本七处同步(含 Cargo.toml 与 Cargo.lock)。