WorkStream

真实同事和虚拟员工,在同一个群里一起干活

WorkStream 是一个站点应用:真实员工用邮箱注册,创建自己的虚拟员工(每位独立绑定 API Key 与 OpenAI 兼容端点,也可以改挂 Qoder 云端 Agent),建群、互相 @、共享群文件与公告。@ 出去的任务进各自的虚拟邮箱,后端按群权重切时间片在多个群之间并行推进;历史超过上下文预算就按群压缩,再并成一份属于这个人的全局记忆。

功能,一段一段看

每段录屏后面那条链接指的不是营销页,是这能力在仓库里的实现说明:调度、执行、上下文三层各写在哪一节、为什么那样设计。数字都是实测或代码里的常量,不是配置上限。

录屏跑在一个演示环境里:模型端点是内置的 demo://local,终端连的是本机 ttyd 夹具,所以画面里看不到逐字流式、思考链和 token 用量——演示端点一次给完一条回帖、既不吐增量也不回报用量,界面就按口径写「这条后端不回报用量」。接真上游以后这三条都换成实测值,正文里说的 SSE、思考链标签页与命中率是那时候的行为。

群里 @ 一位虚拟员工:待发徽标挂上、投递徽标走到已读,回帖气泡落地
群聊:@ 派发 → 投递状态 → 回帖

在群里 @ 一位虚拟员工

@ 不是一个 HTTP 请求排队,而是往 ta 的虚拟邮箱投一封信。消息旁边那个徽标就是这封信的状态:排队 = 未读,开跑 = 处理中,跑完 = 已读,失败与取消单独标出。回帖边收 SSE 边吐字,同事中途插一句会当场掐断上游、按新消息重答。

  • 同一个(员工, 群)同时只跑一封,群内严格 FIFO
  • 员工回复里的 @ 交给下一位,接龙层数上限 3
  • 思考链只在轨迹页看,永不进群
端到端流程与取信分槽 §1、§3.1–§3.3
Stream 面板切成 4 分屏,四个群并排,其中一格正在直接敲一句话;随后跳到员工详情页的 Stream flow,横轴在「真实时间」与「顺序」两种排布之间切换
Stream 面板 2/4/9 分屏 + Stream flow 时间线

一张工作台,多个群同时推进

群就是 stream。首页用卡片网格或列表铺开,右上角切 2/4/9 分屏,每格都能直接 @ 派活;群边框跟着任务状态闪——排队是黄色,刚推进过是绿色。员工详情页的 Stream flow 把「哪一封信在哪一格被领走」画成时间线:横轴是进入时间片的时间,纵轴按群权重从高到低。

  • 每位员工按各群权重(1–20,可单独覆盖)用最大余额法分这一格的预算
  • 任务用比较并写领取,跑着的孤儿任务由过期回收兜住
  • 常驻 worker 让队列在没有浏览器时也往前走
调度算法与突发压测 §3.1–§3.3、§6.3
轨迹检视器:左侧 Stream flow 按群铺车道、每格是一步,右侧标签页在输出、上下文、计时、概述之间切换;底部缓存命中条在这份数据里直写「这条后端不回报用量」
轨迹检视器:上下文 · 思考链 · 用量

为什么 ta 是这么答的

每一轮模型看见了什么,都能重建出来。轨迹检视器列出这一步的提示词块与缓存断点在哪,思考链单独一个标签页读(它不进流式正文),用量与 KV 命中按群加权汇总——上游没回报用量的那些轮子直接写「不回报」,不拿 0% 冒充结果。

  • 稳定块在前、每轮都变的块垫底,前缀缓存才吃得住
  • 压缩在后台把水位线推上去,覆盖范围可枚举并对账
  • 超限的那几份摘要如实记成「这一步没并进去」
块序即缓存序、压缩与命中率上限 §5、§6.1–§6.2
群窗口右侧 2 分屏的终端面板:左边聊天与输入框照常用,右边浏览器直连 ttyd 网关,敲 ls / pwd / dmesg -wT 并看到回显
群窗口 SSH 控制台(浏览器直连 ttyd 网关)

人和虚拟员工 attach 同一个会话

登记了虚拟机、又填了控制台网关地址的群,顶栏会多出一个 SSH 控制台入口,「接入本群的机器」每一行也能直接点开。宽窗口是真分屏:左边聊天与输入框照常用,右边是终端。推荐用 ttyd -p 7681 tmux new-session -A -s work 起网关,这样你可以一边看 dmesg -wT,一边 watch 虚拟员工操作。

  • 浏览器直连网关,WorkStream 只存地址、不代理会话
  • VM 口令没有理由下发到前端:网关用它自己的认证
  • 网关地址写入口只收 ws/wss/http/https,带 user:pass@、查询串或锚点当场拒绝
这条链路的边界写在 README「上线状态」;客户端 src/lib/terminal.ts

能力一览

下面每个数字都来自代码常量、迁移序列或自检输出,不是路线图上的目标。

虚拟员工档案

每人独立绑定端点与 Key,可切 2 种后端(OpenAI 兼容 / Qoder 云端 Agent);头像、签名、技能与现场状态都在档案里。

调度

邮箱 FIFO + 跨群加权时间片,群权重 1–20;接龙层数上限 3;纯站点部署由前端每 5 秒推一格,自建部署可开常驻 worker。

排程主动干活

给某个(员工, 群)排「每隔多久」(1 分钟 – 7 天)或「每天几点」,到点只是多投一封信,全套管道复用;每人最多 20 条。

替身班表

真人可以指定自己名下一位员工代答 @,立即或按时间段(最远排到 90 天后),单个群能单独开关;落群署名仍是替身自己,气泡标「替 @X 代答」。

上下文与记忆

两级记忆 + 按群压缩 + 跨群归并成全局记忆;块序即缓存序,实测两轮之间可复用前缀 98.5%。

技能与 MCP

内置技能 2 份、员工侧内部工具 20 个;对外 MCP 端点暴露 13 个群作用域工具;远端技能源装的是快照,插件连接器并进主人名下所有员工的工具清单。

群文件与交付物

按文本入库上限 400KB,.drawio 在线画成结构图;员工这一轮交出的文件以交付卡片挂在回复下面,整块可点回原件预览。

界面语言

按名义 GDP 前 26 国列出 18 种,已译完 4 种(各 1297 条键,含服务端错误码);其余在「即将上线」列名但点不了。

密钥边界

PBKDF2-SHA256 口令散列 + AES-GCM 密封 Key 与 VM 口令;密文列只在服务端读取,接口只回尾号;自填地址过 SSRF 白名单。

数据与迁移

23 张 app.* 表,迁移 sql/0001→sql/0014 只追加;列名与代码实际读写的列由 dev/check-schema.mjs 静态对账。

自检

npm run qa 是唯一的全量门:驱动真实 handler 打本机假数据库,当前地板 851 项、0 失败,只许涨。

可浏览文档

README / CHANGELOG / 架构文档中英各一份、顶部互相跳,配对由一道静态对账钉住;AGENTS.md 故意只留英文一份。

按 tag 下载

源码包用 git archive 从 tag 那一次提交打出,内容与提交逐字一致,解压出来是一个带版本名的目录;清单与校验和由 scripts/releases.mjs 在构建时生成,页面不联网查任何仓库接口。

Tag 日期 包 大小 校验和 这一版带来什么

仓库在 Gitee 上是私有的:匿名访问网页回 403、/api/v5 回 404,所以下载区不依赖云端 release 对象,包就放在站点自己的 downloads/ 里。sha256 只印前 16 位是给人核对用的,完整值在 assets/releases.json。

架构设计

上面每段录屏的链接都指向这些文档的具体小节。仓库是私有的,链接需要你自己的访问权限;源码包里带着同一份 markdown,离线也读得到。

调度器 · 执行层 · 上下文装配

一页结论开头,然后是端到端流程、数据模型与平台约束、调度算法(取信分槽、群内 FIFO、替身、排程、接龙)、流式与插话、块序即缓存序与后台压缩、问题清单和实测、还没做的、验收口径。

简体中文 · English

README · 每个能力怎么用

界面与链路的现状描述、本地把整条链路跑起来、技能与 MCP、云端 Agent 后端、代码结构、上线状态与还没验证的边界。

简体中文 · English

CHANGELOG · 发布口径

只记「哪一次合入带来了什么」和「还差什么」,每个能力怎么用仍以 README 为准。

简体中文 · English

AGENTS.md · 仓库纪律

环境门、门禁地板、注册表与顺序不变量、密钥边界、视觉验收口径。每条规则都指向本仓的一处实现或一道闸门。

English(故意单语)

论文里引用 WorkStream

下面这段与 assets/workstream.bib 是同一份内容,复制按钮抄的就是文件本体。作者字段先写的是项目名——要署名到人,改那一行就好。

正在读 assets/workstream.bib…