host
7589876cff
feat: 控制台浏览器远控面板
...
- TaskDetailPanel 新增“浏览器”页签,内嵌 BrowserPanel。
- 开始观看:fetch + ReadableStream 读 SSE(EventSource 发不出
X-API-Key),最新帧以 data URI 显示;状态每 5 秒轮询。
- 接管/交还:POST /browser/control;接管后点画面按 1280x800
换算坐标 POST /browser/input,键盘直达页面。
- 产物:cloud/console.html 由 vite 单文件构建重打(341451 字节,
含 browser/state 与“浏览器远控”标记)。
2026-10-30 07:01:48 +08:00
host
b3b3b35042
待办:项目待办模型 + /projects/{id}/todos 接口 + 控制台待办页
2026-10-30 05:11:06 +08:00
host
e5b6c45c83
console: 任务列表服务端分页 + 控制台分页面签
...
任务列表分页(服务端 + 前端):
- GET /tasks 新增 limit(1..100,非法回 400)、offset、
order=desc、status/executor/q 服务端过滤;回 total(过滤后
计数)与 status_counts(全项目统计,不受过滤与分页影响,
数据卡片不再把当前页当成全项目);无 limit 时旧行为不变
(全量、正序,协调子任务与旧调用不受影响)。
- 前端每页 20 条、最新在前,上一页/下一页 + 页码;筛选与
搜索改服务端过滤(搜索防抖 300ms),切筛选/切项目/派发
后回第 1 页,10 秒刷新与刷新按钮停在当前页;新测试
test_task_list_pagination.py 5 项。
分页面签:
- 顶栏锚点导航改成 5 个页签:工作台(派发 + 任务列表 +
对话 + 详情)、项目(项目 + 成员)、环境与 Workers、
技能与自动化(技能 + 自动化 + 分诊)、管理与 Key;
数据卡片仍在页签上方常驻。选中任务存在 App 层 store
里,切页不丢,回来仍是同一任务、10 秒刷新续同步;
页签同步到 location.hash(#tab-workbench 等),刷新与
分享链接落在同一页签;窄屏工作台仍保持派发在前的顺序。
- 工作台页签仍是左(任务)右(派发/对话/详情)两栏,
沿用等高内部滚动规则;其它页签单列堆叠。
2026-10-30 02:25:48 +08:00
host
c192c5dec8
console: 对话只保留一处实时单列(ChatGPT 式)
...
根因:ConversationSection 同时渲染 TracePanel(prompt +
全部链路条目)和 ContinuePanel(GET /chat-history,
服务端已把 prompt + 继续 + 后续 + 全部链路种类按时间
合并、并去掉了后续消息回声),简单任务的两份名单
显示同一组用户 + 助手卡片,看起来就是对话重复。
改法:删 TracePanel 名单,只留 ContinuePanel 这一列;
TracePanel 唯一不重复的控件(链路类型筛选、下载完整
链路)移到这一列顶部,筛选只过滤链路消息、用户消息
恒保留;实时性不丢:基础是 10 秒轮询的 chat-history,
SSE 新链路条目按 id 去重合并进来,轮询拿到后不再
重复;无 chat-history 的旧服务端回退路径也改成渲染
全部链路种类(不再只渲染 message),并跳过 fu- 回声。
2026-10-30 01:40:20 +08:00
host
ce85043a24
trace: 标注被截断的链路消息,避免误读为模型未写完
...
2026-10-29 实弹:468 字 final_answer 在链路里只剩前 300 字、
断在 fu 后,控制台照原样当助手回复展示,用户误以为模型
没写完。截断本身是设计(防链路文件写爆),缺的是标记。
- host.py _summarize_trace_item:agentMessage 超 300 字时
条目带 truncated=True,短消息不带,完整回复仍在任务
result_text 里,不在链路条目里。
- 控制台:TraceEntry 加 truncated 字段,mapTrace 与
traceLineText 在被截断的消息后标注“链路摘要已截断至
300 字,完整回复见右侧任务结果”,console.html 为构建产物同步。
- 单测:tests/test_host_trace.py 新增截断标记用例(468 字
截 300 字且带标记、短消息不带标记)。
验证:host 10 项、cloud test_task_trace 14 项全过;
React tsc+vite 构建通过,产物 322151 字节、含截断标注、
含 #150 的 total_tokens/首字/总耗时,无回退。
2026-10-30 01:01:50 +08:00
host
994c4ea5d1
console: 任务详情自动显示成本明细
...
打开详情就自动拉 GET /tasks/{id}/cost(不再只靠
“查成本”按钮出 JSON),详情顶部新一行:美元、总
token(实际/估算、缓存、无价单列)、轮数、fallback
次数;美元小于 1 美分时用 4 位小数,避免小任务
显示成 $0.00 误导成免费;加载中/失败有各自的
弱化文案,成本拉失败不影响详情其它内容;原
“查成本”按钮不动,仍可手动拉原始 JSON。
服务端不用改:成本接口与 _get_task 的 token 聚合
都已在 #150 / 详情 meta 那单里就位。
2026-10-30 00:39:13 +08:00
host
0f7162934b
console: 任务详情也显示首字、总耗时、token
...
列表行与详情共用同一口径:新抽 api/taskMeta.ts(首字/
总耗时/token 计算),TaskListSection 改 import 它(逻辑
原样不动),TaskDetailPanel 在状态行下方加一行:首字
方块 + 耗时 + token,title 里写口径。
详情的数据缺口一并补上:单任务接口 _get_task 此前走
_task_to_dict 默认 total_tokens=None,详情 token 只能
显示占位;现与列表一样用 _task_tokens_map 一次聚合
(单任务只多一条查询),详情直接出真数。
types.ts 里过期的“列表不回 token”注释同步更新。
新测试:单任务 GET /tasks/{id} 聚合回 total_tokens。
2026-10-30 00:39:13 +08:00
host
65a875ada9
console: 任务列表行显示首字、总耗时、token 栏位
...
任务列表每一行新增三项(筛选、搜索、选中高亮、状态点不动):
- 首字:行前小方块,prompt 第一个非空白字符(按码点取),
无 prompt 时用任务 id 首字符兜底;原 prompt 文案不动。
- 总耗时:只用列表已回时间戳算。终态用 finished_at -
started_at(与服务端 avg_duration_seconds 同口径);running
显示“进行中 + 已用时长”,随列表刷新更新;无 started_at
时用 created_at 兜底(含排队,title 注明口径)。格式:
3分12秒、1小时5分、1天1小时。
- token:栏位已接好,total_tokens 优先,actual +
estimated 分项加总次之;但列表接口 _task_to_dict 目前
不回任何 token 字段,单任务真数只在 GET /tasks/{id}/cost
里,所以当前显示“token —”,不编造、不逐个调 /cost
拖慢列表。服务端在列表里补 total_tokens 后本行自动出真数。
诚实边界:worker 每次认领重写 started_at,多轮续跑任务
的耗时是末次认领时长,不是历次之和;严格累计需服务端
保留首次 started_at 或累加各轮时长。token 的服务端缺口:
需在 _task_to_dict / 列表查询里按 task_id 聚合 cost_records
的 total_tokens,不需要新端点。
构建:npm run build(tsc + vite singlefile)0 退出,
dist/index.html 原样拷到 cloud/console.html,产物含
issue-first、耗时、token —,未动其它确认框。
2026-10-29 18:24:07 +08:00
host
7d400afa37
console: add goal-mode invincible option
...
DispatchSection gains a 'goal 模式无敌版' checkbox next to 'goal 模式':
checking it sends goal_mode=1 plus no_time_limit=1 (server already
accepts the field; the console just never exposed it). Plain goal
checkbox behavior is unchanged; invincible wins when both are
checked. Plan/coordinator mutual exclusion now covers invincible
too (it is a goal variant). TaskDetailPanel shows
'goal 模式无敌版(不限时)' when a task carries no_time_limit.
Help text states the honest boundary: worker/docker total timeouts
are lifted, the 600s single-turn host guard stays. Built with
npm run build (tsc+vite pass); console.html synced verbatim from
dist/index.html.
2026-10-29 17:58:50 +08:00
host
a68b63e0f1
console: API Key 区补生成/列表/撤销(调现有自助接口)
2026-10-29 12:51:00 +08:00
host
f02c513729
chat: 持久化继续消息,chat-history 交替历史
...
基线 main 811912c(PR #125 Muse 风格之后):服务端与单测与
9538825 相同;React 侧在 Muse 风格 ContinuePanel 上重放
chat-history 集成(新版输入框占位文案保持 Muse 风格的“消息”),
console.html 由新版 src 重新构建。
- 新表 task_continue_messages:POST /continue 的用户消息与状态改回
queued 同一事务落盘,409 被拒不留 phantom 消息
- GET /tasks/{id}/chat-history:prompt + 继续 + 后续消息 + 链路按
时间交错拼好返回;部署前继续以 legacy_continue_count 如实标注
- React ContinuePanel 优先用 chat-history,旧服务端自动回退
2026-10-29 07:01:57 +08:00
host
ebc5624893
console: React 生产级重写(左列表 + 中对话 + 右详情)
...
旧单页 console.html 换成 Vite + React + TypeScript 单文件构建产物
(309525 字节,sha 90345ec8…,重建字节一致),源码在
cloud/console-react/,改页面只改 src 再 npm run build:console,
产物不手改。布局:左侧列表(模块导航 + 任务列表)、中间标准对话
(实时链路时间线 + 继续会话聊天框,共用 Chat 组件)、右侧详情
(元数据、操作、评审、审批、协调子任务、子代理、线程)。
API 与后端语义未改,key 只存浏览器 localStorage。
6 个 console 标记单测随实现改名更新(意图不变:壳确实调了
这些接口、turn 信息仍在详情里、旧 goal 输入仍不存在);
P1 标记单测未动且通过。
2026-10-29 06:32:38 +08:00