Skip to content

FULI 0.22.0-beta.4

Pre-release
Pre-release

Choose a tag to compare

@JevonsCode JevonsCode released this 27 Oct 18:47
11eabf5

beta.4 相比 beta.3:控制台整体排版打磨,见「界面」一节最后几条。没有数据格式变化。

beta.3 相比 beta.2:

  • 阻塞的任务可以由你手动解除,阻塞卡片改成一行;
  • 界面上不再出现内部代码和英文类型名;
  • Windows 端口被系统保留时,托盘会说明原因,并能一键换端口;
  • 托盘更新可以把 Neo4j 升到同一版本线的新补丁(先备份图谱);
  • 新增「Agent 取名风格」设置;
  • 本地服务的日志不再无限增长。

图谱多一步自动完成的格式 13 → 14,见文末「数据格式」。

beta.2 相比 beta.1:修复已有安装升到 0.22 后无法启动的问题。图谱在等你确认 graph/12-builtin-occupations 时是只读的,而 beta.1 每次启动都要先写一次内置身份,被拒绝后启动中止,控制台起不来,也就没法在控制台确认;Windows 托盘版的更新会因此自动回退(不会升级任何存储)。beta.2 在这种只读状态下跳过这一步,确认之后下一次启动再执行;其他错误照旧中止启动。

0.22 是 main 分支上的下一版(rec#11 D-66:0.21.x 从 release/0.21 分支发布)。它包含 0.21.0-beta.2 之后合入 main、还没有进入 0.21.x 的改动:控制台不再让你去终端、去掉控制台登录、Jefa 看板内置、Tonborg 的搜索和默认判断方式、按名字继续 Agent 和 @flg 小组讨论、圆桌对话、阻塞任务的说明、服务管理、项目自己的项目经理和看板、项目图谱、Claude Code 入口按预览上限收紧、Windows 托盘版一键更新、OpenCode 插件,以及一批界面整理。数据格式见文末:图谱有一步需要你确认,确认之前图谱只读。

控制台里点一下就行,不用去终端

控制台里原来让你「在终端运行……」的提示,现在都换成了按钮,或者直接说明 FULI 会自己处理什么:

  • 删除恢复:控制台遇到删除恢复未完成时,会自己重新核对一次(和控制台启动时做的核对相同,不会重发删除),最多每 15 s 一次。提示文字不再给出命令。
  • 数据格式页:「重新核对」按钮再执行一次清理并说明结果。新增整库恢复:选一个本地存储的格式备份,页面先列出会丢掉什么(版本、各表行数、备份之后记录的迁移),你勾选「我知道……全部修改都会丢失」后点「停止 FULI 并恢复」。恢复由一个独立进程完成:停掉 FULI、按页面上显示的那份备份恢复(恢复前再核对一次摘要,并先做一份安全备份),再启动 FULI。图谱仍然只能在终端用图谱导出恢复。
  • 模型密钥:内置 Agent 的模型设置里有一个只写的「API 密钥」输入框,存到和 fuli models set-key 相同的位置(Windows 用 DPAPI,其他系统是只有本人可读的文件)。页面只知道哪些引用已经有密钥,读不到值。
  • 客户端接入:每个客户端旁边有「更新接入」/「重新接入」,执行和 fuli setup 相同的客户端安装。
  • 更新:更新提示上的「更新到 vX」按钮,会在独立进程里执行和 fuli update --yes 相同的更新,新版本启动后页面自动刷新。失败时只显示第一行原因,并重新启动 FULI。Windows 托盘版(按用户安装)见下面「Windows 托盘版」一节。

新加的这几个控制台修改接口只接受本机请求,在 Agent 接口目录里标为 local_user_only。

没有验证的部分:一键更新和控制台整库恢复只用假的 worker 和运行时做过单元测试和接口测试,没有对真实的 npm 发布或正在运行的控制台做过端到端测试。只给 CLI 或 Agent 看的提示(例如 fuli migrate 的输出)仍然写着命令。

控制台不做登录(rec#11 D-70)

0.21 发布后曾在 main 上加过一个控制台登录(按次启动的会话、一次性代码、/auth/console 登录页),现在整个撤掉了:FULI 是本机工具,没有登录。0.21 说明里「调用方侧的会话认证计划在 0.22 做(D-61)」这一项取消。D-60 的行为不变:判断记录和建议日志接口拒绝 LAN 请求,本机进程仍然可以通过本机 HTTP 读到完整历史。

Jefa 看板内置;移除「聘请 Agent」

  • Jefa 的任务看板直接随 FULI 安装,不用再 fl employee install。看板数据存在新的本地存储 employees/data/jefa/board.sqlite,和已有的 management.sqlite 分开。任务只记当前状态加一张不可修改的修订表,不会被删除。Agent 可以读看板、建任务、改任务(版本冲突时整批拒绝)、回答状态问题和准备会话标题;把任务标成「完成」只能由你来做。
  • 如果你以前在 employees/packages/jefa 装过 Jefa 包,它仍然会替代内置版;装坏了的包不再让 Jefa 不可用,内置看板照常工作。
  • 你可以按项目开启分享链接,链接只展示你标成公开摘要的任务(只有标题、状态和优先级)。控制台目前还没有设置「公开」的入口,所以分享页暂时显示「暂无可公开的任务」。
  • 「聘请 Agent」按钮从项目 Agent 管理页和 Agent 目录移除。「管理负责项目」还在。MCP 的 recruit_employee 和 Bole 的招募不变,自定义 Agent 包现在只能通过 recruit_employee 聘请。

项目自己的项目经理和看板

Jefa 仍然是全局负责人,它自己的流程不变(五个内置状态;只有你能验收「完成」)。现在一个项目可以有自己的项目经理和看板:

  • 项目经理:项目里一位有在职分配的 Agent(项目页上可以「招募新的项目经理」,职业是「管理」),也可以选「由 Jefa 直接管理」。Jefa、Bole、Tonborg 等内置角色不能当项目经理。项目经理之后离开项目时,记录保留它的 id,项目页会请你重新选。
  • 看板:内置看板用你自己的列(最多 12 列,例如 待开发 / 发布到测试环境 / 待提测 / 上线 / 已完成),每列对应一个内置状态,几列可以对应同一个状态;或者用外部看板(例如飞书项目),FULI 只放一个链接,不同步任务,原有的 Jefa 任务保留、只是不显示。
  • 在「项目概览 → 项目看板」里设置:选项目经理、编辑列(拖动或上下按钮排序)、填外部链接。Jefa 的看板按单个项目筛选时显示这个项目自己的列,卡片可以拖到某一列;同时看几个项目时仍用内置列,卡片上标「项目 · 列名」。
  • 对应「完成」的自定义列仍然只能由你移入。每次修改都留有修订记录。
  • Agent 侧:Jefa 新工具 configure_project_board,create_tasks / update_tasks 可以带 boardColumn,create_project_agent_assignment 可以带 projectManager,一步完成招募项目经理和设置看板。
  • 没有验证的部分:没有在真实控制台或浏览器里跑过,布局只经过组件测试;项目经理的分配写入只在合成的员工数据上测试过,没有接真实的 Provider。

Tonborg

  • 判断记录可以搜索全部历史:搜索在判断库里进行,覆盖标题、目标、结论、证据、客户端、模型、项目 id 和项目名,以及最近一次反馈和回执的理由。列表一次加载 30 条,滚到底自动加载下一页(也有「加载更多记录」按钮),只渲染屏幕附近的卡片。「需要人工」筛选改在服务端执行,所以分页不会漏。结果标签(例如「需要确认」)不能被搜索,用「需要人工」标签页代替。
  • 默认判断方式和单个项目的设置:设置里的「自主程度」改叫「Tonborg 的默认判断方式」,只管默认值。Tonborg 工作台有一个可以折叠的「各项目单独的判断方式」列表,项目页也有一张小卡片,可以为这个项目单独设置,或者「恢复默认」。
  • 为什么选了「自主处理」还要你确认:这不是错误。自主处理下,只有 Tonborg 自己配置的、可信的模型给出批准,并且把握不低于 0.85,才会自动执行;由当前会话代答的判断永远不会自动执行。现在每张等你处理的卡片都会用一句话说明原因,例如「Tonborg 把握不足(0.5),交给你确认」或「这次由会话代 Tonborg 判断……交给你确认」。0.20.0 之前判断的记录没有保存审核细节,只能按 0.85 的规则推断原因。

按名字继续一位 Agent(@fla,rec#54)

在任何目录里,提示开头写 @Jamie Ash 继续刚才的任务,就由你的这位 Agent(FLA)在它自己的项目里接着做;写 @FLA 或 #FLA 会给出最多 4 个选项(名字、项目、职业),回复编号即可。规则:

  • 只有完整的名字,或者恰好只属于一位可用 FLA 的一个完整名字单词(至少 2 个字符),才会直接继续。部分匹配(@Ja、@src)不会继续、不弹选项,这一轮按原来的方式处理,入口只多一行提示「想找 FLA?用 #FLA Ja 选择」。
  • 邮箱、@Override 这类注解、@scope/pkg、文件名、不在开头的 @名字 都不算。
  • 绑定会保留在这个会话里,@FLA 结束 解除。目标 FLA 不可用时(已解雇、停用、不允许这个客户端、不在那个项目……),入口直接说明原因,不会换一位 FLA 顶替。
  • 已知的残留:一个普通词恰好是某位 FLA 名字里的一个单词时(例如 FLA 叫「Mock Li」时的 @Mock 怎么用),会被当成点名。
  • 没有 @ / #FLA 的提示,入口内容不变。第一次点名的那一轮入口多约 575 字节,之后每轮多约 48 字节(合成数据上测得)。
  • Agent 卡片(目录和编排)、快速查看和资料页上有「复制 #FLA」:一键复制 #FLA <名字> ,鼠标停在按钮上会列出可以直接复制的说法(继续工作、和另一位一起用 @flg 讨论、再推荐一位)。只对在职的 FLA 显示,内置角色和临时 Agent 没有。这些说法在测试里直接粘进真实的任务入口验证过。

每个新 Agent 都有自己的名字

  • 新建的 Agent(Bole 招募或直接创建)都会得到一个在你的空间里不重复、像人名的昵称。像岗位名的名字(例如「PPT 专责」)或没给名字时,换成生成的名字,例如「Lyra North」;像人名但已被占用的,加编号,例如「Lyra North 2」。岗位留在 name、职业和职责里。
  • 已有的 Agent 不会被自动改名。显示名像岗位名时,资料页会出现「建议改个名字」卡片,可以一键「改名为 X」或「保留现名」。你改名时,改成别的 Agent 已用的名字会被拒绝(agent_name_taken);更新时没给昵称,保留原来的昵称(以前会悄悄变回岗位名)。
  • 图谱结构没有变化:昵称本来就存在 Agent 资料里,改名建议在读取时计算,不保存。
  • 没有验证的部分:起名在真实 Neo4j 上的验收测试只在 CI 里跑过(通过),本机没有跑;几个招募同时进行时,可能撞上同一个生成的名字,概率很低。

@flg:请几位 Agent 一起讨论(rec#55)

  • 提示开头写 @FLG 讨论这个方案的产品体验和技术风险,FULI 按职业、职责和长期职责推荐 2–4 位你自己的 FLA,每位附一句理由并预先勾选;也可以直接点名(@FLG Jamie Ash、Milo Reed,一起讨论……),点名的人不会被换掉。回复编号(1 3)或 @FLG 开始 才会开始;单独一个「好」不算。
  • 当前会话的 Agent 主持讨论。每位成员在它自己可用的客户端里新开一个会话作答:Claude Code 禁用编辑和 shell 工具(Edit、Write、NotebookEdit、MultiEdit、Bash),Codex 在只读沙箱里运行,所以成员不能改文件。只有核验过的回答才会以该成员的身份贴进圆桌的小组对话。先各自发表看法,再互相回应(默认 1 轮,最多 2 轮)。
  • 之后用 @FLG <追问> 继续问同一组人(每次讨论最多 5 次),@FLG 结束 立刻停止。总结里会列出没有回复的成员,并注明「未回复、不计入结论」;讨论本身不授权任何修改或发布。
  • 限制:必须在项目里使用;成员只能在本机(不支持跨设备成员);只有 Claude Code 和 Codex 能被唤醒。
  • 没有验证的部分:没有用真实客户端做过端到端运行(测试里客户端在唤醒接口处是假的,其上全部真实);Claude Code 在 -p 模式下带这组禁用工具时是否仍正常作答,只检查了启动参数;成员客户端里的其他 MCP 工具不在禁用列表内。
  • 没有 @FLG 的提示不多任何内容。完整工具列表多 1,145 字节(group_discussion),聊天精简版不变。

两种方式:选成员时还会问用哪种方式,回答时一起写上(1 3 一起看、1 3 圆桌);没写时用预选的那种。问题里提到「一起看」「本会话」时预选第一种,否则预选圆桌,所以原来的 1 3、@FLG 开始 意思不变。

  • 「在这个会话里一起看」:不唤醒任何人,也不写任何记录。当前会话拿到一份只读的索引:每位成员的职业和职责、所在项目、长期职责、最近 3 个任务,以及这些项目里和你的问题相关的知识标题(最多 3 个项目、每个 3 条)。需要细节时再按需读取。各 FLA 的工作记忆是它自己私有的,不会读取,入口和回执会写明「工作记忆为各 FLA 私有,未载入」。之后 @FLG <文字> 按新文字再读一次索引,@FLG 结束 结束。因为不唤醒,只在 OpenCode 里工作的 FLA 也能选。选成员的那一轮多约 209 字节,确认那一轮的索引在合成数据上(两位成员)约 1.5 KB;普通提示不变。
  • 「在圆桌里分头回复」:就是上面的小组讨论。
  • 没有验证的部分:一起看模式没有在真实客户端和真实 Provider 上跑过(读取在边界处用合成数据代替)。

圆桌:留言板和即时对话

  • 圆桌的对话页变成聊天界面:你的消息在右边,每位 FLA 的在左边,带头像、名字、客户端和时间。每条消息下面写着每位收件人的实际状态:留在留言板、排队唤醒、正在回复(只在真的有运行时显示)、已回复,或者为什么没能唤醒。原来的「记录详情」JSON 展开和请求卡片去掉了。
  • 「新对话」:选一位或几位 FLA(几位就是一个小组)、它们共同所在的项目(只有共同项目不止一个时才让你选),再选方式并写消息。新对话默认「即时对话」。
  • 留言板:消息等着,FLA 下次工作时在收件箱或任务入口看到,再回复。即时对话:马上唤醒这位 FLA 运行一次(每位 FLA 同时只运行一次,最多等 10 分钟),带上这段对话最近 8 条消息。切到即时对话时,留言板上还在等的消息也会唤醒对方。
  • 即时对话跑不起来时,页面用一句话说明原因,消息留在留言板:这台电脑上没有这位 FLA 能用的 Claude Code / Codex、还不知道项目文件夹、唤醒失败或超时、Provider 拒绝。只有 Claude Code 和 Codex 能被唤醒;内置模型和 OpenCode 目前不能,这类 FLA 的消息留在留言板。
  • LAN 提问显示 provider_error 的原因找到了:共享项目换了负责人以后,另一台设备发来的提问仍然发给旧负责人,Provider 正确地拒绝了,但拒绝没有带原因代码。现在会写明,例如「共享项目的负责人换了,请在设置里重新共享新的负责人」。
  • 没有验证的部分:没有让真实的 Agent 即时回复过(客户端在唤醒接口处是假的);完整的 Provider 测试没有跑完。

阻塞的任务:卡在哪、从什么时候、在哪个会话

  • 阻塞的任务在任务详情、Agent 卡片、看板、今日焦点、时间线、概览和「待决策」里都用红色显示,并写明:等的是什么(会话报告的问题,或者把 FULI 启动的执行者的错误代码写成一句话)、「{时间} 起阻塞」、在哪个客户端的哪个会话。
  • 有已核实的链接时,给出「在 {应用} 中打开会话」(目前是 Codex 应用,以及 VS Code 里的 Claude Code);没有时给「复制会话 ID」。不会让你去运行命令。
  • 自动解除:同一个会话继续工作(checkpoint)、你在那个会话里发了新提示、或者你在「待决策」里回答了这个任务的阻塞请求,阻塞会自动解除,任务回到运行中,任务详情写明「阻塞已于 {时间} 自动解除:{原因}」,相关的待决策请求一并关闭。别的会话里的活动不会解除它。这个会话关了记录时,什么都不写。Provider 出错时,任务入口不会再去请求解除阻塞。
  • 会话链接清单:各客户端的会话链接写在一份带版本的清单 registry/client-links.json 里,FULI 自带一份。「设置 → 客户端 → 会话链接」有「检查更新」:从 GitHub 读取最新清单,严格校验后列出增加、修改和删除的部分,点一下应用。「每天自动更新」需要你打开。更新失败时保留当前的清单;这里只会更新这份清单,不会更新 FULI 本身。
  • 手动解除(beta.3):报告阻塞的会话不会再继续时,你可以在工作台的任务卡片或任务详情里点「标记为已解除」,可以写一句备注。任务回到运行中,相关的待决策请求一并关闭,任务详情写明「阻塞已于 {时间} 由你手动解除」,之前的阻塞记录仍在历史里。这个操作只接受本机请求,在 Agent 接口目录里标为 local_user_only,Agent 不能这样做。
  • 阻塞卡片改成一行(beta.3):原因加「已阻塞 N 天」;会话、客户端和可见性的说明只在任务详情里。超过约 3 天没有进展的阻塞,按钮旁会提示可以标记为已解除。
  • 没有做的:星图和 3D 看板只显示状态颜色,没有阻塞说明;Agent 卡片和编排卡片上没有「标记为已解除」按钮(在任务卡片和任务详情里)。
  • 没有验证的部分(beta.3):手动解除和图谱格式 14 只在 CI 的 Neo4j 测试里跑过;按钮和新卡片没有在真实控制台里看过。

服务管理(Agent → 服务)

  • 新的「服务」页列出 FLA 启动的长期运行的服务和每个 Agent 应用的工作台:用途、地址、FLA / 项目 / 客户端和会话、启动和停止时间、实时状态和命令,可以搜索和按 FLA、项目、类型、状态筛选。
  • Agent 应用工作台由 FULI 自己记录(启动、退出或崩溃、停止),输出的最后 16 KiB 留作日志,其中应用令牌替换为 [redacted],只在控制台里给你看,没有 Agent 工具能读到。Agent 从会话里启动的服务,通过新工具 report_agent_service 登记和更新;归属来自它的任务,Agent 只能改自己的记录。
  • 停止只能由你来做:对话框显示确切的 PID、可执行文件和命令行,只有这些还和记录一致时才会停止,否则拒绝并记下。Agent 不能通过 FULI 停止服务。删除记录和清空日志也只在控制台里做,只接受本机请求,不需要登录。
  • 状态每次读取时都核对:先按记录的 PID 和系统里的进程身份核对,再在本机地址上探测端口。只有端口关闭、但 PID 还在的服务不会被标成已停止。
  • 完整工具列表多约 990 字节,聊天精简版、入口不变。没有做:从 Claude Code 后台 Bash 自动登记服务。

回执写全协作者;迟到的执行者报告不再丢

  • 在负责人会话里作为子 Agent 干活的成员,现在会出现在回执的协作者里(以前只写负责人)。条件是:这些成员是从同一个会话报告的、任务由这个会话协调、不是负责人自己。另一个会话里的报告不算进这张回执。
  • 负责人已经把任务完成、取消或暂停之后,执行者才送到的报告,现在作为历史记下,不改任务状态;以前会被拒绝并丢掉,回执也就少了这位成员。阻塞中的任务除外,仍按上面「自动解除」的规则处理。
  • 在没有子团队的项目里,由某位 Agent 派出的新任务,由这位 Agent 协调,会出现在它自己的任务列表里;以前记在系统协调者名下,成员派出的任务还会在关联时被拒绝。已有的任务不迁移,列表也会包含它自己的任务上下文协调的任务。
  • 拒绝时的提示更具体:版本过期会写出期望和当前的版本。图谱结构没有变化。
  • 没有验证的部分:没有检查真实的样本(真实数据);问题是用合成数据复现的。新增的 Neo4j 测试只在 CI 里跑过(通过)。

职业:Bole 负责「Agent 资源」

  • 内置职业 hr 改名为「Agent 资源」:维护 Agent 的职责、招募安排和人员配置记录。Bole 以前被记成 management,所以「人力资源」一直显示 0;现在 Bole 是 hr,已有数据由图谱迁移 graph/12-builtin-occupations 改过来(需要你确认,见「数据格式」)。
  • 「职业」页改成可以排序的表格(名称、职责、使用的 Agent 数、状态、更新时间),标出内置和自定义。默认只显示在用的职业;「已归档」筛选里可以「恢复」。归档不会删除:已经用这个职业的 Agent 照旧保留,只是新 Agent 不能再选。
  • 网页里原来另有一份不完整的职业列表,已经去掉,统一读取空间里的职业表。
  • 发现但没有改的:职业的职责说明只给你看,没有任何 Agent 读取它,编辑框里「Agent 按它理解分工」的说法目前不成立。

项目图谱

  • 修复项目图谱里节点和名字重叠、被画布边缘裁掉的问题:碰撞范围按节点的名字和 ID 实际占的大小算,项目环按项目数放大,缩放时把整块都框进来。过长的名字用 … 截断,完整名字在提示和无障碍名称里。关系标签放不下时,只在悬停、聚焦、选中或搜索时显示。
  • 调整层级:在全部项目的图谱上打开「调整层级」,把一个项目拖到另一个项目上,就变成它的子项目;拖动时右侧还有「与当前项目平级」「改为全局」和搜索框。把项目拖到它自己的子项目上会被拒绝并说明原因。移动只能在控制台里做,Agent 只能建议。项目继承哪些知识按新的上级算,子项目跟着一起移动。
  • 图谱结构没有变化。被结束的上级关系(包括你在审核里拒绝过的建议)现在算作历史,不再画成当前的连线,历史里仍然看得到。
  • 没有验证的部分:没有在真实控制台上做过一次成功的移动;网页、Node 接口和 Provider(真实的 Neo4j)分别测试过。

界面

  • 生成的 Agent 有固定的角色头像:除了 Astro、Bole、Jefa、Tonborg 保留原来的头像,其他 Agent 的头像由 Agent ID 生成(内置了 fuli-avatar 的渲染器,固定版本),在目录、详情、圆桌、项目团队和概览里都一样,改名字或职业不会变。不发外部请求,不存新字段。
  • 内置 Agent(Jefa、Bole、Tonborg、Astro)的默认介绍跟随控制台语言;你改过的介绍按原文显示。
  • 去掉 Agent 资料页上的「问 AR」按钮和「AR 人员目录」链接(它们只是打开 Bole 的页面并搜索名字)。
  • 所有页面统一 1888px 宽,全局只有一种细滚动条。
  • 「记忆」下去掉单独的「品味」页(/preferences/writing 及其接口),标签页是 知识 / 偏好 / 知识整理 / 标签;偏好里的「品味」筛选和相关 MCP 工具不变。
  • 偏好计数写清楚两个数:「个性 0 条 · 共 6 条」,没有筛选时是「当前有效 4 条 · 共 6 条」;冲突是「3 组待判断 · 共 5 组」。知识目录去掉了几条多余的分隔线。
  • 「?」说明模式现在解释每个标签页和侧栏入口;右键、Esc 退出,固定时按 Alt 解除固定。
  • 任务状态只用一套颜色:阻塞和失败是红色,等审核、暂停、等招募是橙色,运行中是强调色,完成是绿色(时间线等处的小标签没有绿色,显示为灰色),其余(包括排队)是灰色。
  • 设置的「客户端」标签页默认展开第一节。
  • 不再显示内部代码(beta.3):阻塞和失败的原因、招募记录、知识类型、职业和客户端名称都换成中英文说明。例如 project_team_lead: …; executor: no usable executor 现在写成「由项目组长负责;没有可用的执行客户端」,PersonalPreference 写成「个人偏好」,职业不再显示 management、lead 这样的代码。原始文字收在任务详情的「原始信息」里,一行的卡片上放在提示里;没见过的代码写一句通用说明,代码本身用小字附在后面。Bole 的标签从「AR」改为「Agent 资源」。这些名字统一放在一张对照表里,任务状态的颜色和名称也用这张表。
  • 知识目录只有一个滚动条(beta.3):表格不再在页面里单独滚动,跟着页面一起滚,表头固定在顶部。
  • 字号和字重(beta.4):页面标题 24、分区标题 16、卡片标题 15、正文 14、按钮和标签 13、辅助信息 12(像素),层次靠字号拉开,字重只用 400 / 500 / 600。以前大部分文字都在 600 以上,Windows 上的中文字体会把 600 以上都显示成粗体,所以全屏都一样粗,看不出主次。侧边栏的子项不再是像「不可用」那样的浅灰;辅助文字的颜色加深了一档,对比度达到 4.5:1 以上。
  • 长段文字控制宽度(beta.4):说明、请求原文这类长段文字一行最多约 72 个字符宽,不再横跨整个屏幕。
  • 提示条(beta.4):「实时更新已断开」、读取失败、保存成功这类状态提示,统一成带图标、带浅色底的提示条,操作按钮放在文字旁边。
  • 工作台(beta.4):「待你处理」的说明控制在易读宽度,两个按钮紧挨着它;「当前工作」里「很久没有进展」的提示只出现一次,放在标题下面,每个「标记为已解除」按钮的悬停提示里也有;「最近项目」和「服务状态」改成卡片网格,1920 宽的屏幕一行放得下 6 个项目。
  • 宽屏和笔记本屏幕(beta.4):
    • 偏好、圆桌对话改成随屏宽增加列数的卡片网格;对话不多时,会多一张「开一段新对话」的卡片。
    • 知识整理和服务只剩页面一个滚动条。
    • 项目资料改成带列的紧凑表格。
    • 设置、连接、模型与用量、数据格式这类表单页,内容居中、最宽 1040px;页面本身和顶栏仍是统一的 1888px。
    • 在 1280、1440、1920 三种宽度下,用合成数据逐页截图检查过;没有在你的真实控制台里看过。
  • 「?」说明补上了「服务」和「圆桌」的新说法(圆桌现在是和 Agent 对话的地方),去掉了「定时任务」;圆桌里送达失败和等待中的消息也用同一套颜色。

Agent 取名风格(beta.3)

  • 「设置 → 记忆与访问」新增「Agent 取名风格」:用一句话写想要的名字风格(建议 100 字左右,最多 500 字),之后新建的 Agent 按它取名。留空就沿用默认的名字,改了设置也不会给已有的 Agent 改名。只有你能在控制台里设置。
  • 取名由正在招募的 Agent(代 Bole 工作的那个会话)按风格来起:它通过新的只读工具 get_agent_naming_style 读取风格。这段风格不会放进每一轮的任务入口。FULI 负责名字不重复:指定或提议的名字已经被别的 Agent 用了,会被拒绝(agent_name_taken),并给出三个空闲的名字,Agent 再换一个同风格的;实在想不出来要告诉你。以前重名时会悄悄加编号,现在不会了。
  • 没有验证的部分:没有用真实的招募会话按风格起过名字;名字跟风格贴不贴,取决于招募 Agent 用的模型。设置卡片没有在真实控制台里看过。完整工具列表从 192,809 字节变为 193,488 字节。

本地服务的日志不再无限增长(beta.3)

  • 每次启动 Neo4j、图谱 Provider 和控制台之前,超过 50 MB 的日志会改名为 .1,最多保留 3 份旧日志,更早的删掉。日志文件被别的程序占着时照常启动,继续写原来的文件。
  • Provider 不再把 Neo4j 的「标签 / 属性不存在」提示连同整条查询写进 provider.log。一台真实的安装上,这个文件因为这些提示长到了 4.2 GB。真正的错误照常记录。
  • 没有验证的部分:没有在真实的 Provider 和 Neo4j 上确认日志里不再出现这些提示;同一次运行里 neo4j-console.log 仍然可以一直变大,要到下次启动才会轮换。

Claude Code 的入口不再超过预览上限(rec#47 D-72)

  • 0.21.0-beta.2 上,一位正在工作的负责人的入口,即使 31 条偏好全部省略,仍有 10,321 字符,超过 Claude Code 约 10,000 字符的 Hook 预览,所以这一帧无法确认,下一轮也不是增量。
  • 现在固定的说明(项目经理的派活规则、Tonborg 的自动判断规则)改成只留一句触发句加一个规则引用;引用指向 fuli://rules/task-entry/{section},按节返回(以前的 #section 写法客户端解析不到)。Hook 里的令牌只发一次 taskContextToken(MCP 结果两个字段都保留)。记忆预览去掉入口里已经有的 ID。
  • 放不下时,按顺序把全局记忆、项目记忆、目录快照、团队名单、管理者细节、活跃冲突换成条数加读取方式,给硬规则让位;之后有空间再逐项放回。角色说明永远不裁。仍放不下时,发一个带原因 inline_budget 的受阻帧(保留令牌、收尾字段和身份),再放不下就发原来的「不可用」输出。不会再发出超过上限的内容。 被裁过的帧不再声称偏好完整;偏好全部省略的帧也带 revision,可以作为下一轮增量的基准。
  • 在合成的同形数据上:整份入口从 12,532 字符降到 8,426 字符;同一会话第二轮是增量。
  • 升级后:规则版本变了,升级前开始的会话在升级后第一轮会收到一份完整帧,之后才恢复增量。这对每个客户端都一样(共用的视图改了)。
  • 没有验证的部分:没有在真实的 Mac 样本上复测,请在这一版上看第二轮能否拿到第一轮的 revision。

Windows 托盘版

  • 更新不再因为停不下 FULI 而失败:以前控制台在回答 /api/health 前要同步检查所有本地存储,有别的进程占着存储或刚更新完缓存是冷的时候,会慢到超过 stop 的等待时间,更新就报「无法停止正在运行的 Fuli」。现在健康检查立刻返回上一次的结果,之后再刷新;stop 等 10 s。对已经装好的旧版本,更新程序会再试一次,然后只停掉经过身份核对、确认属于这次安装的 FULI 进程;别的程序(npm 版、便携版)用同一数据目录启动的控制台会列出 PID 和程序,只有你选了才停。

  • 托盘版一键更新:控制台的「更新到 vX」会从 GitHub 发布里下载 fuli-windows-tray-<版本>.zip 和它的 .sha256,核对摘要和每个文件,让托盘退出,再运行新包自带的更新(和 Update-Fuli.cmd 相同:停止、切换、启动、重新接入客户端,失败时回退,数据和旧版本保留),最后重新打开托盘。页面按真实步骤(下载 / 校验 / 退出托盘 / 更新)显示进度。

  • 这一版要先用安装程序更新一次:比它旧的版本还没有这个按钮,所以从 0.21 更新到 0.22 仍然用 Update-Fuli.cmd;从这一版往后才能一键更新。发布流程新增一个 Windows 任务,在 npm 发布之后把托盘包附到 GitHub 发布上。

  • 没有验证的部分:新的发布任务还没跑过(Neo4j 下载、Java 运行时、在 windows-latest 上打包和上传附件都没执行过),所以第一次真实下载就是这次发布;没有对真实安装的托盘、控制台和 Neo4j 做过端到端的一键更新;页面没有在浏览器里看过;真实机器上是哪一种原因让更新卡住,没有确认(没有读取它的数据)。发布包还没有来源证明(provenance)。

  • 端口被 Windows 保留时(beta.3):Hyper-V、WSL 会占用一段端口(例如 2634–2733),FULI 的默认端口 2727 可能正好落在里面,控制台就起不来。现在启动失败时会写明「端口 2727 被 Windows 保留(2634–2733),换一个端口即可」。托盘新增「换一个端口」:选一个离默认端口最近、不在保留段里、也没人用的端口,先把旧的设置文件备份到 backups/settings/,再保存新端口、重启并打开新地址。端口被保留导致启动失败时,托盘会直接问你要不要换。第一次安装会自动避开被保留的端口,Provider 和 Neo4j 的端口也一样。FULI 只用 netsh … show 读取保留段,不会改系统设置。换端口后,已经打开的 Agent 会话里的 FULI 链接还是旧地址,重开会话就好。

  • Neo4j 补丁升级(beta.3):以前托盘版和 macOS 原生运行时只要 Neo4j 版本不同就拒绝更新,装着较旧 5.26 补丁(例如 5.26.0)的安装就永远更新不了。现在允许升到同一版本线的新补丁(例如 5.26.0 → 5.26.28):切换前先用旧的 Neo4j 把图谱导出到 backups/graph/before-neo4j-<版本>-<时间>,导出失败就不切换,旧版本重新启动。升级之后不允许再退回更旧的补丁(新版本可能已经升级了存储),提示里会给出这份备份的位置。降版本、跨版本线仍然拒绝。

  • 没有验证的部分(beta.3):「换一个端口」的菜单和对话框没有在真实的 Windows 上点过,测试里的保留段和端口探测都是模拟的。Neo4j 补丁升级和更新前的备份没有在真实安装上跑过,这一版装到装着 5.26.0 的机器上时,就是第一次真实运行。

OpenCode 插件(rec#11 D-63/D-64)

  • OpenCode 2.x 现在通过一个插件接入 FULI 的任务入口和收尾,不再依赖模型自己调用入口工具(之前 OpenCode + DeepSeek 在 33 次运行里只调用了 1 次)。插件不改你的提示原文;FULI 慢、挂掉或出错时,这一轮最多多一行「Fuli context is unavailable」,不会卡住 OpenCode。
  • OpenCode 有了自己的来源 opencode,不再和 Gemini CLI、Qwen Code 等共用 other。已经保存的、写了 other 但没写 opencode 的客户端列表和采集开关,读取时也覆盖 OpenCode,存储内容不改写。
  • OpenCode 1.x 只接入 MCP;版本读不出来时不装新插件。FULI 不会覆盖或删除不是它写的插件文件。fuli setup 也会把 FULI 的 Skills 装进 OpenCode 的 skills/ 目录。
  • 升级需要做一步:以前以 other 接入的 OpenCode MCP 条目会显示为过期,重新运行 fuli setup 并重启 OpenCode 后才会改成 opencode。
  • 没有做的:OpenCode 的对话还不会自动导入 FULI 的会话记录(OpenCode 不写转录文件)。装在 WSL 里的 OpenCode,需要在 WSL 里运行 fuli setup。
  • 在隔离的 FULI 和 OpenCode 2.1.4 上实测过:入口送达、收尾触发,连续两个提示的顺序也正确。

移除定时任务

「Agent → 定时任务」页面、/api/task-schedules 接口和 Agent 工具 manage_project_agent_schedule 已移除。定时任务只会按间隔新建一张项目任务卡,之后没有任何东西去执行它。项目任务本身(指派、开工、停止、重试)不受影响。

其他修复

  • 「不要提交、推送或建分支」这类带逗号的否定列表,以及句中的关系词 where,不再误触发发布或位置类的知识召回(rec#52)。
  • 远程知识连接返回缺字段的数据时,报 connector_response_invalid,不再报成调用方的 invalid_input(rec#48)。

工具列表大小

完整工具列表从 0.21.0-beta.2 的 191,482 字节变为 192,809 字节(test/token-budget.test.js 的基线):去掉定时任务工具,加上 group_discussion、report_agent_service 和项目经理参数。聊天精简版(8,426 字节)、说明文字和入口的基线都没有增加(迁移回执短了 3 个字符)。beta.3 加上只读的 get_agent_naming_style 和三处创建 Agent 的字段说明,完整工具列表变为 193,488 字节(+679 字节);聊天精简版和入口不变。

数据格式

需要你确认的一步:

  • 图谱格式 11 → 12,graph/12-builtin-occupations(改写记录,带撤销日志):把职业仍是出厂值 management 的 Bole 改成 hr,并记下新的职业更新时间(这样人员需求统计不会把 Bole 以前的工作算进 hr);把 hr 职业里仍是出厂文字的名称和说明改成「Agent 资源」。你自己改过的职业或文字不动。
  • 不确认会怎样:FULI 不会自动执行这一步。确认之前图谱保持只读:可以读取,但所有写入(新知识、任务更新、偏好等)都会被拒绝,后面的格式 13、14 也不会执行。用 fuli migrate status / fuli migrate preview 查看(只读),在控制台「设置 → 数据格式迁移」确认,或者在终端运行 fuli migrate apply --digest <预览给出的摘要>。确认的是你看到的那份计划;需要时可以用 fuli migrate rollback 或控制台撤销这一步。
  • 这一步在真实 Neo4j 上的迁移和撤销测试在 main 的 CI 里跑过(通过),本机没有跑;没有 Neo4j 的 Provider 测试全部通过。

自动完成的变化(不改动已有数据,改动前先做格式备份):

  • 图谱格式 12 → 13(只改结构):任务事件新增属性 blocker_cleared_by 及其取值,以及一个 (source_session_id, status) 索引,用于阻塞的自动解除。
  • 图谱格式 13 → 14,graph/14-person-blocker-clear(beta.3,只改字段取值,不改索引和记录):blocker_cleared_by 新增取值 person,用于你手动解除阻塞。之后 0.22.0-beta.1/2 只能读这个图谱,不能写入。
  • 圆桌存储 agent-roundtable.sqlite 升到格式 4:roundtable/3-group-discussions 新增 @flg 小组讨论的表,roundtable/4-thread-subscriptions 新增对话订阅的表。升级后,旧版本 FULI 会拒绝打开这个存储(圆桌和聊天在旧版本里不可用);恢复升级前的备份,会丢掉升级之后写入的聊天、讨论和圆桌消息。
  • 新增独立的本地存储:employees/data/jefa/board.sqlite(Jefa 看板,格式 3:格式 2 加项目看板和它的修订表,格式 3 给任务加可空的看板列)和 agent-services.sqlite(服务管理,格式 1),属于兼容新增,第一次用到时才创建。
  • 托盘版更新留下的结果文件只是一次更新的输出,由启动更新的托盘读一次,不是 FULI 数据。
  • 用过定时任务的数据目录里留下的 task-schedules.sqlite 及其格式备份原样保留:FULI 不再读取、迁移、清理或删除它,fuli migrate status 也不再列出它(包括它以前等你确认的 task-schedules/3-run-recovery)。不需要时可以自己删掉。

其他存储没有变化。退回 0.21.x 需要升级前的数据目录备份和图谱导出:0.21 打不开格式 12 以上的图谱,也打不开格式 3 以上的圆桌存储。

In English: 0.22 is the next release from main (0.21.x ships from release/0.21, D-66). The console no longer sends the person to a terminal: deletion recovery re-checks itself, and whole-store restore, model keys, client reconnects and updates are buttons (update and restore were tested with fake workers only, not end to end). The console login added on main after 0.21 is removed; FULI is a local tool with no login (D-70). Jefa's board ships inside FULI, the Hire Agent button is gone, and a project can have its own project manager and board (custom columns mapped to the built-in states, or a link to an external board). Tonborg's records are searchable across all history, the default judgment can be overridden per project, and every card waiting for the person says why. @Name or #FLA continues one of the person's own Agents from any folder, with a copy button on Agent cards; every new Agent gets a unique person-like name, and existing ones are only offered a suggestion. @FLG either loads a read-only index of 2–4 members into the current session (nobody is woken and working memory is never read) or runs a read-only roundtable discussion (neither run end to end with a real client). Roundtable threads become a chat with board and instant delivery, and a LAN ask that fails names its reason. A blocked task says what, since when and in which session, and clears itself when that session continues; the client link list can be updated from GitHub. A new Services page records services Agents start and Agent app workbenches; only the person can stop one, after its process identity is checked. Receipts name members who worked inside the lead's session, late worker reports are kept as history, and in a flat team the dispatching Agent coordinates its task. Claude Code's prompt-time entry now never exceeds the hook preview (a bounded or blocked frame instead; not yet retested on the real Mac sample). On Windows, updates no longer fail because a busy console answered health checks late, and the tray install gets a one-click update from this release on (updating to this beta still uses Update-Fuli.cmd; the new release job has not run yet). Bole's occupation becomes Agent resources, the project graph no longer overlaps and can be rearranged, generated Agents get stable portraits, and several console pages are simplified. OpenCode 2.x gets a plugin for FULI's entry and close and its own opencode source (rerun fuli setup and restart OpenCode). Task schedules are removed. The full tool list grows from 191,482 to 192,809 bytes; the chat profile and entry baselines did not grow. Data formats: graph 11 → 12 (graph/12-builtin-occupations) needs the person's confirmation and the graph stays read-only until then; graph 12 → 13 (schema only) and the roundtable store's move to format 4 run automatically after a backup; two new stores, employees/data/jefa/board.sqlite (format 3) and agent-services.sqlite. 0.21 cannot open the upgraded graph or roundtable store, so going back needs the pre-upgrade backup. beta.2 fixes beta.1 failing to start on existing installs while graph 12 waited for confirmation (the start wrote the built-in identity to a read-only graph); it now skips that write until the next start after confirmation. beta.3 lets the person mark a blocked task as unblocked (person-only; graph 13 → 14 adds the person value automatically) and shows a blocked task as one line. The console shows plain words instead of internal codes and type names. On Windows, the tray explains a port that Windows reserves and offers a one-click switch to a free port; setup avoids reserved ports. Tray and macOS native updates may move Neo4j up a patch in the same line (5.26.0 → 5.26.28) after a graph backup, and refuse to roll back below it. A new Agent naming style setting is read by the recruiting Agent through get_agent_naming_style; names stay unique. Logs of Neo4j, the Provider and the console rotate past 50 MB at each start, and the Provider no longer logs Neo4j notifications. None of these ran end to end on a real install. beta.4 polishes the console: one type scale (24/16/15/14/13/12 px, weights 400/500/600 only), readable prose width, one notice style for status messages, readable sidebar sub-items, tile grids on the overview, preferences and Roundtable lists, single page scrolling for the organizer and services, and form pages centred at 1040px inside the shared 1888px page; no data format changes.

安装和升级

需要 Node.js >= 24.12。

fuli stop
npm install --global fuli-context@beta
fuli setup --yes --connected-only
fuli --version

升级前照常先备份(fuli graph export --output <目录>,并复制数据目录)。升级后打开控制台「设置 → 数据格式迁移」(或运行 fuli migrate status),确认 graph/12-builtin-occupations,图谱才能重新写入。接入过 OpenCode 的,fuli setup 之后重启 OpenCode。Windows 托盘版:先退出托盘,从新包运行 Update-Fuli.cmd;这一版之后才能在控制台一键更新。也可以用网站上的一行安装命令,见 https://xn--8ovp9s.xn--m8txu.com/fuli/next/ 。