chore(sync): 上游同步 - 合并 upstream/main 至 ee6b3446,按新 module 路径收敛冲突
This commit is contained in:
@@ -31,7 +31,7 @@ Schema 45 新增 `upload_reservations`:`id`、`user_id`、`size`、`day`、`ex
|
||||
|
||||
## 结构迁移与版本
|
||||
|
||||
当前结构版本为 42。版本 42 `cloud_agent_pi_sessions` 新增 `cloud_agent_pi_sessions` 表,按运行 ID 保存 Pi 原生 JSONL 会话快照、用户 ID、乐观并发 revision 和更新时间;会话正文由 Agent runtime 管理,Go 只将其作为不透明快照读写,不替代有界控制检查点、事件日志或任务记录。版本 41 `resource_thumbnail` 为 `resources` 增加缩略图元数据。版本 40 `builtin_skill_tombstones` 新增内置技能删除记录,管理员删除平台技能后,后续启动同步不会重新创建该技能;版本 39 `skill_library_categories` 新增 `skill_library_categories` 表,并为 `user_skill_states` 增加 `library_category_id`,保存个人技能库分类及每个用户对技能的归类;分类不改变 `skills.tag` 的技能广场共享分类。版本 38 `prefixed_id_sequence_reconcile` 创建(若缺失)并校准 `id_sequences`:`CHANNEL`、`MODEL`、`PTIER`、`ATTEMPT`、`LMODEL`、`REVISION`、`ROUTE` 按对应业务表的最大有效 ID 前移,包含软删除记录,不回退已有序列、不重写业务 ID。分配新 ID 时再次校准并检查冲突;SQLite → PostgreSQL 迁移完成后也校准序列。
|
||||
当前结构版本为 49。版本 49 `banner_sort_order` 为 `banner_announcements` 增加可配置的 `sort_order` 展示顺序;版本 48 `channel_proxy_url` 为 `model_channels` 增加渠道级出站代理地址 `proxy_url`,支持 `socks5://`、`http://`、`https://`;留空时沿用全局代理。代理地址只返回管理员视图,普通用户目录不暴露渠道代理或其中的认证信息。版本 42 `cloud_agent_pi_sessions` 新增 `cloud_agent_pi_sessions` 表,按运行 ID 保存 Pi 原生 JSONL 会话快照、用户 ID、乐观并发 revision 和更新时间;会话正文由 Agent runtime 管理,Go 只将其作为不透明快照读写,不替代有界控制检查点、事件日志或任务记录。版本 41 `resource_thumbnail` 为 `resources` 增加缩略图元数据。版本 40 `builtin_skill_tombstones` 新增内置技能删除记录,管理员删除平台技能后,后续启动同步不会重新创建该技能;版本 39 `skill_library_categories` 新增 `skill_library_categories` 表,并为 `user_skill_states` 增加 `library_category_id`,保存个人技能库分类及每个用户对技能的归类;分类不改变 `skills.tag` 的技能广场共享分类。版本 38 `prefixed_id_sequence_reconcile` 创建(若缺失)并校准 `id_sequences`:`CHANNEL`、`MODEL`、`PTIER`、`ATTEMPT`、`LMODEL`、`REVISION`、`ROUTE` 按对应业务表的最大有效 ID 前移,包含软删除记录,不回退已有序列、不重写业务 ID。分配新 ID 时再次校准并检查冲突;SQLite → PostgreSQL 迁移完成后也校准序列。
|
||||
|
||||
版本 36 `cloud_agent_gemini_cache` 创建 `cloud_agent_gemini_caches`,保存用户范围内的官方 Gemini 缓存元数据;版本 37 `cloud_agent_gemini_cache_identity` 将缓存标识约束修正为 `(user_id, cache_key)`,移除旧的全局 cache_key 唯一索引。版本 35 `auth_notifications` 为认证通知与组合验证补齐 `auth_verifications`、`notification_quotas`、`sms_channels`、`sms_records` 四张表,并为 `users` 增加 `phone`、`email_verified_at`、`phone_verified_at`,为 `email_verification_codes` 增加 `attempts`;同时创建非空手机号唯一索引。版本 34 `task_media_recovery` 为 `tasks` 增加 `media_recovery_json`(text)和 `media_stage`(最长 24 字)。版本 33 `oauth_state_accepted_terms` 为 `o_auth_states` 增加非空布尔列 `accepted_terms`,默认 `false`,不替历史流程补造同意记录。
|
||||
|
||||
@@ -264,7 +264,7 @@ schema v27 为 `channel_model_price_tiers` 和 `billing_orders` 添加 `cost_con
|
||||
| `announcements` | 保存管理员发布的系统公告 | `pinned` 只改变排序;`image_resource_id` 只能绑定由当前管理员上传并在发布事务中消费的公告配图草稿 |
|
||||
| `announcement_image_drafts` | 标记尚未发布的公告配图资源 | 发布/更新事务消费草稿;取消编辑显式回收,超过 24 小时的异常遗留草稿由后台清理 |
|
||||
| `user_announcement_reads` | 保存用户已读状态 | 同一用户和公告唯一;公告重新发布时清除旧已读记录 |
|
||||
| `banner_announcements` | 保存首页顶部常驻展示的滚动通知条 | 与系统公告完全独立:只有标题、图标与跳转链接,无正文、无配图、无已读状态;`link` 仅接受 `http(s)` 外链或 `/` 开头的站内路径;`status` 为 `active` / `disabled`,`starts_at` / `ends_at` 构成生效窗口(可预约未来开始);`title_runs` 以 JSON 文本保存标题的样式分段;`notice_type` 决定通知条底色,`icon` 是标题前的图标键 |
|
||||
| `banner_announcements` | 保存首页顶部常驻展示的滚动通知条 | 与系统公告完全独立:只有标题、图标与跳转链接,无正文、无配图、无已读状态;`link` 仅接受 `http(s)` 外链或 `/` 开头的站内路径;`status` 为 `active` / `disabled`,`sort_order` 越小越靠前,`starts_at` / `ends_at` 构成生效窗口(可预约未来开始);`title_runs` 以 JSON 文本保存标题的样式分段;`notice_type` 决定通知条底色,`icon` 是标题前的图标键 |
|
||||
|
||||
活动公告按置顶状态优先、发布时间倒序返回;置顶不会绕过关闭状态或用户登录校验。公告只要求标题,正文和配图均可为空。用户首次进入工作区时会自动看到未读公告,可以只关闭本次或选择今日不再提醒;主动打开公告中心后才会写入服务端已读状态。替换或移除配图时,公告更新、旧资源记录删除和物理删除任务入队在同一数据库事务完成。
|
||||
|
||||
|
||||
@@ -5,6 +5,13 @@ description: 从产品功能快速定位主要代码入口
|
||||
|
||||
# 代码功能地图
|
||||
|
||||
## 可美 KM Seedream
|
||||
|
||||
- 声明式请求、响应与参数合同:`plugin-packages/km-kemei-seedream/manifest.json`、`docs/interface.md`;分发包:`plugin-packages/km-kemei-seedream.yingce-plugin`。
|
||||
- 后端默认能力与预设:`backend/internal/app/model_capability_defaults.go`、`model_capability_kemei.go`;档位校验:`model_capability_validate.go`。
|
||||
- 前端预设与选择:`web/src/lib/kemei-image-presets.ts`、`image-resolution-tiers.ts`、`image-size-presets.ts`、`model-capabilities.ts`;界面入口:`web/src/components/image-size-picker.tsx`、`image-size-presets-editor.tsx`。
|
||||
- 协议回归:`backend/internal/protocol/km_kemei_seedream_test.go`;前后端能力与尺寸测试位于对应测试目录。
|
||||
|
||||
## 自定义更新公告
|
||||
|
||||
- 后台编辑:`web/src/pages/admin/settings/components/update-announcement-editor.tsx`;版本、排序与草稿校验:`web/src/lib/update-announcement.ts`。
|
||||
@@ -38,10 +45,17 @@ description: 从产品功能快速定位主要代码入口
|
||||
| 技能库 | `web/src/pages/skills/` | `services/api/skills.ts`、`services/skill-runtime.ts`、`components/skills/skill-runtime-picker.tsx` |
|
||||
| 画布列表 | `web/src/pages/canvas/index.tsx` | `stores/canvas/use-canvas-store.ts` |
|
||||
| 画布编辑器 | `web/src/pages/canvas/project.tsx` | `pages/canvas/canvas-project-*`、`pages/canvas/use-canvas-*`、`components/canvas/`、`lib/canvas/`、`stores/canvas/` |
|
||||
| 公开分享 | `web/src/pages/canvas/shared.tsx` | `components/canvas/infinite-canvas.tsx`、`services/api/canvas-share.ts` |
|
||||
| 公开分享 | `web/src/pages/canvas/shared.tsx` | `components/canvas/canvas-viewport.tsx`、`services/api/canvas-share.ts` |
|
||||
| 管理后台 | `web/src/pages/admin/`、`router.tsx` | `admin-context.tsx`、`users/`、`channels/`、`logs/`、`storyboard-prompts/`、`settings/`、`components/agent-lessons-panel.tsx` |
|
||||
| 支付 CSV 导出 | `web/src/pages/admin/payments/payments-page.tsx` | `services/api/payments.ts`、`AdminExportButton`;后端 `handler/payment_export.go`、`app/payment_export.go`、`repository/payment_export.go`(共享筛选、只读快照) |
|
||||
|
||||
## AI 拆图工作流
|
||||
|
||||
- 配置入口:`web/src/components/canvas/canvas-node-layer-decomposition-dialog.tsx`;编排、并行生成与重试:`web/src/pages/canvas/use-canvas-media-tools.ts`、`use-canvas-generation-retry.ts`。
|
||||
- 规划与策略:`web/src/lib/canvas/canvas-image-layer-plan.ts`、`canvas-image-layer-strategy.ts`;原图、规划请求、提取与合成:`web/src/services/canvas-image-layer-*.ts`。
|
||||
- 图层组和素材保存:`web/src/pages/canvas/use-canvas-image-layer-groups.ts`、`use-canvas-image-layer-materials.ts`;任务恢复与复制规则:`web/src/lib/canvas/canvas-generation-task-sync.ts`、`canvas-node-copy.ts`。
|
||||
- 看图资源归属及实际像素:`backend/internal/app/provider_media_hydration.go`;透明 PNG 参数:`plugin-packages/image-tools/manifest.json`。
|
||||
|
||||
## 画布核心
|
||||
|
||||
云端 Agent 的提示词维护边界见[画布 Agent 提示词与用户意图](/docs/backend/agent-prompt-policy):行为策略在版本化 md,动态事实由 `cloud_agent_policy.go` 编译,运行状态消息由 `cloud_agent_prompt_context.go` 统一编码;`cloud_agent_anchor.go` 不再推断用户授权或锁定首轮目标。
|
||||
@@ -63,7 +77,7 @@ description: 从产品功能快速定位主要代码入口
|
||||
| 派生渲染模型和画布分层 | `web/src/pages/canvas/use-canvas-render-model.ts`、`canvas-project-world-layers.tsx`、`canvas-project-context-menu.tsx`、`canvas-project-status-dialogs.tsx` |
|
||||
| 顶栏、反馈和 screen-space 浮层 | `web/src/pages/canvas/canvas-project-top-bar.tsx`、`canvas-project-feedback.tsx`、`canvas-project-selection-toolbar.tsx`、`components/canvas/canvas-workspace-overlays.tsx` |
|
||||
| 媒体弹窗装配 | `web/src/pages/canvas/canvas-project-media-dialogs.tsx` |
|
||||
| 画布视口、拖拽、缩放和框选 | `web/src/components/canvas/infinite-canvas.tsx`、`web/src/lib/canvas/canvas-live-viewport.ts` |
|
||||
| 画布视口、拖拽、缩放和框选 | `web/src/components/canvas/canvas-viewport.tsx`、`web/src/lib/canvas/canvas-live-viewport.ts` |
|
||||
| 节点渲染与节点工具 | `web/src/components/canvas/canvas-node.tsx`、`canvas-node-hover-toolbar.tsx`、`canvas-node-toolbar.tsx` |
|
||||
| 图片多角度、宫格切分与多选框 | `canvas-node-angle-dialog.tsx`、`canvas-angle-scene.tsx`、`canvas-grid-split-picker.tsx`、`web/src/lib/canvas/canvas-grid-split.ts`、`canvas-selection.ts` |
|
||||
| 生成 Composer | `web/src/components/canvas/canvas-node-prompt-panel.tsx`、`canvas-config-composer.tsx` |
|
||||
@@ -165,3 +179,12 @@ HTTP 请求 -> handler -> service(稳定导入面 / 别名)-> app(组合
|
||||
`internal/skills/skill_curation.go` 负责校验,`internal/repository/skill_curation.go` 负责分类持久化与 CAS 审计交易,handler/app bridge 接入原有技能域。
|
||||
|
||||
`skill_curation_roots.go` 扩展动态根维护、有效根查询和空表回落;数据库迁移 47 接续 46。
|
||||
|
||||
## 创作首页纵深画廊与灵感库
|
||||
|
||||
- `web/src/pages/create/creation-inspiration-tunnel.tsx`、`creation-inspiration-tunnel.css`:纵深画廊的排布、随机取样、封面就绪门控与样式。
|
||||
- `web/src/pages/inspirations/`:灵感页(`index.tsx`)、详情弹窗、编辑弹窗与 `inspirations.css`。
|
||||
- `web/src/lib/inspirations/catalog.ts`、`resolve.ts`、`source-revisions.ts`:来源登记表、条目类型与解析、原创条目、上游版本号。
|
||||
- `web/src/services/inspiration-catalog.ts`:全量目录与画廊池的运行时加载、内存缓存与失败退回。
|
||||
- `web/src/stores/use-inspiration-store.ts`:自建/覆盖/隐藏/收藏的本地持久化与导入导出。
|
||||
- `web/scripts/import-inspirations.mjs`:外部来源同步、等距抽取、缩略图生成与画廊池落盘;产物在 `web/public/inspirations/` 与 `web/public/inspiration-thumbs/`。
|
||||
|
||||
@@ -5,6 +5,25 @@ description: 信封、错误码与 OpenAPI
|
||||
|
||||
# HTTP API 合同
|
||||
|
||||
## Agent 画布权限与大事件
|
||||
|
||||
自由画布和项目关联画布均使用 `canvas_projects`。Agent 运行时按登录账号和画布 ID 查询归属,不能把所属项目 ID 当作画布 ID;画布不存在、属于其他账号或数据库读取失败时,不声明读写及导出权限。
|
||||
|
||||
`canvas_updated` 的画布增量超过单事件 128 KiB 上限时,复用 `requiresRefresh: true` 通知客户端重新读取完整画布,优先保留操作摘要;摘要仍超限则仅发送刷新通知。画布正文、历史和操作回执仍完整保存,普通大小事件继续携带 `canvasPatch`。不提高事件上限、不截断正文、不修改审批暂停或模型调度判断。
|
||||
## Agent 模型输出限制
|
||||
|
||||
Pi 模型桥在保存待执行调用之前,复用单步输出限制校验:一次回复最多 8 个工具调用,正文最多 32000 字节。超限时整批未执行,释放本步模型任务并附带 `invalid_output` 及具体上限要求模型分批纠正;与既有异常重试共用首次失败后最多 3 次的上限,不截取部分调用执行。纠正请求仍是正常计费的文本模型任务,不创建媒体任务。
|
||||
|
||||
系统行为策略版本升至 14,明确工具调用数量与单个 `canvas_apply_ops` 操作数量的区别。已有会话保留其冻结策略快照;部署后用新会话验证新提示词,不修改历史检查点。
|
||||
## Agent 分镜连线参数反馈
|
||||
|
||||
素材绑定使用“素材→分镜”和 `toHandleId: row:<rowId>`;镜头输出使用“分镜→图片/视频”和 `fromHandleId: row:<rowId>`。`rowId` 必须是读取工具返回的真实行 ID,不能用镜头编号代替。普通节点连线与镜头行连线按 handle 区分,已有整表连线不代表该行已经绑定。
|
||||
|
||||
handle 放错端点、格式错误或行 ID 不存在时,工具错误回执提供具体 `field`(如 `ops[0].fromHandleId`)、`issue`、方向说明及连线参数模板,不再使用无关的新增节点示例。模板不会被自动执行,不自动交换端点或修改原调用。权限、快照和重复连线校验保持不变;工具契约版本为 v4,重启后端后新会话使用更新后的说明。
|
||||
## KM 图片尺寸能力
|
||||
|
||||
图片能力 `size.presets[].tier` 在已有档位之外接受 `1.5k`;前端档位选择、请求归一化与服务端预设校验保持一致。`km-kemei-seedream` 默认 `2048x2048`、单次一张、最多十张参考图,提供二十四个精确尺寸。透明输出使用插件扩展字段,不开启宿主通用透明背景开关。模型能力仍保存在现有 JSON 字段,无数据库迁移或新端点。
|
||||
|
||||
## 注册邮箱等价检查
|
||||
|
||||
公开注册与邮箱绑定的唯一性检查将 `gmail.com` 和 `googlemail.com` 视为同一域,移除本地部分的点及 `+` 后缀。例如 `a.b+x@googlemail.com` 与 `ab@gmail.com` 不允许创建两个账号。其他域保留点和 `+`;现有域名白名单规则保持不变。
|
||||
@@ -48,6 +67,10 @@ description: 信封、错误码与 OpenAPI
|
||||
|
||||
当前自动签名能力:公开 CDN、七牛私有下载签名和对象存储源站签名。阿里云/腾讯云私有 CDN 签名尚未自动支持,不能仅填写 CDN 域名就宣称已命中 CDN。真实 CORS、Range、CDN 命中率及账单收益必须在实际云环境通过浏览器网络记录和服务端流量观测验收。
|
||||
|
||||
## AI 拆图视觉规划输入
|
||||
|
||||
文本生成任务的 `metadata.edit = "layer-planning"` 使用图片参考时,服务端从当前用户归属的就绪资源读取实际像素并转换为内嵌图片,清除附带的旧 URL。图片数量与字节数沿用文本模型能力及资源读取上限;不允许其他用户资源或客户端内嵌内容替换资源文件。普通生成的签名 URL 策略保持不变,任务端点、账务与数据库结构沿用已有合同。
|
||||
|
||||
## 画布资源完整性与 409
|
||||
|
||||
画布写入在保存历史快照前校验当前文档中的资源引用;引用须属于当前用户且处于 `ready`。引用收集器递归遍历受支持的资源字段,因此 `nodes[节点 ID].metadata.videoPreview.storageKey` 等嵌套派生封面也会参与检查。历史快照保存会一并校验新版本引用;若资源在保存期间缺失或状态变化,事务回滚,画布 revision 不递增。
|
||||
@@ -203,7 +226,7 @@ Token 报价的 `estimated` 为 `true`,`quantity` 是预留 Token 数。参考
|
||||
|
||||
历史接口先验证画布归属;无权访问、已删除画布或不存在的快照返回 404。恢复沿用画布写入限流和素材校验,在同一事务完成版本校验、备份、内容写入及历史资源保护。恢复保留当前画布 ID 和项目归属,生成新版本,不倒退版本号。升级前的内容无法补建历史。
|
||||
|
||||
平移和缩放只持久化浏览器视口,内容 PUT 忽略客户端 `viewport` 和 `remoteContentHash`。前端遇到 409/428 会保留账号隔离的本地草稿、暂停该画布自动提交,并提供加载最新版和下载草稿入口;载入最新版前草稿写入失败时停止替换。其他画布仍可保存。
|
||||
平移和缩放只持久化浏览器视口,内容 PUT 忽略客户端 `viewport` 和 `remoteContentHash`。前端遇到版本冲突(409/428)会先核对云端并尝试合并;无法合并时保留账号隔离的本地草稿、暂停该画布自动提交,并提供加载最新版和版本记录查看入口。载入最新版前草稿写入失败时停止替换,当前编辑内容保持不变;其他画布仍可保存。
|
||||
|
||||
单画布读取会先查询归属用户的版本元数据,再判断 `If-None-Match`;命中时不会读取大型画布正文。未命中时返回完整项目 JSON。正文达到 1 KiB 且客户端声明接受 gzip 时响应使用 gzip 压缩,并带 `Vary: Accept-Encoding`;因此客户端应以 HTTP 状态码区分 `200` 正文和 `304` 未变化,不要把 `304` 当作业务错误。
|
||||
|
||||
@@ -253,7 +276,7 @@ Token 报价的 `estimated` 为 `true`,`quantity` 是预留 Token 数。参考
|
||||
- `generate_media` 支持图片 / 视频 / 音频:必填 `mode`、`prompt`、`nodeId`(可续用草稿,无草稿时才新建)、`title`、有序 `referenceNodeIds`(无参考传空数组),再加一种模型选择;`snapshotHash` 可省略,省略时服务端使用当前画布内容快照。图片 / 视频要求 `size`,视频要求正数 `durationSeconds`,图片 / 音频时长为 0。可传来源节点 `sourceNodeId`、`quality`、视频 `videoGenerateAudio`。`sourceNodeId` 仅接文本 / 镜头提示词节点;参考图片、视频、音频只放 `referenceNodeIds`,无文本来源时留空且不重复传入。引用从当前画布节点的账号资源解析,校验归属、类型、就绪状态和模型能力,不接受任意 URL。图片生成仅接图片参考;视频可按模型能力接图片、视频、音频参考;音频生成当前仅支持文本输入。
|
||||
- 参数选择与收费授权分开:用户明确说“随便 / 你决定 / 按默认”时,Agent 可从当前目录选择能力及预算匹配的模型,优先用户最近明确使用的可用模型,其次价格清楚的低成本选项;支持时沿用参考图原始比例,否则选目录默认,时长用目录默认。未要求音频且模型不支持时用默片。用户接受已推荐方案后不再要求特定确认口令;仅真正缺失或冲突的阻塞项一次性询问。本轮已有目录结果应复用。以上是 Agent 的参数选择策略,服务端仍强校验具体规格,不提供绕过预算 / 能力校验的默认兜底,也不绕过独立收费审批。
|
||||
- 媒体参数先进行无任务、无预留账单的准入校验,再在同一事务创建草稿节点、来源 / 资产连线及待审批检查点;`approval_requested` 和运行中的 `approval` 携带目录真实 `modelName`。用户批准后才在事务中绑定任务、创建预留账单并更新检查点;拒绝或取消保留未生成草稿,不提交媒体任务。`nodeId` 可续用同类型、未锁定、idle、无任务且无媒体结果的空白占位节点或当前运行草稿;跨轮 Agent 草稿还要求原运行属于同一用户和画布、已结束且清理完成。续用必须重新读取快照并重新审批,不能复用旧审批、覆盖已有任务或成品,不能通过循环新建节点绕过限制。画布读取的 `generationDraft` 提示未提交、原运行状态、是否仍在清理及仍需审批;写入仍重新强校验。已明确审批的规格不得被模型默认值静默替换。媒体终态回写原节点;已删除或已换任务的节点不自动复活,结果仍可从任务中心查看。
|
||||
- `generate_media.prompt` 使用 `@图片1`、`@视频1`、`@音频1` 引用素材,各类型按 `referenceNodeIds` 的出现顺序独立编号,文本来源不占媒体编号。已有标签保留;遗漏的画布素材以“素材名称:@标签”补入 `【资产参考】`,不推断素材用途。节点入边同步排列,草稿、审批和实际任务保存同一份带标签的提示词。未绑定的媒体编号和补齐后超过16000字符的提示词会在提交前被拒绝,模型自身的提示词长度限制仍由任务准入校验。临时标注图没有持久画布节点,不自动添加无法解析的编辑器标签;历史节点不自动改写。
|
||||
- `generate_media.prompt` 使用 `@图片1`、`@视频1`、`@音频1` 引用素材,各类型按 `referenceNodeIds` 的出现顺序独立编号,文本来源不占媒体编号。角色主图属于图片序列,与普通图片共享编号;编辑器显示时保留 `@角色N` 前缀,但 N 仍对应实际图片位置,例如角色、场景图、角色依次显示为 `@角色1`、`@图片2`、`@角色3`,任务使用 `@图片1`、`@图片2`、`@图片3`。已有标签保留;遗漏的画布素材以“素材名称:@标签”补入 `【资产参考】`,不推断素材用途。节点入边同步排列,草稿、审批和实际任务的标签对应同一组参考资源,编辑器与任务仅转换显示前缀。未绑定的媒体编号和补齐后超过16000字符的提示词会在提交前被拒绝,模型自身的提示词长度限制仍由任务准入校验。临时标注图没有持久画布节点,不自动添加无法解析的编辑器标签;历史节点不自动改写。
|
||||
- Agent 的 `snapshotHash` 忽略顶层 `viewport`、`updatedAt`。`canvas_get_state` 另返回 `mediaSnapshotHash`,供 `generate_media.snapshotHash` 使用:仅比较节点与连线,节点忽略 `position`、`width`、`height`、`createdAt`、`updatedAt`,保留全部业务字段及未知 metadata。生成草稿审批也固定该哈希,移动、调整显示尺寸、自动补时间戳和保存聊天记录不会使生成审批失效,执行保留最新展示信息;提示词、素材、锁定状态、任务绑定和连线变化仍需重新读取并审批。画布修改与撤销继续使用完整内容哈希,数据库写入保持完整快照 CAS。发布前已按旧算法生成的待审批内容可能要求重新读取和审批,不自动替换旧快照重提任务。
|
||||
- `canvas_get_state.nodes[].outputReference` 的 `ready` / `issue` 仅表示该节点产物能否作为其他生成的参考,不诊断本节点的生成输入。`generation` 返回当前画布、当前用户所属任务的 `taskId`、`taskStatus` 和安全的失败 / 取消 `error`;无任务绑定为 `not_submitted`,无法验证归属或读取失败为 `unavailable`。节点无法作为草稿提交时返回 `submitBlockedReason` / `submitBlockedIssue`,与写路径共用节点准入规则;未被阻止不等于已获授权,草稿所属运行和审批仍在提交时校验。`task_get` 同样返回安全错误详情。`generate_media` 准入失败可返回 `snapshot_conflict`、`task_bound`、`target_locked` 等结构化 `reason` 和 `nodeId`,不自动选择新节点或重新生成。
|
||||
- `task_get` / `generation` 的执行状态与回写状态分开:`succeeded` 不返回执行 `error`;回写失败仍通过 `writebackOutcome` / `writebackError` 暴露,不能因生成成功而隐藏。失败 / 取消任务保留脱敏错误,缺少详情不能伪装成成功。Agent 文本步骤的持久诊断为 `upstream_dns_failed` 时,`run_failed.reason` 同步该分类并明确提示检查渠道域名及后端 DNS,不自动重跑。
|
||||
|
||||
@@ -5,6 +5,20 @@ description: 在宿主机启动影策前后端开发服务
|
||||
|
||||
# 本地开发
|
||||
|
||||
## SMTP 邮件故障日志
|
||||
|
||||
注册、登录、绑定邮箱和密码找回的邮件投递失败统一输出 `ERROR` 级别的 `smtp email delivery failed` 后端日志。日志包含 `host`、`port`、`encryption`、脱敏 `recipient` 和 `error`,默认 `CANVAS_LOG_LEVEL=info` 即可看到,无需开启 debug。
|
||||
|
||||
`error` 保留 SMTP 状态码和服务器错误说明,并标记失败步骤:`connect` / `connect_tls`(连接)、`greeting`(服务器欢迎响应)、`starttls`、`auth`、`mail_from`、`rcpt_to`、`data`、`write_body`、`finish_data` 或 `quit`。日志不主动记录账号、密码、邮件标题、正文或验证码,并对错误中回显的这些值及其 Base64 编码做脱敏。对外 API 继续使用原有通用错误响应。
|
||||
|
||||
宿主机开发查看运行后端的终端;Docker 查看实际使用的 Compose 文件中的 `backend` 服务,例如:
|
||||
|
||||
```bash
|
||||
docker compose -f docker-compose.deploy.yml logs --since=15m -f backend
|
||||
```
|
||||
|
||||
本地构建和热更新开发分别将文件名换成 `docker-compose.local.yml` 或 `docker-compose.dev.yml`。代码修改后需要运行新构建的后端,旧容器不会自动增加这些日志。
|
||||
|
||||
## Compose 公网资源地址
|
||||
|
||||
`docker-compose.yml`、`docker-compose.dev.yml`、`docker-compose.local.yml`、`docker-compose.server.yml` 和 `docker-compose.deploy.yml` 均将 `.env` 中的 `CANVAS_PUBLIC_BASE_URL` 传入后端。使用本地文件存储且上游模型需要读取参考素材时,将它设为上游能访问的 HTTPS 站点根地址(例如 `https://canvas.example.com`,不要附加 `/api`);存储设置中的公网访问地址优先于该环境变量。
|
||||
|
||||
@@ -5,6 +5,12 @@ description: 当前项目已实现的核心工作台能力与使用入口
|
||||
|
||||
# 功能清单
|
||||
|
||||
## 可美 KM Seedream 图片
|
||||
|
||||
`km-kemei-seedream` 声明式插件接入 Seedream 5.0 Pro / Flash 的文生图与参考图编辑,支持 URL / Base64 响应并由宿主统一保存图片。精确模型 ID 与扩展参数见插件包内 `docs/interface.md`。
|
||||
|
||||
协议默认 2K 方图、单张生成、最多十张参考图,提供 1K / 1.5K / 2K 共二十四个精确尺寸预设。后台能力编辑、画布选择与服务端校验同步支持 1.5K。蒙版与通用质量开关关闭;透明输出通过插件命名空间配置,并要求单张含 alpha 的参考图。供应商错误和空结果保留失败语义。
|
||||
|
||||
## 卡藏 Midjourney
|
||||
|
||||
画布接收一次任务返回的全部图片,四张结果自动组成收起的图片堆叠,可展开、选择主图和分别使用。每张图保留独立资源及素材绑定,保存、刷新和任务重复同步不会将后续图片覆盖为第一张。已有仅显示首图的成功 Midjourney 节点在重新打开画布时从原任务恢复遗漏结果,无需再次生成。
|
||||
@@ -160,6 +166,14 @@ AutoDL 视频模型在“能力与参数 → 画面规格”直接多选当前
|
||||
- `web/src/lib/canvas/tool-registry/definitions/selection-toolbar-tools.tsx`:多选悬浮栏默认工具。
|
||||
- `web/src/lib/canvas/canvas-layout.ts`:`spreadCanvasNodes` 按相对占位加大边距。
|
||||
|
||||
## 完整 AI 拆图工作流
|
||||
|
||||
图片节点的 AI 拆图可先用支持视觉输入的文本模型规划图层,再选择专用拆图模型,或用普通图片模型分别重建背景与前景。规划发送经过资源归属校验的实际像素;规划结果校验图层数量、区域与提示词,失败保留可修正的错误。
|
||||
|
||||
生成结果组成同尺寸图层组,支持展开、显隐、合成预览、复制、删除、失败重试和刷新恢复。前景可按需去背景,Image Tools 强制输出 PNG;透明内容可按有效区域裁切并另存为独立素材。派生图片使用独立资源与素材标识,避免覆盖原图或其他图层。
|
||||
|
||||
规划、生图及可选去背景沿用已有任务与计费;本地合成、显隐和素材裁切不调用生成模型。普通生图是语义重建,不能保证与原图逐像素一致。图层数、像素与输出比例受前端限制,供应商失败如实显示。
|
||||
|
||||
## 图片节点多角度、宫格切分与多选框
|
||||
|
||||
图片节点「多角度」使用贴在节点下方的 3D 编辑器(天空盒/摄像头、常用角度、方向箭头),拖动节点或平移画布时面板跟着走。宫格切分放在「图片工具」菜单的「拆分与标记」里,提供 4/9/16/25 预设和 5×5 自定义点选;自定义面板留在菜单内,切分后的子图按网格排开。框选多张图后拖动,虚线选框跟随被选节点。
|
||||
@@ -380,7 +394,7 @@ SEO 标题、描述、可选关键词会投影到浏览器 metadata、Open Graph
|
||||
- `web/src/lib/canvas/canvas-appearance.ts`:自定义外观归一化、解析和本机账号默认值。
|
||||
- `web/src/components/canvas/canvas-toolbar.tsx`:画布外观面板入口。
|
||||
- `web/src/components/canvas/canvas-appearance-controls.tsx`:主题、颜色、明亮度和网格控件。
|
||||
- `web/src/components/canvas/infinite-canvas.tsx`:应用主题背景并保持网格渲染参数。
|
||||
- `web/src/components/canvas/canvas-viewport.tsx`:应用主题背景并保持网格渲染参数。
|
||||
|
||||
## 画布节点自动整理
|
||||
|
||||
@@ -454,3 +468,23 @@ SEO 标题、描述、可选关键词会投影到浏览器 metadata、Open Graph
|
||||
后台可选开启子分类维护,市场和技能库支持子分类浏览;默认关闭,保留原行为。
|
||||
|
||||
开启时一级分类也可在后台新增、改名、排序、停用和选择图示,未归入技能仍有默认入口。
|
||||
|
||||
## 创作首页纵深画廊与灵感库
|
||||
|
||||
创作页空态是直线纵深图片画廊:11 张横版卡片沿 Z 轴前后排队,当前一张在最前、最大,其余依次后退缩小并左右对称。滚轮、两侧按钮和自动轮播都能切换,切换只动 `transform` 与 `opacity`。卡片带玻璃描边、圆角和投影,底部是「行动点 / 标题 / 描述」三段信息,只有最前那张露出。队列跟随输入框的创作类型:选图片只排图片灵感,选视频只排视频灵感,选文本用本项目原创条目。每次进场和每次换类型都重新随机抽一批,并记住最近出现过哪些,走完一轮自动换批。
|
||||
|
||||
工作区左侧「创作」下方新增灵感页 `/inspirations`,展示全部提示词,按来源、分类和创作类型筛选,支持搜索、收藏、视图切换和分页;自建灵感支持新建、编辑、删除和 JSON 导入导出,改动只存在本地。
|
||||
|
||||
外部提示词由 `web/scripts/import-inspirations.mjs` 同步:`awesome-seedance`、好好学 AI 提示词库、YouMind 的两个姊妹库。脚本同时为画廊池生成本地缩略图(560px、webp、约 35KB 一张)。上游封面平均 400KB~700KB,直接引用一屏 11 张要拉 5MB 以上,换成本地缩略图后约 400KB。
|
||||
|
||||
画廊池走 `public/inspirations/gallery-pool.json` 运行时拉取,不打进首屏 JS:几百条提示词正文压在包里是白背的,而这份数据只服务画廊一处。池子按来源等距抽取以横跨各分类,并且只收描述非空的条目,保证卡片三行版式不缺角;这些条目仍留在全量目录里供灵感页展示。
|
||||
|
||||
### 相关实现
|
||||
|
||||
- `web/src/pages/create/creation-inspiration-tunnel.tsx`、`creation-inspiration-tunnel.css`:纵深画廊组件与样式。
|
||||
- `web/src/pages/inspirations/`:灵感页、详情弹窗、编辑弹窗与样式。
|
||||
- `web/src/lib/inspirations/`:来源登记表、条目类型与解析、原创条目、上游版本号(`catalog.ts`、`resolve.ts`、`source-revisions.ts`)。
|
||||
- `web/src/services/inspiration-catalog.ts`:全量目录与画廊池的运行时加载和内存缓存。
|
||||
- `web/src/stores/use-inspiration-store.ts`:自建、覆盖、隐藏与收藏的本地持久化。
|
||||
- `web/scripts/import-inspirations.mjs`:外部来源同步、缩略图生成与画廊池落盘。
|
||||
- `web/public/inspirations/`、`web/public/inspiration-thumbs/`:全量目录、画廊池与本地缩略图。
|
||||
|
||||
@@ -5,6 +5,36 @@ description: 当前项目已实现功能的手工验证清单与未确认边界
|
||||
|
||||
# 待测试
|
||||
|
||||
## Agent 画布权限与大事件审批
|
||||
|
||||
- 已修复:权限查询使用 `canvas_projects`;大画布增量超过事件上限时改为完整快照刷新通知,避免审批执行事务回滚。
|
||||
- [x] PostgreSQL 独立临时 schema 验证独立和项目关联画布、跨账号、缺失画布、项目 ID 误用以及数据库读取失败。
|
||||
- [x] 专项测试复现修改前大节点审批失败;修改后覆盖完整批准、执行、回执保存、正文保留、重复批准不再写入、小事件保留增量及超大摘要刷新。
|
||||
- [x] 本地用户确认原审批失败场景可以继续执行;前端画布事件与版本同步专项测试通过。
|
||||
- [ ] 验证跨浏览器、多实例及刷新失败时的恢复;本次不改既有审批恢复和模型调度流程。
|
||||
## Pi 模型输出超限
|
||||
|
||||
- 已修复:工具调用数量或正文超限时,在写入待执行调用之前整批拒绝,沿用有限重试传入具体纠正上下文,不执行前几个调用、不提高上限。
|
||||
- [x] PostgreSQL 临时 schema 在修改前复现“工具调用游标无效”;修改后验证 8 个调用允许、9/31 个调用纠正后恢复、持续超限最多 3 次重试及超长正文纠正。策略文档专项测试通过;未调用真实供应商。
|
||||
- [ ] 部署后在新会话验证大型任务按批执行;观察文本模型纠正次数及费用,失败时不声称已执行。
|
||||
- 本项独立于画布大事件修复,不改变审批和画布写入流程。
|
||||
## Agent 分镜绑定参数引导
|
||||
|
||||
- 已优化:工具说明区分素材输入和镜头输出的两个 JSON 示例;handle 错误明确字段、正确方向和真实 rowId 要求,并在回执附上对应连线模板。不放宽校验、不自动改线。
|
||||
- [x] 专项测试覆盖来源/目标 handle 放错节点、镜头编号误用、缺少 row 前缀、错误回执模板方向、普通连线与行绑定并存,以及重复行绑定仍拒绝;工具 schema 体积检查通过。
|
||||
- [x] 用户已在本地验证镜头绑定可用;自动化测试不调用外部模型,不修改实际创作画布。
|
||||
- [ ] 上游合并后验证新会话沿用正确绑定方向,错误调用不会被误报为成功。
|
||||
## SMTP 邮件故障日志
|
||||
|
||||
- 已实现:所有邮件投递入口统一记录详细后端错误,标记 SMTP 失败步骤,并隐藏错误回显中的账号、密码、邮箱、正文和验证码;不改变公开 API 响应。
|
||||
- [x] 专项测试通过:本地 SMTP 服务模拟欢迎响应、STARTTLS、认证和收件人拒绝;验证日志上下文、错误链保留、敏感值脱敏、成功时不记录失败日志,并回归密码找回流程。
|
||||
- [ ] 使用实际 SMTP 配置分别触发连接、TLS、认证和收件人失败,确认 `backend` 日志保留具体错误且无敏感信息;覆盖注册、登录、绑定邮箱和密码找回。
|
||||
## 可美 KM Seedream 图片
|
||||
|
||||
- 已实现:Pro / Flash 声明式协议、参考图与扩展参数、结果保存,以及前后端一致的 1K / 1.5K / 2K 尺寸预设。
|
||||
- [ ] 用户验收协议选择后的默认能力、1.5K 档位与宽高比切换、真实图片生成及刷新后的素材显示。
|
||||
- [ ] 在供应商环境验证多参考图、Base64 响应、透明输出、全部尺寸和扩展参数;协议测试不替代真实供应商验收。
|
||||
|
||||
## 复制生图节点后节点消失
|
||||
|
||||
- 已修复:副本不再继承原节点的 `generationEffectKeys`,避免普通保存把它误判为未确认的生成结果。图片内容、提示词和参考字段仍保留,原节点不受影响。
|
||||
@@ -157,6 +187,13 @@ description: 当前项目已实现功能的手工验证清单与未确认边界
|
||||
- [ ] Firefox/Chrome/Safari 实际页面走关键 lazy route;检查离线草稿、登录切换和错误重试行为。尚未做真实浏览器/CDN 验收。
|
||||
- [ ] 使用 React Profiler 与长时间运行的大画布记录任务更新、节点数/可见数、主线程长任务和页面隐藏行为。当前只做结构性降热点,不推断整画布必然全量重渲染或已达到某个帧率。
|
||||
|
||||
## 完整 AI 拆图
|
||||
|
||||
- 已实现:视觉规划、专用拆图与普通图片模型重建、可选去背景、图层组显隐与合成、独立素材保存及任务恢复。
|
||||
- [ ] 用户验收不同画幅的背景与透明前景、图层排序和显隐、复制/删除、保存素材与刷新恢复。
|
||||
- [ ] 在供应商环境验证专用拆图、去背景、部分失败重试,以及不同模型的比例与透明输出限制。
|
||||
- [ ] 核对规划与各生成任务的费用提示和失败结算;普通生图重建不承诺无损还原。
|
||||
|
||||
## 画布媒体产出模型
|
||||
|
||||
- 产出模型与选用模型分开保存。生成成功才冻结产出模型;生成中、失败和只改模型下拉不改已有产出模型。
|
||||
@@ -2065,7 +2102,7 @@ PR #507 核心能力已按主分支实现保留,并补齐小视口尺寸约束
|
||||
|
||||
- [x] 29 项提示词引用专项测试、TypeScript 检查与生产构建通过。
|
||||
- [x] 旧 `@[node:节点ID]` 仅做读取迁移;新写入、配置组装、故事板物化、Agent 建图和快捷生成均只生成位置型引用。
|
||||
- [x] 图片、视频、音频、文本和角色分别独立计数;生成时按当前连线顺序解析槽位,删除连线不再删除提示词。
|
||||
- [x] 普通图片、角色主图和绘图共享图片编号,保留各自显示前缀;视频、音频和文本独立计数。生成时按当前连线顺序解析槽位,删除连线不再删除提示词。
|
||||
- [x] 只有 `storageKey` 的图片/视频引用会异步解析预览地址;生成中按钮使用节点强调色与可见旋转动画。
|
||||
- [ ] 在画布中连接图片 A 并写入 `@图片1`,删除 A 的连线后连接图片 B,确认提示词不变、缩略图切换到 B、生成请求使用 B。
|
||||
- [ ] 混合连接两张图片、一段音频和一段文本,确认标签依次为 `@图片1`、`@音频1`、`@图片2`、`@文本1`,调整不同类型的连线不会串号。
|
||||
@@ -2940,3 +2977,26 @@ SSE 现在按 revision 变化发送紧凑快照,无变化只 heartbeat;客
|
||||
SQLite 与 HTTP recorder 已验证;PostgreSQL 16/17、前端构建及浏览器中的开关、分类维护、市场/技能库筛选、分页与明暗主题待验证。
|
||||
|
||||
一级分类还需 PostgreSQL 验证 46→47 与并发改归/删除,以及浏览器图示、根停用默认桶与空根表回落。handler 全套涉及 socket,受限环境中未完成。
|
||||
|
||||
## 画布角色与媒体引用顺序一致性
|
||||
|
||||
- 已实现:普通图片、角色主图、绘图共享图片编号,编辑器保留 `@图片N`、`@角色N`、`@绘图N` 类型前缀,提交模型时统一映射为实际图片数组的 `@图片N`。引用先后按连接槽位确定,逆序提及不会重排资源;拖动引用后按节点身份同步编号,中文紧邻及连续引用可正常解析,多位数字不会被部分替换。
|
||||
- 已实现:角色主图占据原槽位,素材库图片保留自身资源身份,去重后的补充视角追加到主图之后。关闭角色设定注入时仍保留角色与参考图、声音样本的对应关系;多角色共用声音样本只发送一份。
|
||||
- 已实现:前端解析到的角色版本与固定版本不一致、图片/视频角色缺少主参考图、模型参考容量不足、角色授权或资源读取失败时阻止提交。文本/音频允许没有主图的角色,并将其提及改为角色名、重新对应后续图片编号。
|
||||
- 自动验证:前端 `bun run test` 全量 2203 项通过,类型检查、lint、冻结锁文件安装检查通过;`bun --bun run build` 通过,仍有大分块提示。普通构建命令首次因本机 Node 子进程缺少 TypeScript Darwin x64 包失败,显式使用 Bun 运行时后通过,未修改依赖版本或构建脚本。后端 `go test ./internal/app -run 'TestCloudAgent(Media|Character)' -count=1` 通过,修改的 Go 文件符合 gofmt。
|
||||
- Web checks 回归:更新时间轴容器、小屏抽屉、生命周期依赖及访客创作路由的过期源码断言,相关 45 项测试通过;真实 Chrome 预演台 E2E 65 项断言通过,覆盖模式时间轴切换、模型加载/重试/加载中删除、WebGL 恢复和保存失败关闭保护。
|
||||
|
||||
仍待真实环境验收:
|
||||
|
||||
- [ ] 在登录态画布混合连接两张角色卡、普通图片、绘图及素材库图片,调整顺序、编辑提示词、保存重载并重试任务,核对编辑器标签与任务参考数组一一对应。
|
||||
- [ ] 在支持声音参考的视频模型上核对多角色共用样本、已有音频与角色声音样本的编号;通过真实模型验证外观与音色效果。本轮未调用付费模型,未执行整套后端及 PostgreSQL/Redis 集成测试。
|
||||
## 创作首页纵深画廊与灵感库
|
||||
|
||||
- 已实现:创作首页纵深画廊、灵感页 `/inspirations`、外部提示词导入脚本与本地缩略图。
|
||||
- [x] 浏览器验收画廊 23 项:层次递减且左右对称、三段提示词信息、玻璃描边与圆角、滚轮/左右按钮切换、按钮悬停不下移、按创作类型过滤、点击卡片把提示词填进编辑器。
|
||||
- [x] 浏览器验收灵感页 24 项:侧栏入口位于「创作」下方、分类与来源筛选、搜索、详情正文、收藏、新建与删除、跳转创作页带回提示词、JSON 导入导出。
|
||||
- [x] `bunx tsc --noEmit` 通过。
|
||||
- [ ] 在低带宽的真实链路上确认首屏画廊出图时间,以及弱网下画廊池 JSON 拉取失败时退回打包原创条目的表现。
|
||||
- [ ] 窄屏(≤1100px、≤640px)下确认画廊卡片不被裁切、灵感页分页与筛选可用,并检查明暗主题。
|
||||
- [ ] 文本创作类型目前只有 9 条原创条目,画廊池暂无文本条目,仍会重复出现,待补数据。
|
||||
- [ ] 外部来源(awesome-seedance、好好学 AI、YouMind)的署名与许可声明尚未在页面展示,待定。
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
本模块让部署方在不修改源码的前提下管理站点身份、登录页内容、搜索摘要、首页收尾信息与全站皮肤。默认 `classic` 皮肤采用黑白基础配色与紫蓝渐变主按钮;自定义品牌不得在首次渲染、邮件、诊断包、素材插件或后台说明中短暂或持续露出内置品牌。
|
||||
|
||||
技术兼容标识不属于品牌文案:仓库名、容器/升级器路径、剪贴板协议、localStorage key、插件 API version、数据库基线校验值和 User-Agent 可以继续使用 `open-ai-canvas` 或 `infinite-canvas`。英文品牌标识只用于新资源路径建议,不能自动改写已有对象存储前缀或历史资源。
|
||||
技术兼容标识不属于品牌文案:仓库名、容器/升级器路径、剪贴板协议、localStorage key、插件 API version、数据库基线校验值和 User-Agent 可以继续使用 `open-ai-canvas` 或 `yingce`。英文品牌标识只用于新资源路径建议,不能自动改写已有对象存储前缀或历史资源。
|
||||
|
||||
## 2. 领域模型
|
||||
|
||||
|
||||
Reference in New Issue
Block a user