Repository navigation
Releases
空谷 Ondra v1.3.0-alpha(内测版)
下载 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 个插件产物)后依次跑:
src的tsc --noEmit→ exit 0(存根生效)pnpm run build:plugins→ 75 个包全部 Donevite build→ 492 KB,无插件ONDRA_LOCAL=1 vite build→ 493 KB + plugins 1471 KBcheck: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(内测版)
下载 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 层没变(写入没发出去)」。
澄清六个「像缺陷但不是」
- 扩展抽屉的
undefined是插件说明里的正常中文。 - 情绪
mood恒 0.50:gratitude位移表只动pleasure/arousal/energy,不含mood。 - 记忆恒 1 条:判重把重复事实判为「复述」,这是不膨胀的正确行为。
- 宽屏抽屉页签不可见:设计如此(左脊已有入口)。
- 取消键叫「返回修改」:语义更准。
- 设置打开时左脊可点但被拦截:待产品确认。
文档
新增 docs/TEST-REPORT-1.2.0.md 结构化报告(覆盖范围、结论、异常、复现、影响、优先级、修复方向)。
空谷 Ondra v1.2.0-alpha(内测版)
下载 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(内测版)
下载 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 直出。
顺带修的三处手机端导航缺陷
- 横屏(844×390)没有顶栏。断点只量宽度 819,横屏 844 超过它,切回桌面
TitleBar——而桌面标题栏在安卓上没有任何可用按钮(红绿灯只 mac、菜单键只 win),左上角空着。改成@media (pointer: coarse)强制手机形态,触屏横竖都用顶栏。 - 手机上打不开设置。唯一入口是左脊底部齿轮,而窄屏
.rail是display:none。实测 390 宽下可见按钮只有 9 个,无一能进设置;Cmd+,能开但手机没键盘。给顶栏加齿轮按钮。 - 设置面板被挤剩 222 宽。手机上被 168 竖排导航挤掉大半。改成单列 + 导航横排滚动。规则在触屏块与容器查询块各写一份——横屏手机只命中前者。
- 扩展抽屉直出「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(内测版)
下载 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(内测版)
下载 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(内测版)
下载 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(内测版)
下载 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(内测版)
下载 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 整条打挂:测试注入的是假壳,不设那个对象,于是被判成本地模式。
六处修复
define替换标识符不是属性——globalThis.xxx会变成globalThis.true。- 一句话可命中多个信号——原先每个分支
continue,只记第一件。 - 住址正则缺「住在」——实际句子是逗号后的「住在杭州」。
- 情绪位移量纲——0–1 尺度的 0.12 加到 0–100 的
energy上只有 4.2 点。 - 阈值不可达——桌面版
energy<40是给长期累积的,手机单条最多 12 点。 - 日期字段名——界面读
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(内测版)
下载 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。 - 原始层对已上移的段标注去向且不可点——否则点了会搜到空结果。
- 两处过期指路文案改指新位置。
顺带修掉的五个缺陷
- 单字符供应商 id 让网关整个装载失败。
sanitizeSourceId()清洗后没校验最小长度,网关的NAME_RE要求至少 2 字符,单字符被当非法来源跳过;来源清单被过滤成空后completeConfig()抛invalid config,网关整个插件装载失败,而ondra-memory-extract拿不到网关时事实提炼恒no-gateway——记忆永远只有原文没有事实。修法是清洗后不足 2 字符补-profile后缀。 - 中断不断上游。信号没有打通到
readSseData,用户点了停止,上游还在生成。 - 流式输出攒批。首帧停顿期间到达的帧被挂在等待链尾巴上,等到最后一起放;改为攒起来跟首帧一起放,后续帧不再被首帧的停顿连坐。
- 待办不分句。一次说三件事只记一件,且两件事共用一次冷却。改为外层按句切分(
。!?;与英文.!?;、换行),内层保持原逻辑。不用逗号——中文口语里逗号连接的是同一件事的分句,切开会把一件事拆成两件。 - 插件默认全量装载。启用判据从手写白名单换成「目录里有没有」,实测 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)。