Commit Graph

517 Commits

Author SHA1 Message Date
k88936 453e351fc6 3D 资源没有预览图时封面留空,不再拿模型对象顶上去
- api-server:`project_editor_client_media_src` 对 `model3d` 在没有预览(`thumbnail_src` 与存储的 `image_src` 都缺)时直接返回空,不再回落到模型对象;用例改成断言空串,并补「存储的 image_src 是空白」一例
- docs/adr 0003:写明这是唯一允许「有对象但 `imageSrc` 为空」的类别,消费方按空值显示占位;被否决项里补上「拿模型对象冒充 imageSrc 的投影回落」
- docs/technical Tripo 集成方案:资源表说明改成「有预览才填」,验收项 11 改成「预览缺失时留空、不得回落成模型对象」
- 画布侧 `Model3dViewerModel` 的注释同步:历史布局里仍可能留着指向模型本体的地址,图片元素不能加载它
2026-09-24 19:51:47 +08:00
k88936 0d2c81a3ce 画布导出的目录名单一来源
- src/components/image-editor/useImageCanvasAssetExportWorkflow.ts:images / media / 3d_models 三个目录名提成 EXPORT_FOLDER 常量,建目录、挑目录与按层分流共用同一份字面量(写错目录名不会编译报错,只会在 zip 里悄悄换目录)
2026-09-24 17:33:02 +08:00
k88936 9c2a9383fc 3D 两个生成模式也随失焦与关闭收起面板
- src/components/image-editor/ImageCanvasGenerationDialogModel.ts:hideGeneratedLayerComposerAfterBlur 与 closeGenerateComposerDialog 的模式清单补上 model3d-text-to-model / model3d-image-to-model,此前点空白画布或关闭操作都收不起 3D 面板(其它生成模式都能收起)
- src/components/image-editor/ImageCanvasGenerationDialogModel.test.ts:补两个 3D 模式的收起断言
2026-09-24 17:32:39 +08:00
k88936 946c101630 画布没接住任务状态时按失败收口
- src/components/image-editor/model3d-generation/useModel3dGenerationTask.ts:applyQueuedGeneration 返回 false 时不再静默复位成 idle(用户会以为没提交过、再点一次就是又一次已扣费的外部生成),改为写回失败态与明确文案
- src/components/image-editor/model3d-generation/Model3dGenerationSubmission.ts:新增 MODEL3D_QUEUE_HANDOFF_FAILED_MESSAGE,与「服务端没返回任务状态」区分开
- src/components/image-editor/model3d-generation/useModel3dGenerationTask.test.tsx:原「回到空闲态」用例改为断言失败态
2026-09-24 17:32:13 +08:00
k88936 3455b7a00f 3D 提交失败路径也刷新钱包余额
- src/components/image-editor/model3d-generation/useModel3dGenerationTask.ts:请求失败与「2xx 但没有任务状态」两条路径都调用 onWalletBalanceMayHaveChanged,与其它画布生成链路的 runEditorGenerationWithWalletRefresh 同一口径(超时或空 body 的 2xx 都可能已经扣费)
- src/components/image-editor/model3d-generation/useModel3dGenerationTask.test.tsx:补两条失败路径各刷新一次钱包的断言
2026-09-24 17:31:28 +08:00
k88936 5ba7a993de 3D 提交编排整段落在错误边界内
- src/components/image-editor/model3d-generation/useModel3dGenerationTask.ts:把取占位框、算结果标题与构造提交计划一并移进 try,注入的回调或老快照缺字段导致的抛错不再漏成未捕获 rejection,而是照常写回失败态与提示
- src/components/image-editor/model3d-generation/useModel3dGenerationTask.test.tsx:补「计划构造阶段抛错」的用例(缺 prompt 的老快照)
2026-09-24 17:30:53 +08:00
k88936 2350c56f2f 3D 失败提示只透出服务端给的文案
- src/components/image-editor/model3d-generation/Model3dGenerationSubmission.ts:resolveModel3dGenerationErrorMessage 只对 ApiClientError 原样透出 message;原生 SyntaxError(2xx 但 body 不是 JSON)与其它运行时 TypeError 的英文技术文案不再直接显示给用户
- src/components/image-editor/model3d-generation/Model3dGenerationSubmission.test.ts、useModel3dGenerationTask.test.tsx:用例改用 ApiClientError 构造服务端文案,并补非服务端错误退回兜底文案的断言
2026-09-24 17:30:01 +08:00
k88936 96b52ae7ee 提交计划把非图生模式显式判为不支持
- src/components/image-editor/model3d-generation/Model3dGenerationSubmission.ts:图生分支之后补显式模式判断,契约将来新增端点时直接失败关闭,而不是静默按文生请求发出、丢掉新端点的输入
2026-09-24 17:28:46 +08:00
k88936 8d17855133 提交计划去掉无人读取的 title 字段
- src/components/image-editor/model3d-generation/Model3dGenerationSubmission.ts:Model3dSubmissionPlanBase.title 没有任何消费方(调用方自己按 resolveModel3dResultTitle 重算),删除该字段与它的装配代码,避免把死数据当成权威标题
2026-09-24 17:28:29 +08:00
k88936 bc68a9e884 查看器未知失败原因退回兜底文案
- src/components/image-editor/model3d-preview/Model3dViewerModel.ts:default 分支保留 `never` 的编译期穷尽检查,但运行时(宿主与查看器版本错配)改回 fallbackText,不再把原始原因码当用户文案显示
2026-09-24 17:28:02 +08:00
k88936 7b8bbac098 报价缺价文案提成具名常量
- src/components/image-editor/model3d-generation/Model3dGenerationFormModel.ts:底价缺失与加价项缺失两句文案按模块既有约定提成 MODEL3D_PRICING_MISSING_BASE_PRICE_REASON 与 resolveModel3dPricingMissingAddOnReason,不再散落在计算路径里
2026-09-24 17:27:37 +08:00
k88936 fe44054aa2 退役模型版本在报价与提交路径上一起回落默认版本
- src/components/image-editor/model3d-generation/Model3dGenerationFormModel.ts:resolveModel3dModelVersion 改为走 normalizeModel3dModelVersion,老快照里契约中已不存在的版本不再直接进 MODEL3D_MODEL_TABLE 查表(原来会抛异常),报价与提交体也不会分裂成两个版本;此前该归一化函数只有测试在用
- src/components/image-editor/model3d-generation/Model3dGenerationFormModel.test.ts:补 resolveModel3dModelVersion 收到退役版本的用例
2026-09-24 17:27:17 +08:00
k88936 9840f17189 模型版本判据不再认下原型链上的键
- src/components/image-editor/model3d-generation/Model3dGenerationValidation.ts:isModel3dModelVersion 改用 Object.hasOwn,`toString` / `__proto__` 这类继承键不再被判成契约版本(之后查表会拿到 undefined)
- src/components/image-editor/model3d-generation/Model3dGenerationFormModel.test.ts:补原型链键回落默认版本的用例
2026-09-24 17:26:49 +08:00
k88936 3191ca9d89 3D 面板的重试代次改在点击时铸造
- src/components/image-editor/model3d-generation/Model3dGenerationModal.tsx:失败态下的代次刷新由渲染体里的常量改为点击时调用的 resolveSubmitDialog(),提交键不再随每次重渲染(含 StrictMode 双渲染)变化,渲染保持纯函数
2026-09-24 17:26:17 +08:00
k88936 cd5218535e 3D 面板参考图菜单的边界 refs 数组稳定下来
- src/components/image-editor/model3d-generation/Model3dGenerationModal.tsx:boundaryRefs 用 useMemo 缓存,避免每次渲染都新建数组导致浮层 dismiss effect 反复解绑/重挂 document 监听
2026-09-24 17:26:02 +08:00
k88936 89b8211b94 生成中禁用图生 3D 参考图的删除按钮
- src/components/image-editor/model3d-generation/Model3dGenerationForm.tsx:已选参考图槽位补 disabled={disabled},提交中不再能删掉这次请求用的参考图,与面板其余控件的禁用口径一致
2026-09-24 17:25:37 +08:00
k88936 fb0be97609 图生 3D 的素材库空确认不再清掉已选参考图
- src/components/image-editor/ImageCanvasGenerationDialogModel.ts:单槽对话框只在素材库确实选到了图时才做「替换」,空确认退回原行为(保留画布点选/上传的那张)。此前确认按钮不校验空选,空确认会把已有参考图直接清掉
- src/components/image-editor/projectAssetReferencePickerModel.test.ts:补空确认保留画布参考图的用例
2026-09-24 17:25:16 +08:00
k88936 42c3186e13 3D 生成面板开放模型版本选择,参数按模型能力门禁
Project CI / AI game creator shell Rust crates (pull_request) Successful in 1m35s
Project CI / Backend tests (pull_request) Failing after 14s
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
- Model3dGenerationValidation.ts(新):前端唯一一份参数校验,逐条复刻 platform-tripo 的 validate_generation_options 与 api-server 的 PricingParamView::validate(模型族能力、分件三个前置条件、face_limit_bounds、平台必显式项),并给出按契约联合类型做键的 MODEL3D_MODEL_TABLE 与禁用原因文案
- Model3dGenerationFormModel:模型版本改为用户可选,可选集只取当前端点有底价的版本;报价与请求体读同一个 resolveModel3dModelVersion;换版本或切档位时按新能力收敛档位与开关并开新一代次;v2.5 的贴图档位不带 textureQuality
- Model3dGenerationForm:新增模型版本选择器(照图片面板的浮层选项形态),档位与开关按模型能力禁用并给出 title 原因
- Model3dGenerationModal:定价只读一次,模型选项与报价共用同一份快照
- Model3dGenerationSubmission / useModel3dGenerationTask:提交计划改成 endpoint 判别联合,两个端点各一个收口函数
- editorProjectClient:删掉「endpoint + 联合提交体」的单函数,改为 submitModel3dTextToModelRequest / submitModel3dImageToModelRequest 一个端点一个函数;basePrices 两层键改成契约枚举
- ImageCanvasOptionChoice.tsx(新):把图片面板的浮层选项行抽成共享组件,3D 面板复用
- 测试:新增 Model3dGenerationValidation.test.ts(12 例),FormModel / Submission / Modal / useModel3dGenerationTask 补组合表与菜单用例,共 75 例通过
- 文档:实施计划与里程碑追加本轮口径与证据,decision-log 与 pitfalls 各记两条
2026-09-24 14:55:06 +08:00
k88936 5ebc6df6ae 3D 失败态下主按钮也开新一代,不再重现同一次失败
- Model3dGenerationModal 主按钮与「重试」共用失败态重置后的 dialog(refreshModel3dAttemptNonce),失败态点主按钮不再沿用旧幂等键
- 新增用例:失败态主按钮提交的代次必须变化、状态回到 idle,且按钮保持可点
2026-09-23 18:51:15 +08:00
k88936 a4132616d8 3D 产物 content type 只认字节或槽位白名单,去掉兜底
- 删除 fallback_extension 与「未知声明原样放行 + 扩展名兜底」的归一逻辑
- 槽位白名单收敛为唯一映射表(content type ↔ 对象键扩展名),跨槽位类型返回 None
- resolve_artifact_content_type 改为返回 Result:字节认不出且声明不在白名单时按 502 失败,
  不再把 text/plain 之类的声明连同拼出来的 .glb 扩展名落进 OSS 与 asset_object
- 错误体只回显截断到 64 字符的声明值,避免把任意长度的 provider 文本带进响应
- 重写 storage 测试:新增白名单外声明、跨槽位类型与字节认不出三类用例
- 同步技术方案:说明白名单范围与「不做任何兜底」的口径
2026-09-23 16:39:15 +08:00
k88936 a753ac4cd8 3D 前端提交跟随其它画布生成工具同时落素材库
- buildModel3dSubmissionPlan 接收当前素材夹与素材名,与图片/图标/音效等工具一样同时发 projectId + assetFolderId + assetLabel(素材名缺省回落本次结果标题),没有素材夹时只发 projectId。
- useModel3dGenerationTask 新增 assetFolderId 入参,画布生成链路把当前素材夹透传下来;结果仍走既有画布路径读回,刷新素材库沿用 applyGeneratedProjectSnapshot 的既有行为,不新增 3D 专用刷新。
- 素材库行加 model3d 分支:缩略图按预览图(asset.src)渲染,objectKey(模型本体 .glb)不参与图片签名,与画布 3D 卡片的 objectKey={null} 口径一致,避免素材行去加载模型文件。
- 用例补齐:请求体同时带两个落点、无素材夹时不带 assetFolderId/assetLabel、素材夹只 trim 且素材名回落标题,以及素材行 3D 预览不签模型对象键 / 普通图片仍按 objectKey 换签名地址。
- 验证:npx vitest run src/components/image-editor/model3d-generation src/components/image-editor/ImageCanvasAssetRowView.test.tsx(67 passed)、npm run typecheck、check:encoding / git diff --check 通过。
2026-09-23 15:54:39 +08:00
k88936 f659ddfcf0 3D 生成前端提交体跟随平坦落点契约
- buildModel3dSubmissionPlan 不再拼 tagged target,把 projectId 与 canvasCompletion 直接摊进请求体;画布链路仍只落项目资源。
- submitModel3dGenerationRequest 的提交体注释同步落点字段改名。
- 请求体、幂等键与排队用例改为断言扁平落点字段。
- 定向验证:npx vitest run src/components/image-editor/model3d-generation src/components/image-editor/model3d-preview(63 passed)、npm run typecheck 通过。
2026-09-23 14:02:57 +08:00
k88936 caafb8baa3 3D 提交体改用端点契约类型而非 Record
- Model3dSubmissionPlan.body 与 submitModel3dGenerationRequest 的 body 收紧为两个端点请求契约
- 提交计划按端点分支分别构造 text-to-model / image-to-model 请求体
- 幂等键入参同步收紧,测试夹具按契约补全 body
2026-09-22 17:04:11 +08:00
k88936 4e46202c10 3D 提交收到无任务状态的成功响应不再静默复位
- 新增 MODEL3D_SUBMISSION_MISSING_QUEUE_STATE_MESSAGE 提示文案
- 空 body 或缺 status 的 2xx 响应改判失败态并保留提示,不再直接回 idle
- 补用例断言不再触发排队链路且对话框进入失败态
2026-09-22 17:00:13 +08:00
k88936 00eed191c5 3D 提交把兜底铸的尝试代次写回对话框状态
- 新增 resolveModel3dAttemptNonce,提交计划带出本次实际使用的代次
- 提交编排在进入 generating 时把该代次写回 dialog,缺代次的老快照不再每次换键
- 补老快照场景用例,断言幂等键前缀与写回的代次一致
2026-09-22 16:59:18 +08:00
k88936 62f1ca4537 3D 提交失败提示不再直接显示传输层英文文案
- resolveModel3dGenerationErrorMessage 对超时单独给出中文可重试提示
- fetch 失败与中断收敛到中文兜底,服务端文案仍原样透出
- 补服务端文案透出、传输层兜底与超时提示的用例
2026-09-22 16:57:55 +08:00
k88936 cb136fb445 画布图层的媒体渲染分派抽成独立函数
- src/components/image-editor/ImageCanvasWorldView.tsx:音频 / 视频 / 序列帧 / model3d / 默认图片这条五层三元链提成 renderCanvasLayerMedia(早返回写成一列判断),渲染分支与传参不变,新增媒体类型不再加深三元

验证:npx vitest run src/components/image-editor/ImageCanvasWorldView.test.tsx(57 用例全绿)、npm run typecheck
2026-09-22 13:33:14 +08:00
k88936 d1478e3859 文生 / 图生 3D 面板入口合并到同一个 opener
- src/components/image-editor/useImageCanvasGenerationWorkflow.ts:新增 openModel3dGenerationDialog(mode),openModel3dTextToModelDialog / openModel3dImageToModelDialog 退化成两个只传 mode 的薄包装;两条入口此前是除 mode 外逐字相同的复制,改逻辑时容易只改一处

验证:npm run typecheck
2026-09-22 13:31:48 +08:00
k88936 b41d156edd 底部工具栏的子选项锚点 ref 改用查表
- src/components/image-editor/ImageCanvasBottomToolbarView.tsx:把 spec / music / model3d / publication 的三层三元 ref 选择链提成 toolWrapRefs 映射表,新增子选项时不再延长三元链

验证:npx vitest run src/components/image-editor/ImageCanvasBottomToolbarView.test.tsx(3 用例全绿)、npm run typecheck
2026-09-22 13:31:46 +08:00
k88936 4363a6219a 修正查看器失败文案穷尽检查的写法(上一提交未通过类型检查)
- src/components/image-editor/model3d-preview/Model3dViewerModel.ts:上一提交把 never 断言写在 switch (detail?.reason) 上,default 分支里可选链未被收窄,npm run typecheck 报 TS2322(undefined 不能赋给 never)。改为先取局部常量并早返回「原因缺失 / load-failed」,switch 只处理其余三种原因,default 保留 never 断言
- 文案与判定结果不变

验证:npm run typecheck(tsconfig.typecheck-guardrails,exit 0);临时给 Model3dViewerFailureReason 增加一个成员,确认该 default 分支会编译报错(TS2322),随后已还原;npx vitest run src/components/image-editor/model3d-preview(18 用例全绿)
2026-09-22 13:31:24 +08:00
k88936 0ec0a13cbc 关闭 3D 预览面板时清掉查看器状态
- src/components/image-editor/model3d-preview/Model3dViewerModal.tsx:layer 变 null(面板关闭)时把 viewerStatus 复位,下一次打开从禁用的「重置视角」开始,不再继承上一轮实例的 ready;只处理关闭不处理换模型,避免 effect 晚于查看器上报而盖掉 loading
- src/components/image-editor/model3d-preview/Model3dViewerModal.test.tsx:新增「关闭后重开不沿用 ready」的回归用例

验证:npx vitest run src/components/image-editor/model3d-preview(18 用例全绿)
2026-09-22 13:29:10 +08:00
k88936 c96d7fe847 查看器失败文案改用穷尽 switch
- src/components/image-editor/model3d-preview/Model3dViewerModel.ts:resolveModel3dViewerFailureText 从早返回改成 switch,并给 default 加 never 穷尽检查;查看器今后新增失败原因会在此处编译报错,而不是静默落到通用兜底文案。文案与判定结果不变

验证:npx vitest run src/components/image-editor/model3d-preview、npx tsc -p tsconfig.typecheck-guardrails.json --noEmit
2026-09-22 13:28:14 +08:00
k88936 8131a70a2f 失败态的重试按钮也按 canSubmit 门禁渲染
- src/components/image-editor/model3d-generation/Model3dGenerationModal.tsx:重试按钮改为 dialog.status === 'failed' && canSubmit 才渲染;此前定价失效或参考图未上传完时它仍可点,提交管线再挡回来,交互上表现为「点了没反应」

验证:npx vitest run src/components/image-editor/model3d-generation/Model3dGenerationModal.test.tsx(8 用例全绿)
2026-09-22 13:27:39 +08:00
k88936 73f34ecbc9 前端补上「分件 + 方形布线 / 智能低多边形」的互斥校验
- src/components/image-editor/model3d-generation/Model3dGenerationFormModel.ts:resolveModel3dGenerationParams 增加 generateParts 与 quad / smartLowPoly 的互斥判定,与 provider 的 validate_generation_options 对齐;此前纯几何档位下这两个开关仍可同开,前端能出价、提交后才被后端拒
- src/components/image-editor/model3d-generation/Model3dGenerationFormModel.test.ts:新增该组合被拒的用例

验证:npx vitest run src/components/image-editor/model3d-generation(40 用例全绿)
2026-09-22 13:26:49 +08:00
k88936 25fe98836f 幂等键指纹的键排序改成具名比较函数
- src/components/image-editor/model3d-generation/Model3dGenerationSubmission.ts:canonicalizeModel3dRequestValue 里的嵌套三元比较器提成模块级 compareModel3dRequestEntryKeys,排序结果不变,只是不再嵌三元且不必每次递归重建比较器

验证:npx vitest run src/components/image-editor/model3d-generation(39 用例全绿)
2026-09-22 13:26:28 +08:00
k88936 b48c34d6b4 删掉重复且无人使用的 3D 提交超时常量
- src/components/image-editor/model3d-generation/Model3dGenerationSubmission.ts:删除 MODEL3D_SUBMISSION_TIMEOUT_MS;实际生效的是 editorProjectClient 的 EDITOR_MODEL3D_SUBMISSION_TIMEOUT_MS(submitModel3dGenerationRequest 用它),保留两份 60_000 只会各自漂移

验证:全仓库检索该常量只剩定义处(已删);npx tsc -p tsconfig.typecheck-guardrails.json --noEmit
2026-09-22 13:26:00 +08:00
k88936 5bdabdc7f7 3D 提交计划在非 3D 模式改用专门的原因文案
- src/components/image-editor/model3d-generation/Model3dGenerationSubmission.ts:buildModel3dSubmissionPlan 的 mode 兜底改用 MODEL3D_MODE_UNSUPPORTED_REASON,不再把非 3D 面板说成「3D 模型定价尚未配置」

验证:npx vitest run src/components/image-editor/model3d-generation
2026-09-22 13:25:38 +08:00
k88936 9b1c99f37b 非 3D 面板不再复用「定价未配置」这句原因
- src/components/image-editor/model3d-generation/Model3dGenerationFormModel.ts:新增 MODEL3D_MODE_UNSUPPORTED_REASON,resolveModel3dGenerationQuote 在 mode 不是 3D 生成模式时返回它;原文案会把「模式不支持」误报成定价配置问题

验证:npx vitest run src/components/image-editor/model3d-generation
2026-09-22 13:25:37 +08:00
k88936 9a62941779 贴图质量映射抽成单一函数,去掉嵌套三元
- src/components/image-editor/model3d-generation/Model3dGenerationFormModel.ts:resolveModel3dGenerationParams 里的贴图质量嵌套三元提成 resolveModel3dTextureQuality(tier),取值与判定条件不变

验证:npx vitest run src/components/image-editor/model3d-generation
2026-09-22 13:25:22 +08:00
k88936 7987fed204 删掉无人引用的 MODEL3D_IMAGE_PROMPT_MAX_LENGTH
- src/components/image-editor/model3d-generation/Model3dGenerationFormModel.ts:删除只导出、全仓库无引用的图生 3D 提示词长度常量;文生上限与画布尺寸常量仍在使用

验证:全仓库检索该常量只剩定义处;npx tsc -p tsconfig.typecheck-guardrails.json --noEmit
2026-09-22 13:25:18 +08:00
k88936 fc8a674e91 3D 模型角标改用 Tailwind v4 可用的类与专用 CSS 规则
- src/index.css:新增 .image-canvas-editor__kind-badge--model3d 规则,背景与阴影沿用原取值,与其它 asset kind 的写法一致
- src/components/image-editor/ImageCanvasWorldView.tsx:model3d 角标改成引用该规则;原写法用 Tailwind v3 的 `!` 前缀(v4 改后缀),实际不会生成工具类,角标退化成白字无底色的白药丸

验证:npx prettier --check src/index.css src/components/image-editor/ImageCanvasWorldView.tsx
2026-09-22 13:23:24 +08:00
k88936 f1d0aed7dd 3D 生成面板补上浮动菜单的 portal 与定位参数
- src/components/image-editor/ImageCanvasGenerationComposerView.tsx:Model3dGenerationModal 传入 renderEditorPortal / buildPortalMenuStyle,与同文件其余生成面板一致;此前走默认的恒等实现,「参考图来源」菜单内联在文档流里且没有定位样式

验证:npx tsc -p tsconfig.typecheck-guardrails.json --noEmit
2026-09-22 13:22:44 +08:00
k88936 93002f1bd2 统一 model3d 查看器状态类型命名:Model3DViewerStatus 改回 Model3dViewerStatus
- packages/model3d-viewer/src/status.ts:状态类型改名,与同文件的 Model3dViewerFailureReason / Model3dViewerStatusDetail 以及仓库既有 Model3d* 口径一致
- packages/model3d-viewer/src/Model3DViewer.tsx、packages/model3d-viewer/src/index.ts:跟随改名更新导入与引用
- src/components/image-editor/model3d-preview/Model3dViewerModal.tsx:跟随改名更新导入与状态类型引用

验证:npx tsc -p tsconfig.typecheck-guardrails.json --noEmit、npm run lint:eslint(改动文件)
2026-09-22 13:16:05 +08:00
k88936 10e63ecb6b 合并 origin/master 到 feat/tribo3d-integeration:ts-rs 一律常开、Cargo 清单去重
- server-rs/Cargo.toml:删除与 workspace git 固定重复的 registry `ts-rs = "12.0.1"`,保留固定 commit 并写明「ts-rs 一律常开、绑定命令固定为 cargo test -p shared-contracts export_bindings」
- server-rs/crates/shared-contracts/Cargo.toml:删除 master 侧新增的 `ts-bindings` feature,`ts-rs` 保持常开依赖
- server-rs/crates/shared-contracts/src/game_creation_app/asset_kind.rs:去掉 `cfg_attr(feature = "ts-bindings", …)` 门控,derive 与字段级 `ts(...)` 无条件展开
- apps/ai-game-creator-shell/src-tauri/Cargo.toml:shared-contracts 依赖去掉 `features = ["ts-bindings"]`,继续保留本分支的 ts-rs git 固定
- apps/ai-game-creator-shell/src-tauri/Cargo.lock:按上述依赖变更同步(shared-contracts 指向 git 源 ts-rs)
- docs:同步 5 处绑定生成命令(去掉 `--features ts-bindings`),并在 decision-log 记本次合并的决策、代价与验证
- 其余暂存改动为 origin/master 带入的内容,冲突按两侧目的逐一合并

验证:cargo metadata --locked(server-rs 与 AGC 两个 workspace)、cargo test -p shared-contracts(119 + 5 + 5 + 2 + 2 全绿且无告警)、npm run contracts:model3d:generate 后 packages/shared 零 diff、cargo check -p spacetime-module --target wasm32-unknown-unknown、npm run check:encoding、npm run check:rustfmt、npm run check:spacetime-schema、git diff --check、暂存集 eslint / prettier 全过
2026-09-22 13:12:28 +08:00
k88936 61fe4c48af 图片画布接入 3D 资源:新增 model3d 类别、3D 预览与 3D 生成入口
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Failing after 16s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Failing after 18s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Failing after 18s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Failing after 18s
Project CI / AI game creator shell Rust smoke (pull_request) Failing after 16s
Project CI / Backend tests (pull_request) Failing after 16s
Project CI / AI game creator shell Rust crates (pull_request) Failing after 16s
Project CI / Native shell tests (pull_request) Failing after 16s
Project CI / Frontend tests (pull_request) Failing after 7s
Project CI / Repository checks (pull_request) Failing after 12s
Project CI / AI game creator shell web tests (pull_request) Failing after 12s
- 后端资源投影按 asset_kind 分叉,新增 project_editor_client_media_src 与 EDITOR_MODEL3D_ASSET_KIND:model3d 只投影预览图,模型本体只留 objectKey,预览缺失才回落历史口径
- tripo3d 存储新增按字节魔数识别模型 content_type 与扩展名映射,不采信 provider 声明与下载响应头
- editor_project_storage 把 model3d 加入 EDITOR_CANVAS_ASSET_KINDS 白名单
- 前端 CanvasAssetKind 与 image-canvas-core 类型新增 model3d:画布卡片渲染预览图或 3D 占位,类型角标新增「3D模型」,覆盖资格只在它与空类别之间成立
- 新增 model3d-preview 子目录(Model3dViewerModal / Model3dViewerModel),Tailwind 内联、不新增 CSS,失败原因分超限 / 格式不可识别 / 无 WebGL2 三类展示
- 选中工具条新增只读 preview-model3d 能力位,仅 objectKey 为空时置灰;打开预览同时选中图层并暂停画布快捷键与舞台交互
- 查看器包源对象 format 改为可选,新增「声明 Content-Type → 字节魔数 → 地址扩展名」三级格式判定并导出支持格式清单
- 导出工作流新增 3d_models/ 目录,模型下载按真实响应头 MIME 定扩展名、对象键扩展名兜底
- 新增 3D 生成入口:底部工具栏浮动子选项与文生 / 图生 3D 面板,落 projectResource + canvasCompletion,复用占位框与任务侧栏
- 3D 定价只读实时定价查询,段缺失即入口不可提交;幂等键由前端铸造,用户重试必须换键
- 新增 ADR 0003 / 0004 与实施计划、里程碑文档;更新 Tripo 技术方案、后端架构、CONTEXT 术语、decision-log 与 pitfalls
- .gitignore 忽略仓库根目录手工下载的 3D 样例模型
2026-09-22 10:10:00 +08:00
k88936 6981648796 合并 origin/master:Supervisor 永久退役,项目对话收敛为 DirectProject 与 Design Agent
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m56s
Project CI / Backend tests (pull_request) Failing after 12s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 3m48s
Project CI / Native shell tests (pull_request) Failing after 45s
Project CI / Repository checks (pull_request) Failing after 13s
Project CI / Frontend tests (pull_request) Failing after 1m52s
Project CI / AI game creator shell web tests (pull_request) Failing after 1m42s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Failing after 6m57s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Failing after 8m1s
- 解决 refactor/split-direct-project 与 origin/master 在 App.tsx、立项策划聊天视图、Direct composer/引用输入区、styles.css、Rust direct user item 与 appSurface 用例上的冲突,按「Supervisor 永久退役」口径保留 DirectProject 独立聊天容器与 Design Agent 两条产品路径
- 采纳 master 的策划 Agent V1/V2 退役:删除 GDD 审批卡、策划输入卡、planningLane、planningSessionV2、planningSessionContract、规划展示适配与 Rust planning_*_v2 命令、模块、契约及对应用例,不保留兼容别名或双跑路径
- 把 master「折叠思考显示单行预览」的目的落到当前结构:新增共享表现 chat/components/AgentReasoning/AgentReasoning.tsx(折叠态单行纯文本预览 + 箭头、展开态安全 Markdown),DirectProject 回合与策划回合共用,删掉两处写死的 pre 折叠实现
- 把 master「策划入口可选模型 / 推理档」的目的接到当前策划输入盒:复用 ConversationModelSelect 与 ComposerReasoningEffortSelect,配置写回仍走客户端配置通道
- App.tsx 删除只服务退役 Supervisor / 策划 V2 的 state、ref、effect、回调与死参数,并删除两条读路径都退役后的 workspaceProjectKind;openWorkspace 的工程类型入参保留为未使用契约
- Rust 侧保留本分支 canonical→wire 投影、无审计 Direct 回合与 direct user item 严格校验,并入 master 的 prepare_new_web_project_at 前置复核
- 更新 ADR 与 shared-memory 决策记录:策划当前只有 Design Agent、两条路径的共享表现清单,以及本次合并的口径、代价与验证证据
- 验证:AGC 与仓库 typecheck、check:encoding、check:doc-index、git diff --check、改动文件 eslint 0 error;AGC vitest 168 个文件中除 5 个 jsdom localStorage 环境失败文件与本分支既有 resourceTagStatsRefresh 失败外全绿,appSurface 198 passed / 13 skipped;Rust 定向用例 direct_codex_user_item、skill_pack、sessions 全过(整套分片在本容器受 /sbin -> usr/bin 触发沙箱预检失败,与本合并无关)
2026-09-21 21:09:34 +08:00
suzmii de502e9bc3 替换面板改为非模态浮层,支持在画布上点选替换目标
- 共享选择组件新增 opt-in nonModal:不铺遮罩、不做焦点陷阱、限高 + 内部滚动,Esc 在 document 阶段截断后取消,关掉即卸载;网页端美术画布不传,弹窗行为逐字不变。
- 新增 initialSelectionRevision:面板开着时宿主换了目标才重同步当前选择,面板里的搜索词与分类筛选不被重置。
- AGC 侧把候选面板锚到画布右上角(任务开关下方),壳样式放共享样式表、宿主只负责锚定;面板开着时画布照常可点,点中合法候选落成面板当前选择,写入仍只由「确认」发起。
- 退役旧的「点选替换」按钮、画布提示条与 resourceReplacementPickMode:同一个功能不留两条 UI 路径;合法性判据仍复用 resolveResourceReplacementPick,写入仍是同一个 confirm 函数。
- 确认时用画布点选结果兜底,避免点完当帧按确认误报「请选择一个替换素材」。
- 测试:替换用例 4 条点选路径改写为非模态 + 面板点选(含四类非法目标在面板内报因、Esc 只收面板),新增「画布点选不清掉面板搜索/分类」;共享组件用例新增 nonModal 形态与浮层壳声明级契约。
- 文档:PRD 5.3 / 7.8 第 8 条改写、验收用例 S15a 改写、decision-log 新增 2026-09-21 条目、待办文档登记三项并勾掉对应需求。
2026-09-21 03:48:40 +08:00
suzmii 55259683b8 删除角色动画面板里重复回显提示词的「动画描述」行
- 共享组件 ImageCanvasCharacterAnimationPanelView 不再渲染只读的生成文本回显(与上方输入区内容重复,且两个宿主都没有为它定义样式)
- 用例同步:原断言「生成文本:…」改为钉住该节点不再渲染,并保留「输入区确实收下这段文本」的检查
2026-09-21 00:28:26 +08:00
suzmii 6fb17de9db Merge remote-tracking branch 'origin/master' into fix/agc-acceptance-followup
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Failing after 19s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Failing after 19s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Failing after 19s
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Failing after 19s
Project CI / AI game creator shell Rust smoke (pull_request) Failing after 19s
Project CI / Native shell tests (pull_request) Failing after 19s
Project CI / AI game creator shell Rust crates (pull_request) Failing after 19s
Project CI / Backend tests (pull_request) Failing after 19s
Project CI / Frontend tests (pull_request) Failing after 7s
Project CI / AI game creator shell web tests (pull_request) Failing after 14s
Project CI / Repository checks (pull_request) Failing after 15s
2026-09-20 19:25:45 +08:00
suzmii 1e17d2c852 补齐画布验收第一批:润色回包提示、未提交草稿恢复与派生名预检
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 7m44s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Successful in 7m57s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Successful in 5m44s
Project CI / Backend tests (pull_request) Failing after 16s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Successful in 5m53s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 2m21s
Project CI / Repository checks (pull_request) Failing after 12s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m27s
Project CI / Frontend tests (pull_request) Successful in 7m4s
Project CI / AI game creator shell web tests (pull_request) Successful in 6m22s
Project CI / Native shell tests (pull_request) Successful in 10m13s
AI 润色回包与原文相同时给出明确提示,不再落下点了等于没点的「恢复原文」假入口
润色「与原文相同」的判据改为规范化之后要写回宿主的文本,回包被长度上限截回原文同样算没变化
共享聊天输入区显示润色提示,并让提示随用户手改提示词失效
快速编辑未提交草稿改按资源路径归属,收起面板或被旁路重投影后都不再静默丢掉
恢复入口按路径与本会话草稿对号,并区分「本会话未提交」与原生账本条目
账本读取失败时入口仍报出本会话草稿条数,「继续编辑」重开面板回填提示词与 @ 引用
派生资源名预检接入快速编辑与角色动画两条提交路径,早于正规化写盘
名称预检自身抛错时回写面板失败态,不再留下「点了没反应」的提交按钮
浮层关闭判定改在捕获阶段冻结,避免浮层内按钮卸载自己时整块面板被自己人收掉
恢复入口动作按钮收进统一容器,补移动端纵向排布与禁用态样式
空草稿表改工厂函数,跨语言对表用例按模块路径解析 Rust 源码
补回归用例:旁路重投影后的草稿、原样回包提示、提交前名称拦截、草稿表读写与跨卡隔离
同步 decision-log 与画布验收待办的进展说明
2026-09-20 17:36:02 +08:00