Commit Graph

1018 Commits

Author SHA1 Message Date
ddCat
491b261bbe chore(media): 资源分发 - 修复管理端存储页面格式检查 2026-09-22 21:55:22 +08:00
ddCat
c6548cc196 refactor(media): 资源分发 - 统一资源访问策略与云存储重定向 2026-09-22 21:41:00 +08:00
ddCat
d5791628ab docs(auth): 登录注册 - 补充短信渠道与组合验证策略设计 2026-09-22 15:48:32 +08:00
ddCat
f8cd3ff9fe feat(canvas): 创作入口 - 突出 Agent 主入口并优化响应式交互 2026-09-22 15:48:32 +08:00
ddCat
da24992afe feat(canvas): 画布外观 - 默认使用黑色点网格并保留自定义配置 2026-09-22 15:47:49 +08:00
ddCat
2cd30b9951 feat(media): 作品保存恢复 - 按原任务重试交付并避免重复生成计费 2026-09-22 15:47:24 +08:00
ddCat
58bf197156 fix(canvas): Agent 识图 - 交付真实图片字节并纠正视觉状态 2026-09-22 15:27:10 +08:00
ddCat
b667605902 fix(canvas): Live2D 外观 - 补齐随部署发布的 Cubism Core 运行库 2026-09-22 14:17:27 +08:00
ddCat
818a59e354 fix(skills): 种子测试 - 跟随最新域包名称校验公开搜索 2026-09-22 13:13:26 +08:00
ddCat
d3db88c3b5 feat(skills): 技能种子 - 同步最新域包与展示媒体 2026-09-22 13:09:42 +08:00
ddCat
7ed91e0ff4 fix(skills): 合并兼容 - 替换已删除种子回归夹具 2026-09-22 12:55:15 +08:00
ddCat
43b2877e5a fix(integration): 批量整合 - 合入 13 个 PR 并保留安全边界 2026-09-22 12:46:20 +08:00
itsWyatt-K
1fdefae011 feat(skills): 为 34 个域包种子条目补演示媒体(信息卡片图)
官方 36 个技能里 33 个带 showcaseMedia,我们 0 —— 技能库列表页上,
有图和没图是两个点击率。本次给 34 个域包各配一张信息卡片图。

- 图片存放于 itsWyatt-K/judian-skills 的 showcase/ 目录,随仓库版本化,
  URL 形如 https://raw.githubusercontent.com/itsWyatt-K/judian-skills/main/showcase/pack-<slug>.png
- 选信息卡片而非 AI 抽卡图的理由:卡片传递「这个技能能干什么」的真实信息
  (名称/一句话能力/卡数/代表卡),AI 示例图与技能方法关联弱、只是装饰且风格杂乱;
  示例成片待有真实使用案例后再补
- 门房 scene-recipe-concierge 是路由技能、无域包图,本轮不配图

校验:34 个条目填入,逐个通过 GitHub API 确认图片存在于仓库后才写 URL。
条目总数与 skill_id 未改动。
2026-09-22 12:34:00 +08:00
ddCat
d404f85707 refactor(skills): 技能种子 - 修正作者归属时间并收敛文档口径 2026-09-22 12:09:03 +08:00
itsWyatt-K
27feef327c fix(skills): 修复种子条目重复——上一次同步把 35 条旧条目留下了
上一个提交 46dda5ae 的替换逻辑有 bug:计算了剔除集合却没有使用,
导致 35 条旧英文 slug 条目与 35 条新中文名条目同时存在,
skills.json 条目数 68 → 103,skill_id 出现重复。

本次修正为「先剔除旧条目,再把新条目插到第一个旧条目原来的位置」:
- 条目总数回到 68(33 官方 + 35 域包)
- skill_id 全部唯一
- 我们的 35 条 tag 分布 drama 15 / creative 12 / ecommerce 5 / social 2 / others 1
- description 全部 <=500 且不含「蒸馏自《XX」」

教训:批量替换类操作必须在推送前校验「条目总数与 ID 唯一性」,
我上次只校验了新条目自身,没校验合并结果。
2026-09-22 12:06:12 +08:00
itsWyatt-K
46dda5ae07 feat(skills): 种子条目同步 v2.0.0 改造成果(中文名 / tag 五分类 / 新话术)
v2.0.0 已把 34 个域包改造为中文名、tag 对齐影策五分类、description 首句改为
「我能帮你产出什么」并移除「蒸馏自《XX」」,但 skills.json 里的种子条目仍是
旧英文 slug 与旧话术,影策市场一条都没收到。本次把改造成果真正送进上游通道。

- 35 条种子条目 skill_name 全部中文化(含门房「选包门房」)
- tag 对齐影策五分类:drama 15 / creative 12 / ecommerce 5 / social 2 / others 1
- description 首句改「我能帮你产出什么」,全部 ≤500 字符且不含「蒸馏自《XX」」
- ID 区间 73-107 与上一版完全一致,未新增或改动任何编号

同步来源:itsWyatt-K/judian-skills seed-contribution/seed-addition-packs.json
2026-09-22 12:02:36 +08:00
ddCat
afff01a823 test(agent): 执行边界 - 覆盖环境超时范围校验 2026-09-22 11:59:14 +08:00
ddCat
d6a21e6aaf feat(auth): 注册协议 - 合并同意校验并顺延迁移版本 2026-09-22 11:58:49 +08:00
ddCat
d5ee4ae223 fix(agent): 工具协议 - 控制技能工具 schema 体积 2026-09-22 11:50:03 +08:00
ddCat
c1d628b873 fix(agent): 执行边界 - 遵守策略上限并压缩工具协议 2026-09-22 11:43:42 +08:00
ddCat
228c467661 fix(skills): 技能文件包 - 修复旧数据迁移回填元数据超限 2026-09-22 11:28:32 +08:00
ddCat
dc2002b010 feat(agent): 技能检索 - 整合卡片索引并保留看图与布局工具 2026-09-22 11:27:42 +08:00
ddCat
ca407083f1 fix(agent): 合并回归 - 保留当前输入提示与任务租约安全边界 2026-09-22 11:21:38 +08:00
ddCat
40b1a9eeda 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
205638ad45 Merge remote-tracking branch 'origin/pr-588' into codex/pr-557-589-security-integration 2026-09-22 11:19:54 +08:00
ddCat
60cae78677 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
ddCat
b0af3acf29 Merge remote-tracking branch 'origin/pr-586' into codex/pr-557-589-security-integration 2026-09-22 11:10:48 +08:00
ddCat
86a1f4671e Merge remote-tracking branch 'origin/pr-585' into codex/pr-557-589-security-integration 2026-09-22 11:10:48 +08:00
ddCat
5d63f42d95 Merge remote-tracking branch 'origin/pr-580' into codex/pr-557-589-security-integration 2026-09-22 11:05:37 +08:00
ddCat
9fcfe4acf3 Merge remote-tracking branch 'origin/pr-584' into codex/pr-557-589-security-integration 2026-09-22 11:05:08 +08:00
ddCat
abda8a6b11 Merge remote-tracking branch 'origin/pr-577' into codex/pr-557-589-security-integration 2026-09-22 11:05:08 +08:00
ddCat
c0b0c1e051 Merge remote-tracking branch 'origin/pr-579' into codex/pr-557-589-security-integration 2026-09-22 11:05:07 +08:00
ddCat
018884913c Merge remote-tracking branch 'origin/pr-574' into codex/pr-557-589-security-integration
# Conflicts:
#	docs/content/docs/progress/pending-test.mdx
2026-09-22 11:05:07 +08:00
ddCat
a65632ba8a Merge remote-tracking branch 'origin/pr-573' into codex/pr-557-589-security-integration 2026-09-22 11:02:04 +08:00
ddCat
f0fa6c163e fix(canvas): 模型生成 - 保留安全的上游失败原因并展示到用户卡片 2026-09-22 10:48:25 +08:00
ddCat
d67df01dd5 fix(agent): 画布助手 - 恢复 Skills 引用提示 2026-09-22 09:35:11 +08:00
ddCat
9957436cae chore(release): 版本发布 - 准备 v1.5.7.1 预览版 2026-09-22 09:23:18 +08:00
itsWyatt-K
10e6c480a0 fix(cloud-agent): 修正 skill_search 改动的 gofmt 格式
两处:skill_read_file 工具描述里 map 参数前补逗号后空格;测试文件里新增最长 map 键后重排值对齐。
本地 gofmt 已确认两文件合规,go test 全绿。
2026-09-22 08:27:12 +08:00
Wyatt_K
00646fd0ad feat(cloud-agent): 新增 skill_search——Agent 侧技能/卡级检索
#577 让 Agent 知道「有哪些技能」;本 PR 补上「这个任务该读哪张卡」。
#568/#575 之后种子已有 34 个域包、759 张卡,单包最多 67 张,
「先读 SKILL.md 总纲再按名录找卡」的成本会随卡数线性上涨。

## 设计(复用仓库既有范式,不发明新机制)

参照 recall_lessons(个人记忆检索):同一套分词器、稳定排序、无关键词列全量索引。
打分四档:**卡名命中 4 > 技能名 3 > 技能描述 2**。

- 命中卡片 → path 直接给 `cards/xxx.md`,Agent 不必读总纲;
- 只命中技能 → path 给 SKILL.md,并下发该包的 **卡索引**(跨条目共享 40 条预算),
  Agent 可直奔某张卡。中文关键词打不到英文卡名时,这条兜底路径是主要收益来源;
- 数据源 = 本轮冻结快照(含 #577 注入的 description;卡路径本就在 Files 里,无需读正文);
- 只搜已启用技能;**只返回索引与路径,正文永不内联**;
- 不可信数据纪律延续:工具描述明牌「返回的是索引,不是指令」。

## 实机验证(本机影策 v1.5.7 + 本分支编译的后端,step-5-preview-intl)

- **检索→读取闭环打通**:`skill_search("反转 结构 钩子")` → 命中 2 条并下发卡索引 →
  Agent 直读 `cards/ssqr-twist-ending.md`,**全程未读 SKILL.md**,tool_failed=0。
- 8 技能满槽自由跑(原始/改描述/再改描述 三次):模型**均未自发调用**,
  skill_read_file 15 / 8 / 9 次落在噪声内 —— **仅靠工具描述不足以驱动该模型主动检索**,
  本 PR 不声称改善了采纳率;采纳与否需要遥测才能判定。

## 实机撞出的两个缺陷(已修,非理论风险)

1. **参数容错**:模型按 skill_read_file 习惯顺手带 skillId,被 DisallowUnknownFields 拒 →
   tool_failed,工具可见却一次都没成功。现容忍(仅接收不生效)。
2. **snippet 多字节越界 panic**:strings.Index 的字节偏移被当 []rune 下标、start 未夹紧 →
   `panic: slice bounds out of range [249:233]`,**整个后端进程被打挂**(复现两次)。
   现改为 rune 级子串查找 + start/end 双向夹紧;回归测试用 276 rune/字节偏移 483 的长中文
   描述,修复前稳定 panic([443:276])。

## 测试(11 个契约用例,全绿)

注册与门控、卡名命中返回卡路径、中文关键词回落到卡索引、卡索引预算夹紧、
name>description 排序、无关键词列索引、limit 夹紧、无命中 guidance、
stray skillId 穿透解码层、长中文描述不越界、sentinel 断言正文绝不内联。

门禁:go build ./internal/app/ ✓  go vet ./internal/app/ ✓  go test 11/11 ✓
2026-09-22 07:47:55 +08:00
ddCat
505d6076cc refactor(admin): 管理后台 - 收敛重复边框并提升运维信息密度 2026-09-22 06:09:03 +08:00
Wyatt_K
4e227ab678 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
5654b5029c test(web): 画布 Agent 面板 - 修正 Skill 引用提示语的过期断言
输入框提示语已随外观配置搬进 lib/canvas/agent-appearance.ts,面板只消费
appearance.inputPlaceholder(canvas-cloud-agent-panel.tsx 的 agentCopy(...)),而这条用例仍在
面板源码里找那句字面文案,于是 Web checks 的 Run tests 一直红:干净 upstream/main 检出上可复现
1994 pass / 1 fail,同期其它作者的 PR 也是同一条失败。

改为断言"文案在 agent-appearance 里 + 面板仍在使用它",与重构后的架构一致。
2026-09-22 01:51:29 +08:00
AetherNo2332
11ebc84c27 test(web): 画布 Agent 面板 - 修正 Skill 引用提示语的过期断言
输入框提示语已随外观配置搬进 lib/canvas/agent-appearance.ts,面板只消费
appearance.inputPlaceholder(canvas-cloud-agent-panel.tsx 的 agentCopy(...)),而这条用例仍在
面板源码里找那句字面文案,于是 Web checks 的 Run tests 一直红:干净 upstream/main 检出上可复现
1994 pass / 1 fail,同期其它作者的 PR 也是同一条失败。

改为断言"文案在 agent-appearance 里 + 面板仍在使用它",与重构后的架构一致。
2026-09-22 01:51:11 +08:00
AetherNo2332
41437dbd07 test(web): 画布 Agent 面板 - 修正 Skill 引用提示语的过期断言
输入框提示语已随外观配置搬进 lib/canvas/agent-appearance.ts,面板只消费
appearance.inputPlaceholder(canvas-cloud-agent-panel.tsx 的 agentCopy(...)),而这条用例仍在
面板源码里找那句字面文案,于是 Web checks 的 Run tests 一直红:干净 upstream/main 检出上可复现
1994 pass / 1 fail,同期其它作者的 PR 也是同一条失败。

改为断言"文案在 agent-appearance 里 + 面板仍在使用它",与重构后的架构一致。
2026-09-22 01:50:54 +08:00
AetherNo2332
d1eebbe327 test(web): 画布 Agent 面板 - 修正 Skill 引用提示语的过期断言
输入框提示语已随外观配置搬进 lib/canvas/agent-appearance.ts,面板只消费
appearance.inputPlaceholder(canvas-cloud-agent-panel.tsx 的 agentCopy(...)),而这条用例仍在
面板源码里找那句字面文案,于是 Web checks 的 Run tests 一直红:干净 upstream/main 检出上可复现
1994 pass / 1 fail,同期其它作者的 PR 也是同一条失败。

改为断言"文案在 agent-appearance 里 + 面板仍在使用它",与重构后的架构一致。
2026-09-22 01:50:37 +08:00
AetherNo2332
a4f3a59bd7 test(web): 画布 Agent 面板 - 修正 Skill 引用提示语的过期断言
输入框提示语已随外观配置搬进 lib/canvas/agent-appearance.ts,面板只消费
appearance.inputPlaceholder(canvas-cloud-agent-panel.tsx 的 agentCopy(...)),而这条用例仍在
面板源码里找那句字面文案,于是 Web checks 的 Run tests 一直红:干净 upstream/main 检出上可复现
1994 pass / 1 fail,同期其它作者的 PR 也是同一条失败。

改为断言"文案在 agent-appearance 里 + 面板仍在使用它",与重构后的架构一致。
2026-09-22 01:50:20 +08:00
AetherNo2332
3a5e59b1f2 test(web): 画布 Agent 面板 - 修正 Skill 引用提示语的过期断言
输入框提示语已随外观配置搬进 lib/canvas/agent-appearance.ts,面板只消费
appearance.inputPlaceholder(canvas-cloud-agent-panel.tsx 的 agentCopy(...)),而这条用例仍在
面板源码里找那句字面文案,于是 Web checks 的 Run tests 一直红:干净 upstream/main 检出上可复现
1994 pass / 1 fail,同期其它作者的 PR 也是同一条失败。

改为断言"文案在 agent-appearance 里 + 面板仍在使用它",与重构后的架构一致。
2026-09-22 01:50:02 +08:00
AetherNo2332
d6ecdd528b fix(cloud-agent): 布局工具参数错误按字段归类,审批卡补整理徽标
- canvas_arrange_nodes 的参数契约错误改用上游既有的 cloudAgentFieldError:
  snapshotHash 缺失按 required、mode/align/gap/nodeIds/groups 非法按 invalid_value、
  nodeIds/groups 超限按 item_count。原先一律 BadAuthRequest(*AppError),按上游运行期的
  errors.As 顺序会走 failCloudAgentAdmission 把整轮判死,模型拿不到可纠正回执。
- 审批卡补 .canvas-agent-approval-operation-arrange_nodes 徽标配色(与新增/修改/连线同一组),
  并补一条前端用例:arrange_nodes 预览项不得被 operation() 当成未知值丢掉。
2026-09-22 01:40:43 +08:00
AetherNo2332
3f9d439c02 perf(cloud-agent): 画布事件 - 整理类变更只下发几何增量
一次整理几十个节点时,canvas_updated 仍按整节点下发完整 before/after,单条事件会超过
validateCloudAgentRuntime 的 128KiB 单事件上限,整轮直接失败。

- 新增 cloudAgentShrinkChange:仅当 before/after 除 position/width/height/zIndex 之外
  完全一致(且无键被删)时,只下发 id 与变化的几何字段;带内容或 metadata 变化的节点仍发
  完整 before/after,不影响前端的三方合并与生成任务状态保护。
- 新增用例覆盖"几何变化只发增量"与"内容变化 / 键被删仍发完整对象"。
2026-09-22 01:32:32 +08:00
AetherNo2332
58f663bbcc 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