@forgeax-extension/character-3d 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/SOURCE_PROVENANCE.md +8 -0
  2. package/dist/assets/index-CIx3aXo1.js +4336 -0
  3. package/dist/assets/index-CIx3aXo1.js.map +1 -0
  4. package/dist/assets/index-CmhOHLEB.css +1 -0
  5. package/dist/hdr/README.md +28 -0
  6. package/dist/hdr/presets.json +8 -0
  7. package/dist/index.html +13 -0
  8. package/forgeax-extension.json +428 -0
  9. package/marketplace-card.json +56 -0
  10. package/package.json +59 -0
  11. package/packages/external-asset-meta/package.json +24 -0
  12. package/packages/external-asset-meta/src/cook.test.ts +211 -0
  13. package/packages/external-asset-meta/src/cook.ts +188 -0
  14. package/packages/external-asset-meta/src/draco3dgltf.d.ts +11 -0
  15. package/packages/external-asset-meta/src/index.ts +18 -0
  16. package/packages/external-asset-meta/src/normalize.test.ts +36 -0
  17. package/packages/external-asset-meta/src/normalize.ts +101 -0
  18. package/packages/external-asset-meta/src/types.ts +82 -0
  19. package/schemas/adopt-playable-character.args.json +26 -0
  20. package/schemas/adopt-playable-character.returns.json +31 -0
  21. package/schemas/apply-motion.args.json +47 -0
  22. package/schemas/apply-motion.returns.json +23 -0
  23. package/schemas/auto-rig.args.json +35 -0
  24. package/schemas/auto-rig.returns.json +23 -0
  25. package/schemas/delete-asset.args.json +18 -0
  26. package/schemas/delete-asset.returns.json +18 -0
  27. package/schemas/engine-import-status.args.json +18 -0
  28. package/schemas/engine-import-status.returns.json +50 -0
  29. package/schemas/export-playable-character.args.json +21 -0
  30. package/schemas/export-playable-character.returns.json +47 -0
  31. package/schemas/gen3d-asset-manifest.json +281 -0
  32. package/schemas/generate-meshy-text-mock.args.json +42 -0
  33. package/schemas/generate-meshy-text-mock.returns.json +301 -0
  34. package/schemas/get-credentials.args.json +7 -0
  35. package/schemas/get-credentials.returns.json +45 -0
  36. package/schemas/get-playable-profile.args.json +11 -0
  37. package/schemas/get-playable-profile.returns.json +188 -0
  38. package/schemas/image-to-3d.args.json +47 -0
  39. package/schemas/image-to-3d.returns.json +306 -0
  40. package/schemas/import-to-engine.args.json +18 -0
  41. package/schemas/import-to-engine.returns.json +35 -0
  42. package/schemas/list-assets.args.json +22 -0
  43. package/schemas/list-assets.returns.json +296 -0
  44. package/schemas/list-motions.args.json +29 -0
  45. package/schemas/list-motions.returns.json +41 -0
  46. package/schemas/pose-standardization.args.json +28 -0
  47. package/schemas/pose-standardization.returns.json +29 -0
  48. package/schemas/provider-status.args.json +7 -0
  49. package/schemas/provider-status.returns.json +70 -0
  50. package/schemas/refine-mesh.args.json +33 -0
  51. package/schemas/refine-mesh.returns.json +306 -0
  52. package/schemas/rename-asset.args.json +22 -0
  53. package/schemas/rename-asset.returns.json +14 -0
  54. package/schemas/retopo-lowpoly.args.json +34 -0
  55. package/schemas/retopo-lowpoly.returns.json +24 -0
  56. package/schemas/score-quality.args.json +36 -0
  57. package/schemas/score-quality.returns.json +12 -0
  58. package/schemas/set-credentials.args.json +32 -0
  59. package/schemas/set-credentials.returns.json +45 -0
  60. package/schemas/set-playable-motion-mapping.args.json +25 -0
  61. package/schemas/set-playable-motion-mapping.returns.json +33 -0
  62. package/schemas/set-playable-profile.args.json +32 -0
  63. package/schemas/set-playable-profile.returns.json +67 -0
  64. package/schemas/text-to-3d.args.json +51 -0
  65. package/schemas/text-to-3d.returns.json +306 -0
  66. package/schemas/upload-image.args.json +19 -0
  67. package/schemas/upload-image.returns.json +21 -0
  68. package/schemas/upload-video.args.json +14 -0
  69. package/schemas/upload-video.returns.json +14 -0
  70. package/schemas/views-to-3d.args.json +58 -0
  71. package/schemas/views-to-3d.returns.json +306 -0
  72. package/server/adopt-playable-character.ts +291 -0
  73. package/server/asset-storage.ts +136 -0
  74. package/server/asset-upload.ts +123 -0
  75. package/server/audit.ts +58 -0
  76. package/server/cache.ts +75 -0
  77. package/server/cos-uploader.ts +141 -0
  78. package/server/credentials-store.ts +186 -0
  79. package/server/engine-import.ts +238 -0
  80. package/server/env.ts +287 -0
  81. package/server/export-playable-character.ts +364 -0
  82. package/server/generate.ts +89 -0
  83. package/server/merge-playable-character.ts +259 -0
  84. package/server/motion-catalog.ts +137 -0
  85. package/server/per-game-store.ts +1016 -0
  86. package/server/providers/gateway-client.ts +171 -0
  87. package/server/providers/gateway-data.ts +182 -0
  88. package/server/providers/gateway-models.ts +49 -0
  89. package/server/providers/hunyuan-rest.ts +317 -0
  90. package/server/providers/hunyuan-workflow.ts +225 -0
  91. package/server/providers/meshy-direct-client.ts +223 -0
  92. package/server/providers/meshy.ts +548 -0
  93. package/server/providers/rodin-gateway.ts +193 -0
  94. package/server/providers/rodin.ts +253 -0
  95. package/server/providers/visvise.ts +329 -0
  96. package/server/rate-guard.ts +29 -0
  97. package/server/tool-handlers.ts +2193 -0
  98. package/shared/catalog.ts +307 -0
  99. package/shared/manifest.ts +378 -0
  100. package/shared/meshy-actions.ts +690 -0
  101. package/shared/playable-preview-url.test.ts +14 -0
  102. package/shared/playable-preview-url.ts +13 -0
  103. package/shared/playable-profile.test.ts +127 -0
  104. package/shared/playable-profile.ts +171 -0
  105. package/shared/provider-params.test.ts +172 -0
  106. package/shared/provider-params.ts +389 -0
  107. package/shared/quality/heuristics.test.ts +84 -0
  108. package/shared/quality/heuristics.ts +100 -0
  109. package/shared/rodin-image.test.ts +51 -0
  110. package/shared/rodin-image.ts +125 -0
@@ -0,0 +1,306 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:refine-mesh returns",
4
+ "type": "object",
5
+ "properties": {
6
+ "ok": {
7
+ "const": true
8
+ },
9
+ "cacheKey": {
10
+ "type": "string"
11
+ },
12
+ "cacheHit": {
13
+ "type": "boolean"
14
+ },
15
+ "usedMock": {
16
+ "type": "boolean",
17
+ "description": "True when Meshy was not configured and a deterministic mock was used (quota-safe fallback)."
18
+ },
19
+ "manifest": {
20
+ "type": "object",
21
+ "properties": {
22
+ "manifestVersion": {
23
+ "const": 1
24
+ },
25
+ "assetId": {
26
+ "type": "string"
27
+ },
28
+ "kind": {
29
+ "enum": [
30
+ "mesh",
31
+ "animation"
32
+ ]
33
+ },
34
+ "provider": {
35
+ "enum": [
36
+ "meshy",
37
+ "hunyuan_workflow",
38
+ "hunyuan_rest",
39
+ "rodin",
40
+ "visvise"
41
+ ]
42
+ },
43
+ "providerMode": {
44
+ "enum": [
45
+ "mock",
46
+ "real"
47
+ ]
48
+ },
49
+ "mode": {
50
+ "enum": [
51
+ "text",
52
+ "image",
53
+ "views",
54
+ "refine"
55
+ ]
56
+ },
57
+ "sourceJobId": {
58
+ "type": [
59
+ "string",
60
+ "null"
61
+ ]
62
+ },
63
+ "sourceInputAssetIds": {
64
+ "type": "array",
65
+ "items": {
66
+ "type": "string"
67
+ }
68
+ },
69
+ "prompt": {
70
+ "type": [
71
+ "string",
72
+ "null"
73
+ ]
74
+ },
75
+ "files": {
76
+ "type": "array",
77
+ "items": {
78
+ "type": "object",
79
+ "properties": {
80
+ "fileId": {
81
+ "type": "string"
82
+ },
83
+ "role": {
84
+ "enum": [
85
+ "source_mesh",
86
+ "rigged_model",
87
+ "preview_image",
88
+ "texture",
89
+ "animation_clip",
90
+ "animated_model"
91
+ ]
92
+ },
93
+ "format": {
94
+ "enum": [
95
+ "glb",
96
+ "fbx",
97
+ "obj",
98
+ "mtl",
99
+ "usdz",
100
+ "stl",
101
+ "png",
102
+ "jpg",
103
+ "mp4"
104
+ ]
105
+ },
106
+ "storageKey": {
107
+ "type": "string"
108
+ },
109
+ "bytes": {
110
+ "type": "integer",
111
+ "minimum": 0
112
+ },
113
+ "sha256": {
114
+ "type": "string"
115
+ },
116
+ "localUrl": {
117
+ "type": [
118
+ "string",
119
+ "null"
120
+ ]
121
+ },
122
+ "hasSkeleton": {
123
+ "type": "boolean"
124
+ },
125
+ "skeletonProfile": {
126
+ "enum": [
127
+ "humanoid",
128
+ "unknown"
129
+ ]
130
+ },
131
+ "animationInputReady": {
132
+ "type": "boolean"
133
+ },
134
+ "motionType": {
135
+ "type": "integer",
136
+ "minimum": 9,
137
+ "maximum": 16,
138
+ "description": "Present only on role=animated_model files: the motion_retarget v1 motion this clip is (9 跨步 / 10 摔倒 / 11 跳跃 / 12 踢腿 / 13 挥击 / 14 步行 / 15 跑步 / 16 跳舞). Structural so multiple motions coexist per asset. Absent for non-animated roles."
139
+ }
140
+ },
141
+ "required": [
142
+ "fileId",
143
+ "role",
144
+ "format",
145
+ "storageKey",
146
+ "bytes",
147
+ "sha256",
148
+ "localUrl",
149
+ "hasSkeleton",
150
+ "skeletonProfile",
151
+ "animationInputReady"
152
+ ],
153
+ "additionalProperties": false
154
+ }
155
+ },
156
+ "readiness": {
157
+ "type": "object",
158
+ "properties": {
159
+ "hasSourceMesh": {
160
+ "type": "boolean"
161
+ },
162
+ "rigged": {
163
+ "type": "boolean"
164
+ },
165
+ "animated": {
166
+ "type": "boolean"
167
+ }
168
+ },
169
+ "required": [
170
+ "hasSourceMesh",
171
+ "rigged",
172
+ "animated"
173
+ ],
174
+ "additionalProperties": false
175
+ },
176
+ "quality": {
177
+ "type": "object",
178
+ "properties": {
179
+ "geometry": {
180
+ "type": [
181
+ "number",
182
+ "null"
183
+ ]
184
+ },
185
+ "topology": {
186
+ "type": [
187
+ "number",
188
+ "null"
189
+ ]
190
+ },
191
+ "texture": {
192
+ "type": [
193
+ "number",
194
+ "null"
195
+ ]
196
+ },
197
+ "pbr": {
198
+ "type": [
199
+ "number",
200
+ "null"
201
+ ]
202
+ },
203
+ "prompt_fidelity": {
204
+ "type": [
205
+ "number",
206
+ "null"
207
+ ]
208
+ },
209
+ "total": {
210
+ "type": [
211
+ "number",
212
+ "null"
213
+ ]
214
+ }
215
+ },
216
+ "required": [
217
+ "geometry",
218
+ "topology",
219
+ "texture",
220
+ "pbr",
221
+ "prompt_fidelity",
222
+ "total"
223
+ ],
224
+ "additionalProperties": false
225
+ },
226
+ "createdAt": {
227
+ "type": "string"
228
+ },
229
+ "updatedAt": {
230
+ "type": "string"
231
+ },
232
+ "meshyTaskRefs": {
233
+ "type": "object",
234
+ "description": "Meshy preview vs result task ids. Manual refine uses previewTaskId; rig uses resultTaskId.",
235
+ "properties": {
236
+ "previewTaskId": {
237
+ "type": [
238
+ "string",
239
+ "null"
240
+ ]
241
+ },
242
+ "resultTaskId": {
243
+ "type": [
244
+ "string",
245
+ "null"
246
+ ]
247
+ }
248
+ },
249
+ "required": [
250
+ "previewTaskId",
251
+ "resultTaskId"
252
+ ],
253
+ "additionalProperties": false
254
+ },
255
+ "visviseRefs": {
256
+ "type": "object",
257
+ "description": "VISVISE COS URLs from generate/rig. Downstream rig/motion must reuse these; do not re-host on ForgeaX COS first.",
258
+ "properties": {
259
+ "meshUrl": {
260
+ "type": [
261
+ "string",
262
+ "null"
263
+ ]
264
+ },
265
+ "rigUrl": {
266
+ "type": [
267
+ "string",
268
+ "null"
269
+ ]
270
+ }
271
+ },
272
+ "required": [
273
+ "meshUrl",
274
+ "rigUrl"
275
+ ],
276
+ "additionalProperties": false
277
+ }
278
+ },
279
+ "required": [
280
+ "manifestVersion",
281
+ "assetId",
282
+ "kind",
283
+ "provider",
284
+ "providerMode",
285
+ "mode",
286
+ "sourceJobId",
287
+ "sourceInputAssetIds",
288
+ "prompt",
289
+ "files",
290
+ "readiness",
291
+ "quality",
292
+ "createdAt",
293
+ "updatedAt"
294
+ ],
295
+ "additionalProperties": false
296
+ }
297
+ },
298
+ "required": [
299
+ "ok",
300
+ "cacheKey",
301
+ "cacheHit",
302
+ "usedMock",
303
+ "manifest"
304
+ ],
305
+ "additionalProperties": false
306
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:rename-asset args",
4
+ "type": "object",
5
+ "properties": {
6
+ "slug": {
7
+ "type": "string",
8
+ "description": "Active game slug. The workbench UI fills this automatically for manual use; an AI/agent caller MUST pass the active game's slug. Required for AI callers."
9
+ },
10
+ "assetPath": {
11
+ "type": "string",
12
+ "minLength": 1,
13
+ "description": "Game-relative path of the asset (e.g. assets/3d/characters/hero.glb)."
14
+ },
15
+ "label": {
16
+ "type": ["string", "null"],
17
+ "description": "User-facing display name stored as sidecar custom.userLabel. Pass null or an empty string to clear and revert to the auto-name (prompt first line or filename stem). Does not rename the GLB file."
18
+ }
19
+ },
20
+ "required": ["assetPath", "label"],
21
+ "additionalProperties": false
22
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:rename-asset returns",
4
+ "type": "object",
5
+ "properties": {
6
+ "ok": { "const": true },
7
+ "manifest": {
8
+ "type": "object",
9
+ "description": "Updated Gen3DAssetManifest with userLabel applied."
10
+ }
11
+ },
12
+ "required": ["ok", "manifest"],
13
+ "additionalProperties": false
14
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:retopo-lowpoly args",
4
+ "type": "object",
5
+ "properties": {
6
+ "slug": {
7
+ "type": "string",
8
+ "description": "Active game slug. Injected by the workbench host; required."
9
+ },
10
+ "assetPath": {
11
+ "type": "string",
12
+ "minLength": 1,
13
+ "description": "Game-relative path of the high-poly source mesh asset (its main GLB) to retopologize. The source is RETAINED; a NEW derived low-poly GLB asset is produced. NOT a pre-rig step — textures are NOT preserved."
14
+ },
15
+ "assetName": {
16
+ "type": "string",
17
+ "description": "Optional base name for the new low-poly asset. Defaults to <source-name>-lowpoly."
18
+ },
19
+ "assetSlot": {
20
+ "enum": ["characters", "meshes"],
21
+ "description": "Slot for the new low-poly asset. Defaults to the source asset's slot."
22
+ },
23
+ "polygonType": {
24
+ "enum": ["triangle", "quadrilateral"],
25
+ "description": "Output topology. Defaults to quadrilateral."
26
+ },
27
+ "detailLevel": {
28
+ "enum": ["high", "medium", "low"],
29
+ "description": "Decimation target. Defaults to high."
30
+ }
31
+ },
32
+ "required": ["assetPath"],
33
+ "additionalProperties": false
34
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:retopo-lowpoly returns",
4
+ "type": "object",
5
+ "properties": {
6
+ "ok": { "const": true },
7
+ "cacheKey": { "type": "string" },
8
+ "cacheHit": {
9
+ "type": "boolean",
10
+ "description": "True when an identical low-poly result already existed (cache-first; the source's content hash + knobs key the cache)."
11
+ },
12
+ "usedMock": {
13
+ "type": "boolean",
14
+ "description": "True when no real Hunyuan provider was configured and a deterministic mock low-poly GLB was produced (quota-safe fallback)."
15
+ },
16
+ "manifest": {
17
+ "type": "object",
18
+ "description": "Manifest of the NEW derived low-poly asset. sourceInputAssetPaths references the high-poly source. Textures are NOT preserved.",
19
+ "additionalProperties": true
20
+ }
21
+ },
22
+ "required": ["ok", "cacheKey", "cacheHit", "usedMock", "manifest"],
23
+ "additionalProperties": false
24
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:score-quality args",
4
+ "type": "object",
5
+ "properties": {
6
+ "slug": { "type": "string", "description": "Active game slug. The workbench UI fills this automatically for manual use; an AI/agent caller MUST pass the active game's slug (e.g. 'mini-gta'). Required." },
7
+ "assetPath": { "type": "string", "description": "Game-relative asset path (assets/3d/<slot>/<name>.glb)." },
8
+ "objective": {
9
+ "type": "object",
10
+ "description": "Client-computed objective scores (0–100 or null) from the loaded GLB.",
11
+ "properties": {
12
+ "geometry": { "type": ["number", "null"] },
13
+ "topology": { "type": ["number", "null"] },
14
+ "texture": { "type": ["number", "null"] },
15
+ "pbr": { "type": ["number", "null"] }
16
+ },
17
+ "additionalProperties": false
18
+ },
19
+ "aiPass": { "type": "boolean", "default": false, "description": "Trigger AI vision scoring. Mock stub this round (returns usedMock, no values)." },
20
+ "manual": {
21
+ "type": "object",
22
+ "description": "Manual overrides (0–100 or null) + notes. Overridden dims are marked source=manual.",
23
+ "properties": {
24
+ "geometry": { "type": ["number", "null"] },
25
+ "topology": { "type": ["number", "null"] },
26
+ "texture": { "type": ["number", "null"] },
27
+ "pbr": { "type": ["number", "null"] },
28
+ "prompt_fidelity": { "type": ["number", "null"] },
29
+ "notes": { "type": "string" }
30
+ },
31
+ "additionalProperties": false
32
+ }
33
+ },
34
+ "required": ["slug", "assetPath"],
35
+ "additionalProperties": false
36
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:score-quality returns",
4
+ "type": "object",
5
+ "properties": {
6
+ "ok": { "const": true },
7
+ "usedMock": { "type": "boolean" },
8
+ "manifest": { "type": "object", "description": "Updated Gen3DAssetManifest (quality numbers surfaced)." }
9
+ },
10
+ "required": ["ok", "usedMock", "manifest"],
11
+ "additionalProperties": false
12
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:set-credentials args",
4
+ "type": "object",
5
+ "properties": {
6
+ "GEN3D_ENABLE_REAL_PROVIDERS": {
7
+ "enum": ["0", "1"],
8
+ "description": "Master switch. \"1\" enables real provider calls via the 3D gateway; \"0\" forces the quota-safe mock path."
9
+ },
10
+ "COS_SECRET_ID": {
11
+ "type": "string",
12
+ "description": "Tencent COS SecretId. Empty string clears it."
13
+ },
14
+ "COS_SECRET_KEY": {
15
+ "type": "string",
16
+ "description": "Tencent COS SecretKey. Empty string clears it."
17
+ },
18
+ "COS_BUCKET": {
19
+ "type": "string",
20
+ "description": "COS bucket name (address, not a secret). Empty string clears it."
21
+ },
22
+ "COS_REGION": {
23
+ "type": "string",
24
+ "description": "COS region (address, not a secret). Empty string clears it."
25
+ },
26
+ "slug": {
27
+ "type": "string",
28
+ "description": "Active game slug auto-injected by the workbench host into every tool call; not a credential and ignored by this tool (dropped by the CRED_KEYS whitelist)."
29
+ }
30
+ },
31
+ "additionalProperties": false
32
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:set-credentials returns",
4
+ "type": "object",
5
+ "properties": {
6
+ "ok": { "const": true },
7
+ "realProvidersEnabled": {
8
+ "type": "boolean",
9
+ "description": "True when GEN3D_ENABLE_REAL_PROVIDERS resolves to \"1\" (process.env wins over the plugin .env)."
10
+ },
11
+ "litellmConfigured": {
12
+ "type": "boolean",
13
+ "description": "Read-only. True when Studio global .env has a 3D gateway key (priority FORGEAX_3D_GATEWAY_KEY > ANTHROPIC_API_KEY > LITELLM_PROXY_KEY)."
14
+ },
15
+ "litellmProxyKey": {
16
+ "type": ["string", "null"],
17
+ "description": "Read-only masked 3D gateway key from Studio Settings (first4...last4, or *** when <= 8 chars), or null when unset. Never plaintext. The plugin .env never holds this key."
18
+ },
19
+ "credentials": {
20
+ "type": "object",
21
+ "properties": {
22
+ "COS_SECRET_ID": {
23
+ "type": ["string", "null"],
24
+ "description": "Masked COS SecretId (first4...last4, or *** when <= 8 chars) or null when unset. Never plaintext."
25
+ },
26
+ "COS_SECRET_KEY": {
27
+ "type": ["string", "null"],
28
+ "description": "Masked COS SecretKey or null when unset. Never plaintext."
29
+ },
30
+ "COS_BUCKET": {
31
+ "type": ["string", "null"],
32
+ "description": "Plaintext COS bucket name (an address, not a secret) or null when unset."
33
+ },
34
+ "COS_REGION": {
35
+ "type": ["string", "null"],
36
+ "description": "Plaintext COS region (an address, not a secret) or null when unset."
37
+ }
38
+ },
39
+ "required": ["COS_SECRET_ID", "COS_SECRET_KEY", "COS_BUCKET", "COS_REGION"],
40
+ "additionalProperties": false
41
+ }
42
+ },
43
+ "required": ["ok", "realProvidersEnabled", "litellmConfigured", "litellmProxyKey", "credentials"],
44
+ "additionalProperties": false
45
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:set-playable-motion-mapping args",
4
+ "type": "object",
5
+ "properties": {
6
+ "slug": { "type": "string" },
7
+ "assetPath": { "type": "string" },
8
+ "mappings": {
9
+ "type": "array",
10
+ "items": {
11
+ "type": "object",
12
+ "properties": {
13
+ "slotId": { "type": "string" },
14
+ "motionRefKey": { "type": ["string", "null"] },
15
+ "autoMatched": { "type": "boolean" }
16
+ },
17
+ "required": ["slotId", "motionRefKey", "autoMatched"],
18
+ "additionalProperties": false
19
+ }
20
+ },
21
+ "confirmed": { "type": "boolean" }
22
+ },
23
+ "required": ["slug", "assetPath", "mappings"],
24
+ "additionalProperties": false
25
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:set-playable-motion-mapping returns",
4
+ "type": "object",
5
+ "properties": {
6
+ "ok": { "const": true },
7
+ "mapping": {
8
+ "type": "object",
9
+ "properties": {
10
+ "schemaVersion": { "const": 1 },
11
+ "mappings": {
12
+ "type": "array",
13
+ "items": {
14
+ "type": "object",
15
+ "properties": {
16
+ "slotId": { "type": "string" },
17
+ "motionRefKey": { "type": ["string", "null"] },
18
+ "autoMatched": { "type": "boolean" }
19
+ },
20
+ "required": ["slotId", "motionRefKey", "autoMatched"],
21
+ "additionalProperties": false
22
+ }
23
+ },
24
+ "confirmed": { "type": "boolean" },
25
+ "updatedAt": { "type": "string" }
26
+ },
27
+ "required": ["schemaVersion", "mappings", "confirmed", "updatedAt"],
28
+ "additionalProperties": false
29
+ }
30
+ },
31
+ "required": ["ok", "mapping"],
32
+ "additionalProperties": false
33
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:set-playable-profile args",
4
+ "type": "object",
5
+ "properties": {
6
+ "slug": { "type": "string" },
7
+ "assetPath": { "type": "string" },
8
+ "slots": {
9
+ "type": "array",
10
+ "minItems": 1,
11
+ "items": {
12
+ "type": "object",
13
+ "properties": {
14
+ "slotId": { "type": "string" },
15
+ "displayName": { "type": "string" },
16
+ "required": { "type": "boolean" },
17
+ "playbackMode": { "enum": ["loop", "once", "freeze_frame"] },
18
+ "speed": { "type": "number", "exclusiveMinimum": 0 },
19
+ "matchKeywords": { "type": "array", "items": { "type": "string" } },
20
+ "rootMotion": { "enum": ["preserve", "remove_xz", "remove_xyz"] }
21
+ },
22
+ "required": ["slotId", "displayName", "required", "playbackMode", "speed", "matchKeywords", "rootMotion"],
23
+ "additionalProperties": false
24
+ }
25
+ },
26
+ "profileId": { "type": "string" },
27
+ "displayName": { "type": "string" },
28
+ "saveAsGameDefault": { "type": "boolean" }
29
+ },
30
+ "required": ["slug", "assetPath", "slots"],
31
+ "additionalProperties": false
32
+ }