找不到动作
ACTION_NOT_FOUND 表示执行器在当前页面注册表中没有找到这个 id。它通常不是模型“不聪明”,而是声明、快照或命名发生了变化。
常见原因
| 原因 | 表现 | 修复 |
|---|---|---|
| 动态 id 拼错 | 行主键或分隔符不一致 | 统一由同一个函数生成 id,并测试 |
| 动作在未挂载区域 | 弹窗关闭后仍调用 | 关闭时移除注册,调用前重新描述 |
| 页面已导航 | 旧快照里的 id 在新页面不存在 | 导航后重新 describe |
| 命名空间冲突 | 两个组件用了相同前缀 | 使用唯一作用域或命名空间 |
| 构建缓存 | 页面旧 bundle 没有新动作 | 清理缓存并核对构建版本 |
| 只读快照过期 | 记录或区域变化后仍用旧 id | 限定快照生命周期,变化后刷新 |
排查顺序
- 从当前调试快照复制 id,不要从聊天历史复制。
- 查看该动作是否出现在工具列表中;不存在则检查声明位置与
v-if/ 条件渲染。 - 检查折叠动作的目标记录是否仍在当前可引用集合中。
- 检查路由与模态框状态。
- 检查是否启用了 namespace,调用方是否遗漏前缀。
- 用页面内助手执行同一动作;若也失败,问题在页面声明。
动态 id
推荐:
ts
const toggleId = (taskId: string) => `toggle@${taskId}`;避免在不同位置分别写 `toggle-${id}`、`toggle@${id}`。id 是协议契约,不是展示文本。
如果 id 依赖列表位置(row-1),排序或筛选后就会指向另一条记录。应使用稳定业务主键。
快照与导航
动作存在不等于永远可用。导航后,旧页面的 registry 可能已经销毁,新页面还没有挂载。外部客户端应在页面身份变化后重新 describe,不能继续使用旧能力。
SPA、MPA、iframe 与 Shadow DOM 的边界见 连续性与投影参考。
减少复发
- 为每类动作写唯一 id 生成函数;
- 在测试中断言 id 与记录 id 的对应关系;
- 导航和关闭弹窗后断言旧 id 不可调用;
- 构建后在调试面板确认工具清单;
- 不要把“动作不存在”解释成权限拒绝;两者恢复策略不同。

