飞书 Bridge 产品模型
产品入口与对话契约
飞书是产品面向用户的主要交互入口,包含私聊请求、群提及、话题追问、管理卡片与权限 响应。CLI 和 MCP 继续提供控制及集成入口,普通飞书用户不需要先掌握终端操作。
一条飞书消息可能打开管理、触发控制操作、记录成员讨论,或排队提交 Agent Turn, 并不总是创建 TaskRun。机器人级 singleton、话题绑定和实验性的群 singleton 具有 不同复用范围。Session 模型定义身份与边界, Task 模型定义委派与持久实例。
群协作访问、消息处理方式(thread|singleton)和强制 Linux 用户隔离是独立设置。 协作话题内未提及机器人的成员讨论可成为有限上下文,但不启动新的回答。显式命令仍受 场景、Agent 能力和绑定控制权限检查约束。
飞书命令参考从命令和帮助注册表及双语管理词表 生成。展示命令不等于授予执行权限。自然语言委派或定时请求需要 Agent 工具,并应以 真实记录核实;话题不支持 /schedule 和 /sched。
群设置沿用 builtin 专家的调用方默认引擎时,模型选项读取该引擎的模型目录, 包含动态发现的原生模型和模型服务选项;默认项仍保留调用方预设的模型。 显式选择引擎时使用所选引擎的模型目录;旧版 Profile 沿用自身引擎时仍保留其模型限制。
Bridge 职责
Agent 可通过 amux.feishu_send_message 使用当前 Session 绑定的 Bot 在群内发送纯文本或 Markdown;禁用私聊发送。 format 默认是 text;设置 format=markdown 后,text 正文封装为飞书 post 的 md 节点,新消息与回复均支持。Markdown 源文保持原样,渲染遵循飞书支持的语法, 不承诺完整 CommonMark/GFM 支持;不下载或上传图片。两种格式编码后的消息内容均限制为 20 KiB,包含富文本封装。 Hub 校验调用方 Session 凭据,并解析唯一的有效 Bot 绑定(话题、群 singleton、Bot singleton 或文档评论 Session)。工具不能选择 Bot 或其它 Session;未绑定、绑定不明确 或冒用其它 Session 时拒绝发送。凭据保留在 Hub。目标必须显式指定:群 receive_id 及 receive_id_type=chat_id,或要回复的群消息 ID;拒绝用户类型的接收者 ID。发送前 Bridge 使用绑定 Bot 查询目标会话,回复时先查询原消息所属会话,且只接受飞书 chat_mode 为 group 或 topic。私聊、未知类型、元数据缺失或查询失败均拒绝发送。 此限制仅适用于该 MCP 工具,普通 Bridge 输入与回复路由保持原行为。接收者权限与 Bot 群成员资格由飞书校验。发送是外部副作用,Agent 须已获得用户对目标与内容的授权。成功返回飞书消息 ID;可选 uuid 使用飞书有限时间内的 去重能力,重试须保持相同 uuid、目标、格式与内容。发送错误直接返回,不回退到用户身份或其它 Bot。
可选 Bridge 拥有飞书/Lark API 行为、消息路由、Bot 命令、thread 与 workspace 绑定、 权限和输出呈现。它不拥有智能体执行,也不改变本地 CLI 的要求。
群值守与文档评论的执行覆盖遵循所选 Runtime 的模型策略。没有 Runtime 覆盖时, 遵循 Profile 模型策略:省略 supported_models 允许原生模型名;显式列表将选项限制 在列表内;显式空列表仅允许 Agent 默认模型。CLI 校验与 Bridge admission 使用同一规则。
Operator 通过官方应用注册流程配置 Bot Profile。Setup 申请已实现能力所需的权限和 事件。Personal 与 Team 治理独立于系统托管拓扑控制访问。Owner 操作与普通对话动作区分。
仅 Owner 可操作的「实验功能」页提供长会话完成通知、群独立配置与 Agent 记忆 三个独立开关,默认均关闭。 Agent 记忆使用安装级 memory.enabled 配置,无需 Agent Profile。 非用户隔离模式下记忆跨 Runtime 全局共享,用户隔离模式下按有效 Principal 分开。 页面展示已保存值,并为与当前运行值不同的实验逐项标记待重启。 保存前校验整个表单,在一次原子写入中更新已提交的实验并保留无关配置;旧卡片 缺少记忆或群独立配置字段时,在同一文件锁内保留其最新已保存值。保存不会改变 运行行为,Owner 需单独确认系统重启,取消重启仍保留设置。开启并重启后, 新对话可使用记忆,旧的非受管对话不会自动接入。关闭会保留记忆文件,也不能清除已进入对话上下文的内容。 卡片标题不增加单独的记忆用量计数。
接受的消息映射到工作区和 Session。Session 输入进入队列;thread 上下文有界,并附在 已接受的提交上。智能体进度、工具活动、结果与权限提示均从结构化事件渲染。 Bridge 不从展示文本推断 Provider 语义。
提交到已绑定 Session 的定时 prompt 进入正常输入队列,并在调度执行时启动 Agent Turn。 规范事件保留 scheduler 输入来源,允许它与其他已接受输入一样展示进度、权限提示、 错误和最终结果。prompt 回显只是展示流程的一部分。没有已接受输入的 Provider 启动 输出仍被屏蔽。Schedule 的 ok 表示提交成功;实际执行结果以 Turn 终态事件和结果为准。
每个绑定的 Session launch 只有一条活动输出流。并发绑定、输入路由和 Session-added 通知复用该流及其 readiness、turn 状态和卡片句柄。重复启动通知不能冻结已有进度卡, 也不能把同一 turn 的结果放到新卡片。Session 或 launch 身份变化、binding 迁移以及 流已结束时仍会建立新 attachment。新建 Session 可从首次 Hub 快照补齐身份而不替换活动流。
Agent 回复卡片将状态、专家/模型、耗时与用量集中在可折叠的执行摘要中,不增加独立 标题栏;流式输出、完成和紧凑降级均沿用这一布局。模型使用可读的目录名称, 不展示编码后的服务引用。 主卡与子卡标题使用相同的结构化用量摘要。已知上下文窗口时,最新调用总量显示为 22.8k tokens (8%),否则省略百分比。报告缓存输入时,Provider thread 的原生累计 输入显示为 累计输入 300k/343k(缓存/总量);没有缓存输入值时显示 累计输入 343k。 累计输出显示为 累计输出 12k,两者单位均为 token。计数按数量级自适应选择单位, 让长期累计的数字保持可读:一百万以下用 k,十亿以下用 M,再往上用 B (128.4M、12.3B)。缩放后的数值保留一位小数并省略末尾的 .0,且不向上进位, 因此 999999 显示为 999.9k 而不是 1M。显式零值保留,缺失的累计字段省略, 不从最新调用推断,也不累加更新。上下文占用继续使用最新调用,与累计消耗独立。 可选的首 token 延迟和 token 速度仍包含在摘要中。CardKit 与旧版卡片共用这些规则; 用量更新不会让每个事件帧都触发卡片刷新。
群值守接受允许的根消息,内容可以是文本、有效图片、文件或合并转发。 纯素材消息使用共享解析器的描述作为 Session 输入。已删除消息及无有效文本或素材的 消息不创建 Session。既有发送者、群、去重、容量和防循环规则继续适用。群值守是由 Bot 负责人授权的自动化:消息绑定、审计和上下文保留真实发送者,Session 的执行身份与 actor credential 使用已确认的 Bot 负责人,因此 Principal 级模型服务登录与配置者一致。 未配置负责人时拒绝启动群值守任务,不回退为告警发送者身份。
每个值守群在私聊值守列表和群设置卡中都有负责人专用的设置入口。编辑器保存独立、 带版本号的 group_watch.chat_settings.<chat_id> 记录,包含启停状态、继承/自定义任务配置、 专家、运行引擎、模型、思考强度、处理过程展示、活跃会话上限(1–500)和自动休眠 (60–604800 秒)。保存只影响当前 Bot 的这个群;没有独立记录的旧群继续使用原有 Bot 级值守默认值。继承任务配置使用目标群普通会话的默认值,自定义配置只覆盖执行选择。 全局暂停保留为总开关;暂停的群不参与实时接入或历史轮询。执行参数和休眠时长只影响 新 Session,容量检查和处理过程展示读取本群当前策略。完整草稿原子校验保存,过期卡片 拒绝覆盖新值。值守设置本身不要求开启群独立会话实验,但继续遵守该实验已有的接入和 隔离约束。
群值守的 sender_types 是有效配置中各值守群的默认发送者白名单。 chat_sender_types.<chat_id> 可为单个值守群覆盖该白名单,使同一个 Bot Profile 可以在一个群只接收 App 告警,在另一个群只接收用户消息。覆盖项不会自动把群加入 值守;对应群仍必须出现在 chat_ids 中。未配置覆盖的群继续使用 sender_types。
可选的报警去重只作用于 App 发送的群值守根消息,默认关闭。Bridge 根据发送 App 和 规范化后的卡片可见文本生成稳定指纹,优先采用 Rule ID 与卡片标题;窗口从确认创建 Session 开始计算,被抑制的消息不会延长窗口。原子持久化预占阻止不同根消息并发创建; 容量或策略拒绝会释放预占,Run 失败后只有 Runtime 确认该名称的 Session 不存在才释放。 Runtime 不可用时保留待确认状态;至少一分钟后,后续同类报警先查询 Runtime 再决定是否 重试。只有 running、idle、sleeping 状态证明启动完成,created 仍保留待确认。 找回的 Session 若已有持久化输入回执则抑制重复;否则复用原话题和 Session 提交新的同类 报警,不再创建 Session。输入提交成功后才确认去重窗口,起点为已确认的创建时间 (恢复时使用恢复确认时间)。Submit 发出前先持久化派发标记;如果响应或本地回执丢失, 从派发时起抑制同类报警一个配置窗口,不自动重放结果未知的提交。窗口结束后新的报警 可正常启动。尚未派发输入且已 archived/failed 的 Session 会释放预占,不会永久阻塞。 用户消息和不同群互不影响, message_id 去重仍先于报警语义去重执行。实时 Bot Open ID 与历史 App ID 通过完整群 Bot 目录统一成 App ID;开启此功能需要 im:chat.members:read 权限。查询失败、不完整或找不到 发送者时返回错误,不消耗消息 ID。纯图片、文件、音频、视频和转发消息的占位文本不作为指纹。
App 发出的根告警如果只 @ 人,仍可触发群值守。@ 当前智能体继续走普通路由; @ 其它智能体的 App 消息不自动处理,同时 @ 人和智能体时也不接管。 实时事件与历史轮询遵循相同规则。事件中明确的提及目标类型作为判断依据; 平台未提供类型时(例如历史消息),Bridge 使用当前群的完整机器人名单核对目标 ID。 该查询需要 im:chat.members:read,不依赖是否开启智能体协作,每轮轮询每群复用一次查询。 名单查询失败或不完整时,不提交身份未确认的消息并报告错误;这些消息仍可在回看窗口内 由后续轮询处理。不含模糊提及的消息不需要该查询。
普通对话、实时群值守事件和历史轮询通过同一路径收集素材。 每条消息拥有自己的收集上下文,轮询批次中附件不会串到其它消息。 素材获取使用当前 Bridge 应用身份和所属群,各入口共享 Session 能力、大小限制、 文件物化和错误提示。仅展开合并转发容器返回的后代消息。 只有飞书明确报告后代与容器属于同一群,才可使用后代原始消息 ID 获取资源; 否则仍以顶层容器 ID 获取。
Agent 产出的 outbox 成果独立遵循飞书消息上传限制,不与输入素材共用大小限制。单个文件最多 30 MB,每轮最多 10 个文件、合计 300 MB。识别为图片且不超过 10 MB 时使用图片上传接口并保留 图片展示;超过 10 MB、但不超过 30 MB 的图片改用文件上传接口发送。
Linux DAC 文件交换要求 helper 支持 session-file 操作。旧 helper 不支持时,输入附件和 输出成果均明确提示联系管理员升级隔离组件,不得误报为文件位置或大小问题。读写失败 在运维日志中保留底层诊断,并关联目标 Runtime、Session、launch 和文件名。 helper 通过自身固定的 worker 入口,以 principal UID 执行文件交换,不依赖 Profile materializer 的版本。
Bridge 状态按职责分组为 controller、store 和 API port。路由与应用装配仍在 Bridge; 所有权调整保留事件顺序、流生命周期、权限和发行版 hook。
新工作区默认使用 builtin/codex。Bot 可以选择可用的 Profile 与 Runtime。 公共品牌指向 amux 官网 https://amuxos.com/。委派协议保留稳定标识 urn:amux:protocol:feishu-external-bot-delegation:v1,不随官网地址变化。 外部 Bot 发现和新建委派要求与当前群存在活动 binding,不允许跨群发现。 既有委派工作可使用已记录的对端身份完成。
公共发行版不包含旧控制台自动化,也不读取其它工具的网页登录缓存。 Operator 可以使用官方注册流程或手动配置应用。 官方注册流程默认在新应用的说明中预填 Powered by amux,跳过能力自动配置时也适用。 这句品牌文案在英文和简体中文中保持一致,用户仍可在创建页面修改。
独立维护的发行版可在 Bridge 首次使用前注册一个扩展,提供 Provider 呈现、协调 Profile 识别、旧默认值的事务性迁移,以及显式控制台 setup 回退。 首次使用后注册不可变,重复注册报错。这些 hook 不改变 Session 执行、canonical 事件、访问校验或默认官方注册流程。发行版特有实现和 Session 缓存路径属于发行版 module;公共 Bridge 无需它们也可独立运行。
会话扩展通过绑定到具体会话的能力提交和读取后台 Task。Bridge 校验 Bot/话题绑定, Hub 按准确的 target 和 Session 解析已冻结的 Principal、授权关系及隔离 backend。 提交、读取以及重启恢复时重新校验授权;绑定缺失、变化或任务身份不匹配时拒绝。 这些独立 Task 可在 parent Turn 完成后发起,不认领活动 parent Turn、不通知 parent, 也不接受调用方指定执行身份。未开启 Principal 隔离时仍支持宿主模式会话。
Parent 活动卡汇总协作任务,不把其输出混入 parent Agent 的过程面板。 每个新发现的任务在每个 Bridge 进程内创建一张子进度卡,原地更新至终态结果。 标签由短 Profile 名加 Persistent Agent Instance ID 的前八位组成;普通任务使用准确 child Session ID,child 创建前临时回退到 TaskRun ID。Profile 标签去掉命名空间与版本, 缺失时回退到 Agent Type,再回退到 agent;身份后缀去掉 agent- 或 task- 前缀。 卡片显示状态、Profile、耗时和已知的有效模型。身份与模型来自同一 target 上的准确 child Session,不能取自 parent 或输出文本,并在终态清理后继续显示。
子卡只按工具 ID 聚合自身脱敏的结构化工具活动,在独立过程面板显示 TaskEvent 输出。 可附带 child Session 自己的只读查看链接。CardKit 创建失败时回退为一张旧版交互卡, 后续更新继续原地 patch 该卡。
Child 用量仅来自对应 TaskRun 的结构化 usage 事件和最终 TaskResult.usage_json。 基于 sequence 去重,确保 replay 和终态清理期间保留最新用量。 每张卡展示自身 child Provider thread 的累计快照;persistent child 复用 thread 时, 可能包含较早 TaskRun 的用量,不包含 parent 或其它 child 用量。
Parent turn 期间约每两秒发现一次任务,turn 结束时再做最后一次发现。 每个 watcher 从 sequence 0 重放 TaskEvent,断线后从最后序号继续,不重复事件。 状态、权限和结果立即更新子卡,输出更新按两秒合并。 Watcher 可在 parent turn 结束后继续存在,直至 child Task 终态、超时窗口到期或进程退出。 Parent 摘要保留约三十秒的刷新节奏。
对话控制与文档评论
/compact、/clear 和原生 /skill 选择器当前要求 Codex 兼容 Session。 compact/clear 提交排队控制;interrupt 路由到当前 Session,不代表取消全部关联 Task。 Session 模型定义普通追问何时注入当前 Turn、何时排队, 以及文本合并。相关输入路径见 internal/bridge/ 下的 router_control.go、 router_submit.go、coalesce.go、steer_target.go 和 skill_picker.go。
文档评论接入单独启用。在读取文档或启动执行前,要求真实提及机器人、已确认负责人 以及负责人访问权限。群协作不会把该能力授予其他成员。绑定按机器人、文档和根评论 区分,同一评论串中的后续提及复用该绑定。接入读取具体请求与可获得的有限文档上下文, 对事件去重并回复评论,本身不修改文档正文。权限卡发送给发起负责人的私聊,并在评论 提示前往处理。读取、启动或提交失败都有显式处理;仅启用设置不证明平台权限或订阅 已经可用。实现见 internal/bridge/document_comment.go。
群独立配置
群独立配置是实例级实验功能,默认关闭(bridge.feishu.group_settings.enabled = false)。 负责人通过私聊 /amux → 实验功能开启,选择“保存并重启”。保存只更新配置文件; 运行中的 Hub 保持启动时的开关,重启后生效。关闭时群编辑、旧卡片回调和本机运维 命令不可用。已保存独立设置的群暂停新输入和自动任务,不回退 Bot 默认,也不降低 隔离要求。群配置、Session 关联和已接受任务的输出保留;重新开启并重启后恢复 已保存的策略。未保存独立设置的群和私聊继续沿用既有 Bot 行为。
每个 (bridge_id, chat_id) 可独立设置处理方式、Profile、Runtime、模型、思考强度、 过程展示、target、cwd、参数、空闲超时、上下文条数及会话配额。负责人从有效 Bot 和工作区配置创建完整草稿,保存采用原子事务和版本校验。群未保存独立配置时保留 Bot 级行为。群访问模式与话题/连续会话模式、执行隔离分别管理。
新话题使用保存的群执行参数。Runtime 使用 Profile 默认值时也校验并落实显式思考 强度,仍遵循 Profile 的模型/Provider 选择与模型策略。显式 /run 选择和绑定 Session 保留自身身份;修改默认值不会改变已有 Session 的 Profile 或执行配置。要求隔离时, 不得静默降级或通过绑定旧执行绕过。
Linux 隔离能力与飞书会话的隔离选择相互独立。新建普通话题和连续会话显式选择 passthrough;隔离话题选择 linux-dac,不可用时拒绝启动。该选择遵循有效群设置, 私聊和未配置群使用 Bot 默认值。启用宿主隔离能力不会自动隔离所有飞书会话。 宿主要求可识别身份时仍保留执行 Principal 和 actor credential;passthrough 只改变 进程隔离方式,不改变执行授权。已有或显式绑定的 Session 保持冻结的执行环境。
群连续会话按 Bot 和群各维护一个 Session。回复、进度、权限请求和产物直接发送到 该群,与 Bot 连续会话的输出方式相同。新输入和显式指向输出消息的回复进入同一 队列。首次输入只作为内部绑定锚点,不作为话题输出目的地。不同群和私聊不共享 Session。改变模式或负责人新开会话会退役旧默认关联,已接受任务继续完成。 回复已退役入口时提示新开话题;普通已有话题关联仍可使用。
启用 Principal 隔离时,群连续会话和 Bot 连续会话都要求 Bot 作用域的 service:<bot-profile> alias,以及发起者的有效 service membership。个人话题身份 注册不会自动建立共享执行身份,群的 shared 访问模式也不授予 membership。 运维人员应在启用隔离时配置这些前提,见 Linux 隔离指南。
群值守的资格和继承执行参数遵循目标群策略;显式能力执行覆盖仍须满足群隔离要求。 完整设计及状态转换见实现规格。
模型服务选择
发行版模型服务显示在所支持引擎的模型选项内,标明当前操作者的已登录、未登录、 登录中或登录失效状态。可选服务依赖缺失时显示「待安装」、发行版提供的安装指引和 「重新检测」按钮;声明支持安装的服务还显示「一键安装」。查看、选择或重新检测服务 均不安装软件。只有安装动作在 Hub 启动依赖安装,卡片轮询显示进度;完成后显示 登录入口,失败可重试,保留编辑草稿。 选择未登录的服务启动该服务 SDK 登录;有效登录直接复用。 卡片仅携带登录链接,不携带凭据或 challenge token。登录后展示完整可用的上游 模型与配置组合及思考强度。登录不保存或切换执行引擎;修改默认设置仍只影响新会话。 其他用户或共享执行 Principal 不会自动继承编辑者的个人凭据。 登录控件紧邻模型选择器并反映当前登录状态。选择服务入口或刷新登录时保留尚未保存的 模型和思考强度。已登录服务的模型紧接其入口集中展示,名称简洁且区分模型配置, 已有保存的模型引用保持可用。
切换到不同 Runtime 时,设置草稿清空原 Runtime 的模型和思考强度;未选择模型时使用新 Runtime 的默认值。刷新相同 Runtime 时保留草稿。切换也会刷新可选模型服务控件。每个服务动作使用独立的卡片控件名称, 使安装、重新检测按钮和多个服务可以同时显示。即使可选服务仍待安装,保存仍提交当前 选中的 Runtime。
设置编辑器先展示当前草稿,再异步加载模型。相同卡片的普通编辑在 30 秒内复用模型快照; 快照按当前飞书用户、解析后的执行身份与环境、目标、启动程序和 Runtime 目录隔离。 并发编辑共享查询;显式刷新、登录/安装和切换 Runtime 绕过快照。缓存只保存选项和状态, 不保存 Provider 凭据或可执行回调。临时刷新失败保留最多五分钟内的选项,不改变当前草稿; 明确的未登录结果移除对应来源的选项。迟到的结果不能覆盖更新的编辑、已保存设置或其他 页面。加载和失败状态均覆盖中英文。
发行版默认值迁移
发行版声明已退役默认 Profile 的精确旧值到新值映射。Bridge 负责受影响表、 参数化更新和事务。映射同时生效,保留无关设置与历史 Session 身份,并保持 幂等;迁移目标不能同时出现在迁移来源中。
管理卡片更新顺序
每次管理卡片交互使上一页面尚未完成的结果失效。检查更新和模型发现可以在后台完成, 但检查中、成功和失败卡片写入前必须仍属于当前页面。取得卡片投递锁后校验版本, PATCH 失败后补发私聊卡片前再次校验。已经发出的请求先完成,新页面通过同一把锁随后 写入。导航仍使用原有的回调提示和异步 PATCH 投递。
管理升级恢复
管理升级在失败后仍能找到当前安装的 CLI,即使运行中的 Hub 可执行文件已被移动到 随后删除的备份目录。查找时使用安装记录和默认二进制目录作为回退;失败日志保留 有长度限制的 CLI stderr 尾部,供管理员定位实际原因。
管理界面语言
/amux 产品文案通过稳定键管理, 由公共中英文文案库提供。模板插入运行值,但不翻译用户填写的名称、路径、标识符、 诊断原文或 Agent 输出。文案库校验键与参数一致性,公共格式化机制负责复数与回退。
管理卡片使用 JSON 2.0 的局部 i18n_content,回调提示使用 i18n,随查看者的 飞书/Lark 客户端语言显示。JSON 2.0 不支持全局 i18n_elements。 不支持的客户端语言回退英文。/amux 概览提供自动、英文和简体中文选项,按 Bot/用户持久化。 明确选择作用于服务端确认的私聊管理卡片和私聊会话卡片,包含按话题隔离和连续会话模式; 共享卡片和升级前的旧卡片保持按查看者语言 自动显示。重新发送 /amux 可让新卡片应用偏好。此偏好不改变 Agent 回复语言。权限卡片发送失败时,纯文本补发使用已保存语言; 自动模式下补发同时包含中英文,因为纯文本无法按查看者语言选择文案。 首次发送、原位更新、确认弹窗、异步结果和重启恢复遵循同一语言策略。 回调值和执行授权与语言无关。
依据:飞书卡片多语言规范 及 SDK 回调 Toast.I18nContent 契约。
平台无关的格式化模块位于 internal/i18n,Bridge 产品文案位于 internal/bridge/locales/{en,zh-CN}.json。新增文案时在两份资源中使用同一语义键, 将动态值作为模板参数传入。渲染接受明确的产品文案或原文字符串,不以用户内容查询翻译。 英文计数文案按需提供单数形式。测试比较两种语言的渲染结果,校验回调参数不变、卡片体积、 偏好持久化、共享卡片隔离以及更新失败后的补发。CLI 与桌面端覆盖另见 产品语言模型;Agent 生成内容保持原语言。
会话与子任务卡片同样使用按查看者语言显示的原生翻译,覆盖状态、耗时、用量标签、 问题与补充标题、计划、执行记录、处理过程与最终结果标题、完整输出入口及超长降级。 私聊会话卡片优先采用接收者已保存的语言偏好,自动模式跟随客户端语言;共享卡片始终 按各查看者的语言显示。每张 CardKit 卡片固定已验证的接收者和语言,重试及后续更新 不会把个人偏好应用到群聊。偏好变更作用于新卡片,历史卡片保留。 产品标题与 Agent 流式正文分开,CardKit 文本更新不会覆盖翻译或改写 Agent 原文。 活动区替换及旧路径的活动卡片保留同样的翻译;处理过程截断使用语言中立的省略符。 不追溯改写已发送的历史卡片。
Codex 设置编辑器从实际执行 Runtime 刷新原生模型选项,与可选模型服务独立。 刷新按钮可重试获取;未登录或不可用时不展示静态 GPT 兜底列表。刷新失败保留 已保存的模型和推理档位。
原生目标
源码已实现;真实飞书端到端验收待完成。
只把消息开头的裸词 goal 识别为正式命令,/goal 不是同义入口。 命令包括 goal <目标>(创建并启动)、goal(查询)、goal pause、 goal resume、goal clear、goal set <目标>(显式替换)和 goal budget <正整数 tokens>。未完成的目标不能被隐式覆盖,不自动设置预算。 状态、token 用量和执行时间以原生 runtime 为准。恢复保留原生累计用量; 更改目标描述时遵循 provider 的计量语义。清除目标保留会话历史。
能力根据实际运行的 provider 发现。Codex 兼容 app-server 使用 thread/goal/get 探测;不支持的方法、关闭的 feature 和无效响应均不开放功能。 其他注册的 structured provider 通过 pkg/extensions 导出的 GoalController 及 NativeGoalTurnProvider 接入。Claude SDK 和 Pi 目前没有原生目标 adapter, 不展示目标帮助或操作。不能根据 Agent 名称判断能力,不注册原生 /goal 斜杠菜单。
话题模式的控制操作作用于已绑定的 Session;只有创建目标可以通过正常准入流程 启动并绑定新话题。bot singleton 模式的目标属于跨聊天共享的 bot Session。 输出固定在创建位置,在其他位置查询不会移动输出。显式替换目标会建立新的输出 位置,并使旧卡片按钮失效。创建和替换接受纯文本目标;附件及明确引用的材料应 通过普通跟进消息补充。原生会话历史仍可用,目标控制不会注入飞书话题历史。 原有 mention、负责人和群访问规则继续生效。
每次原生自动续跑都必须匹配持久化的有效目标授权、原生会话及目标描述,并由唯一 runtime owner 接纳。每次续跑分配新的 canonical Turn,使用正常的终止事件、 传输重放和 watchdog,不继承本地专家编写权限。待处理的用户输入优先。 只有匹配持久化输出位置的目标 turn 可以在飞书展示,其他异常 turn 保留隔离。 启动期间的通知等待 owner 接管。暂停先撤销续跑授权,再取消原生执行;清除同时 删除授权和输出位置。普通输入抢占保留目标授权,在输入队列结束后可以恢复因此 暂停的目标;显式中断和 goal pause 撤销授权。原生 blocked、usageLimited、 budgetLimited 和 complete 状态不会被自动恢复。owner 断开时不能接纳新的续跑; 如果隔离导致原生目标暂停,重连后使用 goal resume。
目标观察使用 session 级 canonical 事件及 sticky 快照,Attach 追平时恢复。 状态卡展示原生用量、预算和时间,覆盖英文与简体中文。卡片修改操作重新检查 权限、当前 Session 身份、输出记录代次和原生目标身份,旧卡片不能控制替换后的 Session 或目标。
Goal 权限请求沿用与该 Turn 回复相同的冻结绑定。审批按钮使用 Card 2.0 的 column_set 和 callback behavior,超长请求压缩后仍保留合法按钮,不生成已废弃的 action 容器。 已接收的普通输入会原子取消待处理的 goal 接续准入;普通输入执行期间收到的 goal 准入直接拒绝,不等待该输入结束。TAIL Attach 在原子读取边界携带当前 canonical Turn 的开始快照。Bridge 仅恢复与持久化 目的地和当前绑定匹配的 goal Turn,授权其后续回复与权限请求,不重发之前的输出。
原生提问卡片
原生问题使用 Card 2.0 表单,支持单选、多选和文本输入。允许自定义答案时提供独立 可选文本框,填写的文本优先于已选选项;服务端校验至少有一个答案。展示选项说明, 保持答案值不变。产品文案支持英文和简体中文,模型内容保持原文。敏感问题不在飞书 聊天卡片收集,取消请求并给出本地化说明。问题过大时拒绝投递,不静默丢弃选项。
仅原提问用户可回答卡片;回调携带消息或群身份时须与保存的请求匹配。问题绑定 来源轮次,15 分钟后过期。取消不向原生请求返回任何选中答案。提交只可认领一次, 重复或失效卡片不能影响后续轮次。轮次完成或输出流结束会使同步提问卡片失效。待答 存储仍在内存中:Bridge 重启会使旧卡片失效,不承诺持久问答恢复。投递到已绑定 Session 的定时 prompt 沿用这条链路;子 Task 遵循 Task 提问规则。
异步追问卡片自创建起 15 分钟内可回答,包括来源轮次成功结束之后。答案作为普通 输入排队,不中断正在执行的工作,并绑定原 Session、启动和原生会话;提交时附带 原问题。答案在队列中等待时,实际派发前再次校验原生会话。取消和过期只释放 本地状态,没有待返回的 Provider RPC。来源轮次失败、 中断或输出流结束时卡片失效。无法确认答案是否送达时,卡片失效并显示说明,避免 重复提交。Bridge 重启同样会使这些内存中的卡片失效。
发行版会话扩展
静态注册的发行版可以观察已接受且关联 Turn 的输入、规范完成事件,并处理自己命名空间 内的卡片回调。公共装配不注册观察器或额外实验入口。观察器接收不可变绑定快照以及明确的 自动化、被取代标记;自行负责授权、状态、有界后台工作及退出清理。宿主提供作用域内卡片 发送、Owner/语言查询、配置事务和经 Hub Task router 提交的受信后台任务。 扩展不直接访问 Bridge 数据表。独立实验控件不参与公共的保存并重启表单。
完成后的 CardKit 回答可提供可序列化的卡片引用,供可选扩展更新独立区域。完成前由输出流独占卡片更新;完成后由扩展持久化递增的更新序号,并只更新自己的区域。回答及活动元素仍归回复渲染器所有。区域更新不发送额外消息;不支持或未投递的卡片不提供引用。
可选的会话扩展区位于回答正文及页脚分隔线之后、品牌署名之前。扩展区与页脚位于同一个回答容器中,先展示活动再补充回答时同样遵循此顺序;品牌署名始终是最后一个可见元素。区域更新不另加分隔线,也不改变回答与品牌元素。
定时任务执行感知
Hub 在提交前持久化每次触发,并关联对应 Task 或准确的 canonical Turn。提交成功不等于执行完成;暂时无法观测时保留待确认状态,不推断失败或自动补跑。旧的无关联历史不触发主动通知。
飞书个人任务视图及每个操作均校验冻结的创建人、应用范围、有效身份绑定与执行权限。创建人来自可信请求和准确的飞书 Turn 回执,不采用最近发言人、任意收件人或 Bot owner。无法归属的任务不开启主动提醒。既有 operator/CLI 授权保持原约定。状态通知统一由 Bot 私聊发给当前配置的管理员(owner),并标明任务创建人。管理员通知中心展示任务名称、执行状态及通知操作(知道了、静默、重新检查),不授予查看其他创建人的 prompt、结果或控制执行的权限;个人任务视图仍按创建人隔离。
升级时,仅对升级前已存在且未绑定创建人的子任务定时任务尝试恢复:要求有效的冻结调度身份及授权回执、原始 human actor、匹配的已记录 owner(如有),以及跨应用唯一的有效飞书身份别名。来源缺失或存在歧义时保留未绑定状态;升级后新建的任务不参与此次恢复。读取仍校验当前执行权限。恢复已有执行状态时不重放任务,也不补发历史通知。旧版提交记录仍可查看,明确标记为执行结果未确认,并与已关联的执行记录去重。
/amux 概览中的两个定时任务入口在同一行展示。个人定时任务与管理员通知中心提供返回按钮;返回时刷新概览摘要,并保持查看者原有的管理权限。
周期任务正常完成不打扰;失败和未执行聚合 60 秒,待确认持续五分钟才提醒。持续异常更新原卡,未确认异常最多每天催办一次;稳定恢复十分钟后关闭异常卡。一次性任务有结束回执。知道了停止催办,静默持续 24 小时,暂停只影响后续触发。默认在调度时区的 22:00–08:00 安静,同一管理员/应用每 30 分钟最多三条新状态消息。
投递状态与执行结果分开记录。持久化 outbox 使用固定 UUID 重试暂时故障(飞书去重窗口为一小时)。230013/230053 可用范围或屏蔽错误暂停投递,显式重新检查后再尝试,不回退给其他收件人。未配置管理员时保留待通知状态并展示投递诊断。更换管理员或迁移旧的创建人投递时,清理旧 outbox、卡片 ID 以及收件人对应的错误、确认和静默状态;执行状态、创建人及任务提醒开关保持不变。仍在持续的异常可通知新管理员,已完成的历史回执不重放。/amux 提供个人摘要、分页历史、结果及这些操作,中英文同步。
每日清理选项
管理员在首次引导、Bot 默认设置或群独立设置中选择普通话题或用户隔离话题时,可以选择每日自动清理。 开关作用于整个系统,默认开启,保存后即时生效;未包含该字段的旧表单保留已保存值。 关闭不删除数据,也不改变既有生命周期回收规则。每轮清理均向已配置的 Bot 管理员发送 私聊双语报告,包含 Runtime、时间、数量、释放空间、跳过和失败项;没有清理对象也通知。 报告不包含会话内容、凭据或私有工作区路径。投递失败记录并重试。
所有者私聊实验功能页包含实例级 Codex 启动程序配置。留空恢复 codex;程序在实际执行的 Runtime(包括远端节点)解析。保存保留旧卡片省略的字段,沿用保存及重启确认流程。已有 Session 保留原启动程序。
注册的 app-server 集成复用执行程序设置、所有者实验功能表单、执行节点路径解析和 Session 启动路径快照。原生模型发现使用同一个程序,不回退静态原生目录;Provider 和模型服务条目保持独立。