@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,101 @@
1
+ /// <reference path="./draco3dgltf.d.ts" />
2
+ import { NodeIO, VertexLayout } from '@gltf-transform/core';
3
+ import { KHRDracoMeshCompression } from '@gltf-transform/extensions';
4
+ import { prune, unpartition } from '@gltf-transform/functions';
5
+ import draco3d from 'draco3dgltf';
6
+ import type { NormalizeResult } from './types.ts';
7
+
8
+ function parseGlbJson(glbBytes: Uint8Array): { extensionsRequired?: string[] } | null {
9
+ if (glbBytes.length < 20) return null;
10
+ const view = new DataView(glbBytes.buffer, glbBytes.byteOffset, glbBytes.byteLength);
11
+ if (view.getUint32(0, true) !== 0x46546c67) return null;
12
+ const jsonLen = view.getUint32(12, true);
13
+ if (jsonLen <= 0 || 20 + jsonLen > glbBytes.length) return null;
14
+ try {
15
+ return JSON.parse(new TextDecoder().decode(glbBytes.subarray(20, 20 + jsonLen))) as {
16
+ extensionsRequired?: string[];
17
+ };
18
+ } catch {
19
+ return null;
20
+ }
21
+ }
22
+
23
+ let decoderPromise: Promise<unknown> | undefined;
24
+ function getDecoder(): Promise<unknown> {
25
+ if (decoderPromise === undefined) {
26
+ decoderPromise = draco3d.createDecoderModule();
27
+ }
28
+ return decoderPromise;
29
+ }
30
+
31
+ /**
32
+ * Decode Draco (if present) and rewrite a GLB the engine can ingest:
33
+ * VertexLayout.SEPARATE + prune + unpartition; no required KHR_draco_mesh_compression.
34
+ */
35
+ export async function normalizeGlbForEngine(glbBytes: Uint8Array): Promise<NormalizeResult> {
36
+ const json = parseGlbJson(glbBytes);
37
+ if (json === null) {
38
+ return { ok: false, code: 'corrupt_glb', message: 'GLB header/JSON chunk is corrupt or not a GLB.' };
39
+ }
40
+
41
+ const required = json.extensionsRequired ?? [];
42
+ const needsDraco = required.includes('KHR_draco_mesh_compression');
43
+
44
+ try {
45
+ const io = new NodeIO()
46
+ .registerExtensions([KHRDracoMeshCompression])
47
+ .registerDependencies({
48
+ 'draco3d.decoder': await getDecoder(),
49
+ });
50
+ io.setVertexLayout(VertexLayout.SEPARATE);
51
+
52
+ let document;
53
+ try {
54
+ document = await io.readBinary(glbBytes);
55
+ } catch (err) {
56
+ return {
57
+ ok: false,
58
+ code: 'decode_failed',
59
+ message: err instanceof Error ? err.message : 'Failed to decode GLB (Draco/corrupt).',
60
+ };
61
+ }
62
+
63
+ // Drop Draco extension so the written GLB does not require it.
64
+ for (const ext of [...document.getRoot().listExtensionsUsed()]) {
65
+ if (ext.extensionName === 'KHR_draco_mesh_compression') {
66
+ ext.dispose();
67
+ }
68
+ }
69
+
70
+ await document.transform(prune(), unpartition());
71
+
72
+ let out: Uint8Array;
73
+ try {
74
+ out = await io.writeBinary(document);
75
+ } catch (err) {
76
+ return {
77
+ ok: false,
78
+ code: 'write_failed',
79
+ message: err instanceof Error ? err.message : 'Failed to write normalized GLB.',
80
+ };
81
+ }
82
+
83
+ const outJson = parseGlbJson(out);
84
+ const stillRequired = outJson?.extensionsRequired?.includes('KHR_draco_mesh_compression') ?? false;
85
+ if (stillRequired) {
86
+ return {
87
+ ok: false,
88
+ code: 'write_failed',
89
+ message: 'Normalized GLB still lists KHR_draco_mesh_compression as required.',
90
+ };
91
+ }
92
+
93
+ return { ok: true, bytes: out, changed: needsDraco || out.length !== glbBytes.length };
94
+ } catch (err) {
95
+ return {
96
+ ok: false,
97
+ code: 'decode_failed',
98
+ message: err instanceof Error ? err.message : 'normalizeGlbForEngine failed',
99
+ };
100
+ }
101
+ }
@@ -0,0 +1,82 @@
1
+ /** Engine external-asset-package meta shape (clean; no plugin-private fields). */
2
+
3
+ export interface ExternalAssetSubAsset {
4
+ readonly guid: string;
5
+ readonly sourceIndex: number;
6
+ readonly kind: string;
7
+ readonly name?: string;
8
+ }
9
+
10
+ export interface ExternalAssetMeta {
11
+ schemaVersion: 1;
12
+ kind: 'external-asset-package';
13
+ importer: 'gltf';
14
+ source?: string;
15
+ importSettings: {
16
+ defaultSceneIndex?: number;
17
+ diagnostics?: {
18
+ nodeNames: ReadonlyArray<string>;
19
+ unsupportedExtensions: ReadonlyArray<string>;
20
+ matrixTrsCoexistNodes: ReadonlyArray<string>;
21
+ };
22
+ colorSpace?: 'srgb' | 'linear';
23
+ mipmap?: 'auto' | 'none';
24
+ };
25
+ subAssets: ReadonlyArray<ExternalAssetSubAsset>;
26
+ }
27
+
28
+ /** Engine v1 required-extension allowlist (gltf khr-extensions.test). */
29
+ export const ENGINE_REQUIRED_EXTENSION_ALLOWLIST = ['EXT_mesh_gpu_instancing'] as const;
30
+
31
+ export type CookErrorCode =
32
+ | 'corrupt_glb'
33
+ | 'no_meshes'
34
+ | 'engine_unsupported_extension'
35
+ | 'read_failed';
36
+
37
+ export interface CookSuccess {
38
+ readonly ok: true;
39
+ readonly meta: ExternalAssetMeta;
40
+ }
41
+
42
+ export interface CookFailure {
43
+ readonly ok: false;
44
+ readonly code: CookErrorCode;
45
+ readonly message: string;
46
+ readonly unsupportedExtensions?: ReadonlyArray<string>;
47
+ }
48
+
49
+ export type CookResult = CookSuccess | CookFailure;
50
+
51
+ export interface CookOptions {
52
+ /** Previously written clean engine meta — reuse GUIDs by (kind, sourceIndex). */
53
+ readonly existingMeta?: ExternalAssetMeta | null;
54
+ /**
55
+ * Semantic GUID registry for animation-clip rows (slotKey → guid).
56
+ * When `animationSlotKeys[i]` is set, prefer registry[slotKey] over
57
+ * existingMeta / deterministic hash for that clip's GUID.
58
+ */
59
+ readonly slotGuidRegistry?: Readonly<Record<string, string>>;
60
+ /** Parallel to glTF animations[] order; entry may be undefined/omitted. */
61
+ readonly animationSlotKeys?: ReadonlyArray<string | undefined>;
62
+ }
63
+
64
+ export type NormalizeErrorCode =
65
+ | 'corrupt_glb'
66
+ | 'decode_failed'
67
+ | 'write_failed';
68
+
69
+ export interface NormalizeSuccess {
70
+ readonly ok: true;
71
+ readonly bytes: Uint8Array;
72
+ /** True when input already had no required Draco / was rewritten. */
73
+ readonly changed: boolean;
74
+ }
75
+
76
+ export interface NormalizeFailure {
77
+ readonly ok: false;
78
+ readonly code: NormalizeErrorCode;
79
+ readonly message: string;
80
+ }
81
+
82
+ export type NormalizeResult = NormalizeSuccess | NormalizeFailure;
@@ -0,0 +1,26 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:adopt-playable-character args",
4
+ "type": "object",
5
+ "properties": {
6
+ "slug": { "type": "string" },
7
+ "assetPath": { "type": "string" },
8
+ "slotMappings": {
9
+ "type": "array",
10
+ "items": {
11
+ "type": "object",
12
+ "properties": {
13
+ "slotId": { "type": "string" },
14
+ "clipName": { "type": ["string", "null"] },
15
+ "sourceIndex": { "type": ["integer", "null"], "minimum": 0 },
16
+ "guid": { "type": ["string", "null"] }
17
+ },
18
+ "required": ["slotId"],
19
+ "additionalProperties": false
20
+ }
21
+ },
22
+ "confirmed": { "type": "boolean" }
23
+ },
24
+ "required": ["slug", "assetPath", "slotMappings"],
25
+ "additionalProperties": false
26
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:adopt-playable-character returns",
4
+ "oneOf": [
5
+ {
6
+ "type": "object",
7
+ "properties": {
8
+ "ok": { "const": true },
9
+ "modelPath": { "type": "string" },
10
+ "playablePath": { "type": "string" },
11
+ "localUrl": { "type": "string" },
12
+ "reusedGuidCount": { "type": "integer", "minimum": 0 },
13
+ "clipCount": { "type": "integer", "minimum": 0 },
14
+ "message": { "type": "string" }
15
+ },
16
+ "required": ["ok", "modelPath", "playablePath", "localUrl", "reusedGuidCount", "clipCount", "message"],
17
+ "additionalProperties": false
18
+ },
19
+ {
20
+ "type": "object",
21
+ "properties": {
22
+ "ok": { "const": false },
23
+ "code": { "type": "string" },
24
+ "message": { "type": "string" },
25
+ "retryable": { "type": "boolean" }
26
+ },
27
+ "required": ["ok", "code", "message", "retryable"],
28
+ "additionalProperties": false
29
+ }
30
+ ]
31
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:apply-motion 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 a RIGGED asset (from gen3d:auto-rig). The animated GLB+FBX for this motion are appended to THIS asset. Dispatch is by the asset's recorded rig system (Meshy public default, Hunyuan dev fallback)."
14
+ },
15
+ "actionId": {
16
+ "type": "integer",
17
+ "minimum": 1,
18
+ "description": "Meshy path (public-beta default): a positive action_id chosen from gen3d:list-motions. Drives Meshy /animations via the asset's OWN rig_task_id. Idempotent per motion; required when the asset was Meshy-rigged."
19
+ },
20
+ "label": {
21
+ "type": "string",
22
+ "description": "Optional display label for the chosen motion (the UI passes the action name it showed). Stored on the clip; the catalog is not re-queried. Defaults to \"动作 <id>\"."
23
+ },
24
+ "autoReRig": {
25
+ "type": "boolean",
26
+ "description": "Meshy only: when the rig task has expired (~3 days), re-rig first (+credits) instead of failing with rig_expired. Default false."
27
+ },
28
+ "motionType": {
29
+ "type": "integer",
30
+ "minimum": 9,
31
+ "maximum": 16,
32
+ "description": "Hunyuan path only: v1 fixed motion 9–16. Required when the asset was Hunyuan-rigged."
33
+ },
34
+ "prompt": {
35
+ "type": "string",
36
+ "minLength": 1,
37
+ "description": "VISVISE text-motion prompt. Required (xor videoUrl) when the asset was VISVISE-rigged."
38
+ },
39
+ "videoUrl": {
40
+ "type": "string",
41
+ "minLength": 1,
42
+ "description": "VISVISE video-motion URL (after gen3d:upload-video PUT, or an existing URL). Required (xor prompt) when the asset was VISVISE-rigged."
43
+ }
44
+ },
45
+ "required": ["assetPath"],
46
+ "additionalProperties": false
47
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:apply-motion returns",
4
+ "type": "object",
5
+ "properties": {
6
+ "ok": { "const": true },
7
+ "usedMock": {
8
+ "type": "boolean",
9
+ "description": "True when no real Hunyuan provider was configured and deterministic placeholder model bytes were appended (quota-safe fallback)."
10
+ },
11
+ "assetPath": {
12
+ "type": "string",
13
+ "description": "Game-relative path of the animated asset (unchanged from input; the main GLB identity is stable)."
14
+ },
15
+ "manifest": {
16
+ "type": "object",
17
+ "description": "Updated manifest after the animated_model GLB+FBX for this motion were appended and readiness.animated flipped true. Multiple motions coexist as separate animated_model files (each tagged with its motionType).",
18
+ "additionalProperties": true
19
+ }
20
+ },
21
+ "required": ["ok", "usedMock", "assetPath", "manifest"],
22
+ "additionalProperties": false
23
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:auto-rig 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 textured high-poly mesh asset (its main GLB) to rig. Humanoid characters only. The rigged GLB+FBX are appended to THIS asset; the main GLB identity is unchanged."
14
+ },
15
+ "rigProvider": {
16
+ "type": "string",
17
+ "enum": ["auto", "meshy", "hunyuan_rest", "visvise"],
18
+ "default": "auto",
19
+ "description": "Which LiteLLM rig route to use. auto prefers Hunyuan REST, then VISVISE, then mock. Meshy is no longer first. Explicit meshy/hunyuan_rest/visvise force that route and fail with provider_not_configured when that env is missing."
20
+ },
21
+ "force": {
22
+ "type": "boolean",
23
+ "default": false,
24
+ "description": "When the asset is already rigged: strip prior rigged_model + animated_model files and custom.rig, then re-run auto-rig on the chosen rigProvider (burns fresh credits; use to switch Meshy ↔ Hunyuan). Default false keeps the idempotent no-op."
25
+ },
26
+ "heightMeters": {
27
+ "type": "number",
28
+ "minimum": 0.1,
29
+ "maximum": 5,
30
+ "description": "Meshy auto-rig only: approximate character height in meters (aids pose estimation / scale). Omit to use Meshy default (~1.7). Ignored for Hunyuan."
31
+ }
32
+ },
33
+ "required": ["assetPath"],
34
+ "additionalProperties": false
35
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:auto-rig returns",
4
+ "type": "object",
5
+ "properties": {
6
+ "ok": { "const": true },
7
+ "usedMock": {
8
+ "type": "boolean",
9
+ "description": "True when no real Hunyuan provider was configured and deterministic placeholder model bytes were appended (quota-safe fallback)."
10
+ },
11
+ "assetPath": {
12
+ "type": "string",
13
+ "description": "Game-relative path of the rigged asset (unchanged from input; the main GLB identity is stable)."
14
+ },
15
+ "manifest": {
16
+ "type": "object",
17
+ "description": "Updated manifest of the asset after the rigged_model GLB+FBX were appended and readiness.rigged flipped true.",
18
+ "additionalProperties": true
19
+ }
20
+ },
21
+ "required": ["ok", "usedMock", "assetPath", "manifest"],
22
+ "additionalProperties": false
23
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:delete-asset 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 asset to delete (e.g. assets/3d/characters/hero.glb). Destructive: removes the main GLB, its sidecar, and same-basename sidefiles, and tombstones the cacheKey so it never resurrects from a cache hit."
14
+ }
15
+ },
16
+ "required": ["assetPath"],
17
+ "additionalProperties": false
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:delete-asset returns",
4
+ "type": "object",
5
+ "properties": {
6
+ "ok": { "const": true },
7
+ "assetPath": {
8
+ "type": "string",
9
+ "description": "The game-relative path that was deleted."
10
+ },
11
+ "tombstoned": {
12
+ "type": "boolean",
13
+ "description": "True when the asset's sidecar carried a cacheKey that was tombstoned (so a later identical request will not cache-hit the deleted asset)."
14
+ }
15
+ },
16
+ "required": ["ok", "assetPath", "tombstoned"],
17
+ "additionalProperties": false
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:engine-import-status args",
4
+ "type": "object",
5
+ "properties": {
6
+ "slug": {
7
+ "type": "string"
8
+ },
9
+ "assetPath": {
10
+ "type": "string"
11
+ }
12
+ },
13
+ "required": [
14
+ "slug",
15
+ "assetPath"
16
+ ],
17
+ "additionalProperties": false
18
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:engine-import-status returns",
4
+ "type": "object",
5
+ "properties": {
6
+ "ok": {
7
+ "const": true
8
+ },
9
+ "imported": {
10
+ "type": "boolean"
11
+ },
12
+ "needsManualImport": {
13
+ "type": "boolean"
14
+ },
15
+ "needsDracoNormalize": {
16
+ "type": "boolean"
17
+ },
18
+ "engineMetaPath": {
19
+ "type": [
20
+ "string",
21
+ "null"
22
+ ]
23
+ },
24
+ "sourceHash": {
25
+ "type": [
26
+ "string",
27
+ "null"
28
+ ]
29
+ },
30
+ "importedAt": {
31
+ "type": [
32
+ "string",
33
+ "null"
34
+ ]
35
+ },
36
+ "message": {
37
+ "type": "string"
38
+ },
39
+ "retryable": {
40
+ "type": "boolean"
41
+ }
42
+ },
43
+ "required": [
44
+ "ok",
45
+ "imported",
46
+ "needsManualImport",
47
+ "message"
48
+ ],
49
+ "additionalProperties": true
50
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:export-playable-character args",
4
+ "type": "object",
5
+ "properties": {
6
+ "slug": {
7
+ "type": "string"
8
+ },
9
+ "assetPath": {
10
+ "type": "string"
11
+ },
12
+ "forceWizardConfirm": {
13
+ "type": "boolean"
14
+ }
15
+ },
16
+ "required": [
17
+ "slug",
18
+ "assetPath"
19
+ ],
20
+ "additionalProperties": false
21
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "gen3d:export-playable-character returns",
4
+ "type": "object",
5
+ "properties": {
6
+ "ok": {
7
+ "type": "boolean"
8
+ },
9
+ "firstExport": {
10
+ "type": "boolean"
11
+ },
12
+ "modelPath": {
13
+ "type": "string"
14
+ },
15
+ "metaPath": {
16
+ "type": "string"
17
+ },
18
+ "playablePath": {
19
+ "type": "string"
20
+ },
21
+ "localUrl": {
22
+ "type": "string"
23
+ },
24
+ "clipCount": {
25
+ "type": "integer"
26
+ },
27
+ "reusedGuidCount": {
28
+ "type": "integer"
29
+ },
30
+ "message": {
31
+ "type": "string"
32
+ },
33
+ "code": {
34
+ "type": "string"
35
+ },
36
+ "missingSlots": {
37
+ "type": "array",
38
+ "items": {
39
+ "type": "string"
40
+ }
41
+ },
42
+ "retryable": {
43
+ "type": "boolean"
44
+ }
45
+ },
46
+ "additionalProperties": true
47
+ }