NotmyFault 更新日志
alpha-0.16.0
本版本汇总 alpha-0.15.0 之后的更新,包含 alpha-0.15.1、alpha-0.15.2 和 alpha-0.15.3 开发阶段的改动。
规则编辑统一为节点画布,补救流程直接在图中编排;新增等待、规则结束、目录静默等内置插件,并提供可选的 Dashboard 后台驻留。
**不兼容更新:**规则使用 v2.1 平面图,旧条件树、动作数组和旧插件协议不再读取或转换。符合现行结构、编码、协议和签名要求的数据可以继续使用,具体变化见文末。
Dashboard:规则编辑与操作逻辑
自由建块与分组
- 统一使用节点画布,移除普通模式和编辑模式切换。选择节点后,在独立的节点设置侧栏中修改参数。
- 在画布空白处右键即可创建触发器、动作、比较条件、逻辑组、IF 事件组、动作组、等待和变量赋值块,不必先接到已有流程上。
- 支持 Ctrl 多选和框选,将选中的图块组合为 IF/ELIF/ELSE、AND、OR 或 NOT 事件组。组合只改变归属,组内连线由用户安排。
- 嵌套组直接在主画布展开、折叠,不再进入独立的 IF 子流程页面。组内节点可以拖入、拖出;改变归属时断开跨组连线。
- 组标题提供类型切换入口,节点复制、删除、组复制及撤销/重做使用同一套图操作。
- 从已有节点或连线插入新图块时,为后续节点及其组内节点留出位置,修复卡片重叠。
连线、分支与数据传递
- 触发器恢复为独立图块,可以直接连接 IF、ELIF、AND、OR 和 NOT。移除中间分支卡片,条件与动作分别连接对应的输入、出口。
- IF/ELIF 按顺序选择首个成立分支;ELSE 保留唯一出口,不接条件。组折叠时只显示已使用的 ELIF,展开后提供下一个备用 ELIF。
- 控制出口、连线和数据输出提供上下文菜单,可以创建后继、在线上插入节点或断开控制连线。
- 从数据输出端口直接创建比较条件、创建变量并赋值,或给已有变量赋值;有多个执行出口时先选择赋值所在的分支。
- 动作组在侧栏中设置对外输出,组外参数通过这些输出引用组内结果。
- 修复拖线、拖动节点时视口突然居中的问题。边缘自动平移、缩放后的端口命中和取消拖动共用画布坐标。
- 调整组展开、侧栏切换和菜单过渡,减少动画设置下保留直接操作反馈。
条件、等待与参数
- 条件编辑支持 ELIF、其他自动化的运行状态、数据存在性及本次运行中的事件发生情况;绑定选择按参数所需类型过滤来源。
- 触发器可选择“事件发生”或“事件未发生”,设置连续未发生时长、判断范围,以及只触发一次或按时间窗口重复触发。
- 事件组可选择立即判断已收到的事件,或等待事件组合成立后再判断,并设置等待超时。
- 等待使用独立图块和专用表单,秒与毫秒可以同时填写;通用插件选择器和快速创建不再重复列出等待动作。
- 参数表达式 JSON 收入可折叠的“高级”区域,展开后直接编辑
$ref、$convert、$template和$literal。 - 修复大整数输入丢失精度、溢出数字被保存成空值,以及嵌套绑定路径推导类型不准确的问题。
- “规则结束”触发器通过规则列表选择监视目标,显示规则名称和 ID,默认排除自身。
- 修正重复触发设置的读写,界面提供同时运行、运行中忽略、依次排队和取消旧运行执行最新触发四种选择。
测试与运行记录
- 规则测试和局部测试直接使用原图节点与可达路径,支持从指定动作继续或运行到指定节点,并收集所需的前序数据。
- 测试卡片显示事件组的等待过程。取消、超时或完成后更新同一步骤的卡片,清除残留的长时间等待和“正在停止”提示。
- 动作失败后继续观察补救与后续执行,不再把单个步骤失败误当成整次测试已经结束。
- 修复取消请求晚于运行结束返回时覆盖完成提示、重新显示停止中或弹出错误的问题。
- 运行记录按新的运行状态显示、统计和筛选,增加独立的“已补救”分类;步骤保留原图身份、条件结果、选中分支、等待与恢复、组进入与退出等信息。
- 运行详情显示局部测试范围和补救动作组,可从失败步骤返回对应节点,也可定位补救动作组。
- 修复事件流被普通请求的约 30 秒超时中断,避免长时间测试期间丢失实时更新。
补救流程编辑
- 动作失败处理改为画布上的失败连线和补救动作组,创建、定位、断开与编辑都在同一张图中完成。
- 补救节点可以按普通图块拖动、复制、删除和分组,复杂补救可以折叠为动作组。
- 节点设置保留重试、超时及“补救完成后停止/继续”的选择。选择停止时,补救成功后以“已补救”结束;选择继续时,返回原动作的正常后继。
- 原动作的失败步骤始终保留,补救过程和整次运行结果分别展示。
插件状态与桌面窗口
- 插件页分开显示目录扫描结果与本次引擎会话的加载错误,给出插件 ID、类型和具体原因。
- 元数据无法读取的插件显示“无法读取”,不提供启停和卸载;静态检查不通过的插件显示具体检查原因。
- 引擎离线时说明加载结果尚未确认,读取诊断失败时单独报错,不再显示成零错误。
- 增加“关闭后驻留后台”选项,默认开启。关闭窗口后保留页面,再次打开恢复原窗口;关闭此选项后,关闭窗口退出 Dashboard 进程。
- 驻留选择持久保存,引擎离线时也能修改;从引擎托盘退出时,一并关闭驻留窗口。
- 桌面入口按需加载引擎和通知依赖,本机 HTTP 请求不再读取系统代理或加载 HTTPS 证书存储。
- 生产页面等待桌面桥接就绪后挂载,不再误向静态文件服务请求引擎 API;首页复用已取得的引擎状态。
- 移除重复的“引擎已启动”托盘气泡,保留“NotmyFault 已加载”通知,并将 WinRT 通知创建与发送串行处理。
新增内置插件
- 等待
wait:按秒、毫秒暂停当前运行,支持取消和超时。 - 规则结束
rule_finished:在指定规则运行结束后触发另一条规则,可筛选成功、已补救、失败、超时、取消及丢弃或替换等结果。 - 目录静默
directory_quiescent:目录中的匹配文件在指定时长内没有增删改时触发,也可监视重新活跃和状态变化。 - Wi-Fi 连接
wifi_connect:连接或断开指定网络,并回读连接结果。Windows 使用已保存的网络配置;Linux 使用 NetworkManager,可为新网络提供密码。 - 默认音频设备
set_default_audio:按设备 ID 或名称切换默认播放、录音设备,并回读确认;Windows 同步设置通用、多媒体和通信角色。 - 压缩与解压
archive:创建和解压 ZIP,支持取消,默认保留已有目标文件,并限制解压条目数与总大小。 - 环境变量
environment_variable:读取、设置或删除当前 NotmyFault 进程的环境变量,影响之后启动的子进程,不修改系统或用户级永久配置。 - Shell 命令
run_shell:在 Linux 通过固定路径的 bash 或 sh 执行命令,支持期限、取消、输出限制和 stderr 错误摘要。
规则引擎与运行调度
- 编辑器、API、文件读取、编译、事件匹配和执行统一使用
workflow.nodes与workflow.edges,不再转换为内部条件树或顺序动作数组。 - 执行顺序由显式连线决定。事件组、动作组和嵌套组按图进入、返回,未连入路线的图块不计入实际执行动作数。
- 使用
RunManager调度运行,编译后的规则版本管理触发器实例;每次运行有独立的变量、取消信号和事件观察记录。 - 保存规则后直接应用新版本,按配置指纹复用未变化的触发器,避免无关修改重启全部监听。
- 增加事件消费、事件保留期限和分支选择策略,条件期限使用截止时间堆调度;运行期间收到的事件可用于后续条件判断。
- 等待事件时挂起当前运行并释放动作工作线程,事件或期限到达后恢复,不重复执行等待前的动作。
- 轮询采样使用共享调度线程安排,各实例保留独立配置和状态;触发器、条件计时和规则文件监视使用注入的时钟。
- 崩溃触发器按退避间隔自动重启,并限制连续重启次数;旧实例无法停止时限制恢复重试,避免反复创建实例。
- 规则文件内容检查不再只依赖大小和修改时间。连续写入按最后一次内容变化重新计算防抖时间,相同内容不重复应用。
- 热重载失败后保留现行规则并恢复所需触发器;修复手动运行修改冻结规则、规则改名丢失排队任务,以及旧规则版本的排队执行问题。
- 删除规则时清理最近结果,旧运行的迟到完成不能覆盖同 ID 新规则的结果。
- 修复嵌套条件复用旧分支、布尔值与数字混同比较,以及时间单位换算丢失精度的问题。
- 未处理的工作流异常记录异常类型和原始 traceback,运行结果保留明确的失败码。
- 运行结束增加
recovered与run.recovered。规则结束触发器的“任意”包含已补救,默认的“仅成功”“仅失败”不包含,可单独筛选。 - 宿主事件队列满时丢弃旧事件并继续接收后续事件。退出时主动关闭事件流,先结束插件子进程,再完成服务和托盘清理。
- 修复引擎线程结束后状态不恢复、上一次清理未完成时重新启动,以及状态回调持有启停锁的问题。
插件接口与安全
- 公开
TriggerContext、实例状态与时钟接口,以及RunContext、Secret、Blob、action_values和system_clock(),供插件使用运行数据和宿主计时能力。 - 增加引擎事件订阅接口,插件可以直接监听规则运行结束。
- 支持
poll-v1采样工厂,由宿主管理状态变化、重复事件、事件队列、防抖及触发器生命周期。 - 插件加载记录源码摘要,延迟导入和隔离执行复核插件文件;动作、触发器与扩展命令使用经过检查的源码。
- 修复隔离插件覆盖失败后的恢复及扩展会话处理,安装、更新和恢复同步保存用户插件完整性清单。
- 插件元数据类型错误返回具体校验结果,不再导致校验器抛出未处理异常。
- 插件启停统一保存在
config.disabled_plugins,内置和用户插件共用;API 返回的enabled仅为计算后的显示状态。 - 安全模式只保留
strict和permissive。strict 要求加密私钥;permissive 允许缺失或无效签名的插件降级加载,并保留警告。 - 管理员规则审批覆盖补救路线、嵌套组及未连入主流程的有效图块,环境变量写操作纳入规则审批。
- Wi-Fi 密码参数标记为敏感;Linux 通过命令行传递密码时提示其可见性。
- 平台服务增加默认音频设备设置与图片文字识别接口;
recognize_image()调用本机 tesseract 识别已有图片。
内置插件修复与 Linux 支持
- 电源计划支持 Linux 的 powerprofilesctl;
run_powershell明确限定 Windows。 - Linux X11 增加窗口枚举与控制,窗口标题、置顶和窗口控制共用窗口后端。窗口控制依赖 wmctrl、xprop、xdotool 和 xrandr,不支持 Wayland。
- 补充 GNOME/KDE 显示器电源和空闲时间查询、ydotool 套接字查找;缺少
XDG_SESSION_ID时,通过 loginctl 查找锁屏与注销所需会话。 - Linux 电源恢复事件监听 logind
PrepareForSleep(False);系统启动身份使用 Linux 启动 UUID 或 Windows 系统启动时间生成。 - 修复 Wi-Fi 配置名称与实际 SSID 不一致、SSID 含空格、引号、冒号或反斜杠时匹配错误,以及查询失败被视为断开的情况。
- Windows 使用 WLAN API 读取实际 SSID;Linux 按配置 UUID 激活连接,固定 nmcli 子进程的状态输出语言,并按所选网卡确认断开结果。
- 修复目录监视、目录静默、USB 等触发器在事件提交失败前就记录状态的问题,失败后仍可再次报告尚未成功提交的变化。
- 修复网络探测停止后继续使用迟到结果,以及规则结束通知重复触发的问题。
- ZIP 压缩遵守
overwrite,拒绝覆盖源文件或将压缩包写入源目录;解压检查改写后的路径,限制条目数和总大小,并响应取消。 - 文件动作和路径监视保留路径首尾的空白字符。网络动作修复 DNS 与 TLS 握手期间的取消处理、响应长度校验及失败后的连接清理。
- PowerShell 非零退出时附带 stderr 摘要,Shell 使用固定解释器路径,拒绝空白命令。
Windows 安装器
- 按安装标记和文件清单识别、维护安装目录,拒绝把无安装标记的任意目录当成已有安装。
- 全新安装先创建加密签名密钥,再完成 strict 签名构建,修复缺少私钥导致安装中断的问题;升级复用原密钥。
- 修正签名输入字符串格式,统一安装器检查的 UTF-8 输出,失败时输出完整安装日志。
- CI 同时收集构建日志和子进程安装日志,便于定位安装阶段的错误。
- 中断卸载后的用户资源检查改为核对文件内容,确认重试后仍保留用户文件。
官网、文档与开发工具
- 官网更新规则示意、运行记录、插件、安全与设置说明;演示开关不连接本机引擎。
- 下载页保留下载链接与源码运行说明,移除额外的安装包版本提示,更新各页面文案。
- 文档更新 v2.1 规则图、插件协议、数据引用和桌面窗口行为,修复步骤引用中的尖括号导致文档站构建失败的问题。
- 基准工具改用原生规则图、现行插件接口和实际调度器,检查事件分发、步骤执行、规则重载、共享采样与隔离动作。
- CI 增加 Ubuntu Python 检查,并定期保存 Windows 与 Linux 性能结果。
- 删除同步执行备用入口、重复插件加载包装、重复历史写入、未使用画布参数及
.qoder项目配置。
不兼容变更
规则与配置
rules.json必须声明schema_version: "2.1"和value_encoding: "typed-v1",工作流保存为平面节点与连线。缺失编码、旧结构和未知顶层字段会被拒绝,不进行自动转换。- 移除规则顶层
condition、event、trigger、actions、preconditions,以及嵌套的then、elif、else和failure_actions动作数组。 - 移除条件组的
events和type: "and"/type: "or"表达、动作id与steps.<id>引用,以及{{ path }}文本模板。数据引用使用$ref、$literal、$convert和$template。 config.json不再读取rules、processes,规则单独保存在rules.json。普通配置不要求规则编码标记。- 移除用户插件清单
enabled: false到disabled_plugins的转换,以及配置目录根部engine.log的旧清理逻辑。
插件与数据声明
- 动作清单必须声明
execution_api: "context-v1",入口为run_with_context(action_info, params, context);移除两参数run(action_info, params)、execution_api: "legacy"和precondition_api。 - 触发器清单必须声明
trigger_api: "event-v2",入口为run(meta, config, emit_event, shutdown_event);移除event-v1和trigger_api: "legacy"。 action.json、trigger.json不接受enabled字段,包含该字段时校验失败。停用插件改用配置中的disabled_plugins。outputs只接受输出字段的对象数组,移除字符串数组等旧声明形式。- 移除类型别名
integer、boolean、list,以及数组输出的item_type和参数编辑器的accepts_legacy;数组元素类型使用value_type.items。 - 移除显示器控制的
low_brightness、high_brightness操作;文件信息输出使用modified_time,移除file_info.modified_at。
安全与安装
- 移除
normal安全模式,以及NOTMYFAULT_MODE的dev、develop取值。保留alpha对应 permissive,stable、master对应 strict,环境变量只能提高安全等级。 - 移除
official-legacy和旧签名摘要格式。插件元数据使用signature_kind,不再使用signature_source、signature_format;移除inspection_report.signature和sign_plugin的json_name参数。 - 安装器不再识别没有安装标记的旧目录,也不再读取
installer-build.json。
alpha-0.15.0
chore(deps): 固定运行与测试依赖版本
- 固定运行依赖和开发依赖版本,py7zr 使用支持实际解压量限制的 1.1.3。
- 开发环境声明 pytest-timeout,并使用与当前 TestClient 配套的 httpx2。
fix(notifications): 在线程内管理通知并修正 AUMID 注册与快捷方式
- 通知对象在创建它的 WinRT 线程中显示、关闭和释放,报告显示失败。
- AUMID 记录安装目录归属,注册命令使用 Windows 参数引用规则。
- 快捷方式只使用存在的图标,成功写入后再报告创建完成。
fix(platform): 限制剪贴板读取量并核对 Windows 能力依赖
- 剪贴板读取接受字符上限,Linux 后端在达到上限或超时后回收读取进程。
- Windows 能力检查核对 DLL 导出及 Python 依赖,报告缺失接口。
- 音频设备检查使用 pycaw 和 comtypes,仅 WMI 亮度后端标记降级。
fix(config): 保留无法恢复的配置文件并提供规则修订号
- 签名和 Unicode 格式错误转为配置校验错误,按错误属性区分可恢复失败。
- 仅从有效签名备份恢复;没有可用备份时保留原文件并报错。
- 同一存储实例的规则写入加锁,并按文件内容提供修订号。
fix(security): 统一插件扫描并修正签名校验和管理员授权
- 能力与风险扫描共用源码分析,补充动态访问识别和 strict 模式的借用宿主权限检查。
- 分块计算文件摘要,解压同时检查声明大小和实际字节上限。
- 管理员权限绑定已验证入口及其模块,延迟加载使用可重入锁。
- 修正管理员命令引用和异步进程返回值,接受 PEM 与原始 Ed25519 公钥。
- 规则审批不再扫描停用的前置检查,pytest 识别使用已加载入口的代码对象。
fix(core): 隔离无效规则并修正调度、超时和停止状态
- 逐条检查规则与触发器,保留有效规则;全部不可用时等待规则更新。
- 排队任务保留入队时的规则快照,取消成功后才记录替换。
- 动作重试共用总超时,结束时清理取消事件,停止时关闭隔离进程并撤销授权。
- 区分触发器退出与崩溃,停止后忽略迟到事件,单个实例启动失败后继续其他实例。
- 共用引用与参数校验,限制嵌套深度,修正旧步骤引用和半值舍入。
- 记录热重载、历史读取和写入队列错误,保留旧延迟运行记录的读取兼容。
fix(host): 校验规则保存版本并修正插件安装和 API 错误处理
- 规则读写返回 revision,旧 expected_revision 保存返回 409 rules_conflict。
- 普通写入请求限制为 1 MiB,插件上传请求限制为 65 MiB,分客户端和合法 Origin 限流。
- 修复损坏的接口令牌文件,插件安装必须确认全部风险。
- 插件预览与清单更新加锁,退出清理预览目录,卸载前核对备份所属包。
- 更换 AI 服务端点后删除旧密钥,限制响应读取量,扩展繁忙返回 429 并保留会话。
- 修正取消和目录操作的错误状态,由托盘线程释放窗口与图标。
fix(desktop): 容忍托盘启动失败并并行预载 WebView
- 托盘创建或启动失败时清理实例,继续启动引擎与 HTTP 服务。
- 无控制台时直接写日志文件,延迟加载入口依赖。
- Windows 默认后端并行预载 WebView 程序集,指定渲染后端时跳过预载。
- 保留控制令牌写入与窗口关闭的具体错误,移除路径调试输出。
fix(actions): 统一下载期限并修正文件覆盖、桌面操作和 UIA 取消
- 下载连接、重定向和正文读取共用总期限,蓝牙辅助进程等待响应取消。
- PowerShell 退出后读取剩余输出,文件复制与移动默认拒绝覆盖已有目标。
- 修正路径展开、编码错误、截图格式、播放暂停、静音和窗口置顶回读。
- 修正 Linux 功能键、壁纸、关机权限和程序工作目录错误。
- UIA 枚举完整控件集合,报告属性读取与输入释放失败,限制宏文本和等待时长。
- UIA 页面校验消息来源,选择器超时和延迟采集支持取消。
fix(triggers): 修正事件数据、计划触发和平台状态采样
- 剪贴板返回完整文本,空闲事件返回实测秒数,窗口标题保留配置原文。
- 区分启动前错过与运行中跨点的计划,启动延迟使用单调时钟,目录快照使用纳秒修改时间。
- 音频设备与锁屏查询使用 CoreAudio、psutil,连续采样错误限频记录。
- 热键配置与录制要求修饰键,排除锁定键,纳入共用 keys.py。
- 修正 USB 路径、磁盘监控、低电量迟滞、Linux 长进程名和 Wi-Fi 代码页。
- folder_monitor 未声明 event_type 时使用与清单一致的 created 默认值。
fix(plugin-cli): 缺少打包脚本时返回明确错误
- plugin pack 找不到根目录打包脚本时说明完整源码目录要求并返回失败。
- 保留打包模块内部的依赖导入错误,删除未使用导入并修正归档目录说明。
fix(build): 原子写入签名私钥并共用公钥解析
- 签名私钥写入受限临时文件并刷新,再替换目标文件。
- 生成的签名密钥模块复用 PEM 与原始公钥解析,删除未使用的密码学导入。
- 构建流程直接执行已满足前置条件的签名与完整性清单生成。
fix(installer): 恢复中断升级并修正卸载取消、日志和构建
- 移动旧安装前持久保存升级状态,重启后恢复未提交安装或清理已提交备份。
- 卸载支持取消并保留重试目录,按安装归属清理 AUMID,共用快捷方式 COM 访问。
- 失败页使用本次保留的安装日志,新装与升级分别显示启动和重启。
- 共用窗口布局、样式和 DWM 初始化,处理窗口构造、资源打包和字体错误。
- 构建复用暂存版本与图标,结束后清理工作目录并保留日志,扩展安装器 CI 触发路径。
fix(dashboard): 保留规则冲突草稿并修正参数、插件和日志交互
- 保存携带版本号,按规则 ID 与快照定位目标,冲突时保留草稿。
- 恢复时说明敏感值处理,普通与节点模式共用编辑表单和动作运行限制。
- JSON 输入保留格式与光标,类型切换保留完整声明,差异识别步骤顺序变化。
- 修正对话框焦点、编辑器快捷键、画布键盘操作和取消拖动状态。
- 扩展页面仅初始化一次,参数入口共用会话、错误、返回值与焦点恢复逻辑。
- 逐项确认安装风险,索引限定 HTTPS,AI 端点改变后提示重存密钥。
- 共用 Markdown 渲染、权限展示、最近插件和导航,报告连接与日志读取错误。
- 日志复制说明筛选范围,导出全部筛选记录,统一窄屏导航、深色颜色和样式令牌。
fix(simulator): 空窗口标题缓冲区返回零长度
- 窗口标题模拟接口在缓冲区大小不大于零时直接返回零。
test: 拆分触发器用例并补齐签名、API 和调度回归检查
- 从插件场景用例拆出触发器状态测试,共用插件测试辅助函数。
- 补齐 Windows 通知、签名、配置恢复、API 版本冲突和执行调度检查。
- 测试结束后释放静态规则存储,使用受控工作进程和平台替身。
- 更新编码失败异常断言,移除无人使用的 system_input 标记,设置 60 秒测试超时。
chore: 清理忽略规则并移除根目录插件包产物
- 清理重复和无效的忽略规则,统一相关注释。
- usb_copy.nmfp 移到不纳入版本控制的构建产物目录,仓库根目录删除该产物。
chore(version): 更新版本为 alpha-0.15.0
- 项目版本由 alpha-0.15.0pre4 更新为 alpha-0.15.0。
docs: 合入安装与接口文档并记录 alpha-0.15.0 变更
- 合入安装升级卸载、Dashboard、窗口控制、插件签名、规则迁移和数据类型说明。
- 修正过时的 API、命令、测试路径和平台描述,增加正式文档目录。
- 按模块提交分组记录更新日志与兼容性变化,同步公开文档站。
develop-alpha 相对 master 的历史比较
以下保留比较提交 542d6fc 与 master 的早期记录。文件数量、工作区描述和测试结果适用于该次比较。
比较范围
- 基线:
master,ecfa7c7,2026-06-12。 - 分支版本:
develop-alpha,542d6fc,2026-09-01。 - 比较版本号:
alpha-0.15.0pre1。 - 两个分支已经分叉。
master有 8 个独有提交,develop-alpha有 170 个独有提交。 - 已跟踪文件的状态差异为 310 个文件、59195 行新增、1707 行删除,其中包含比较时的工作区里已跟踪文件的修改。
- 未跟踪文件不计入上述行数。“比较时的工作区”一节单独列出尚未提交的变更。
Dashboard 与规则编辑
- Dashboard 从单文件页面改为 Vue 3 和 Vite 项目。
- 页面拆分为首页、自动化、插件、运行记录、安全和设置等区域。
- 规则编辑器支持嵌套条件树、执行前检查、动作顺序执行和动作输出绑定。
- 新增规则草稿、撤销历史、未保存草稿恢复和保存前检查。
- 新增手工试运行、上游数据准备、局部动作测试、停止运行和失败恢复分支。
- 动作可以配置失败后停止、继续或退避重试。
- 运行中心显示步骤时间线、取消状态和经过脱敏的导出数据。
- 插件可以为参数提供编辑按钮和独立扩展页面。Dashboard 不需要认识插件私有数据的内部结构。
- 新增 AI 规则起草。支持流式返回、会话历史、取消、重试、提供商预设和 API 密钥管理。
- 管理员动作和高风险草稿在保存或执行前要求私钥确认。
规则与执行引擎
- 配置和规则分别保存到
config.json与rules.json,并继续使用签名、备份和旧格式迁移。 - 规则支持
event单条件和可嵌套的condition条件树。 - 新增基于
$ref的结构化数据绑定,动作可以读取触发器或前序动作的输出。 - 动作协议新增
context-v1,可以读取运行上下文、上一步结果和规则信息。 - 动作取消协议新增
runtime-v1,等待中的动作可以响应停止请求。 - 触发器新增
event-v2,每个实例拥有独立状态,并按配置指纹匹配事件。 - 新增并发调度器。规则可以限制并发数,并配置重复触发时忽略、排队或重启。
- 新增运行状态和运行记录。引擎会记录排队、执行、取消、失败和完成状态。
- 动作参数与返回值按插件清单生成摘要。敏感字段和未声明字段不会写入运行记录。
- 引擎启动、停止、热重载、触发器线程和扩展会话由独立组件管理。
- 新增隔离动作 worker。插件原生代码崩溃时不再直接带走引擎进程。
插件 API 与扩展能力
- 新增整数版本的插件 API v1。
- 插件可以通过公开 API 访问平台能力、通用原生调用锁、网络地址检查和私有数据解包。
- 动作清单支持执行协议、取消协议、幂等性、输出、平台、入口文件、运行模式和安全声明。
- 触发器清单支持事件语义、事件协议、输出、平台和所需能力。
- 新增
contributes扩展协议。插件可以贡献命令、参数编辑器、页面、私有数据类型和窗口控制。 - 插件私有值使用带包名、数据类型和版本的
plugin_data信封保存。 - 新增扩展会话、命令调用、页面消息和插件资源读取。
- 用户插件从源码仓库移到平台配置目录下的
plugins/。 - 新增
.nmfp插件包的检查、预览、安装、升级、降级、替换回滚和卸载流程。 - 新增插件索引下载与安装接口。
- 插件可以声明安装期构建命令和输出文件。安装前会展示构建风险并要求确认。
- 插件可以按平台声明不同入口。不兼容当前平台的插件会被跳过。
- 插件可以声明所需平台能力。缺少能力时不会执行对应插件。
- 多数内置动作和触发器改用公开插件 API,减少对引擎内部模块的引用。
插件与规则安全
- 插件签名改为 Ed25519,并区分内置签名、作者签名和本机确认签名。
- 第三方插件不再接受旧式本地签名。严格模式会在导入插件代码前验证签名和文件清单。
- 完整性清单会检查文件新增、删除和修改,插件物化前还会再次核对全部文件。
- 插件包会拒绝路径穿越、符号链接和目录外文件。
- 安装前使用语法树扫描动态执行、子进程、网络、注册表、文件写入和原生调用。
- 新增借用宿主权限检查。插件不能通过公开 API 获得未声明的管理员、进程或原生能力。
- 管理员代理核对调用模块、函数对象和允许执行的程序名。
- 管理员动作可以要求规则使用私钥确认,并限制必须写成字面量的参数。
- 插件安装和更新使用临时目录与备份。替换失败时恢复旧版本。
- 安全模式分为 strict、normal 和 permissive。构建信息和密钥状态决定启动时采用的模式。
平台支持
- Windows 仍是主要开发平台。
- 新增实验性的 Linux 桌面支持,包括启动、托盘、通知、剪贴板、音频设备、输入、窗口、显示器和截图后端。
- Linux API 密钥可以保存到 Secret Service。
- 新增平台能力探测。Dashboard 可以显示能力状态,插件也可以据此决定是否可用。
- Wayland 下无法可靠实现的全局热键和窗口标题检测会明确标记为不可用。
- 显示器、截图、窗口置顶、系统动作和设备触发器改用平台后端。
- Windows 原生调用补充
argtypes与restype,跨线程调用共用原生锁。 - 文本转语音等不稳定的 COM 调用移到子进程。
- 键盘输入支持 UTF-16 代理对,输入录制不会保存密码控件中的键盘事件。
本地 API 与桌面后台
- API 后端从单个
api_server.py拆为路由、业务对象、端口和组装代码。 - 路由按引擎、规则、AI、插件、插件交互和设置分组。
- 本地 API 继续监听
127.0.0.1:19198,除OPTIONS外的请求都需要 Bearer token。 - 新增引擎启停、诊断、日志、平台信息和运行记录接口。
- 新增规则检查、管理员确认、保存、手工运行和取消接口。
- 新增插件清单、风险预览、安装、更新、卸载、索引和扩展会话接口。
- 新增 AI 设置、API 密钥、同步草稿、流式草稿和取消接口。
- SSE 事件改由独立事件代理投递。慢订阅者不会阻塞引擎线程。
ApplicationPaths统一计算配置、规则、日志、运行记录、token、AI 密钥和用户插件路径。SignedConfigStore统一处理配置与规则的读取、验签、备份、迁移和原子写入。
内置自动化能力
- 比较提交
542d6fc包含 29 个内置动作和 18 个内置触发器。 - 文件与数据动作包括追加文本、文件操作、剪贴板写入与清空、创建快捷方式和 HTTP 请求。
- 桌面动作包括截图、发送按键、窗口置顶、显示器控制、壁纸、通知和 UIA 自动化。
- 系统动作包括程序与进程控制、音量、媒体、蓝牙、电源计划、锁屏、关机和 PowerShell。
- 触发器覆盖时间与 cron、全局热键、剪贴板、文件夹、进程、窗口、电源、电量、资源、网络、WiFi、USB、音频设备、锁屏和引擎启动。
- 新增文档静默检查,用于确认文件在归档前是否已经停止变化。
构建、测试与文档
build.py统一生成密钥、签名内置插件、签名build.json和验证完整性。- 新增 strict、normal 和 permissive 构建模式。
- Dashboard 增加 Vite 构建、JSDOM 挂载测试和插件扩展页面测试。
- Python 测试统一放在
notmyfault/tests/,比较提交542d6fc包含 52 个test_*.py文件。 - 新增插件 API、插件扩展、插件打包、规则格式、运行摘要、API 后端和原生调用安全文档。
- 开发依赖、平台依赖和 pytest 选项改由
requirements-dev.txt、requirements.txt与pytest.ini管理。
比较时的工作区
- 插件管理页按内置和用户安装分组,并增加动作/触发器筛选、列表详情切换、权限、版本、包名和可用状态展示。
- Dashboard 在
pywebviewready事件到达后立即刷新引擎状态,不再等待下一轮定时查询。 - 首页、运行记录和设置页删去重复说明,运行筛选区和窄屏插件列表重新排版。
- 五个分散的 UIA 动作合并为一个内置
uia_automation动作。 uia_automation通过参数选择控件操作、切换窗口、读取文本、等待控件和执行操作宏。- UIA 选择器、键鼠录制、回放和扩展页面全部归入内置插件目录。
- 宿主不再包含 UIA、键盘、鼠标和录制实现,也不再提供对应的专用插件 API 入口。
- UIA 选择器和操作宏改用插件私有
plugin_data。Dashboard 只提供通用编辑入口。 - README 和开发文档中的失效测试路径已经修正。
迁移与不兼容变更
- 旧的
notmyfault.engine、notmyfault.api_server、notmyfault.app和相关单文件模块已经拆到core/、host/、security/与platform/。引用内部模块的代码需要改用新路径或公开插件 API。 - 用户插件目录改为平台配置目录下的
plugins/。源码仓库中的user_plugins/不再是运行时安装位置。 - 规则从配置文件中拆到独立的
rules.json。启动时会处理旧格式迁移,迁移后应保留配置目录中的签名和备份文件。 - 第三方插件需要满足新的清单字段、权限、签名和文件完整性检查。旧式本地签名不能继续用于第三方插件。
- 使用
isolated的动作不能声明运行时取消协议,管理员动作也不能使用隔离模式。 - 旧 UIA 动作
uia_control、uia_focus_window、uia_read_text、uia_wait和uia_macro已移除,不会自动迁移。规则需要改为uia_automation并重新选择控件或录制操作宏。 uia_selector不再是宿主参数类型。UIA 数据由uia_automation插件以plugin_data管理。- Linux 支持仍处于实验阶段。Wayland、桌面环境、驱动、权限和外部命令会影响插件可用性。
- Dashboard 构建需要 Node.js 18+;从源码运行仍需要 Python 3.11+。
比较时的工作区检查
uia_automation清单、平台和权限检查通过,未发现借用宿主权限。- UIA 插件测试 69 项通过。
- 宿主插件边界相关测试 141 项通过,1 项跳过。
- Dashboard 构建、挂载测试和插件扩展页面测试通过。
- API 后端验证命令成功收集 71 项测试。
git diff --check通过。