k88936
d9aa686e9a
Merge remote-tracking branch 'origin/master' into feat/tribo3d-integeration
...
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m36s
Project CI / Backend tests (pull_request) Failing after 11s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 1m11s
Project CI / Frontend tests (pull_request) Successful in 4m15s
Project CI / Repository checks (pull_request) Failing after 11s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m36s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 8m33s
Project CI / Native shell tests (pull_request) Successful in 9m19s
Project CI / AI game creator shell web tests (pull_request) Successful in 4m29s
# Conflicts:
# docs/project-memory/shared-memory/pitfalls.md
2026-09-22 15:35:47 +08:00
k88936
050909a0b7
后台定价保存不再清空 3D 段
...
- payload 的 model3d 缺席或为 null 统一表示沿用当前 3D 定价,显式给出时才覆盖
- 保存路径先取当前快照合并,避免改图 / 视频价格让 3D 提交一直失败关闭
- 补用例覆盖「省略保持」与「显式覆盖」两种语义
2026-09-22 15:27:19 +08:00
k88936
ee2d505eb3
3D 提交在扣费前预检落点归属
...
- 新增 target 预检模块:画布项目按 (project_id, owner) 定点确认,素材库文件夹按 owner 的库匹配
- 两个提交路由都在查价与入队之前调用;跨 owner / 不存在的落点回 400 model3d-target-unavailable
- 只剩基础设施故障保留原状态码,并补了收敛口径的单测
2026-09-22 15:21:25 +08:00
k88936
8473877bc3
5xx 错误响应不再回带 provider task id
...
- TaskFailure / OutputSchema / 上游兜底分支只回固定文案,完整错误写入服务端日志
- 补一条断言 502 details 不含 task id 与 provider 原文的用例
2026-09-22 15:17:50 +08:00
k88936
cda7724cae
上游瞬时状态不再回落成 400
...
- 408 / 425 / 429 与 platform-tripo 的 is_retryable 口径对齐,分别回 504 / 502 / 429
- 补上这三档与客户端 4xx 的分支测试
2026-09-22 15:15:27 +08:00
k88936
e18c6ee502
产物下载客户端不再跟随跳转
...
- 产物地址来自 provider 响应,禁止 reqwest 自动跳转以防 SSRF
- 需要跳转的地址会以非成功状态显式暴露,不再由服务端静默代发
2026-09-22 15:12:06 +08:00
k88936
669a08c7c2
产物下载失败信息补上可诊断上下文
...
- 传输失败带上脱敏 URL 与底层错误 source 链
- 非成功状态补上状态码文案与脱敏 URL
2026-09-22 13:51:29 +08:00
k88936
01a9941cbc
任务快照映射不再多余克隆字符串
...
- task_id 与 error_message 直接移交所有权,只保留错误路径上的必要克隆
2026-09-22 13:51:23 +08:00
k88936
fd0a37969e
3D 产物落盘文件名补上安全处理
...
- URL 无可用扩展名时按 content type 兜底,预览图不再写成 .glb
- 文件名主干中性化路径分隔符与遍历片段,避免逃出目标目录
2026-09-22 13:50:29 +08:00
k88936
7dd7bdd3c7
provider checkpoint 存在性校验补上 provider_kind
...
- at-most-once submit 的两字段不变量在数据层一起判定
2026-09-22 13:50:24 +08:00
k88936
5049c27f3d
3D 定价表加载时拦截加总溢出
...
- 底价与加价项累加改用 checked_add 校验,配置阶段即失败
- 避免结算路径 saturating_add 在异常配置下静默少收
2026-09-22 13:49:01 +08:00
k88936
129e2234f3
删掉 3D 引用解析里两个无人调用的宽查函数
...
- 两个 pub(crate) resolver 全仓无调用方,且会整表列举项目与素材
- 定点解析仍走既有按 ID 的窄查函数
2026-09-22 13:48:53 +08:00
k88936
2916e112df
3D provider 重试次数按上限 10 封顶
...
- TRIPO_RETRIES 配置异常时不再让产物下载近乎无限重试
2026-09-22 13:48:13 +08:00
k88936
c5e0c6a14d
去掉被丢弃的 remove 返回值告警
...
- 幂等指纹字段摘除改为显式丢弃返回值,表明这是 best-effort 行为
2026-09-22 13:48:10 +08:00
k88936
e2809b83c0
3D 冒烟示例单端点失败不再中断其余端点
...
- wait_for_task / get_task / download_model 失败时记录该端点错误并继续
- 保留 throw_on_failure: false 的原有语义,仅补齐传输与超时类错误
2026-09-22 13:45:50 +08:00
k88936
058d851a69
去掉 model3d_price 上已过期的 dead_code 豁免
...
- server-rs/crates/api-server/src/editor_generation_config.rs:model3d_price 现在由 tripo3d 提交路由真实消费,删掉「里程碑二的路由接上之前只有测试消费」这句已过期注释与配套的 #[allow(dead_code)]
验证:cargo check -p api-server(--locked)无该函数相关告警
2026-09-22 13:43:45 +08:00
k88936
444520b464
修正 storage.rs 注释错别字
...
- server-rs/crates/api-server/src/tripo3d/storage.rs:sniff_model_content_type 文档注释「说慌」改为「说谎」
验证:npm run check:encoding、git diff --check
2026-09-22 13:42:37 +08:00
k88936
326729a5ac
Idempotency-Key 校验错误保留请求上下文
...
- server-rs/crates/api-server/src/tripo3d/routes.rs:require_idempotency_key 增加 request_context 参数,缺失 / 格式非法的两个 400 改用 into_response_with_context(Some(..)),与同处理器其它校验、定价错误一致;此前传 None,客户端拿不到请求 ID / 关联标识
验证:cargo test -p api-server --locked idempotency_key(相关 6 个用例全绿)
2026-09-22 13:42:34 +08:00
k88936
14740e0ef6
3D 任务参数用例改为断言真实主张
...
- server-rs/crates/api-server/src/tripo3d/job.rs:把 job_request_rejects_payload_without_fingerprint_stripping_support 改名为 job_request_stays_strict_after_stripping_platform_fingerprint 并补断言——带指纹 + 其它未知字段的合法 payload 仍必须被拒(摘下平台字段不等于放宽严格解析);原用例名声称验证指纹摘除,实际只断言了「缺字段的 payload 被拒」和「未知 job kind 被拒」
验证:cargo test -p api-server --locked job_request(2 个用例全绿)、npm run check:rustfmt
2026-09-22 13:40:13 +08:00
k88936
48a5bf06d0
3D 产物读取不再克隆 content type
...
- server-rs/crates/api-server/src/tripo3d/artifacts.rs:content_type 只在本函数取一次、之后不再读句柄字段,改用 take() 转移所有权而不是 clone()
验证:cargo check -p api-server(--locked)
2026-09-22 13:36:28 +08:00
k88936
9263d79d42
3D 产物读取按声明长度预分配缓冲
...
- server-rs/crates/api-server/src/tripo3d/artifacts.rs:read_artifact 用 Vec::with_capacity 按 provider 声明的 content_length 预分配(并封顶到 512 MiB 上限,防止谎报长度撑爆内存),避免几百 MB 产物逐块 extend 反复搬移
验证:cargo check -p api-server(--locked)
2026-09-22 13:36:25 +08:00
k88936
6d8164d37a
OSS 不可用错误补上机器可读的 reason
...
- server-rs/crates/api-server/src/tripo3d/errors.rs:oss_unavailable 增加 reason=oss-unavailable,与同文件其它 5xx 映射及 editor_agent 的 OSS 错误口径一致,客户端可按 reason 分类这个 503
验证:cargo check -p api-server(--locked)
2026-09-22 13:35:23 +08:00
k88936
66b8c2bed0
3D 定价快照读取失败补上机器可读的 reason
...
- server-rs/crates/api-server/src/tripo3d/errors.rs:map_pricing_store_error 增加 reason=model3d-pricing-store-error,与同文件其它映射一致,客户端可按 reason 分类这个 500;provider 保持 editor-generation-pricing(全仓库定价错误都是这个口径),不改写为 TRIPO_PROVIDER
验证:cargo check -p api-server(--locked)
2026-09-22 13:35:20 +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
02df355281
3D 提交地址改成按 endpoint 穷尽映射
...
- src/services/image-editor/editorProjectClient.ts:新增 EDITOR_MODEL3D_ENDPOINT_API(Record<Model3dPricingEndpoint, string>)取代三元判断;原写法对非 image-to-model 的值一律回落 text-to-model,endpoint 联合扩容时会静默走错接口
验证:npx tsc -p tsconfig.typecheck-guardrails.json --noEmit
2026-09-22 13:24:43 +08:00
k88936
5d47ef9347
3D 提交的「不自动重试」选项改回 retry 字段
...
- src/services/image-editor/editorProjectClient.ts:submitModel3dGenerationRequest 把 EDITOR_GENERATION_REQUEST_RETRY_OPTIONS 从顶层展开改成 retry 字段;requestJson 只认 options.retry,顶层展开的 maxRetries / retryUnsafeMethods 会被静默忽略,计费 POST 的「不自动重试」意图丢失(当前只是靠 POST 默认 maxRetries=0 侥幸不重试)
验证:文件内 9 处生成入口现在统一使用 retry 字段
2026-09-22 13:24:22 +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
9f4f7341c9
修复 AGC 资源工具条缺 onPreviewModel3d 导致的类型检查失败
...
- apps/ai-game-creator-shell/src/view/project-development/index.tsx:给 ImageCanvasSelectedLayerToolbarView 补上 onPreviewModel3d 空实现,并写明资源画布不登记 preview-model3d、按钮不会渲染;此前该必填属性缺失,AGC 严格模式报 TS2741
验证:npm run ai-game-creator-shell:typecheck(修复前 error TS2741,修复后 exit 0、error TS 计数 0)
2026-09-22 13:21:10 +08:00
k88936
928aee403a
修正 model3d 绑定生成的 editor_canvas 测试过滤词
...
- package.json:contracts:model3d:generate 的测试过滤词由 editorcanvas 改为 editor_canvas;libtest 过滤词按子串区分大小写,而模块名是 editor_canvas::export_bindings_*,原写法命中 0 个用例,packages/shared/src/contracts/editor-canvas 实际只被 prettier 重排、从未重新生成
验证:cargo test --locked -p shared-contracts -- model3d editor_canvas(25 个导出用例命中,含 editor_canvas 的 2 个;修复前该过滤词命中 0 个)、npm run contracts:model3d:generate 后 packages/shared 零 diff
2026-09-22 13:19:34 +08:00
k88936
d24347d78e
gitignore 的 3D 样例规则改为大小写不敏感
...
- .gitignore:把 /*.glb 一类规则改成 /*.[gG][lL][bB] 形式;gitignore 匹配与 core.ignoreCase 无关,浏览器下载保留下来的 Model.GLB / scene.GLTF 等大写扩展名此前仍会出现在 git status 里
验证:git check-ignore -v model.GLB scene.GLTF asset.FBX model.bin s.png(均命中新规则)
2026-09-22 13:19:09 +08:00
k88936
0ae73f7e0e
gitignore 连 glTF 兄弟资源一起忽略
...
- .gitignore:仓库根目录手工下载的 3D 样例除容器文件外,再忽略多文件产物的 .bin 缓冲与 png / jpg / jpeg / webp / ktx2 / tga 贴图,避免整套样例在 git status 里逐条冒出来
验证:git check-ignore -v image_to_model.glb companion.bin scene.png(根目录同名文件命中新规则)
2026-09-22 13:18:55 +08:00
k88936
fb9c1d0e29
查看器取消时一并中止在途的模型下载
...
- packages/model3d-viewer/src/loader.ts:readModel3dViewerSource 与 loadModel3dViewerObject 新增可选 AbortSignal,透传给 fetch;signal 已中止时抛 Model3dViewerAbortedError,不再当成 load-failed
- packages/model3d-viewer/src/scene.ts:场景输入新增 signal,创建时透传给模型加载
- packages/model3d-viewer/src/Model3DViewer.tsx:加载 effect 内建 AbortController,卸载 / 换源时先 abort 再释放场景,避免下载要读完 64 MiB 才被丢弃
- packages/model3d-viewer/src/loader.test.ts:新增回归用例,断言 signal 确实交给 fetch 且中止后抛取消错误
验证:npx vitest run packages/model3d-viewer(20 用例全绿)、npx tsc 严格模式检查查看器包全部源文件
2026-09-22 13:18:40 +08:00
k88936
b71d18b166
场景释放不再强制丢失 WebGL 上下文
...
- packages/model3d-viewer/src/scene.ts:teardown 去掉 renderer.forceContextLoss(),只保留 renderer.dispose(),并写明原因;宿主 Model3DViewer 全程复用同一个 <canvas>,强制丢上下文会让下一个模型拿到已丢失的上下文渲染全黑
验证:npx tsc(严格模式单文件检查)、npx vitest run packages/model3d-viewer
2026-09-22 13:18:04 +08:00
k88936
4bcf0cdb86
释放材质时用 if/else 取代嵌套三元
...
- packages/model3d-viewer/src/scene.ts:disposeModel3dViewerObject 里把材质归一化成数组的三元链改成 if/else,展开层级与语义不变,只是去掉内层三元嵌套
验证:npx tsc(严格模式单文件检查)、npx vitest run packages/model3d-viewer
2026-09-22 13:17:43 +08:00
k88936
104656aa99
去掉 Model3DViewer 加载 effect 里冗余的 sourceKind 依赖
...
- packages/model3d-viewer/src/Model3DViewer.tsx:删除只出现在依赖数组里的 sourceKind 变量与依赖项,effect 实际只分支 sourceData / sourceUrl,kind 变化必然带动这两者之一变化
验证:npx tsc(严格模式单文件检查)、npx vitest run packages/model3d-viewer
2026-09-22 13:17:27 +08:00
k88936
de8bb9d373
取景近远裁剪面比例改为具名常量
...
- packages/model3d-viewer/src/framing.ts:把 near / far 推导里内联的 1/1000 与 10 提成 NEAR_DISTANCE_RATIO / FAR_DISTANCE_RATIO,与同文件其它比例常量口径一致,取值不变
验证:npx vitest run packages/model3d-viewer(19 用例全绿)
2026-09-22 13:17:02 +08:00
k88936
f9750bde0b
查看器取景距离改用前校验有限正数
...
- packages/model3d-viewer/src/framing.ts:computeModel3dViewerFitDistance 不再无条件采信调用方传入的 distance,改为 Number.isFinite 且大于 0 才采用,否则回落包围盒角点求解,避免 0 / 负数 / NaN 让 maxDistance 小于 minDistance
验证:npx vitest run packages/model3d-viewer、npx tsc -p tsconfig.typecheck-guardrails.json --noEmit
2026-09-22 13:16:40 +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
e7b067e977
恢复合并时丢掉的 AGC 壳依赖 codex-patch-parser 与 chrono
...
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m7s
Project CI / Backend tests (pull_request) Failing after 12s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 3m58s
Project CI / Native shell tests (pull_request) Failing after 2m50s
Project CI / Repository checks (pull_request) Failing after 12s
Project CI / Frontend tests (pull_request) Successful in 3m27s
Project CI / AI game creator shell web tests (pull_request) Failing after 1m34s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 9m23s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 9m24s
- apps/ai-game-creator-shell/src-tauri/Cargo.toml:[dependencies] 补回 master 侧新增的 `codex-patch-parser = { path = "vendor/codex-patch-parser" }` 与 `chrono = { version = "0.4", default-features = false, features = ["std"] }`(冲突解决时随同段落的 ts-rs 一起被丢掉,导致 src/agent/direct_patch.rs 与 src/agent/direct_codex_audit.rs 报 8 条 E0433 / E0432)
- apps/ai-game-creator-shell/src-tauri/Cargo.lock:按清单恢复 genarrative-ai-game-creator-shell 条目里的 chrono 与 codex-patch-parser 依赖
- docs/project-memory/shared-memory/pitfalls.md:新增 2026-09-22 条,记录「合并后 CI 报 cannot find module or crate 先查对方新增的依赖行」的判据与踩坑点
- docs/project-memory/shared-memory/decision-log.md:在 2026-09-22 合并条目补记这次丢依赖与验证
验证:cargo metadata --locked(AGC workspace)、cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --no-run(bin + 4 个集成测试目标全部编译)、cargo check --locked --workspace --manifest-path server-rs/Cargo.toml、npm run check:native-shells:agc-rust-crates、npm run check:encoding、npm run check:doc-index、git diff --check
2026-09-22 13:13:00 +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
9fc55a5cac
写入Tripo 3D泥点默认价并锁定credit换算口径
...
- 受控默认配置新增 model3d 段:底价按端点 × 模型版本 × 是否有贴图,add-on 六项独立计价
- 换算口径固定为泥点 = ceil(0.8 × Tripo 官方 credit),H 系列 10/20 与 20/30、P1 30/40 与 40/50、P2 100/110
- editor_generation_config 定向用例按 credit 表反算默认泥点价,改价必须先改 credit 表
- 段缺失语义改为显式摘段验证,仍保持 fail closed 不扣费不入队
- 主规范、里程碑、实施计划与定价管理方案同步默认价已确认与部署侧 override 风险
2026-09-21 22:07:55 +08:00
k88936
2691ca8aca
补记图生输入的OSS直读待讨论项
...
- api-server 的 image_source 模块头与 platform-tripo 的 upload_image 各留一条 TODO(oss-direct-read):交签名 URL 或对端直读 OSS 能省掉字节中转,但把私有对象与带时效凭据交给第三方,安全口径与可行性待讨论
- 技术方案文档把图生输入口径更新为当前的 source 站内引用 tagged enum,并补同一条待讨论说明
- 讨论清楚之前保持「api-server 自己读、自己传」的现口径,不改行为
2026-09-21 20:02:18 +08:00
k88936
14066eea11
产物下载改为按「无数据推进」判超时
...
- artifact reqwest client 不再设包含响应体的总超时,改成 connect_timeout + read_timeout(reqwest 0.12 的「每次读操作」语义,读完自动重置)
- 响应头之前没有数据推进时用显式 tokio::time::timeout 兜住,避免连上却不返回响应头时无限挂住
- 新增 TripoProviderClient::artifact_stall_timeout 统一承载三处预算,取值沿用 TripoSettings::request_timeout
- 补 3 个 mock TCP 用例:响应头一直不来、传输中途断流按无数据推进失败,慢速但持续的下载必须完整收完(后者能拦住「改回总超时」的回归)
- 同步技术方案与后端架构文档里的下载超时口径
2026-09-21 19:54:57 +08:00
k88936
609b24c779
text-to-model入口的submit改名带端点
...
- TripoProviderClient::submit 改名为 submit_text_to_model,与 submit_image_to_model / submit_multiview_to_model 一致
- 同步 api-server tripo3d worker 与 tripo_generation_smoke example 的调用点
- 同步技术方案文档里写死的 submit 口径,方法名不再与另两个入口分叉
2026-09-21 19:49:31 +08:00
k88936
3af0d3d90b
契约枚举的线上取值只由serde定义
...
- shared-contracts 新增 wire_str 与 wire_str_lossy:线上取值只从 serde rename / rename_all 取,不再维护第二份字面量
- 删除模型版本、纹理质量、纹理版本、纹理对齐、几何质量、输入方向、导出方向、压缩共 8 个枚举上手工维护的 as_str
- platform-tripo 新增 common/wire.rs 负责契约枚举到 provider 请求字符串的转换,三个入口的 to_sdk_params 改走它并把失败归一成 provider 错误
- api-server 的定价文案与 job 模型版本取值改用 serde 取值,job 的 model_version 由 &'static str 改为 String
- 取值来源只剩 serde 一处,改 rename 不会再静默分叉
2026-09-21 19:46:43 +08:00
k88936
c0d6531e92
三个入口的seed参数在TS契约里改用bigint
...
- seed 是 i64,JS number 表示不了全部取值却又没有范围校验,客户端传 64 位值会被静默舍入
- text_to_model / image_to_model / multiview_to_model 的 image_seed、model_seed、texture_seed 由 number|null 改为 bigint|null
- 同步重新生成的 ts-rs 绑定,仅这三个字段变化
2026-09-21 19:38:47 +08:00
k88936
a4d9418cd3
补记Tripo TS绑定目录化生成的重跑验证
...
- 实施计划进展记录 contracts:model3d:generate 重跑后 packages/shared 无 diff
- 验证命令清单补上该生成命令
2026-09-21 15:34:46 +08:00
k88936
7d842f0b15
补记spacetime-client重复副本文件的排障经验
...
- 记录 active.rs 用 path 属性指定真实模块、同名副本不参与编译的现象与原因
- 给出改动前先查 path 属性、只改 active 目录、用编译双绿确认的处理口径
2026-09-21 15:32:30 +08:00
k88936
d6c7a04a1c
同步Tripo3D的worker领取范围与长任务预算口径
...
- worker 领取清单补上 model3d_text_to_model 与 model3d_image_to_model
- 长任务预算说明补记两个 3D job kind 在单次 attempt 内轮询 provider 并占用并发位
- worker 化方案补记 Tripo provider 的四个环境变量、默认网关与缺密钥时的 503 口径
2026-09-21 15:31:04 +08:00
k88936
13dfe07f94
补记3D定价在模型定价体系中的例外口径
...
- 模型定价管理方案新增 model3d 段说明:形状、事实源仍为文件配置、后台改价不覆盖
- 说明段缺失即 fail closed,未确认前禁止写入猜测值或 provider credit 数字
- 记录后续把 3D 段迁入 SpacetimeDB 并接后台编辑的收敛路径
- 实施计划补记 spacetime schema guard 通过及其锚点
2026-09-21 15:26:31 +08:00
k88936
03d26d46af
修正provider文档里过期的下载包装类型名
...
- 文档写的 TripoDownloadedModel 已不存在,按当前代码改成 TripoDownloadedArtifact
- 上一条文档提交的说明里已提到这处改动,但当时补丁没落上,这次补实
2026-09-21 15:22:08 +08:00
k88936
c0fcb8553d
补Tripo worker纯逻辑定向用例
...
- checkpoint 只在 provider task id 非空且去空白后有效时才算存在,空白等同未提交
- 完成结果按端点严格区分,且序列化后不含 provider、taskId 与带签名的临时地址
- 预览图尺寸必须能真实解码,损坏字节直接失败而不是写占位宽高
- 预检用例去掉多余的通配导入,实施计划进展同步当前通过数
2026-09-21 15:22:01 +08:00
k88936
25ee11771c
同步Tripo provider文档与本次行为修正
...
- 脱敏输出保留原分隔符、带 userinfo 的地址解析即拒绝
- 图片与视图引用提交前 trim;校验原因分 Required / InvalidCombination / OutOfRange
- 下载前要求快照为完成态,filename 扩展名收紧为短 ASCII 字母数字
- 顺带把文档里的下载包装类型名改为当前的 TripoDownloadedArtifact
2026-09-21 15:21:12 +08:00
k88936
aebbd3bb99
多视图输入变体字段统一按camelCase序列化
...
- Model3dMultiviewInputs 的 serde 属性补 rename_all_fields = camelCase,结构体变体字段不再逐字段手工 rename
- TaskId 变体去掉冗余的 taskId 显式 rename,序列化结果与生成绑定均无变化
2026-09-21 15:20:36 +08:00
k88936
3e426a1006
容器首帧无尺寸时按真实比例重算取景
...
- 取景原先只在加载完成时按 measureViewport() 的宽高比算一次,隐藏面板里挂载时只能拿到方形兜底值
- 抽出 computeFraming(aspect),ResizeObserver 首次量到非零尺寸后按真实比例重算并复位一次,之后不再覆盖用户的缩放
2026-09-21 15:17:11 +08:00
k88936
f732555a44
为Tripo提交路由补应用级验收用例
...
- 走真实 build_router 断言两个端点未鉴权一律 401,路径写错或漏 merge 会退化成 404
- 断言缺 Idempotency-Key 在解析之后、组合校验与定价之前返回 400
- 断言贴图档位冲突与定价必填字段缺失都在定价与 provider 副作用之前返回 400 并定位字段
- 实施计划进展补记该组用例与当前全量测试通过数
2026-09-21 15:16:22 +08:00
k88936
d4af6802fb
补多视图请求契约的全字段往返用例
...
- 新增全字段往返:钉住 camelCase 字段名、各枚举线上取值与 Option 的可省略写法
- 新增显式 null 往返:确认可选字段回写时仍是 null 而不是整字段消失
- 补用例后字段改名或可空性漂移会被测试拦住,不再是只在 TS 绑定里可见
2026-09-21 15:16:06 +08:00
k88936
294b7461ff
去掉产物下载重试里的不可达panic分支
...
- download_artifact 原先用 for + last_error + expect 收尾,循环每轮都会 return,expect 实际不可达,却给库留下一条潜在 panic 路径
- 改为 loop 内递增 attempt,重试耗尽时直接返回最后一次错误,重试次数与退避行为不变
2026-09-21 15:15:07 +08:00
k88936
e9af6c0741
脱敏地址保留原始分隔符
...
- redacted 原先无条件用 ? 拼接脱敏标记,只有 fragment 的地址会被显示成带 query 的样子
- 改为按命中的分隔符原样拼接,日志里能区分 query 与 fragment
2026-09-21 15:14:51 +08:00
k88936
0f8ac57593
拒收带userinfo的产物地址
...
- TripoUrl::parse 原先只校验 scheme,带 user:password@ 的地址会被 Debug / redacted 原样打进日志
- 解析阶段直接拒绝 userinfo,产物地址不需要凭据
2026-09-21 15:14:07 +08:00
k88936
694a3c6f6c
产物下载前校验任务确实处于完成态
...
- download_model 与 download_rendered_image 原先只看 output 是否存在,快照字段全公开、status 与 output 可以被人为构造得不一致
- 两个入口统一走 completed_output:先校验 task_id,再要求 status=Completed 且有输出,否则按输出结构错误失败
2026-09-21 15:14:00 +08:00
k88936
6724f8b707
收紧产物文件名对远端扩展名的取值
...
- filename 直接取远端 URL 末段扩展名,path_segments 已百分号解码,%2F / %5C 会拼出跨目录路径
- 扩展名只接受长度不超过 10 的 ASCII 字母数字,其余一律退回 glb
2026-09-21 15:13:15 +08:00
k88936
03d5cde838
统一模型字节读取失败的报错口径
...
- response.arrayBuffer() 原先在 fetch 的 try/catch 之外,读到一半失败会直接抛出底层 DOMException
- 改为包一层并把失败归一成 Model3dViewerLoadError 的 load-failed,与其它加载失败路径一致
2026-09-21 15:11:30 +08:00
k88936
a87e19444b
修复模型查看器环境贴图失败时的显存泄漏
...
- RoomEnvironment 建好之后若 PMREM 生成失败,原先只把引用置空,它的几何与贴图不会释放
- 失败分支改为先释放已建出的 RoomEnvironment,再释放可能已建出的 PMREMGenerator
2026-09-21 15:11:25 +08:00
k88936
ae426df240
修复模型查看器自动旋转状态可能停在旧值
...
- 场景创建使用 effect 开始时的 autoRotateRef.current,加载期间 prop 变化时 setAutoRotate 的 effect 因 sceneRef 为空被丢弃
- 场景就绪后按最新的 autoRotateRef.current 重新同步一次,避免旋转状态与 prop 不一致
2026-09-21 15:11:20 +08:00
k88936
33cd943ff9
长度与范围越界改用独立校验原因
...
- TripoValidationReason 新增 OutOfRange,与「参数组合互斥」不再共用 InvalidCombination
- prompt 超 1024 字符、negative_prompt 超 255 字符改报 OutOfRange
- face_limit 越界属同一类范围错误,一并改报 OutOfRange,调用方可按原因分流
2026-09-21 15:11:12 +08:00
k88936
7193bd28c2
多视图可选视图去掉首尾空白再提交provider
...
- optional_view 先用 trim 判空、再把未 trim 的原串交给 FileInput,两侧口径不一致
- 改为提交前 trim,空白视图仍按未提供处理
2026-09-21 15:10:49 +08:00
k88936
e8467c2870
多视图前视图去掉首尾空白再提交provider
...
- front 只按 trim 后判空,但先前把未 trim 的原串交给 FileInput,带空白的取值会被原样发出
- 改为提交前 trim,与 image_to_model 的输入口径一致
2026-09-21 15:10:24 +08:00
k88936
0982b952cb
收敛Tripo三入口重复的extra字段构造
...
- 新增 common/extra.rs 统一构造 texture_version 与 delight 的 SDK extra 字段,键名只留一份
- text_to_model 与 image_to_model 删除各自的 extra_fields 副本,改调公共实现
- multiview_to_model 的内联 extra.insert 也改为复用同一构造
- 未提供的参数仍不写入 extra,请求体行为与原先一致
2026-09-21 15:08:50 +08:00
k88936
eb4256f883
图生3D图片引用改为提交时定点预检
...
- image_source 拆成预检与执行两条路径,预检只做归属、记录类型与对象键校验,不读正文也不调用 provider
- 定点解析改用既有 resolve_editor_reference_record_by_id_for_owner,取代列工程与读素材库的宽查询
- image-to-model 路由在扣费与入队前调用预检,跨 owner、未登记、已删除与 kind 不符统一返回 400
- editor_project 把定点引用查询暴露为 crate 内可见,供生成入口复用
- 新增源码钉住用例,防止预检退回宽查询或提前读图片正文
2026-09-21 15:08:46 +08:00
k88936
63c924dba0
补记Tripo图生3D图片引用提交预检口径
...
- 主规范明确图片引用解析分两步:提交时只做元数据预检,worker 执行时重新确认同一事实
- 主规范新增第 5 条验收标准,验收清单顺延至 12 条,里程碑同步引用范围
- 实施计划把图片输入预检写进固定执行顺序,并记录已改用定点引用查询取代宽查询
- 决策记录新增条目:站内引用禁止在提交路径读正文、调 provider 或列全量工程与素材库
2026-09-21 15:08:01 +08:00
k88936
02ef84d9b6
清理Tripo3D新代码的死代码与无意义断言
...
- 删除 job.rs 中无调用的 is_model3d_job_kind、source_entity_id 与本地 target_source_entity_id
- 删除 artifacts.rs 中未被引用的 map_artifact_error 及其 TripoError 导入
- 删除未被引用的 MODEL3D_JOB_MAX_ATTEMPTS 与只被同文件测试断言的 queue source module 常量
- 删除对常量自身取值的恒真断言测试
2026-09-21 14:45:04 +08:00
k88936
8a828a43ba
同步Tripo 3D生成的图片输入与完成结果口径
...
- 主规范明确图片输入先读字节再上传换 file_token,不把带签名的临时地址交给第三方
- 主规范补完成结果读取口径:由既有任务查询的 result 字段返回,标准消费者仅透传调用方显式给出的 result
- 实施计划把图片输入步骤改写为 file_token 口径,文件表补 storage.rs
- 实施计划新增进展一节,写清已落地步骤、未确认的定价数值与尚未跑通的真实端到端
- 风险一节补 worker 并发位与长任务超时的运维前提
2026-09-21 14:38:20 +08:00
k88936
29e554a30c
新增api-server Tripo3D worker执行链路与结果落库
...
- 新增 artifacts/result/worker 三个文件:产物读取、严格结果构造与 at-most-once submit 执行链路
- 没有 checkpoint 才 submit;submit 成功后先落 checkpoint 再轮询,checkpoint 写入失败按终态失败,不退回可重试队列
- 模型与预览图分别写入 OSS 并按 operation 稳定 ID 登记 asset_object,预览对象单独登记以便按对象键解析归属
- 落点按 target 分支写入项目资源或账号素材,imageSrc 与 thumbnailSrc 指向预览图,模型本体留在 objectKey
- 画布回填只走 placement-only;新增只依赖资源身份与尺寸的占位条目构造函数供 3D 复用
- 标准消费者的队列结果透传调用方显式给出的 result,使 3D 完成结果可从既有任务查询返回
- external_generation_worker 增加两个 job kind 分支并纳入长任务超时,用户可见失败文案收敛为稳定文本
2026-09-21 14:36:59 +08:00
k88936
ac08ccbe39
修正spacetime-client checkpoint facade的落点
...
- facade 方法补进真正参与编译的 active/external_generation.rs,此前误写在未被编译的重复文件里
- mapper 重新导出 ExternalGenerationJobProviderCheckpointRecordInput,调用方无需从子模块路径引用
- 删除未被编译的 src/external_generation.rs 重复副本,避免再次改到死文件
2026-09-21 14:33:51 +08:00
k88936
e809cdd850
新增api-server Tripo3D图片输入解析与产物对象写入
...
- editor_project 暴露按注册 ID 定点解析资源与素材对象键的入口,只认本账号已登记记录
- image_source 把站内引用解析成对象键后读字节并上传 provider 换 file_token,不把签名地址交给第三方
- storage 负责产物 PUT、HEAD 复核与 asset_object 登记,模型与预览图共用同一条链路
- asset_object ID 使用 operation 稳定派生值,避免被生成结果事务的白名单校验拒绝
- 完整字节写入路径留 TODO,等待 platform-oss 提供流式上传
2026-09-21 14:24:41 +08:00
k88936
a8799adf5d
platform-tripo支持图片上传与预览图下载
...
- 产物下载类型改名为 TripoDownloadedArtifact,模型与预览图共用同一条流式读取路径
- 新增 download_rendered_image,读取 task 结果里的预览图地址
- 新增 upload_image,把图片字节上传 provider 换 file_token
- 图片输入收敛为 TripoImageInput 枚举,只有 file_token 与公网地址两种形态,不再接受裸字符串
- smoke 示例跟随新的图片输入类型
2026-09-21 14:06:47 +08:00
k88936
4edeadae7d
登记Tripo 3D的生成结果operation_kind白名单
...
- SpacetimeDB storage 的编辑器生成白名单加入 model3d_text_to_model 与 model3d_image_to_model
- 白名单是原子落库的 operation_kind 门禁,未登记会让整笔结果事务被拒
- api-server 侧按源码钉住两个 job kind 已在白名单内,避免只在运行期才发现
2026-09-21 14:02:58 +08:00
k88936
931be509f1
补记Tripo model3d的assetKind接入清单对照
...
- 主规范新增 assetKind 接入清单对照表,逐行登记后端-only 类别的触碰点口径
- 主规范明确原子落库 operation_kind 白名单必须新增两个 Tripo job kind,画布回填只走 placement-only
- 主规范登记用户标签覆盖、快速编辑与改造 capability 三项结论均为不进入,并写明后续接前端需重评
- 实施计划把 provider 配置文件行更正为 provider.rs,并在产物落库步骤补白名单与 placement 口径验收
- 后端架构文档补充说明:不走编辑器前端的生成类别同样适用清单,不能靠无前端入口跳过
2026-09-21 13:59:53 +08:00
k88936
dd8f48bad9
新增api-server Tripo3D提交路由与入队
...
- tripo3d 目录按 job 身份、provider 配置、错误映射、入队与路由拆分小文件
- 两个内部路由要求 Bearer 与 Idempotency-Key,顺序固定为解析、组合校验、查价、入队
- 入队复用编辑器生成队列的幂等 dedupe key,同键同请求返回原 operation,同键不同请求 409
- Tripo job 走既有 editor-canvas 来源与单次尝试口径,不新建队列、不新增状态
- 提交响应返回 operation、job kind 与既有任务查询状态地址,不暴露 provider 信息
- 补齐 ExternalGenerationJobRecord 测试夹具新增的 checkpoint 字段
2026-09-21 13:46:41 +08:00
k88936
d012392779
api-server 增加 Tripo 生成的环境配置
...
- AppConfig 新增 tripo_base_url / tripo_api_key / 请求超时 / 重试四个字段
- 默认网关指向 Tripo 官方 v3 地址,可由 TRIPO_BASE_URL 覆盖
- 环境变量沿用 provider 示例的 TRIPO_* 口径,API Key 缺省为空
- 默认值断言补进配置测试
2026-09-21 13:23:18 +08:00
k88936
2182b075b8
新增Tripo生成Worker执行链路实施计划
...
- 固定 api-server 侧 tripo3d 目录的文件切分与各文件职责
- 明确提交路由执行顺序、幂等口径与图片输入解析边界
- 记录 Tripo job 固定 max_attempts=1 与 checkpoint 收口语义
- 里程碑二转 active 并回链实施计划,里程碑一补实施计划入口
2026-09-21 13:17:24 +08:00
k88936
a11fd709fa
同步external_generation_job表目录的provider checkpoint口径
...
- 补记 provider_kind 与 provider_task_id 的追加字段、租约栅栏与禁止覆盖语义
- 说明 checkpoint 不进 payload、read model、BFF 响应与公开契约
- 事件表目录补充 provider_checkpoint 事件
2026-09-21 13:11:06 +08:00
k88936
aa1a1a63ed
spacetime-client 暴露 provider checkpoint 写入入口
...
- 重新生成 module bindings,新增 checkpoint procedure 与输入类型、表行与快照投影
- mapper 增加 checkpoint 记录输入与到绑定输入的转换,快照映射补两个新字段
- facade 新增 set_external_generation_job_provider_checkpoint,复用 procedure 结果映射
- facade 注释说明已有 checkpoint 被拒是 at-most-once submit 保证,写入失败按失败处理
2026-09-21 13:10:11 +08:00
k88936
09ea0a5e76
新增external_generation_job的provider任务checkpoint
...
- provider_kind 与 provider_task_id 追加在表末尾,带显式默认值,旧行迁移时补 NULL
- 新增 set_external_generation_job_provider_checkpoint_and_return procedure,复用 running 租约栅栏
- 已有 checkpoint 时禁止覆盖并留下 provider_checkpoint 事件,作为 at-most-once submit 的数据层保证
- 快照与兼容快照同步投影两个新字段,轻量摘要按无 checkpoint 返回
- 增加 checkpoint 不可覆盖的不变量单测
2026-09-21 13:02:52 +08:00
k88936
36036eed7b
修正Tripo定价文档口径为 fail-closed 与无单位
...
- 主规范去掉 model3d 段的 unit 字段,3D 恒为按次计价
- 主规范把加载即校验改为段存在时必须全键,并补充段缺失即拒绝提交
- 契约里程碑验收第 6 条同步为段缺失 fail-closed
- 实施计划把定价步骤指向 api-server/src/tripo3d/pricing.rs
2026-09-21 13:00:45 +08:00
k88936
e105e34f83
新增Tripo生成请求的平台组合校验
...
- 价格相关参数必须显式给出,texture 与 textureQuality、pbr 不能互相矛盾
- 目标落点与图片引用的 ID 不能为空白
- provider 能力组合规则复用 platform-tripo 预检,不维护第二份
- 校验结果直接产出定价输入,路由在扣费与 provider 调用前执行
- api-server 依赖 platform-tripo
2026-09-21 12:53:22 +08:00
k88936
8f6458ffe2
新增api-server Tripo3D模块与泥点定价结构
...
- 新增 tripo3d/pricing.rs,底价按 endpoint × 模型版本 × 是否有贴图,add-on 按固定键表叠加
- 定价段加载即校验全部底价与 add-on 键,缺键即配置非法;缺段代表未配置,查价直接拒绝
- editor_generation_config 挂载可选 model3d 段并提供 fail-closed 查价入口
- 后台记录形状尚不支持 3D 段,暂由文件配置提供并留下同步待办
- model_version 增加 ALL 与排序,供定价表枚举校验
2026-09-21 12:53:02 +08:00
k88936
f90e114bcb
生成目录化的Tripo API与画布TS绑定
...
- 生成模型输入、结果落点、产物元数据与按端点的结果类型到 packages/shared/src/contracts/model3d 子目录
- 新增 editor-canvas 生成目录,画布占位载荷不再依赖手写 TS
- 更新 model3d 导出索引,移除已删除的占位作业类型
- contracts:model3d:generate 生成后自动跑 prettier
2026-09-21 12:39:33 +08:00
k88936
7790a181c4
provider按参数分层并公开组合校验入口
...
- submit 改为接收生成参数,图片输入由调用方解析后单独传入
- 公开 validate_text_to_model_params / validate_image_to_model_params 供平台层在副作用前预检
- 参数到 provider 校验选项的映射收敛为 From 实现,去掉重复拼装
- smoke 示例跟随新签名
2026-09-21 12:39:20 +08:00
k88936
e0108f7d57
分层Tripo生成的provider参数与平台API请求契约
...
- common 新增 Model3dGenerationSource、Model3dGenerationTarget、Model3dGenerationTargetRef 与产物元数据
- text/image 各自的参数类型独立成 params,API 请求为 generation + 平台字段 + target
- 图片输入只接受站内引用,input 由服务端解析后注入 provider
- 删除宽松的作业与结果占位 DTO,改为按端点的严格结果与端点 tagged enum
- 新增契约严格性测试,覆盖分支必填字段、图片输入歧义与顶层未知字段
2026-09-21 12:38:46 +08:00
k88936
93306952d9
把画布占位载荷移出受feature门控的assets模块
...
- 新增 shared-contracts::editor_canvas,承载画布占位与回填载荷并接入 ts-rs 生成
- assets 模块改为内部引用该类型,不再自带定义
- api-server 七处引用改到新模块路径
2026-09-21 12:38:28 +08:00
k88936
ddf8e2c213
同步Tripo生成API的文档索引与领域术语
...
- docs/README 增加主规范与 ADR 入口
- CONTEXT.md 补充 3D 模型生成操作、provider task、Tripo API facade 等术语
- provider 专题把应用层接入指向新主规范
- 文档生命周期索引改为指向活动计划目录
2026-09-21 12:29:40 +08:00
k88936
6db1079610
新增Tripo生成API的里程碑规范与实施计划
...
- 新增契约与数据模型里程碑,锁定范围、不做项与验收标准
- 新增 Worker 执行链路与 API 路由里程碑,标注 pending 与定价前置依赖
- 新增契约里程碑实施计划,固定步骤顺序、验证命令与回退范围
2026-09-21 12:29:29 +08:00
k88936
699f321651
新增Tripo生成API集成主规范与决策记录
...
- 新增主规范,固定两个端点的请求、异步执行、结果持久化与泥点扣费合同
- 新增 ADR 0002,记录不复用 Hyper3D、at-most-once submit、提交时定价与落库失败退款
2026-09-21 12:29:08 +08:00
k88936
49b6451548
补充Tripo下载器迁移待办
...
记录Provider侧流式下载与第三方SDK保持原样的边界
增加等待上游SDK原生stream能力后的替换TODO
2026-09-19 23:16:02 +08:00
k88936
188614d5d2
改用Provider流式下载Tripo产物
...
保持第三方SDK不变并在Provider侧读取签名模型URL
逐块暴露模型响应并校验Content-Length,smoke示例改为异步落盘
为未来SDK原生stream能力保留迁移TODO
2026-09-19 23:14:00 +08:00
k88936
4c7fd968dd
明确Tripo模型流式下载边界
...
记录SDK与Provider只提供分块模型下载流
约定未来OSS上传直接消费数据流而不缓存完整模型
2026-09-19 22:20:23 +08:00
k88936
c48f0627cf
修复 ts-rs 对 enum 级 deny_unknown_fields 的解析告警并保留契约严格性
...
- 把 server-rs 与 apps/ai-game-creator-shell/src-tauri 两个 workspace 的 ts-rs 从 registry 固定到上游修复 commit fd8679ef20f866f747c046b30bd29c15e3d7a003(PR #491:已发布版 12.0.1 的 EnumAttr 不识别 deny_unknown_fields,只有 StructAttr 会静默忽略它),两个 Cargo.lock 同步改成 git 源
- 说明固定原因与退出条件:crates.io 最新仍是 12.0.1、GitHub 最新 tag 仍是 v12.0.0,等发布 > 12.0.1 后改回 registry 版本并删除 commit 固定
- 明确不使用 ts-rs 的 no-serde-warnings feature 消警:它会连同 deserialize_with 这类真实未支持的 serde 属性一起静默,掩盖 Rust 与 TS 绑定的漂移
- 保留 shared-contracts 的 Model3dMultiviewInputs enum 级 deny_unknown_fields(该属性一直由 serde 生效,告警只来自 ts-rs 的属性解析),注释改为写明不要为消警删属性、也不要改用 no-serde-warnings
- 新增契约测试 tests/model3d_multiview_request_contract.rs:钉住 views/taskId 变体内部与请求体顶层拒绝未知字段,并覆盖 kind 与 camelCase 字段名解析
- 记录排障经验与决策:pitfalls.md 说明无 span 的告警不代表属性失效,decision-log.md 记录固定 commit、影响面与回退条件
- 验证:cargo check -p shared-contracts 与该 crate 的 cargo test 不再出现 deny_unknown_fields 告警且全绿;cargo test --locked -p shared-contracts model3d 加 prettier 后 packages/shared 的 model3d 绑定零 diff;AGC 的 cargo check --locked --bin genarrative-ai-game-creator-shell 不再出现该告警(AGC 侧仍保留 1 条既有的 deserialize_with 告警,与本改动无关);npm run check:encoding、npm run check:doc-index、git diff --check、cargo fmt --all --check 通过
2026-09-19 16:56:24 +08:00
k88936
092bca7444
更新Tripo 3D模型Provider集成文档覆盖三个生成入口
...
文档改名为「Tripo 3D模型Provider集成」,H1 同步去掉“文本到”前缀,并更新 docs/README.md 链接
目标段改为三个入口共用 TripoProviderClient,列明 submit / submit_image_to_model / submit_multiview_to_model
新增「三个入口的输入」小节,记录 prompt 长度上限、image input 裸字符串引用、multiview views 与 taskId 二选一及视图数量要求
新增「任务查询与下载」小节,记录 TripoTaskSnapshot、TripoDownloadedModel 与必须重复取 task 的原因
补充契约分层说明:产品级结果契约目前只服务 text-to-model,image 与 multiview 结果仍在 provider 层
非目标标注前端查看器由 packages/model3d-viewer 独立实现、本阶段不接 UI 链路,验收补上输入校验与 smoke 行为
2026-09-19 16:19:05 +08:00
k88936
b0054fd51c
新增 3D 模型查看器独立包
...
- 新增 packages/model3d-viewer(@genarrative/model3d-viewer),含 Model3DViewer、scene、loader、framing、status 与 index
- 组件只走 WebGL2 单一路径渲染 glb、单文件 gltf 与 fbx,未承诺格式或超过 32 MiB 时只渲染一行状态文案
- 取景按真实顶点做投影拟合,与模型尺度无关,复位回到打开时的取景
- 新增 framing 与 loader 的纯函数单测
- 根 package.json 的 workspaces 增加 packages/model3d-viewer
- scripts/check-npm-workspaces.mjs 与 scripts/check-npm-workspaces.test.mjs 同步工作区清单
- vitest.config.ts 增加新包测试匹配
- 同步 package-lock.json 的工作区链接
2026-09-19 16:13:55 +08:00
k88936
0c4b1c34d9
标注模型下载的重复 task 查询
...
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Successful in 7m17s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Successful in 7m19s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Successful in 7m31s
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 7m39s
Project CI / Backend tests (pull_request) Failing after 10s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 2m3s
Project CI / Repository checks (pull_request) Failing after 10s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m36s
Project CI / Native shell tests (pull_request) Failing after 11m43s
Project CI / AI game creator shell web tests (pull_request) Failing after 10m21s
Project CI / Frontend tests (pull_request) Successful in 12m23s
在 download_model 增加 TODO,说明 SDK 只提供 download_model(&Task) 因而必须再取一次 task
若将来 SDK 支持按 URL 下载,可直接使用 snapshot 中的模型 URL 省掉这次请求
2026-09-19 14:17:31 +08:00
k88936
3c1059aa39
移除 TripoUrl 的 Display 实现
...
删除 TripoUrl 的 Display,避免 `{}` 这类通用格式化输出带签名的完整 URL
完整 URL 仍可通过 as_str() 显式读取,日志与调试统一走 redacted() 或脱敏后的 Debug
技术方案文档补充该收敛说明
2026-09-19 14:17:00 +08:00
k88936
1392303f1c
请求契约把 model 改为必填字段
...
三个生成请求的 model 由 Option<Model3dModelVersion> 改为必填 Model3dModelVersion,并同步重新生成 TypeScript 绑定
validate_generation_options 不再重复校验 model 缺失,直接由必填的 model 推导 family
三个 client 的 to_sdk_params 改为直接提交模型版本字符串
冒烟示例与技术方案文档同步为必填写法
2026-09-19 14:16:39 +08:00
k88936
12512f26b2
multiview 输入拒绝未知字段
...
Model3dMultiviewInputs 增加 deny_unknown_fields,与 Model3dMultiviewToModelRequest 的严格反序列化保持一致
未知视图键(例如拼写错误的 righ)不再被静默丢弃,避免用少于调用方预期的视图提交任务
ts-rs 12 不支持 enum 级该属性,构建时会打印一条可忽略的告警,已在代码注释说明
2026-09-19 14:14:55 +08:00
k88936
800da43a8d
说明生成结果 DTO 的 number 精度边界
...
为 poll_after_ms、updated_at_micros、size_bytes 补充注释,说明其量级远低于 2^53,按 TS number 导出即可精确表示
重新生成 TypeScript 绑定,把上述说明同步为 JSDoc
技术方案补充同一说明,明确不做 bigint/string 特殊处理
2026-09-19 14:14:14 +08:00
k88936
b703f0c374
同步Tripo集成文档的契约导出与脱敏说明
...
补充 TripoUrl 脱敏输出与 as_str 读取完整 URL 的说明
补充请求可选字段在 TypeScript 绑定中为 field?: T | null 及 model3d barrel 导出入口
补充 ts-rs 生成后需 prettier 格式化再提交的流程说明
2026-09-19 13:17:58 +08:00
k88936
b87d9358e5
对齐 Api 与 Request 的可重试状态码
...
TripoError::is_retryable 的 Api 分支补充 408 与 425,与 Request 分支的可重试集合保持一致
2026-09-19 13:15:31 +08:00
k88936
f4996d7ac2
auto_size 仅在显式开启时按模型能力拦截
...
validate_generation_options 中 auto_size 的 H25 校验由 is_some() 改为 == Some(true)
auto_size: false 不再被当作启用,与 quad、smart_low_poly、generate_parts 的取值语义保持一致
2026-09-19 13:15:00 +08:00
k88936
09ef92420f
multiview 复用统一的 task_id 校验
...
删除 submit_multiview_to_model 中重复的空白判断,改为调用 common::validate_task_id
task_id 非法时的错误字段由 Inputs 改为更精确的 TaskId,与 get_task、download_model 保持一致
2026-09-19 13:14:32 +08:00
k88936
091938ed59
multiview 提交前裁剪 task_id
...
to_sdk_params 改为提交 task_id.trim(),与 task_id.trim().is_empty() 的校验使用同一份标准化输入
带前后空白的 task_id 不再原样转发给 Provider
2026-09-19 13:13:54 +08:00
k88936
ddb8b9e8ba
multiview 空白视图按未提供处理
...
to_sdk_params 新增 optional_view,将仅含空白的 left、back、right 归一化为未提供
空白视图不再以 Some(FileInput) 形式提交,与提交前“至少两个视图”的校验保持一致
2026-09-19 13:13:35 +08:00
k88936
230e4d49f2
image_to_model 提交前统一使用裁剪后的输入
...
to_sdk_params 改为传入 request.input.trim(),与提交前的空值校验使用同一份标准化输入
带前后空白的输入不再原样转发给 Provider
2026-09-19 13:12:50 +08:00
k88936
6c209b115a
冒烟示例在任务未完成时跳过下载并继续后续入口
...
轮询改用 throw_on_failure=false,失败终态交回示例按 status 判定而不是直接返回错误
非 Completed 的任务打印 status 与 failure 后 continue,避免一个入口失败中断其余入口的冒烟
2026-09-19 13:12:23 +08:00
k88936
b631125a16
冒烟示例不再输出完整下载地址
...
产物行改用 TripoUrl::redacted(),避免把带签名的下载 URL 写入标准输出
2026-09-19 13:07:41 +08:00
k88936
771ff88440
脱敏 TripoUrl 的 Debug 输出
...
为 TripoUrl 手写 Debug 实现,改用隐藏 query 与 fragment 的脱敏形式
新增 TripoUrl::redacted 提供日志用脱敏 URL,完整 URL 仍由 as_str 显式读取
TripoTaskSnapshot、TripoTaskOutput、TripoDownloadedModel 的调试输出随之不再暴露带签名的下载地址
2026-09-19 13:07:41 +08:00
k88936
950209f038
为 model3d 请求契约的可选字段补充 ts(optional)
...
为 image_to_model、multiview_to_model、text_to_model 三个请求的可选字段添加 ts(optional = nullable)
multiview 视图分支的 left、back、right 同步标记为可选
重新生成 packages/shared/src/contracts/model3d 下的 TypeScript 绑定,使 TS 侧可按 serde 语义省略字段
2026-09-19 13:07:41 +08:00
k88936
42a5929a73
清理 model3d 请求契约中冗余的 serde(default)
...
移除 image_to_model、multiview_to_model、text_to_model 三个请求结构体 Option 字段上的 serde(default)
同步移除 multiview 视图分支中三个可选视图的 serde(default)
serde 对 Option 字段本身即按 None 处理缺失字段,生成的 TypeScript 绑定保持不变
2026-09-19 13:07:41 +08:00
k88936
eda9da4d8d
单点维护 model3d 的 ts-rs 导出根目录
...
在 model3d/mod.rs 新增 model3d_ts_export_dir 宏,集中定义仓库相对导出根路径
common、image_to_model、multiview_to_model、text_to_model 改为调用宏并只声明各自子目录名
2026-09-19 13:07:41 +08:00
k88936
35be25dbd6
补齐 model3d 契约在 packages/shared 的导出入口
...
新增 packages/shared/src/contracts/model3d/index.ts 聚合 ts-rs 生成的 3D 生成契约类型
contracts/index.ts 增加 export type * from './model3d'
src/index.ts 增加 export type * from './contracts/model3d'
2026-09-19 13:02:01 +08:00
k88936
da9ee65119
记录Tripo真实冒烟结果结构
...
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Successful in 7m41s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Successful in 7m48s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Successful in 7m50s
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 8m0s
Project CI / Backend tests (pull_request) Failing after 11s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 2m17s
Project CI / Repository checks (pull_request) Failing after 10s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m29s
Project CI / Frontend tests (pull_request) Successful in 14m49s
Project CI / AI game creator shell web tests (pull_request) Failing after 18m48s
Project CI / Native shell tests (pull_request) Failing after 27m31s
保留三个生成入口的脱敏真实结果形状与下载产物信息
使用实际可访问的 Rustacean 图片完成 image 与 multiview 示例
同步严格 endpoint 结果契约和真实 Provider 验收文档
2026-09-18 21:42:17 +08:00
k88936
527706b84e
按接口收紧Tripo任务结果类型
...
为 text、image、multiview 三类生成定义独立必填结果结构
以枚举关联任务类型与具体结果并对缺失字段失败关闭
将通用 URL 类型由 TripoModelUrl 更名为 TripoUrl
2026-09-18 21:37:38 +08:00
k88936
a4beb53dc6
完善Tripo冒烟CLI产物流程
...
等待三类生成任务完成并打印映射后的输出
完成后下载模型产物到当前目录并输出文件信息
仅在示例内部使用SDK轮询器,不扩展平台公共接口
2026-09-18 18:51:49 +08:00
k88936
25314d9a4a
新增Tripo三类生成冒烟CLI
...
增加仅通过环境变量配置的 Tripo generation example
顺序提交 text、image、multiview 三类任务并执行单次状态查询
保持无命令行参数且不调用 SDK 轮询接口
2026-09-18 18:42:58 +08:00
k88936
5be4a51ac1
完善Tripo枚举与参数组合校验
...
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Successful in 7m19s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Successful in 7m22s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Successful in 7m26s
Project CI / Backend tests (pull_request) Failing after 11s
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 7m38s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 2m1s
Project CI / Repository checks (pull_request) Failing after 15s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m54s
Project CI / Native shell tests (pull_request) Failing after 3m5s
Project CI / AI game creator shell web tests (pull_request) Failing after 2m13s
Project CI / Frontend tests (pull_request) Successful in 5m44s
按提供的 Tripo 文档补齐 compression、texture quality 与 texture version 枚举
移除未在三个生成接口出现的 style 占位字段并同步 Rust/TypeScript contracts
增加模型版本、纹理版本、生成部件、quad、smart-low-poly 与 face limit 的副作用前校验
同步 Provider 技术方案和 ADR
2026-09-18 17:23:55 +08:00
k88936
37b355a814
接入Tripo三类3D生成Provider
...
加入固定 revision 的 tripo-rust-sdk 与 platform-tripo workspace crate
实现 text-to-model、image-to-model、multiview-to-model 提交、通用任务查询和显式模型下载
抽取通用任务类型、状态映射、输出 URL 校验与 SDK 错误归一,保持 wait_for_task 不对外暴露
同步 Provider 边界文档并暂不接入 api-server
2026-09-18 16:02:13 +08:00
k88936
1c4009ea3b
建立3D生成目录化契约
...
新增 model3d common、text-to-model、image-to-model、multiview-to-model Rust contracts
通过 ts-rs 按目录生成 TypeScript bindings,移除依赖 barrel 的组织方式
增加 model3d contracts 定向生成脚本
2026-09-18 15:59:19 +08:00