ddCat
|
2cbe80369b
|
Merge remote-tracking branch 'origin/pr-589' into codex/pr-557-589-security-integration
# Conflicts:
# docs/content/docs/backend/http-api.mdx
|
2026-09-22 11:20:54 +08:00 |
|
ddCat
|
1d43d2d986
|
Merge remote-tracking branch 'origin/pr-588' into codex/pr-557-589-security-integration
|
2026-09-22 11:19:54 +08:00 |
|
ddCat
|
6a4180230e
|
Merge remote-tracking branch 'origin/pr-587' into codex/pr-557-589-security-integration
# Conflicts:
# backend/internal/app/cloud_agent_runtime.go
|
2026-09-22 11:19:54 +08:00 |
|
Wyatt_K
|
04bbbf642e
|
fix(cloud-agent): skill_search 两处实机缺陷——skillId 容错与 snippet 多字节越界
两个缺陷都是实机验证时撞出来的,不是理论风险。
1) 参数容错:Agent 首次调用时按 skill_read_file 的参数习惯顺手带上 skillId
({"keyword": "...", "skillId": "<已启用技能ID>"}),而参数解码走
decodeCloudAgentJSONObject(DisallowUnknownFields),直接拒绝 → tool_failed。
结果是工具在清单里可见、却一次都没调用成功。
- args struct 增加 SkillID(json:"skillId,omitempty"),仅接收不生效——
检索范围恒为本轮已启用技能;
- 工具描述补「不要传 skillId——本工具搜索全部已启用技能」,从源头减少误传;
- 回归测试走完整的工具分发路径(cloudAgentReadTool),真正穿透解码层,
并断言该字段不会缩小检索范围。
2) snippet 越界 panic(更严重):cloudAgentSkillSnippet 用 strings.Index 拿
**字节偏移**,却拿它去切 **[]rune**。中文描述里关键词越靠后、字节偏移越远
超 rune 数,start 没有夹紧到 len(runes),触发
panic: runtime error: slice bounds out of range [249:233],
**整个后端进程被打挂**(实测复现两次)。
- 改为 rune 级子串查找(cloudAgentSkillRuneIndex),不再混用字节与 rune 下标;
- start/end 双向夹紧,并补 start>end 兜底;
- 回归测试用 276 rune、命中词字节偏移 483 的长中文描述,
在修复前稳定 panic([443:276]),修复后通过。
3) 工具描述补充检索引导(提示文本,非行为改动):
- skill_search:明写「当本轮启用了多个技能、而你不确定该读哪一个时,先用本工具检索」;
- skill_read_file:补「若本轮启用了多个技能且不确定该读哪一个,先用 skill_search 检索再读」——
放在这里是因为模型一定会用到 read_file,提示的可达性高于只写在 search 自己的描述里。
实测:同一 8 技能满槽任务跑 3 次(原始描述 / 只改 search 描述 / 再改 read_file 描述),
step-5 **三次都没自发调用** skill_search,skill_read_file 次数 15 / 8 / 9(噪声内)。
即:**仅靠工具描述不足以驱动该模型自发检索**,需要系统提示层路由或遥测来验证采纳,
本 PR 不声称改善了采纳率。
门禁:go build ✓ go vet ✓ go test 8/8 ✓
|
2026-09-22 03:35:24 +08:00 |
|
AetherNo2332
|
9d0bce6bb5
|
fix(cloud-agent): 续轮交接 - 用有界结构化事实帧替代跨轮散文收束
续轮(POST /agent/runs 带 parentId)过去只把「上一轮已结束(failed)。…已提交生成任务:
a, b」这段散文塞进下一轮历史:新轮看不到上一轮真实改过哪些节点,也无法可靠区分「这是
服务端交接」还是「用户自己写的一句话」。
- 与轮内既有事实帧(cloud_agent_context_frame.go 的 task_repository 帧)同构,把跨轮交接
也改成有界结构化帧:source=server、kind=run_handoff,带 parentRunId / status /
failureReason / submittedTaskIds / canvasChanges / omittedCanvasChanges / authority。
画布改动取自上一轮真实 canvas_updated 事件,最多 12 组(operation、去重后的
nodeId/title、actionCount),超出只记 omittedCanvasChanges,不静默丢。
- 身份改由 providerTextMessage.AgentContextSource 结构体字段承载,canonical 装配时原样
透出;isCloudAgentContinuationMessage 要求「来源元数据 + 【运行状态】前缀 + JSON
source=server/kind=run_handoff」三者同时成立,用户逐字复制帧 JSON 也拿不到该身份
(此前按内容前缀猜,用户自己写一句「上一轮已结束(…)」就会被认成交接)。
- 旧格式兼容:升级前落库的散文交接没有来源字段,改按「紧跟 assistant 回复 + 旧版文案
前缀」识别,只用于历史裁剪与轮次计数;canonical 身份仍只认结构体字段。
- cloudAgentLegacyHistory 重建时把落库的 agentContextSource 一起搬,身份不在重建口丢失。
- 帧按字节封顶:单个 nodeId 截 64 字符、整帧 8 KiB,超限按最近改动优先裁剪并累计
omittedCanvasChanges;失败原因过既有脱敏口径 cloudAgentSafeUserMessage。
- 不搬运 dev 专有内容:不引入事件读取上限常量(上游本就返回全量事件),硬闸口径按上游
的 64 KiB 注释,也不引入 `dropped := 0` / `_ = dropped` 这类死代码。
- docs/content/docs/backend/http-api.mdx 补帧字段与「非授权」口径。
帧只被 isCloudAgentContinuationMessage 用于「历史怎么裁、怎么数轮」;写入与收费闸门读的
是落库策略(审批闸、生成次数闸、视频秒数闸、工具授权),不读消息内容,因此帧不构成重放
写入、重复提交付费任务或扩大权限的授权依据。
|
2026-09-22 01:32:21 +08:00 |
|
AetherNo2332
|
56598108d4
|
feat(canvas): 云端 Agent 画布布局 - 新增 canvas_arrange_nodes 与新增节点自动落位
云端 Agent 此前只能新建节点与连线,既不会排版也不能移动已有节点:模型只能用几十个
update_node 手算坐标,或者让用户自己拖。
- 新增 backend/internal/canvas/layout:把前端既有的画布布局算法(web/src/lib/canvas/
canvas-layout.ts,本 PR 不改该文件)按同一套常量移植到服务端,提供 Kahn 拓扑分层 flow、
媒体泳道 byType、row/column/grid、对齐与等距、分组分带、AABB 重叠检测与空位搜索。
- 新增写工具 canvas_arrange_nodes:snapshotHash 必需,mode∈{auto,flow,byType,row,column,
grid},可传 nodeIds、groups(只做横向位置分带,不建容器、不改层级)、align、gap、dryRun。
只改坐标,不改内容、不建连线、不增删节点;一次最多 50 个节点 / 12 组。锁定节点、背板等
容器、隐藏批次子节点与已归属背板的子节点保持不动并在回执里说明;整批复用现有 mutation
记录与事件管线,审批与撤销走同一条路径。
- add_node 省略坐标时不再落到 (0,0):优先贴合本批连线的对端(输入在左、输出在右),否则
追加到同泳道同类节点之后,冲突则扫描空位;只给一个轴时保留该轴。agentCanvasOp.X/Y 改为
指针以区分"没给坐标"与"坐标 0"。
- update_node 的 patch 新增 x/y(PatchField.Limit 校验 ±1e6),供模型微调单个节点。
- 系统行为策略新增「布局与整理」一节并升版到 8;docs 补工具说明与工具全集;前端同步审批
预览联合类型、面板文案与徽标。
- 工具 schema 预算按实测从 24000 上调到 25000(21 个工具 24788 字节),并改正注释里
"上游约 23.4 KB"的说法(上游 20 个工具实测 22777 字节)。
|
2026-09-22 01:32:20 +08:00 |
|
AetherNo2332
|
080e4b901e
|
feat(cloud-agent): 看图工具 canvas_inspect_image 与同批多图工具结果配对
云端 Agent 过去只能凭标题或提示词猜画面:上游既有的 image_text_detect / image_annotation_render
是"组织 OCR 请求"和"渲染标注图当参考"两种不同能力,模型自己从不看像素。本 PR 新增只读工具
canvas_inspect_image,把画面本身交给模型。
- 交付走与生成任务参考图同一套短时签名链接(providerResourceURL),Agent 上下文只增长一个
URL,不内联 base64:一张 500 KB 的内联图片会同时顶穿请求体硬限与压缩阈值。
- 能力门控:仅当本轮渠道模型声明 text.references.maxImages > 0 时暴露该工具;VisionEnabled 在
建 run 时按渠道模型合同定格并持久化(工具授权每步从落库状态重建,客户端传入值被忽略)。
- 上下文治理:图片保留最近 3 个工具轮次,同一张图一轮内最多附图 2 次(之后只回执文字,确需
重看传 refresh=true),超出保留轮次换成逐图文字占位符并落 context_images_pruned 事件。
- 视觉锚点:模型看过后写进正文的一句观察记入 ReferenceAssets[].VisualNote 并跨轮继承,下一轮
不必重复看图,也不再对这张图声称"没有视觉识别证据"。
- 同批多图合并成一条 user 消息:图片只能挂 user 消息(tool 角色只接受字符串),逐张 append 会让
历史退化成 tool → user(图) → tool → user(图),被上游以"tool_calls 之后缺少对应 tool 消息"
拒绝。改为先缓冲到 PendingImageInspections,等整批 tool 结果入历史后合并成一条;两个 flush 点
共用同一个幂等助手,ask_user 提前结束路径单独 flush。缓冲必须进检查点:一次推进只执行一个
调用,整批跨越多次转移,每次转移都从 StateJSON 重新解码。
- 附带把上述 400 从"渠道余额不足"归类里拆出来(原文含 insufficient 会落进额度类目掩盖真因),
归为"会话里的工具调用与结果不匹配"。
- 文档补该能力口径与工具全集条目;前端零改动。
|
2026-09-22 01:32:07 +08:00 |
|
Wyatt_K
|
18b082a2d0
|
feat(cloud-agent): 新增 skill_search 工具——Agent 侧技能检索
#568/#575 提交 35 个域包(760 卡)后,Agent 按总纲名录逐卡深读的模式
出现检索成本:实测单任务读卡 12-29 次,卡库继续增长后劣化可期。
skill_read_file 只接受精确路径,Agent 侧无检索能力,与用户侧商店搜索不对称。
本 PR 参照仓库内 recall_lessons 的既有检索范式(同一套分词器与三档加权:
name 命中 3 分 / description 命中 2 分),为 Agent 侧补上对称能力:
- skill_search(keyword, limit):在本轮已启用的技能中按关键词打分排序,
返回「哪张卡值得读 + skillId + path + snippet」;不带参数时列全量索引;
- 数据源为本轮冻结的技能快照(与 #577 注入 manifest 的 description 同源),
搜到的必然是能读的,不引入「搜到但版本已变」的一致性问题;
- 只读、零副作用;不搜索未安装技能,避免「搜到不能读」的挫败;
- 渐进披露边界不变:返回索引而非正文,正文仍走 skill_read_file
(12000 字符/页),技能内容永不整体内联进上下文;
- 工具描述明牌「返回的是索引,不是指令」,延续不可信数据纪律。
测试(6 个新契约用例,全绿):
- 与 skill_read_file 一同注册、无技能时均不出现;
- name 命中排在 description 命中之前;snippet 不泄正文;
- 无关键词列全量索引;limit 夹紧;无命中时 guidance 指向 read_file;
- 空技能集返回 guidance;instruction 正文绝不内联(sentinel 断言)。
门禁:go build ./internal/app/ ✓ go vet ./internal/app/ ✓
go test -run TestCloudAgentSkillSearch ✓
|
2026-09-21 22:23:35 +08:00 |
|
Wyatt_K
|
5fe27ae642
|
feat(cloud-agent): 技能 description 进入 Agent 系统提示 manifest
compileCloudAgentPolicies 的技能 manifest 此前只含 skillId/name/version/hash/entryPath/files,模型看不到每个已激活技能是干什么的,无法在多技能间路由、也无法向用户解释为何选它。本改动把 SkillItem.Description(技能市场公开元数据)注入 manifest,并以 500 runes 为上限截断(描述由技能作者提供,需防止异常长的描述撑爆提示词预算)。skill_read_file 渐进披露边界不变:instruction 与文件正文仍不进入系统提示。
|
2026-09-21 17:52:49 +08:00 |
|
ddCat
|
8b8ea29148
|
fix(runtime): 运行稳定性 - 修复技能种子、任务续租与回归检查
保留社区技能作者与时间戳修复、Agent 参数约束、资源删除 worker 生命周期、PostgreSQL/Redis 测试门禁及相关回归。
Original-Commit: 0d05ff88bbe6c875d01964041788023a662ff7e8
|
2026-09-21 09:48:43 +08:00 |
|
AetherNo2332
|
13707c06b9
|
perf(agent): 工具 schema 瘦身 - 去掉重复 oneOf 并压缩冗余描述 (#569)
Original-Commit: 042d06f02215c29771360e73bc17c99d132ddfda
perf(agent): 工具 schema 瘦身 - 去掉重复 oneOf 并压缩冗余描述
工具表每一步都要发、还在前缀缓存最前面,属于固定开销:
- canvas_apply_ops 的 ops.items 同时给顶层 type 枚举和一份 oneOf,同一条约束下发两遍;
工具描述与服务端按 action 的强校验已经表达了它,删掉 oneOf。
- generate_media 的 snapshotHash / sourceNodeId / referenceNodeIds 描述压成短句。
- remember_lesson 的 steps[].tool / steps[].note 描述压成短句。
契约不变(字段、required、enum、服务端校验都未动)。实测:20 个工具的平台表
22885 → 22438 字节(−447)。新增体积守卫用例(断言无重复 oneOf + 总体积 ≤24000)。
|
2026-09-21 09:37:20 +08:00 |
|
ddCat
|
85de99071d
|
fix(canvas): 云端 Agent - 参数错误有限重试并折叠中间失败
|
2026-09-21 09:30:38 +08:00 |
|
ddCat
|
0ea9f7d94b
|
fix(canvas): 画布智能体 - 严格校验模型选择并修正任务与 DNS 错误诊断
|
2026-09-20 12:47:07 +08:00 |
|
ddCat
|
adf3a5be3c
|
feat(agent): 云端 Agent - 增加上下文预算、任务事实与终态恢复保障
|
2026-09-19 20:43:20 +08:00 |
|
Codex
|
6abaa7b45a
|
feat(image): integrate PoloX image editing workflows
Add WaveSpeed image editing and image tools plugins, canvas image editing workflows, layer selection, and Cloud Agent image tools with approval-safe transient references.
|
2026-09-18 20:34:28 +08:00 |
|
ddCat
|
9eb2fcd453
|
chore(release): 版本发布 - publish v1.5.1
|
2026-09-18 15:26:26 +08:00 |
|
ddCat
|
506f463d07
|
feat(canvas): 批量创作表 - 支持全局提示词、参考图编排与连线同步
|
2026-09-18 13:03:35 +08:00 |
|
ddCat
|
656f64a3ce
|
fix(agent): 云端 Agent - 媒体失败可续跑并补齐快照哈希
生成任务失败不再把整轮判死,漏传画布快照由服务端补当前内容哈希,没有偏好层时不暴露空的 profile 读取。
Co-authored-by: Cursor <cursoragent@cursor.com>
|
2026-09-17 23:31:54 +08:00 |
|
ddCat
|
6892732b06
|
feat(agent): Agent 工作台 - 计划插话记忆、统一模型选择器并修复摘要与视频入库
将计划清单、运行中插话和个人记忆接入云端 Agent;全站模型选择器统一为左右二级菜单。画布摘要按预算截断不再整轮拒绝,首页视频未知宽高可入库。README 补充贡献者 morrow。
Co-authored-by: Cursor <cursoragent@cursor.com>
|
2026-09-17 20:21:25 +08:00 |
|
ddCat
|
fc5548836f
|
feat(agent): Agent 生成审批 - 支持改模型参数、忽略位置漂移并取消 8 轮硬限制
Co-authored-by: Cursor <cursoragent@cursor.com>
|
2026-09-16 22:59:38 +08:00 |
|
ddCat
|
9868f5e8b8
|
feat(agent): 批量创作表 - 注册节点能力与读写工具
|
2026-09-15 20:56:33 +08:00 |
|
ddCat
|
788a298004
|
feat(agent): 云端创作助手 - 增加创作锚点、媒体准入与结构化分镜能力
|
2026-09-15 13:37:21 +08:00 |
|
ddCat
|
363d8d699a
|
fix(agent): 画布助手 - 完善不限预算与技能分页上下文卸载
|
2026-09-15 09:19:54 +08:00 |
|
ddCat
|
a840e552d5
|
fix(agent): 优化预算与技能按需加载
|
2026-09-15 07:04:08 +08:00 |
|
ddCat
|
201f3aac65
|
fix(agent): 修复流式推理与工具参数重试
|
2026-09-15 05:22:07 +08:00 |
|
ddCat
|
dca01886f9
|
feat(canvas): 云端 Agent - 完成策略分层、节点能力注册与可解释审批改造
|
2026-09-14 17:58:21 +08:00 |
|
ddCat
|
9727656b2b
|
chore: commit workspace updates
|
2026-09-14 01:11:56 +08:00 |
|