# Changelog ## v2.1.1 - 2026-11-09 ### 修复 - 交互终端路由在服务端/移动端统一注册,API 面板与 App 共用同一套终端接口。 - 任务标签列表(`GET /tasks/labels`)与分组列表(`GET /tasks/groups`)不再被 `GET /tasks/:id` 参数路由捕获,App 内标签筛选正常工作。 - 环境变量名列表(`GET /envs/names`)不再被 `GET /envs/:id` 捕获。 - 认证偏好(`GET+PUT /api/auth/preferences`)在移动端核心补齐注册,App 内用户偏好正常读写。 - 侧栏角标(`GET /api/system/badges`)在移动端核心补齐注册。 - MCP 服务状态路由在移动端核心补齐注册,默认未开启时与 Go 面板口径一致。 - 通知渠道列表(`GET /api/notification-channels`)别名在移动端核心补齐。 ### 优化 - 冒烟测试脚本路径修正(`/cron/templates` → `/tasks/cron/templates`)、MCP 默认 403 口径适配。 - 冒烟测试新增移动端路由冲突 SKIP 逻辑,方便区分脚本误报与面板真 bug。 ## v2.1.0 - 2026-11-02 ### 面板同步 - 内置面板从上游 v3.0.6 同步到 v3.4.0,122 个上游提交带来的功能全部进包:执行趋势按天统计、日志查询索引补建、企业微信指令运行任务、Playwright 一键安装、订阅子目录/白名单、系统包依赖安装、MCP 服务、备份恢复改进等。 - 本机版 Android 适配在同步中完整保留:local-ui 会话桥、交互终端、依赖私有安装目录、SSH/通知/Open API 密钥密封、任务与订阅操作记录、低电量/低存储任务暂停、订阅工作区原子切换与崩溃恢复、日志断点续读、Go 脚本 yaegi 运行时、Supervisor 受管进程执行。 ### 修复 - 合并后重新对齐路由契约(497 条路由),补齐上游新增路由的移动端能力描述。 - 版本号统一由 VERSION.json 驱动,面板 / Web / App 三处保持一致。 ## v2.0.7 - 2026-09-29 ### 仪表盘 - Android 面板 CPU 占用不再固定为 0。优先读取 cpufreq,读不到时采样 `/proc/stat`,再退回负载均值。 ### UI - 个人资料页的头像按钮和分区卡片不再上下贴在一起。 - Android 运行时不支持提示卡补上下边距,避免和下方卡片贴死。 ## v2.0.6 - 2026-09-29 ### UI - 默认 MIUIX 使用 HyperOS 色板:浅色灰底白卡片、蓝色强调;深色黑底灰卡片。 - 页面、卡片、强调色、进度和输入光标统一从 AppVisualPalette 读取。Liquid Glass 仍使用翠绿,成功和运行状态不并入品牌色。 ### 发行 - GitHub Release 只发布安装包和 `android-update.json`,不再附带 `.sha256` 文件。安装包摘要仍在发布前校验,并写进更新清单供应用内更新使用。 ### 依赖 - 未配置的 Linux 镜像按发行版走国内源;客户机没有 CA 证书时,pip/npm 使用可信主机、重试和 HTTP。 - TypeScript 健康检查加载随包的 5.6.3,不再调用客户机里不存在的 tsc。 ## v2.0.5 - 2026-09-29 ### 脚本与依赖 - 脚本启动前自动识别 Python、Node.js 和 TypeScript 第三方依赖。 - 缺失依赖按运行时版本加锁安装,成功后持久化到共享依赖环境,后续脚本直接复用。 - 依赖安装失败时阻止脚本执行,并返回明确的安装日志。 - 新增 Android/Linux PTY 交互终端和 rootfs 配置/下载入口。 ### 安全与兼容性 - 修复 Android runtime 自定义下载源 SSRF 与 tar 软链越界写入风险。 - 修复 Windows 服务端构建中的 Unix PTY 平台编译问题。 - 修复任务导入协议、任务配置字段和脚本运行超时处理。 ### UI - 修复键盘弹出、固定高度弹窗、长路径下拉框和动态文本导致的布局溢出。 ## v2.0.4 - 2026-09-25 ### 脚本 - TypeScript 脚本运行修复:兜底内联转译器仅在 typescript 模块存在时启用;依赖兼容映射固定 `typescript@5.6.3`,规避 TypeScript 7 原生发行版缺少 CJS `transpileModule` API 导致的必然失败。 ### 环境变量 - 新建与改名接口增加名称校验:拒绝空名称、非法格式(须为字母/数字/下划线且不以数字开头)与运行时保留名,防止无效变量破坏备份等功能。 ### 任务 - 创建任务时拒绝空命令,与前端表单校验保持一致。 ### 依赖 - `POST /api/deps` 请求缺少 `names` 数组时返回 400 与契约提示,不再静默返回空结果。 ### 通知 - 通知权限被拒(POST_NOTIFICATIONS_DENIED)返回 403 而非 500,渠道故障返回 503,语义更准确。 ### 发布工程 - 修复正式版发布门禁:`release-runtime-contract.json` 显式声明 `stable_emulator_matrix`(api30-x86_64-4k),发布校验器在 stable 通道改用该矩阵验证同一次构建的 x86_64 模拟器运行时证据。此前契约仍指向云 runner 无法运行的 ARM64 模拟器矩阵 `api35-16k`,导致 stable 发布校验始终找不到证据文件(v2.0.3 正式版发布因此失败)。物理设备证据边界保持如实记录。 ## v2.0.3 - 2026-09-23 ### 通知 - 脚本通知不再把登录 token 当作本机校验头。本机校验只使用单独的本机 token,失败响应也不再回显 token。 ### 依赖 - 取消正在安装或卸载的依赖时会终止对应进程,不再只改状态、让安装结束后把状态覆盖回成功或失败。系统包安装同样可以取消。 ### 任务 - cron 的 `5/10` 这类「起点/步长」按标准从起点步进到字段上限,不再只在起点触发一次。 ### 安装包 - 本版为正式版。 - ARM64:`daidai-panel-native-2.0.3-stable-arm64.apk` - x86_64:`daidai-panel-native-2.0.3-stable-x86_64.apk` - 已通过 x86_64 模拟器运行时验证。ARM64 真机验证仍缺少自托管 runner,不以真机证据宣称 ARM64 已覆盖。 ## v2.0.2 - 2026-09-22 ### 安全 - 订阅拉取只允许 http/https,并在每一跳重新校验地址,拒绝跳到 `file:` 或内网目标。 - Git 远程地址与分支不再接受以 `-` 开头的主机名或引用,`clone`/`pull` 在 URL 前使用 `--`。 - 通知出站拒绝回环、链路本地和私网地址,并关闭自动跳转。 - 备份上传、下载和恢复限制在备份目录内;脚本路径拒绝 `..`、控制字符和响应头注入。 - Node/Python 资源解压拒绝写出目标目录。 - OpenAPI Secret、本机 token 改为常量时间比较;鉴权失败不再回显 token 前缀。 - 查看 OpenAPI Secret 必须校验当前管理员密码,不再使用任意用户密码。 - 终端、脚本、订阅至少需要 operator;备份和 `config.sh` 至少需要 admin。任务、环境变量、依赖、通知和日志的写操作需要 operator。 - 检查更新改为读取本仓库 `tall-1997/daidai-panel-native` 的已发布版本,更新清单按标签下载,不再依赖 `/releases/latest`。 - 登录页把链路本地地址和运营商级 NAT 地址按本机地址处理,默认使用 http。 ### 通知 - 脚本通知不再把登录 token 当作本机校验头。本机校验只使用单独的本机 token,失败响应也不再回显 token。 ### 日志流 - 依赖日志流在安装仍进行时改为要求客户端重连,不再把进行中的状态当成终态,导致一打开依赖日志就显示“安装成功”;日志行按纯文本回放并附带稳定 `id:`,重连不会重复堆叠同一行。 - 订阅拉取日志流改为纯文本行加 `id:` 游标,拉取进行中持续重连跟随,真正结束才发送 `finished`,空闲时发送 `not_running`,不再一打开就标记已完成;日志页面也不再渲染 `done` 帧的载荷(避免每次重连插入一行 `reconnect`)。 ### Android - cron 的 `5/10` 这类「起点/步长」按标准从起点步进到字段上限,不再只在起点触发一次。 - Python 运行时自带的 OpenSSL 库文件名与 SONAME 对齐为 `libcrypto_python.so`/`libssl_python.so`,避免按文件名遮蔽系统 `libcrypto.so`/`libssl.so`,修复 proot 内系统 libcurl 因缺失 OpenSSL 1.0 符号导致的链接失败;同时补上 Python `_ssl`/`_hashlib` 需要的 `libcrypto.so.3`/`libssl.so.3` 兼容副本。 ### 依赖 - 取消正在安装或卸载的依赖时会终止对应进程,不再只改状态、让安装结束后把状态覆盖回成功或失败。 - 修复 Python 依赖已经安装成功、验证却失败的问题。`websocket-client` 的模块名是 `websocket`,不再误当成 `websocket_client`。安装和验证使用同一个 rootfs Python 与 site-packages;发行包若声明了自己的顶层模块,也按该模块验证。 ### 说明 - 仓库介绍和文档改为只描述本仓库的 Android 本机版,不再保留其他仓库的 Docker、Windows 或 Magisk 下载说明。 ### 安装包 - ARM64:`daidai-panel-native-2.0.2-prerelease-arm64.apk` - x86_64:`daidai-panel-native-2.0.2-prerelease-x86_64.apk` 本版本为预发行。请从本仓库 Release 下载安装包,不要使用其他仓库的 Docker、Magisk 或旧版 APK。 ## v2.0.1 - 2026-09-18 ### Android 本地 fallback - Git 订阅支持 `ssh_key_id`:私钥写入应用私有目录并注入 `GIT_SSH_COMMAND`,拉取结束后删除临时钥。 - 新增 `PUT /subscriptions/{id}/refresh`;定时调度按 cron 拉取已启用订阅,进行中的拉取会被跳过。 - `pull/stop` 会强制结束正在运行的 git 进程。 - 备份恢复进度按解密、校验、切脚本、提交数据库、收尾上报 `active/status/stage/message/percent`。 - `capabilities.limits` 改为真实上限(任务日志 500、脚本运行 200、备份 5、并发 2、队列 32、缓存 64MiB、调试 7200 秒)。 - 脚本/任务运行签发 2 小时会话 token 注入 `DAIDAI_TOKEN`,结束后撤销。 - TypeScript 优先使用 ts-node,其次 tsc,最后才回退 `transpileModule`。 - 格式化工具缺失时返回 `warning`/`message`,不再静默保持原文。 - `/api/system/check-update` 读取 GitHub `linzixuanzz/daidai-panel` latest;失败时软降级。 - `/sponsors` 拉取公开赞助源并缓存 10 分钟,失败返回 `unavailable`。 - 登录仅在 `two_factor_required=true` 时进入 TOTP 流程,补齐本地 RFC 6238 实现。 ### Flutter - 登录挑战响应识别两步验证,避免 4xx 被误报成网络错误。 - 任务表单与 cron 模板展示下次执行时间和解析结果。 - 调度器宿主状态补充 task views、panel settings、health check 等平台能力声明。 ## v2.0.0 - 2026-09-11 ### 稳定性与并发修复 - 脚本执行流式输出改为 `io.Writer` 回收并配合 `WaitDelay` 兜底,修复 `Wait` 与管道读取并发导致的尾部日志丢失与数据竞争(内联脚本、订阅 hook 共用同一实现)。 - 定时任务全局调度器/执行器改用原子指针访问,消除并发读写的竞态。 - JWT 密钥生成移动到数据目录解析之后,并补齐生成失败的错误处理。 - 通知发送计数改为原子 `UPDATE` 自增,消除读-改-写竞态;Webhook 出站安全校验下沉到拨号层按解析结果 IP 校验,消除 DNS 重绑定 TOCTOU 窗口。 - CORS 拒绝日志改为有界存储避免内存无限增长,并停止放行 `Origin: null`。 ### CLI 与运行时契约 - `ddp env set` 仅更新显式传入的字段,新增 `--enabled`/`--disabled`,不再清空未传的分组、备注和启用状态。 - 任务等待补充默认超时与超时报错,日志读取改为保留末尾并按需截断,只读命令不再触发迁移。 - 运行时契约校验补齐顶层 `artifacts` 字段,修复 x86_64 冒烟证据在严格反序列化下解析失败。 ### Android - 修复 PRoot 工作目录误绑 `/` 覆盖 rootfs 根的问题,系统包安装工作目录修正为 `/workspace`;修正 ELF `p_align` 偏移读取错误。 - rootfs 校验值下载兼容 Alpine 的 `.sha256` 裸哈希格式,修复此前校验地址恒 404 的问题。 - 面板健康检查加入 TTL 缓存与 single-flight,避免公开接口同步执行 PRoot 造成资源耗尽。 - Python 运行时统一到 3.14,失败不再永久缓存,pip 引导校验退出码;运行时 fallback 元数据版本同步为 3.14。 ### Flutter - 修复批量设置分组时已有分组无法取消选中的问题。 - 补齐各对话框临时 `TextEditingController` 的释放,消除内存泄漏。 ## v1.0.20 - 2026-09-07 ### x86_64 本地运行时与 CI 门禁 - 新增 x86_64 Ubuntu 本地运行时(含 Alpine musl rootfs 制作与按需切换),打通 CI x86_64 模拟器全链路 smoke,作为 ARM64 真机 evidence 的行为代理。 - NDK 自编译 PRoot 全面重建:接入 Termux PRoot 体系,处理 talloc/loader/libc 特性声明与 Android shmem 兼容定义、去除不受支持的 loader/sysvipc 标志,恢复并校验 seccomp 路径。 - 原生 bsdiff 补丁器替换并修正 BSDIFF 缓冲区长度类型;rootfs 符号链接解包前先清理已存在的占位项。 - Android 单 ABI 打包、Flutter split ABI 过滤分离;打包原生运行时字节在构建中保持原样。 - x86 Node 运行时修复 UTF-8 切片(禁用损坏的 TextDecoder 行为)并关闭 V8 JIT;闪退诊断与系统盘故障可读日志。 - 借 harness 参考加固:proot 每次调用显式 `--link2symlink`;apt 安装加入 `dpkg --configure -a` 恢复与 `DPkg::Lock::Timeout`/`Acquire::Retries`;rootfs 缺 ca-certificates 时 apt 源回退 http(装好证书后下次启动自动恢复 https);诊断新增 `host_page_size_bytes` 与 `proot_elf_load_max_align`(16K 页预检)。 ### 依赖与任务可靠性 - `POST /deps` 依赖安装与 `DELETE /deps` 卸载异步化:立即返回 201/200 并登记 operation,后台更新依赖行状态,避免客户端读超时误判为失败(修复 SocketTimeoutException)。 - pip 卸载补充 `--break-system-packages`;依赖安装/卸载/重装 operation 补齐,支持本地 wheel/tarball 元数据解析与类型标注。 - 任务 run/停止的 operation 日志链、env 详情 `GET /api/v1/envs/{id}`、env 更新响应完整性、资源创建统一返回 201。 - 脚本目录统一迁移到 `local-panel/scripts`;Android ICU 兼容转义补花括号与数组展开场景;shell 版本探测改用 `/bin/bash`。 - 任务运行日志暴露完整异常因果链,smoke 诊断可回读任务日志并识别存储 DB。 ### 门禁与发布 - x86_64 模拟器 smoke 全链路(启动 → 安装 → 28 步骤执行 → evidence/产物归档),失败 run 保留证据便于诊断。 - 运行时版本契约按矩阵 ABI 区分:ARM64 保持与 `runtime_evidence` 冻结版本精确一致,x86_64 代理矩阵仅校验行为(命令、退出码与输出格式),修复模拟器资产重建导致的版本漂移误报。 ## v1.0.19 - 2026-08-27 ### 切换为 Ubuntu 唯一发行版 - 内置 Linux 环境由 Alpine(musl) 切换为 Ubuntu 24.04(noble,glibc),提供更广的二进制兼容性。 - rootfs 内置 bash、python3、pip、nodejs、npm、pnpm、git、curl、openssh-client、tzdata,包管理器使用 apt。 - 恢复 Ubuntu rootfs 制作脚本(qemu + chroot 产物),默认软件源为阿里云镜像。 - 前端依赖管理镜像预设恢复 Ubuntu apt 源。 - 删除 Alpine rootfs 资产与制作脚本。 - SSE 可重试错误(408/425/429/5xx)仅触发重连,状态栏不再误报终态连接错误。 - README 与 runtime 依赖配置统一使用 Ubuntu 24.04 发行版说明。 注意:Ubuntu 使用 glibc,其 rseq 等新系统调用在 Android 应用域 seccomp 下曾导致 SIGSYS,本轮通过 `GLIBC_TUNABLES=glibc.pthread.rseq=0` 规避,仍需真机验证脚本执行稳定性。 ## v1.0.18 - 2026-08-27 ### 登录链路可靠性(浏览器面板) - 修复登录 401 被误判为 token 过期进入刷新流程,导致「密码错误/账号锁定/两步验证」提示全部失效。 - 修复 refresh 无超时导致的 `isRefreshing` 死锁(登录转圈卡死到 30s Network Error 根因)。 - Network Error / 超时归一化为中文提示「网络异常,请检查连接」。 - checkInit 与版本检查加超时,不再无限卡「正在加载...」。 - 路由守卫瞬时网络错误不再强制登出用户。 - 登录防重复提交。 - 默认账号 `admin` / `admin123` 已在 README 标注。 ### 后台定时任务可靠性 - Cron 任务按 ID 去重,队列满时延迟重入队,不再静默丢弃定时任务。 - 非持久化调度模式也通过 WorkManager 周期唤醒执行定时任务(作为持续调度的降级补充)。 - 定时备份改为异步执行,不再阻塞 cron 调度判断。 - 设备资源受限(电量/存储/内存/高温)时暂停低优先级备份并通知用户。 ### 临时前台会话体验 - 浏览器面板临时会话不再随返回 App 自动结束,改为通知栏「关闭」按钮手动结束。 - 临时会话通知使用独立标题「呆呆面板浏览器面板」与「关闭」按钮,与持久化调度区分。 ### 安全 - access_token 24 小时过期、refresh_token 轮换,泄露后不再长期有效。 - Open API 限流改用 datetime 比较并原子化,修复并发突破与凌晨计数偏差;日志记录真实状态码(成功 200 / 超限 429)。 - 头像上传增加 5MB 大小与 jpg/png/gif/webp 类型白名单。 - 畸形 JSON 请求返回 400 而非 500,且不再回显内部错误信息。 - 修复 userJson 硬编码 `admin` 导致的角色隔离失效。 ### 健壮性与优化 - 前台面板轮询在健康状态下降到 5 分钟,失败自动回退高频。 - Dashboard 进度条 clamp 与生命周期感知,避免后台耗电与越界崩溃。 - 应用锁 40000 轮哈希移到后台 isolate,避免低端设备卡顿。 - 日志批量删除加页数上限,避免运行中任务持续产生日志导致死循环。 - 生物识别异常兜底,避免 `MissingPluginException` 红屏。 - SSE 短暂 inactive 不主动断开,避免下拉通知栏群涌重连。 - 数据库过期记录定期清理(调用日志 30 天、安全审计/登录日志 90 天、过期会话与 token)。 - 端口探测地址与监听地址统一为 `0.0.0.0`,修复探测不一致。 - 硬编码英文错误文案统一为中文。 ## v1.0.17 - 2026-08-27 ### 移除 Ubuntu 发行版 - 默认并唯一发行版改为 Alpine(musl),删除 Ubuntu 发行版支持。 - 删除 Ubuntu rootfs 资产(约 77 MB)、Ubuntu 下载源、`prepare-android-ubuntu-rootfs.sh` 构建脚本与验证 contract。 - APK 体积约 227 MB 减小到约 150 MB。 - 前端「依赖管理」页删除 Ubuntu/Debian 镜像预设,`linux_mirror_supported` 仅对 Alpine(apk) 为 true。 ### 本机 / 局域网浏览器面板访问 - 本地 HTTP 服务由 `127.0.0.1` 改为 `0.0.0.0` 监听,支持本机浏览器与局域网浏览器通过账号密码 + JWT 登录面板。 - 新增一次性票据(ticket)+ 浏览器会话(browser_session)机制,App 内安全拉起系统浏览器。 - App 内请求带 local-token,局域网浏览器强制 JWT,Host / Origin 按来源三分流校验。 - 登录失败锁定:`security_login_attempts` 表,同一来源 5 次失败锁定 15 分钟。 - 临时前台会话保活:打开浏览器时自动拉起 `specialUse` 前台服务,避免 MIUI 后台冻结导致面板端口不可达;返回 App 自动结束,不残留通知。 - 修复 keep-alive 连接空闲 5 秒被关闭导致浏览器登录请求失败(socket read timeout 5s → 60s)。 ### Open API 完整实现 - 新增 `POST /api/open-api/token`:用 App Key + App Secret 换取 access_token(24 小时有效)。 - 业务 API 支持 open API token 鉴权(`Bearer`),按 scopes 权限范围默认拒绝,rate_limit 超限返回 429,调用写入日志。 - 修复创建 / 重置密钥弹窗的 App Key / App Secret 字段,列表补齐「今日调用」统计。 - 管理侧(`/api/open-api/apps`)仍仅允许面板登录 JWT,open API token 不能越权管理应用。 ### Linux 运行时兼容 - 应用 proot/alpine 兼容技巧:apk-tools 2.x 静态版 + mkdir 并发锁、移除 `--link2symlink`、bind 系统目录(/apex、/system 等)。 ### UI 整合 - 系统依赖清单并入依赖管理页,支持导出 Python/Node 与顺序批量重装。 - Android 运行时入口移入系统设置页;环境变量高级工具(批量改名/置顶)并入变量列表页。 - 修复高级配置脚本 GET 返回空内容的问题。 ### 通知修复 - 强制覆盖过期的 sendNotify.js 副本,任务型脚本执行同样部署 notify shims。 - 本地通知请求允许缺失 Origin。 ### 修复本地面板连接被拒绝的竞态 - `LocalPanelHostService` 启动失败不再静默吞异常,改为重试 3 次(延迟递增),并把失败状态回传给 UI。 - `ManagedLocalConnectionMonitor` 在 core 非 ready 时主动清空旧的本地会话,避免 UI 死抓已失效的回环地址与 token;binder 瞬时异常仍保留旧会话下次重试。 ### Release 说明自动生成 - Release 说明改为从 `CHANGELOG.md` 动态提取对应版本的实际更新日志,不再使用硬编码模板。 ## v1.0.16 - 2026-08-26 ### 运行时崩溃修复:应用域 seccomp 导致脚本 SIGSYS 真机运行脚本与安装依赖时偶发 `SIGSYS`(signal 31)崩溃,根因是三层叠加:Android 应用域继承的 seccomp filter + glibc(Ubuntu) 二进制 + 固定注入的 `PROOT_NO_SECCOMP=1`,导致 guest 进程被 seccomp 拦截后直接被杀。 - 默认发行版由 Ubuntu 改回 Alpine(musl),规避 glibc 对 rseq 等新系统调用的依赖。 - 移除固定注入的 `PROOT_NO_SECCOMP=1`,恢复 proot seccomp 加速(日志 `ptrace acceleration (seccomp mode 2) enabled`)。 - PRoot 由 proot-me 5.4.0 切换为 termux/proot 5.1.107.92 fork,新增 `--sysvipc` 与 `-L` 动态 loader,补齐 `libandroid-shmem.so` 与动态 `libtalloc.so`。 - Ubuntu 场景额外注入 `GLIBC_TUNABLES=glibc.pthread.rseq=0` 禁用 rseq。 ### 移除嵌入式 Go Core - 删除 Go Core 二进制桥接(GoCoreBridge / GoCoreReflectionContract / GoCoreResultMapper)与 `mobilecore.aar`,Kotlin fallback 成为唯一本地后端。 - 本地业务 API、任务、脚本、依赖、通知与健康检查全部由 Kotlin fallback 提供。 ### 脚本日志实时输出 - 注入 `PYTHONUNBUFFERED=1` 与 `PYTHONIOENCODING=utf-8`,脚本 `print` 实时刷新,不再因管道块缓冲导致输出迟迟不显示。 - 移除 proot `-v 1` 诊断日志,脚本运行日志干净、实时。 ### 依赖与运行时 - 中文脚本名 JSON body 解析改用 UTF-8,修复中文路径乱码。 - 新增 XZ 压缩 rootfs 解压支持(`org.tukaani:xz`)。 - 修复 Ubuntu rootfs 下 pnpm 检测路径(`/usr/local/bin/pnpm`)。 - 恢复华为云 / 阿里云 / npmmirror 默认镜像源。 - 健康诊断 `/api/system/health-check` 恢复 Python / Node.js / TypeScript runtime smoke 结果,并将误导性的 "Embedded Go core" 项改为 "Local panel core"。 ### 内置 Linux 终端 - 删除 Termux 预编译 .so,改用 NDK 自编译 PRoot、loader 与 BusyBox,无需依赖 Termux。 - 修复 proot TLS 段 16 KB 对齐,解决 Android 15/16 设备加载失败。 - 新增 `/api/android-runtime/distribution` 端点,支持 alpine/ubuntu 发行版选择。 ## v1.0.15 - 2026-08-23 ### Rootfs Guest PATH - 所有 PRoot 任务、依赖安装、健康检查和 PTY 统一注入 Linux guest `PATH`。 - 修复 npm 的 `#!/usr/bin/env node` 在 Android 宿主 PATH 下找不到 rootfs Node 的问题。 - Device Smoke 新增 `/usr/bin/npm --version` 门禁,直接覆盖 env shebang 启动链。 ## v1.0.14 - 2026-08-23 ### Android 依赖安装 - 移除 Android/Bionic 原生 wheel 阻断开关和 PyCryptodome 特判。 - pip 允许纯 Python wheel、原生 wheel和源码发行包,Go Core 与 Kotlin fallback 使用一致参数。 - 移除 Node 受限包名单,所有合法 npm 包均进入真实安装流程。 - 原生依赖首次失败后自动安装 rootfs C/C++、Python headers、Linux headers 和 Rust 工具链并重试一次。 - 保留结构化参数、包名校验、私有安装目录、超时、缓存上限和安装后导入验证。 ## v1.0.13 - 2026-08-23 ### Python Crypto 兼容 - Alpine rootfs 预装官方 `py3-pycryptodome`,直接支持 `Crypto.Cipher.AES` 和 `PKCS1_v1_5`。 - rootfs Python 自动依赖安装使用同一解释器和 `PYTHONPATH` 执行真实 import 验证。 - rootfs 模式不再套用 Android/Bionic 原生 wheel 阻断策略,也不再使用 Android Python 的 `pip list` 判断 rootfs 可导入性。 - Device Smoke 新增 PyCryptodome 双模块导入门禁。 - PRoot/BusyBox 构建默认验证已提交制品;显式刷新才访问固定上游包,避免 Termux 仓库滚动清理导致 CI 404。 ## v1.0.12 - 2026-08-23 ### Android PRoot Loader - 将固定版本 PRoot 的 AArch64 helper loader 作为签名 APK ELF 交付,并通过 `PROOT_LOADER` 覆盖 Termux 绝对 loader 路径。 - Kotlin fallback、runtime health smoke 与 Go Core PTY 使用同一 PRoot loader 环境契约。 - rootfs 在 PRoot 或 helper loader 缺失时 fail-closed,避免任务进入含糊的 guest `execve` 失败。 - CI 校验 helper loader 的 SHA-256、AArch64、16 KB `PT_LOAD` alignment 和 manifest override;Device Smoke 直接执行 rootfs `/usr/bin/env`。 ## v1.0.11 - 2026-08-22 ### Android Linux Runtime - Alpine rootfs 升级为首选执行层,内置 `apk`、Bash、Python 3、pip、Node.js、npm、uv、pnpm 和 CA 证书。 - Python、Node 和依赖自动安装优先使用 rootfs,Android/Bionic runtime 作为快速兼容路径。 - rootfs manifest 记录包、命令、能力、大小和 SHA-256;APK 升级后按资产摘要自动刷新已安装 rootfs。 - PRoot、BusyBox 和依赖固定 Termux 包版本与 SHA-256,并对 AArch64、动态依赖和 16 KB `PT_LOAD` alignment 执行 fail-closed 门禁。 ### Shell 与终端 - 新增保守 Bashism 检测,识别 shebang、双中括号、数组、process substitution、brace expansion 等语法并自动路由 rootfs Bash。 - 脚本、普通 task command 和前后置 hook 统一使用 rootfs shell planner。 - Go Core 与 Kotlin fallback 新增 PTY session API,支持输入、增量原始输出、resize、停止、会话限额和进程组回收。 - 本地 Web 新增交互终端页面,并限制前后端输出保留量和页面离开后的会话生命周期。 ### CI 与发行 - canonical mobile route contract 扩展到 449 条路由。 - CI 新增 rootfs 内容、manifest、PRoot provenance、原生依赖和 16 KB alignment 验证。 - Android 版本提升至 `1.0.11+1000110`。 ### 架构范围 - 暂停 ARM32 与 x86_64 多架构 runtime 预研在主分支的集成。 - 将多架构预研代码保留到 `shelved/multi-arch-runtime` 分支。 - 主分支发布链路重新聚焦 ARM64 完整本地 Go Core 与运行时。 ## v1.0.5 - 2026-08-22 ### 多架构能力一致性 - ARM64 继续直接运行完整 Go Core,与 upstream 后端共享业务 Handler、Scheduler、Executor、SecretStore、通知、Open API 和备份实现。 - ARM32、x86_64 和 universal 的 fallback capability 响应按 upstream 功能域逐项声明任务、Cron、重试、超时、停止计划、依赖、钩子、脚本、日志、环境变量、订阅、通知、Open API、安全、备份和监控能力。 - 增加 `backend_parity`、`native_runtime_mode` 和 `recommended_execution_mode`,客户端可以准确区分完整本地执行、控制面和远程面板模式。 - 非 ARM64 架构明确标记 Git 仓库订阅、Open API token、2FA、多设备会话和 native runtime 状态,完整执行路径推荐连接远程呆呆面板。 ### 文档与仓库 - README 重写多架构能力矩阵、平台边界、下载说明和构建命令。 - 修正 README 中过期的 ARM64-only 描述和旧 APK SHA。 - 更新项目 INDEX 的版本、fallback 状态、测试状态和 upstream 基线提交。 - 扩展 runtime compatibility,记录发行 ABI 和每种架构的产品 profile。 - 为 v1.0.4 补齐从 v1.0.1 至 v1.0.4 的完整更新日志。 - 更新 GitHub 仓库描述、主页与 topics,突出 Android、多架构、upstream parity、self-hosted 和 task scheduler。 ## v1.0.4 - 2026-08-22 ### Upstream 能力一致性 - ARM64 APK 直接运行仓库内完整 Go Core,覆盖 upstream 呆呆面板的任务、脚本、日志、环境变量、订阅、依赖、通知、Open API、安全、备份和监控业务域。 - Kotlin fallback capability 响应按业务域声明 parity,客户端可以区分控制面 API、Git 订阅、Open API token、2FA、多设备会话和本地 native runtime 能力。 - 非 ARM64 设备保留本地控制面、备份、通知、安全管理和远程面板连接,完整脚本执行可连接远程呆呆面板。 ### 定时任务 - Flutter 多 Cron 表单改为完整换行表达式提交,避免只保存第一条规则。 - 增加定时停止 Cron 的模型、表单、序列化和 fallback 调度执行。 - Go API 增加 timeout、重试次数、重试间隔、停止计划、依赖存在性、自依赖和循环依赖校验。 - Go 执行器在依赖任务缺失时明确终止当前任务。 - Kotlin fallback 持久化并执行 timeout、max retries、retry interval、depends on 和 stop schedule。 - fallback 普通命令增加任务级超时;失败任务按配置重试。 - fallback Cron 支持多行表达式,仅调度 cron 类型任务,并独立匹配停止计划。 - fallback 终止日志统一使用状态码 2,保持成功、失败、终止统计一致。 ### 环境变量与依赖 - fallback 环境变量导入支持 `merge` 和 `replace`,replace 使用数据库事务。 - 同名环境变量按 `name + remarks` 识别,兼容青龙多账号变量。 - fallback 单项依赖删除执行真实 pip/npm 卸载,失败时保留记录与日志。 - Open API 管理页增加 `backup` 和 `notifications` scope。 ### 备份与监控 - Flutter 备份页增加每天、每周、每月定时备份配置。 - Kotlin fallback scheduler 消费同一套 `backup_schedule_*` 配置并生成 canonical 备份。 - Dashboard 前台每 10 秒刷新 CPU、内存、磁盘和任务数据。 - 趋势图按日期升序显示成功、失败和终止三条曲线。 ### 多架构发行 - Go mobile AAR 改为构建 Android 全 ABI 输出。 - 新增 ARM64、ARM32、x86_64 专属 APK 和 universal 整合 APK。 - 架构专属 APK 通过 ABI filter 仅包含目标架构 native libraries。 - universal APK 包含 `armeabi-v7a`、`arm64-v8a` 和 `x86_64`。 - 每个 APK 独立执行正式签名验证并生成 SHA-256。 - `android-update.json` 默认指向 universal APK。 - Device Smoke 构建显式包含 ARM64 与 x86_64 ABI。 ### 验证 - Go test、vet、关键包 race detector、Flutter test/analyze、Kotlin 单测、Panel Web build、route contract 和 runtime scripts 全部通过。 - 四类 snapshot APK 和四类正式签名 APK 均通过构建。 - Release evidence、更新清单和独立校验文件已发布。 ## v1.0.3 - 2026-08-22 ### 修复 - 修复 Android 16 Node runtime 初始化失败后无法重试。 - Node launcher 使用 16 KB page-size linker 参数重新构建。 - 修复 npm 本地 tgz、URL 和 alias 安装后的验证。 - 修复 Open API `app_secret` 查看、重置和 fallback 字段契约。 - Go Open API Secret 使用 SecretStore 可逆封存,历史摘要密钥引导重置。 - 新增 Python、CommonJS、ESM 三种形态的内置 `notify` helper。 - 修复 `/local-ui/` Router base 和 fallback 登录响应契约。 - x86_64 模拟器进入控制面降级模式,跳过 ARM64 runtime。 ## v1.0.2 - 2026-08-21 ### 备份互操作 - Go Core 与 Kotlin fallback 统一 `daidai-panel-backup 0.4.0` canonical manifest。 - 双向支持 `.tgz`、`.tar.gz`、`.json` 和 AES-GCM `.enc`。 - 覆盖配置、任务、环境变量、订阅、SSH Key、通知、依赖、任务日志、Task View 和脚本。 - 恢复时重映射通知渠道、SSH Key、任务依赖和日志任务 ID。 - 选择性恢复保留未选类别,目标设备用户、会话、2FA 和设备凭据保持现状。 ## v1.0.1 - 2026-08-21 ### 稳定发行 - 发布首个正式签名 ARM64 稳定版。 - 修复远程面板切回本地实例时的动态 endpoint 与授权恢复。 - 优化后台轮询、fallback 调度唤醒和 WorkManager 初始化。 - 完善依赖版本、空参数、多账号变量和 runtime 环境保护。 - 完成仓库 README、GitHub 介绍、topics 和 Release 流程整理。 ## v0.4.4 ### 修复 - 脚本调试页面直接显示明文 stdout、stderr 和完整 Traceback。 - 失败状态显示退出码和实际错误摘要,并提供高对比度“错误详情”区域。 - 日志接口新增 `content`、`error` 和 `log_count`,保留原始 `logs` 数组兼容性。 - 面板日志纳入最近脚本运行的真实进程输出。 - 修复 Android Python 子进程因错误 `Py_SetPath` 无法导入 `encodings`。 - 修复 Node wrapper 覆盖 `NODE_PATH`,使自动安装的 npm 包可被脚本加载。 - 新增保守型青龙脚本依赖扫描、常用 pip/npm 自动安装及配套文件缺失提示。 ### 兼容性 - Python 常用导入映射支持 `yaml→pyyaml`、`bs4→beautifulsoup4`、`Crypto→pycryptodome`。 - Node 常见纯 JavaScript 包可自动安装;相对模块缺失返回 `MISSING_COMPANION_FILE`。 - 不支持 Android ARM64 的原生 Python 包返回 `ANDROID_WHEEL_UNAVAILABLE`,不再盲目源码编译。 ## v0.4.3 ### 修复 - 脚本运行改为异步启动,避免长脚本触发 Flutter 请求超时。 - Python、JavaScript、TypeScript 和 Shell 脚本运行期间实时增量显示 stdout/stderr。 - 停止脚本现在会终止实际进程,并返回 `stopped`、`exit_code=130`。 - 未保存代码运行会根据脚本扩展名发送正确语言类型。 - 修复脚本复制请求与 Go 后端的 `source_path/target_dir/new_name` 契约差异。 - 脚本重命名、移动和复制不再静默覆盖已有文件。 - 加强脚本路径校验,拒绝 `..`、系统绝对路径、盘符和反斜杠逃逸。 - 保留 APP 使用的 `/目录/脚本.py` 工作区根路径兼容性。 - 补充任务详情中的 `last_run_status`、`last_run_at` 和 `last_log_id`。 ### 验证 - 用户提供的 `code_20260802-2.py` 在真机执行成功。 - pip 安装期间日志持续增量更新,最终 `exit_code=0`。 - JS/Python/Shell 导入、直接运行、任务运行及变量调用通过。 - Cron、Hooks、通知、依赖安装、备份恢复和管理 API 回归通过。 - Flutter tests 36/36 通过,Flutter analyze 零告警。