k88936
|
2fa7923362
|
合并 origin/master 到 feat/adapt-taonier-skill:保留陶泥儿退役链路并吸收 master 错误详情改动
Project CI / Backend tests (pull_request) Failing after 1m12s
Project CI / Native shell tests (pull_request) Failing after 3m48s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 5m43s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Failing after 6m39s
Project CI / Repository checks (pull_request) Failing after 1m0s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Failing after 6m51s
Project CI / Frontend tests (pull_request) Successful in 1m58s
Project CI / AI game creator shell web tests (pull_request) Failing after 54s
- commands/desktop.rs:按本分支「exports 全退役」保留删除,不回填 master 改动的 playtest 打包/读取/列举命令
- project/export.rs:保留本分支删除,旧导出实现已由 export/draft 陶泥儿与小工具链路替换
- useGameDistributionPublishForm.ts:保留本分支删除,发布表单已由 export/state 与 tabs/taonier 面板替换
- game_distribution_publish.rs:保留本分支新增的 owner 媒体读路由与图片直传辅助函数,删除 master 改动的封面生成与 AI 资料建议退役代码
- game_distribution_publish.rs:吸收 master 的错误详情改动(parse_error_payload、response_data、map_http_error、request_json、request_json_for_read、describe_distribution_request_failure、emit_publish_progress 及对应测试)
- resolve_preview_url:合并为本分支 owner_media_read_url 加错误日志
|
2026-10-07 12:57:59 +08:00 |
|
k88936
|
08771d39e8
|
媒体公开读授权按 objectKey 反解 gameId 改 O(1) 查找
- 从 GAME_DISTRIBUTION_MEDIA_PREFIX 后的首段反解 game_id,按主键读那一行核对媒体归属
- 不再逐行扫描全部游戏及其 screenshots_json
- 补充 key 布局(非本前缀、缺 gameId、缺文件名、多级路径)的单测
|
2026-10-07 12:09:20 +08:00 |
|
k88936
|
7aeac536e0
|
游戏分发媒体读写加固为先校验后上传并清理孤儿对象
- 图片 part 改按文件头嗅探 PNG/JPEG/WebP/GIF/AVIF,声明 image/svg+xml 之类主动内容一律拒绝
- 同源字节中转新增内容策略:游戏媒体只放行栅格类型,其余降级为 attachment,并统一加 nosniff
- 同源字节中转复用进程级 OSS HTTP 客户端,不再每次 reqwest::Client::new(),连接复用与超时一并生效
- upload_media_image 取 UploadedImage 所有权,去掉最多 8 MiB 的整段克隆
- 更新资料先按刚读到的游戏行做 revision CAS,再决定是否写图;事务失败或幂等重放时补偿删除本次新传对象
- 媒体内部前缀抽到 shared-contracts,供写路径与只读授权端共用同一常量
|
2026-10-07 12:09:09 +08:00 |
|
k88936
|
680503d2a5
|
导出产物保存收敛成共享 exportArtifactDownload
- 新增 exportArtifactDownload.ts,承载保存对话框 + save_local_project_asset_file + 文件管理器定位
- 删掉逐字重复的 taonierDownload.ts 与 xhsMinitoolDownload.ts
- 两个 ArtifactsPane 改用通用的 saveExportArtifactToDisk / revealExportArtifactInManager
|
2026-10-07 11:53:18 +08:00 |
|
k88936
|
6f0ea03106
|
抽 buildGamePublishMediaSubmission,发布与编辑共用同一份媒体提交
- gamePublishAssets 新增媒体提交合成:槽位 objectKey 去空白、本地新图只进 parts
- GamePublishPage 的 metadata 槽位与 multipart part、GameWorkMetadataEditor 的 payload/media 都改用它
- 补槽位与 part 同源的单测
|
2026-10-07 11:49:59 +08:00 |
|
k88936
|
5ce5cb006a
|
发布/编辑媒体在覆盖与卸载时释放本地预览 blob URL
- applyVersionMediaDefaults 用线上默认值覆盖前先 revoke 被替换的本地预览
- GamePublishPage / GameWorkMetadataEditor 用 ref 跟踪最新图片,卸载时兜底 revoke
- 补「线上默认值覆盖本地选择」的 revoke 断言测试
|
2026-10-07 11:47:14 +08:00 |
|
k88936
|
009a772ebd
|
媒体验证 E2E 去掉对服务端存储前缀的硬编码断言
- 「公开投影只暴露服务端派生的媒体 objectKey」改为结构断言:非空去空白、含路径分隔符、不是客户端 part 文件名
- 不再断言 agc/project-snapshots/v1/game-distribution/media/ 这一内部布局常量
- 与服务端返回键的一致性仍由相邻的 owner/公开投影相等断言覆盖
|
2026-10-07 11:43:17 +08:00 |
|
k88936
|
1f239a96ce
|
游戏分发 E2E 抽出共享 multipart 发布 helper
- 新增 scripts/game-distribution-e2e-helpers.mjs:COVER_PNG、imagePart、coverImagePart、publishFormData、resolveApiRequest
- 11 个 E2E 脚本删除各自的重复实现,改为 import;api() 的 body 分支收敛到 resolveApiRequest
- 各脚本的封面文件名前缀、envelope 与鉴权头合并顺序、返回形状保持不变
|
2026-10-07 11:42:45 +08:00 |
|
k88936
|
ab2af60d30
|
发布用 packageAll 落定的权威表单合成 metadata
- useTaonierExport 维护 effectiveFormRef,refresh 采纳新表单与打包前 flush 成功时同步
- 暴露 getEffectiveForm;publishGame 在 await packageAll() 之后用它,避免旧快照与宿主读盘不一致
- 补两条单测:采纳新表单后权威表单更新、未保存输入先落盘再作为权威表单
|
2026-10-07 11:41:27 +08:00 |
|
k88936
|
800c456804
|
回读版本冻结资料时透传 objectKey 并接受字符串截图数组
- GameDistributionPublicationImageDraft 增加 objectKey,封面/截图回读时带上沿用键
- FrozenPublicationMetadata.screenshots 改按字符串数组解析,删除只认 {assetId,objectKey} 的旧结构
- 前端草稿类型补 objectKey;补字符串数组解析的 Rust 单测
|
2026-10-07 11:39:34 +08:00 |
|
k88936
|
aa946a9304
|
发布命令删掉已失效的 package_relative_path 形参
- Rust 命令与 stage_publish_package 去掉该形参,整包固定读 .export/taonier.zip
- 前端服务类型、invoke 载荷与 useTaonierTab 调用同步删除
- 更新单测与 live 测试,去掉对已忽略形参的断言
|
2026-10-07 11:34:54 +08:00 |
|
kdletters
|
8ceada8690
|
合并 codex/agc-error-convergence-20261004:交付核心以 master 新设计为准并保留分支错误明细
Project CI / AI game creator shell Rust lane 1/2 (push) Failing after 5m43s
Project CI / AI game creator shell Rust crates (push) Successful in 4m52s
Project CI / AI game creator shell Rust lane 2/2 (push) Successful in 5m40s
Project CI / Frontend tests (push) Successful in 2m48s
Project CI / Backend tests (push) Successful in 7m14s
Project CI / AI game creator shell web tests (push) Failing after 3m50s
Project CI / Native shell tests (push) Successful in 8m27s
Project CI / Repository checks (push) Successful in 7m9s
冲突处理:交付合同/租约相关现场取 master(#608 重构),分支侧错误明细在可安全保留处回补
编译修复:direct_tool_bridge 回执结算失败正文、direct_patch 指纹读取、direct_delivery 终态读取按 Result 形状对齐
前端修复:DirectProjectChatView 取 master,其余缺失的错误正文 import/参数回补
重新生成 AuthServiceUnavailable 绑定以匹配 Rust 声明
|
2026-10-07 11:33:18 +08:00 |
|
k88936
|
12d4e8477a
|
发布图片加稳定 id,截图列表不再按 name-index 做 key
- GamePublishImage 新增 id,本地新选图与线上沿用图各自铸一次
- 截图列表 key 改用 image.id,删除/重排时不再因 index 位移重建节点,同名文件也能区分
- 补同名本地图 id 互异的单测
|
2026-10-07 11:13:45 +08:00 |
|
k88936
|
9184e92774
|
运维回滚 E2E:封禁态建游请求去掉歧义的沿用封面键
- 带二进制 cover part 时把 metadata.coverObjectKey 显式置 null,与套件其余「新图」语义一致
- 避免同一请求同时携带 objectKey 与 cover 字节,在网关检查顺序变化时结论漂移
|
2026-10-07 11:12:20 +08:00 |
|
k88936
|
152cdc6177
|
可达性 E2E:创建游戏失败时先退出再解引用封面键
- 在 gameId 取值后补 if (!gameId) process.exit(1)
- 创建失败时 created.data 为空,提前取 coverObjectKey 会抛未捕获 TypeError 打崩脚本
|
2026-10-07 11:12:08 +08:00 |
|
k88936
|
9c822c098d
|
重启校验 E2E 续跑兼容旧 STATE_FILE 的 coverAssetId
- runResume 读封面键时回退 state.coverAssetId
- 旧版状态文件没有 coverObjectKey,直接读会得到 undefined 且被 JSON.stringify 丢掉,v3 会缺封面
|
2026-10-07 11:11:58 +08:00 |
|
k88936
|
8e59e11f0d
|
重启校验 E2E:创建游戏失败时先退出再解引用
- 在 check('创建游戏成功') 后补 if (!gameId) process.exit(1)
- check 只记失败不中断,created.data 为空时继续取 coverObjectKey 会抛未捕获 TypeError 打崩脚本
|
2026-10-07 11:11:41 +08:00 |
|
k88936
|
067f02c855
|
作者视角的游戏详情媒体换签走 owner 作用域
- GameDetailResolvedAsset 新增 gameId 入参,ownerView 时传 game.id
- 公开读只服务已发布 + active 作品,未公开/待审/驳回的作者预览此前只会静默回占位
- 测试替身记录换签选项,补作者视角带 gameId 的定向断言
|
2026-10-07 11:10:44 +08:00 |
|
k88936
|
42c742df5c
|
发布预检的标题/简介长度改按码点计数
- normalizeMetadata 用 Array.from(...).length,与面板校验及服务端 chars().count() 同口径
- 含 emoji 的压线标题/简介不再因 UTF-16 码元长度被发布预检误拒
- 补 40 个 emoji 标题 + 120 个 emoji 简介的定向测试
|
2026-10-07 11:09:08 +08:00 |
|
k88936
|
075078f358
|
保存遇宿主不可用保持 dirty,避免陈旧注册表覆盖未落盘输入
- 保存失败分流后不再无条件 setDirty(false):exportUnavailable 分支保留 dirty
- dirty 为真时 adoptable 保持 false,宿主恢复后的重读不会用旧注册表表单覆盖用户输入
- 冲突/未知失败仍归零 dirty,维持「同一份输入不反复打宿主」
|
2026-10-07 11:08:13 +08:00 |
|
k88936
|
00448e0b26
|
重读采纳新表单不再清掉构建失败现场
- 采纳路径去掉无条件 setFailure(null),只保留上方「读来源失败」的函数式清理
- 面板后台注册表被改写时,构建失败弹窗不再被下一次成功重读顺手抹掉
- 补「构建失败 + 重读采纳新表单」定向测试
|
2026-10-07 11:08:09 +08:00 |
|
k88936
|
fede8cc161
|
作品资料更新的幂等摘要纳入 game_id
- update_owner_game_metadata 的 request_digest 与 create_version 同口径,带上 game_id 作用域
- 幂等账本按 (owner, action, key) 归档不含 game_id,摘要不带作用域会把另一部作品的同资料更新当成重放
- 补跨作品摘要区分断言
|
2026-10-07 11:05:45 +08:00 |
|
k88936
|
d24a16ad02
|
发布资料 multipart 路由显式放行请求体上限
- create_game / create_version / update_owner_game_metadata 三条 multipart 路由补 DefaultBodyLimit
- 放行封面 + 最多 6 张截图 + metadata/boundary 余量,否则 Axum 默认 2 MiB 会在抽取前 413
- MAX_SINGLE_MEDIA_BYTES 提升为 pub(crate),补口径断言
|
2026-10-07 11:04:15 +08:00 |
|
k88936
|
057b56b24a
|
截图导入按剩余名额逐张写入,不再只取最后一张
- AssetImporter 是多选(上限 100),onImport 改为遍历 assets 按 6 张上限截断
- 一次选多张时不再静默丢弃除最后一张外的截图
- 补多选导入定向测试
|
2026-10-07 11:02:29 +08:00 |
|
k88936
|
bb7097ce5c
|
FormCard 截图数量文案摊平嵌套三元
- 本地张数 / 整组沿用线上 / 还没有截图三态先算成 screenshotSummary
- 行为不变,去掉嵌套三元
|
2026-10-07 11:01:04 +08:00 |
|
k88936
|
e4d46609cf
|
FormCard 字段控件摊平嵌套三元
- options/multiline/input 三态改为 if/else 生成 inputSlot
- 复用一个 fieldClassName,去掉三份重复的边框/错误态样式与嵌套三元
|
2026-10-07 11:00:34 +08:00 |
|
k88936
|
8d74fa9aba
|
发布打包 reject 时收尾进度,避免面板卡死
- packageAll 在宿主不可用/读失败时会直接抛,await 包一层 try/catch
- 失败时把进度置为 failed 并带上原因,不再停在 running(运行中对话框没有关闭入口)
|
2026-10-07 10:59:50 +08:00 |
|
k88936
|
7b521f6f29
|
useTaonierTab 发布版本号判空改用严格相等
- `online.nextVersionNumber == null` 改为 `=== null`,去掉宽松相等
- online 为空已由 `!online` 显式挡掉,语义不变
|
2026-10-07 10:59:14 +08:00 |
|
k88936
|
4acb0e7124
|
陶泥儿产物读取按已知体积预分配
- read_package_bytes 接收调用方已验证的 expected_bytes,用 Vec::with_capacity
- 接近 200 MiB 的包不再因反复扩容多复制约一倍数据
|
2026-10-07 10:58:46 +08:00 |
|
k88936
|
d3d7e5a8ca
|
陶泥儿构建收尾:体积超线不整包读入内存
- conclude 仅在 produced(普通文件、非链接、非空)时才读取产物
- 读取前先看 metadata.len(),超过 ARTIFACT_PACKAGE_READ_MAX_BYTES 直接判不合格
- 避免构建脚本写出超大 zip 时先把宿主内存读满,也堵住符号链接被整包读取
|
2026-10-07 10:57:00 +08:00 |
|
k88936
|
500c3fda6b
|
ConflictCard 按字段类型分开赋值,去掉 as never
- 截图字段走数组分支,文本字段走字符串分支,不再用 as never 关掉类型检查
- 表单将来加入非 string/string[] 字段时这里会当场编译失败
|
2026-10-07 10:55:25 +08:00 |
|
k88936
|
4d72a77aeb
|
OnlineValuesCard 线上状态文案摊平嵌套三元
- 模板字符串里的版本号后缀与已发布/未发布两态改为先算 onlineSummary 变量
- 行为不变,去掉嵌套三元
|
2026-10-07 10:54:32 +08:00 |
|
k88936
|
7db1fc4ff4
|
发布按钮禁用条件纳入 taonier.running
- 「打包并发布」与「打包」共用禁用判据,构建进行中不能再并发触发 packageAll
- 避免两次构建争抢同一个 .export/taonier.zip 并互相覆盖结果
|
2026-10-07 10:53:56 +08:00 |
|
k88936
|
229f0580fa
|
ArtifactsPane 发布禁用条件改用严格判空
- `online?.nextVersionNumber == null` 改为 `!online || online.nextVersionNumber === null`
- 去掉宽松相等,同时显式挡掉 online 为空的形态
|
2026-10-07 10:53:28 +08:00 |
|
k88936
|
30b129fcfe
|
ArtifactsPane 发布按钮文案摊平嵌套三元
- publishLabel 改为 if/else 三态赋值,去掉「正在发布/更新/首次发布」的嵌套三元
- 行为不变,仅满足项目禁止嵌套三元的约定
|
2026-10-07 10:53:18 +08:00 |
|
k88936
|
3d6795978c
|
multipart 图片文件名按真实内容类型给扩展名
- 新增 multipart_image_file_name,JPEG/WebP/GIF/AVIF 不再统一叫 .png
- 服务端仍按 MIME part 判定,文件名只作为未来消费者可依赖的事实保持一致
- 补扩展名映射单测
|
2026-10-07 10:52:58 +08:00 |
|
k88936
|
3ecd4efcbb
|
读取发布图片前先按体积上限失败关闭
- read_draft_image 先看 metadata.len(),超过 8MB(对齐服务端单图上限)直接返回错误
- 避免草稿指向超大本地文件时先把宿主内存读满,再由服务端事后拒绝
- 补稀疏大文件定向测试
|
2026-10-07 10:51:01 +08:00 |
|
k88936
|
3832ca4fab
|
发布资料摘要给图片字节加长度前缀
- metadata_digest 逐张先写 u64 长度再写字节,分片边界进入摘要
- 否则「封面 [1,2]+截图 [3]」与「封面 [1]+截图 [2,3]」摘要相同,本地幂等账本会误判重放
- 补分片不变性断言
|
2026-10-07 10:48:16 +08:00 |
|
k88936
|
ab9789d11a
|
截图槽位空串归一成 null 保留顺序
- normalizeMetadata 不再 filter 掉空串槽位,改为归一成 null(消费草稿本地图)
- 否则后续槽位整体前移,与 .export/taonier.json 的截图顺序错位
- 更新定向测试:空串槽位保留为 null
|
2026-10-07 10:47:10 +08:00 |
|
k88936
|
99d5fd1eaa
|
抽取 jsdom 用例共享的内存 Storage
- 新增 tests/memoryStorage.ts 导出 createMemoryStorage,统一 length/key 语义
- jsdomLocalStorageSetup 全局兜底、appSurface/harness、chatPromptPolish 改为导入同一实现
- chatPromptPolish 断言由 Map.size 改为 Storage.length,语义不变
|
2026-10-07 10:46:21 +08:00 |
|
k88936
|
3cd5928fc5
|
标注陶泥儿计划与里程碑文档为已实施并保留
- 两份文档 Status 由「待评审」改为「已实施(M1–M4 已落地)」
- 实施计划头部注明长期保留,原 §5.4「收尾删除计划文档」不再执行
|
2026-10-07 10:27:47 +08:00 |
|
k88936
|
5142c26011
|
文档同步游戏分发 owner 媒体读
- 后端契约/玩法链路/AGC 实施计划补 owner 作用域读路由与作者预览口径(软删仍 404)
- decision-log 2026-10-06 条目记录 owner 读决策,并改「临时计划已删除」为保留计划与里程碑文档
- pitfalls 新增作者预览必须走 owner 读、不能回退素材库 ACL 的排障口径
|
2026-10-07 10:27:19 +08:00 |
|
k88936
|
89567d94a9
|
平台 web 作者预览切到 owner 媒体读
- gameDistributionClient 新增 getOwnerGameDistributionMediaReadUrl,参数与换签解析与公开读共用
- useGameDistributionMediaReadUrl 支持 gameId;GameCover 增 owner 开关,MyGamesPage 封面走 owner
- resolveGamePublishImagePreview 接 gameId,发布/编辑回填未发布作品的封面与截图也能换签
- 补 client 路由/鉴权测试与 MyGamesPage owner 换签测试
|
2026-10-07 10:27:14 +08:00 |
|
k88936
|
4cd7843134
|
AGC 作者预览切到 owner 媒体读路由
- resolve_preview_url 改走 /api/game-distribution/my-games/{gameId}/media/read-url,不再走素材库 /api/assets/read-url
- 新增 owner_media_read_url,复用 endpoint 的路径段转义并编码 objectKey
- 新增路由与编码单测,钉住不再回退素材库 ACL
|
2026-10-07 10:27:03 +08:00 |
|
k88936
|
069df704fd
|
真实链路脚本补 owner 媒体读检查
- 待审期间断言作者本人可经 owner 路由预览自己的封面
- 断言匿名走 owner 路由被拒(401)、非本作品媒体的 objectKey 换不出来(404)
|
2026-10-07 10:26:50 +08:00 |
|
k88936
|
9cd6357946
|
游戏分发媒体读新增 owner 作用域路由
- 新增 GET /api/game-distribution/my-games/{gameId}/media/read-url 与 .../media/read-bytes,需 bearer
- 判定 = gameId 属于当前登录主体且 objectKey 命中该作品当前行 cover_object_key/screenshots_json
- 抽出 game_media_object_keys 与换签/字节中转共用函数,公开读判定与响应形状不变
- 新增媒体键提取单测与 owner 路由挂载/鉴权断言
|
2026-10-07 10:26:37 +08:00 |
|
k88936
|
bd4801ef80
|
恢复陶泥儿实施计划与里程碑文档
- 从 5e8ecaa35^ 取回被 M4 删除的【实施计划】与【里程碑】陶泥儿导出文件草稿化与发布媒体直传-2026-10-06.md
- 本次起不再按计划 §5.4 在收尾删除计划文档,保留理由记录在 decision-log
|
2026-10-07 10:26:29 +08:00 |
|
k88936
|
a8ae817205
|
Merge pull request 'Feat/适配小红书小工具导出' (#630) from feat/adapt-xhs-skill into master
Project CI / AI game creator shell Rust crates (push) Successful in 6m43s
Project CI / AI game creator shell Rust lane 2/2 (push) Successful in 7m59s
Project CI / AI game creator shell Rust lane 1/2 (push) Successful in 7m59s
Project CI / Backend tests (push) Successful in 10m21s
Project CI / Frontend tests (push) Successful in 3m32s
Project CI / AI game creator shell web tests (push) Successful in 3m15s
Project CI / Repository checks (push) Successful in 7m38s
Project CI / Native shell tests (push) Successful in 9m40s
Reviewed-on: #630
|
2026-10-07 10:09:37 +08:00 |
|
kdletters
|
fba012b42b
|
修复真实游戏链路里 CC 执行器的四处阻塞
过程条目 id 按内容块类型区分,同 id 不同内容时补唯一后缀,避免整轮被判过程历史保存失败
资产下载的 fake-IP 窄例外覆盖 RFC 5180 的 IPv6 段,修复双栈解析下平台图片被拒绝下载
给 CC 子进程下发 MCP_TOOL_TIMEOUT,避免分钟级付费生成被 60 秒默认超时取消
复用 Codex 的进程树归属与退出证明,让 CC 回合能写 executor_stopped 并完成交付封口
|
2026-10-07 08:17:34 +08:00 |
|
kdletters
|
594ac321bf
|
归一化 Claude Agent SDK 身份句,避免上游内容策略误拦
在 Anthropic Messages 代理转发前,把被上游内容策略误判的身份句替换为等价表述,其余字段原样透传
新增归一化单测:只改命中片段,保留 cache_control 等其它 system 形状
|
2026-10-07 08:17:23 +08:00 |
|