diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b7eb3fe0..dc28db2c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -193,9 +193,3 @@ jobs: uses: SonarSource/sonarqube-scan-action@v6 with: projectBaseDir: packages/agentic-crew - - - name: SonarCloud Scan - meshy - if: env.SONAR_TOKEN != '' - uses: SonarSource/sonarqube-scan-action@v6 - with: - projectBaseDir: packages/meshy-content-generator diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2354ede4..50b829c7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -82,8 +82,6 @@ jobs: name: '@jbcom/agentic' - dir: packages/triage name: '@jbcom/agentic-triage' - - dir: packages/meshy-content-generator - name: '@jbcom/agentic-meshy' - dir: packages/providers name: '@jbcom/agentic-providers' - dir: tooling/vitest-agentic diff --git a/README.md b/README.md index 65eb8b32..3bd31b41 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,6 @@ | [`@jbcom/agentic`](packages/agentic) | TypeScript | Fleet management, multi-agent routing, CI resolution, GitHub Actions | [Docs](https://agentic.coach/packages/agentic/) | | [`@jbcom/agentic-triage`](packages/triage) | TypeScript | AI-powered issue triage, PR review, sprint planning (Vercel AI SDK + MCP) | [Docs](https://agentic.coach/packages/triage/) | | [`agentic-crew`](packages/agentic-crew) | Python | Framework-agnostic crew orchestration (CrewAI, LangGraph, Strands) | [Docs](https://agentic.coach/packages/crew/) | -| [`@jbcom/agentic-meshy`](packages/meshy-content-generator) | TypeScript | Declarative Meshy 3D asset generation pipelines | [Docs](https://agentic.coach/packages/meshy-content-generator/) | | [`@jbcom/agentic-providers`](packages/providers) | TypeScript | LLM provider implementations (Ollama, Jules, Cursor) | [Docs](https://agentic.coach/packages/agentic/) | ### Testing Plugins @@ -39,6 +38,7 @@ - [`jbcom/game-generator`](https://github.com/jbcom/game-generator) — experimental Bevy-based retro-RPG design sandbox - [`jbcom/game-asset-mcp`](https://github.com/jbcom/game-asset-mcp) — MCP server for local 3D asset libraries and PolyHaven ingestion +- [`jbcom/meshy-content-generator`](https://github.com/jbcom/meshy-content-generator) — declarative image pipelines backed by vendor-fabric ## Quick Start @@ -123,7 +123,6 @@ agentic/ │ ├── agentic/ # @jbcom/agentic (TypeScript) │ ├── triage/ # @jbcom/agentic-triage (TypeScript) │ ├── agentic-crew/ # agentic-crew (Python) -│ ├── meshy-content-generator/ # @jbcom/agentic-meshy (TypeScript) │ ├── providers/ # @jbcom/agentic-providers (TypeScript) ├── tooling/ │ ├── vitest-agentic/ # @jbcom/vitest-agentic (TypeScript) diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 79c82d63..f5536d96 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -65,7 +65,7 @@ export default defineConfig({ { label: '@jbcom/agentic', slug: 'packages/agentic' }, { label: '@jbcom/agentic-triage', slug: 'packages/triage' }, { label: 'agentic-crew', slug: 'packages/crew' }, - { label: '@jbcom/agentic-meshy', slug: 'packages/meshy-content-generator' }, + { label: 'meshy-content-generator', slug: 'packages/meshy-content-generator' }, ], }, { diff --git a/docs/src/content/docs/api/meshy/README.md b/docs/src/content/docs/api/meshy/README.md deleted file mode 100644 index 143545cd..00000000 --- a/docs/src/content/docs/api/meshy/README.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "@jbcom/agentic-meshy" ---- - -## Classes - -- [PipelineRunner](/api/meshy/classes/pipelinerunner/) - -## Interfaces - -- [DefinitionBundle](/api/meshy/interfaces/definitionbundle/) -- [DefinitionLoadOptions](/api/meshy/interfaces/definitionloadoptions/) -- [PipelineRunnerOptions](/api/meshy/interfaces/pipelinerunneroptions/) -- [RunOptions](/api/meshy/interfaces/runoptions/) -- [ValidationOptions](/api/meshy/interfaces/validationoptions/) -- [ValidationResult](/api/meshy/interfaces/validationresult/) - -## Type Aliases - -- [AssetManifest](/api/meshy/type-aliases/assetmanifest/) -- [InputBinding](/api/meshy/type-aliases/inputbinding/) -- [OutputBinding](/api/meshy/type-aliases/outputbinding/) -- [PipelineDefinition](/api/meshy/type-aliases/pipelinedefinition/) -- [PipelineStep](/api/meshy/type-aliases/pipelinestep/) -- [TaskDefinition](/api/meshy/type-aliases/taskdefinition/) -- [TaskState](/api/meshy/type-aliases/taskstate/) - -## Variables - -- [AssetManifestSchema](/api/meshy/variables/assetmanifestschema/) -- [TaskStateSchema](/api/meshy/variables/taskstateschema/) - -## Functions - -- [loadAnimationIds](/api/meshy/functions/loadanimationids/) -- [loadJsonDefinitions](/api/meshy/functions/loadjsondefinitions/) -- [validateManifestAndPipeline](/api/meshy/functions/validatemanifestandpipeline/) diff --git a/docs/src/content/docs/api/meshy/classes/PipelineRunner.md b/docs/src/content/docs/api/meshy/classes/PipelineRunner.md deleted file mode 100644 index 1a194868..00000000 --- a/docs/src/content/docs/api/meshy/classes/PipelineRunner.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "PipelineRunner" ---- - -Defined in: [core/runner.ts:61](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/runner.ts#L61) - -Executes declarative pipelines against asset manifests. - -## Constructors - -### Constructor - -> **new PipelineRunner**(`options`): `PipelineRunner` - -Defined in: [core/runner.ts:67](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/runner.ts#L67) - -#### Parameters - -##### options - -[`PipelineRunnerOptions`](/api/meshy/interfaces/pipelinerunneroptions/) - -#### Returns - -`PipelineRunner` - -## Methods - -### run() - -> **run**(`options`): `Promise`\<\{\[`key`: `string`\]: `unknown`; `id`: `string`; `name`: `string`; `seed?`: `number`; `tasks?`: `Record`\<`string`, \{\[`key`: `string`\]: `unknown`; `artifacts?`: `Record`\<`string`, `string`\>; `outputs?`: `Record`\<`string`, `unknown`\>; `status?`: `"PENDING"` \| `"IN_PROGRESS"` \| `"SUCCEEDED"` \| `"FAILED"` \| `"CANCELED"`; `taskId?`: `string`; \}\>; `type`: `string`; \}\> - -Defined in: [core/runner.ts:80](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/runner.ts#L80) - -Run a pipeline against the manifest in the provided asset directory. - -#### Parameters - -##### options - -[`RunOptions`](/api/meshy/interfaces/runoptions/) - -Pipeline execution options. - -#### Returns - -`Promise`\<\{\[`key`: `string`\]: `unknown`; `id`: `string`; `name`: `string`; `seed?`: `number`; `tasks?`: `Record`\<`string`, \{\[`key`: `string`\]: `unknown`; `artifacts?`: `Record`\<`string`, `string`\>; `outputs?`: `Record`\<`string`, `unknown`\>; `status?`: `"PENDING"` \| `"IN_PROGRESS"` \| `"SUCCEEDED"` \| `"FAILED"` \| `"CANCELED"`; `taskId?`: `string`; \}\>; `type`: `string`; \}\> - -Updated manifest with task state. diff --git a/docs/src/content/docs/api/meshy/functions/loadAnimationIds.md b/docs/src/content/docs/api/meshy/functions/loadAnimationIds.md deleted file mode 100644 index b7039376..00000000 --- a/docs/src/content/docs/api/meshy/functions/loadAnimationIds.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "loadAnimationIds" ---- - -> **loadAnimationIds**(): `Record`\<`string`, `number`\> - -Defined in: [lookups/animation-ids.ts:14](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/lookups/animation-ids.ts#L14) - -## Returns - -`Record`\<`string`, `number`\> diff --git a/docs/src/content/docs/api/meshy/functions/loadJsonDefinitions.md b/docs/src/content/docs/api/meshy/functions/loadJsonDefinitions.md deleted file mode 100644 index 1861eb27..00000000 --- a/docs/src/content/docs/api/meshy/functions/loadJsonDefinitions.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "loadJsonDefinitions" ---- - -> **loadJsonDefinitions**(`options`): `Promise`\<[`DefinitionBundle`](/api/meshy/interfaces/definitionbundle/)\> - -Defined in: [core/definitions.ts:31](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/definitions.ts#L31) - -Load and validate pipeline/task definitions from disk. - -## Parameters - -### options - -[`DefinitionLoadOptions`](/api/meshy/interfaces/definitionloadoptions/) - -Directory paths for pipeline and task definitions. - -## Returns - -`Promise`\<[`DefinitionBundle`](/api/meshy/interfaces/definitionbundle/)\> - -Parsed and validated definition bundle. diff --git a/docs/src/content/docs/api/meshy/functions/validateManifestAndPipeline.md b/docs/src/content/docs/api/meshy/functions/validateManifestAndPipeline.md deleted file mode 100644 index 21373364..00000000 --- a/docs/src/content/docs/api/meshy/functions/validateManifestAndPipeline.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "validateManifestAndPipeline" ---- - -> **validateManifestAndPipeline**(`options`): [`ValidationResult`](/api/meshy/interfaces/validationresult/) - -Defined in: [core/validator.ts:49](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/validator.ts#L49) - -Validate a manifest against the pipeline/task definitions without executing Meshy calls. - -## Parameters - -### options - -[`ValidationOptions`](/api/meshy/interfaces/validationoptions/) - -## Returns - -[`ValidationResult`](/api/meshy/interfaces/validationresult/) diff --git a/docs/src/content/docs/api/meshy/interfaces/DefinitionBundle.md b/docs/src/content/docs/api/meshy/interfaces/DefinitionBundle.md deleted file mode 100644 index 9febed97..00000000 --- a/docs/src/content/docs/api/meshy/interfaces/DefinitionBundle.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "DefinitionBundle" ---- - -Defined in: [core/definitions.ts:10](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/definitions.ts#L10) - -Parsed pipeline and task definitions loaded from JSON files. - -## Properties - -### pipelines - -> **pipelines**: `Map`\<`string`, \{ `description?`: `string`; `name`: `string`; `stateMapping?`: `Record`\<`string`, `string`\>; `steps`: `object`[]; `version?`: `string`; \}\> - -Defined in: [core/definitions.ts:11](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/definitions.ts#L11) - -*** - -### tasks - -> **tasks**: `Map`\<`string`, \{ `apiVersion?`: `string`; `description?`: `string`; `endpoint?`: `string`; `id`: `string`; `inputs`: `object`[]; `method?`: `"GET"` \| `"POST"` \| `"DELETE"`; `outputs`: `object`[]; `poll?`: \{ `intervalMs?`: `number`; `path`: `string`; `strategy`: `"stream"` \| `"poll"`; `timeoutMs?`: `number`; \}; \}\> - -Defined in: [core/definitions.ts:12](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/definitions.ts#L12) diff --git a/docs/src/content/docs/api/meshy/interfaces/DefinitionLoadOptions.md b/docs/src/content/docs/api/meshy/interfaces/DefinitionLoadOptions.md deleted file mode 100644 index 33832b50..00000000 --- a/docs/src/content/docs/api/meshy/interfaces/DefinitionLoadOptions.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "DefinitionLoadOptions" ---- - -Defined in: [core/definitions.ts:18](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/definitions.ts#L18) - -Paths to definition directories on disk. - -## Properties - -### pipelinesDir - -> **pipelinesDir**: `string` - -Defined in: [core/definitions.ts:20](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/definitions.ts#L20) - -Directory containing `*.pipeline.json` definitions. - -*** - -### tasksDir - -> **tasksDir**: `string` - -Defined in: [core/definitions.ts:22](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/definitions.ts#L22) - -Directory containing task definition JSON files. diff --git a/docs/src/content/docs/api/meshy/interfaces/PipelineRunnerOptions.md b/docs/src/content/docs/api/meshy/interfaces/PipelineRunnerOptions.md deleted file mode 100644 index 9e263de7..00000000 --- a/docs/src/content/docs/api/meshy/interfaces/PipelineRunnerOptions.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "PipelineRunnerOptions" ---- - -Defined in: [core/runner.ts:21](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/runner.ts#L21) - -## Properties - -### apiKey - -> **apiKey**: `string` - -Defined in: [core/runner.ts:25](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/runner.ts#L25) - -Meshy API key used to authenticate requests. - -*** - -### client? - -> `optional` **client**: `MeshyClient` - -Defined in: [core/runner.ts:27](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/runner.ts#L27) - -Optional Meshy client override (useful for testing). - -*** - -### definitions - -> **definitions**: [`DefinitionBundle`](/api/meshy/interfaces/definitionbundle/) - -Defined in: [core/runner.ts:23](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/runner.ts#L23) - -Loaded pipeline/task definitions. - -*** - -### logger()? - -> `optional` **logger**: (`message`) => `void` - -Defined in: [core/runner.ts:31](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/runner.ts#L31) - -Optional logger to capture pipeline progress. - -#### Parameters - -##### message - -`string` - -#### Returns - -`void` - -*** - -### lookups? - -> `optional` **lookups**: `Record`\<`string`, `Record`\<`string`, `unknown`\>\> - -Defined in: [core/runner.ts:29](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/runner.ts#L29) - -Lookup tables for binding inputs by key. diff --git a/docs/src/content/docs/api/meshy/interfaces/RunOptions.md b/docs/src/content/docs/api/meshy/interfaces/RunOptions.md deleted file mode 100644 index 929bb970..00000000 --- a/docs/src/content/docs/api/meshy/interfaces/RunOptions.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "RunOptions" ---- - -Defined in: [core/runner.ts:34](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/runner.ts#L34) - -## Properties - -### assetDir - -> **assetDir**: `string` - -Defined in: [core/runner.ts:38](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/runner.ts#L38) - -Asset directory containing the manifest.json file. - -*** - -### pipelineName - -> **pipelineName**: `string` - -Defined in: [core/runner.ts:36](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/runner.ts#L36) - -Pipeline definition name. - -*** - -### step? - -> `optional` **step**: `string` - -Defined in: [core/runner.ts:40](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/runner.ts#L40) - -Optional step id to run within the pipeline. diff --git a/docs/src/content/docs/api/meshy/interfaces/ValidationOptions.md b/docs/src/content/docs/api/meshy/interfaces/ValidationOptions.md deleted file mode 100644 index 58c8d65d..00000000 --- a/docs/src/content/docs/api/meshy/interfaces/ValidationOptions.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "ValidationOptions" ---- - -Defined in: [core/validator.ts:24](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/validator.ts#L24) - -Options for validating a manifest against a pipeline definition. - -## Properties - -### definitions - -> **definitions**: [`DefinitionBundle`](/api/meshy/interfaces/definitionbundle/) - -Defined in: [core/validator.ts:25](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/validator.ts#L25) - -*** - -### env? - -> `optional` **env**: `Record`\<`string`, `string` \| `undefined`\> - -Defined in: [core/validator.ts:28](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/validator.ts#L28) - -*** - -### lookups? - -> `optional` **lookups**: `Record`\<`string`, `Record`\<`string`, `unknown`\>\> - -Defined in: [core/validator.ts:29](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/validator.ts#L29) - -*** - -### manifest - -> **manifest**: `unknown` - -Defined in: [core/validator.ts:27](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/validator.ts#L27) - -*** - -### pipelineName - -> **pipelineName**: `string` - -Defined in: [core/validator.ts:26](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/validator.ts#L26) diff --git a/docs/src/content/docs/api/meshy/interfaces/ValidationResult.md b/docs/src/content/docs/api/meshy/interfaces/ValidationResult.md deleted file mode 100644 index dd97e4d6..00000000 --- a/docs/src/content/docs/api/meshy/interfaces/ValidationResult.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "ValidationResult" ---- - -Defined in: [core/validator.ts:16](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/validator.ts#L16) - -Validation errors and warnings produced by the manifest validator. - -## Properties - -### errors - -> **errors**: `string`[] - -Defined in: [core/validator.ts:17](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/validator.ts#L17) - -*** - -### warnings - -> **warnings**: `string`[] - -Defined in: [core/validator.ts:18](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/core/validator.ts#L18) diff --git a/docs/src/content/docs/api/meshy/type-aliases/AssetManifest.md b/docs/src/content/docs/api/meshy/type-aliases/AssetManifest.md deleted file mode 100644 index 10ddfa90..00000000 --- a/docs/src/content/docs/api/meshy/type-aliases/AssetManifest.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "AssetManifest" ---- - -> **AssetManifest** = `z.infer`\<*typeof* [`AssetManifestSchema`](/api/meshy/variables/assetmanifestschema/)\> - -Defined in: [schemas/manifest.ts:22](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/schemas/manifest.ts#L22) diff --git a/docs/src/content/docs/api/meshy/type-aliases/InputBinding.md b/docs/src/content/docs/api/meshy/type-aliases/InputBinding.md deleted file mode 100644 index dc9105e1..00000000 --- a/docs/src/content/docs/api/meshy/type-aliases/InputBinding.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "InputBinding" ---- - -> **InputBinding** = `z.infer`\<*typeof* `InputBindingSchema`\> - -Defined in: [schemas/definitions.ts:68](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/schemas/definitions.ts#L68) diff --git a/docs/src/content/docs/api/meshy/type-aliases/OutputBinding.md b/docs/src/content/docs/api/meshy/type-aliases/OutputBinding.md deleted file mode 100644 index 8c6967d2..00000000 --- a/docs/src/content/docs/api/meshy/type-aliases/OutputBinding.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "OutputBinding" ---- - -> **OutputBinding** = `z.infer`\<*typeof* `OutputBindingSchema`\> - -Defined in: [schemas/definitions.ts:69](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/schemas/definitions.ts#L69) diff --git a/docs/src/content/docs/api/meshy/type-aliases/PipelineDefinition.md b/docs/src/content/docs/api/meshy/type-aliases/PipelineDefinition.md deleted file mode 100644 index 2b8f8ac6..00000000 --- a/docs/src/content/docs/api/meshy/type-aliases/PipelineDefinition.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "PipelineDefinition" ---- - -> **PipelineDefinition** = `z.infer`\<*typeof* `PipelineDefinitionSchema`\> - -Defined in: [schemas/definitions.ts:72](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/schemas/definitions.ts#L72) diff --git a/docs/src/content/docs/api/meshy/type-aliases/PipelineStep.md b/docs/src/content/docs/api/meshy/type-aliases/PipelineStep.md deleted file mode 100644 index 8c1ab990..00000000 --- a/docs/src/content/docs/api/meshy/type-aliases/PipelineStep.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "PipelineStep" ---- - -> **PipelineStep** = `z.infer`\<*typeof* `PipelineStepSchema`\> - -Defined in: [schemas/definitions.ts:71](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/schemas/definitions.ts#L71) diff --git a/docs/src/content/docs/api/meshy/type-aliases/TaskDefinition.md b/docs/src/content/docs/api/meshy/type-aliases/TaskDefinition.md deleted file mode 100644 index 03aab785..00000000 --- a/docs/src/content/docs/api/meshy/type-aliases/TaskDefinition.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "TaskDefinition" ---- - -> **TaskDefinition** = `z.infer`\<*typeof* `TaskDefinitionSchema`\> - -Defined in: [schemas/definitions.ts:70](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/schemas/definitions.ts#L70) diff --git a/docs/src/content/docs/api/meshy/type-aliases/TaskState.md b/docs/src/content/docs/api/meshy/type-aliases/TaskState.md deleted file mode 100644 index 3a8a7226..00000000 --- a/docs/src/content/docs/api/meshy/type-aliases/TaskState.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "TaskState" ---- - -> **TaskState** = `z.infer`\<*typeof* [`TaskStateSchema`](/api/meshy/variables/taskstateschema/)\> - -Defined in: [schemas/manifest.ts:23](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/schemas/manifest.ts#L23) diff --git a/docs/src/content/docs/api/meshy/variables/AssetManifestSchema.md b/docs/src/content/docs/api/meshy/variables/AssetManifestSchema.md deleted file mode 100644 index 75d6f7a9..00000000 --- a/docs/src/content/docs/api/meshy/variables/AssetManifestSchema.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "AssetManifestSchema" ---- - -> `const` **AssetManifestSchema**: `ZodObject`\<\{ `id`: `ZodString`; `name`: `ZodString`; `seed`: `ZodOptional`\<`ZodNumber`\>; `tasks`: `ZodOptional`\<`ZodRecord`\<`ZodString`, `ZodObject`\<\{ `artifacts`: `ZodOptional`\<`ZodRecord`\<`ZodString`, `ZodString`\>\>; `outputs`: `ZodOptional`\<`ZodRecord`\<`ZodString`, `ZodUnknown`\>\>; `status`: `ZodOptional`\<`ZodEnum`\<\{ `CANCELED`: `"CANCELED"`; `FAILED`: `"FAILED"`; `IN_PROGRESS`: `"IN_PROGRESS"`; `PENDING`: `"PENDING"`; `SUCCEEDED`: `"SUCCEEDED"`; \}\>\>; `taskId`: `ZodOptional`\<`ZodString`\>; \}, `$loose`\>\>\>; `type`: `ZodString`; \}, `$loose`\> - -Defined in: [schemas/manifest.ts:12](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/schemas/manifest.ts#L12) diff --git a/docs/src/content/docs/api/meshy/variables/TaskStateSchema.md b/docs/src/content/docs/api/meshy/variables/TaskStateSchema.md deleted file mode 100644 index 3400aae9..00000000 --- a/docs/src/content/docs/api/meshy/variables/TaskStateSchema.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -editUrl: false -next: false -prev: false -title: "TaskStateSchema" ---- - -> `const` **TaskStateSchema**: `ZodObject`\<\{ `artifacts`: `ZodOptional`\<`ZodRecord`\<`ZodString`, `ZodString`\>\>; `outputs`: `ZodOptional`\<`ZodRecord`\<`ZodString`, `ZodUnknown`\>\>; `status`: `ZodOptional`\<`ZodEnum`\<\{ `CANCELED`: `"CANCELED"`; `FAILED`: `"FAILED"`; `IN_PROGRESS`: `"IN_PROGRESS"`; `PENDING`: `"PENDING"`; `SUCCEEDED`: `"SUCCEEDED"`; \}\>\>; `taskId`: `ZodOptional`\<`ZodString`\>; \}, `$loose`\> - -Defined in: [schemas/manifest.ts:3](https://github.com/jbcom/agentic/blob/3e0fc0dae3f16f8cce14665d77f819f138b021fa/packages/meshy-content-generator/src/schemas/manifest.ts#L3) diff --git a/docs/src/content/docs/getting-started/introduction.md b/docs/src/content/docs/getting-started/introduction.md index d89ee9de..96372ab7 100644 --- a/docs/src/content/docs/getting-started/introduction.md +++ b/docs/src/content/docs/getting-started/introduction.md @@ -62,7 +62,7 @@ from agentic_crew import run_crew result = run_crew("my-app", "reviewer", inputs={"pr": 42}) ``` -### @jbcom/agentic-meshy +### meshy-content-generator TypeScript diff --git a/docs/src/content/docs/guides/architecture.md b/docs/src/content/docs/guides/architecture.md index 8295268e..7d89e7b5 100644 --- a/docs/src/content/docs/guides/architecture.md +++ b/docs/src/content/docs/guides/architecture.md @@ -37,7 +37,7 @@ The Agentic toolkit spans TypeScript and Python. Each language targets the domai | | +----------------------+ +----------------------+ | - Ollama agent | | - Jules agent | +----------------------+ - | - Cursor agent | | @jbcom/agentic-meshy | + | - Cursor agent | | meshy-content-generator | +---------+--------+ | (3D Asset Pipelines)| | +----------------------+ | @@ -94,7 +94,7 @@ Framework-agnostic crew orchestration: @jbcom/agentic-providers ---> @jbcom/agentic-triage (peer dependency) @jbcom/vitest-agentic (standalone, mocks agentic components) pytest-agentic-crew (standalone, fixtures for agentic-crew) -@jbcom/agentic-meshy (standalone) +meshy-content-generator (standalone Python package; vendor-fabric transport) agentic-crew (standalone Python package) ``` diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx index 3c0a9a57..4ed67e2b 100644 --- a/docs/src/content/docs/index.mdx +++ b/docs/src/content/docs/index.mdx @@ -127,7 +127,7 @@ import { Tabs, TabItem } from '@astrojs/starlight/components';
-

@jbcom/agentic-meshy

+

meshy-content-generator

TypeScript

Declarative 3D asset pipelines. Text-to-3D, rigging, animation via Meshy AI with manifest state.

View Package diff --git a/docs/src/content/docs/packages/agentic.md b/docs/src/content/docs/packages/agentic.md index c46fb9ab..6d4b4f5e 100644 --- a/docs/src/content/docs/packages/agentic.md +++ b/docs/src/content/docs/packages/agentic.md @@ -193,7 +193,7 @@ src/ - **[@jbcom/agentic-triage](/packages/triage/)** — Triage primitives consumed by Agentic fleets - **[agentic-crew](/packages/crew/)** — Framework-agnostic crew orchestration -- **[@jbcom/agentic-meshy](/packages/meshy-content-generator/)** — 3D asset pipelines +- **[meshy-content-generator](/packages/meshy-content-generator/)** — standalone image pipelines backed by vendor-fabric ## Links diff --git a/docs/src/content/docs/packages/meshy-content-generator.md b/docs/src/content/docs/packages/meshy-content-generator.md index 13fd59a2..9460a142 100644 --- a/docs/src/content/docs/packages/meshy-content-generator.md +++ b/docs/src/content/docs/packages/meshy-content-generator.md @@ -1,189 +1,20 @@ --- -title: "@jbcom/agentic-meshy" -description: Declarative 3D asset pipelines powered by Meshy AI — text-to-3D, rigging, and animation without bespoke scripts +title: "meshy-content-generator" +description: Standalone declarative image pipelines backed by vendor-fabric --- -# @jbcom/agentic-meshy +# meshy-content-generator -> Declarative 3D asset pipelines powered by Meshy AI — define pipelines in JSON, run from CLI or API, preview instantly. +The former `@jbcom/agentic-meshy` workspace package has moved to the +standalone OSS repository +[`jbcom/meshy-content-generator`](https://github.com/jbcom/meshy-content-generator). -
- TypeScript -
- -**Stop writing bespoke scripts for every 3D asset.** @jbcom/agentic-meshy wraps Meshy's text-to-image, text-to-3D, rigging, and animation endpoints in a declarative pipeline system. Define your pipeline as JSON, point it at an asset manifest, and get reproducible results every time. - -## Why @jbcom/agentic-meshy? - -| Problem | Solution | -|---------|----------| -| Meshy integration requires custom scripts per asset | Declarative JSON pipelines — no code | -| Pipeline state lives in memory, lost on failure | Manifest-based state — resume from any step | -| No way to replay exact pipeline in CI | VCR recording for Meshy calls, fully deterministic | -| Preview requires external tools | Built-in 3D preview with `@google/model-viewer` | - -## Installation +The new Python CLI owns declarative expansion and local ImageMagick steps. It +depends on `vendor-fabric`, which exclusively owns Meshy authentication, HTTP, +rate limiting, errors, polling, downloads and resumable job manifests. ```bash -pnpm add @jbcom/agentic-meshy -# or -npm install @jbcom/agentic-meshy -``` - -## Quick Start - -### CLI - -```bash -# List built-in pipelines and tasks -content-gen list \ - --pipelines ./pipelines/definitions \ - --tasks ./tasks/definitions - -# Validate an asset manifest -content-gen validate ./assets/characters/hero \ - --pipelines ./pipelines/definitions \ - --tasks ./tasks/definitions - -# Run a pipeline -content-gen run character ./assets/characters/hero \ - --pipelines ./pipelines/definitions \ - --tasks ./tasks/definitions -``` - -### Programmatic API - -```typescript -import { - PipelineRunner, - loadJsonDefinitions -} from '@jbcom/agentic-meshy'; - -const definitions = await loadJsonDefinitions({ - pipelinesDir: './pipelines/definitions', - tasksDir: './tasks/definitions', -}); - -const runner = new PipelineRunner({ - definitions, - apiKey: process.env.MESHY_API_KEY!, -}); - -await runner.run({ - pipelineName: 'character', - assetDir: './assets/characters/hero', -}); -``` - -## Core Concepts - -### Pipeline Definitions - -`pipelines/definitions/*.pipeline.json` describe **orchestration**. Each step references a task and can override inputs: - -```json -{ - "name": "character", - "steps": [ - { - "task": "text-to-image", - "inputs": { "prompt": "{{manifest.description}}" } - }, - { - "task": "image-to-3d", - "inputs": { "image": "{{steps.0.output}}" } - }, - { - "task": "auto-rig", - "inputs": { "model": "{{steps.1.output}}" } - } - ] -} -``` - -### Task Definitions - -`tasks/definitions/*.json` describe **Meshy API calls**. Inputs resolve from manifests, previous steps, literals, environment variables, or lookup tables: - -```json -{ - "name": "text-to-image", - "endpoint": "/text-to-image", - "method": "POST", - "inputs": { - "prompt": { "source": "manifest", "key": "description" }, - "style": { "source": "literal", "value": "realistic" } - } -} +uvx --from meshy-content-generator content-gen run pipeline.json --root . --dry-run ``` -### Asset Manifests - -Each asset directory contains a `manifest.json` that supplies task inputs and stores pipeline state: - -```json -{ - "name": "Hero Character", - "description": "A medieval knight with ornate armor", - "style": "fantasy", - "state": { - "lastStep": 1, - "outputs": { "0": "image_abc123.png" } - } -} -``` - -## API Server & Preview - -```bash -pnpm dev -``` - -- **API reference**: `http://localhost:5177/api` -- **OpenAPI spec**: `http://localhost:5177/openapi.json` -- **3D Preview**: `http://localhost:5177/preview?assetDir=./assets/characters/hero&file=model.glb` - -The preview uses `@google/model-viewer` from your local install (no CDN dependency). - -## Testing - -```bash -# Unit tests -pnpm test:unit - -# E2E tests -pnpm test:e2e - -# Record Meshy calls for replay in CI -POLLY_MODE=record pnpm test:unit - -# Replay recorded calls (default) -POLLY_MODE=replay pnpm test:unit -``` - -## Environment Variables - -| Variable | Required | Description | -|----------|----------|-------------| -| `MESHY_API_KEY` | Yes | Meshy API key | -| `POLLY_MODE` | No | `record` or `replay` (default: `replay`) | - -## Integration with Strata - -@jbcom/agentic-meshy powers the 3D asset pipeline for [Strata](https://strata.game), the AI-powered gaming platform: - -- **Character models**: Text description → 3D model → rigged → animated -- **Environment assets**: Procedural generation of buildings, terrain features, props -- **Item generation**: Weapons, armor, consumables from text descriptions -- **Batch processing**: Generate entire game asset libraries from a manifest directory - -## Related Packages - -- **[@jbcom/agentic](/packages/agentic/)** — Fleet management and orchestration -- **[agentic-crew](/packages/crew/)** — Multi-agent workflows for content generation - -## Links - -- [GitHub Repository](https://github.com/jbcom/agentic/tree/main/packages/meshy-content-generator) -- [Meshy API Docs](https://docs.meshy.ai) -- [npm Package](https://www.npmjs.com/package/@jbcom/agentic-meshy) +The old npm package is retired and must not be used for new work. diff --git a/docs/tests/unit/build-output.test.ts b/docs/tests/unit/build-output.test.ts index 177b6faf..3ee20449 100644 --- a/docs/tests/unit/build-output.test.ts +++ b/docs/tests/unit/build-output.test.ts @@ -71,7 +71,7 @@ describe('Package pages exist in build output', () => { { path: 'packages/agentic/index.html', label: '@jbcom/agentic' }, { path: 'packages/triage/index.html', label: '@jbcom/agentic-triage' }, { path: 'packages/crew/index.html', label: 'agentic-crew' }, - { path: 'packages/meshy-content-generator/index.html', label: '@jbcom/agentic-meshy' }, + { path: 'packages/meshy-content-generator/index.html', label: 'meshy-content-generator' }, ]; for (const { path, label } of packagePages) { diff --git a/docs/tests/unit/content-contract.test.ts b/docs/tests/unit/content-contract.test.ts index 59b0551c..a55f7016 100644 --- a/docs/tests/unit/content-contract.test.ts +++ b/docs/tests/unit/content-contract.test.ts @@ -62,7 +62,7 @@ describe('Documentation contract', () => { }); it('uses the canonical meshy package name in product pages', () => { - expect(readDoc('packages/meshy-content-generator.md')).toContain('@jbcom/agentic-meshy'); + expect(readDoc('packages/meshy-content-generator.md')).toContain('jbcom/meshy-content-generator'); }); it('does not ship stale triage source examples or stub remarks', () => { diff --git a/packages/agentic/tests/production-release.test.ts b/packages/agentic/tests/production-release.test.ts index 909c5481..9ae38e12 100644 --- a/packages/agentic/tests/production-release.test.ts +++ b/packages/agentic/tests/production-release.test.ts @@ -604,6 +604,22 @@ describe('Property 7: Multi-architecture support', () => { expect(releaseWorkflow).toContain('platforms: linux/amd64,linux/arm64'); }); }); + +describe('Extracted package release ownership', () => { + it('does not publish or scan the standalone Meshy package from this monorepo', async () => { + const [releaseWorkflow, ciWorkflow] = await Promise.all([ + import('node:fs').then((fs) => + fs.promises.readFile(join(WORKSPACE_ROOT, '.github/workflows/release.yml'), 'utf-8') + ), + import('node:fs').then((fs) => + fs.promises.readFile(join(WORKSPACE_ROOT, '.github/workflows/ci.yml'), 'utf-8') + ), + ]); + + expect(releaseWorkflow).not.toContain('packages/meshy-content-generator'); + expect(ciWorkflow).not.toContain('packages/meshy-content-generator'); + }); +}); describe('Docker non-root user example', () => { /** * **Validates: Requirements 2.6, 7.4** diff --git a/packages/meshy-content-generator/LICENSE b/packages/meshy-content-generator/LICENSE deleted file mode 100644 index 07ae2c9d..00000000 --- a/packages/meshy-content-generator/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2026 jbcom - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/packages/meshy-content-generator/README.md b/packages/meshy-content-generator/README.md index 26b06e22..49975fdb 100644 --- a/packages/meshy-content-generator/README.md +++ b/packages/meshy-content-generator/README.md @@ -1,91 +1,8 @@ -# @jbcom/agentic-meshy - -[![npm version](https://img.shields.io/npm/v/@jbcom/agentic-meshy.svg)](https://www.npmjs.com/package/@jbcom/agentic-meshy) -[![CI](https://github.com/jbcom/agentic/actions/workflows/ci.yml/badge.svg)](https://github.com/jbcom/agentic/actions/workflows/ci.yml) -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) - -Declarative Meshy 3D asset generation pipelines. Define text-to-image, text-to-3D, rigging, and animation workflows as JSON, then run them from a CLI, REST API, or programmatically as a library. Includes a built-in 3D model preview server powered by `@google/model-viewer`. - -[Full Documentation](https://agentic.coach) | [Package Docs](https://agentic.coach/packages/meshy-content-generator/) - -## Installation - -```bash -npm install @jbcom/agentic-meshy -# or -pnpm add @jbcom/agentic-meshy -``` - -## Quick Start - -### CLI - -```bash -# List built-in pipelines and tasks -content-gen list --pipelines ./pipelines/definitions --tasks ./tasks/definitions - -# Validate an asset manifest -content-gen validate ./assets/characters/hero \ - --pipelines ./pipelines/definitions \ - --tasks ./tasks/definitions - -# Run a pipeline -content-gen run character ./assets/characters/hero \ - --pipelines ./pipelines/definitions \ - --tasks ./tasks/definitions -``` - -### Programmatic API - -```typescript -import { PipelineRunner, loadJsonDefinitions } from '@jbcom/agentic-meshy'; - -const definitions = await loadJsonDefinitions({ - pipelinesDir: './pipelines/definitions', - tasksDir: './tasks/definitions', -}); - -const runner = new PipelineRunner({ - definitions, - apiKey: process.env.MESHY_API_KEY!, -}); - -await runner.run({ - pipelineName: 'character', - assetDir: './assets/characters/hero', -}); -``` - -### API Server and Preview - -```bash -pnpm dev -``` - -- API reference: `http://localhost:5177/api` -- OpenAPI spec: `http://localhost:5177/openapi.json` -- 3D preview: `http://localhost:5177/preview?assetDir=./assets/characters/hero&file=model.glb` - -## Key Features - -- **Meshy-first** -- built around Meshy's text-to-image, text-to-3D, rigging, and animation endpoints -- **Declarative pipelines** -- orchestration defined in JSON, not brittle scripts -- **Reusable manifests** -- one manifest per asset, replay the exact pipeline anytime -- **CLI + API + library** -- use from the command line, embed in a server, or import directly -- **VCR-tested** -- Polly.js recording for deterministic Meshy API tests -- **OpenAPI spec** -- auto-generated spec with Scalar API reference - -## Environment - -```bash -MESHY_API_KEY=your_api_key # Required for Meshy API calls -POLLY_MODE=replay # VCR mode: record | replay | passthrough -``` - -## Documentation - -Visit [agentic.coach](https://agentic.coach) for full documentation including the [Meshy Content Generator guide](https://agentic.coach/packages/meshy-content-generator/). - -## License - -MIT +# Extracted + +The former `@jbcom/agentic-meshy` package was extracted with its history into +the standalone OSS repository +[`jbcom/meshy-content-generator`](https://github.com/jbcom/meshy-content-generator). +The replacement is a Python package whose only Meshy transport is +`vendor-fabric`. This tombstone is intentionally not a workspace package and +can be removed after downstream links have aged out. diff --git a/packages/meshy-content-generator/e2e/fixtures/model.glb b/packages/meshy-content-generator/e2e/fixtures/model.glb deleted file mode 100644 index 9e00702b..00000000 --- a/packages/meshy-content-generator/e2e/fixtures/model.glb +++ /dev/null @@ -1 +0,0 @@ -glTF \ No newline at end of file diff --git a/packages/meshy-content-generator/e2e/playwright.config.ts b/packages/meshy-content-generator/e2e/playwright.config.ts deleted file mode 100644 index 201f608b..00000000 --- a/packages/meshy-content-generator/e2e/playwright.config.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { defineConfig } from "@playwright/test"; - -export default defineConfig({ - testDir: "./tests", - timeout: 60_000, - use: { - baseURL: "http://127.0.0.1:5177", - browserName: "chromium", - }, - webServer: { - command: "pnpm dev", - url: "http://127.0.0.1:5177/openapi.json", - reuseExistingServer: !process.env.CI, - env: { - MESHY_API_KEY: process.env.MESHY_API_KEY ?? "test-key", - }, - }, -}); diff --git a/packages/meshy-content-generator/e2e/tests/preview.spec.ts b/packages/meshy-content-generator/e2e/tests/preview.spec.ts deleted file mode 100644 index d7d38e76..00000000 --- a/packages/meshy-content-generator/e2e/tests/preview.spec.ts +++ /dev/null @@ -1,19 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; -import { expect, test } from "@playwright/test"; - -const fixtureDir = path.resolve(process.cwd(), "e2e/fixtures"); -const modelPath = path.join(fixtureDir, "model.glb"); - -test.beforeAll(() => { - fs.mkdirSync(fixtureDir, { recursive: true }); - if (!fs.existsSync(modelPath)) { - fs.writeFileSync(modelPath, "glTF"); - } -}); - -test("preview page renders model-viewer", async ({ page }) => { - const url = `/preview?assetDir=${encodeURIComponent("e2e/fixtures")}&file=model.glb`; - await page.goto(url); - await expect(page.locator("model-viewer")).toBeVisible(); -}); diff --git a/packages/meshy-content-generator/lookups/animation-library.json b/packages/meshy-content-generator/lookups/animation-library.json deleted file mode 100644 index 1702ed69..00000000 --- a/packages/meshy-content-generator/lookups/animation-library.json +++ /dev/null @@ -1,1367 +0,0 @@ -{ - "name": "meshy-animation-library", - "description": "Meshy Animation Library - auto-synced from docs.meshy.ai", - "source": "https://docs.meshy.ai/en/api/animation-library", - "syncedAt": "2026-01-15T19:11:41.639Z", - "totalAnimations": 678, - "byPath": { - "DailyActions.Idle.Idle": 0, - "WalkAndRun.Walking.Walking_Woman": 1, - "DailyActions.LookingAround.Alert": 2, - "DailyActions.LookingAround.Arise": 3, - "Fighting.AttackingwithWeapon.Attack": 4, - "WalkAndRun.Running.BackLeft_run": 5, - "WalkAndRun.Running.BackRight_Run": 6, - "Fighting.GettingHit.BeHit_FlyUp": 7, - "Fighting.Dying.Dead": 8, - "Fighting.Transitioning.ForwardLeft_Run_Fight": 9, - "Fighting.Transitioning.ForwardRight_Run_Fight": 10, - "DailyActions.Idle.Idle_02": 11, - "DailyActions.Idle.Idle_03": 12, - "WalkAndRun.Running.Jump_Run": 13, - "WalkAndRun.Running.Run_02": 14, - "WalkAndRun.Running.Run_03": 15, - "WalkAndRun.Running.RunFast": 16, - "BodyMovements.Acting.Skill_01": 17, - "BodyMovements.Acting.Skill_02": 18, - "BodyMovements.Acting.Skill_03": 19, - "WalkAndRun.Walking.Walk_Fight_Back": 20, - "WalkAndRun.Walking.Walk_Fight_Forward": 21, - "Dancing.Dancing.FunnyDancing_01": 22, - "Dancing.Dancing.FunnyDancing_02": 23, - "Dancing.Dancing.FunnyDancing_03": 24, - "DailyActions.Interacting.Agree_Gesture": 25, - "DailyActions.Interacting.Angry_Stomp": 26, - "BodyMovements.Acting.Big_Heart_Gesture": 27, - "DailyActions.Interacting.Big_Wave_Hello": 28, - "BodyMovements.Acting.Call_Gesture": 29, - "WalkAndRun.Walking.Casual_Walk": 30, - "BodyMovements.Acting.Catching_Breath": 31, - "DailyActions.Idle.Chair_Sit_Idle_F": 32, - "DailyActions.Idle.Chair_Sit_Idle_M": 33, - "DailyActions.Interacting.Checkout_Gesture": 34, - "BodyMovements.Acting.Clapping_Run": 35, - "DailyActions.Idle.Confused_Scratch": 36, - "DailyActions.Interacting.Discuss_While_Moving": 37, - "DailyActions.Idle.Dozing_Elderly": 38, - "BodyMovements.Acting.Excited_Walk_F": 39, - "BodyMovements.Acting.Excited_Walk_M": 40, - "DailyActions.Interacting.Formal_Bow": 41, - "DailyActions.Interacting.Gentlemans_Bow": 42, - "BodyMovements.Acting.Handbag_Walk": 43, - "BodyMovements.Acting.Happy_jump_f": 44, - "BodyMovements.Acting.Indoor_Play": 45, - "BodyMovements.Acting.Jump_Rope": 46, - "DailyActions.Interacting.Listening_Gesture": 47, - "DailyActions.Idle.Mirror_Viewing": 48, - "DailyActions.Interacting.Motivational_Cheer": 49, - "DailyActions.Interacting.Phone_Call_Gesture": 50, - "BodyMovements.Acting.Shouting_Angrily": 51, - "DailyActions.Transitioning.Sit_to_Stand_Transition_F": 52, - "DailyActions.Transitioning.Sit_to_Stand_Transition_M": 53, - "Dancing.Dancing.Squat_Stance": 54, - "WalkAndRun.Walking.Stage_Walk": 55, - "DailyActions.Interacting.Stand_and_Chat": 56, - "DailyActions.Transitioning.Stand_to_Sit_Transition_M": 57, - "DailyActions.Transitioning.Step_to_Sit_Transition": 58, - "BodyMovements.Acting.Victory_Cheer": 59, - "DailyActions.Transitioning.Walk_to_Sit": 60, - "BodyMovements.Acting.happy_jump_m": 61, - "BodyMovements.Acting.penguin_walk": 62, - "Dancing.Dancing.Arm_Circle_Shuffle": 63, - "Dancing.Dancing.All_Night_Dance": 64, - "Dancing.Dancing.Bass_Beats": 65, - "Dancing.Dancing.Boom_Dance": 66, - "Dancing.Dancing.Bubble_Dance": 67, - "Dancing.Dancing.Cherish_Pop_Dance": 68, - "Dancing.Dancing.Crystal_Beads": 69, - "Dancing.Dancing.Cardio_Dance": 70, - "Dancing.Dancing.Denim_Pop_Dance": 71, - "Dancing.Dancing.Dont_You_Dare": 72, - "Dancing.Dancing.Fast_Lightning": 73, - "Dancing.Dancing.Gangnam_Groove": 74, - "Dancing.Dancing.Indoor_Swing": 75, - "Dancing.Dancing.Love_You_Pop_Dance": 76, - "Dancing.Dancing.Magic_Genie": 77, - "Dancing.Dancing.Not_Your_Mom": 78, - "Dancing.Dancing.OMG_Groove": 79, - "Dancing.Dancing.Pop_Dance_LSA2": 80, - "Dancing.Dancing.Pod_Baby_Groove": 81, - "Dancing.Dancing.Shake_It_Off_Dance": 82, - "Dancing.Dancing.Superlove_Pop_Dance": 83, - "Dancing.Dancing.You_Groove": 84, - "Fighting.Transitioning.Axe_Stance": 85, - "Fighting.AttackingwithWeapon.Basic_Jump": 86, - "Fighting.Punching.Boxing_Practice": 87, - "Fighting.Transitioning.Chest_Pound_Taunt": 88, - "Fighting.AttackingwithWeapon.Combat_Stance": 89, - "Fighting.Punching.Counterstrike": 90, - "Fighting.AttackingwithWeapon.Double_Blade_Spin": 91, - "Fighting.AttackingwithWeapon.Double_Combo_Attack": 92, - "Fighting.Punching.Dodge_and_Counter": 93, - "Fighting.Punching.Flying_Fist_Kick": 94, - "Fighting.AttackingwithWeapon.Gun_Hold_Left_Turn": 95, - "Fighting.Punching.Kung_Fu_Punch": 96, - "Fighting.AttackingwithWeapon.Left_Slash": 97, - "Fighting.AttackingwithWeapon.Run_and_Shoot": 98, - "Fighting.Transitioning.Reaping_Swing": 99, - "Fighting.Transitioning.Rightward_Spin": 100, - "BodyMovements.Acting.Sword_Shout": 101, - "Fighting.AttackingwithWeapon.Sword_Judgment": 102, - "Fighting.AttackingwithWeapon.Simple_Kick": 103, - "Fighting.AttackingwithWeapon.Side_Shot": 104, - "Fighting.AttackingwithWeapon.Triple_Combo_Attack": 105, - "WalkAndRun.Walking.Confident_Walk": 106, - "WalkAndRun.Walking.Confident_Strut": 107, - "WalkAndRun.Walking.Flirty_Strut": 108, - "BodyMovements.Acting.Groovy_Walk": 109, - "WalkAndRun.Running.Hello_Run": 110, - "WalkAndRun.Walking.Injured_Walk": 111, - "WalkAndRun.Walking.Monster_Walk": 112, - "BodyMovements.Acting.Mummy_Stagger": 113, - "WalkAndRun.Walking.Proud_Strut": 114, - "WalkAndRun.Walking.Quick_Walk": 115, - "WalkAndRun.Walking.Run_to_Walk_Transition": 116, - "WalkAndRun.Walking.Red_Carpet_Walk": 117, - "WalkAndRun.Walking.Skip_Forward": 118, - "WalkAndRun.Walking.Slow_Orc_Walk": 119, - "WalkAndRun.Running.Touch_and_Run": 120, - "WalkAndRun.Walking.Thoughtful_Walk": 121, - "WalkAndRun.Walking.Texting_Walk": 122, - "WalkAndRun.Walking.Unsteady_Walk": 123, - "WalkAndRun.Walking.Walking_with_Phone": 124, - "Fighting.CastingSpell.Charged_Spell_Cast": 125, - "Fighting.CastingSpell.Charged_Spell_Cast_1": 126, - "Fighting.CastingSpell.Charged_Ground_Slam": 127, - "Fighting.AttackingwithWeapon.Heavy_Hammer_Swing": 128, - "Fighting.CastingSpell.mage_soell_cast": 129, - "Fighting.CastingSpell.mage_soell_cast_1": 130, - "Fighting.CastingSpell.mage_soell_cast_2": 131, - "Fighting.CastingSpell.mage_soell_cast_3": 132, - "Fighting.CastingSpell.mage_soell_cast_4": 133, - "Fighting.CastingSpell.mage_soell_cast_5": 134, - "Fighting.CastingSpell.mage_soell_cast_6": 135, - "Fighting.CastingSpell.mage_soell_cast_7": 136, - "Fighting.CastingSpell.mage_soell_cast_8": 137, - "Fighting.Blocking.Block1": 138, - "Fighting.Blocking.Block2": 139, - "Fighting.Blocking.Block3": 140, - "Fighting.Blocking.Block4": 141, - "Fighting.Blocking.Block5": 142, - "Fighting.Blocking.Block6": 143, - "Fighting.Blocking.Block8": 144, - "Fighting.Blocking.Block9": 145, - "Fighting.Blocking.Block10": 146, - "Fighting.Blocking.Sword_Parry": 147, - "Fighting.Blocking.Sword_Parry_Backward": 148, - "Fighting.Blocking.Two_Handed_Parry": 149, - "Fighting.Blocking.Hit_Reaction_with_Bow": 150, - "Fighting.Blocking.Sword_Parry_Backward_1": 151, - "Fighting.Blocking.Sword_Parry_Backward_2": 152, - "Fighting.Blocking.Sword_Parry_Backward_3": 153, - "Fighting.Blocking.Sword_Parry_Backward_4": 154, - "Fighting.Blocking.Sword_Parry_Backward_5": 155, - "Fighting.Transitioning.Stand_Dodge": 156, - "Fighting.Transitioning.Stand_Dodge_1": 157, - "Fighting.Transitioning.Roll_Dodge": 158, - "Fighting.Transitioning.Roll_Dodge_1": 159, - "Fighting.Transitioning.Roll_Dodge_2": 160, - "Fighting.Transitioning.Roll_Dodge_3": 161, - "Fighting.Transitioning.Stand_Dodge_2": 162, - "Fighting.Transitioning.Roll_Dodge_4": 163, - "Fighting.Transitioning.Stand_Dodge_3": 164, - "Fighting.Transitioning.Kneeling_Reload": 165, - "Fighting.Transitioning.Running_Reload": 166, - "Fighting.Transitioning.Slow_Walk_Reload": 167, - "Fighting.Transitioning.Prone_Reload": 168, - "Fighting.Transitioning.Forward_Reload_Subtle": 169, - "Fighting.Transitioning.Standing_Reload": 170, - "Fighting.Transitioning.Hit_Reaction_to_Waist": 171, - "Fighting.GettingHit.Electrocution_Reaction": 172, - "Fighting.GettingHit.Slap_Reaction": 173, - "Fighting.GettingHit.Face_Punch_Reaction": 174, - "Fighting.GettingHit.Face_Punch_Reaction_1": 175, - "Fighting.GettingHit.Face_Punch_Reaction_2": 176, - "Fighting.GettingHit.Gunshot_Reaction": 177, - "Fighting.GettingHit.Hit_Reaction": 178, - "Fighting.GettingHit.Hit_Reaction_1": 179, - "Fighting.GettingHit.Shot_in_the_Back_and_Fall": 180, - "Fighting.Dying.Electrocuted_Fall": 181, - "Fighting.Dying.Shot_and_Blown_Back": 182, - "Fighting.Dying.Shot_and_Fall_Backward": 183, - "Fighting.Dying.Shot_and_Fall_Forward": 184, - "Fighting.Dying.Shot_and_Slow_Fall_Backward": 185, - "Fighting.Dying.Strangled_and_Fall_Forward": 186, - "Fighting.Dying.Knock_Down": 187, - "Fighting.Dying.Fall_Dead_from_Abdominal_Injury": 188, - "Fighting.Dying.dying_backwards": 189, - "Fighting.Dying.Knock_Down_1": 190, - "Fighting.Punching.Left_Jab_from_Guard": 191, - "Fighting.Punching.Right_Jab_from_Guard": 192, - "Fighting.Punching.Left_Hook_from_Guard": 193, - "Fighting.Punching.Right_Uppercut_from_Guard": 194, - "Fighting.Punching.Right_Upper_Hook_from_Guard": 195, - "Fighting.Punching.Left_Uppercut_from_Guard": 196, - "Fighting.Punching.Left_Short_Hook_from_Guard": 197, - "Fighting.Punching.Punch_Combo": 198, - "Fighting.Punching.Weapon_Combo": 199, - "Fighting.Punching.Punch_Combo_1": 200, - "Fighting.Punching.Punch_Combo_2": 201, - "Fighting.Punching.Weapon_Combo_1": 202, - "Fighting.Punching.Punch_Combo_3": 203, - "Fighting.Punching.Punch_Combo_4": 204, - "Fighting.Punching.Punch_Combo_5": 205, - "Fighting.Punching.Spartan_Kick": 206, - "Fighting.Punching.Roundhouse_Kick": 207, - "Fighting.Punching.Lunge_Roundhouse_Kick": 208, - "Fighting.Punching.Boxing_Guard_Right_Straight_Kick": 209, - "Fighting.Punching.Boxing_Guard_Prep_Straight_Punch": 210, - "Fighting.Punching.Boxing_Guard_Step_Knee_Strike": 211, - "Fighting.Punching.Elbow_Strike": 212, - "Fighting.Punching.Leg_Sweep": 213, - "Fighting.Punching.Punch_Forward_with_Both_Fists": 214, - "Fighting.Punching.High_Kick": 215, - "Fighting.Punching.Lunge_Spin_Kick": 216, - "Fighting.Punching.Sweeping_Kick": 217, - "Fighting.Punching.Step_in_High_Kick": 218, - "Fighting.Punching.Right_Hand_Sword_Slash": 219, - "Fighting.Punching.Shield_Push_Left": 220, - "Fighting.Punching.Charged_Upward_Slash": 221, - "Fighting.AttackingwithWeapon.Draw_and_Shoot_from_Back": 222, - "Fighting.AttackingwithWeapon.Draw_and_Shoot_from_Back_1": 223, - "Fighting.AttackingwithWeapon.Archery_Shot": 224, - "Fighting.AttackingwithWeapon.Archery_Shot_1": 225, - "Fighting.AttackingwithWeapon.Archery_Shot_2": 226, - "Fighting.AttackingwithWeapon.Archery_Shot_3": 227, - "Fighting.AttackingwithWeapon.Walk_Forward_with_Bow_Aimed": 228, - "Fighting.AttackingwithWeapon.Draw_and_Shoot_from_Back_2": 229, - "Fighting.AttackingwithWeapon.Walk_Backward_with_Bow_Aimed": 230, - "Fighting.AttackingwithWeapon.Archery_Aim_with_Lateral_Scan": 231, - "Fighting.AttackingwithWeapon.Cowboy_Quick_Draw_Shooting": 232, - "Fighting.AttackingwithWeapon.Walk_Backward_While_Shooting": 233, - "Fighting.AttackingwithWeapon.Walk_Forward_While_Shooting": 234, - "Fighting.AttackingwithWeapon.Forward_Roll_and_Fire": 235, - "Fighting.AttackingwithWeapon.Draw_and_Shoot_Left": 236, - "Fighting.AttackingwithWeapon.Charged_Axe_Chop": 237, - "Fighting.AttackingwithWeapon.Axe_Spin_Attack": 238, - "Fighting.AttackingwithWeapon.Crouch_Pull_and_Throw": 239, - "Fighting.AttackingwithWeapon.Thrust_Slash": 240, - "Fighting.AttackingwithWeapon.Weapon_Combo_2": 241, - "Fighting.AttackingwithWeapon.Charged_Slash": 242, - "DailyActions.Idle.Idle_3": 243, - "DailyActions.Idle.Idle_4": 244, - "DailyActions.Idle.Idle_5": 245, - "DailyActions.Idle.Idle_6": 246, - "DailyActions.Idle.Idle_7": 247, - "DailyActions.Idle.Idle_8": 248, - "DailyActions.Idle.Idle_9": 249, - "DailyActions.Idle.Idle_10": 250, - "DailyActions.Idle.Idle_11": 251, - "DailyActions.Idle.Idle_12": 252, - "DailyActions.Idle.Idle_13": 253, - "DailyActions.Idle.Idle_14": 254, - "DailyActions.Idle.Angry_Ground_Stomp": 255, - "DailyActions.Idle.Angry_Ground_Stomp_1": 256, - "DailyActions.Idle.Angry_Ground_Stomp_2": 257, - "DailyActions.Idle.CrouchLookAroundBow": 258, - "DailyActions.Pushing.Step_Forward_and_Push": 259, - "DailyActions.Pushing.Push_Forward_and_Stop": 260, - "DailyActions.Pushing.Push_and_Walk_Forward": 261, - "DailyActions.Pushing.Crouch_and_Push_Forward": 262, - "DailyActions.Sleeping.Sleep_on_Desk": 263, - "DailyActions.Sleeping.Cough_While_Sleeping": 264, - "DailyActions.Sleeping.Groan_Holding_Stomach_in_Sleep": 265, - "DailyActions.Sleeping.Lie_Down_Hands_Spread": 266, - "DailyActions.Sleeping.Sleep_Normally": 267, - "DailyActions.Sleeping.Sit_and_Doze_Off": 268, - "DailyActions.Sleeping.sleep": 269, - "DailyActions.Sleeping.Toss_and_Turn": 270, - "DailyActions.Sleeping.Wake_Up_and_Look_Up": 271, - "DailyActions.Sleeping.Lie_on_Chair_Sunbathe_and_Sleep": 272, - "DailyActions.PickingUpItem.Male_Run_Forward_Pick_Up_Left": 273, - "DailyActions.PickingUpItem.Female_Crouch_Pick_Up_Place_Side": 274, - "DailyActions.PickingUpItem.Female_Run_Forward_Pick_Up_Right": 275, - "DailyActions.PickingUpItem.Male_Bend_Over_Pick_Up": 276, - "DailyActions.PickingUpItem.Female_Crouch_Pick_Fruit_Basket_Stand": 277, - "DailyActions.PickingUpItem.Female_Stand_Pick_Fruit_Basket": 278, - "DailyActions.PickingUpItem.Female_Crouch_Pick_Gun_Point_Forward": 279, - "DailyActions.PickingUpItem.Female_Crouch_Pick_Throw_Forward": 280, - "DailyActions.PickingUpItem.Female_Bend_Over_Pick_Up_Inspect": 281, - "DailyActions.PickingUpItem.Female_Walk_Pick_Put_In_Pocket": 282, - "DailyActions.PickingUpItem.Pull_Radish": 283, - "DailyActions.PickingUpItem.Collect_Object": 284, - "DailyActions.Interacting.open_door": 285, - "DailyActions.Interacting.open_door_1": 286, - "DailyActions.Interacting.open_door_2": 287, - "DailyActions.Interacting.open_door_3": 288, - "DailyActions.Interacting.open_door_4": 289, - "DailyActions.Interacting.Wave_One_Hand": 290, - "DailyActions.Interacting.Wave_for_Help": 291, - "DailyActions.Interacting.Gesture_with_Hand_on_Gun": 292, - "DailyActions.Interacting.Wave_for_Help_1": 293, - "DailyActions.Interacting.Wave_for_Help_2": 294, - "DailyActions.Interacting.Wave_for_Help_3": 295, - "DailyActions.Interacting.Wave_for_Help_4": 296, - "DailyActions.Interacting.Personalized_Gesture": 297, - "DailyActions.Interacting.Cheer_with_Both_Hands_Up": 298, - "DailyActions.Interacting.Stand_Clap_and_Sit_Down": 299, - "DailyActions.Interacting.Sit_Cheer_with_Left_Hand": 300, - "DailyActions.Interacting.Cheer_with_Both_Hands_1": 301, - "DailyActions.Interacting.Stand_Wave_and_Sit_Down": 302, - "DailyActions.Interacting.Cheer_with_Both_Hands": 303, - "DailyActions.Interacting.Seated_Fist_Pump": 304, - "DailyActions.Interacting.Stand_Cheer_and_Sit_Down": 305, - "DailyActions.Interacting.Cheer_with_One_Hand_Up": 306, - "DailyActions.Interacting.Sitting_Answering_Questions": 307, - "DailyActions.Interacting.Talk_Passionately": 308, - "DailyActions.Interacting.Talk_with_Left_Hand_on_Hip": 309, - "DailyActions.Interacting.Talk_with_Left_Hand_Raised": 310, - "DailyActions.Interacting.Stand_Talking_Angry": 311, - "DailyActions.Interacting.Phone_Conversation": 312, - "DailyActions.Interacting.Talk_with_Hands_Open": 313, - "DailyActions.Interacting.Talk_with_Right_Hand_Open": 314, - "DailyActions.Interacting.Hand_on_Hip_Gesture": 315, - "DailyActions.Interacting.Headache_Relief": 316, - "DailyActions.Interacting.Shrug": 317, - "DailyActions.Interacting.Scheming_Hand_Rub": 318, - "DailyActions.WorkingOut.air_squat": 319, - "DailyActions.WorkingOut.bicep_curl": 320, - "DailyActions.WorkingOut.bicycle_crunch": 321, - "DailyActions.WorkingOut.circle_crunch": 322, - "DailyActions.WorkingOut.golf_drive": 323, - "DailyActions.WorkingOut.idle_to_push_up": 324, - "DailyActions.WorkingOut.jump_push_up": 325, - "DailyActions.WorkingOut.jumping_jacks": 326, - "DailyActions.WorkingOut.kettlebell_swing": 327, - "DailyActions.WorkingOut.push_up_to_idle": 328, - "DailyActions.WorkingOut.push_up": 329, - "DailyActions.WorkingOut.situps": 330, - "DailyActions.WorkingOut.Sumo_High_Pull": 331, - "DailyActions.LookingAround.Look_Around_Dumbfounded": 333, - "DailyActions.LookingAround.Lower_Weapon_Look_Raise": 334, - "DailyActions.LookingAround.Axe_Breathe_and_Look_Around": 335, - "DailyActions.LookingAround.Long_Breathe_and_Look_Around": 336, - "DailyActions.LookingAround.Torch_Look_Around": 337, - "DailyActions.LookingAround.Short_Breathe_and_Look_Around": 338, - "DailyActions.LookingAround.Walking_Scan_with_Sudden_Look_Back": 339, - "DailyActions.LookingAround.Crawl_and_Look_Back": 340, - "DailyActions.LookingAround.Walk_Slowly_and_Look_Around": 341, - "DailyActions.Drinking.Stand_and_Drink": 342, - "DailyActions.Drinking.Sit_and_Drink": 343, - "DailyActions.Transitioning.Stand_Up1": 344, - "DailyActions.Transitioning.Stand_Up2": 345, - "DailyActions.Transitioning.Stand_Up3": 346, - "DailyActions.Transitioning.Stand_Up4": 347, - "DailyActions.Transitioning.Stand_Up5": 348, - "DailyActions.Transitioning.Stand_Up6": 349, - "DailyActions.Transitioning.Stand_Up7": 350, - "DailyActions.Transitioning.Stand_Up8": 351, - "DailyActions.Transitioning.Stand_Up9": 352, - "DailyActions.Transitioning.Stand_Up10": 353, - "DailyActions.Transitioning.Sitting_Clap": 354, - "DailyActions.Transitioning.Sit_Finger_Wag_No": 355, - "DailyActions.Transitioning.Sit_Hands_on_Head_Lean_Back": 356, - "DailyActions.Transitioning.Sit_Thumbs_Up_Right": 357, - "DailyActions.Transitioning.Sit_Shout_Hands_on_Mouth": 358, - "DailyActions.Transitioning.Look_Back_and_Sit": 359, - "DailyActions.Transitioning.Sit_to_standTransition_Female_2": 360, - "DailyActions.Transitioning.Sit_Dodge": 361, - "DailyActions.Transitioning.Sit_Cross_Legged": 362, - "DailyActions.Transitioning.Sit_Cross_Legged_on_Floor": 363, - "DailyActions.Transitioning.Sit_on_Chair_Arms_Crossed": 364, - "DailyActions.Transitioning.Kneel_on_One_Knee_and_Stand": 365, - "DailyActions.Transitioning.falling_down": 366, - "DailyActions.Transitioning.SideLying_Reach_Help": 367, - "DailyActions.Transitioning.Angry_To_Tantrum_Sit": 368, - "DailyActions.Transitioning.Lie_Back_Leg_Swing": 369, - "DailyActions.Transitioning.Stand_To_Side_Lying": 370, - "DailyActions.Transitioning.Sit_Lie_Bed": 371, - "DailyActions.Transitioning.Prone_Reach_Help": 372, - "BodyMovements.Acting.Handstand_Flip": 375, - "BodyMovements.Acting.Punch_Pose": 376, - "BodyMovements.Acting.Relax_arms_then_strike_battle_pose": 377, - "BodyMovements.Acting.Large_step_then_high_kick": 378, - "BodyMovements.Acting.Side_jumps_in_horse_stance": 379, - "BodyMovements.Acting.Step_Right_for_Exercise": 381, - "BodyMovements.Acting.Jump_and_Slam_Back_Down": 382, - "BodyMovements.Acting.Quick_Step_and_Spin_Dodge": 384, - "BodyMovements.Acting.Boxing_Warmup": 385, - "BodyMovements.Acting.Zombie_Scream": 386, - "BodyMovements.Acting.Half_Squat_with_Thumb_Up": 387, - "BodyMovements.Acting.Show_Both_Arm_Muscles": 388, - "BodyMovements.Acting.Grip_and_Throw_Down": 389, - "BodyMovements.Acting.Stand_on_Pole_and_Balance": 390, - "BodyMovements.Acting.Head_Hold_in_Pain": 391, - "BodyMovements.Acting.Ground_Flip_and_Sweep_Up": 392, - "BodyMovements.Acting.baseball_pitching": 393, - "BodyMovements.Acting.Backflip_and_Hooks": 394, - "BodyMovements.Acting.Breakdance_1990": 395, - "BodyMovements.Acting.Burpee_Exercise": 396, - "BodyMovements.Acting.360_Power_Spin_Jump": 397, - "BodyMovements.Acting.Crouch_Charge_and_Throw": 398, - "BodyMovements.Acting.Step_Step_Turn_Kick": 399, - "BodyMovements.Acting.Sprint_Roll_and_Flip": 401, - "BodyMovements.Acting.Run_and_Leap": 402, - "BodyMovements.Acting.Victory_Fist_Pump": 403, - "BodyMovements.Acting.Crouch_and_Step_Back": 404, - "BodyMovements.Acting.Joyful_Dance_with_Hand_Sway": 405, - "BodyMovements.Acting.Thomas_Flair_to_Jump_Up": 406, - "BodyMovements.Acting.Wall_Push_Jump_and_Flip": 407, - "BodyMovements.Acting.Jazz_Hands": 408, - "BodyMovements.Acting.Finger_Wag_No": 409, - "BodyMovements.Acting.Kick_a_Soccer_Ball": 410, - "BodyMovements.Acting.Neck_Slashing_Gesture": 411, - "BodyMovements.Acting.victory": 412, - "BodyMovements.Acting.Backflip_and_Rise": 413, - "BodyMovements.Acting.Double_kick_forward": 414, - "BodyMovements.Acting.Happy_Sway_Standing": 415, - "BodyMovements.Acting.Hit_in_Back_While_Running": 416, - "BodyMovements.Acting.Hop_with_Arms_Raised": 417, - "BodyMovements.Acting.Jump_to_Catch_and_Fall": 419, - "BodyMovements.Acting.Left_Hand_Bitten_Step_Back": 420, - "BodyMovements.Acting.Over_Shoulder_Throw": 421, - "BodyMovements.Acting.Rising_Flying_Kick": 422, - "BodyMovements.VaultingOverObstacle.Vault_with_Rifle": 425, - "BodyMovements.VaultingOverObstacle.Roll_Behind_Cover": 426, - "BodyMovements.VaultingOverObstacle.Vault_and_Land": 427, - "BodyMovements.VaultingOverObstacle.Unarmed_Vault": 428, - "BodyMovements.VaultingOverObstacle.Parkour_Vault": 429, - "BodyMovements.VaultingOverObstacle.Parkour_Vault_with_Roll": 430, - "BodyMovements.VaultingOverObstacle.Parkour_Vault_1": 431, - "BodyMovements.VaultingOverObstacle.Parkour_Vault_2": 432, - "BodyMovements.VaultingOverObstacle.Parkour_Vault_3": 433, - "BodyMovements.Climbing.Fast_Ladder_Climb": 434, - "BodyMovements.Climbing.Ladder_Climb_Finish": 435, - "BodyMovements.Climbing.Ladder_Mount_Start": 436, - "BodyMovements.Climbing.Slow_Ladder_Climb": 437, - "BodyMovements.Climbing.Ladder_Climb_Loop": 438, - "BodyMovements.Climbing.Climb_Left_with_Both_Limbs": 439, - "BodyMovements.Climbing.Climb_Right_with_Both_Limbs": 440, - "BodyMovements.Climbing.Climb_Stairs": 441, - "BodyMovements.Climbing.Fast_Stair_Climb": 442, - "BodyMovements.Climbing.climbing_up_wall": 444, - "BodyMovements.Climbing.diagonal_wall_run": 445, - "BodyMovements.Climbing.Hang_and_Climb_Left": 446, - "BodyMovements.Climbing.Hang_and_Climb_Rght": 447, - "BodyMovements.Climbing.Jump_and_Grab_Wall": 448, - "BodyMovements.Climbing.Climb_Up_Rope": 449, - "BodyMovements.PerformingStunt.Wall_Flip": 450, - "BodyMovements.PerformingStunt.One_Arm_Handstand": 451, - "BodyMovements.PerformingStunt.Backflip": 452, - "BodyMovements.PerformingStunt.Backflip_Sweep_Kick": 453, - "BodyMovements.PerformingStunt.Sweep_Kick": 455, - "BodyMovements.PerformingStunt.Jumping_Head_Scissor_Takedown": 456, - "BodyMovements.PerformingStunt.Jumping_Punch": 457, - "BodyMovements.PerformingStunt.Unicycle_Jump_Dismount": 458, - "BodyMovements.PerformingStunt.Run_Jump_and_Roll": 459, - "BodyMovements.Jumping.Jump_with_Arms_Open": 460, - "BodyMovements.Jumping.Jump_with_Arms_and_Legs_Open": 461, - "BodyMovements.Jumping.Backflip_Jump": 462, - "BodyMovements.Jumping.Run_and_Jump": 463, - "BodyMovements.Jumping.Leap_and_Punch": 464, - "BodyMovements.Jumping.Leap_Right_and_Catch": 465, - "BodyMovements.Jumping.Regular_Jump": 466, - "BodyMovements.Jumping.Jump_Over_Obstacle_2": 467, - "BodyMovements.Jumping.Back_Jump": 468, - "BodyMovements.Jumping.Jumping_Down": 470, - "BodyMovements.Jumping.Jump_Over_Obstacle": 471, - "BodyMovements.Jumping.Jump_Over_Obstacle_1": 472, - "BodyMovements.HangingfromLedge.Quad_Jump_Left": 473, - "BodyMovements.HangingfromLedge.Quad_Jump_Up": 474, - "BodyMovements.HangingfromLedge.Quad_Climb_Right": 475, - "BodyMovements.HangingfromLedge.Hang_and_Push_with_Foot": 476, - "BodyMovements.HangingfromLedge.Rope_Hang_Idle": 477, - "BodyMovements.HangingfromLedge.Bar_Hang_Idle": 478, - "BodyMovements.HangingfromLedge.Upside_Down_Rope_Hang": 479, - "BodyMovements.HangingfromLedge.Upside_Down_Rope_Hang_1": 480, - "BodyMovements.HangingfromLedge.Upside_Down_Rope_Hang_2": 481, - "BodyMovements.HangingfromLedge.Grab_Wall_Midair_Idle": 482, - "BodyMovements.HangingfromLedge.Slow_Bar_Hang_Left": 483, - "BodyMovements.HangingfromLedge.Slow_Bar_Hang_Right": 484, - "BodyMovements.HangingfromLedge.Jump_and_Hang_on_Bar": 485, - "BodyMovements.HangingfromLedge.Wall_Support_to_Step_Down": 486, - "BodyMovements.FallingFreely.Climb_Attempt_and_Fall_3": 487, - "BodyMovements.FallingFreely.Climb_Attempt_and_Fall_4": 488, - "BodyMovements.FallingFreely.Climb_Attempt_and_Fall_5": 489, - "BodyMovements.HangingfromLedge.Fall_Down": 490, - "BodyMovements.HangingfromLedge.Fall_from_Bar": 491, - "BodyMovements.HangingfromLedge.Wall_Support_Jump_to_Ground": 492, - "BodyMovements.HangingfromLedge.Jump_Down_from_Wall": 493, - "BodyMovements.HangingfromLedge.Swing_on_Rope_to_Ground": 494, - "BodyMovements.HangingfromLedge.Grab_Bar_and_Swing_Forward": 495, - "BodyMovements.HangingfromLedge.Rope_Hang_Backflip_to_Crouch": 496, - "BodyMovements.Climbing.climbing_down_wall": 497, - "BodyMovements.FallingFreely.Climb_Attempt_and_Fall": 498, - "BodyMovements.FallingFreely.Climb_Attempt_and_Fall_1": 499, - "BodyMovements.FallingFreely.Climb_Attempt_and_Fall_2": 500, - "BodyMovements.FallingFreely.Leap_of_Faith": 501, - "BodyMovements.FallingFreely.Fall1": 502, - "BodyMovements.FallingFreely.Fall2": 503, - "BodyMovements.FallingFreely.Fall3": 504, - "BodyMovements.FallingFreely.Fall4": 505, - "BodyMovements.FallingFreely.Dive_Down_and_Land": 506, - "BodyMovements.FallingFreely.Dive_Down_and_Land_1": 507, - "BodyMovements.FallingFreely.Dive_Down_and_Land_2": 508, - "WalkAndRun.Running.Lean_Forward_Sprint": 509, - "WalkAndRun.Running.Standard_Forward_Charge": 510, - "WalkAndRun.Running.Rifle_Charge": 511, - "WalkAndRun.Running.Male_Head_Down_Charge": 512, - "WalkAndRun.Running.Female_Head_Down_Charge": 513, - "WalkAndRun.Running.Female_Bow_Charge_Left_Hand": 514, - "WalkAndRun.Running.Female_Throwing_Stance_Charge": 515, - "WalkAndRun.Running.slide_light": 516, - "WalkAndRun.Running.slide_right": 517, - "WalkAndRun.Running.sliding_rool": 518, - "WalkAndRun.Running.sliding_stumble": 519, - "WalkAndRun.CrouchWalking.Crouch_Walk_with_Torch": 520, - "WalkAndRun.CrouchWalking.Crouch_Walk_Left_with_Torch": 521, - "WalkAndRun.CrouchWalking.Crouch_Walk_Right_with_Torch": 522, - "WalkAndRun.CrouchWalking.Cautious_Crouch_Walk_Backward": 523, - "WalkAndRun.CrouchWalking.Cautious_Crouch_Walk_Forward": 524, - "WalkAndRun.CrouchWalking.Cautious_Crouch_Walk_Left": 525, - "WalkAndRun.CrouchWalking.Cautious_Crouch_Walk_Right": 526, - "WalkAndRun.CrouchWalking.Crouch_Walk_Left_with_Gun": 527, - "WalkAndRun.CrouchWalking.Walk_Left_with_Gun": 528, - "WalkAndRun.CrouchWalking.Walk_Backward_with_Gun": 529, - "WalkAndRun.Running.run_fast_3": 530, - "WalkAndRun.Running.Sprint_and_Sudden_Stop": 531, - "WalkAndRun.Running.run_fast_4": 532, - "WalkAndRun.Running.run_fast_5": 533, - "WalkAndRun.Running.run_fast_6": 534, - "WalkAndRun.Running.run_fast_7": 535, - "WalkAndRun.Running.run_fast_8": 536, - "WalkAndRun.Running.run_fast_9": 537, - "WalkAndRun.Running.run_fast_10": 538, - "WalkAndRun.Running.run_fast_2": 539, - "WalkAndRun.Walking.Injured_Walk_Backward": 540, - "WalkAndRun.Walking.Walk_Backward_with_Gun_1": 541, - "WalkAndRun.Walking.Walk_Backward_with_Grenade": 542, - "WalkAndRun.Walking.Step_Back": 543, - "WalkAndRun.Walking.Walk_Backward": 544, - "WalkAndRun.Walking.Walk_Backward_with_Bow": 545, - "WalkAndRun.Walking.Walk_Backward_with_Sword": 546, - "WalkAndRun.Walking.Walk_Backward_with_Bow_1": 547, - "WalkAndRun.Walking.Walk_Backward_with_Sword_Shield": 548, - "WalkAndRun.Walking.Crawl_Backward": 549, - "WalkAndRun.Walking.Carry_Heavy_Cannon_Forward": 550, - "WalkAndRun.Walking.Carry_Heavy_Object_Walk": 551, - "WalkAndRun.Walking.Carry_Water_Bucket_Walk": 552, - "WalkAndRun.Walking.Elderly_Shaky_Walk": 553, - "WalkAndRun.Walking.Funky_Walk": 554, - "WalkAndRun.Walking.Limping_Walk_1": 555, - "WalkAndRun.Walking.Limping_Walk_2": 556, - "WalkAndRun.Walking.Limping_Walk_3": 557, - "WalkAndRun.Walking.Limping_Walk": 558, - "WalkAndRun.Walking.Sneaky_Walk": 559, - "WalkAndRun.Walking.Spear_Walk": 560, - "WalkAndRun.Walking.Step_Hip_Hop_Dance": 561, - "WalkAndRun.Walking.Stumble_Walk": 562, - "WalkAndRun.Walking.Stylish_Walk": 563, - "WalkAndRun.Walking.Tightrope_Walk": 564, - "WalkAndRun.Walking.Walk_with_Umbrella": 565, - "WalkAndRun.Walking.walking_2": 566, - "WalkAndRun.Walking.Walk_with_Walker_Support": 567, - "WalkAndRun.Swimming.Swim_Idle": 568, - "WalkAndRun.Swimming.Swim_Forward": 569, - "WalkAndRun.Swimming.swimming_to_edge": 570, - "WalkAndRun.TurningAround.Run_Turn_Left": 571, - "WalkAndRun.TurningAround.Walk_Turn_Left": 572, - "WalkAndRun.TurningAround.Rifle_Turn_Left": 573, - "WalkAndRun.TurningAround.Walk_Turn_Left_with_Weapon": 574, - "WalkAndRun.TurningAround.Combat_Idle_Turn_Left": 575, - "WalkAndRun.TurningAround.Idle_Turn_Left": 576, - "WalkAndRun.TurningAround.Idle_Step_Turn_Left": 577, - "WalkAndRun.TurningAround.Idle_Torch_Turn_Left": 578, - "WalkAndRun.TurningAround.Depressed_Full_Turn_Left": 579, - "WalkAndRun.TurningAround.Sword_and_Shield_Alert_Turn_Left": 580, - "WalkAndRun.TurningAround.Run_Sharp_Turn_Right": 581, - "WalkAndRun.TurningAround.Run_Turn_Right": 582, - "WalkAndRun.TurningAround.Walk_Turn_Right": 583, - "WalkAndRun.TurningAround.Walk_Turn_Right_Female": 584, - "WalkAndRun.TurningAround.Rifle_Aim_Turn_Right": 585, - "WalkAndRun.TurningAround.Idle_Turn_Right": 586, - "WalkAndRun.TurningAround.Walk_Turn_Right_Idle_Style": 587, - "WalkAndRun.TurningAround.Frustrated_Turn_Right": 588, - "WalkAndRun.TurningAround.Alert_Quick_Turn_Right": 589, - "WalkAndRun.TurningAround.Sword_and_Shield_Alert_Turn_Right": 590, - "Dancing.Dancing.Hip_Hop_Dance": 591, - "Dancing.Dancing.Hip_Hop_Dance_1": 592, - "Dancing.Dancing.Hip_Hop_Dance_2": 593, - "Dancing.Dancing.Hip_Hop_Dance_3": 594, - "Dancing.Dancing.jazz_danc": 595, - "Dancing.Dancing.ymca_dance": 596, - "Dancing.Dancing.Hip_Hop_Dance_4": 597, - "DailyActions.WorkingOut.kettlebell_swing_1": 598, - "DailyActions.Idle.Idle_15": 599, - "BodyMovements.PerformingStunt.Backflip_inplace": 601, - "BodyMovements.PerformingStunt.Backflip_Sweep_Kick_inplace": 604, - "BodyMovements.Jumping.Back_Jump_inplace": 605, - "WalkAndRun.Running.BackLeft_run_inplace": 606, - "WalkAndRun.Running.BackRight_Run_inplace": 607, - "Fighting.GettingHit.BeHit_FlyUp_inplace": 608, - "Fighting.Punching.Boxing_Practice_inplace": 609, - "WalkAndRun.Walking.Carry_Heavy_Cannon_Forward_inplace": 610, - "WalkAndRun.Walking.Carry_Heavy_Object_Walk_inplace": 611, - "WalkAndRun.Walking.Carry_Water_Bucket_Walk_inplace": 612, - "WalkAndRun.Walking.Casual_Walk_inplace": 613, - "WalkAndRun.CrouchWalking.Cautious_Crouch_Walk_Backward_inplace": 615, - "WalkAndRun.CrouchWalking.Cautious_Crouch_Walk_Forward_inplace": 616, - "WalkAndRun.CrouchWalking.Cautious_Crouch_Walk_Left_inplace": 617, - "WalkAndRun.CrouchWalking.Cautious_Crouch_Walk_Right_inplace": 618, - "BodyMovements.Climbing.Climb_Left_with_Both_Limbs_inplace": 619, - "BodyMovements.Climbing.Climb_Right_with_Both_Limbs_inplace": 620, - "WalkAndRun.Walking.Confident_Strut_inplace": 621, - "WalkAndRun.Walking.Crawl_Backward_inplace": 622, - "WalkAndRun.CrouchWalking.Crouch_Walk_Left_with_Gun_inplace": 623, - "WalkAndRun.CrouchWalking.Crouch_Walk_Left_with_Torch_inplace": 624, - "WalkAndRun.CrouchWalking.Crouch_Walk_Right_with_Torch_inplace": 625, - "WalkAndRun.Walking.Elderly_Shaky_Walk_inplace": 626, - "WalkAndRun.Running.Female_Bow_Charge_Left_Hand_inplace": 627, - "WalkAndRun.Running.Female_Throwing_Stance_Charge_inplace": 628, - "WalkAndRun.Walking.Flirty_Strut_inplace": 629, - "Fighting.Transitioning.ForwardLeft_Run_Fight_inplace": 630, - "Fighting.Transitioning.ForwardRight_Run_Fight_inplace": 631, - "WalkAndRun.Walking.Funky_Walk_inplace": 632, - "BodyMovements.Acting.Handbag_Walk_inplace": 635, - "WalkAndRun.Running.Hello_Run_inplace": 636, - "WalkAndRun.Walking.Injured_Walk_inplace": 637, - "WalkAndRun.Walking.Injured_Walk_Backward_inplace": 638, - "BodyMovements.Acting.Jazz_Hands_inplace": 639, - "BodyMovements.Jumping.Jump_Over_Obstacle_inplace": 640, - "BodyMovements.Jumping.Jump_Over_Obstacle_1_inplace": 641, - "BodyMovements.Jumping.Jump_Over_Obstacle_2_inplace": 642, - "WalkAndRun.Running.Jump_Run_inplace": 643, - "WalkAndRun.Running.Lean_Forward_Sprint_inplace": 644, - "WalkAndRun.Walking.Limping_Walk_inplace": 645, - "WalkAndRun.Walking.Limping_Walk_1_inplace": 646, - "WalkAndRun.Walking.Limping_Walk_2_inplace": 647, - "WalkAndRun.Walking.Limping_Walk_3_inplace": 648, - "Fighting.Punching.Lunge_Roundhouse_Kick_inplace": 649, - "BodyMovements.Acting.Mummy_Stagger_inplace": 650, - "BodyMovements.VaultingOverObstacle.Parkour_Vault_with_Roll_inplace": 651, - "WalkAndRun.Walking.Proud_Strut_inplace": 652, - "WalkAndRun.Walking.Red_Carpet_Walk_inplace": 653, - "WalkAndRun.Running.Rifle_Charge_inplace": 654, - "BodyMovements.Acting.Run_and_Leap_inplace": 656, - "WalkAndRun.Running.run_fast_10_inplace": 657, - "WalkAndRun.Running.run_fast_2_inplace": 658, - "WalkAndRun.Running.run_fast_3_inplace": 659, - "WalkAndRun.Running.run_fast_4_inplace": 660, - "WalkAndRun.Running.run_fast_5_inplace": 661, - "WalkAndRun.Running.run_fast_6_inplace": 662, - "WalkAndRun.Running.run_fast_7_inplace": 663, - "WalkAndRun.Running.run_fast_8_inplace": 664, - "WalkAndRun.Running.run_fast_9_inplace": 665, - "Fighting.Transitioning.Running_Reload_inplace": 666, - "WalkAndRun.Walking.Run_to_Walk_Transition_inplace": 667, - "WalkAndRun.Walking.Skip_Forward_inplace": 668, - "WalkAndRun.Walking.Slow_Orc_Walk_inplace": 669, - "Fighting.Transitioning.Slow_Walk_Reload_inplace": 670, - "WalkAndRun.Walking.Sneaky_Walk_inplace": 671, - "WalkAndRun.Walking.Spear_Walk_inplace": 672, - "WalkAndRun.Running.Standard_Forward_Charge_inplace": 673, - "WalkAndRun.Walking.Stumble_Walk_inplace": 674, - "WalkAndRun.Walking.Stylish_Walk_inplace": 675, - "WalkAndRun.Walking.Texting_Walk_inplace": 676, - "WalkAndRun.Walking.Tightrope_Walk_inplace": 677, - "WalkAndRun.Walking.Unsteady_Walk_inplace": 678, - "WalkAndRun.Walking.Walk_Backward_inplace": 679, - "Fighting.AttackingwithWeapon.Walk_Backward_While_Shooting_inplace": 680, - "WalkAndRun.Walking.Walk_Backward_with_Bow_inplace": 681, - "WalkAndRun.Walking.Walk_Backward_with_Bow_1_inplace": 682, - "Fighting.AttackingwithWeapon.Walk_Backward_with_Bow_Aimed_inplace": 683, - "WalkAndRun.Walking.Walk_Backward_with_Grenade_inplace": 684, - "WalkAndRun.CrouchWalking.Walk_Backward_with_Gun_inplace": 685, - "WalkAndRun.Walking.Walk_Backward_with_Gun_1_inplace": 686, - "WalkAndRun.Walking.Walk_Backward_with_Sword_inplace": 687, - "WalkAndRun.Walking.Walk_Fight_Back_inplace": 688, - "WalkAndRun.Walking.Walk_Fight_Forward_inplace": 689, - "Fighting.AttackingwithWeapon.Walk_Forward_While_Shooting_inplace": 690, - "Fighting.AttackingwithWeapon.Walk_Forward_with_Bow_Aimed_inplace": 691, - "WalkAndRun.Walking.walking_2_inplace": 692, - "WalkAndRun.Walking.Walking_with_Phone_inplace": 693, - "WalkAndRun.CrouchWalking.Walk_Left_with_Gun_inplace": 694, - "WalkAndRun.Walking.Walk_with_Umbrella_inplace": 695, - "WalkAndRun.Walking.Walk_with_Walker_Support_inplace": 696 - }, - "byName": { - "Idle": 0, - "Walking_Woman": 1, - "Alert": 2, - "Arise": 3, - "Attack": 4, - "BackLeft_run": 5, - "BackRight_Run": 6, - "BeHit_FlyUp": 7, - "Dead": 8, - "ForwardLeft_Run_Fight": 9, - "ForwardRight_Run_Fight": 10, - "Idle_02": 11, - "Idle_03": 12, - "Jump_Run": 13, - "Run_02": 14, - "Run_03": 15, - "RunFast": 16, - "Skill_01": 17, - "Skill_02": 18, - "Skill_03": 19, - "Walk_Fight_Back": 20, - "Walk_Fight_Forward": 21, - "FunnyDancing_01": 22, - "FunnyDancing_02": 23, - "FunnyDancing_03": 24, - "Agree_Gesture": 25, - "Angry_Stomp": 26, - "Big_Heart_Gesture": 27, - "Big_Wave_Hello": 28, - "Call_Gesture": 29, - "Casual_Walk": 30, - "Catching_Breath": 31, - "Chair_Sit_Idle_F": 32, - "Chair_Sit_Idle_M": 33, - "Checkout_Gesture": 34, - "Clapping_Run": 35, - "Confused_Scratch": 36, - "Discuss_While_Moving": 37, - "Dozing_Elderly": 38, - "Excited_Walk_F": 39, - "Excited_Walk_M": 40, - "Formal_Bow": 41, - "Gentlemans_Bow": 42, - "Handbag_Walk": 43, - "Happy_jump_f": 44, - "Indoor_Play": 45, - "Jump_Rope": 46, - "Listening_Gesture": 47, - "Mirror_Viewing": 48, - "Motivational_Cheer": 49, - "Phone_Call_Gesture": 50, - "Shouting_Angrily": 51, - "Sit_to_Stand_Transition_F": 52, - "Sit_to_Stand_Transition_M": 53, - "Squat_Stance": 54, - "Stage_Walk": 55, - "Stand_and_Chat": 56, - "Stand_to_Sit_Transition_M": 57, - "Step_to_Sit_Transition": 58, - "Victory_Cheer": 59, - "Walk_to_Sit": 60, - "happy_jump_m": 61, - "penguin_walk": 62, - "Arm_Circle_Shuffle": 63, - "All_Night_Dance": 64, - "Bass_Beats": 65, - "Boom_Dance": 66, - "Bubble_Dance": 67, - "Cherish_Pop_Dance": 68, - "Crystal_Beads": 69, - "Cardio_Dance": 70, - "Denim_Pop_Dance": 71, - "Dont_You_Dare": 72, - "Fast_Lightning": 73, - "Gangnam_Groove": 74, - "Indoor_Swing": 75, - "Love_You_Pop_Dance": 76, - "Magic_Genie": 77, - "Not_Your_Mom": 78, - "OMG_Groove": 79, - "Pop_Dance_LSA2": 80, - "Pod_Baby_Groove": 81, - "Shake_It_Off_Dance": 82, - "Superlove_Pop_Dance": 83, - "You_Groove": 84, - "Axe_Stance": 85, - "Basic_Jump": 86, - "Boxing_Practice": 87, - "Chest_Pound_Taunt": 88, - "Combat_Stance": 89, - "Counterstrike": 90, - "Double_Blade_Spin": 91, - "Double_Combo_Attack": 92, - "Dodge_and_Counter": 93, - "Flying_Fist_Kick": 94, - "Gun_Hold_Left_Turn": 95, - "Kung_Fu_Punch": 96, - "Left_Slash": 97, - "Run_and_Shoot": 98, - "Reaping_Swing": 99, - "Rightward_Spin": 100, - "Sword_Shout": 101, - "Sword_Judgment": 102, - "Simple_Kick": 103, - "Side_Shot": 104, - "Triple_Combo_Attack": 105, - "Confident_Walk": 106, - "Confident_Strut": 107, - "Flirty_Strut": 108, - "Groovy_Walk": 109, - "Hello_Run": 110, - "Injured_Walk": 111, - "Monster_Walk": 112, - "Mummy_Stagger": 113, - "Proud_Strut": 114, - "Quick_Walk": 115, - "Run_to_Walk_Transition": 116, - "Red_Carpet_Walk": 117, - "Skip_Forward": 118, - "Slow_Orc_Walk": 119, - "Touch_and_Run": 120, - "Thoughtful_Walk": 121, - "Texting_Walk": 122, - "Unsteady_Walk": 123, - "Walking_with_Phone": 124, - "Charged_Spell_Cast": 125, - "Charged_Spell_Cast_1": 126, - "Charged_Ground_Slam": 127, - "Heavy_Hammer_Swing": 128, - "mage_soell_cast": 129, - "mage_soell_cast_1": 130, - "mage_soell_cast_2": 131, - "mage_soell_cast_3": 132, - "mage_soell_cast_4": 133, - "mage_soell_cast_5": 134, - "mage_soell_cast_6": 135, - "mage_soell_cast_7": 136, - "mage_soell_cast_8": 137, - "Block1": 138, - "Block2": 139, - "Block3": 140, - "Block4": 141, - "Block5": 142, - "Block6": 143, - "Block8": 144, - "Block9": 145, - "Block10": 146, - "Sword_Parry": 147, - "Sword_Parry_Backward": 148, - "Two_Handed_Parry": 149, - "Hit_Reaction_with_Bow": 150, - "Sword_Parry_Backward_1": 151, - "Sword_Parry_Backward_2": 152, - "Sword_Parry_Backward_3": 153, - "Sword_Parry_Backward_4": 154, - "Sword_Parry_Backward_5": 155, - "Stand_Dodge": 156, - "Stand_Dodge_1": 157, - "Roll_Dodge": 158, - "Roll_Dodge_1": 159, - "Roll_Dodge_2": 160, - "Roll_Dodge_3": 161, - "Stand_Dodge_2": 162, - "Roll_Dodge_4": 163, - "Stand_Dodge_3": 164, - "Kneeling_Reload": 165, - "Running_Reload": 166, - "Slow_Walk_Reload": 167, - "Prone_Reload": 168, - "Forward_Reload_Subtle": 169, - "Standing_Reload": 170, - "Hit_Reaction_to_Waist": 171, - "Electrocution_Reaction": 172, - "Slap_Reaction": 173, - "Face_Punch_Reaction": 174, - "Face_Punch_Reaction_1": 175, - "Face_Punch_Reaction_2": 176, - "Gunshot_Reaction": 177, - "Hit_Reaction": 178, - "Hit_Reaction_1": 179, - "Shot_in_the_Back_and_Fall": 180, - "Electrocuted_Fall": 181, - "Shot_and_Blown_Back": 182, - "Shot_and_Fall_Backward": 183, - "Shot_and_Fall_Forward": 184, - "Shot_and_Slow_Fall_Backward": 185, - "Strangled_and_Fall_Forward": 186, - "Knock_Down": 187, - "Fall_Dead_from_Abdominal_Injury": 188, - "dying_backwards": 189, - "Knock_Down_1": 190, - "Left_Jab_from_Guard": 191, - "Right_Jab_from_Guard": 192, - "Left_Hook_from_Guard": 193, - "Right_Uppercut_from_Guard": 194, - "Right_Upper_Hook_from_Guard": 195, - "Left_Uppercut_from_Guard": 196, - "Left_Short_Hook_from_Guard": 197, - "Punch_Combo": 198, - "Weapon_Combo": 199, - "Punch_Combo_1": 200, - "Punch_Combo_2": 201, - "Weapon_Combo_1": 202, - "Punch_Combo_3": 203, - "Punch_Combo_4": 204, - "Punch_Combo_5": 205, - "Spartan_Kick": 206, - "Roundhouse_Kick": 207, - "Lunge_Roundhouse_Kick": 208, - "Boxing_Guard_Right_Straight_Kick": 209, - "Boxing_Guard_Prep_Straight_Punch": 210, - "Boxing_Guard_Step_Knee_Strike": 211, - "Elbow_Strike": 212, - "Leg_Sweep": 213, - "Punch_Forward_with_Both_Fists": 214, - "High_Kick": 215, - "Lunge_Spin_Kick": 216, - "Sweeping_Kick": 217, - "Step_in_High_Kick": 218, - "Right_Hand_Sword_Slash": 219, - "Shield_Push_Left": 220, - "Charged_Upward_Slash": 221, - "Draw_and_Shoot_from_Back": 222, - "Draw_and_Shoot_from_Back_1": 223, - "Archery_Shot": 224, - "Archery_Shot_1": 225, - "Archery_Shot_2": 226, - "Archery_Shot_3": 227, - "Walk_Forward_with_Bow_Aimed": 228, - "Draw_and_Shoot_from_Back_2": 229, - "Walk_Backward_with_Bow_Aimed": 230, - "Archery_Aim_with_Lateral_Scan": 231, - "Cowboy_Quick_Draw_Shooting": 232, - "Walk_Backward_While_Shooting": 233, - "Walk_Forward_While_Shooting": 234, - "Forward_Roll_and_Fire": 235, - "Draw_and_Shoot_Left": 236, - "Charged_Axe_Chop": 237, - "Axe_Spin_Attack": 238, - "Crouch_Pull_and_Throw": 239, - "Thrust_Slash": 240, - "Weapon_Combo_2": 241, - "Charged_Slash": 242, - "Idle_3": 243, - "Idle_4": 244, - "Idle_5": 245, - "Idle_6": 246, - "Idle_7": 247, - "Idle_8": 248, - "Idle_9": 249, - "Idle_10": 250, - "Idle_11": 251, - "Idle_12": 252, - "Idle_13": 253, - "Idle_14": 254, - "Angry_Ground_Stomp": 255, - "Angry_Ground_Stomp_1": 256, - "Angry_Ground_Stomp_2": 257, - "CrouchLookAroundBow": 258, - "Step_Forward_and_Push": 259, - "Push_Forward_and_Stop": 260, - "Push_and_Walk_Forward": 261, - "Crouch_and_Push_Forward": 262, - "Sleep_on_Desk": 263, - "Cough_While_Sleeping": 264, - "Groan_Holding_Stomach_in_Sleep": 265, - "Lie_Down_Hands_Spread": 266, - "Sleep_Normally": 267, - "Sit_and_Doze_Off": 268, - "sleep": 269, - "Toss_and_Turn": 270, - "Wake_Up_and_Look_Up": 271, - "Lie_on_Chair_Sunbathe_and_Sleep": 272, - "Male_Run_Forward_Pick_Up_Left": 273, - "Female_Crouch_Pick_Up_Place_Side": 274, - "Female_Run_Forward_Pick_Up_Right": 275, - "Male_Bend_Over_Pick_Up": 276, - "Female_Crouch_Pick_Fruit_Basket_Stand": 277, - "Female_Stand_Pick_Fruit_Basket": 278, - "Female_Crouch_Pick_Gun_Point_Forward": 279, - "Female_Crouch_Pick_Throw_Forward": 280, - "Female_Bend_Over_Pick_Up_Inspect": 281, - "Female_Walk_Pick_Put_In_Pocket": 282, - "Pull_Radish": 283, - "Collect_Object": 284, - "open_door": 285, - "open_door_1": 286, - "open_door_2": 287, - "open_door_3": 288, - "open_door_4": 289, - "Wave_One_Hand": 290, - "Wave_for_Help": 291, - "Gesture_with_Hand_on_Gun": 292, - "Wave_for_Help_1": 293, - "Wave_for_Help_2": 294, - "Wave_for_Help_3": 295, - "Wave_for_Help_4": 296, - "Personalized_Gesture": 297, - "Cheer_with_Both_Hands_Up": 298, - "Stand_Clap_and_Sit_Down": 299, - "Sit_Cheer_with_Left_Hand": 300, - "Cheer_with_Both_Hands_1": 301, - "Stand_Wave_and_Sit_Down": 302, - "Cheer_with_Both_Hands": 303, - "Seated_Fist_Pump": 304, - "Stand_Cheer_and_Sit_Down": 305, - "Cheer_with_One_Hand_Up": 306, - "Sitting_Answering_Questions": 307, - "Talk_Passionately": 308, - "Talk_with_Left_Hand_on_Hip": 309, - "Talk_with_Left_Hand_Raised": 310, - "Stand_Talking_Angry": 311, - "Phone_Conversation": 312, - "Talk_with_Hands_Open": 313, - "Talk_with_Right_Hand_Open": 314, - "Hand_on_Hip_Gesture": 315, - "Headache_Relief": 316, - "Shrug": 317, - "Scheming_Hand_Rub": 318, - "air_squat": 319, - "bicep_curl": 320, - "bicycle_crunch": 321, - "circle_crunch": 322, - "golf_drive": 323, - "idle_to_push_up": 324, - "jump_push_up": 325, - "jumping_jacks": 326, - "kettlebell_swing": 327, - "push_up_to_idle": 328, - "push_up": 329, - "situps": 330, - "Sumo_High_Pull": 331, - "Look_Around_Dumbfounded": 333, - "Lower_Weapon_Look_Raise": 334, - "Axe_Breathe_and_Look_Around": 335, - "Long_Breathe_and_Look_Around": 336, - "Torch_Look_Around": 337, - "Short_Breathe_and_Look_Around": 338, - "Walking_Scan_with_Sudden_Look_Back": 339, - "Crawl_and_Look_Back": 340, - "Walk_Slowly_and_Look_Around": 341, - "Stand_and_Drink": 342, - "Sit_and_Drink": 343, - "Stand_Up1": 344, - "Stand_Up2": 345, - "Stand_Up3": 346, - "Stand_Up4": 347, - "Stand_Up5": 348, - "Stand_Up6": 349, - "Stand_Up7": 350, - "Stand_Up8": 351, - "Stand_Up9": 352, - "Stand_Up10": 353, - "Sitting_Clap": 354, - "Sit_Finger_Wag_No": 355, - "Sit_Hands_on_Head_Lean_Back": 356, - "Sit_Thumbs_Up_Right": 357, - "Sit_Shout_Hands_on_Mouth": 358, - "Look_Back_and_Sit": 359, - "Sit_to_standTransition_Female_2": 360, - "Sit_Dodge": 361, - "Sit_Cross_Legged": 362, - "Sit_Cross_Legged_on_Floor": 363, - "Sit_on_Chair_Arms_Crossed": 364, - "Kneel_on_One_Knee_and_Stand": 365, - "falling_down": 366, - "SideLying_Reach_Help": 367, - "Angry_To_Tantrum_Sit": 368, - "Lie_Back_Leg_Swing": 369, - "Stand_To_Side_Lying": 370, - "Sit_Lie_Bed": 371, - "Prone_Reach_Help": 372, - "Handstand_Flip": 375, - "Punch_Pose": 376, - "Relax_arms_then_strike_battle_pose": 377, - "Large_step_then_high_kick": 378, - "Side_jumps_in_horse_stance": 379, - "Step_Right_for_Exercise": 381, - "Jump_and_Slam_Back_Down": 382, - "Quick_Step_and_Spin_Dodge": 384, - "Boxing_Warmup": 385, - "Zombie_Scream": 386, - "Half_Squat_with_Thumb_Up": 387, - "Show_Both_Arm_Muscles": 388, - "Grip_and_Throw_Down": 389, - "Stand_on_Pole_and_Balance": 390, - "Head_Hold_in_Pain": 391, - "Ground_Flip_and_Sweep_Up": 392, - "baseball_pitching": 393, - "Backflip_and_Hooks": 394, - "Breakdance_1990": 395, - "Burpee_Exercise": 396, - "360_Power_Spin_Jump": 397, - "Crouch_Charge_and_Throw": 398, - "Step_Step_Turn_Kick": 399, - "Sprint_Roll_and_Flip": 401, - "Run_and_Leap": 402, - "Victory_Fist_Pump": 403, - "Crouch_and_Step_Back": 404, - "Joyful_Dance_with_Hand_Sway": 405, - "Thomas_Flair_to_Jump_Up": 406, - "Wall_Push_Jump_and_Flip": 407, - "Jazz_Hands": 408, - "Finger_Wag_No": 409, - "Kick_a_Soccer_Ball": 410, - "Neck_Slashing_Gesture": 411, - "victory": 412, - "Backflip_and_Rise": 413, - "Double_kick_forward": 414, - "Happy_Sway_Standing": 415, - "Hit_in_Back_While_Running": 416, - "Hop_with_Arms_Raised": 417, - "Jump_to_Catch_and_Fall": 419, - "Left_Hand_Bitten_Step_Back": 420, - "Over_Shoulder_Throw": 421, - "Rising_Flying_Kick": 422, - "Vault_with_Rifle": 425, - "Roll_Behind_Cover": 426, - "Vault_and_Land": 427, - "Unarmed_Vault": 428, - "Parkour_Vault": 429, - "Parkour_Vault_with_Roll": 430, - "Parkour_Vault_1": 431, - "Parkour_Vault_2": 432, - "Parkour_Vault_3": 433, - "Fast_Ladder_Climb": 434, - "Ladder_Climb_Finish": 435, - "Ladder_Mount_Start": 436, - "Slow_Ladder_Climb": 437, - "Ladder_Climb_Loop": 438, - "Climb_Left_with_Both_Limbs": 439, - "Climb_Right_with_Both_Limbs": 440, - "Climb_Stairs": 441, - "Fast_Stair_Climb": 442, - "climbing_up_wall": 444, - "diagonal_wall_run": 445, - "Hang_and_Climb_Left": 446, - "Hang_and_Climb_Rght": 447, - "Jump_and_Grab_Wall": 448, - "Climb_Up_Rope": 449, - "Wall_Flip": 450, - "One_Arm_Handstand": 451, - "Backflip": 452, - "Backflip_Sweep_Kick": 453, - "Sweep_Kick": 455, - "Jumping_Head_Scissor_Takedown": 456, - "Jumping_Punch": 457, - "Unicycle_Jump_Dismount": 458, - "Run_Jump_and_Roll": 459, - "Jump_with_Arms_Open": 460, - "Jump_with_Arms_and_Legs_Open": 461, - "Backflip_Jump": 462, - "Run_and_Jump": 463, - "Leap_and_Punch": 464, - "Leap_Right_and_Catch": 465, - "Regular_Jump": 466, - "Jump_Over_Obstacle_2": 467, - "Back_Jump": 468, - "Jumping_Down": 470, - "Jump_Over_Obstacle": 471, - "Jump_Over_Obstacle_1": 472, - "Quad_Jump_Left": 473, - "Quad_Jump_Up": 474, - "Quad_Climb_Right": 475, - "Hang_and_Push_with_Foot": 476, - "Rope_Hang_Idle": 477, - "Bar_Hang_Idle": 478, - "Upside_Down_Rope_Hang": 479, - "Upside_Down_Rope_Hang_1": 480, - "Upside_Down_Rope_Hang_2": 481, - "Grab_Wall_Midair_Idle": 482, - "Slow_Bar_Hang_Left": 483, - "Slow_Bar_Hang_Right": 484, - "Jump_and_Hang_on_Bar": 485, - "Wall_Support_to_Step_Down": 486, - "Climb_Attempt_and_Fall_3": 487, - "Climb_Attempt_and_Fall_4": 488, - "Climb_Attempt_and_Fall_5": 489, - "Fall_Down": 490, - "Fall_from_Bar": 491, - "Wall_Support_Jump_to_Ground": 492, - "Jump_Down_from_Wall": 493, - "Swing_on_Rope_to_Ground": 494, - "Grab_Bar_and_Swing_Forward": 495, - "Rope_Hang_Backflip_to_Crouch": 496, - "climbing_down_wall": 497, - "Climb_Attempt_and_Fall": 498, - "Climb_Attempt_and_Fall_1": 499, - "Climb_Attempt_and_Fall_2": 500, - "Leap_of_Faith": 501, - "Fall1": 502, - "Fall2": 503, - "Fall3": 504, - "Fall4": 505, - "Dive_Down_and_Land": 506, - "Dive_Down_and_Land_1": 507, - "Dive_Down_and_Land_2": 508, - "Lean_Forward_Sprint": 509, - "Standard_Forward_Charge": 510, - "Rifle_Charge": 511, - "Male_Head_Down_Charge": 512, - "Female_Head_Down_Charge": 513, - "Female_Bow_Charge_Left_Hand": 514, - "Female_Throwing_Stance_Charge": 515, - "slide_light": 516, - "slide_right": 517, - "sliding_rool": 518, - "sliding_stumble": 519, - "Crouch_Walk_with_Torch": 520, - "Crouch_Walk_Left_with_Torch": 521, - "Crouch_Walk_Right_with_Torch": 522, - "Cautious_Crouch_Walk_Backward": 523, - "Cautious_Crouch_Walk_Forward": 524, - "Cautious_Crouch_Walk_Left": 525, - "Cautious_Crouch_Walk_Right": 526, - "Crouch_Walk_Left_with_Gun": 527, - "Walk_Left_with_Gun": 528, - "Walk_Backward_with_Gun": 529, - "run_fast_3": 530, - "Sprint_and_Sudden_Stop": 531, - "run_fast_4": 532, - "run_fast_5": 533, - "run_fast_6": 534, - "run_fast_7": 535, - "run_fast_8": 536, - "run_fast_9": 537, - "run_fast_10": 538, - "run_fast_2": 539, - "Injured_Walk_Backward": 540, - "Walk_Backward_with_Gun_1": 541, - "Walk_Backward_with_Grenade": 542, - "Step_Back": 543, - "Walk_Backward": 544, - "Walk_Backward_with_Bow": 545, - "Walk_Backward_with_Sword": 546, - "Walk_Backward_with_Bow_1": 547, - "Walk_Backward_with_Sword_Shield": 548, - "Crawl_Backward": 549, - "Carry_Heavy_Cannon_Forward": 550, - "Carry_Heavy_Object_Walk": 551, - "Carry_Water_Bucket_Walk": 552, - "Elderly_Shaky_Walk": 553, - "Funky_Walk": 554, - "Limping_Walk_1": 555, - "Limping_Walk_2": 556, - "Limping_Walk_3": 557, - "Limping_Walk": 558, - "Sneaky_Walk": 559, - "Spear_Walk": 560, - "Step_Hip_Hop_Dance": 561, - "Stumble_Walk": 562, - "Stylish_Walk": 563, - "Tightrope_Walk": 564, - "Walk_with_Umbrella": 565, - "walking_2": 566, - "Walk_with_Walker_Support": 567, - "Swim_Idle": 568, - "Swim_Forward": 569, - "swimming_to_edge": 570, - "Run_Turn_Left": 571, - "Walk_Turn_Left": 572, - "Rifle_Turn_Left": 573, - "Walk_Turn_Left_with_Weapon": 574, - "Combat_Idle_Turn_Left": 575, - "Idle_Turn_Left": 576, - "Idle_Step_Turn_Left": 577, - "Idle_Torch_Turn_Left": 578, - "Depressed_Full_Turn_Left": 579, - "Sword_and_Shield_Alert_Turn_Left": 580, - "Run_Sharp_Turn_Right": 581, - "Run_Turn_Right": 582, - "Walk_Turn_Right": 583, - "Walk_Turn_Right_Female": 584, - "Rifle_Aim_Turn_Right": 585, - "Idle_Turn_Right": 586, - "Walk_Turn_Right_Idle_Style": 587, - "Frustrated_Turn_Right": 588, - "Alert_Quick_Turn_Right": 589, - "Sword_and_Shield_Alert_Turn_Right": 590, - "Hip_Hop_Dance": 591, - "Hip_Hop_Dance_1": 592, - "Hip_Hop_Dance_2": 593, - "Hip_Hop_Dance_3": 594, - "jazz_danc": 595, - "ymca_dance": 596, - "Hip_Hop_Dance_4": 597, - "kettlebell_swing_1": 598, - "Idle_15": 599, - "Backflip_inplace": 601, - "Backflip_Sweep_Kick_inplace": 604, - "Back_Jump_inplace": 605, - "BackLeft_run_inplace": 606, - "BackRight_Run_inplace": 607, - "BeHit_FlyUp_inplace": 608, - "Boxing_Practice_inplace": 609, - "Carry_Heavy_Cannon_Forward_inplace": 610, - "Carry_Heavy_Object_Walk_inplace": 611, - "Carry_Water_Bucket_Walk_inplace": 612, - "Casual_Walk_inplace": 613, - "Cautious_Crouch_Walk_Backward_inplace": 615, - "Cautious_Crouch_Walk_Forward_inplace": 616, - "Cautious_Crouch_Walk_Left_inplace": 617, - "Cautious_Crouch_Walk_Right_inplace": 618, - "Climb_Left_with_Both_Limbs_inplace": 619, - "Climb_Right_with_Both_Limbs_inplace": 620, - "Confident_Strut_inplace": 621, - "Crawl_Backward_inplace": 622, - "Crouch_Walk_Left_with_Gun_inplace": 623, - "Crouch_Walk_Left_with_Torch_inplace": 624, - "Crouch_Walk_Right_with_Torch_inplace": 625, - "Elderly_Shaky_Walk_inplace": 626, - "Female_Bow_Charge_Left_Hand_inplace": 627, - "Female_Throwing_Stance_Charge_inplace": 628, - "Flirty_Strut_inplace": 629, - "ForwardLeft_Run_Fight_inplace": 630, - "ForwardRight_Run_Fight_inplace": 631, - "Funky_Walk_inplace": 632, - "Handbag_Walk_inplace": 635, - "Hello_Run_inplace": 636, - "Injured_Walk_inplace": 637, - "Injured_Walk_Backward_inplace": 638, - "Jazz_Hands_inplace": 639, - "Jump_Over_Obstacle_inplace": 640, - "Jump_Over_Obstacle_1_inplace": 641, - "Jump_Over_Obstacle_2_inplace": 642, - "Jump_Run_inplace": 643, - "Lean_Forward_Sprint_inplace": 644, - "Limping_Walk_inplace": 645, - "Limping_Walk_1_inplace": 646, - "Limping_Walk_2_inplace": 647, - "Limping_Walk_3_inplace": 648, - "Lunge_Roundhouse_Kick_inplace": 649, - "Mummy_Stagger_inplace": 650, - "Parkour_Vault_with_Roll_inplace": 651, - "Proud_Strut_inplace": 652, - "Red_Carpet_Walk_inplace": 653, - "Rifle_Charge_inplace": 654, - "Run_and_Leap_inplace": 656, - "run_fast_10_inplace": 657, - "run_fast_2_inplace": 658, - "run_fast_3_inplace": 659, - "run_fast_4_inplace": 660, - "run_fast_5_inplace": 661, - "run_fast_6_inplace": 662, - "run_fast_7_inplace": 663, - "run_fast_8_inplace": 664, - "run_fast_9_inplace": 665, - "Running_Reload_inplace": 666, - "Run_to_Walk_Transition_inplace": 667, - "Skip_Forward_inplace": 668, - "Slow_Orc_Walk_inplace": 669, - "Slow_Walk_Reload_inplace": 670, - "Sneaky_Walk_inplace": 671, - "Spear_Walk_inplace": 672, - "Standard_Forward_Charge_inplace": 673, - "Stumble_Walk_inplace": 674, - "Stylish_Walk_inplace": 675, - "Texting_Walk_inplace": 676, - "Tightrope_Walk_inplace": 677, - "Unsteady_Walk_inplace": 678, - "Walk_Backward_inplace": 679, - "Walk_Backward_While_Shooting_inplace": 680, - "Walk_Backward_with_Bow_inplace": 681, - "Walk_Backward_with_Bow_1_inplace": 682, - "Walk_Backward_with_Bow_Aimed_inplace": 683, - "Walk_Backward_with_Grenade_inplace": 684, - "Walk_Backward_with_Gun_inplace": 685, - "Walk_Backward_with_Gun_1_inplace": 686, - "Walk_Backward_with_Sword_inplace": 687, - "Walk_Fight_Back_inplace": 688, - "Walk_Fight_Forward_inplace": 689, - "Walk_Forward_While_Shooting_inplace": 690, - "Walk_Forward_with_Bow_Aimed_inplace": 691, - "walking_2_inplace": 692, - "Walking_with_Phone_inplace": 693, - "Walk_Left_with_Gun_inplace": 694, - "Walk_with_Umbrella_inplace": 695, - "Walk_with_Walker_Support_inplace": 696 - } -} diff --git a/packages/meshy-content-generator/lookups/animation-presets.json b/packages/meshy-content-generator/lookups/animation-presets.json deleted file mode 100644 index 4028acf2..00000000 --- a/packages/meshy-content-generator/lookups/animation-presets.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "description": "Animation presets for different character archetypes", - "presets": { - "hero": { - "description": "Full animation set for playable main characters", - "animations": [ - "Combat_Stance", - "RunFast", - "Kung_Fu_Punch", - "BeHit_FlyUp", - "Dead", - "Basic_Jump", - "Dodge_and_Counter" - ] - }, - "enemy": { - "description": "Standard enemy NPC animation set", - "animations": ["Combat_Stance", "RunFast", "Double_Combo_Attack", "BeHit_FlyUp", "Dead"] - }, - "boss": { - "description": "Enhanced animation set for boss characters", - "animations": [ - "Combat_Stance", - "RunFast", - "Double_Combo_Attack", - "Kung_Fu_Punch", - "BeHit_FlyUp", - "Dead", - "Block1" - ] - }, - "prop": { - "description": "Minimal animation for animated props/hazards", - "animations": ["Idle"] - } - }, - "default": "enemy" -} diff --git a/packages/meshy-content-generator/package.json b/packages/meshy-content-generator/package.json deleted file mode 100644 index ce879ea1..00000000 --- a/packages/meshy-content-generator/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "@jbcom/agentic-meshy", - "version": "0.1.2", - "description": "Declarative Meshy content generation pipelines with a CLI and API.", - "license": "MIT", - "type": "module", - "keywords": [ - "content-generation", - "pipeline", - "meshy", - "cli", - "asset-generation" - ], - "repository": { - "type": "git", - "url": "https://github.com/jbcom/agentic.git", - "directory": "packages/meshy-content-generator" - }, - "homepage": "https://agentic.coach/meshy-content-generator", - "author": "Arcade Cabinet", - "engines": { - "node": ">=20.0.0" - }, - "files": [ - "dist", - "pipelines", - "tasks", - "lookups", - "README.md", - "CHANGELOG.md", - "LICENSE" - ], - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" - }, - "./cli": { - "types": "./dist/cli/index.d.ts", - "import": "./dist/cli/index.js" - } - }, - "bin": { - "content-gen": "./dist/cli/index.js" - }, - "scripts": { - "build": "tsup", - "check": "biome check .", - "dev": "tsx src/api/server.ts", - "lint": "biome check .", - "format": "biome format . --write", - "test": "vitest run", - "test:unit": "vitest run", - "test:record": "POLLY_MODE=record vitest run", - "test:e2e": "playwright test -c e2e/playwright.config.ts", - "test:all": "pnpm test:unit && pnpm test:e2e", - "typecheck": "tsc -p tsconfig.json --noEmit" - }, - "dependencies": { - "@asteasolutions/zod-to-openapi": "^8.4.0", - "@google/model-viewer": "^4.1.0", - "@pollyjs/adapter-fetch": "^6.0.7", - "@pollyjs/core": "^6.0.6", - "@pollyjs/persister-fs": "^6.0.6", - "@scalar/fastify-api-reference": "^1.43.17", - "commander": "^14.0.2", - "dotenv": "^17.2.3", - "fastify": "^5.8.5", - "seedrandom": "^3.0.5", - "three": "^0.172.0", - "zod": "^4.3.6" - }, - "devDependencies": { - "@biomejs/biome": "^2.3.13", - "@playwright/test": "^1.58.0", - "@types/node": "^25.0.10", - "@types/seedrandom": "^3.0.8", - "tsup": "^8.5.1", - "tsx": "^4.21.0", - "typescript": "^5.9.3", - "vitest": "^4.1.0" - } -} diff --git a/packages/meshy-content-generator/pipelines/definitions/brand-image.pipeline.json b/packages/meshy-content-generator/pipelines/definitions/brand-image.pipeline.json deleted file mode 100644 index 8569f1ab..00000000 --- a/packages/meshy-content-generator/pipelines/definitions/brand-image.pipeline.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "brand-image", - "description": "Generate brand imagery from text prompts with download", - "version": "1.0.0", - "steps": [ - { - "id": "generate", - "task": "text-to-image-download" - } - ] -} diff --git a/packages/meshy-content-generator/pipelines/definitions/character-full.pipeline.json b/packages/meshy-content-generator/pipelines/definitions/character-full.pipeline.json deleted file mode 100644 index 040cad50..00000000 --- a/packages/meshy-content-generator/pipelines/definitions/character-full.pipeline.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "character-full", - "description": "Full pipeline: text-to-image → text-to-3d-preview → text-to-3d-refine → rigging → animation", - "version": "1.0.0", - "steps": [ - { - "id": "concept", - "task": "text-to-image", - "skipArtifacts": true, - "inputs": [ - { "name": "prompt", "source": "manifest", "path": "textToImageTask.prompt" }, - { "name": "ai_model", "source": "literal", "value": "nano-banana-pro" } - ] - }, - { - "id": "preview", - "task": "text-to-3d-preview", - "dependsOn": ["concept"], - "skipArtifacts": true, - "inputs": [{ "name": "prompt", "source": "manifest", "path": "textTo3DPreviewTask.prompt" }] - }, - { - "id": "refine", - "task": "text-to-3d-refine", - "dependsOn": ["preview"], - "skipArtifacts": true, - "inputs": [ - { "name": "preview_task_id", "source": "step", "step": "preview", "path": "taskId" }, - { - "name": "texture_prompt", - "source": "manifest", - "path": "textTo3DRefineTask.texturePrompt" - } - ] - }, - { - "id": "rigging", - "task": "rigging", - "dependsOn": ["refine"], - "skipArtifacts": true, - "inputs": [{ "name": "input_task_id", "source": "step", "step": "refine", "path": "taskId" }] - }, - { - "id": "animations", - "task": "animation", - "dependsOn": ["rigging"], - "forEach": { - "source": "manifest", - "path": "animationTask.animations", - "as": "animationName" - }, - "inputs": [{ "name": "rig_task_id", "source": "step", "step": "rigging", "path": "taskId" }] - } - ] -} diff --git a/packages/meshy-content-generator/pipelines/definitions/character.pipeline.json b/packages/meshy-content-generator/pipelines/definitions/character.pipeline.json deleted file mode 100644 index d46ec2cd..00000000 --- a/packages/meshy-content-generator/pipelines/definitions/character.pipeline.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "name": "character", - "description": "Character pipeline: concept → multi-image-to-3d → rigging → animations", - "version": "2.1.0", - "steps": [ - { - "id": "concept", - "task": "text-to-image", - "inputs": [ - { - "name": "prompt", - "source": "manifest", - "path": "textToImageTask.prompt" - }, - { - "name": "ai_model", - "source": "literal", - "value": "nano-banana-pro" - }, - { - "name": "generate_multi_view", - "source": "manifest", - "path": "textToImageTask.generateMultiView", - "default": true - }, - { - "name": "pose_mode", - "source": "manifest", - "path": "textToImageTask.poseMode", - "default": "a-pose" - } - ] - }, - { - "id": "model", - "task": "multi-image-to-3d", - "dependsOn": ["concept"], - "inputs": [ - { - "name": "image_urls", - "source": "step", - "step": "concept", - "path": "images" - } - ] - }, - { - "id": "rigging", - "task": "rigging", - "dependsOn": ["model"], - "inputs": [ - { - "name": "input_task_id", - "source": "step", - "step": "model", - "path": "taskId" - }, - { - "name": "texture_image_url", - "source": "step", - "step": "model", - "path": "textureUrl" - } - ] - }, - { - "id": "animations", - "task": "animation", - "dependsOn": ["rigging"], - "forEach": { - "source": "manifest", - "path": "animationTask.animations", - "as": "animationName" - }, - "inputs": [ - { - "name": "rig_task_id", - "source": "step", - "step": "rigging", - "path": "taskId" - } - ] - } - ] -} diff --git a/packages/meshy-content-generator/pipelines/definitions/prop.pipeline.json b/packages/meshy-content-generator/pipelines/definitions/prop.pipeline.json deleted file mode 100644 index a6589929..00000000 --- a/packages/meshy-content-generator/pipelines/definitions/prop.pipeline.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "prop", - "description": "Prop pipeline: concept → multi-image-to-3d (no rigging or animations)", - "version": "1.1.0", - "steps": [ - { - "id": "concept", - "task": "text-to-image", - "inputs": [ - { - "name": "prompt", - "source": "manifest", - "path": "textToImageTask.prompt" - }, - { - "name": "ai_model", - "source": "literal", - "value": "nano-banana-pro" - }, - { - "name": "generate_multi_view", - "source": "manifest", - "path": "textToImageTask.generateMultiView", - "default": true - }, - { - "name": "pose_mode", - "source": "manifest", - "path": "textToImageTask.poseMode", - "default": "a-pose" - } - ] - }, - { - "id": "model", - "task": "multi-image-to-3d", - "dependsOn": ["concept"], - "inputs": [ - { - "name": "image_urls", - "source": "step", - "step": "concept", - "path": "images" - }, - { - "name": "target_polycount", - "source": "manifest", - "path": "multiImageTo3DTask.targetPolycount", - "default": 10000 - }, - { - "name": "symmetry_mode", - "source": "manifest", - "path": "multiImageTo3DTask.symmetryMode", - "default": "off" - } - ] - } - ] -} diff --git a/packages/meshy-content-generator/project.json b/packages/meshy-content-generator/project.json deleted file mode 100644 index 1f5af5c2..00000000 --- a/packages/meshy-content-generator/project.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "meshy-content-generator", - "tags": ["lang:ts", "scope:meshy"], - "targets": { - "build": { - "command": "tsup", - "options": { "cwd": "{projectRoot}" } - }, - "test": { - "command": "vitest run", - "options": { "cwd": "{projectRoot}" } - }, - "lint": { - "command": "biome lint src/", - "options": { "cwd": "{projectRoot}" } - }, - "typecheck": { - "command": "tsc --noEmit", - "options": { "cwd": "{projectRoot}" } - } - } -} diff --git a/packages/meshy-content-generator/sonar-project.properties b/packages/meshy-content-generator/sonar-project.properties deleted file mode 100644 index d996dad4..00000000 --- a/packages/meshy-content-generator/sonar-project.properties +++ /dev/null @@ -1,10 +0,0 @@ -sonar.projectKey=jbcom_agentic_meshy -sonar.organization=jbcom -sonar.projectName=@jbcom/agentic-meshy - -sonar.sources=src -sonar.tests=test -sonar.sourceEncoding=UTF-8 - -sonar.javascript.lcov.reportPaths=coverage/lcov.info -sonar.coverage.exclusions=**/dist/**,**/node_modules/**,**/*.test.ts,**/*.config.ts diff --git a/packages/meshy-content-generator/src/__tests__/api.test.ts b/packages/meshy-content-generator/src/__tests__/api.test.ts deleted file mode 100644 index 72bd119b..00000000 --- a/packages/meshy-content-generator/src/__tests__/api.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import { describe, expect, it } from "vitest"; -import { buildServer } from "../api/app.js"; - -const baseDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../"); - -describe("API server", () => { - it("serves OpenAPI spec", async () => { - const app = buildServer({ cwd: baseDir }); - const response = await app.inject({ method: "GET", url: "/openapi.json" }); - expect(response.statusCode).toBe(200); - const payload = JSON.parse(response.payload); - expect(payload.info.title).toBe("Meshy Content Generator API"); - await app.close(); - }); - - it("serves preview HTML", async () => { - const tempDir = path.join(baseDir, ".tmp-preview"); - fs.mkdirSync(tempDir, { recursive: true }); - const glbPath = path.join(tempDir, "model.glb"); - fs.writeFileSync(glbPath, "glTF"); - - const app = buildServer({ cwd: baseDir }); - const response = await app.inject({ - method: "GET", - url: `/preview?assetDir=${encodeURIComponent(".tmp-preview")}&file=model.glb`, - }); - expect(response.statusCode).toBe(200); - expect(response.payload).toContain("model-viewer"); - await app.close(); - }); - - it("serves asset files via /file", async () => { - const tempDir = path.join(baseDir, ".tmp-preview"); - fs.mkdirSync(tempDir, { recursive: true }); - const glbPath = path.join(tempDir, "model.glb"); - fs.writeFileSync(glbPath, "glTF"); - - const app = buildServer({ cwd: baseDir }); - const response = await app.inject({ - method: "GET", - url: `/file?assetDir=${encodeURIComponent(".tmp-preview")}&file=model.glb`, - }); - expect(response.statusCode).toBe(200); - expect(response.headers["content-type"]).toContain("model/gltf-binary"); - await app.close(); - }); - - it("blocks non-preview file types via /file", async () => { - const tempDir = path.join(baseDir, ".tmp-preview"); - fs.mkdirSync(tempDir, { recursive: true }); - const txtPath = path.join(tempDir, "notes.txt"); - fs.writeFileSync(txtPath, "nope"); - - const app = buildServer({ cwd: baseDir }); - const response = await app.inject({ - method: "GET", - url: `/file?assetDir=${encodeURIComponent(".tmp-preview")}&file=notes.txt`, - }); - expect(response.statusCode).toBe(403); - await app.close(); - }); -}); diff --git a/packages/meshy-content-generator/src/__tests__/cli.test.ts b/packages/meshy-content-generator/src/__tests__/cli.test.ts deleted file mode 100644 index bda41276..00000000 --- a/packages/meshy-content-generator/src/__tests__/cli.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { spawnSync } from "node:child_process"; -import path from "node:path"; -import { describe, expect, it } from "vitest"; - -const root = path.resolve(process.cwd()); - -function runCli(args: string[]) { - const result = spawnSync("pnpm", ["exec", "tsx", "src/cli/index.ts", ...args], { - cwd: root, - encoding: "utf-8", - env: { - ...process.env, - DOTENV_CONFIG_QUIET: "true", - }, - }); - - return { - stdout: result.stdout?.trim() ?? "", - stderr: result.stderr?.trim() ?? "", - status: result.status ?? 0, - }; -} - -describe("CLI", () => { - it("lists pipelines and tasks", () => { - const { stdout, status } = runCli([ - "list", - "--pipelines", - "pipelines/definitions", - "--tasks", - "tasks/definitions", - ]); - - expect(status).toBe(0); - expect(stdout).toMatchInlineSnapshot(` - "Pipelines:\n- brand-image\n- character\n- character-full\n- prop\n\nTasks:\n- animation\n- multi-image-to-3d\n- rigging\n- text-to-3d-preview\n- text-to-3d-refine\n- text-to-image\n- text-to-image-download" - `); - }); -}); diff --git a/packages/meshy-content-generator/src/__tests__/definitions.test.ts b/packages/meshy-content-generator/src/__tests__/definitions.test.ts deleted file mode 100644 index eb10b2d7..00000000 --- a/packages/meshy-content-generator/src/__tests__/definitions.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import { describe, expect, it } from "vitest"; -import { loadJsonDefinitions } from "../core/definitions.js"; - -const baseDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../"); - -describe("definitions loader", () => { - it("loads pipeline and task definitions", async () => { - const definitions = await loadJsonDefinitions({ - pipelinesDir: path.join(baseDir, "pipelines/definitions"), - tasksDir: path.join(baseDir, "tasks/definitions"), - }); - - expect(definitions.pipelines.size).toBeGreaterThan(0); - expect(definitions.tasks.size).toBeGreaterThan(0); - }); -}); diff --git a/packages/meshy-content-generator/src/__tests__/openapi-contract.test.ts b/packages/meshy-content-generator/src/__tests__/openapi-contract.test.ts deleted file mode 100644 index 7c2dc8c6..00000000 --- a/packages/meshy-content-generator/src/__tests__/openapi-contract.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { buildOpenApiSpec } from "../api/openapi.js"; - -function getSchema(spec: ReturnType, name: string) { - const schemas = spec.components?.schemas ?? {}; - return schemas[name] as { - type?: string; - required?: string[]; - properties?: Record; - }; -} - -describe("OpenAPI contracts", () => { - it("exposes RunRequest with required fields", () => { - const spec = buildOpenApiSpec(); - const schema = getSchema(spec, "RunRequest"); - expect(schema).toBeDefined(); - expect(schema.type).toBe("object"); - expect(schema.required).toEqual(["pipelineName", "assetDir"]); - }); - - it("exposes RunResponse with status enum", () => { - const spec = buildOpenApiSpec(); - const schema = getSchema(spec, "RunResponse"); - expect(schema).toBeDefined(); - const status = schema.properties?.status as { enum?: string[] } | undefined; - expect(status?.enum).toEqual(["QUEUED", "RUNNING", "SUCCEEDED", "FAILED"]); - }); -}); diff --git a/packages/meshy-content-generator/src/__tests__/openapi.test.ts b/packages/meshy-content-generator/src/__tests__/openapi.test.ts deleted file mode 100644 index 74b27363..00000000 --- a/packages/meshy-content-generator/src/__tests__/openapi.test.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { buildOpenApiSpec } from "../api/openapi.js"; - -describe("OpenAPI spec", () => { - it("includes core routes", () => { - const spec = buildOpenApiSpec(); - expect(spec.paths["/runs"]).toBeDefined(); - expect(spec.paths["/runs/{runId}"]).toBeDefined(); - expect(spec.paths["/openapi.json"]).toBeDefined(); - expect(spec.paths["/preview"]).toBeDefined(); - }); -}); diff --git a/packages/meshy-content-generator/src/__tests__/pipeline.vcr.test.ts b/packages/meshy-content-generator/src/__tests__/pipeline.vcr.test.ts deleted file mode 100644 index 2c9ce3a4..00000000 --- a/packages/meshy-content-generator/src/__tests__/pipeline.vcr.test.ts +++ /dev/null @@ -1,64 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import { describe, expect, it } from "vitest"; -import { loadJsonDefinitions } from "../core/definitions.js"; -import { PipelineRunner } from "../core/runner.js"; -import { loadAnimationIds } from "../lookups/animation-ids.js"; -import { createPolly } from "./polly.js"; - -const baseDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../"); -const recordingsDir = path.join(baseDir, "test/__recordings__"); -const recordingFile = path.join(recordingsDir, "meshy-character-full.json"); -const mode = process.env.POLLY_MODE ?? "replay"; - -describe("Full Meshy pipeline (VCR)", () => { - const shouldRun = mode === "record" || fs.existsSync(recordingFile); - - const testFn = shouldRun ? it : it.skip; - - testFn( - "runs text → image → preview → refine → rigging → animation", - async () => { - if (process.env.POLLY_MODE === "record" && !process.env.MESHY_API_KEY) { - throw new Error("MESHY_API_KEY is required for recording."); - } - - const polly = createPolly("meshy-character-full"); - - const fixtureDir = path.join(baseDir, "test/fixtures/character-full"); - const tempDir = path.join(baseDir, ".tmp-full-pipeline"); - fs.rmSync(tempDir, { recursive: true, force: true }); - fs.mkdirSync(tempDir, { recursive: true }); - fs.copyFileSync(path.join(fixtureDir, "manifest.json"), path.join(tempDir, "manifest.json")); - - const definitions = await loadJsonDefinitions({ - pipelinesDir: path.join(baseDir, "pipelines/definitions"), - tasksDir: path.join(baseDir, "tasks/definitions"), - }); - - const runner = new PipelineRunner({ - definitions, - apiKey: process.env.MESHY_API_KEY ?? "", - lookups: { - ANIMATION_IDS: loadAnimationIds(), - }, - }); - - const manifest = await runner.run({ - pipelineName: "character-full", - assetDir: tempDir, - }); - - expect(manifest.tasks?.["text-to-image"]).toBeDefined(); - expect(manifest.tasks?.["text-to-3d-preview"]).toBeDefined(); - expect(manifest.tasks?.["text-to-3d-refine"]).toBeDefined(); - expect(manifest.tasks?.rigging).toBeDefined(); - expect(manifest.tasks?.animation).toBeDefined(); - - await polly.stop(); - fs.rmSync(tempDir, { recursive: true, force: true }); - }, - 1_800_000, - ); -}); diff --git a/packages/meshy-content-generator/src/__tests__/polly.ts b/packages/meshy-content-generator/src/__tests__/polly.ts deleted file mode 100644 index 05e83c50..00000000 --- a/packages/meshy-content-generator/src/__tests__/polly.ts +++ /dev/null @@ -1,44 +0,0 @@ -import path from "node:path"; -import FetchAdapter from "@pollyjs/adapter-fetch"; -import type { MODE } from "@pollyjs/core"; -import { Polly } from "@pollyjs/core"; -import FSPersister from "@pollyjs/persister-fs"; - -Polly.register(FetchAdapter); -Polly.register(FSPersister); - -export function createPolly(recordingName: string) { - const recordingsDir = path.resolve(process.cwd(), "test/__recordings__"); - const mode = (process.env.POLLY_MODE ?? "replay") as MODE; - - const polly = new Polly(recordingName, { - adapters: ["fetch"], - persister: "fs", - mode, - logLevel: "silent", - recordIfMissing: mode === "record", - matchRequestsBy: { - headers: { - exclude: ["authorization"], - }, - }, - persisterOptions: { - fs: { - recordingsDir, - }, - }, - }); - - polly.server.any().on("beforePersist", (_, recording) => { - const entries = Array.isArray(recording.entries) - ? recording.entries - : ((recording as { log?: { entries?: [] } }).log?.entries ?? []); - for (const entry of entries) { - if (entry.request.headers?.authorization) { - entry.request.headers.authorization = "[REDACTED]"; - } - } - }); - - return polly; -} diff --git a/packages/meshy-content-generator/src/__tests__/runner.test.ts b/packages/meshy-content-generator/src/__tests__/runner.test.ts deleted file mode 100644 index 7e165ad1..00000000 --- a/packages/meshy-content-generator/src/__tests__/runner.test.ts +++ /dev/null @@ -1,94 +0,0 @@ -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import { describe, expect, it, vi } from "vitest"; -import { loadJsonDefinitions } from "../core/definitions.js"; -import { PipelineRunner } from "../core/runner.js"; -import { loadAnimationIds } from "../lookups/animation-ids.js"; -import type { TaskResult } from "../meshy/meshy-client.js"; - -const baseDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../"); - -class FakeMeshyClient { - private lastPath = ""; - - async post(pathValue: string): Promise { - this.lastPath = pathValue; - const response = { result: "task-123" }; - return response as T; - } - - async streamUntilComplete(): Promise> { - if (this.lastPath.includes("text-to-image")) { - return { - id: "task-123", - status: "SUCCEEDED", - progress: 100, - result: { - result: { - image_urls: ["https://example.com/image1.png", "https://example.com/image2.png"], - }, - } as T, - }; - } - - return { - id: "task-123", - status: "SUCCEEDED", - progress: 100, - result: { - result: { - model_urls: { glb: "https://example.com/model.glb" }, - texture_urls: [{ base_color: "https://example.com/tex.png" }], - }, - } as T, - }; - } -} - -describe("PipelineRunner", () => { - it("executes a pipeline step and maps outputs", async () => { - vi.stubGlobal( - "fetch", - vi.fn(async () => ({ ok: true, body: ReadableStream.from(["data"]) })), - ); - - const definitions = await loadJsonDefinitions({ - pipelinesDir: path.join(baseDir, "pipelines/definitions"), - tasksDir: path.join(baseDir, "tasks/definitions"), - }); - - const runner = new PipelineRunner({ - definitions, - apiKey: "test", - client: new FakeMeshyClient() as unknown as never, - lookups: { - ANIMATION_IDS: loadAnimationIds(), - }, - logger: () => { /* noop logger for tests */ }, - }); - - const tempDir = path.join(baseDir, ".tmp-test"); - await import("node:fs").then((fs) => fs.mkdirSync(tempDir, { recursive: true })); - - const manifestPath = path.join(tempDir, "manifest.json"); - await import("node:fs").then((fs) => - fs.writeFileSync( - manifestPath, - JSON.stringify({ - id: "hero", - name: "Hero", - type: "prop", - textToImageTask: { prompt: "Test" }, - }), - ), - ); - - const result = await runner.run({ - pipelineName: "prop", - assetDir: tempDir, - }); - - expect(result.tasks?.["multi-image-to-3d"]).toBeDefined(); - vi.unstubAllGlobals(); - }); -}); diff --git a/packages/meshy-content-generator/src/__tests__/validator.test.ts b/packages/meshy-content-generator/src/__tests__/validator.test.ts deleted file mode 100644 index bc807998..00000000 --- a/packages/meshy-content-generator/src/__tests__/validator.test.ts +++ /dev/null @@ -1,66 +0,0 @@ -import path from "node:path"; -import { describe, expect, it } from "vitest"; -import { loadJsonDefinitions } from "../core/definitions.js"; -import { validateManifestAndPipeline } from "../core/validator.js"; -import { loadAnimationIds } from "../lookups/animation-ids.js"; -import { readJson } from "../utils/json.js"; - -const baseDir = process.cwd(); -const manifestPath = path.join(baseDir, "test/fixtures/character-full/manifest.json"); - -describe("validateManifestAndPipeline", () => { - it("validates the sample character pipeline manifest", async () => { - const definitions = await loadJsonDefinitions({ - pipelinesDir: path.join(baseDir, "pipelines/definitions"), - tasksDir: path.join(baseDir, "tasks/definitions"), - }); - const manifest = readJson(manifestPath); - - const result = validateManifestAndPipeline({ - definitions, - pipelineName: "character-full", - manifest, - lookups: { - ANIMATION_IDS: loadAnimationIds(), - }, - }); - - expect(result.errors).toEqual([]); - }); - - it("fails when manifest schema is invalid", async () => { - const definitions = await loadJsonDefinitions({ - pipelinesDir: path.join(baseDir, "pipelines/definitions"), - tasksDir: path.join(baseDir, "tasks/definitions"), - }); - const manifest = readJson(manifestPath); - delete (manifest as { id?: string }).id; - - const result = validateManifestAndPipeline({ - definitions, - pipelineName: "character-full", - manifest, - }); - - expect(result.errors.length).toBeGreaterThan(0); - }); - - it("fails when required manifest inputs are missing", async () => { - const definitions = await loadJsonDefinitions({ - pipelinesDir: path.join(baseDir, "pipelines/definitions"), - tasksDir: path.join(baseDir, "tasks/definitions"), - }); - const manifest = readJson(manifestPath); - delete (manifest as { textTo3DPreviewTask?: { prompt?: string } }).textTo3DPreviewTask; - - const result = validateManifestAndPipeline({ - definitions, - pipelineName: "character-full", - manifest, - }); - - expect(result.errors).toContain( - "Missing required input 'prompt' for step 'preview' (task 'text-to-3d-preview').", - ); - }); -}); diff --git a/packages/meshy-content-generator/src/api/app.ts b/packages/meshy-content-generator/src/api/app.ts deleted file mode 100644 index 062b1fa0..00000000 --- a/packages/meshy-content-generator/src/api/app.ts +++ /dev/null @@ -1,278 +0,0 @@ -import crypto from "node:crypto"; -import fs from "node:fs"; -import path from "node:path"; -import scalarFastifyApiReference from "@scalar/fastify-api-reference"; -import Fastify from "fastify"; -import { loadJsonDefinitions } from "../core/definitions.js"; -import { PipelineRunner } from "../core/runner.js"; -import { loadAnimationIds } from "../lookups/animation-ids.js"; -import { buildOpenApiSpec, RunRequestSchema } from "./openapi.js"; - -/** - * Build the Fastify server for the content generator API + preview. - * - * @param options - Server options (defaults to process.cwd()). - */ -export function buildServer(options?: { cwd?: string }) { - const app = Fastify({ logger: true }); - const runs = new Map< - string, - { status: "QUEUED" | "RUNNING" | "SUCCEEDED" | "FAILED"; manifest?: unknown; error?: string } - >(); - - const cwd = options?.cwd ?? process.cwd(); - - const openapi = buildOpenApiSpec(); - - app.get("/openapi.json", async (_request, reply) => { - reply.send(openapi); - }); - - app.register(scalarFastifyApiReference, { - routePrefix: "/api", - logLevel: "silent", - configuration: { - content: openapi, - theme: "purple", - customCss: ` - :root { - --scalar-color-1: #f3f4f6; - --scalar-color-2: #d9dbe1; - --scalar-color-3: #b3b8c5; - --scalar-color-accent: #8b5cf6; - --scalar-color-accent-2: #a78bfa; - --scalar-background-1: #0b0b12; - --scalar-background-2: #12121c; - --scalar-background-3: #171726; - font-family: "Instrument Sans", "Inter", system-ui, -apple-system, sans-serif; - } - `, - }, - }); - - app.post("/runs", async (request, reply) => { - const parseResult = RunRequestSchema.safeParse(request.body); - if (!parseResult.success) { - reply.status(400).send({ error: parseResult.error.message }); - return; - } - - const { pipelineName, assetDir, step, wait } = parseResult.data; - const runId = crypto.randomUUID(); - runs.set(runId, { status: "QUEUED" }); - - const absoluteAssetDir = path.resolve(cwd, assetDir); - if (!absoluteAssetDir.startsWith(cwd + path.sep)) { - reply - .status(400) - .send({ error: "Asset directory must be within the current working directory." }); - return; - } - - const apiKey = process.env.MESHY_API_KEY; - if (!apiKey) { - reply.status(400).send({ error: "MESHY_API_KEY is required." }); - return; - } - - const runner = new PipelineRunner({ - definitions: await loadJsonDefinitions({ - pipelinesDir: path.resolve(cwd, "pipelines/definitions"), - tasksDir: path.resolve(cwd, "tasks/definitions"), - }), - apiKey, - lookups: { - ANIMATION_IDS: loadAnimationIds(), - }, - }); - - const runPromise = (async () => { - runs.set(runId, { status: "RUNNING" }); - try { - const manifest = await runner.run({ - pipelineName, - assetDir: absoluteAssetDir, - ...(step !== undefined ? { step } : {}), - }); - runs.set(runId, { status: "SUCCEEDED", manifest }); - } catch (error) { - runs.set(runId, { - status: "FAILED", - error: error instanceof Error ? error.message : String(error), - }); - } - })(); - - if (wait) { - await runPromise; - } - - const record = runs.get(runId); - reply.send({ - runId, - status: record?.status ?? "QUEUED", - manifest: record?.manifest, - error: record?.error, - }); - }); - - app.get("/runs/:runId", async (request, reply) => { - const runId = (request.params as { runId: string }).runId; - const record = runs.get(runId); - if (!record) { - reply.status(404).send({ error: "Run not found." }); - return; - } - reply.send({ runId, status: record.status, manifest: record.manifest, error: record.error }); - }); - - app.get("/preview", async (request, reply) => { - const { assetDir, file } = request.query as { assetDir?: string; file?: string }; - if (!assetDir || !file) { - reply.status(400).send("Missing assetDir or file query parameters."); - return; - } - - const absoluteAssetDir = path.resolve(cwd, assetDir); - const absoluteFile = path.resolve(absoluteAssetDir, file); - if (!absoluteFile.startsWith(cwd + path.sep)) { - reply.status(400).send("Invalid asset path."); - return; - } - - if (!fs.existsSync(absoluteFile)) { - reply.status(404).send("File not found."); - return; - } - - const modelUrl = `/file?assetDir=${encodeURIComponent(assetDir)}&file=${encodeURIComponent( - file, - )}`; - - const html = ` - - - - - Meshy Preview - - - - -
-
- Meshy Preview - - ${path.basename(file)} -
- -
- -`; - - reply.type("text/html").send(html); - }); - - app.get("/file", async (request, reply) => { - const { assetDir, file } = request.query as { assetDir?: string; file?: string }; - if (!assetDir || !file) { - reply.status(400).send("Missing assetDir or file query parameters."); - return; - } - - const absoluteAssetDir = path.resolve(cwd, assetDir); - const absoluteFile = path.resolve(absoluteAssetDir, file); - if (!absoluteFile.startsWith(cwd + path.sep)) { - reply.status(400).send("Invalid asset path."); - return; - } - - if (!fs.existsSync(absoluteFile)) { - reply.status(404).send("File not found."); - return; - } - - const ext = path.extname(absoluteFile).toLowerCase(); - const allowedTypes: Record = { - ".glb": "model/gltf-binary", - ".gltf": "model/gltf+json", - ".png": "image/png", - ".jpg": "image/jpeg", - ".jpeg": "image/jpeg", - }; - - const contentType = allowedTypes[ext]; - if (!contentType) { - reply.status(403).send("File type not allowed."); - return; - } - - reply.type(contentType); - reply.send(fs.createReadStream(absoluteFile)); - }); - - app.get("/vendor/model-viewer.min.js", async (_request, reply) => { - const vendorPath = path.resolve( - cwd, - "node_modules/@google/model-viewer/dist/model-viewer.min.js", - ); - if (!fs.existsSync(vendorPath)) { - reply.status(404).send("model-viewer asset not found."); - return; - } - reply.type("text/javascript"); - reply.send(fs.createReadStream(vendorPath)); - }); - - return app; -} diff --git a/packages/meshy-content-generator/src/api/openapi.ts b/packages/meshy-content-generator/src/api/openapi.ts deleted file mode 100644 index 2da767b7..00000000 --- a/packages/meshy-content-generator/src/api/openapi.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { - extendZodWithOpenApi, - OpenAPIRegistry, - OpenApiGeneratorV3, -} from "@asteasolutions/zod-to-openapi"; -import { z } from "zod"; -import { AssetManifestSchema } from "../schemas/manifest.js"; - -extendZodWithOpenApi(z); - -export const RunRequestSchema = z.object({ - pipelineName: z.string(), - assetDir: z.string(), - step: z.string().optional(), - wait: z.boolean().optional(), -}); - -export const RunStatusSchema = z.enum(["QUEUED", "RUNNING", "SUCCEEDED", "FAILED"]); - -export const RunResponseSchema = z.object({ - runId: z.string(), - status: RunStatusSchema, - manifest: AssetManifestSchema.optional(), - error: z.string().optional(), -}); - -export const RunRecordSchema = z.object({ - runId: z.string(), - status: RunStatusSchema, - manifest: AssetManifestSchema.optional(), - error: z.string().optional(), -}); - -/** - * Build the OpenAPI document describing the Meshy content generation API. - */ -export function buildOpenApiSpec(): ReturnType["generateDocument"]> { - const registry = new OpenAPIRegistry(); - - registry.register("RunRequest", RunRequestSchema); - registry.register("RunResponse", RunResponseSchema); - registry.register("RunRecord", RunRecordSchema); - - registry.registerPath({ - method: "post", - path: "/runs", - description: "Start a Meshy pipeline run.", - request: { - body: { - content: { - "application/json": { schema: RunRequestSchema }, - }, - }, - }, - responses: { - 200: { - description: "Run accepted", - content: { - "application/json": { schema: RunResponseSchema }, - }, - }, - }, - }); - - registry.registerPath({ - method: "get", - path: "/runs/{runId}", - description: "Fetch run status and results.", - request: { - params: z.object({ runId: z.string() }), - }, - responses: { - 200: { - description: "Run status", - content: { - "application/json": { schema: RunRecordSchema }, - }, - }, - 404: { - description: "Run not found", - }, - }, - }); - - registry.registerPath({ - method: "get", - path: "/openapi.json", - description: "OpenAPI spec for the Meshy content generation API.", - responses: { - 200: { - description: "OpenAPI spec", - }, - }, - }); - - registry.registerPath({ - method: "get", - path: "/preview", - description: "Preview a generated GLB using a lightweight viewer.", - request: { - query: z.object({ - assetDir: z.string(), - file: z.string(), - }), - }, - responses: { - 200: { - description: "HTML preview", - }, - }, - }); - - registry.registerPath({ - method: "get", - path: "/file", - description: "Serve a file within an asset directory for previewing.", - request: { - query: z.object({ - assetDir: z.string(), - file: z.string(), - }), - }, - responses: { - 200: { - description: "Binary asset file", - }, - 404: { - description: "File not found", - }, - }, - }); - - const generator = new OpenApiGeneratorV3(registry.definitions); - - return generator.generateDocument({ - openapi: "3.0.3", - info: { - title: "Meshy Content Generator API", - version: "0.1.0", - description: "API for running declarative Meshy content pipelines.", - }, - }); -} diff --git a/packages/meshy-content-generator/src/api/server.ts b/packages/meshy-content-generator/src/api/server.ts deleted file mode 100644 index 3498f97d..00000000 --- a/packages/meshy-content-generator/src/api/server.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { buildServer } from "./app.js"; - -const port = Number(process.env.PORT ?? 5177); - -const app = buildServer(); -app.listen({ port, host: "0.0.0.0" }); diff --git a/packages/meshy-content-generator/src/cli/index.ts b/packages/meshy-content-generator/src/cli/index.ts deleted file mode 100644 index 578bb3ab..00000000 --- a/packages/meshy-content-generator/src/cli/index.ts +++ /dev/null @@ -1,161 +0,0 @@ -import path from "node:path"; -import { Command } from "commander"; -import dotenv from "dotenv"; -import { loadJsonDefinitions } from "../core/definitions.js"; -import { PipelineRunner } from "../core/runner.js"; -import { validateManifestAndPipeline } from "../core/validator.js"; -import { loadAnimationIds } from "../lookups/animation-ids.js"; -import { readJson } from "../utils/json.js"; - -const program = new Command(); - -dotenv.config(); - -program - .name("content-gen") - .description("Declarative content generation pipelines") - .version("0.1.0"); - -function resolveDir(input: string | undefined, fallback: string): string { - if (input) return path.resolve(process.cwd(), input); - return path.resolve(process.cwd(), fallback); -} - -async function buildRunner(options: { - pipelines: string; - tasks: string; - meshyApiKey?: string; -}): Promise { - const definitions = await loadJsonDefinitions({ - pipelinesDir: options.pipelines, - tasksDir: options.tasks, - }); - - const apiKey = options.meshyApiKey ?? process.env.MESHY_API_KEY; - if (!apiKey) { - throw new Error("MESHY_API_KEY is required."); - } - - return new PipelineRunner({ - definitions, - apiKey, - lookups: { - ANIMATION_IDS: loadAnimationIds(), - }, - }); -} - -program - .command("list") - .description("List available pipelines and tasks") - .option("--pipelines ", "Pipelines definitions directory", "pipelines/definitions") - .option("--tasks ", "Task definitions directory", "tasks/definitions") - .action(async (opts) => { - const pipelinesDir = resolveDir(opts.pipelines, "pipelines/definitions"); - const tasksDir = resolveDir(opts.tasks, "tasks/definitions"); - const definitions = await loadJsonDefinitions({ pipelinesDir, tasksDir }); - - console.log("\nPipelines:"); - const pipelineList = Array.from(definitions.pipelines.values()).sort((a, b) => - a.name.localeCompare(b.name), - ); - for (const pipeline of pipelineList) { - console.log(`- ${pipeline.name}`); - } - - console.log("\nTasks:"); - const taskList = Array.from(definitions.tasks.values()).sort((a, b) => - a.id.localeCompare(b.id), - ); - for (const task of taskList) { - console.log(`- ${task.id}`); - } - }); - -program - .command("validate") - .description("Validate a manifest against pipeline/task definitions") - .argument("", "Asset directory containing manifest.json") - .option("--pipelines ", "Pipelines definitions directory", "pipelines/definitions") - .option("--tasks ", "Task definitions directory", "tasks/definitions") - .option("--pipeline ", "Pipeline name to validate") - .action(async (assetDir, opts) => { - const pipelinesDir = resolveDir(opts.pipelines, "pipelines/definitions"); - const tasksDir = resolveDir(opts.tasks, "tasks/definitions"); - const definitions = await loadJsonDefinitions({ pipelinesDir, tasksDir }); - - if (opts.pipeline && !definitions.pipelines.has(opts.pipeline)) { - throw new Error(`Pipeline not found: ${opts.pipeline}`); - } - - const manifestPath = path.join(path.resolve(process.cwd(), assetDir), "manifest.json"); - const exists = await import("node:fs").then((fs) => fs.existsSync(manifestPath)); - if (!exists) { - throw new Error(`manifest.json not found at ${manifestPath}`); - } - - const manifest = readJson(manifestPath); - const pipelineNames = Array.from(definitions.pipelines.keys()); - const pipelineName = opts.pipeline ?? pipelineNames[0]; - if (!pipelineName) { - throw new Error("No pipeline definitions found to validate."); - } - if (!opts.pipeline && pipelineNames.length > 1) { - console.warn( - `No pipeline specified; defaulting to '${pipelineName}'. Use --pipeline to choose another.`, - ); - } - - const result = validateManifestAndPipeline({ - definitions, - pipelineName, - manifest, - lookups: { - ANIMATION_IDS: loadAnimationIds(), - }, - }); - - if (result.warnings.length > 0) { - console.warn("Validation warnings:"); - for (const warning of result.warnings) { - console.warn(`- ${warning}`); - } - } - - if (result.errors.length > 0) { - const message = ["Validation failed:", ...result.errors.map((error) => `- ${error}`)].join( - "\n", - ); - throw new Error(message); - } - - console.log("Manifest + definitions validated."); - }); - -program - .command("run") - .description("Run a pipeline against an asset manifest") - .argument("", "Pipeline name") - .argument("", "Asset directory containing manifest.json") - .option("--pipelines ", "Pipelines definitions directory", "pipelines/definitions") - .option("--tasks ", "Task definitions directory", "tasks/definitions") - .option("--step ", "Optional step id to run") - .option("--meshy-api-key ", "Meshy API key (overrides env)") - .action(async (pipelineName, assetDir, opts) => { - const pipelinesDir = resolveDir(opts.pipelines, "pipelines/definitions"); - const tasksDir = resolveDir(opts.tasks, "tasks/definitions"); - - const runner = await buildRunner({ - pipelines: pipelinesDir, - tasks: tasksDir, - meshyApiKey: opts.meshyApiKey, - }); - - await runner.run({ - pipelineName, - assetDir: path.resolve(process.cwd(), assetDir), - step: opts.step, - }); - }); - -program.parse(); diff --git a/packages/meshy-content-generator/src/content.config.ts b/packages/meshy-content-generator/src/content.config.ts deleted file mode 100644 index 7fbcf2c3..00000000 --- a/packages/meshy-content-generator/src/content.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineCollection } from "astro:content"; -import { docsLoader } from "@astrojs/starlight/loaders"; -import { docsSchema } from "@astrojs/starlight/schema"; - -export const collections = { - docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }), -}; diff --git a/packages/meshy-content-generator/src/content/docs/api.mdx b/packages/meshy-content-generator/src/content/docs/api.mdx deleted file mode 100644 index f575db3d..00000000 --- a/packages/meshy-content-generator/src/content/docs/api.mdx +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: API Server ---- - -The API server exposes pipeline execution, run status, and an OpenAPI spec. - -## Run the server - -```bash -pnpm dev -``` - -Default endpoints: - -- API reference: `http://localhost:5177/api` -- OpenAPI JSON: `http://localhost:5177/openapi.json` -- File proxy: `http://localhost:5177/file?assetDir=...&file=...` - -## Run a pipeline - -```bash -curl -X POST http://localhost:5177/runs \ - -H 'content-type: application/json' \ - -d '{ - "pipelineName": "character", - "assetDir": "./assets/characters/hero", - "wait": true - }' -``` - -## Check run status - -```bash -curl http://localhost:5177/runs/ -``` - -## Environment - -```bash -MESHY_API_KEY=your_api_key -``` - -The server validates input with Zod and publishes the same schema in the OpenAPI output. diff --git a/packages/meshy-content-generator/src/content/docs/ci-setup.mdx b/packages/meshy-content-generator/src/content/docs/ci-setup.mdx deleted file mode 100644 index 53a74938..00000000 --- a/packages/meshy-content-generator/src/content/docs/ci-setup.mdx +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: CI Setup ---- - -Use VCR recording to make Meshy calls deterministic in CI. - -## Record once - -```bash -POLLY_MODE=record pnpm test:unit -``` - -This writes recordings to `test/__recordings__`. Commit them so CI can replay. - -## Replay in CI - -```bash -POLLY_MODE=replay pnpm test:unit -``` - -## Suggested CI steps - -```bash -pnpm install -pnpm check -pnpm test -pnpm test:e2e -pnpm build -``` diff --git a/packages/meshy-content-generator/src/content/docs/cli.mdx b/packages/meshy-content-generator/src/content/docs/cli.mdx deleted file mode 100644 index 2e6ccaf8..00000000 --- a/packages/meshy-content-generator/src/content/docs/cli.mdx +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: CLI ---- - -## Commands - -### list - -```bash -content-gen list --pipelines ./pipelines/definitions --tasks ./tasks/definitions -``` - -### validate - -```bash -content-gen validate ./assets/characters/hero \ - --pipelines ./pipelines/definitions \ - --tasks ./tasks/definitions -``` - -Validation checks: - -- Manifest schema (required fields and types). -- Pipeline/task references and step dependencies. -- Manifest input bindings where possible (env/lookup/manifest/literal). - -### run - -```bash -content-gen run character ./assets/characters/hero \ - --pipelines ./pipelines/definitions \ - --tasks ./tasks/definitions -``` diff --git a/packages/meshy-content-generator/src/content/docs/getting-started.mdx b/packages/meshy-content-generator/src/content/docs/getting-started.mdx deleted file mode 100644 index 6148a327..00000000 --- a/packages/meshy-content-generator/src/content/docs/getting-started.mdx +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: Getting Started ---- - -## Install - -```bash -pnpm add @jbcom/agentic-meshy -``` - -## Environment - -```bash -MESHY_API_KEY=your_api_key -``` - -## Run a pipeline - -```bash -content-gen run character ./assets/characters/hero \ - --pipelines ./pipelines/definitions \ - --tasks ./tasks/definitions -``` - -## Start the API + preview server - -```bash -pnpm dev -``` - -## Use the API - -```ts -import { - PipelineRunner, - loadJsonDefinitions, -} from "@jbcom/agentic-meshy"; - -const definitions = await loadJsonDefinitions({ - pipelinesDir: "./pipelines/definitions", - tasksDir: "./tasks/definitions", -}); - -const runner = new PipelineRunner({ - definitions, - apiKey: process.env.MESHY_API_KEY!, -}); - -await runner.run({ - pipelineName: "character", - assetDir: "./assets/characters/hero", -}); -``` diff --git a/packages/meshy-content-generator/src/content/docs/index.mdx b/packages/meshy-content-generator/src/content/docs/index.mdx deleted file mode 100644 index 0df619db..00000000 --- a/packages/meshy-content-generator/src/content/docs/index.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Overview ---- - -# meshy-content-generator - -A declarative Meshy content-generation pipeline engine with a CLI and API. Pipelines and tasks are defined as JSON and optimized for Meshy endpoints. - -## Key ideas - -- Define **pipelines** and **tasks** as JSON. -- Provide **manifests** per asset to supply prompts/config. -- Run from CLI, API server, or embed as a library. - -## Use cases - -- Generate 3D characters/props from structured manifests -- Orchestrate multi‑step AI workflows -- Standardize build‑time content pipelines - -Explore the full examples in the [Use Cases](/use-cases) section. - -For operating guidance, see [Meshy Ops](/mesh-ops), [Pricing & Credits](/pricing), and [Troubleshooting](/troubleshooting). diff --git a/packages/meshy-content-generator/src/content/docs/manifest.mdx b/packages/meshy-content-generator/src/content/docs/manifest.mdx deleted file mode 100644 index a09b8774..00000000 --- a/packages/meshy-content-generator/src/content/docs/manifest.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Manifests ---- - -Each asset directory contains a `manifest.json`. The manifest feeds input values into tasks and stores task state. - -Example: - -```json -{ - "id": "hero", - "name": "Hero", - "type": "character", - "textToImageTask": { - "prompt": "Anime hero in a rooftop setting" - }, - "multiImageTo3DTask": { - "texturePrompt": "cel-shaded materials" - }, - "animationTask": { - "animations": ["WalkAndRun.Walking.Casual_Walk"] - } -} -``` diff --git a/packages/meshy-content-generator/src/content/docs/mesh-ops.mdx b/packages/meshy-content-generator/src/content/docs/mesh-ops.mdx deleted file mode 100644 index 43fdbe75..00000000 --- a/packages/meshy-content-generator/src/content/docs/mesh-ops.mdx +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Meshy Ops ---- - -## Cost & rate‑limit guidance - -Meshy requests can be credit‑ and time‑intensive. Recommended practices: - -- **Batch by asset type** (characters vs props) to reduce pipeline churn. -- **Record VCR fixtures** for CI to avoid burning credits on tests. -- **Use preview → refine** intentionally; refine tasks are the most expensive. -- **Throttle parallel runs** if you are seeing rate‑limit errors. - -## When to use each pipeline - -- `character-full`: full production asset pipeline (text → image → preview → refine → rig → animation) -- `character`: reduced flow when you want faster iteration -- `prop`: fast prop generation (text → 3D) - -## Suggested asset folder layout - -```text -assets/ -├── characters/ -│ └── hero/ -│ └── manifest.json -└── props/ - └── katana/ - └── manifest.json -``` - -## Recording VCR fixtures - -```bash -POLLY_MODE=record pnpm test:unit -``` - -Commit the recordings under `test/__recordings__` so CI can replay. diff --git a/packages/meshy-content-generator/src/content/docs/meshy-api.mdx b/packages/meshy-content-generator/src/content/docs/meshy-api.mdx deleted file mode 100644 index 5f4f4624..00000000 --- a/packages/meshy-content-generator/src/content/docs/meshy-api.mdx +++ /dev/null @@ -1,386 +0,0 @@ ---- -title: Meshy API ---- - -# Meshy API Reference - -Complete API documentation for all Meshy endpoints used in the content-gen pipeline. - -**Base URL:** `https://api.meshy.ai/openapi` - -**Authentication:** `Authorization: Bearer ${YOUR_API_KEY}` - ---- - -## Text-to-Image API - -Generate concept images from text prompts. - -### Create Task -`POST /v1/text-to-image` - -**Required Parameters:** -| Name | Type | Description | -|------|------|-------------| -| `ai_model` | string | `nano-banana` or `nano-banana-pro` | -| `prompt` | string | Text description of desired image | - -**Optional Parameters:** -| Name | Type | Default | Description | -|------|------|---------|-------------| -| `generate_multi_view` | boolean | false | Produces 3 multi-angle views when true | -| `pose_mode` | string | "" | `a-pose`, `t-pose`, or empty | -| `aspect_ratio` | string | `1:1` | `1:1`, `16:9`, `9:16`, `4:3`, `3:4` | - -**Response:** -```json -{ "result": "task-id" } -``` - -**Task Object (on completion):** -```json -{ - "id": "...", - "type": "text-to-image", - "status": "SUCCEEDED", - "image_urls": ["url1", "url2", "url3"], // 1 or 3 URLs - "progress": 100 -} -``` - -### Other Endpoints -- `GET /v1/text-to-image/:id` - Retrieve task -- `GET /v1/text-to-image/:id/stream` - SSE stream -- `DELETE /v1/text-to-image/:id` - Delete task -- `GET /v1/text-to-image` - List tasks - ---- - -## Image-to-3D API (Single Image) - -Generate 3D model from a single image. - -### Create Task -`POST /v1/image-to-3d` - -**Required Parameters:** -| Name | Type | Description | -|------|------|-------------| -| `image_url` | string | Publicly accessible URL or base64 data URI (.jpg, .jpeg, .png) | - -**Optional Parameters:** -| Name | Type | Default | Description | -|------|------|---------|-------------| -| `model_type` | string | `standard` | `standard` or `lowpoly` | -| `ai_model` | string | `latest` | `meshy-5` or `latest` (Meshy 6) | -| `topology` | string | `triangle` | `quad` or `triangle` | -| `target_polycount` | integer | 30000 | 100-300,000 | -| `symmetry_mode` | string | `auto` | `off`, `auto`, `on` | -| `should_remesh` | boolean | true | Enable remesh phase | -| `should_texture` | boolean | true | Generate textures | -| `enable_pbr` | boolean | false | Generate PBR maps | -| `pose_mode` | string | "" | `a-pose`, `t-pose`, or empty | -| `texture_prompt` | string | - | Texture guidance (max 600 chars) | -| `texture_image_url` | string | - | 2D image for texture guidance | - -**Response:** -```json -{ "result": "task-id" } -``` - -**Task Object (on completion):** -```json -{ - "id": "...", - "type": "image-to-3d", - "status": "SUCCEEDED", - "model_urls": { - "glb": "https://...", - "fbx": "https://...", - "obj": "https://...", - "usdz": "https://..." - }, - "texture_urls": [{ - "base_color": "https://...", - "metallic": "https://...", - "normal": "https://...", - "roughness": "https://..." - }] -} -``` - -### Other Endpoints -- `GET /v1/image-to-3d/:id` - Retrieve task -- `GET /v1/image-to-3d/:id/stream` - SSE stream -- `DELETE /v1/image-to-3d/:id` - Delete task -- `GET /v1/image-to-3d` - List tasks - ---- - -## Multi-Image-to-3D API - -Generate 3D model from multiple images (1-4) of the same object. - -### Create Task -`POST /v1/multi-image-to-3d` - -**Required Parameters:** -| Name | Type | Description | -|------|------|-------------| -| `image_urls` | array | 1-4 publicly accessible URLs or base64 data URIs | - -**Optional Parameters:** -| Name | Type | Default | Description | -|------|------|---------|-------------| -| `ai_model` | string | `latest` | `meshy-5` or `latest` | -| `topology` | string | `triangle` | `quad` or `triangle` | -| `target_polycount` | integer | 30000 | 100-300,000 | -| `symmetry_mode` | string | `auto` | `off`, `auto`, `on` | -| `should_remesh` | boolean | true | Enable remesh phase | -| `should_texture` | boolean | true | Generate textures | -| `enable_pbr` | boolean | false | Generate PBR maps | -| `pose_mode` | string | "" | `a-pose`, `t-pose`, or empty | -| `texture_prompt` | string | - | Texture guidance (max 600 chars) | -| `texture_image_url` | string | - | 2D image for texture guidance | - -**Response:** -```json -{ "result": "task-id" } -``` - -**Task Object:** Same structure as Image-to-3D with `type: "multi-image-to-3d"` - -### Other Endpoints -- `GET /v1/multi-image-to-3d/:id` - Retrieve task -- `GET /v1/multi-image-to-3d/:id/stream` - SSE stream -- `DELETE /v1/multi-image-to-3d/:id` - Delete task -- `GET /v1/multi-image-to-3d` - List tasks - ---- - -## Text-to-3D API - -Two-stage workflow: preview (mesh) then refine (texture). - -### Create Preview Task -`POST /v2/text-to-3d` - -**Required Parameters:** -| Name | Type | Description | -|------|------|-------------| -| `mode` | string | Must be `"preview"` | -| `prompt` | string | Object description (max 600 chars) | - -**Optional Parameters:** -| Name | Type | Default | Description | -|------|------|---------|-------------| -| `art_style` | string | `realistic` | `realistic` or `sculpture` | -| `ai_model` | string | `latest` | `meshy-5` or `latest` | -| `topology` | string | `triangle` | `quad` or `triangle` | -| `target_polycount` | integer | 30000 | 100-300,000 | -| `should_remesh` | boolean | true | Enable remesh phase | -| `symmetry_mode` | string | `auto` | `off`, `auto`, `on` | -| `pose_mode` | string | "" | `a-pose`, `t-pose`, or empty | - -### Create Refine Task -`POST /v2/text-to-3d` - -**Required Parameters:** -| Name | Type | Description | -|------|------|-------------| -| `mode` | string | Must be `"refine"` | -| `preview_task_id` | string | ID of SUCCEEDED preview task | - -**Optional Parameters:** -| Name | Type | Default | Description | -|------|------|---------|-------------| -| `enable_pbr` | boolean | false | Generate PBR maps | -| `texture_prompt` | string | - | Texture guidance (max 600 chars) | -| `texture_image_url` | string | - | 2D image for texture guidance | -| `ai_model` | string | `latest` | `meshy-5` or `latest` | - -### Other Endpoints -- `GET /v2/text-to-3d/:id` - Retrieve task -- `GET /v2/text-to-3d/:id/stream` - SSE stream -- `DELETE /v2/text-to-3d/:id` - Delete task -- `GET /v2/text-to-3d` - List tasks - ---- - -## Auto-Rigging API - -Create skeleton and bind mesh for animation. - -### Create Task -`POST /v1/rigging` - -**Required Parameters (one of):** -| Name | Type | Description | -|------|------|-------------| -| `input_task_id` | string | Task ID from Image-to-3D, Multi-Image-to-3D, or Text-to-3D | -| `model_url` | string | Publicly accessible GLB URL or base64 data URI | - -**Optional Parameters:** -| Name | Type | Default | Description | -|------|------|---------|-------------| -| `height_meters` | number | 1.7 | Character height in meters | -| `texture_image_url` | string | - | UV-unwrapped base color texture (.png) | - -**Response:** -```json -{ "result": "task-id" } -``` - -**Task Object (on completion):** -```json -{ - "id": "...", - "type": "rig", - "status": "SUCCEEDED", - "result": { - "rigged_character_glb_url": "https://...", - "rigged_character_fbx_url": "https://...", - "basic_animations": { - "walking_glb_url": "https://...", - "walking_fbx_url": "https://...", - "running_glb_url": "https://...", - "running_fbx_url": "https://..." - } - } -} -``` - -### Other Endpoints -- `GET /v1/rigging/:id` - Retrieve task -- `GET /v1/rigging/:id/stream` - SSE stream -- `DELETE /v1/rigging/:id` - Delete task - ---- - -## Animation API - -Apply animations from library to rigged characters. - -### Create Task -`POST /v1/animations` - -**Required Parameters:** -| Name | Type | Description | -|------|------|-------------| -| `rig_task_id` | string | Task ID from completed rigging task | -| `action_id` | integer | Animation ID from library (see below) | - -**Optional Parameters:** -| Name | Type | Description | -|------|------|-------------| -| `post_process` | object | Post-processing options | -| `post_process.operation_type` | string | `change_fps`, `fbx2usdz`, or `extract_armature` | -| `post_process.fps` | integer | Target FPS: 24, 25, 30, or 60 (default 30) | - -**Response:** -```json -{ "result": "task-id" } -``` - -**Task Object (on completion):** -```json -{ - "id": "...", - "type": "animate", - "status": "SUCCEEDED", - "result": { - "animation_glb_url": "https://...", - "animation_fbx_url": "https://...", - "processed_usdz_url": "https://...", - "processed_armature_fbx_url": "https://...", - "processed_animation_fps_fbx_url": "https://..." - } -} -``` - -### Other Endpoints -- `GET /v1/animations/:id` - Retrieve task -- `GET /v1/animations/:id/stream` - SSE stream -- `DELETE /v1/animations/:id` - Delete task - ---- - -## Animation Library Reference - -Common animation IDs used in our pipeline: - -| ID | Name | Description | -|----|------|-------------| -| 92 | IDLE_COMBAT | Combat-ready stance | -| 93 | IDLE_NEUTRAL | Relaxed standing | -| 1 | WALK | Walking forward | -| 2 | RUN | Running forward | -| 45 | ATTACK_MELEE_1 | Basic melee attack | -| 46 | ATTACK_MELEE_2 | Secondary melee attack | -| 60 | BLOCK | Defensive block | -| 70 | HIT_REACTION | Taking damage | -| 80 | DEATH | Death animation | -| 30 | JUMP_IDLE | Jumping in place | - -See `tasks/registry.ts` for complete mapping. - ---- - -## Common Patterns - -### Image Input Formats -All image parameters accept: -1. **Publicly accessible URL**: `https://example.com/image.png` -2. **Base64 Data URI**: `data:image/png;base64,` - -### Task Status Values -- `PENDING` - In queue -- `IN_PROGRESS` - Processing -- `SUCCEEDED` - Complete -- `FAILED` - Error occurred -- `CANCELED` - Cancelled by user - -### Streaming (SSE) - -All `/stream` endpoints use Server-Sent Events: - -```text -event: message -data: {"id": "...", "progress": 50, "status": "IN_PROGRESS"} - -event: message -data: {"id": "...", "progress": 100, "status": "SUCCEEDED", ...full object...} -``` - -### Error Response -```json -{ - "status_code": 400, - "message": "Invalid values: ImageURL is a required field" -} -``` - ---- - -## Pipeline Flow - -```text -text-to-image (multi-view) - │ - ▼ image_urls[3] -multi-image-to-3d - │ - ▼ model_urls.glb, texture_urls[0].base_color -rigging (input_task_id OR model_url + texture_image_url) - │ - ▼ result.rigged_character_glb_url -animations (rig_task_id + action_id) - │ - ▼ result.animation_glb_url -``` - ---- - -*Last Updated: 2025-01-15* - -*Source: [Meshy API Documentation](https://docs.meshy.ai/en/api/)* diff --git a/packages/meshy-content-generator/src/content/docs/pipeline-walkthrough.mdx b/packages/meshy-content-generator/src/content/docs/pipeline-walkthrough.mdx deleted file mode 100644 index 20dd58b1..00000000 --- a/packages/meshy-content-generator/src/content/docs/pipeline-walkthrough.mdx +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: Pipeline Walkthrough ---- - -This walkthrough shows how pipeline steps and task definitions work together. - -## 1) Manifest - -Each asset directory contains a `manifest.json` that supplies prompts and configuration. - -```json -{ - "id": "hero", - "name": "Hero", - "type": "character", - "textTo3DPreviewTask": { - "prompt": "Stylized anime hero with clean silhouette" - }, - "textTo3DRefineTask": { - "texturePrompt": "Cel-shaded materials with crisp outlines" - }, - "animationTask": { - "animations": ["WalkAndRun.Walking.Casual_Walk"] - } -} -``` - -## 2) Pipeline - -Pipelines reference task IDs. Each step can override inputs. - -```json -{ - "name": "character-full", - "steps": [ - { - "id": "preview", - "task": "text-to-3d-preview", - "inputs": [ - { "name": "prompt", "source": "manifest", "path": "textTo3DPreviewTask.prompt" } - ] - }, - { - "id": "refine", - "task": "text-to-3d-refine", - "dependsOn": ["preview"], - "inputs": [ - { "name": "preview_task_id", "source": "step", "step": "preview", "path": "taskId" }, - { "name": "texture_prompt", "source": "manifest", "path": "textTo3DRefineTask.texturePrompt" } - ] - } - ] -} -``` - -## 3) Task definition - -Tasks map to Meshy endpoints and define how outputs are captured. - -```json -{ - "id": "text-to-3d-refine", - "apiVersion": "v2", - "endpoint": "text-to-3d", - "inputs": [ - { "name": "mode", "source": "literal", "value": "refine" }, - { "name": "preview_task_id", "source": "literal" } - ], - "outputs": [ - { "name": "model", "responsePath": "result.model_urls.glb", "artifact": "refined.glb" } - ] -} -``` - -## 4) Run - -```bash -content-gen run character-full ./assets/characters/hero \ - --pipelines ./pipelines/definitions \ - --tasks ./tasks/definitions -``` - -The manifest is updated with task status, outputs, and artifact paths. diff --git a/packages/meshy-content-generator/src/content/docs/pipelines.mdx b/packages/meshy-content-generator/src/content/docs/pipelines.mdx deleted file mode 100644 index b8f440d0..00000000 --- a/packages/meshy-content-generator/src/content/docs/pipelines.mdx +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Pipelines ---- - -Pipelines are JSON files in `pipelines/definitions/*.pipeline.json`. Each step references a task definition and can override inputs. - -Example: - -```json -{ - "name": "character", - "version": "2.1.0", - "steps": [ - { "id": "concept", "task": "text-to-image" }, - { "id": "model", "task": "multi-image-to-3d", "dependsOn": ["concept"] } - ] -} -``` diff --git a/packages/meshy-content-generator/src/content/docs/preview.mdx b/packages/meshy-content-generator/src/content/docs/preview.mdx deleted file mode 100644 index c576232d..00000000 --- a/packages/meshy-content-generator/src/content/docs/preview.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Preview ---- - -The preview route hosts a lightweight viewer for generated assets so you can validate Meshy outputs quickly. - -## Start the server - -```bash -pnpm dev -``` - -## Open a preview - -```bash -http://localhost:5177/preview?assetDir=./assets/characters/hero&file=model.glb -``` - -- `assetDir` must be inside the current working directory. -- `file` is resolved relative to the asset directory. - -The preview uses `` and supports basic camera controls and lighting out of the box. - -The viewer fetches assets through the `/file` endpoint so only the requested file is served. diff --git a/packages/meshy-content-generator/src/content/docs/pricing.mdx b/packages/meshy-content-generator/src/content/docs/pricing.mdx deleted file mode 100644 index 6611818f..00000000 --- a/packages/meshy-content-generator/src/content/docs/pricing.mdx +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Pricing & Credits FAQ ---- - -## How credits are used - -Meshy charges credits per task. The most expensive steps are typically: - -1. Text‑to‑3D refine -2. Rigging -3. Animation - -Preview passes are cheaper and faster, so use preview to validate before refine. - -## Reduce cost per iteration - -- **Prototype with preview only** before running refine. -- **Reuse manifests** for deterministic runs. -- **Limit animation sets** during iteration. -- **Batch runs** (avoid small, repeated single‑asset runs). - -## CI best practices - -Use VCR recordings to avoid spending credits in CI. - -```bash -POLLY_MODE=record pnpm test:unit -POLLY_MODE=replay pnpm test:unit -``` - -## Where to check balances - -Use the Meshy dashboard to monitor credit usage and queue status. diff --git a/packages/meshy-content-generator/src/content/docs/providers.mdx b/packages/meshy-content-generator/src/content/docs/providers.mdx deleted file mode 100644 index 9fb9ec58..00000000 --- a/packages/meshy-content-generator/src/content/docs/providers.mdx +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Meshy API ---- - -This project targets Meshy specifically. Task definitions map directly onto Meshy endpoints and the pipeline runner uses a Meshy client under the hood. - -Supported tasks include: - -- text-to-image -- text-to-3d-preview -- text-to-3d-refine -- multi-image-to-3d -- rigging -- animation diff --git a/packages/meshy-content-generator/src/content/docs/rate-limits.mdx b/packages/meshy-content-generator/src/content/docs/rate-limits.mdx deleted file mode 100644 index 92f4f820..00000000 --- a/packages/meshy-content-generator/src/content/docs/rate-limits.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Rate‑Limit Recovery ---- - -## Symptoms - -- Meshy requests fail with 429 or rate‑limit errors. -- Pipelines stall or slow down significantly. - -## Immediate mitigation - -- Reduce concurrent runs. -- Back off and retry after a short delay. -- Prefer preview tasks first; run refine in a separate window. - -## Operational strategies - -- **Queue runs** instead of firing parallel jobs. -- **Stagger animation runs** (animations can fan out quickly). -- **Use VCR in CI** to avoid hitting Meshy from tests. - -## Suggested default policy - -If you hit a rate limit, retry with exponential backoff. The Meshy client already retries on 429s using a linear backoff. You can increase `maxRetries` and `retryDelayMs` when initializing `MeshyClient`. diff --git a/packages/meshy-content-generator/src/content/docs/testing.mdx b/packages/meshy-content-generator/src/content/docs/testing.mdx deleted file mode 100644 index ffdc73e8..00000000 --- a/packages/meshy-content-generator/src/content/docs/testing.mdx +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Testing ---- - -## Test layers - -- **Unit**: schema validation, pipeline orchestration, input resolution, OpenAPI generation. -- **Integration**: Fastify API routes via `inject()`. -- **E2E**: Playwright against the running API server and preview page. -- **Contracts**: OpenAPI spec assertions (schemas and required fields). -- **CLI**: Snapshot tests for CLI output. -- **VCR**: Full Meshy pipeline run recorded once and replayed in CI. - -## Commands - -```bash -pnpm test:unit -pnpm test:e2e -pnpm test:all -``` - -## E2E notes - -Playwright starts the API server automatically (`pnpm dev`) and uses a dummy `MESHY_API_KEY`. The E2E suite does not call Meshy endpoints. - -Install browsers once: - -```bash -pnpm exec playwright install --with-deps -``` - -## VCR pipeline recording - -```bash -POLLY_MODE=record pnpm test:unit -``` - -After recording, set `POLLY_MODE=replay` for CI/default runs. diff --git a/packages/meshy-content-generator/src/content/docs/troubleshooting.mdx b/packages/meshy-content-generator/src/content/docs/troubleshooting.mdx deleted file mode 100644 index b595a034..00000000 --- a/packages/meshy-content-generator/src/content/docs/troubleshooting.mdx +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Troubleshooting ---- - -## Missing MESHY_API_KEY - -**Symptom**: `MESHY_API_KEY is required.` - -**Fix**: Set the key in your environment or `.env` file. - -```bash -MESHY_API_KEY=your_api_key -``` - -## Validation failures - -If `content-gen validate` reports missing inputs, check: - -- The manifest contains the required fields. -- The pipeline step path matches the manifest path. -- Lookup tables referenced by inputs are loaded. - -## Pipeline stuck or slow - -- Meshy tasks can take time. The runner streams until completion. -- Check Meshy queue status and credits in your Meshy dashboard. -- For CI, use VCR replay to avoid long waits. - -## Preview not loading - -- Ensure the asset is inside the working directory. -- Verify `assetDir` and `file` query parameters are correct. -- The preview uses `/file` to serve content; open `http://localhost:5177/file?...` directly to confirm access. - -## CORS / local access - -The preview is intended for local use. If you expose the API publicly, add authentication and strict CORS. diff --git a/packages/meshy-content-generator/src/content/docs/use-cases.mdx b/packages/meshy-content-generator/src/content/docs/use-cases.mdx deleted file mode 100644 index 9bb131d4..00000000 --- a/packages/meshy-content-generator/src/content/docs/use-cases.mdx +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: Use Cases ---- - -## Character pipeline (text → image → 3D → rig → animation) - -Use `character-full` when you want the full Meshy workflow and a rigged character ready for animation. - -```bash -content-gen run character-full ./assets/characters/hero \ - --pipelines ./pipelines/definitions \ - --tasks ./tasks/definitions -``` - -Typical outputs: - -- `concept.png` -- `preview.glb` -- `refined.glb` -- `rigged.glb` -- `animations/*.fbx` - -## Prop pipeline (text → 3D) - -Use `prop` for rapid asset iteration. - -```bash -content-gen run prop ./assets/props/katana \ - --pipelines ./pipelines/definitions \ - --tasks ./tasks/definitions -``` - -## API-driven generation - -Run the same pipelines over HTTP from build systems or internal tools. - -```bash -curl -X POST http://localhost:5177/runs \ - -H 'content-type: application/json' \ - -d '{ - "pipelineName": "character", - "assetDir": "./assets/characters/hero", - "wait": true - }' -``` diff --git a/packages/meshy-content-generator/src/core/definitions.ts b/packages/meshy-content-generator/src/core/definitions.ts deleted file mode 100644 index 36fa4693..00000000 --- a/packages/meshy-content-generator/src/core/definitions.ts +++ /dev/null @@ -1,59 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; -import type { PipelineDefinition, TaskDefinition } from "../schemas/definitions.js"; -import { PipelineDefinitionSchema, TaskDefinitionSchema } from "../schemas/definitions.js"; -import { readJson } from "../utils/json.js"; - -/** - * Parsed pipeline and task definitions loaded from JSON files. - */ -export interface DefinitionBundle { - pipelines: Map; - tasks: Map; -} - -/** - * Paths to definition directories on disk. - */ -export interface DefinitionLoadOptions { - /** Directory containing `*.pipeline.json` definitions. */ - pipelinesDir: string; - /** Directory containing task definition JSON files. */ - tasksDir: string; -} - -/** - * Load and validate pipeline/task definitions from disk. - * - * @param options - Directory paths for pipeline and task definitions. - * @returns Parsed and validated definition bundle. - */ -export async function loadJsonDefinitions( - options: DefinitionLoadOptions, -): Promise { - const pipelines = new Map(); - const tasks = new Map(); - - const pipelineFiles = fs - .readdirSync(options.pipelinesDir) - .filter((file) => file.endsWith(".pipeline.json")); - - for (const file of pipelineFiles) { - const fullPath = path.join(options.pipelinesDir, file); - const data = readJson(fullPath); - const parsed = PipelineDefinitionSchema.parse(data); - pipelines.set(parsed.name, parsed); - } - - const taskFiles = fs.readdirSync(options.tasksDir).filter((file) => file.endsWith(".json")); - - for (const file of taskFiles) { - const fullPath = path.join(options.tasksDir, file); - const data = readJson(fullPath); - if (!("id" in (data as Record))) continue; - const parsed = TaskDefinitionSchema.parse(data); - tasks.set(parsed.id, parsed); - } - - return { pipelines, tasks }; -} diff --git a/packages/meshy-content-generator/src/core/runner.ts b/packages/meshy-content-generator/src/core/runner.ts deleted file mode 100644 index 25718949..00000000 --- a/packages/meshy-content-generator/src/core/runner.ts +++ /dev/null @@ -1,690 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; -import { Readable } from "node:stream"; -import type { ReadableStream as WebReadableStream } from "node:stream/web"; -import seedrandom from "seedrandom"; -import type { TaskResult } from "../meshy/meshy-client.js"; -import { MeshyClient } from "../meshy/meshy-client.js"; -import type { - InputBinding, - PipelineDefinition, - PipelineStep, - TaskDefinition, -} from "../schemas/definitions.js"; -import type { AssetManifest, TaskState } from "../schemas/manifest.js"; -import { AssetManifestSchema } from "../schemas/manifest.js"; -import { readJson, writeJson } from "../utils/json.js"; -import { getPathValue, setPathValue } from "../utils/object-path.js"; -import { applyTemplate } from "../utils/template.js"; -import type { DefinitionBundle } from "./definitions.js"; - -export interface PipelineRunnerOptions { - /** Loaded pipeline/task definitions. */ - definitions: DefinitionBundle; - /** Meshy API key used to authenticate requests. */ - apiKey: string; - /** Optional Meshy client override (useful for testing). */ - client?: MeshyClient; - /** Lookup tables for binding inputs by key. */ - lookups?: Record>; - /** Optional logger to capture pipeline progress. */ - logger?: (message: string) => void; -} - -export interface RunOptions { - /** Pipeline definition name. */ - pipelineName: string; - /** Asset directory containing the manifest.json file. */ - assetDir: string; - /** Optional step id to run within the pipeline. */ - step?: string; -} - -interface StepResult { - taskId?: string; - status: string; - outputs: Record; - artifacts: Record; -} - -interface ExecutionContext { - manifest: AssetManifest; - assetDir: string; - stepResults: Map; - iterationVars: Record; - seed: number; -} - -/** - * Executes declarative pipelines against asset manifests. - */ -export class PipelineRunner { - private readonly definitions: DefinitionBundle; - private readonly client: MeshyClient; - private readonly lookups: Record>; - private readonly logger: (message: string) => void; - - constructor(options: PipelineRunnerOptions) { - this.definitions = options.definitions; - this.client = options.client ?? new MeshyClient({ apiKey: options.apiKey }); - this.lookups = options.lookups ?? {}; - this.logger = options.logger ?? console.log; - } - - /** - * Run a pipeline against the manifest in the provided asset directory. - * - * @param options - Pipeline execution options. - * @returns Updated manifest with task state. - */ - async run(options: RunOptions): Promise { - const pipeline = this.getPipeline(options.pipelineName); - const manifestPath = path.join(options.assetDir, "manifest.json"); - if (!fs.existsSync(manifestPath)) { - throw new Error(`Manifest not found: ${manifestPath}`); - } - - const manifest = AssetManifestSchema.parse(readJson(manifestPath)); - const seeded = this.ensureSeed(manifest, manifestPath); - - const context: ExecutionContext = { - manifest: seeded, - assetDir: options.assetDir, - stepResults: new Map(), - iterationVars: {}, - seed: seeded.seed ?? 0, - }; - - this.loadExistingResults(pipeline, context); - - const stepsToRun = options.step - ? pipeline.steps.filter((step) => step.id === options.step) - : pipeline.steps; - - for (const step of stepsToRun) { - await this.executeStep(step, pipeline, context); - writeJson(manifestPath, context.manifest); - } - - return context.manifest; - } - - /** - * Resolve a pipeline definition by name. - */ - private getPipeline(name: string): PipelineDefinition { - const pipeline = this.definitions.pipelines.get(name); - if (!pipeline) throw new Error(`Pipeline definition not found: ${name}`); - return pipeline; - } - - /** - * Resolve a task definition by id. - */ - private getTask(id: string): TaskDefinition { - const task = this.definitions.tasks.get(id); - if (!task) throw new Error(`Task definition not found: ${id}`); - return task; - } - - /** - * Ensure the manifest has a deterministic seed, generating one if missing. - */ - private ensureSeed(manifest: AssetManifest, manifestPath: string): AssetManifest { - if (manifest.seed !== undefined) return manifest; - const rng = seedrandom(); - const seed = rng.int32() >>> 0; - const updated = { ...manifest, seed }; - writeJson(manifestPath, updated); - return updated; - } - - /** - * Load existing task state from the manifest into the execution context. - */ - private loadExistingResults(pipeline: PipelineDefinition, context: ExecutionContext): void { - const tasks = context.manifest.tasks ?? {}; - for (const step of pipeline.steps) { - const state = tasks[step.task]; - if (!state) continue; - const result: StepResult = { - status: state.status ?? "UNKNOWN", - outputs: state.outputs ?? {}, - artifacts: state.artifacts ?? {}, - }; - if (state.taskId) { - result.taskId = state.taskId; - } - context.stepResults.set(step.id, result); - } - } - - /** - * Execute a pipeline step (including dependency checks and forEach handling). - */ - private async executeStep( - step: PipelineStep, - pipeline: PipelineDefinition, - context: ExecutionContext, - ): Promise { - for (const dep of step.dependsOn ?? []) { - const existing = context.stepResults.get(dep); - if (!existing) { - throw new Error(`Dependency '${dep}' not completed for step '${step.id}'`); - } - } - - if (step.forEach) { - await this.executeForEach(step, pipeline, context); - return; - } - - const stepResult = await this.executeTask(step, context); - context.stepResults.set(step.id, stepResult); - this.applyStateMappings(pipeline, step, context, stepResult); - } - - /** - * Execute a step multiple times for each resolved item. - */ - private async executeForEach( - step: PipelineStep, - pipeline: PipelineDefinition, - context: ExecutionContext, - ): Promise { - const forEach = step.forEach; - if (!forEach) return; - - const iterable = this.resolveForEachSource(forEach.source, forEach, context); - if (!Array.isArray(iterable)) { - throw new Error(`forEach source for step '${step.id}' did not resolve to an array.`); - } - - const results: StepResult[] = []; - let index = 0; - for (const item of iterable) { - context.iterationVars[forEach.as] = item; - context.iterationVars[`${forEach.as}_index`] = index; - const result = await this.executeTask(step, context); - results.push(result); - index += 1; - } - - context.stepResults.set(step.id, results); - if (results.length > 0) { - const latest = results[results.length - 1]; - if (latest) { - this.applyStateMappings(pipeline, step, context, latest); - } - } - } - - /** - * Resolve a forEach source array from manifest, step output, or literal input. - */ - private resolveForEachSource( - source: InputBinding["source"], - binding: { - path?: string | undefined; - step?: string | undefined; - table?: string | undefined; - key?: string | undefined; - }, - context: ExecutionContext, - ): unknown { - switch (source) { - case "manifest": - return binding.path ? getPathValue(context.manifest, binding.path) : undefined; - case "step": - if (!binding.step || !binding.path) return undefined; - return this.resolveStepOutput(binding.step, binding.path, context); - case "literal": - return binding.path; - case "env": - return binding.path ? process.env[binding.path] : undefined; - case "lookup": - if (!binding.table) return undefined; - if (binding.key) { - const resolvedKey = applyTemplate(binding.key, { - ...context.iterationVars, - seed: context.seed, - assetId: context.manifest.id, - }); - return this.lookups[binding.table]?.[resolvedKey]; - } - return Object.values(this.lookups[binding.table] ?? {}); - default: - return undefined; - } - } - - /** - * Execute a single task using the configured provider. - * Skips already-succeeded tasks and only downloads missing artifacts. - */ - private async executeTask(step: PipelineStep, context: ExecutionContext): Promise { - const taskDef = this.getTask(step.task); - const shouldDownloadArtifacts = !step.skipArtifacts; - - // Check if task already succeeded - skip re-running, just ensure artifacts - const existingResult = context.stepResults.get(step.id); - const existing = Array.isArray(existingResult) ? existingResult[0] : existingResult; - if (existing && existing.status === "SUCCEEDED" && existing.taskId) { - this.logger( - `\n▶ Step ${step.id} (${taskDef.id}) - already SUCCEEDED${shouldDownloadArtifacts ? ", checking artifacts" : ", skipping artifacts"}`, - ); - - // Check for missing artifacts and download them (unless skipArtifacts is set) - if (shouldDownloadArtifacts) { - const missingArtifacts = await this.downloadMissingArtifacts(taskDef, existing, context); - if (Object.keys(missingArtifacts).length > 0) { - existing.artifacts = { ...existing.artifacts, ...missingArtifacts }; - this.updateTaskArtifacts(taskDef, existing.artifacts, context); - } - } - - return existing; - } - - const inputs = this.resolveInputs(taskDef, step, context); - - this.logger(`\n▶ Step ${step.id} (${taskDef.id})`); - const result = await this.runMeshyTask(taskDef, inputs); - - const outputs = { - ...this.mapOutputs(taskDef, result), - taskId: result.id, - }; - - // Download artifacts unless skipArtifacts is set on the step - const artifacts = shouldDownloadArtifacts - ? await this.downloadArtifacts(taskDef, outputs, context) - : {}; - - this.persistTaskState(taskDef, result, outputs, artifacts, context); - - return { - taskId: result.id, - status: result.status, - outputs, - artifacts, - }; - } - - /** - * Download artifacts that are missing from an already-succeeded task. - * Fetches task details from Meshy API if URLs are not cached in outputs. - */ - private async downloadMissingArtifacts( - taskDef: TaskDefinition, - existing: StepResult, - context: ExecutionContext, - ): Promise> { - const missingArtifacts: Record = {}; - - // Check which outputs need downloading - const outputsNeedingDownload: Array<{ - output: (typeof taskDef.outputs)[0]; - filename: string; - targetPath: string; - }> = []; - - for (const output of taskDef.outputs) { - if (!output.artifact) continue; - - const filename = applyTemplate(output.artifact, { - ...context.iterationVars, - seed: context.seed, - assetId: context.manifest.id, - }); - const targetPath = path.join(context.assetDir, filename); - - if (fs.existsSync(targetPath)) { - this.logger(` ✓ ${filename} already exists`); - continue; - } - - outputsNeedingDownload.push({ output, filename, targetPath }); - } - - if (outputsNeedingDownload.length === 0) { - return missingArtifacts; - } - - // Fetch task details from Meshy API to get download URLs - let outputs = existing.outputs; - if (existing.taskId) { - try { - const apiVersion = taskDef.apiVersion ?? "v1"; - const endpoint = taskDef.endpoint ?? taskDef.id; - const fetchPath = `/${apiVersion}/${endpoint}/${existing.taskId}`; - const taskDetails = await this.client.get>(fetchPath); - - // Map the response to outputs - // Some APIs return { result: { url: ... } }, others return { model_urls: { glb: ... } } - // Wrap in { result: ... } only if the response doesn't already have a result property - // AND the responsePath starts with "result." - const hasResultProperty = - taskDetails && typeof taskDetails === "object" && "result" in taskDetails; - outputs = {}; - for (const output of taskDef.outputs) { - let source: Record; - if (output.responsePath.startsWith("result.") && !hasResultProperty) { - source = { result: taskDetails }; - } else { - source = taskDetails as Record; - } - const value = getPathValue(source, output.responsePath); - outputs[output.name] = value; - } - } catch (err) { - this.logger(` ⚠ Failed to fetch task details: ${err}`); - return missingArtifacts; - } - } - - // Download the files - for (const { output, filename, targetPath } of outputsNeedingDownload) { - const url = outputs[output.name]; - if (typeof url === "string" && url.trim()) { - this.logger(` ↓ Downloading ${filename}...`); - try { - await this.downloadFile(url, targetPath); - missingArtifacts[output.name] = filename; - this.logger(` ✓ Downloaded ${filename}`); - } catch (err) { - this.logger(` ✗ Failed to download ${filename}: ${err}`); - } - } else { - this.logger(` ⚠ No URL for ${output.name}`); - } - } - - return missingArtifacts; - } - - /** - * Update only the artifacts in manifest task state without overwriting other fields. - */ - private updateTaskArtifacts( - taskDef: TaskDefinition, - artifacts: Record, - context: ExecutionContext, - ): void { - const tasks = context.manifest.tasks ?? {}; - const state = tasks[taskDef.id]; - if (state) { - state.artifacts = { ...state.artifacts, ...artifacts }; - } - } - - /** - * Resolve task inputs from manifest, step outputs, env vars, or lookups. - */ - private resolveInputs( - taskDef: TaskDefinition, - step: PipelineStep, - context: ExecutionContext, - ): Record { - const bindings = new Map(); - for (const input of taskDef.inputs) { - bindings.set(input.name, input); - } - for (const input of step.inputs ?? []) { - bindings.set(input.name, input); - } - - const resolved: Record = {}; - const templateVars = { - ...context.iterationVars, - seed: context.seed, - assetId: context.manifest.id, - }; - - for (const binding of bindings.values()) { - const value = this.resolveInput(binding, context, templateVars); - if (value !== undefined) { - resolved[binding.name] = value; - } else if (binding.default !== undefined) { - resolved[binding.name] = binding.default; - } - } - - return resolved; - } - - /** - * Resolve one input binding into a concrete value. - */ - private resolveInput( - binding: InputBinding, - context: ExecutionContext, - templateVars: Record, - ): unknown { - const resolvePath = (raw?: string): string | undefined => { - if (!raw) return undefined; - return applyTemplate(raw, templateVars); - }; - - switch (binding.source) { - case "literal": - if (typeof binding.value === "string") { - return applyTemplate(binding.value, templateVars); - } - return binding.value; - case "env": - return binding.path ? process.env[resolvePath(binding.path) ?? ""] : undefined; - case "manifest": - return binding.path - ? getPathValue(context.manifest, resolvePath(binding.path) ?? "") - : undefined; - case "step": - if (!binding.step || !binding.path) return undefined; - return this.resolveStepOutput(binding.step, resolvePath(binding.path) ?? "", context); - case "lookup": - if (!binding.table) return undefined; - return this.lookups[binding.table]?.[applyTemplate(binding.key ?? "", templateVars)]; - default: - return undefined; - } - } - - /** - * Read a value from a previous step output by path. - */ - private resolveStepOutput(stepId: string, pathValue: string, context: ExecutionContext): unknown { - const result = context.stepResults.get(stepId); - if (!result) return undefined; - const latest = Array.isArray(result) ? result[result.length - 1] : result; - if (!latest) return undefined; - return getPathValue(latest.outputs, pathValue); - } - - /** - * Map provider response into named outputs based on task definition. - */ - private mapOutputs( - taskDef: TaskDefinition, - result: TaskResult>, - ): Record { - const outputs: Record = {}; - const source = (result.result ?? (result as unknown as Record)) as Record< - string, - unknown - >; - for (const output of taskDef.outputs) { - const value = getPathValue(source, output.responsePath); - outputs[output.name] = value; - } - return outputs; - } - - /** - * Download artifact URLs into the asset directory. - */ - private async downloadArtifacts( - taskDef: TaskDefinition, - outputs: Record, - context: ExecutionContext, - ): Promise> { - const artifacts: Record = {}; - - for (const output of taskDef.outputs) { - if (!output.artifact) continue; - const value = outputs[output.name]; - if (typeof value === "string") { - if (!value.trim()) continue; - const filename = applyTemplate(output.artifact, { - ...context.iterationVars, - seed: context.seed, - assetId: context.manifest.id, - }); - const targetPath = path.join(context.assetDir, filename); - await this.downloadFile(value, targetPath); - artifacts[output.name] = filename; - continue; - } - - if (Array.isArray(value)) { - let index = 0; - for (const item of value) { - if (typeof item !== "string" || !item.trim()) { - index += 1; - continue; - } - const filename = applyTemplate(output.artifact, { - ...context.iterationVars, - seed: context.seed, - assetId: context.manifest.id, - index, - }); - const targetPath = path.join(context.assetDir, filename); - await this.downloadFile(item, targetPath); - artifacts[`${output.name}.${index}`] = filename; - index += 1; - } - } - } - - return artifacts; - } - - /** - * Download a single file from URL to a local path. - */ - private async downloadFile(url: string, targetPath: string): Promise { - if (!url || !url.trim()) return; - const response = await fetch(url); - if (!response.ok || !response.body) { - throw new Error(`Failed to download artifact: ${url}`); - } - - await fs.promises.mkdir(path.dirname(targetPath), { recursive: true }); - const fileStream = fs.createWriteStream(targetPath); - const nodeStream = Readable.fromWeb(response.body as unknown as WebReadableStream); - await new Promise((resolve, reject) => { - nodeStream - .pipe(fileStream) - .on("finish", () => resolve()) - .on("error", (error: Error) => reject(error)); - }); - } - - /** - * Persist task outputs into the manifest's task state. - */ - private persistTaskState( - taskDef: TaskDefinition, - result: TaskResult>, - outputs: Record, - artifacts: Record, - context: ExecutionContext, - ): void { - const tasks = context.manifest.tasks ?? {}; - const state: TaskState = { - taskId: result.id, - status: result.status, - outputs, - artifacts, - }; - tasks[taskDef.id] = state; - context.manifest.tasks = tasks; - } - - /** - * Apply output values into manifest paths using mapping rules. - */ - private applyStateMappings( - pipeline: PipelineDefinition, - step: PipelineStep, - context: ExecutionContext, - stepResult: StepResult, - ): void { - const mapping = { - ...(pipeline.stateMapping ?? {}), - ...(step.stateMapping ?? {}), - }; - - for (const [manifestPath, outputPath] of Object.entries(mapping)) { - const value = getPathValue(stepResult.outputs, outputPath); - if (value !== undefined) { - setPathValue(context.manifest as Record, manifestPath, value); - } - } - } - - private async runMeshyTask( - taskDef: TaskDefinition, - inputs: Record, - ): Promise>> { - const apiVersion = taskDef.apiVersion ?? "v1"; - const endpoint = taskDef.endpoint ?? taskDef.id; - const method = taskDef.method ?? "POST"; - - if (method !== "POST") { - throw new Error(`Unsupported Meshy method '${method}' for task '${taskDef.id}'.`); - } - - const createPath = `/${apiVersion}/${endpoint}`; - const payload = Object.fromEntries( - Object.entries(inputs).filter(([, value]) => value !== undefined && value !== ""), - ); - - const createResponse = await this.client.post<{ result?: string; id?: string }>( - createPath, - payload, - ); - const taskId = createResponse.result ?? createResponse.id; - if (!taskId) { - throw new Error( - `Meshy task creation failed for ${taskDef.id}: ${JSON.stringify(createResponse)}`, - ); - } - - const streamPath = `/${apiVersion}/${endpoint}/${taskId}/stream`; - const result = await this.client.streamUntilComplete>(streamPath); - - if (result.result) { - return { ...result, id: taskId }; - } - - const fetchPath = `/${apiVersion}/${endpoint}/${taskId}`; - const fetched = await this.client.get>(fetchPath); - const fetchedResult = - typeof fetched === "object" && fetched !== null && "result" in fetched - ? (fetched as { result?: Record }).result - : fetched; - - const combined: TaskResult> = { - ...result, - ...(typeof fetched === "object" ? fetched : {}), - id: taskId, - }; - const finalResult = fetchedResult ?? result.result; - if (typeof finalResult !== "undefined") { - combined.result = finalResult; - } - - return combined; - } -} diff --git a/packages/meshy-content-generator/src/core/validator.ts b/packages/meshy-content-generator/src/core/validator.ts deleted file mode 100644 index ea4f81e0..00000000 --- a/packages/meshy-content-generator/src/core/validator.ts +++ /dev/null @@ -1,290 +0,0 @@ -import type { - InputBinding, - PipelineDefinition, - PipelineStep, - TaskDefinition, -} from "../schemas/definitions.js"; -import type { AssetManifest } from "../schemas/manifest.js"; -import { AssetManifestSchema } from "../schemas/manifest.js"; -import { getPathValue } from "../utils/object-path.js"; -import { applyTemplate } from "../utils/template.js"; -import type { DefinitionBundle } from "./definitions.js"; - -/** - * Validation errors and warnings produced by the manifest validator. - */ -export interface ValidationResult { - errors: string[]; - warnings: string[]; -} - -/** - * Options for validating a manifest against a pipeline definition. - */ -export interface ValidationOptions { - definitions: DefinitionBundle; - pipelineName: string; - manifest: unknown; - env?: Record; - lookups?: Record>; -} - -interface ValidationContext { - manifest: AssetManifest; - stepResults: Map< - string, - { outputs: Record } | { outputs: Record }[] - >; - iterationVars: Record; - env: Record; - lookups: Record>; -} - -/** - * Validate a manifest and its pipeline/task bindings without executing any Meshy calls. - */ -/** - * Validate a manifest against the pipeline/task definitions without executing Meshy calls. - */ -export function validateManifestAndPipeline(options: ValidationOptions): ValidationResult { - const errors: string[] = []; - const warnings: string[] = []; - const env = options.env ?? process.env; - const lookups = options.lookups ?? {}; - - const manifestResult = AssetManifestSchema.safeParse(options.manifest); - if (!manifestResult.success) { - errors.push(`Manifest schema invalid: ${manifestResult.error.message}`); - return { errors, warnings }; - } - - const manifest = manifestResult.data; - const pipeline = options.definitions.pipelines.get(options.pipelineName); - if (!pipeline) { - errors.push(`Pipeline definition not found: ${options.pipelineName}`); - return { errors, warnings }; - } - - const stepIds = new Set(); - for (const step of pipeline.steps) { - if (stepIds.has(step.id)) { - errors.push(`Duplicate step id '${step.id}' in pipeline '${pipeline.name}'.`); - } - stepIds.add(step.id); - } - - for (const step of pipeline.steps) { - for (const dep of step.dependsOn ?? []) { - if (!stepIds.has(dep)) { - errors.push(`Step '${step.id}' depends on missing step '${dep}'.`); - } - } - } - - const context: ValidationContext = { - manifest, - stepResults: new Map(), - iterationVars: {}, - env, - lookups, - }; - - for (const step of pipeline.steps) { - const task = options.definitions.tasks.get(step.task); - if (!task) { - errors.push(`Task definition not found for step '${step.id}': ${step.task}`); - continue; - } - - if (step.forEach) { - const iterable = resolveForEachSource( - step.forEach.source, - step.forEach, - context, - errors, - warnings, - ); - if (Array.isArray(iterable)) { - iterable.forEach((item, index) => { - context.iterationVars[step.forEach?.as ?? "item"] = item; - context.iterationVars[`${step.forEach?.as ?? "item"}_index`] = index; - validateStepInputs(step, task, pipeline, context, errors, warnings); - }); - } else { - errors.push(`forEach source for step '${step.id}' did not resolve to an array.`); - } - } else { - validateStepInputs(step, task, pipeline, context, errors, warnings); - } - } - - return { errors, warnings }; -} - -function validateStepInputs( - step: PipelineStep, - taskDef: TaskDefinition, - pipeline: PipelineDefinition, - context: ValidationContext, - errors: string[], - warnings: string[], -): void { - const bindings = new Map(); - for (const input of taskDef.inputs) { - bindings.set(input.name, input); - } - for (const input of step.inputs ?? []) { - bindings.set(input.name, input); - } - - const templateVars = { - ...context.iterationVars, - seed: context.manifest.seed ?? 0, - assetId: context.manifest.id, - }; - - for (const binding of bindings.values()) { - const resolved = resolveInput(binding, context, templateVars, pipeline, errors, warnings); - if (resolved === undefined && binding.default === undefined) { - if ( - binding.source === "manifest" || - binding.source === "env" || - binding.source === "lookup" - ) { - errors.push( - `Missing required input '${binding.name}' for step '${step.id}' (task '${taskDef.id}').`, - ); - } else if (binding.source === "literal") { - warnings.push( - `Optional literal input '${binding.name}' has no value for step '${step.id}'.`, - ); - } - } - } -} - -function resolveInput( - binding: InputBinding, - context: ValidationContext, - templateVars: Record, - pipeline: PipelineDefinition, - errors: string[], - warnings: string[], -): unknown { - const resolvePath = (raw?: string): string | undefined => { - if (!raw) return undefined; - return applyTemplate(raw, templateVars); - }; - - switch (binding.source) { - case "literal": - if (typeof binding.value === "string") { - return applyTemplate(binding.value, templateVars); - } - return binding.value; - case "env": { - const envKey = resolvePath(binding.path); - if (!envKey) { - errors.push(`Env binding missing key for '${binding.name}'.`); - return undefined; - } - return context.env[envKey]; - } - case "manifest": { - const pathValue = resolvePath(binding.path); - if (!pathValue) { - errors.push(`Manifest binding missing path for '${binding.name}'.`); - return undefined; - } - return getPathValue(context.manifest, pathValue); - } - case "step": - if (!binding.step || !binding.path) { - errors.push(`Step binding missing step/path for '${binding.name}'.`); - return undefined; - } - if (!pipeline.steps.some((step) => step.id === binding.step)) { - errors.push( - `Step binding references missing step '${binding.step}' for '${binding.name}'.`, - ); - } else { - warnings.push( - `Step binding '${binding.name}' resolved at runtime from step '${binding.step}'.`, - ); - } - return undefined; - case "lookup": { - if (!binding.table) { - errors.push(`Lookup binding missing table for '${binding.name}'.`); - return undefined; - } - const table = context.lookups[binding.table]; - if (!table) { - errors.push(`Lookup table '${binding.table}' missing for '${binding.name}'.`); - return undefined; - } - const key = applyTemplate(binding.key ?? binding.path ?? "", templateVars); - if (!key) { - errors.push(`Lookup binding missing key for '${binding.name}'.`); - return undefined; - } - return table[key]; - } - default: - return undefined; - } -} - -function resolveForEachSource( - source: InputBinding["source"], - binding: { - path?: string | undefined; - step?: string | undefined; - table?: string | undefined; - key?: string | undefined; - as?: string | undefined; - }, - context: ValidationContext, - errors: string[], - warnings: string[], -): unknown { - const templateVars = { - ...context.iterationVars, - seed: context.manifest.seed ?? 0, - assetId: context.manifest.id, - }; - - switch (source) { - case "manifest": { - const pathValue = binding.path ? applyTemplate(binding.path, templateVars) : ""; - return pathValue ? getPathValue(context.manifest, pathValue) : undefined; - } - case "step": - warnings.push( - `forEach source uses step '${binding.step ?? "unknown"}' and cannot be resolved at validate-time.`, - ); - return undefined; - case "literal": - return binding.path ? applyTemplate(binding.path, templateVars) : binding.path; - case "env": - return binding.path ? context.env[applyTemplate(binding.path, templateVars)] : undefined; - case "lookup": { - if (!binding.table) { - errors.push("forEach lookup source missing table."); - return undefined; - } - const table = context.lookups[binding.table]; - if (!table) { - errors.push(`forEach lookup table '${binding.table}' missing.`); - return undefined; - } - const key = binding.key ?? binding.path; - if (!key) { - return Object.values(table); - } - return table[applyTemplate(key, templateVars)]; - } - default: - return undefined; - } -} diff --git a/packages/meshy-content-generator/src/env.d.ts b/packages/meshy-content-generator/src/env.d.ts deleted file mode 100644 index e16c13c6..00000000 --- a/packages/meshy-content-generator/src/env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/packages/meshy-content-generator/src/index.ts b/packages/meshy-content-generator/src/index.ts deleted file mode 100644 index dbb2cd4f..00000000 --- a/packages/meshy-content-generator/src/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -export type { DefinitionBundle, DefinitionLoadOptions } from "./core/definitions.js"; -export { loadJsonDefinitions } from "./core/definitions.js"; -export type { PipelineRunnerOptions, RunOptions } from "./core/runner.js"; -export { PipelineRunner } from "./core/runner.js"; -export type { ValidationOptions, ValidationResult } from "./core/validator.js"; -export { validateManifestAndPipeline } from "./core/validator.js"; -export { loadAnimationIds } from "./lookups/animation-ids.js"; -export type { - InputBinding, - OutputBinding, - PipelineDefinition, - PipelineStep, - TaskDefinition, -} from "./schemas/definitions.js"; -export type { AssetManifest, TaskState } from "./schemas/manifest.js"; -export { AssetManifestSchema, TaskStateSchema } from "./schemas/manifest.js"; diff --git a/packages/meshy-content-generator/src/lookups/animation-ids.ts b/packages/meshy-content-generator/src/lookups/animation-ids.ts deleted file mode 100644 index 4de6b60b..00000000 --- a/packages/meshy-content-generator/src/lookups/animation-ids.ts +++ /dev/null @@ -1,19 +0,0 @@ -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import { readJson } from "../utils/json.js"; - -export interface AnimationLibrary { - name: string; - description: string; - source: string; - syncedAt: string; - totalAnimations: number; - byPath: Record; -} - -export function loadAnimationIds(): Record { - const __dirname = path.dirname(fileURLToPath(import.meta.url)); - const filePath = path.resolve(__dirname, "../../lookups/animation-library.json"); - const library = readJson(filePath); - return library.byPath; -} diff --git a/packages/meshy-content-generator/src/meshy/meshy-client.ts b/packages/meshy-content-generator/src/meshy/meshy-client.ts deleted file mode 100644 index 59a38d8b..00000000 --- a/packages/meshy-content-generator/src/meshy/meshy-client.ts +++ /dev/null @@ -1,258 +0,0 @@ -/** - * Meshy API Client - * - * Base client with authentication, error handling, and rate limiting. - */ - -export interface MeshyClientConfig { - /** Meshy API key. */ - apiKey: string; - /** Override base URL for Meshy (default: https://api.meshy.ai/openapi). */ - baseUrl?: string; - /** SSE stream timeout in milliseconds. */ - streamTimeoutMs?: number; - /** Max retries on rate-limit errors. */ - maxRetries?: number; - /** Base delay (ms) between retries. */ - retryDelayMs?: number; -} - -export type TaskStatus = "PENDING" | "IN_PROGRESS" | "SUCCEEDED" | "FAILED" | "CANCELED"; - -export interface TaskResult { - id: string; - status: TaskStatus; - progress: number; - result?: T; - task_error?: { message: string }; -} - -export class MeshyApiError extends Error { - constructor( - message: string, - public readonly statusCode: number, - public readonly isRateLimit = false, - public readonly isAuthError = false, - ) { - super(message); - this.name = "MeshyApiError"; - } -} - -export class RateLimitError extends MeshyApiError { - constructor(message: string) { - super(message, 429, true, false); - this.name = "RateLimitError"; - } -} - -export class AuthenticationError extends MeshyApiError { - constructor(message: string) { - super(message, 401, false, true); - this.name = "AuthenticationError"; - } -} - -export class InsufficientCreditsError extends MeshyApiError { - constructor(message: string) { - super(message, 402, false, false); - this.name = "InsufficientCreditsError"; - } -} - -/** - * Low-level Meshy API client with streaming support. - */ -export class MeshyClient { - private readonly apiKey: string; - private readonly baseUrl: string; - private readonly streamTimeoutMs: number; - private readonly maxRetries: number; - private readonly retryDelayMs: number; - - constructor(config: MeshyClientConfig) { - this.apiKey = config.apiKey; - this.baseUrl = (config.baseUrl ?? "https://api.meshy.ai/openapi").replace(/\/$/, ""); - this.streamTimeoutMs = config.streamTimeoutMs ?? 600_000; - this.maxRetries = config.maxRetries ?? 3; - this.retryDelayMs = config.retryDelayMs ?? 1000; - } - - /** - * Perform a GET request against the Meshy API. - * - * @param path - API path (e.g. /v1/text-to-image). - * @param query - Optional query params. - */ - async get( - path: string, - query?: Record, - ): Promise { - return this.request("GET", path, undefined, query); - } - - /** - * Perform a POST request against the Meshy API. - * - * @param path - API path (e.g. /v2/text-to-3d). - * @param body - JSON payload for Meshy. - */ - async post(path: string, body: unknown): Promise { - return this.request("POST", path, body); - } - - /** - * Perform a DELETE request against the Meshy API. - * - * @param path - API path to delete. - */ - async delete(path: string): Promise { - await this.request("DELETE", path); - } - - /** - * Stream task progress (SSE) until completion. - * - * @param path - Stream endpoint for a Meshy task. - */ - async streamUntilComplete(path: string): Promise> { - const url = this.buildUrl(path); - - const response = await fetch(url, { - method: "GET", - headers: { - Authorization: `Bearer ${this.apiKey}`, - Accept: "text/event-stream", - }, - signal: AbortSignal.timeout(this.streamTimeoutMs), - }); - - await this.ensureOk(response); - - if (!response.body) { - throw new MeshyApiError("Streaming response did not include a body", 500); - } - - const reader = response.body.getReader(); - const decoder = new TextDecoder(); - let buffer = ""; - let finalResult: TaskResult | null = null; - - try { - while (true) { - const { value, done } = await reader.read(); - if (done) break; - - buffer += decoder.decode(value, { stream: true }); - const lines = buffer.split(/\r?\n/); - buffer = lines.pop() ?? ""; - - for (const line of lines) { - if (!line.trim().startsWith("data:")) continue; - - const payload = line.replace(/^data:\s*/, ""); - try { - const parsed = JSON.parse(payload) as TaskResult; - finalResult = parsed; - - if (["SUCCEEDED", "FAILED", "CANCELED"].includes(parsed.status)) { - await reader.cancel(); - return parsed; - } - } catch { - // Ignore parse errors for non-JSON lines - } - } - } - } finally { - reader.releaseLock(); - } - - if (finalResult) return finalResult; - throw new MeshyApiError("No data received from stream", 500); - } - - /** - * Core HTTP handler with retry/backoff for rate limits. - */ - private async request( - method: string, - path: string, - body?: unknown, - query?: Record, - ): Promise { - let lastError: Error | null = null; - - for (let attempt = 1; attempt <= this.maxRetries + 1; attempt += 1) { - try { - const url = this.buildUrl(path, query); - const response = await fetch(url, { - method, - headers: { - Authorization: `Bearer ${this.apiKey}`, - "Content-Type": "application/json", - }, - body: body ? JSON.stringify(body) : null, - }); - - await this.ensureOk(response); - - if (response.status === 204) { - return undefined as T; - } - - return (await response.json()) as T; - } catch (error) { - lastError = error as Error; - if (error instanceof RateLimitError && attempt <= this.maxRetries) { - await this.delay(this.retryDelayMs * attempt); - continue; - } - break; - } - } - - throw lastError ?? new MeshyApiError("Unknown Meshy error", 500); - } - - /** - * Build a full API URL with query parameters. - */ - private buildUrl(path: string, query?: Record): string { - const url = new URL(`${this.baseUrl}${path.startsWith("/") ? "" : "/"}${path}`); - if (query) { - for (const [key, value] of Object.entries(query)) { - url.searchParams.set(key, String(value)); - } - } - return url.toString(); - } - - /** - * Validate HTTP responses and surface Meshy errors. - */ - private async ensureOk(response: Response): Promise { - if (response.ok) return; - - let message = response.statusText; - try { - const payload = (await response.json()) as { message?: string }; - if (payload.message) message = payload.message; - } catch { - // Ignore JSON parse errors - } - - if (response.status === 401) throw new AuthenticationError(message); - if (response.status === 402) throw new InsufficientCreditsError(message); - if (response.status === 429) throw new RateLimitError(message); - - throw new MeshyApiError(message, response.status); - } - - /** - * Delay helper for retry backoff. - */ - private async delay(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); - } -} diff --git a/packages/meshy-content-generator/src/schemas/definitions.ts b/packages/meshy-content-generator/src/schemas/definitions.ts deleted file mode 100644 index 7c07b93a..00000000 --- a/packages/meshy-content-generator/src/schemas/definitions.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { z } from "zod"; - -const inputSource = z.enum(["manifest", "step", "literal", "env", "lookup"]); - -export const InputBindingSchema = z.object({ - name: z.string(), - source: inputSource, - path: z.string().optional(), - step: z.string().optional(), - table: z.string().optional(), - key: z.string().optional(), - value: z.unknown().optional(), - default: z.unknown().optional(), -}); - -export const OutputBindingSchema = z.object({ - name: z.string(), - responsePath: z.string(), - artifact: z.string().optional(), -}); - -export const TaskDefinitionSchema = z.object({ - id: z.string(), - description: z.string().optional(), - apiVersion: z.string().optional(), - endpoint: z.string().optional(), - method: z.enum(["GET", "POST", "DELETE"]).optional(), - inputs: z.array(InputBindingSchema).default([]), - outputs: z.array(OutputBindingSchema).default([]), - poll: z - .object({ - strategy: z.enum(["stream", "poll"]).default("stream"), - path: z.string(), - intervalMs: z.number().int().positive().optional(), - timeoutMs: z.number().int().positive().optional(), - }) - .optional(), -}); - -export const PipelineStepSchema = z.object({ - id: z.string(), - task: z.string(), - dependsOn: z.array(z.string()).optional(), - forEach: z - .object({ - source: inputSource, - path: z.string().optional(), - step: z.string().optional(), - table: z.string().optional(), - key: z.string().optional(), - as: z.string(), - }) - .optional(), - inputs: z.array(InputBindingSchema).optional(), - stateMapping: z.record(z.string(), z.string()).optional(), - /** Skip downloading artifacts for this step. Useful for interim pipeline stages. */ - skipArtifacts: z.boolean().optional(), -}); - -export const PipelineDefinitionSchema = z.object({ - name: z.string(), - description: z.string().optional(), - version: z.string().optional(), - steps: z.array(PipelineStepSchema), - stateMapping: z.record(z.string(), z.string()).optional(), -}); - -export type InputBinding = z.infer; -export type OutputBinding = z.infer; -export type TaskDefinition = z.infer; -export type PipelineStep = z.infer; -export type PipelineDefinition = z.infer; diff --git a/packages/meshy-content-generator/src/schemas/manifest.ts b/packages/meshy-content-generator/src/schemas/manifest.ts deleted file mode 100644 index dbf2b99d..00000000 --- a/packages/meshy-content-generator/src/schemas/manifest.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { z } from "zod"; - -export const TaskStateSchema = z - .object({ - taskId: z.string().optional(), - status: z.enum(["PENDING", "IN_PROGRESS", "SUCCEEDED", "FAILED", "CANCELED"]).optional(), - outputs: z.record(z.string(), z.unknown()).optional(), - artifacts: z.record(z.string(), z.string()).optional(), - }) - .passthrough(); - -export const AssetManifestSchema = z - .object({ - id: z.string(), - name: z.string(), - type: z.string(), - seed: z.number().int().nonnegative().optional(), - tasks: z.record(z.string(), TaskStateSchema).optional(), - }) - .passthrough(); - -export type AssetManifest = z.infer; -export type TaskState = z.infer; diff --git a/packages/meshy-content-generator/src/styles/global.css b/packages/meshy-content-generator/src/styles/global.css deleted file mode 100644 index 94dbde3a..00000000 --- a/packages/meshy-content-generator/src/styles/global.css +++ /dev/null @@ -1,23 +0,0 @@ -/* - Meshy Content Generator Documentation Portal - - BRANDING HIERARCHY: - 1. Enterprise base (jbcom.github.io) - fonts, core colors, layout - 2. Org theme - accent colors (below) - 3. Org customizations - unique to this org - - Part of the jbcom Enterprise ecosystem -*/ - -/* ===== LAYER 1: Enterprise Base ===== */ -@import url("https://raw.githubusercontent.com/jbcom/jbcom.github.io/main/enterprise-branding/starlight-base.css"); - -/* ===== LAYER 2: Org Theme (Purple) ===== */ -:root { - --sl-color-accent-low: #2e1065; - --sl-color-accent: #8b5cf6; - --sl-color-accent-high: #ddd6fe; - --sl-color-text-accent: #8b5cf6; -} - -/* ===== LAYER 3: Org-Specific Customizations ===== */ diff --git a/packages/meshy-content-generator/src/utils/json.ts b/packages/meshy-content-generator/src/utils/json.ts deleted file mode 100644 index b2616f53..00000000 --- a/packages/meshy-content-generator/src/utils/json.ts +++ /dev/null @@ -1,10 +0,0 @@ -import fs from "node:fs"; - -export function readJson(filePath: string): T { - const raw = fs.readFileSync(filePath, "utf-8"); - return JSON.parse(raw) as T; -} - -export function writeJson(filePath: string, value: unknown): void { - fs.writeFileSync(filePath, JSON.stringify(value, null, 2)); -} diff --git a/packages/meshy-content-generator/src/utils/object-path.ts b/packages/meshy-content-generator/src/utils/object-path.ts deleted file mode 100644 index 35cbff4d..00000000 --- a/packages/meshy-content-generator/src/utils/object-path.ts +++ /dev/null @@ -1,30 +0,0 @@ -export function getPathValue(obj: unknown, path: string): unknown { - if (!path) return undefined; - const parts = path.split(".").filter(Boolean); - let current: unknown = obj; - for (const part of parts) { - if (current === null || current === undefined) return undefined; - if (typeof current !== "object") return undefined; - const record = current as Record; - current = record[part]; - } - return current; -} - -export function setPathValue(obj: Record, path: string, value: unknown): void { - const parts = path.split(".").filter(Boolean); - if (parts.length === 0) return; - let current: Record = obj; - for (let i = 0; i < parts.length - 1; i += 1) { - const part = parts[i] as string; - const next = current[part]; - if (!next || typeof next !== "object") { - current[part] = {}; - } - current = current[part] as Record; - } - const lastPart = parts[parts.length - 1]; - if (lastPart !== undefined) { - current[lastPart] = value; - } -} diff --git a/packages/meshy-content-generator/src/utils/template.ts b/packages/meshy-content-generator/src/utils/template.ts deleted file mode 100644 index 817d7709..00000000 --- a/packages/meshy-content-generator/src/utils/template.ts +++ /dev/null @@ -1,8 +0,0 @@ -const TEMPLATE_REGEX = /\{\{\s*([\w.-]+)\s*\}\}/g; - -export function applyTemplate(value: string, vars: Record): string { - return value.replace(TEMPLATE_REGEX, (_match, key) => { - const resolved = vars[key]; - return resolved === undefined || resolved === null ? "" : String(resolved); - }); -} diff --git a/packages/meshy-content-generator/tasks/definitions/animation.json b/packages/meshy-content-generator/tasks/definitions/animation.json deleted file mode 100644 index 6517ed62..00000000 --- a/packages/meshy-content-generator/tasks/definitions/animation.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "id": "animation", - "apiVersion": "v1", - "endpoint": "animations", - "method": "POST", - "inputs": [ - { - "name": "rig_task_id", - "source": "literal" - }, - { - "name": "action_id", - "source": "lookup", - "table": "ANIMATION_IDS", - "key": "{{animationName}}" - } - ], - "outputs": [ - { - "name": "taskId", - "responsePath": "result" - }, - { - "name": "animation", - "responsePath": "result.animation_glb_url", - "artifact": "animations/{{animationName}}.glb" - } - ] -} diff --git a/packages/meshy-content-generator/tasks/definitions/multi-image-to-3d.json b/packages/meshy-content-generator/tasks/definitions/multi-image-to-3d.json deleted file mode 100644 index bd1fa427..00000000 --- a/packages/meshy-content-generator/tasks/definitions/multi-image-to-3d.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "id": "multi-image-to-3d", - "apiVersion": "v2", - "endpoint": "multi-image-to-3d", - "method": "POST", - "inputs": [ - { - "name": "image_urls", - "source": "literal" - }, - { - "name": "ai_model", - "source": "literal", - "value": "latest" - }, - { - "name": "topology", - "source": "manifest", - "path": "multiImageTo3DTask.topology", - "default": "quad" - }, - { - "name": "target_polycount", - "source": "manifest", - "path": "multiImageTo3DTask.targetPolycount", - "default": 30000 - }, - { - "name": "symmetry_mode", - "source": "manifest", - "path": "multiImageTo3DTask.symmetryMode", - "default": "auto" - }, - { - "name": "should_remesh", - "source": "manifest", - "path": "multiImageTo3DTask.shouldRemesh", - "default": true - }, - { - "name": "should_texture", - "source": "manifest", - "path": "multiImageTo3DTask.shouldTexture", - "default": true - }, - { - "name": "enable_pbr", - "source": "manifest", - "path": "multiImageTo3DTask.enablePbr", - "default": false - }, - { - "name": "pose_mode", - "source": "manifest", - "path": "multiImageTo3DTask.poseMode", - "default": "a-pose" - }, - { - "name": "texture_prompt", - "source": "manifest", - "path": "multiImageTo3DTask.texturePrompt" - } - ], - "outputs": [ - { - "name": "taskId", - "responsePath": "id" - }, - { - "name": "model", - "responsePath": "result.model_urls.glb", - "artifact": "model.glb" - }, - { - "name": "textures", - "responsePath": "result.texture_urls" - }, - { - "name": "textureUrl", - "responsePath": "result.texture_urls.0.base_color" - } - ] -} diff --git a/packages/meshy-content-generator/tasks/definitions/rigging.json b/packages/meshy-content-generator/tasks/definitions/rigging.json deleted file mode 100644 index ba494f48..00000000 --- a/packages/meshy-content-generator/tasks/definitions/rigging.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "id": "rigging", - "apiVersion": "v1", - "endpoint": "rigging", - "method": "POST", - "inputs": [ - { - "name": "input_task_id", - "source": "literal" - }, - { - "name": "height_meters", - "source": "manifest", - "path": "riggingTask.heightMeters", - "default": 1.7 - }, - { - "name": "texture_image_url", - "source": "literal" - } - ], - "outputs": [ - { - "name": "taskId", - "responsePath": "id" - }, - { - "name": "riggedModel", - "responsePath": "result.rigged_character_glb_url", - "artifact": "rigged.glb" - } - ] -} diff --git a/packages/meshy-content-generator/tasks/definitions/text-to-3d-preview.json b/packages/meshy-content-generator/tasks/definitions/text-to-3d-preview.json deleted file mode 100644 index 4d1277e9..00000000 --- a/packages/meshy-content-generator/tasks/definitions/text-to-3d-preview.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "id": "text-to-3d-preview", - "apiVersion": "v2", - "endpoint": "text-to-3d", - "method": "POST", - "inputs": [ - { - "name": "mode", - "source": "literal", - "value": "preview" - }, - { - "name": "prompt", - "source": "manifest", - "path": "textTo3DPreviewTask.prompt" - }, - { - "name": "art_style", - "source": "manifest", - "path": "textTo3DPreviewTask.artStyle", - "default": "realistic" - }, - { - "name": "ai_model", - "source": "manifest", - "path": "textTo3DPreviewTask.aiModel", - "default": "latest" - }, - { - "name": "topology", - "source": "manifest", - "path": "textTo3DPreviewTask.topology", - "default": "quad" - }, - { - "name": "target_polycount", - "source": "manifest", - "path": "textTo3DPreviewTask.targetPolycount", - "default": 30000 - }, - { - "name": "should_remesh", - "source": "manifest", - "path": "textTo3DPreviewTask.shouldRemesh", - "default": true - }, - { - "name": "symmetry_mode", - "source": "manifest", - "path": "textTo3DPreviewTask.symmetryMode", - "default": "auto" - }, - { - "name": "pose_mode", - "source": "manifest", - "path": "textTo3DPreviewTask.poseMode", - "default": "" - }, - { - "name": "moderation", - "source": "manifest", - "path": "textTo3DPreviewTask.moderation", - "default": false - } - ], - "outputs": [ - { - "name": "taskId", - "responsePath": "id" - }, - { - "name": "model", - "responsePath": "result.model_urls.glb", - "artifact": "preview.glb" - } - ] -} diff --git a/packages/meshy-content-generator/tasks/definitions/text-to-3d-refine.json b/packages/meshy-content-generator/tasks/definitions/text-to-3d-refine.json deleted file mode 100644 index 736e5a62..00000000 --- a/packages/meshy-content-generator/tasks/definitions/text-to-3d-refine.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "id": "text-to-3d-refine", - "apiVersion": "v2", - "endpoint": "text-to-3d", - "method": "POST", - "inputs": [ - { - "name": "mode", - "source": "literal", - "value": "refine" - }, - { - "name": "preview_task_id", - "source": "literal" - }, - { - "name": "texture_prompt", - "source": "manifest", - "path": "textTo3DRefineTask.texturePrompt" - }, - { - "name": "enable_pbr", - "source": "manifest", - "path": "textTo3DRefineTask.enablePbr", - "default": false - }, - { - "name": "moderation", - "source": "manifest", - "path": "textTo3DRefineTask.moderation", - "default": false - } - ], - "outputs": [ - { - "name": "taskId", - "responsePath": "id" - }, - { - "name": "model", - "responsePath": "result.model_urls.glb", - "artifact": "refined.glb" - }, - { - "name": "textures", - "responsePath": "result.texture_urls" - } - ] -} diff --git a/packages/meshy-content-generator/tasks/definitions/text-to-image-download.json b/packages/meshy-content-generator/tasks/definitions/text-to-image-download.json deleted file mode 100644 index ce172656..00000000 --- a/packages/meshy-content-generator/tasks/definitions/text-to-image-download.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "id": "text-to-image-download", - "description": "Generate images from text prompts with automatic artifact download", - "apiVersion": "v1", - "endpoint": "text-to-image", - "method": "POST", - "inputs": [ - { - "name": "prompt", - "source": "manifest", - "path": "textToImageTask.prompt" - }, - { - "name": "ai_model", - "source": "manifest", - "path": "textToImageTask.aiModel", - "default": "nano-banana" - }, - { - "name": "generate_multi_view", - "source": "manifest", - "path": "textToImageTask.generateMultiView", - "default": false - }, - { - "name": "pose_mode", - "source": "manifest", - "path": "textToImageTask.poseMode", - "default": "" - }, - { - "name": "aspect_ratio", - "source": "manifest", - "path": "textToImageTask.aspectRatio", - "default": "1:1" - } - ], - "outputs": [ - { - "name": "images", - "responsePath": "result.image_urls", - "artifact": "concept-{{index}}.png" - } - ] -} diff --git a/packages/meshy-content-generator/tasks/definitions/text-to-image.json b/packages/meshy-content-generator/tasks/definitions/text-to-image.json deleted file mode 100644 index 5cfcdea8..00000000 --- a/packages/meshy-content-generator/tasks/definitions/text-to-image.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "id": "text-to-image", - "apiVersion": "v1", - "endpoint": "text-to-image", - "method": "POST", - "inputs": [ - { - "name": "prompt", - "source": "manifest", - "path": "textToImageTask.prompt" - }, - { - "name": "ai_model", - "source": "manifest", - "path": "textToImageTask.aiModel", - "default": "nano-banana" - }, - { - "name": "generate_multi_view", - "source": "manifest", - "path": "textToImageTask.generateMultiView", - "default": false - }, - { - "name": "pose_mode", - "source": "manifest", - "path": "textToImageTask.poseMode", - "default": "" - }, - { - "name": "aspect_ratio", - "source": "manifest", - "path": "textToImageTask.aspectRatio", - "default": "1:1" - } - ], - "outputs": [ - { - "name": "images", - "responsePath": "result.image_urls" - } - ] -} diff --git a/packages/meshy-content-generator/test/__recordings__/meshy-character-full_1171058505/recording.har b/packages/meshy-content-generator/test/__recordings__/meshy-character-full_1171058505/recording.har deleted file mode 100644 index d656a84d..00000000 --- a/packages/meshy-content-generator/test/__recordings__/meshy-character-full_1171058505/recording.har +++ /dev/null @@ -1,789 +0,0 @@ -{ - "log": { - "_recordingName": "meshy-character-full", - "creator": { - "comment": "persister:fs", - "name": "Polly.JS", - "version": "6.0.6" - }, - "entries": [ - { - "_id": "3daba821e85df17fb40447250893e1d1", - "_order": 0, - "cache": {}, - "request": { - "bodySize": 168, - "cookies": [], - "headers": [ - { - "name": "authorization", - "value": "Bearer msy_3ClctZx7svFvzl4kvgXqP2Sa1z7aNIu74dwf" - }, - { - "name": "content-type", - "value": "application/json" - } - ], - "headersSize": 159, - "httpVersion": "HTTP/1.1", - "method": "POST", - "postData": { - "mimeType": "application/json", - "params": [], - "text": "{\"prompt\":\"A stylized anime hero standing on a rooftop, clean line art, neutral lighting\",\"ai_model\":\"nano-banana-pro\",\"generate_multi_view\":false,\"aspect_ratio\":\"1:1\"}" - }, - "queryString": [], - "url": "https://api.meshy.ai/openapi/v1/text-to-image" - }, - "response": { - "bodySize": 49, - "content": { - "mimeType": "application/json; charset=utf-8", - "size": 49, - "text": "{\"result\":\"019c03fc-bce6-719f-bc39-1aec5e30ed42\"}" - }, - "cookies": [], - "headers": [ - { - "name": "connection", - "value": "keep-alive" - }, - { - "name": "content-length", - "value": "49" - }, - { - "name": "content-type", - "value": "application/json; charset=utf-8" - }, - { - "name": "date", - "value": "Wed, 28 Jan 2026 09:43:41 GMT" - }, - { - "name": "x-api-version", - "value": "v2026.01.27" - } - ], - "headersSize": 158, - "httpVersion": "HTTP/1.1", - "redirectURL": "", - "status": 202, - "statusText": "Accepted" - }, - "startedDateTime": "2026-01-28T09:43:40.775Z", - "time": 245, - "timings": { - "blocked": -1, - "connect": -1, - "dns": -1, - "receive": 0, - "send": 0, - "ssl": -1, - "wait": 245 - } - }, - { - "_id": "d016a4b531cce28045be8c8b477131f6", - "_order": 0, - "cache": {}, - "request": { - "bodySize": 0, - "cookies": [], - "headers": [ - { - "name": "accept", - "value": "text/event-stream" - }, - { - "name": "authorization", - "value": "Bearer msy_3ClctZx7svFvzl4kvgXqP2Sa1z7aNIu74dwf" - } - ], - "headersSize": 197, - "httpVersion": "HTTP/1.1", - "method": "GET", - "queryString": [], - "url": "https://api.meshy.ai/openapi/v1/text-to-image/019c03fc-bce6-719f-bc39-1aec5e30ed42/stream" - }, - "response": { - "bodySize": 1847, - "content": { - "mimeType": "text/event-stream;charset=utf-8", - "size": 1847, - "text": "event:message\ndata:{\"id\":\"019c03fc-bce6-719f-bc39-1aec5e30ed42\",\"type\":\"text-to-image\",\"ai_model\":\"nano-banana-pro\",\"prompt\":\"A stylized anime hero standing on a rooftop, clean line art, neutral lighting\",\"status\":\"IN_PROGRESS\",\"progress\":30,\"created_at\":1769593421069,\"started_at\":1769593421102}\n\n: keep-alive\n\n: keep-alive\n\n: keep-alive\n\n: keep-alive\n\nevent:message\ndata:{\"id\":\"019c03fc-bce6-719f-bc39-1aec5e30ed42\",\"type\":\"text-to-image\",\"ai_model\":\"nano-banana-pro\",\"prompt\":\"A stylized anime hero standing on a rooftop, clean line art, neutral lighting\",\"status\":\"IN_PROGRESS\",\"progress\":90,\"created_at\":1769593421069,\"started_at\":1769593421102}\n\nevent:message\ndata:{\"id\":\"019c03fc-bce6-719f-bc39-1aec5e30ed42\",\"type\":\"text-to-image\",\"ai_model\":\"nano-banana-pro\",\"prompt\":\"A stylized anime hero standing on a rooftop, clean line art, neutral lighting\",\"status\":\"IN_PROGRESS\",\"progress\":99,\"created_at\":1769593421069,\"started_at\":1769593421102}\n\nevent:message\ndata:{\"id\":\"019c03fc-bce6-719f-bc39-1aec5e30ed42\",\"type\":\"text-to-image\",\"ai_model\":\"nano-banana-pro\",\"prompt\":\"A stylized anime hero standing on a rooftop, clean line art, neutral lighting\",\"status\":\"SUCCEEDED\",\"progress\":100,\"created_at\":1769593421069,\"started_at\":1769593421102,\"finished_at\":1769593470339,\"expires_at\":1769852670339,\"image_urls\":[\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/uploads/image_019c03fc-bce6-719f-bc39-1aec5e30ed42_0.png?Expires=1769852670\\u0026Signature=D22rn-UytVX9pvEZPXcFtGgIMEebBcops88xnY-aXsvj~5hxtih2Nndl8GCFw7kFU~wtVWuq3tcP0Rjgkot7eM7gouw28canZNLYuzAGiwZm~kGX0aAheR2D6v7H42~60rOVzKWVYaNnWAEXPxRA38N7w49JSOrTwMCVTLFNLiLA6svERdKclhT~vFdbm8j~eISZhR-XdEw5jDsGLpybC0c7IOxlvLcyA0G9jp5E4YShOdwGm~JPc9CencsL-AVzqx6pSfHbv28QYZT1MbpjPGiYdn1mpPOUto63AeTapxmTFb5zMjSkAU2~EmehIYSUfx~iDfkvOExAdg~gvK16lg__\\u0026Key-Pair-Id=KL5I0C8H7HX83\"]}\n\n" - }, - "cookies": [], - "headers": [ - { - "name": "cache-control", - "value": "no-cache" - }, - { - "name": "connection", - "value": "keep-alive" - }, - { - "name": "content-type", - "value": "text/event-stream;charset=utf-8" - }, - { - "name": "date", - "value": "Wed, 28 Jan 2026 09:43:41 GMT" - }, - { - "name": "transfer-encoding", - "value": "chunked" - }, - { - "name": "x-accel-buffering", - "value": "no" - }, - { - "name": "x-api-version", - "value": "v2026.01.27" - } - ], - "headersSize": 214, - "httpVersion": "HTTP/1.1", - "redirectURL": "", - "status": 200, - "statusText": "OK" - }, - "startedDateTime": "2026-01-28T09:43:41.021Z", - "time": 49268, - "timings": { - "blocked": -1, - "connect": -1, - "dns": -1, - "receive": 0, - "send": 0, - "ssl": -1, - "wait": 49268 - } - }, - { - "_id": "246ffbfd3dae2fcf2195f24555b2282a", - "_order": 0, - "cache": {}, - "request": { - "bodySize": 246, - "cookies": [], - "headers": [ - { - "name": "authorization", - "value": "Bearer msy_3ClctZx7svFvzl4kvgXqP2Sa1z7aNIu74dwf" - }, - { - "name": "content-type", - "value": "application/json" - } - ], - "headersSize": 156, - "httpVersion": "HTTP/1.1", - "method": "POST", - "postData": { - "mimeType": "application/json", - "params": [], - "text": "{\"mode\":\"preview\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"art_style\":\"realistic\",\"ai_model\":\"latest\",\"topology\":\"quad\",\"target_polycount\":30000,\"should_remesh\":true,\"symmetry_mode\":\"auto\",\"moderation\":false}" - }, - "queryString": [], - "url": "https://api.meshy.ai/openapi/v2/text-to-3d" - }, - "response": { - "bodySize": 49, - "content": { - "mimeType": "application/json; charset=utf-8", - "size": 49, - "text": "{\"result\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\"}" - }, - "cookies": [], - "headers": [ - { - "name": "connection", - "value": "keep-alive" - }, - { - "name": "content-length", - "value": "49" - }, - { - "name": "content-type", - "value": "application/json; charset=utf-8" - }, - { - "name": "date", - "value": "Wed, 28 Jan 2026 09:44:30 GMT" - }, - { - "name": "x-api-version", - "value": "v2026.01.27" - } - ], - "headersSize": 158, - "httpVersion": "HTTP/1.1", - "redirectURL": "", - "status": 202, - "statusText": "Accepted" - }, - "startedDateTime": "2026-01-28T09:44:30.294Z", - "time": 341, - "timings": { - "blocked": -1, - "connect": -1, - "dns": -1, - "receive": 0, - "send": 0, - "ssl": -1, - "wait": 341 - } - }, - { - "_id": "edcc5806d4c397deb9bc663c19bed700", - "_order": 0, - "cache": {}, - "request": { - "bodySize": 0, - "cookies": [], - "headers": [ - { - "name": "accept", - "value": "text/event-stream" - }, - { - "name": "authorization", - "value": "Bearer msy_3ClctZx7svFvzl4kvgXqP2Sa1z7aNIu74dwf" - } - ], - "headersSize": 194, - "httpVersion": "HTTP/1.1", - "method": "GET", - "queryString": [], - "url": "https://api.meshy.ai/openapi/v2/text-to-3d/019c03fd-7e45-73ca-9b94-7cf5d4aa6abc/stream" - }, - "response": { - "bodySize": 12671, - "content": { - "mimeType": "text/event-stream;charset=utf-8", - "size": 12671, - "text": "event:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"PENDING\",\"created_at\":1769593470684,\"progress\":0,\"preceding_tasks\":1,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593470684,\"progress\":10,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593470684,\"progress\":18,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593470684,\"progress\":23,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593470684,\"progress\":28,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593470684,\"progress\":34,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593470684,\"progress\":39,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\n: keep-alive\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593470684,\"progress\":45,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593470684,\"progress\":50,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593470684,\"progress\":55,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593470684,\"progress\":61,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593470684,\"progress\":66,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\n: keep-alive\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593470684,\"progress\":72,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593470684,\"progress\":77,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593470684,\"progress\":82,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593470684,\"progress\":88,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593470684,\"progress\":93,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\n: keep-alive\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593470684,\"progress\":99,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\n: keep-alive\n\n: keep-alive\n\n: keep-alive\n\n: keep-alive\n\n: keep-alive\n\nevent:message\ndata:{\"id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"type\":\"text-to-3d-preview\",\"mode\":\"preview\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"\",\"texture_image_url\":\"\",\"status\":\"SUCCEEDED\",\"created_at\":1769593470684,\"progress\":100,\"started_at\":1769593470801,\"finished_at\":1769593560692,\"task_error\":null,\"model_urls\":{\"glb\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c03fd-7e45-73ca-9b94-7cf5d4aa6abc/output/model.glb?Expires=4923158400\\u0026Signature=MMimAlrNUq225Yz0muXpeX4spUDrvXGZwWscKAGAA5NCBJBZubb~zoA7F8Ggcdri8HN7HqXLWUKjcvMZRJypfZf6vi63tG6ywaP1FN8u-6qsgjzUbL4VihWetnawzB4lb45QSy5IgcfKoSa-CXz0xt55fhddlkWUavpftyi5Rq9MZN6NUiOq-NNQPk4RbX3PTzIAZw16y6-9OLx0zg30iZxmdhv4kgMT3Sizk0QXXH43blkPf153UN30OZLbARGVJfLNe~uia7kPB1C5nFOhL3xlcGONFn7AMBE7pQa~XTlhtqmoSuKuoNP8w9HvDqjSiiB2FdOIn9OJLvMOjcdgeQ__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"fbx\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c03fd-7e45-73ca-9b94-7cf5d4aa6abc/output/model.fbx?Expires=4923158400\\u0026Signature=LoHt4g2Vcjcqbjrp9vJ330yuXsXCvmrd6K0d6eM6DsyUov7kcb1yiD7aKTvnStIQBnna5aNoth6e-7Zo8hfrt3ndVIywNP6VSBImuVa-9nGaVT9r-2uUGHkZVDCL81bCztPj9FNIo1cLXR9KxvLtG7mHp5ft7F1UUyrRL~qJxPm7Dyhtvn7viApI714836zWFQ6T703qN0TIPyEeHX7gHH5q~V4AQGk-yMXQLqJtuVdIfrW2YjI2bjZr90Gnb7zgauq53Oo0Rg2XbB3DQ1KnnxZZBNNw-JCx4Ev-gqZ0FIY6oYsVc8Cx~HF-Bv9HEJoGs6E4wD9eavy9JZ552LRS9A__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"usdz\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c03fd-7e45-73ca-9b94-7cf5d4aa6abc/output/model.usdz?Expires=4923158400\\u0026Signature=c-bJ5fHZjPmVvuhafYywfvFovzvvJ4pgo1Dp5deDQwa483nuXs6zM6jdInx7pLoUJBurPNW-Hrq4A4dC3SD7r8Ccs043qmyplekT4LfZuqN4D2t7ydlxwOyV51r0Zx2kE6YRAbWhPWAaJbtgjm6JuEyG7SkBhFU6psjt6pqTDYKLbbu5M9Z4OqCNn4cpx4bCRiZglILXKgU6C~zbHhElirzpH7ToKe4YV9gFDmpyTnMwL8Z42MckSH9dtADoNml1XuXRBy-amqcAFURcKrfsgyIww7Wc9ISAYJRnV1S3ooXGALkM-YtZKoMlQblGQMlkK0KE55gZdlI630o3m8gGDg__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"obj\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c03fd-7e45-73ca-9b94-7cf5d4aa6abc/output/model.obj?Expires=4923158400\\u0026Signature=JI4TU~hHI0BRreydayBP-RacxxeZmOTTFosSlvhShAnb3lY57rjlNGbK3B0pC8oGfXsGb-pq4twAxYijolK4IlDFpbEv80jP7Ae9JLWtnGA731K960oDzrBbXWTgydd6R84OFNI9jqK3onQKop3WBE8axnt4L5ehtucum~Wzq8nXZrjj-tegfcv8GdU3cJ1kwC844pjW87nTOkS1Hj07RKz7PyJGxn6UTx4-5UHdQhIsOGCe8G~~0qBb5S~6uYhmCy4sdiuchzuE-8WKra06pLOslcGRt6qwGKueoboZDU9-6H-7yUa-hItEZPg3L0Jdh-Sq7KkFwS5~P9PCVjQRLw__\\u0026Key-Pair-Id=KL5I0C8H7HX83\"},\"thumbnail_url\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c03fd-7e45-73ca-9b94-7cf5d4aa6abc/output/preview.png?Expires=4923158400\\u0026Signature=GA4ksWHCW7z4zxLuQVaZXH49XlRV-MGACgA4CNfEgfKD3zvgbzAYRQ8BdRttpzOXOQZBREi~GWe-MFFqSheSTnAnMlYFPlhuGc-P5les8SFUCeP8ZW8gteHLoF3gMVb6AjzlsHMbWrUIkEEpWc2Mvv2dMikNizVzbpPvnjS7nH6yBdfnAyShWYLs~-snyVkMjlRNpwFWfOiF3L4ZLVqJS-Ygs570vLgaQ1UN-G9p4lCwLMYfc56lvksKq045Nv4F6KSeLNSWBcA5rp6ZMlzw-tKDyMIUU1RpOSGtZvG5eLvxiVWgcPmhpzCKFHJzidpZFdkxa2rh0XRz5xk5oTJLJA__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"video_url\":\"\",\"texture_urls\":[]}\n\n" - }, - "cookies": [], - "headers": [ - { - "name": "cache-control", - "value": "no-cache" - }, - { - "name": "connection", - "value": "keep-alive" - }, - { - "name": "content-type", - "value": "text/event-stream;charset=utf-8" - }, - { - "name": "date", - "value": "Wed, 28 Jan 2026 09:44:30 GMT" - }, - { - "name": "transfer-encoding", - "value": "chunked" - }, - { - "name": "x-accel-buffering", - "value": "no" - }, - { - "name": "x-api-version", - "value": "v2026.01.27" - } - ], - "headersSize": 214, - "httpVersion": "HTTP/1.1", - "redirectURL": "", - "status": 200, - "statusText": "OK" - }, - "startedDateTime": "2026-01-28T09:44:30.636Z", - "time": 90116, - "timings": { - "blocked": -1, - "connect": -1, - "dns": -1, - "receive": 0, - "send": 0, - "ssl": -1, - "wait": 90116 - } - }, - { - "_id": "f5d390bc73607104f60779d58e71024c", - "_order": 0, - "cache": {}, - "request": { - "bodySize": 195, - "cookies": [], - "headers": [ - { - "name": "authorization", - "value": "Bearer msy_3ClctZx7svFvzl4kvgXqP2Sa1z7aNIu74dwf" - }, - { - "name": "content-type", - "value": "application/json" - } - ], - "headersSize": 156, - "httpVersion": "HTTP/1.1", - "method": "POST", - "postData": { - "mimeType": "application/json", - "params": [], - "text": "{\"mode\":\"refine\",\"preview_task_id\":\"019c03fd-7e45-73ca-9b94-7cf5d4aa6abc\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"enable_pbr\":false,\"moderation\":false}" - }, - "queryString": [], - "url": "https://api.meshy.ai/openapi/v2/text-to-3d" - }, - "response": { - "bodySize": 49, - "content": { - "mimeType": "application/json; charset=utf-8", - "size": 49, - "text": "{\"result\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\"}" - }, - "cookies": [], - "headers": [ - { - "name": "connection", - "value": "keep-alive" - }, - { - "name": "content-length", - "value": "49" - }, - { - "name": "content-type", - "value": "application/json; charset=utf-8" - }, - { - "name": "date", - "value": "Wed, 28 Jan 2026 09:46:01 GMT" - }, - { - "name": "x-api-version", - "value": "v2026.01.27" - } - ], - "headersSize": 158, - "httpVersion": "HTTP/1.1", - "redirectURL": "", - "status": 202, - "statusText": "Accepted" - }, - "startedDateTime": "2026-01-28T09:46:00.754Z", - "time": 345, - "timings": { - "blocked": -1, - "connect": -1, - "dns": -1, - "receive": 0, - "send": 0, - "ssl": -1, - "wait": 345 - } - }, - { - "_id": "b853d89357466e5d5e1110040e634326", - "_order": 0, - "cache": {}, - "request": { - "bodySize": 0, - "cookies": [], - "headers": [ - { - "name": "accept", - "value": "text/event-stream" - }, - { - "name": "authorization", - "value": "Bearer msy_3ClctZx7svFvzl4kvgXqP2Sa1z7aNIu74dwf" - } - ], - "headersSize": 194, - "httpVersion": "HTTP/1.1", - "method": "GET", - "queryString": [], - "url": "https://api.meshy.ai/openapi/v2/text-to-3d/019c03fe-df9c-7436-a6d5-0ba4ea3a42ce/stream" - }, - "response": { - "bodySize": 20839, - "content": { - "mimeType": "text/event-stream;charset=utf-8", - "size": 20839, - "text": "event:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"PENDING\",\"created_at\":1769593561149,\"progress\":0,\"preceding_tasks\":1,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":5,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\n: keep-alive\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":10,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":15,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\n: keep-alive\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":20,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":25,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":25,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":25,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":25,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":26,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":28,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\n: keep-alive\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":33,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":36,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":40,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":50,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":60,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\n: keep-alive\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":60,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\n: keep-alive\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":60,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":60,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":61,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":66,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":71,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":76,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\n: keep-alive\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":81,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":86,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\n: keep-alive\n\n: keep-alive\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":96,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":97,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593561149,\"progress\":99,\"started_at\":0,\"finished_at\":0,\"task_error\":null,\"model_urls\":{\"glb\":\"\"},\"thumbnail_url\":\"\",\"video_url\":\"\",\"texture_urls\":null}\n\n: keep-alive\n\nevent:message\ndata:{\"id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"type\":\"text-to-3d-refine\",\"mode\":\"refine\",\"name\":\"\",\"seed\":3504613218,\"art_style\":\"realistic\",\"texture_richness\":\"high\",\"prompt\":\"Stylized anime hero character with clean silhouette, standing pose\",\"negative_prompt\":\"\",\"texture_prompt\":\"Cel-shaded anime materials, crisp outlines, subtle fabric weave\",\"texture_image_url\":\"\",\"status\":\"SUCCEEDED\",\"created_at\":1769593561149,\"progress\":100,\"started_at\":1769593561700,\"finished_at\":1769593652653,\"task_error\":null,\"model_urls\":{\"glb\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c03fe-df9c-7436-a6d5-0ba4ea3a42ce/output/model.glb?Expires=4923158400\\u0026Signature=js4OWKqg6g4wTuU7CGncTRqe~VUxZt9HKLQ1VhMCK61yTBItVtdWXAgJL9vjI7UQ1HniuCJHEQ6V55v4FqCm1zNyZ6C-EZrodX7PNT3I9zyaYq0deAwTZWci5AUpegIUoo7uUvRbdtSoJ8xt0BdZaHI06vEpljfbk1rM5e-lDnD8HOwasLaRoKbUmG0vzo8cV74~5apt3MPmsQMXO2Z1BEq1jZql19oItR~gFBr2TSy6q-U2FIpKNHQnufuIeWA~b8qvcbmdS-Mq6m-QGhqJp5g0mLhSXgU1nsQ8W2bAbe~uUD~dJCg4HFxGLvpZVbOUzgIk34LMUxrwKnpg6p9PEg__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"fbx\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c03fe-df9c-7436-a6d5-0ba4ea3a42ce/output/model.fbx?Expires=4923158400\\u0026Signature=rl43uQR8zpgGXhnoxFjkH5pecwpNf8YpqzYT4D19lTEh6wReiKoM4XVHbffghA1hepP21OBQHbBp-6Qg50bl5Er8JJqTd4FgF2QubU38D-amfvKlYa5DpglqtLlHBY0bPWYL7e3Lz7A9BP5gFrp70c-WM7hqdPnMR3G1yfW2zj9~Kxqc4LLYDoWZcOM-V49KcsiWKqqsFFTr3bQTVBaptgl39x2RtDg-vZkfccxfs2W-WNFsQaEan~lG2kJC0yWp9-UPpQgHE1WQDeU8jlQs4zpgbxbKEKalXT~~T9TGsapvXCgRcFqaQ3goSGOgCuue9EKaWBhJgWgy5ap1Ykdesg__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"usdz\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c03fe-df9c-7436-a6d5-0ba4ea3a42ce/output/model.usdz?Expires=4923158400\\u0026Signature=LCq~vE7Lny5MwBrLDz0lrotYWbL7uZ1MdIHWhSV-7qPjQ1cXoe7aby5u1srPcpX5q-lEccqxVzaXr~X9L7nRIO5-QDtwwhXQUrU4YjOwaIg2aDtMOPr-1vJoN8-xaWMFZ293ZxQx9ZjubFA1CASiy-ENatW~itLREPfGhvuuLXtIlFlP917CvSYG2C3W4DLxr2ksZQbgZdVo59sJRVnrwFZmBDkrrLLJBZezDgIVbLuLRASj0gIvDSe-~sqkZCKBMrhPNuYIqtZ-zyuNMqNBOaOWjs16fIyI2huSSzjgWkZfFUBlx7RwelzXp5Av3ZMH474J~O6mUwRzrcZNXhRgRA__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"obj\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c03fe-df9c-7436-a6d5-0ba4ea3a42ce/output/model.obj?Expires=4923158400\\u0026Signature=aeh~nBaRlhDClfiObUWz1qqWinW2N5BLaxZrUgA3B4YxZTAdd-t7l2tWmafpMMfiHC4NAIBz2dhJnhngKrVeBozxXWWtXinkKFr3Ura8xXIXXg~aVma3W4VmTZaL3FTb62Eoimi7HVnKogyUnUkg1gWwwYU6AvCK-tI7YsSMo5Po~3BnaL9mF8C81OwUZXHjTRFVtlwZs1ADnVV1OwhnIuEJDBb6tNHitcii99Ta8StFVrG6xqXyoX3FJ8bro130qREkwSTAqQtKu1wij1G2teLZ7yWN3-vUD40Wp~r3cA7CXESPdEj1ZAOJOqP-CfPuMyV6Sdbh6zt2txEYd2PZTQ__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"mtl\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c03fe-df9c-7436-a6d5-0ba4ea3a42ce/output/model.mtl?Expires=4923158400\\u0026Signature=L94QevbTFdyq21RWQS2kYkHvPoxMVWwIUNVrsRbv3lZ1k3dlF6Ao-twemUDzbxd9B1cnXXUYi6XKrAfF2cG2rsIDTmmHdykukNlklzce4eSdL7YhQNKtm~X15uUgpVsroULEm8eLbKupDfF-Z-JM8urdYgxmOFCw9J-DAhL8pLTSNjSP6~vJied4SsoHhwf8MVAziANswseFRWdLOyqSOYTDIWhWLsJdJuxYfEpcFMco42q0uMsAO-XsZjWOuTNStU2a8gbA4ypxG4dG~EbSmximzKqbJh5CjbO667Jqs5Ubeyw54FW6yBpVBgBRppK9OCAEfcdAmlX7dzIkgT3S7w__\\u0026Key-Pair-Id=KL5I0C8H7HX83\"},\"thumbnail_url\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c03fe-df9c-7436-a6d5-0ba4ea3a42ce/output/preview.png?Expires=4923158400\\u0026Signature=Pa2UkTFZMRhzwt05b7PbdNAPJVrOLJHqbyQi-jSjVAMAQsHHP532ZE~WG5-x17i3wHGCOQUlyS32A820PvcYM3KELbNJss8x7pyY5WYd5IqBfn0NqkaRQTFNdJIlwr4oQDBpGM5pDaSAcsg-AflGoAv5nhfLhrdUXe6IoCd3NWLgbntGC~Dd~xSKO1b3EacP8llIf2zxxp~IqeCZvSezlnSOB38F7SgQBRs6QkCNqZHXVFFZT-90m7J1eomrYcNC~h1vgcjwkXD91Ue~BimLm6Qzew78Yx1cF6cVTXdZC-8Q91euOp0COBXIM1HJzEGXkswK276vnSfTfTaSkSF3HQ__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"video_url\":\"\",\"texture_urls\":[{\"base_color\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c03fe-df9c-7436-a6d5-0ba4ea3a42ce/output/texture_0.png?Expires=4923158400\\u0026Signature=CCIOu4IM0V-8LONSyLY3ryriihB6rv67DkvyXiAyMM51sD6-qKyyhG-a5wE9S2tUCYt6~5UxXntZatfxEAOMuRijlnOBI3auXRS7smTSbGMCsP7qwD-8-ypd~D6E4A4t2aCE-R4z4y4iPT28SPJSJsgBUqE6GWLw7Ja9tTKdQd8hmv3v-dohEG35tM959DU0UWFEfDMvUWywQ1RAJ-uUa9n1NymXJY4Rp4~u5rogW3pZ76-JsVC8eb4SnR55Q6aGDUgId7ixHO5wJa6F8x5HGbIxQg7XjIIO4LTpX7tfOEquqWXXrHpcumrmzAfB7lD4Tzuc6D-4kzO3-ZrMBwys6g__\\u0026Key-Pair-Id=KL5I0C8H7HX83\"}]}\n\n" - }, - "cookies": [], - "headers": [ - { - "name": "cache-control", - "value": "no-cache" - }, - { - "name": "connection", - "value": "keep-alive" - }, - { - "name": "content-type", - "value": "text/event-stream;charset=utf-8" - }, - { - "name": "date", - "value": "Wed, 28 Jan 2026 09:46:01 GMT" - }, - { - "name": "transfer-encoding", - "value": "chunked" - }, - { - "name": "x-accel-buffering", - "value": "no" - }, - { - "name": "x-api-version", - "value": "v2026.01.27" - } - ], - "headersSize": 214, - "httpVersion": "HTTP/1.1", - "redirectURL": "", - "status": 200, - "statusText": "OK" - }, - "startedDateTime": "2026-01-28T09:46:01.100Z", - "time": 91756, - "timings": { - "blocked": -1, - "connect": -1, - "dns": -1, - "receive": 0, - "send": 0, - "ssl": -1, - "wait": 91756 - } - }, - { - "_id": "5b7774e7f78ddae8eccc5b6d1952ebe4", - "_order": 0, - "cache": {}, - "request": { - "bodySize": 76, - "cookies": [], - "headers": [ - { - "name": "authorization", - "value": "Bearer msy_3ClctZx7svFvzl4kvgXqP2Sa1z7aNIu74dwf" - }, - { - "name": "content-type", - "value": "application/json" - } - ], - "headersSize": 153, - "httpVersion": "HTTP/1.1", - "method": "POST", - "postData": { - "mimeType": "application/json", - "params": [], - "text": "{\"input_task_id\":\"019c03fe-df9c-7436-a6d5-0ba4ea3a42ce\",\"height_meters\":1.7}" - }, - "queryString": [], - "url": "https://api.meshy.ai/openapi/v1/rigging" - }, - "response": { - "bodySize": 50, - "content": { - "mimeType": "application/json; charset=utf-8", - "size": 50, - "text": "{\"result\":\"019c0400-4746-7ed6-9f28-0f3aaff57d3e\"}\n" - }, - "cookies": [], - "headers": [ - { - "name": "connection", - "value": "keep-alive" - }, - { - "name": "content-length", - "value": "50" - }, - { - "name": "content-type", - "value": "application/json; charset=utf-8" - }, - { - "name": "date", - "value": "Wed, 28 Jan 2026 09:47:36 GMT" - }, - { - "name": "x-api-version", - "value": "v2026.01.27" - } - ], - "headersSize": 158, - "httpVersion": "HTTP/1.1", - "redirectURL": "", - "status": 202, - "statusText": "Accepted" - }, - "startedDateTime": "2026-01-28T09:47:32.857Z", - "time": 4000, - "timings": { - "blocked": -1, - "connect": -1, - "dns": -1, - "receive": 0, - "send": 0, - "ssl": -1, - "wait": 4000 - } - }, - { - "_id": "0b8fd638c62805f4c42f41cd4a4f9b7e", - "_order": 0, - "cache": {}, - "request": { - "bodySize": 0, - "cookies": [], - "headers": [ - { - "name": "accept", - "value": "text/event-stream" - }, - { - "name": "authorization", - "value": "Bearer msy_3ClctZx7svFvzl4kvgXqP2Sa1z7aNIu74dwf" - } - ], - "headersSize": 191, - "httpVersion": "HTTP/1.1", - "method": "GET", - "queryString": [], - "url": "https://api.meshy.ai/openapi/v1/rigging/019c0400-4746-7ed6-9f28-0f3aaff57d3e/stream" - }, - "response": { - "bodySize": 8666, - "content": { - "mimeType": "text/event-stream;charset=utf-8", - "size": 8666, - "text": "event:message\ndata:{\"id\":\"019c0400-4746-7ed6-9f28-0f3aaff57d3e\",\"type\":\"rig\",\"name\":\"\",\"status\":\"PENDING\",\"created_at\":1769593656755,\"progress\":0,\"preceding_tasks\":1,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"rigged_character_fbx_url\":\"\",\"rigged_character_glb_url\":\"\",\"basic_animations\":null}}\n\nevent:message\ndata:{\"id\":\"019c0400-4746-7ed6-9f28-0f3aaff57d3e\",\"type\":\"rig\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593656755,\"progress\":1,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"rigged_character_fbx_url\":\"\",\"rigged_character_glb_url\":\"\",\"basic_animations\":null}}\n\nevent:message\ndata:{\"id\":\"019c0400-4746-7ed6-9f28-0f3aaff57d3e\",\"type\":\"rig\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593656755,\"progress\":10,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"rigged_character_fbx_url\":\"\",\"rigged_character_glb_url\":\"\",\"basic_animations\":null}}\n\nevent:message\ndata:{\"id\":\"019c0400-4746-7ed6-9f28-0f3aaff57d3e\",\"type\":\"rig\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593656755,\"progress\":15,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"rigged_character_fbx_url\":\"\",\"rigged_character_glb_url\":\"\",\"basic_animations\":null}}\n\nevent:message\ndata:{\"id\":\"019c0400-4746-7ed6-9f28-0f3aaff57d3e\",\"type\":\"rig\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593656755,\"progress\":20,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"rigged_character_fbx_url\":\"\",\"rigged_character_glb_url\":\"\",\"basic_animations\":null}}\n\nevent:message\ndata:{\"id\":\"019c0400-4746-7ed6-9f28-0f3aaff57d3e\",\"type\":\"rig\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593656755,\"progress\":26,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"rigged_character_fbx_url\":\"\",\"rigged_character_glb_url\":\"\",\"basic_animations\":null}}\n\nevent:message\ndata:{\"id\":\"019c0400-4746-7ed6-9f28-0f3aaff57d3e\",\"type\":\"rig\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593656755,\"progress\":31,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"rigged_character_fbx_url\":\"\",\"rigged_character_glb_url\":\"\",\"basic_animations\":null}}\n\n: keep-alive\n\nevent:message\ndata:{\"id\":\"019c0400-4746-7ed6-9f28-0f3aaff57d3e\",\"type\":\"rig\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593656755,\"progress\":36,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"rigged_character_fbx_url\":\"\",\"rigged_character_glb_url\":\"\",\"basic_animations\":null}}\n\nevent:message\ndata:{\"id\":\"019c0400-4746-7ed6-9f28-0f3aaff57d3e\",\"type\":\"rig\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593656755,\"progress\":42,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"rigged_character_fbx_url\":\"\",\"rigged_character_glb_url\":\"\",\"basic_animations\":null}}\n\nevent:message\ndata:{\"id\":\"019c0400-4746-7ed6-9f28-0f3aaff57d3e\",\"type\":\"rig\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593656755,\"progress\":47,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"rigged_character_fbx_url\":\"\",\"rigged_character_glb_url\":\"\",\"basic_animations\":null}}\n\nevent:message\ndata:{\"id\":\"019c0400-4746-7ed6-9f28-0f3aaff57d3e\",\"type\":\"rig\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593656755,\"progress\":52,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"rigged_character_fbx_url\":\"\",\"rigged_character_glb_url\":\"\",\"basic_animations\":null}}\n\nevent:message\ndata:{\"id\":\"019c0400-4746-7ed6-9f28-0f3aaff57d3e\",\"type\":\"rig\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593656755,\"progress\":95,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"rigged_character_fbx_url\":\"\",\"rigged_character_glb_url\":\"\",\"basic_animations\":null}}\n\nevent:message\ndata:{\"id\":\"019c0400-4746-7ed6-9f28-0f3aaff57d3e\",\"type\":\"rig\",\"name\":\"\",\"status\":\"SUCCEEDED\",\"created_at\":1769593656755,\"progress\":100,\"started_at\":1769593657328,\"finished_at\":1769593676718,\"expires_at\":1769852876718,\"task_error\":null,\"result\":{\"rigged_character_fbx_url\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c0400-4746-7ed6-9f28-0f3aaff57d3e/output/Character_output.fbx?Expires=1769852876\\u0026Signature=bTRbssRxFKq-ByhuxSorJ21LFjnxVdua-wLja8feyHWE3cTSFVKCGsk0t1k-JBb0u9~OmZhQyVFJALGl-FvTQ~LLtAcQ6xhBGNS3ipA5zrZkKT1eL9QSKsGgk3Mo6UWRaa9Fht1yKkpFfCNL3VPEICp~ojPM3dWH7xKIkGsKB3~oTrceiuxQTidZ3cCDDFgSnXTUox0sd-XHQGXU0BwofFr7A-SCCEtWfCiRVJir1wnqu6FN-vM~ZCjPGZgRwO6pGkptX~Rv2XKRhMbItesM1xiVPq63OY--GFHMq~xwEpCrz-3A2mZ6veFojoWHiY51igtD1jJay3JvoP6zq9oyeA__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"rigged_character_glb_url\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c0400-4746-7ed6-9f28-0f3aaff57d3e/output/Character_output.glb?Expires=1769852876\\u0026Signature=KXyyBIbSh7reRlf9Zw3sYYGpe9d4EtScuMYQn~asnG0UTQxbgWc2B4-cS4ST1A4h~jBKJqQXXAvSjnIVWQOVwV~FaDUyw2gN~xqQmAwd2eT8BlLoSfbRE1q0PTttLu3WyvgI3oGVg~pzOg~9ulO8PA71paMamX0~0VmIc8uzabHGBFtwcZg5WnIYOCfk4vJXT4LjbQr5ssnzt4DB6sHjqI86ejU9OgV1B8t6ncZfN3zqcnBo2KxMyc4qJLnaTTC5Uera9QljAVeEzs86yH-ec4vHtfNDA6hprXfouwsGdhAEVHV7gDgxkTr-7uwCzTf~ffhsZj89IHETr1DVV1o3yg__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"basic_animations\":{\"walking_glb_url\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c0400-4746-7ed6-9f28-0f3aaff57d3e/output/Animation_Walking_withSkin.glb?Expires=1769852876\\u0026Signature=c8szqrkFdSric2cxp7EsfQncyqoARkgh1d2Ed0v3J9~xqSD7fW~bx4MY6oDPCX9tp1xGPBby2kHYHllApv7sIPg-Ga0CwxcJgVwfscbUFlrCxqA-4JnQfqxLYXUkQrYQwjRHH8ktSIHZ7zAdcP5QsB9eSUfH9tlG0T2k58oI-I5D6Ddp~qNcNi70xnM4XxXfyYUEx7ors38WAXC-CGqoqyOiNVYo7oAFSHQ-c1TfinCbBQ9b-SquA70Yd2Kea0ZKuzNik-R8HQolCdFFeWYeVgFry0xSmTjxErkUifI8MgQwMH47yyWLYHxNldiQ5NG7Tqai-NY1QDzFUOPKQ4pBfg__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"walking_fbx_url\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c0400-4746-7ed6-9f28-0f3aaff57d3e/output/Animation_Walking_withSkin.fbx?Expires=1769852876\\u0026Signature=khKutX14WR0eeP0JhoM4Nb7E1K2r-2iIgVlzSoQaqwbDjg8amdB5MMsM3OU5EYzauV14RqMzIAfSdgnrW9auGR4~UUwGG6IyY6F5g9U-vALHwJTNfIBtVprLgpGiXm2PiZVzq0CTsaJhtDWwRUNlRlfQNSCwio-YPO1391SRy-eFBQHsooBcOLPbHA8DNfUV~wznLVlxysq62Ox~FSKkI9B-C-nq78sLmd8SCpWjzVpnLQ6TfwgQrcmXJPOLxrugo1KnYY4KrUa1iNsC4vvrPPJZPb5902uDLBdio0-1EOqEmKBGu9v8Tlm1wZiQqj6vZgVJpYjeNnqGAVQelqgKIA__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"walking_armature_glb_url\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c0400-4746-7ed6-9f28-0f3aaff57d3e/output/Animation_Walking_withSkin_armature.glb?Expires=1769852876\\u0026Signature=QaJlOFby-~5u5JYsFGb7oKR5oO2zIob2R55WaPXNxMEl8DoPGSuhBrU9~EcvmJeU84hGGUfHCEa3ya6utHzSzNEfyjDeJa0m7m4VL8rAAN~k7j4SfppzaEobq95Pb-uqj4r8rZPeDpvW~JLnpb1gYfcg~nytPU79wT3gXYfN6CmGrH3iFUHoDbe9-IxTXo6cM~ZLeLSy9nzY715qwPu8N0Dv6wS-QfDFihDxHfEZq19~OTt2Dki20EJZliBdYJ2FWpSAFbFcD-Sq7hDPnN-GWMWhgQtMRU6tKBc4FK3WOmwhYxFoX9LX~KLmGYEB25X-2Vfun3KbLRtzmYX1Ymy3Yg__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"running_glb_url\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c0400-4746-7ed6-9f28-0f3aaff57d3e/output/Animation_Running_withSkin.glb?Expires=1769852876\\u0026Signature=RS2cCqJ90d8l-DrZVtUnnOe2MNVqzHOPe16BFzDF5ZDaG9VWVwJ72W8JVIw5yLvPCWTJV42RgtguhcwP-v53dAKkJVhtkNSXetidolRHSwAUSo7ulCOu7MwhlfDa5o7dR69gbV20D2lnUZqi~j5kNIP2~nDrW9-Htx06M9Jn6s5uGLPfCVCDKuYUhSnVdAUHv~W4DCwLgpGwukrUlzA-1gHnrYFMk53T-4Ku2dgfH-iCva5j~BxTgeyHPqcZOVzc5BovDJBSj5ktkK0uiTRAop-EeQdQxljzMxyau1MOKQYLQ0xypSoS5JJeKpW2k1WV4DdfUFxuu7Fab9jryMa1AQ__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"running_fbx_url\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c0400-4746-7ed6-9f28-0f3aaff57d3e/output/Animation_Running_withSkin.fbx?Expires=1769852876\\u0026Signature=jwExnFPtz-hdkFGs2f5O7ObmUYjn8qrs6EUsDRyR-qKqD0iAkgtSzLQxNZXJ~yL6g5Pw2NtBIc-vfldCZWUVJKQqonnQ5jXWg2KIHksj0uxKaEyf7ff6aHzor3x6iyeQkS3L~oLs45sHgecpDuER1wDJUChLSPRbIWobnzib2tA45LEqcUsBX9V0KEbxE1VPXz6Rp7okS7a5wqBvR57AhmPGquW0QUrcD0lG5QSjPQwROlkFQ6L3rFIAC7E4OLSeUBEnwlEznAV-MOGIxblpAYZPx~1ZsVagHkAs20fEyvAsRaL1-WecRK8NjNb0pG~2sB9Ze9QctR6H-8hDmAYt6Q__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"running_armature_glb_url\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c0400-4746-7ed6-9f28-0f3aaff57d3e/output/Animation_Running_withSkin_armature.glb?Expires=1769852876\\u0026Signature=e4BORDmdppyhRPh09FdhIGOkY9wbIGUjyws2aAf9N50~5XCQmBga5ygF~2NutJmSisEVJ8ArSVqNMJGSCUrh3sLpd2g4f63cZODR8BKI~d7zaGghBaHeCQA5uAKgu1Z-jzTFedfQjK7pOXNjvSP0e11lMSvo7rnJYVpDC3eUdPw~M9tbpobqf8VaCCWCPT1OKuUDqciRIRaBS1smcwibAvTQComUbpCXv~FL9TpfhO-ghY1upVZB3aka3s5G8m8g0BTDf89TKDQV3ymWKGlSUHyF9vK7ZM7p7p7r~ItQ4OevHXwky6BP9FES5jOkhCrsj8-w~MmScoO0aVZCtrAO~g__\\u0026Key-Pair-Id=KL5I0C8H7HX83\"}}}\n\n" - }, - "cookies": [], - "headers": [ - { - "name": "cache-control", - "value": "no-cache" - }, - { - "name": "connection", - "value": "keep-alive" - }, - { - "name": "content-type", - "value": "text/event-stream;charset=utf-8" - }, - { - "name": "date", - "value": "Wed, 28 Jan 2026 09:47:36 GMT" - }, - { - "name": "transfer-encoding", - "value": "chunked" - }, - { - "name": "x-accel-buffering", - "value": "no" - }, - { - "name": "x-api-version", - "value": "v2026.01.27" - } - ], - "headersSize": 214, - "httpVersion": "HTTP/1.1", - "redirectURL": "", - "status": 200, - "statusText": "OK" - }, - "startedDateTime": "2026-01-28T09:47:36.858Z", - "time": 19869, - "timings": { - "blocked": -1, - "connect": -1, - "dns": -1, - "receive": 0, - "send": 0, - "ssl": -1, - "wait": 19869 - } - }, - { - "_id": "af0b2e744d70c66d465d5d59624b2d4e", - "_order": 0, - "cache": {}, - "request": { - "bodySize": 69, - "cookies": [], - "headers": [ - { - "name": "authorization", - "value": "Bearer msy_3ClctZx7svFvzl4kvgXqP2Sa1z7aNIu74dwf" - }, - { - "name": "content-type", - "value": "application/json" - } - ], - "headersSize": 156, - "httpVersion": "HTTP/1.1", - "method": "POST", - "postData": { - "mimeType": "application/json", - "params": [], - "text": "{\"rig_task_id\":\"019c0400-4746-7ed6-9f28-0f3aaff57d3e\",\"action_id\":30}" - }, - "queryString": [], - "url": "https://api.meshy.ai/openapi/v1/animations" - }, - "response": { - "bodySize": 50, - "content": { - "mimeType": "application/json; charset=utf-8", - "size": 50, - "text": "{\"result\":\"019c0400-a468-74bd-bfee-386d46487e23\"}\n" - }, - "cookies": [], - "headers": [ - { - "name": "connection", - "value": "keep-alive" - }, - { - "name": "content-length", - "value": "50" - }, - { - "name": "content-type", - "value": "application/json; charset=utf-8" - }, - { - "name": "date", - "value": "Wed, 28 Jan 2026 09:47:57 GMT" - }, - { - "name": "x-api-version", - "value": "v2026.01.27" - } - ], - "headersSize": 158, - "httpVersion": "HTTP/1.1", - "redirectURL": "", - "status": 202, - "statusText": "Accepted" - }, - "startedDateTime": "2026-01-28T09:47:56.729Z", - "time": 510, - "timings": { - "blocked": -1, - "connect": -1, - "dns": -1, - "receive": 0, - "send": 0, - "ssl": -1, - "wait": 510 - } - }, - { - "_id": "fe51ae2b3b84b98b36a2e6e82d4c50e6", - "_order": 0, - "cache": {}, - "request": { - "bodySize": 0, - "cookies": [], - "headers": [ - { - "name": "accept", - "value": "text/event-stream" - }, - { - "name": "authorization", - "value": "Bearer msy_3ClctZx7svFvzl4kvgXqP2Sa1z7aNIu74dwf" - } - ], - "headersSize": 194, - "httpVersion": "HTTP/1.1", - "method": "GET", - "queryString": [], - "url": "https://api.meshy.ai/openapi/v1/animations/019c0400-a468-74bd-bfee-386d46487e23/stream" - }, - "response": { - "bodySize": 7123, - "content": { - "mimeType": "text/event-stream;charset=utf-8", - "size": 7123, - "text": "event:message\ndata:{\"id\":\"019c0400-a468-74bd-bfee-386d46487e23\",\"type\":\"animate\",\"name\":\"\",\"status\":\"PENDING\",\"created_at\":1769593677238,\"progress\":0,\"preceding_tasks\":1,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"animation_glb_url\":\"\",\"animation_fbx_url\":\"\",\"processed_usdz_url\":\"\",\"processed_armature_fbx_url\":\"\",\"processed_animation_fps_fbx_url\":\"\"}}\n\nevent:message\ndata:{\"id\":\"019c0400-a468-74bd-bfee-386d46487e23\",\"type\":\"animate\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593677238,\"progress\":1,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"animation_glb_url\":\"\",\"animation_fbx_url\":\"\",\"processed_usdz_url\":\"\",\"processed_armature_fbx_url\":\"\",\"processed_animation_fps_fbx_url\":\"\"}}\n\nevent:message\ndata:{\"id\":\"019c0400-a468-74bd-bfee-386d46487e23\",\"type\":\"animate\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593677238,\"progress\":10,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"animation_glb_url\":\"\",\"animation_fbx_url\":\"\",\"processed_usdz_url\":\"\",\"processed_armature_fbx_url\":\"\",\"processed_animation_fps_fbx_url\":\"\"}}\n\nevent:message\ndata:{\"id\":\"019c0400-a468-74bd-bfee-386d46487e23\",\"type\":\"animate\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593677238,\"progress\":15,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"animation_glb_url\":\"\",\"animation_fbx_url\":\"\",\"processed_usdz_url\":\"\",\"processed_armature_fbx_url\":\"\",\"processed_animation_fps_fbx_url\":\"\"}}\n\nevent:message\ndata:{\"id\":\"019c0400-a468-74bd-bfee-386d46487e23\",\"type\":\"animate\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593677238,\"progress\":20,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"animation_glb_url\":\"\",\"animation_fbx_url\":\"\",\"processed_usdz_url\":\"\",\"processed_armature_fbx_url\":\"\",\"processed_animation_fps_fbx_url\":\"\"}}\n\nevent:message\ndata:{\"id\":\"019c0400-a468-74bd-bfee-386d46487e23\",\"type\":\"animate\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593677238,\"progress\":26,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"animation_glb_url\":\"\",\"animation_fbx_url\":\"\",\"processed_usdz_url\":\"\",\"processed_armature_fbx_url\":\"\",\"processed_animation_fps_fbx_url\":\"\"}}\n\nevent:message\ndata:{\"id\":\"019c0400-a468-74bd-bfee-386d46487e23\",\"type\":\"animate\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593677238,\"progress\":31,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"animation_glb_url\":\"\",\"animation_fbx_url\":\"\",\"processed_usdz_url\":\"\",\"processed_armature_fbx_url\":\"\",\"processed_animation_fps_fbx_url\":\"\"}}\n\n: keep-alive\n\nevent:message\ndata:{\"id\":\"019c0400-a468-74bd-bfee-386d46487e23\",\"type\":\"animate\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593677238,\"progress\":36,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"animation_glb_url\":\"\",\"animation_fbx_url\":\"\",\"processed_usdz_url\":\"\",\"processed_armature_fbx_url\":\"\",\"processed_animation_fps_fbx_url\":\"\"}}\n\nevent:message\ndata:{\"id\":\"019c0400-a468-74bd-bfee-386d46487e23\",\"type\":\"animate\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593677238,\"progress\":42,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"animation_glb_url\":\"\",\"animation_fbx_url\":\"\",\"processed_usdz_url\":\"\",\"processed_armature_fbx_url\":\"\",\"processed_animation_fps_fbx_url\":\"\"}}\n\nevent:message\ndata:{\"id\":\"019c0400-a468-74bd-bfee-386d46487e23\",\"type\":\"animate\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593677238,\"progress\":47,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"animation_glb_url\":\"\",\"animation_fbx_url\":\"\",\"processed_usdz_url\":\"\",\"processed_armature_fbx_url\":\"\",\"processed_animation_fps_fbx_url\":\"\"}}\n\nevent:message\ndata:{\"id\":\"019c0400-a468-74bd-bfee-386d46487e23\",\"type\":\"animate\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593677238,\"progress\":52,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"animation_glb_url\":\"\",\"animation_fbx_url\":\"\",\"processed_usdz_url\":\"\",\"processed_armature_fbx_url\":\"\",\"processed_animation_fps_fbx_url\":\"\"}}\n\nevent:message\ndata:{\"id\":\"019c0400-a468-74bd-bfee-386d46487e23\",\"type\":\"animate\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593677238,\"progress\":57,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"animation_glb_url\":\"\",\"animation_fbx_url\":\"\",\"processed_usdz_url\":\"\",\"processed_armature_fbx_url\":\"\",\"processed_animation_fps_fbx_url\":\"\"}}\n\n: keep-alive\n\nevent:message\ndata:{\"id\":\"019c0400-a468-74bd-bfee-386d46487e23\",\"type\":\"animate\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593677238,\"progress\":63,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"animation_glb_url\":\"\",\"animation_fbx_url\":\"\",\"processed_usdz_url\":\"\",\"processed_armature_fbx_url\":\"\",\"processed_animation_fps_fbx_url\":\"\"}}\n\nevent:message\ndata:{\"id\":\"019c0400-a468-74bd-bfee-386d46487e23\",\"type\":\"animate\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593677238,\"progress\":68,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"animation_glb_url\":\"\",\"animation_fbx_url\":\"\",\"processed_usdz_url\":\"\",\"processed_armature_fbx_url\":\"\",\"processed_animation_fps_fbx_url\":\"\"}}\n\nevent:message\ndata:{\"id\":\"019c0400-a468-74bd-bfee-386d46487e23\",\"type\":\"animate\",\"name\":\"\",\"status\":\"IN_PROGRESS\",\"created_at\":1769593677238,\"progress\":95,\"started_at\":0,\"finished_at\":0,\"expires_at\":0,\"task_error\":null,\"result\":{\"animation_glb_url\":\"\",\"animation_fbx_url\":\"\",\"processed_usdz_url\":\"\",\"processed_armature_fbx_url\":\"\",\"processed_animation_fps_fbx_url\":\"\"}}\n\nevent:message\ndata:{\"id\":\"019c0400-a468-74bd-bfee-386d46487e23\",\"type\":\"animate\",\"name\":\"\",\"status\":\"SUCCEEDED\",\"created_at\":1769593677238,\"progress\":100,\"started_at\":1769593677633,\"finished_at\":1769593702064,\"expires_at\":1769852902064,\"task_error\":null,\"result\":{\"animation_glb_url\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c0400-a468-74bd-bfee-386d46487e23/output/Animation_Casual_Walk_withSkin.glb?Expires=1769852902\\u0026Signature=Q3oCGL25TLV6opIY1QagJgBWVycj8lrn2CmbC7xghNs1l8njNq5yTbKNQtrhj-FvbPVY~AO1LRkB1CJZraajOYeobbzZKeRdLrEgzK9NOL~Bpaw6t8vfB8AD198tWEMKgOecK60G1dBP~OOp6~oobdADq0GPnqzARoGqAPdbP3M-GUWY5~7waaG-RTh3ZEgeHxpI8TBpSZb5qix447R2twOLsc4mv3aSngv1THxlifDt9XjIKmyQ1xZco5FFqsBA5ywvbMWqEBBzR1UPQBjrpmng~rc4AoU2iJLga3a~VxVjj3bWT3jIKrp03Fo358pZ8O-r3wExsJoc4Nb7CpBXxA__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"animation_fbx_url\":\"https://assets.meshy.ai/b0dbbbaf-b086-4bee-9845-d9c2576d26db/tasks/019c0400-a468-74bd-bfee-386d46487e23/output/Animation_Casual_Walk_withSkin.fbx?Expires=1769852902\\u0026Signature=NippfUMIjw3-MmsizLZuYBsB4CtbSwGaL0ucwvKvwIhlc0qRfnjgkSEhGx1a5B8EKYgapairRH1hGN8AAY67wAqTy~KxcbTx-Ktfk4lej9hxgFisKrqZ55R3Ob9u1NKCye81l8BUSMbM7H6aGKtZ1egpeDyvj2VkXntiUIJ2Ahu7xqwQAQM~o3RdPkRxkDajMP5kn3sbrpfl56IzfsV~SkpD0OGk0kH9dAME4CPtGsKG9zOTA~TiVTScqrCbybNePvgc0EBvbt2cFkhaaGg3uUMi1fLZhQWlKHxUPTn~6Dn2MH2gCXcvLa7wE1BwGgZCYOQIpQO8TziCjkVM5sU-7A__\\u0026Key-Pair-Id=KL5I0C8H7HX83\",\"processed_usdz_url\":\"\",\"processed_armature_fbx_url\":\"\",\"processed_animation_fps_fbx_url\":\"\"}}\n\n" - }, - "cookies": [], - "headers": [ - { - "name": "cache-control", - "value": "no-cache" - }, - { - "name": "connection", - "value": "keep-alive" - }, - { - "name": "content-type", - "value": "text/event-stream;charset=utf-8" - }, - { - "name": "date", - "value": "Wed, 28 Jan 2026 09:47:57 GMT" - }, - { - "name": "transfer-encoding", - "value": "chunked" - }, - { - "name": "x-accel-buffering", - "value": "no" - }, - { - "name": "x-api-version", - "value": "v2026.01.27" - } - ], - "headersSize": 214, - "httpVersion": "HTTP/1.1", - "redirectURL": "", - "status": 200, - "statusText": "OK" - }, - "startedDateTime": "2026-01-28T09:47:57.239Z", - "time": 24829, - "timings": { - "blocked": -1, - "connect": -1, - "dns": -1, - "receive": 0, - "send": 0, - "ssl": -1, - "wait": 24829 - } - } - ], - "pages": [], - "version": "1.2" - } -} diff --git a/packages/meshy-content-generator/test/fixtures/character-full/manifest.json b/packages/meshy-content-generator/test/fixtures/character-full/manifest.json deleted file mode 100644 index 0c58391d..00000000 --- a/packages/meshy-content-generator/test/fixtures/character-full/manifest.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "id": "full-pipeline-test", - "name": "Full Pipeline Test", - "type": "character", - "textToImageTask": { - "prompt": "A stylized anime hero standing on a rooftop, clean line art, neutral lighting" - }, - "textTo3DPreviewTask": { - "prompt": "Stylized anime hero character with clean silhouette, standing pose" - }, - "textTo3DRefineTask": { - "texturePrompt": "Cel-shaded anime materials, crisp outlines, subtle fabric weave" - }, - "riggingTask": { - "heightMeters": 1.7 - }, - "animationTask": { - "animations": ["WalkAndRun.Walking.Casual_Walk"] - } -} diff --git a/packages/meshy-content-generator/tsconfig.json b/packages/meshy-content-generator/tsconfig.json deleted file mode 100644 index 306cc2ce..00000000 --- a/packages/meshy-content-generator/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "ES2022", - "moduleResolution": "Bundler", - "lib": ["ES2022"], - "types": ["node"], - "outDir": "dist", - "rootDir": "src", - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "strict": true, - "noImplicitAny": true, - "noUncheckedIndexedAccess": true, - "exactOptionalPropertyTypes": true, - "noFallthroughCasesInSwitch": true, - "skipLibCheck": true - }, - "include": ["src"], - "exclude": ["src/content.config.ts"] -} diff --git a/packages/meshy-content-generator/tsup.config.ts b/packages/meshy-content-generator/tsup.config.ts deleted file mode 100644 index 20e47a56..00000000 --- a/packages/meshy-content-generator/tsup.config.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig([ - { - entry: ["src/index.ts"], - format: ["esm"], - dts: true, - sourcemap: true, - clean: true, - outDir: "dist", - }, - { - entry: ["src/cli/index.ts"], - format: ["esm"], - dts: true, - sourcemap: true, - outDir: "dist/cli", - banner: { - js: "#!/usr/bin/env node", - }, - }, -]); diff --git a/packages/meshy-content-generator/vitest.config.ts b/packages/meshy-content-generator/vitest.config.ts deleted file mode 100644 index d5cfff3f..00000000 --- a/packages/meshy-content-generator/vitest.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from "vitest/config"; - -export default defineConfig({ - test: { - include: ["src/**/__tests__/**/*.test.ts"], - }, -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b3b30d7d..a98a7a6f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -187,70 +187,6 @@ importers: specifier: ^4.1.0 version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.3)(@vitest/coverage-v8@4.1.10)(vite@8.1.5(@types/node@22.19.3)(esbuild@0.28.1)(tsx@4.21.0)(yaml@2.9.0)) - packages/meshy-content-generator: - dependencies: - '@asteasolutions/zod-to-openapi': - specifier: ^8.4.0 - version: 8.4.1(zod@4.3.6) - '@google/model-viewer': - specifier: ^4.1.0 - version: 4.1.0(three@0.172.0) - '@pollyjs/adapter-fetch': - specifier: ^6.0.7 - version: 6.0.7 - '@pollyjs/core': - specifier: ^6.0.6 - version: 6.0.6 - '@pollyjs/persister-fs': - specifier: ^6.0.6 - version: 6.0.6(supports-color@7.2.0) - '@scalar/fastify-api-reference': - specifier: ^1.43.17 - version: 1.44.26 - commander: - specifier: ^14.0.2 - version: 14.0.2 - dotenv: - specifier: ^17.2.3 - version: 17.3.1 - fastify: - specifier: ^5.8.5 - version: 5.10.0 - seedrandom: - specifier: ^3.0.5 - version: 3.0.5 - three: - specifier: ^0.172.0 - version: 0.172.0 - zod: - specifier: ^4.3.6 - version: 4.3.6 - devDependencies: - '@biomejs/biome': - specifier: ^2.3.13 - version: 2.4.4 - '@playwright/test': - specifier: ^1.58.0 - version: 1.58.2 - '@types/node': - specifier: ^25.0.10 - version: 25.3.0 - '@types/seedrandom': - specifier: ^3.0.8 - version: 3.0.8 - tsup: - specifier: ^8.5.1 - version: 8.5.1(postcss@8.5.23)(supports-color@7.2.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.9.0) - tsx: - specifier: ^4.21.0 - version: 4.21.0 - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vitest: - specifier: ^4.1.0 - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(@vitest/coverage-v8@4.1.10)(vite@8.1.5(@types/node@25.3.0)(esbuild@0.28.1)(tsx@4.21.0)(yaml@2.9.0)) - packages/providers: dependencies: '@jbcom/agentic-triage': @@ -435,11 +371,6 @@ packages: resolution: {integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==} engines: {node: '>=18'} - '@asteasolutions/zod-to-openapi@8.4.1': - resolution: {integrity: sha512-WmJUsFINbnWxGvHSd16aOjgKf+5GsfdxruO2YDLcgplsidakCauik1lhlk83YDH06265Yd1XtUyF24o09uygpw==} - peerDependencies: - zod: ^4.0.0 - '@astrojs/compiler-binding-darwin-arm64@0.3.1': resolution: {integrity: sha512-IEmEF2fUIlTHtpeE/isyEGVOB14cEyh/LZOFYt6wn3jNyVpdC8aR5OZ+RzFUR/f+8ZDM1LaMwZKvoA7eMyJeFw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1167,35 +1098,18 @@ packages: engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/biome@2.4.4': - resolution: {integrity: sha512-tigwWS5KfJf0cABVd52NVaXyAVv4qpUXOWJ1rxFL8xF1RVoeS2q/LK+FHgYoKMclJCuRoCWAPy1IXaN9/mS61Q==} - engines: {node: '>=14.21.3'} - hasBin: true - '@biomejs/cli-darwin-arm64@2.3.10': resolution: {integrity: sha512-M6xUjtCVnNGFfK7HMNKa593nb7fwNm43fq1Mt71kpLpb+4mE7odO8W/oWVDyBVO4ackhresy1ZYO7OJcVo/B7w==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-arm64@2.4.4': - resolution: {integrity: sha512-jZ+Xc6qvD6tTH5jM6eKX44dcbyNqJHssfl2nnwT6vma6B1sj7ZLTGIk6N5QwVBs5xGN52r3trk5fgd3sQ9We9A==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [darwin] - '@biomejs/cli-darwin-x64@2.3.10': resolution: {integrity: sha512-Vae7+V6t/Avr8tVbFNjnFSTKZogZHFYl7MMH62P/J1kZtr0tyRQ9Fe0onjqjS2Ek9lmNLmZc/VR5uSekh+p1fg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-darwin-x64@2.4.4': - resolution: {integrity: sha512-Dh1a/+W+SUCXhEdL7TiX3ArPTFCQKJTI1mGncZNWfO+6suk+gYA4lNyJcBB+pwvF49uw0pEbUS49BgYOY4hzUg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.3.10': resolution: {integrity: sha512-B9DszIHkuKtOH2IFeeVkQmSMVUjss9KtHaNXquYYWCjH8IstNgXgx5B0aSBQNr6mn4RcKKRQZXn9Zu1rM3O0/A==} engines: {node: '>=14.21.3'} @@ -1203,13 +1117,6 @@ packages: os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64-musl@2.4.4': - resolution: {integrity: sha512-+sPAXq3bxmFwhVFJnSwkSF5Rw2ZAJMH3MF6C9IveAEOdSpgajPhoQhbbAK12SehN9j2QrHpk4J/cHsa/HqWaYQ==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - libc: [musl] - '@biomejs/cli-linux-arm64@2.3.10': resolution: {integrity: sha512-hhPw2V3/EpHKsileVOFynuWiKRgFEV48cLe0eA+G2wO4SzlwEhLEB9LhlSrVeu2mtSn205W283LkX7Fh48CaxA==} engines: {node: '>=14.21.3'} @@ -1217,13 +1124,6 @@ packages: os: [linux] libc: [glibc] - '@biomejs/cli-linux-arm64@2.4.4': - resolution: {integrity: sha512-V/NFfbWhsUU6w+m5WYbBenlEAz8eYnSqRMDMAW3K+3v0tYVkNyZn8VU0XPxk/lOqNXLSCCrV7FmV/u3SjCBShg==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.3.10': resolution: {integrity: sha512-QTfHZQh62SDFdYc2nfmZFuTm5yYb4eO1zwfB+90YxUumRCR171tS1GoTX5OD0wrv4UsziMPmrePMtkTnNyYG3g==} engines: {node: '>=14.21.3'} @@ -1231,13 +1131,6 @@ packages: os: [linux] libc: [musl] - '@biomejs/cli-linux-x64-musl@2.4.4': - resolution: {integrity: sha512-gGvFTGpOIQDb5CQ2VC0n9Z2UEqlP46c4aNgHmAMytYieTGEcfqhfCFnhs6xjt0S3igE6q5GLuIXtdQt3Izok+g==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - libc: [musl] - '@biomejs/cli-linux-x64@2.3.10': resolution: {integrity: sha512-wwAkWD1MR95u+J4LkWP74/vGz+tRrIQvr8kfMMJY8KOQ8+HMVleREOcPYsQX82S7uueco60L58Wc6M1I9WA9Dw==} engines: {node: '>=14.21.3'} @@ -1245,37 +1138,18 @@ packages: os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64@2.4.4': - resolution: {integrity: sha512-R4+ZCDtG9kHArasyBO+UBD6jr/FcFCTH8QkNTOCu0pRJzCWyWC4EtZa2AmUZB5h3e0jD7bRV2KvrENcf8rndBg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - libc: [glibc] - '@biomejs/cli-win32-arm64@2.3.10': resolution: {integrity: sha512-o7lYc9n+CfRbHvkjPhm8s9FgbKdYZu5HCcGVMItLjz93EhgJ8AM44W+QckDqLA9MKDNFrR8nPbO4b73VC5kGGQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-arm64@2.4.4': - resolution: {integrity: sha512-trzCqM7x+Gn832zZHgr28JoYagQNX4CZkUZhMUac2YxvvyDRLJDrb5m9IA7CaZLlX6lTQmADVfLEKP1et1Ma4Q==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [win32] - '@biomejs/cli-win32-x64@2.3.10': resolution: {integrity: sha512-pHEFgq7dUEsKnqG9mx9bXihxGI49X+ar+UBrEIj3Wqj3UCZp1rNgV+OoyjFgcXsjCWpuEAF4VJdkZr3TrWdCbQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] - '@biomejs/cli-win32-x64@2.4.4': - resolution: {integrity: sha512-gnOHKVPFAAPrpoPt2t+Q6FZ7RPry/FDV3GcpU53P3PtLNnQjBmKyN2Vh/JtqXet+H4pme8CC76rScwdjDcT1/A==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [win32] - '@bruits/satteri-darwin-arm64@0.9.5': resolution: {integrity: sha512-iw4nZgx9v30lWo/MTngQqi1pI78KI0DnkSm+lVJGYdmPLgAyDNJigVhpG42/Iq55A6c1Ll8q66ljyyRiQUxwow==} cpu: [arm64] @@ -1534,33 +1408,9 @@ packages: '@expressive-code/plugin-text-markers@0.44.1': resolution: {integrity: sha512-B3BsJoJ8CFMlcIX9f+X9tcI3C4zPDO601+YuLi9GheSTNro7ZfqSjLptMQKBHOWZvxnAtY5zvIX7iO/qtBhNBg==} - '@fastify/ajv-compiler@4.0.5': - resolution: {integrity: sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==} - - '@fastify/error@4.2.0': - resolution: {integrity: sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==} - - '@fastify/fast-json-stringify-compiler@5.0.3': - resolution: {integrity: sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==} - - '@fastify/forwarded@3.0.1': - resolution: {integrity: sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==} - - '@fastify/merge-json-schemas@0.2.1': - resolution: {integrity: sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==} - - '@fastify/proxy-addr@5.1.0': - resolution: {integrity: sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==} - '@gerrit0/mini-shiki@3.20.0': resolution: {integrity: sha512-Wa57i+bMpK6PGJZ1f2myxo3iO+K/kZikcyvH8NIqNNZhQUbDav7V9LQmWOXhf946mz5c1NZ19WMsGYiDKTryzQ==} - '@google/model-viewer@4.1.0': - resolution: {integrity: sha512-7WB/jS6wfBfRl/tWhsUUvDMKFE1KlKME97coDLlZQfvJD0nCwjhES1lJ+k7wnmf7T3zMvCfn9mIjM/mgZapuig==} - engines: {node: '>=6.0.0'} - peerDependencies: - three: ^0.172.0 - '@graphql-typed-document-node/core@3.2.0': resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: @@ -1903,12 +1753,6 @@ packages: resolution: {integrity: sha512-I6MMle0hXR8SC2KVaDHt+vQvGDSQQwhfA9eq17hAL1y1Sf+7aGpaCXzMx3S4wcD9fLS5LZxd7aY8nAiTYHjoEg==} engines: {node: '>=18.x'} - '@lit-labs/ssr-dom-shim@1.5.1': - resolution: {integrity: sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==} - - '@lit/reactive-element@2.1.2': - resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} - '@mdx-js/mdx@3.1.1': resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} @@ -1922,11 +1766,6 @@ packages: '@cfworker/json-schema': optional: true - '@monogrid/gainmap-js@3.4.0': - resolution: {integrity: sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg==} - peerDependencies: - three: '>= 0.159.0' - '@napi-rs/wasm-runtime@0.2.4': resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} @@ -2171,9 +2010,6 @@ packages: cpu: [x64] os: [win32] - '@pinojs/redact@0.4.0': - resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} - '@playwright/mcp@0.0.68': resolution: {integrity: sha512-oP9I9ghXKuQEBo4xaC7HgsS2gRTxyMzlBm3UEhYj4VqqrqbPQUX2shATPaNA/am9joBzq9v0OXISzeIgP+zmHA==} engines: {node: '>=18'} @@ -2196,27 +2032,6 @@ packages: resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} engines: {node: '>=12'} - '@pollyjs/adapter-fetch@6.0.7': - resolution: {integrity: sha512-kv44DROx/2qzlcgS71EccGr2/I5nK40Xt92paGNI+1/Kmz290bw/ykt8cvXDg4O4xCc9Fh/jXeAkS7qwGpCx2g==} - - '@pollyjs/adapter@6.0.6': - resolution: {integrity: sha512-szhys0NiFQqCJDMC0kpDyjhLqSI7aWc6m6iATCRKgcMcN/7QN85pb3GmRzvnNV8+/Bi2AUSCwxZljcsKhbYVWQ==} - - '@pollyjs/core@6.0.6': - resolution: {integrity: sha512-1ZZcmojW8iSFmvHGeLlvuudM3WiDV842FsVvtPAo3HoAYE6jCNveLHJ+X4qvonL4enj1SyTF3hXA107UkQFQrA==} - - '@pollyjs/node-server@6.0.6': - resolution: {integrity: sha512-nkP1+hdNoVOlrRz9R84haXVsaSmo8Xmq7uYK9GeUMSLQy4Fs55ZZ9o2KI6vRA8F6ZqJSbC31xxwwIoTkjyP7Vg==} - - '@pollyjs/persister-fs@6.0.6': - resolution: {integrity: sha512-/ALVgZiH2zGqwLkW0Mntc0Oq1v7tR8LS8JD2SAyIsHpnSXeBUnfPWwjAuYw0vqORHFVEbwned6MBRFfvU/3qng==} - - '@pollyjs/persister@6.0.6': - resolution: {integrity: sha512-9KB1p+frvYvFGur4ifzLnFKFLXAMXrhAhCnVhTnkG2WIqqQPT7y+mKBV/DKCmYFx8GPA9FiNGqt2pB53uJpIdw==} - - '@pollyjs/utils@6.0.6': - resolution: {integrity: sha512-nhVJoI3nRgRimE0V2DVSvsXXNROUH6iyJbroDu4IdsOIOFC1Ds0w+ANMB4NMwFaqE+AisWOmXFzwAGdAfyiQVg==} - '@rolldown/binding-android-arm64@1.1.5': resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2462,38 +2277,6 @@ packages: cpu: [x64] os: [win32] - '@scalar/core@0.3.42': - resolution: {integrity: sha512-RbyooMuG4oQEOhiA/tC+++bkIK1zeYGNxrTzSAgTrTzVlbFKPzw72fs4gX9/eHDo7qVc9FsymIW6qVpWbySzNg==} - engines: {node: '>=20'} - - '@scalar/fastify-api-reference@1.44.26': - resolution: {integrity: sha512-w6cCqHasrZ7+JNj6oOtK7iZJ0r0gxPkKMLlADSnx+JNTuNL0JuXwplgcbAGbgRAszIkvkkXTNvGOAulHPzGdLQ==} - engines: {node: '>=20'} - - '@scalar/helpers@0.2.16': - resolution: {integrity: sha512-JlDUKdmwAHdcFUdTngNtx/uhLKTBACXlgvri7iKb6Jx6ImRIBgHwxZNAqlil1L047+QBrKh97lnezNpzNQAffQ==} - engines: {node: '>=20'} - - '@scalar/json-magic@0.11.5': - resolution: {integrity: sha512-WhNsLzjaCwa0hdYVezHnNmlOkX8PMPbyljeBfHtkmxMSf8W5Ht1LePQzfWzMc9SFwN6n7LcR4XVQvUwwNIyUUg==} - engines: {node: '>=20'} - - '@scalar/openapi-parser@0.24.14': - resolution: {integrity: sha512-C3PBhS1TNJY+nCoUnrLiyKgLIty9Iu0QVvj2XhU0uMFJNwtMS18xdvTiQ1Svtu2YZF08T6K9UPbViBKwSMFcbg==} - engines: {node: '>=20'} - - '@scalar/openapi-types@0.5.3': - resolution: {integrity: sha512-m4n/Su3K01d15dmdWO1LlqecdSPKuNjuokrJLdiQ485kW/hRHbXW1QP6tJL75myhw/XhX5YhYAR+jrwnGjXiMw==} - engines: {node: '>=20'} - - '@scalar/openapi-upgrader@0.1.8': - resolution: {integrity: sha512-2xuYLLs0fBadLIk4I1ObjMiCnOyLPEMPf24A1HtHQvhKGDnGlvT63F2rU2Xw8lxCjgHnzveMPnOJEbwIy64RCg==} - engines: {node: '>=20'} - - '@scalar/types@0.6.7': - resolution: {integrity: sha512-ihHaoPF9qQR05pV3mfE7yBlHQdm5CoJVE0HiJFH6xSrzLfk2yJ6XdD3OzyRCqyxkZ38bj2RIZMS6LJsGy4p66g==} - engines: {node: '>=20'} - '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} @@ -2599,10 +2382,6 @@ packages: '@sinclair/typebox@0.34.48': resolution: {integrity: sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==} - '@sindresorhus/fnv1a@2.0.1': - resolution: {integrity: sha512-suq9tRQ6bkpMukTG5K5z0sPWB7t0zExMzZCdmYm6xTSSIm/yCKNm7VCL36wVeyTsFr597/UhU1OAYdHGMDiHrw==} - engines: {node: '>=10'} - '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -2683,15 +2462,6 @@ packages: '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} - '@types/seedrandom@3.0.8': - resolution: {integrity: sha512-TY1eezMU2zH2ozQoAFAQFOPpvP15g+ZgSfTZt31AUUH/Rxtnz3H+A/Sv1Snw2/amp//omibc+AEkTaA8KUeOLQ==} - - '@types/set-cookie-parser@2.4.10': - resolution: {integrity: sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==} - - '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -2755,13 +2525,6 @@ packages: resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} hasBin: true - abstract-logging@2.0.1: - resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} - - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} @@ -2808,14 +2571,6 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - ajv-draft-04@1.0.0: - resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} - peerDependencies: - ajv: '>=8.18.0' - peerDependenciesMeta: - ajv: - optional: true - ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} peerDependencies: @@ -2883,9 +2638,6 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} @@ -2924,13 +2676,6 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - - avvio@9.2.0: - resolution: {integrity: sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==} - axios@1.18.1: resolution: {integrity: sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==} @@ -2991,10 +2736,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - basic-auth@2.0.1: - resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} - engines: {node: '>= 0.8'} - bcp-47-match@2.0.3: resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} @@ -3007,9 +2748,6 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - blueimp-md5@2.19.0: - resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} - body-parser@2.3.0: resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} engines: {node: '>=18'} @@ -3020,9 +2758,6 @@ packages: bottleneck@2.19.5: resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} - bowser@2.14.1: - resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} - brace-expansion@5.0.8: resolution: {integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==} engines: {node: 20 || >=22} @@ -3232,10 +2967,6 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - content-disposition@1.0.1: resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} engines: {node: '>=18'} @@ -3276,9 +3007,6 @@ packages: cookie-es@1.2.3: resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} - cookie-signature@1.0.7: - resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} - cookie-signature@1.2.2: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} @@ -3287,10 +3015,6 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - cookie@1.1.1: - resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} - engines: {node: '>=18'} - cookie@2.0.1: resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==} engines: {node: '>=22'} @@ -3356,14 +3080,6 @@ packages: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -3405,10 +3121,6 @@ packages: destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -3461,10 +3173,6 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - dotenv@17.3.1: - resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} - engines: {node: '>=12'} - dset@3.1.4: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} @@ -3655,10 +3363,6 @@ packages: peerDependencies: express: '>= 4.11' - express@4.22.1: - resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} - engines: {node: '>= 0.10.0'} - express@5.2.1: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} @@ -3676,24 +3380,9 @@ packages: fast-content-type-parse@3.0.0: resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} - fast-decode-uri-component@1.0.1: - resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-json-stringify@6.3.0: - resolution: {integrity: sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA==} - - fast-json-stringify@7.0.1: - resolution: {integrity: sha512-eRSayARSbbwlBjpP4vnTTIRD5QPcIrmihPxDeN1DtKnHPg66UuJLx+8hlK1kaFdjvzyQ/dzALoi4vwAQ+T+iZA==} - - fast-querystring@1.1.2: - resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} - fast-string-truncated-width@3.0.3: resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} @@ -3706,15 +3395,6 @@ packages: fast-wrap-ansi@0.2.2: resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} - fastify-plugin@4.5.1: - resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} - - fastify@5.10.0: - resolution: {integrity: sha512-A9L0ziuWGQHgEEVgF3davQ9vbD93IuX+lo2IsxapQmu5b/Y/ynn9m9K5JHt9dvyJXOFc5iN0Zk5GHEOqnzhWjg==} - - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -3744,18 +3424,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.3.2: - resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} - engines: {node: '>= 0.8'} - finalhandler@2.1.1: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} - find-my-way@9.7.0: - resolution: {integrity: sha512-f2JHn75x2JlwUwLenZypgczR7YWMb/uO9BvUXtus+JMgkbIkLADd38cI4EiV+OQqrGo1Zlq6V8wnqMJ8e62wUQ==} - engines: {node: '>=20'} - find-up-simple@1.0.1: resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} engines: {node: '>=18'} @@ -3803,10 +3475,6 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} @@ -3820,10 +3488,6 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - fs-extra@11.3.3: resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} engines: {node: '>=14.14'} @@ -4049,10 +3713,6 @@ packages: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} - http-graceful-shutdown@3.1.15: - resolution: {integrity: sha512-7BzY5XxGV4g7QaOZ8xf5Hco8vJMMUFDl+AcB8AuOOdS1wTOZ88aV3EIADUnyAItj2QW+QfBPz08/PzxKiDKh6Q==} - engines: {node: '>=4.0.0'} - http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -4108,9 +3768,6 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -4155,17 +3812,9 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - ipaddr.js@2.3.0: - resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} - engines: {node: '>= 10'} - iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} - is-absolute-url@3.0.3: - resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} - engines: {node: '>=8'} - is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -4215,9 +3864,6 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} @@ -4308,9 +3954,6 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-ref-resolver@3.0.0: - resolution: {integrity: sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==} - json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} @@ -4334,24 +3977,10 @@ packages: jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} - jsonpointer@5.0.1: - resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} - engines: {node: '>=0.10.0'} - klona@2.0.6: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} - leven@4.1.0: - resolution: {integrity: sha512-KZ9W9nWDT7rF7Dazg8xyLHGLrmpgq2nVNFUckhqdW3szVP6YhCpp/RAnpmVExA9JvrMynjwSLVrEj3AepHR6ew==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - - light-my-request@6.6.0: - resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} - lightningcss-android-arm64@1.33.0: resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} @@ -4440,15 +4069,6 @@ packages: linkify-it@6.1.0: resolution: {integrity: sha512-wJ/TwpSDTLepCrQoYWYIExIKg5Zchex2Nn5yk2mFnB+6PtdkHtyLx742md9csRjjOnGkKIS/RrbY7l8D6gT9Vw==} - lit-element@4.2.2: - resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} - - lit-html@3.3.2: - resolution: {integrity: sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==} - - lit@3.3.2: - resolution: {integrity: sha512-NF9zbsP79l4ao2SNrH3NkfmFgN/hBYSQo90saIVI1o5GpjAdCPVstVzO1MrLOakHoEhYkrtRjPK6Ob521aoYWQ==} - load-json-file@4.0.0: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} @@ -4489,10 +4109,6 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - loglevel@1.9.2: - resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} - engines: {node: '>= 0.6.0'} - longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -4616,10 +4232,6 @@ packages: mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} @@ -4628,9 +4240,6 @@ packages: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} @@ -4638,10 +4247,6 @@ packages: merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -4770,11 +4375,6 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - mime@4.1.0: resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==} engines: {node: '>=16'} @@ -4806,17 +4406,10 @@ packages: mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} - morgan@1.11.0: - resolution: {integrity: sha512-zSkVu3t18r39pw4ixfBKvfZi3y2UOqr7d4WYwcj3m8nXpEQK4rPO6GLzs/CExoRgmX3y9EjmmcXqv6jq0SK46g==} - engines: {node: '>= 0.8.0'} - mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -4832,15 +4425,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.1.6: - resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} - engines: {node: ^18 || >=20} - hasBin: true - - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - negotiator@1.0.0: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} @@ -4858,10 +4442,6 @@ packages: nlcst-to-string@4.0.0: resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} - nocache@3.0.4: - resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} - engines: {node: '>=12.0.0'} - node-emoji@2.2.0: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} @@ -5017,18 +4597,10 @@ packages: ollama@0.6.3: resolution: {integrity: sha512-KEWEhIqE5wtfzEIZbDCLH51VFZ6Z3ZSa6sIOg/E/tBV8S51flyqBOXi+bRxlOYKDf8i327zG9eSTb8IJxvm3Zg==} - on-exit-leak-free@2.1.2: - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} - engines: {node: '>=14.0.0'} - on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} - on-headers@1.1.0: - resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} - engines: {node: '>= 0.8'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -5050,9 +4622,6 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - openapi3-ts@4.5.0: - resolution: {integrity: sha512-jaL+HgTq2Gj5jRcfdutgRGLosCy/hT8sQf6VOy+P+g36cZOjI1iukdPnijC+4CmeRzg/jEllJUboEic2FhxhtQ==} - ora@5.3.0: resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} engines: {node: '>=10'} @@ -5218,16 +4787,6 @@ packages: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} - pino-abstract-transport@3.0.0: - resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==} - - pino-std-serializers@7.1.0: - resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} - - pino@10.3.1: - resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==} - hasBin: true - pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -5314,15 +4873,6 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process-warning@4.0.1: - resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} - - process-warning@5.0.0: - resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} - - promise-worker-transferable@1.0.4: - resolution: {integrity: sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==} - property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} @@ -5348,12 +4898,6 @@ packages: resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} engines: {node: '>=0.6'} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - - quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} @@ -5403,10 +4947,6 @@ packages: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} - real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} - recma-build-jsx@1.0.0: resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} @@ -5503,9 +5043,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -5530,10 +5067,6 @@ packages: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} - ret@0.5.0: - resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} - engines: {node: '>=10'} - retext-latin@4.0.0: resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} @@ -5546,13 +5079,6 @@ packages: retext@9.0.0: resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rimraf@6.1.3: resolution: {integrity: sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==} engines: {node: 20 || >=22} @@ -5568,9 +5094,6 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - route-recognizer@0.3.4: - resolution: {integrity: sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g==} - router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -5578,16 +5101,6 @@ packages: safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-regex2@5.0.0: - resolution: {integrity: sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==} - - safe-stable-stringify@2.5.0: - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} - engines: {node: '>=10'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -5602,12 +5115,6 @@ packages: resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} engines: {node: '>=11.0.0'} - secure-json-parse@4.1.0: - resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} - - seedrandom@3.0.5: - resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} - semantic-release@25.0.2: resolution: {integrity: sha512-6qGjWccl5yoyugHt3jTgztJ9Y0JVzyH8/Voc/D8PlLat9pwxQYXz7W1Dpnq5h0/G5GCYGUaDSlYcyk3AMh5A6g==} engines: {node: ^22.14.0 || >= 24.10.0} @@ -5636,25 +5143,14 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.19.2: - resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} - engines: {node: '>= 0.8.0'} - send@1.2.1: resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} - serve-static@1.16.3: - resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} - engines: {node: '>= 0.8.0'} - serve-static@2.2.1: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} - set-cookie-parser@2.7.2: - resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -5724,17 +5220,10 @@ packages: resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} engines: {node: '>=8'} - slugify@1.6.6: - resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} - engines: {node: '>=8.0.0'} - smol-toml@1.7.0: resolution: {integrity: sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==} engines: {node: '>= 18'} - sonic-boom@4.2.1: - resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -5771,10 +5260,6 @@ packages: split2@1.0.0: resolution: {integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==} - split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -5892,13 +5377,6 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thread-stream@4.0.0: - resolution: {integrity: sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==} - engines: {node: '>=20'} - - three@0.172.0: - resolution: {integrity: sha512-6HMgMlzU97MsV7D/tY8Va38b83kz8YJX+BefKjspMNAv0Vx6dxMogHOrnRl/sbMIs3BPUKijPqDqJ/+UwJbIow==} - through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -5939,9 +5417,6 @@ packages: resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} engines: {node: '>=14.14'} - to-arraybuffer@1.0.1: - resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -6022,10 +5497,6 @@ packages: resolution: {integrity: sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==} engines: {node: '>=20'} - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - type-is@2.0.1: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} @@ -6234,19 +5705,9 @@ packages: resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - - utf8-byte-length@1.0.5: - resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -6594,11 +6055,6 @@ snapshots: dependencies: json-schema: 0.4.0 - '@asteasolutions/zod-to-openapi@8.4.1(zod@4.3.6)': - dependencies: - openapi3-ts: 4.5.0 - zod: 4.3.6 - '@astrojs/compiler-binding-darwin-arm64@0.3.1': optional: true @@ -7578,66 +7034,31 @@ snapshots: '@biomejs/cli-win32-arm64': 2.3.10 '@biomejs/cli-win32-x64': 2.3.10 - '@biomejs/biome@2.4.4': - optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.4.4 - '@biomejs/cli-darwin-x64': 2.4.4 - '@biomejs/cli-linux-arm64': 2.4.4 - '@biomejs/cli-linux-arm64-musl': 2.4.4 - '@biomejs/cli-linux-x64': 2.4.4 - '@biomejs/cli-linux-x64-musl': 2.4.4 - '@biomejs/cli-win32-arm64': 2.4.4 - '@biomejs/cli-win32-x64': 2.4.4 - '@biomejs/cli-darwin-arm64@2.3.10': optional: true - '@biomejs/cli-darwin-arm64@2.4.4': - optional: true - '@biomejs/cli-darwin-x64@2.3.10': optional: true - '@biomejs/cli-darwin-x64@2.4.4': - optional: true - '@biomejs/cli-linux-arm64-musl@2.3.10': optional: true - '@biomejs/cli-linux-arm64-musl@2.4.4': - optional: true - '@biomejs/cli-linux-arm64@2.3.10': optional: true - '@biomejs/cli-linux-arm64@2.4.4': - optional: true - '@biomejs/cli-linux-x64-musl@2.3.10': optional: true - '@biomejs/cli-linux-x64-musl@2.4.4': - optional: true - '@biomejs/cli-linux-x64@2.3.10': optional: true - '@biomejs/cli-linux-x64@2.4.4': - optional: true - '@biomejs/cli-win32-arm64@2.3.10': optional: true - '@biomejs/cli-win32-arm64@2.4.4': - optional: true - '@biomejs/cli-win32-x64@2.3.10': optional: true - '@biomejs/cli-win32-x64@2.4.4': - optional: true - - '@bruits/satteri-darwin-arm64@0.9.5': + '@bruits/satteri-darwin-arm64@0.9.5': optional: true '@bruits/satteri-darwin-x64@0.9.5': @@ -7826,29 +7247,6 @@ snapshots: dependencies: '@expressive-code/core': 0.44.1 - '@fastify/ajv-compiler@4.0.5': - dependencies: - ajv: 8.18.0 - ajv-formats: 3.0.1(ajv@8.18.0) - fast-uri: 4.1.1 - - '@fastify/error@4.2.0': {} - - '@fastify/fast-json-stringify-compiler@5.0.3': - dependencies: - fast-json-stringify: 6.3.0 - - '@fastify/forwarded@3.0.1': {} - - '@fastify/merge-json-schemas@0.2.1': - dependencies: - dequal: 2.0.3 - - '@fastify/proxy-addr@5.1.0': - dependencies: - '@fastify/forwarded': 3.0.1 - ipaddr.js: 2.3.0 - '@gerrit0/mini-shiki@3.20.0': dependencies: '@shikijs/engine-oniguruma': 3.20.0 @@ -7857,12 +7255,6 @@ snapshots: '@shikijs/types': 3.20.0 '@shikijs/vscode-textmate': 10.0.2 - '@google/model-viewer@4.1.0(three@0.172.0)': - dependencies: - '@monogrid/gainmap-js': 3.4.0(three@0.172.0) - lit: 3.3.2 - three: 0.172.0 - '@graphql-typed-document-node/core@3.2.0(graphql@15.10.1)': dependencies: graphql: 15.10.1 @@ -8131,12 +7523,6 @@ snapshots: '@graphql-typed-document-node/core': 3.2.0(graphql@15.10.1) graphql: 15.10.1 - '@lit-labs/ssr-dom-shim@1.5.1': {} - - '@lit/reactive-element@2.1.2': - dependencies: - '@lit-labs/ssr-dom-shim': 1.5.1 - '@mdx-js/mdx@3.1.1(supports-color@7.2.0)': dependencies: '@types/estree': 1.0.8 @@ -8211,11 +7597,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@monogrid/gainmap-js@3.4.0(three@0.172.0)': - dependencies: - promise-worker-transferable: 1.0.4 - three: 0.172.0 - '@napi-rs/wasm-runtime@0.2.4': dependencies: '@emnapi/core': 1.8.1 @@ -8517,8 +7898,6 @@ snapshots: '@pagefind/windows-x64@1.5.2': optional: true - '@pinojs/redact@0.4.0': {} - '@playwright/mcp@0.0.68': dependencies: playwright: 1.59.0-alpha-1771104257000 @@ -8540,63 +7919,6 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@pollyjs/adapter-fetch@6.0.7': - dependencies: - '@pollyjs/adapter': 6.0.6 - '@pollyjs/utils': 6.0.6 - to-arraybuffer: 1.0.1 - - '@pollyjs/adapter@6.0.6': - dependencies: - '@pollyjs/utils': 6.0.6 - - '@pollyjs/core@6.0.6': - dependencies: - '@pollyjs/utils': 6.0.6 - '@sindresorhus/fnv1a': 2.0.1 - blueimp-md5: 2.19.0 - fast-json-stable-stringify: 2.1.0 - is-absolute-url: 3.0.3 - lodash-es: 4.18.1 - loglevel: 1.9.2 - route-recognizer: 0.3.4 - slugify: 1.6.6 - - '@pollyjs/node-server@6.0.6(supports-color@7.2.0)': - dependencies: - '@pollyjs/utils': 6.0.6 - body-parser: 2.3.0(supports-color@7.2.0) - cors: 2.8.5 - express: 4.22.1(supports-color@7.2.0) - fs-extra: 10.1.0 - http-graceful-shutdown: 3.1.15(supports-color@7.2.0) - morgan: 1.11.0(supports-color@7.2.0) - nocache: 3.0.4 - transitivePeerDependencies: - - supports-color - - '@pollyjs/persister-fs@6.0.6(supports-color@7.2.0)': - dependencies: - '@pollyjs/node-server': 6.0.6(supports-color@7.2.0) - '@pollyjs/persister': 6.0.6 - transitivePeerDependencies: - - supports-color - - '@pollyjs/persister@6.0.6': - dependencies: - '@pollyjs/utils': 6.0.6 - '@types/set-cookie-parser': 2.4.10 - bowser: 2.14.1 - fast-json-stable-stringify: 2.1.0 - lodash-es: 4.18.1 - set-cookie-parser: 2.7.2 - utf8-byte-length: 1.0.5 - - '@pollyjs/utils@6.0.6': - dependencies: - qs: 6.15.3 - url-parse: 1.5.10 - '@rolldown/binding-android-arm64@1.1.5': optional: true @@ -8731,54 +8053,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.62.2': optional: true - '@scalar/core@0.3.42': - dependencies: - '@scalar/types': 0.6.7 - - '@scalar/fastify-api-reference@1.44.26': - dependencies: - '@scalar/core': 0.3.42 - '@scalar/openapi-parser': 0.24.14 - '@scalar/openapi-types': 0.5.3 - fastify-plugin: 4.5.1 - github-slugger: 2.0.0 - - '@scalar/helpers@0.2.16': {} - - '@scalar/json-magic@0.11.5': - dependencies: - '@scalar/helpers': 0.2.16 - pathe: 2.0.3 - yaml: 2.9.0 - - '@scalar/openapi-parser@0.24.14': - dependencies: - '@scalar/helpers': 0.2.16 - '@scalar/json-magic': 0.11.5 - '@scalar/openapi-types': 0.5.3 - '@scalar/openapi-upgrader': 0.1.8 - ajv: 8.18.0 - ajv-draft-04: 1.0.0(ajv@8.18.0) - ajv-formats: 3.0.1(ajv@8.18.0) - jsonpointer: 5.0.1 - leven: 4.1.0 - yaml: 2.9.0 - - '@scalar/openapi-types@0.5.3': - dependencies: - zod: 4.3.6 - - '@scalar/openapi-upgrader@0.1.8': - dependencies: - '@scalar/openapi-types': 0.5.3 - - '@scalar/types@0.6.7': - dependencies: - '@scalar/helpers': 0.2.16 - nanoid: 5.1.6 - type-fest: 5.3.1 - zod: 4.3.6 - '@sec-ant/readable-stream@0.4.1': {} '@semantic-release/changelog@6.0.3(semantic-release@25.0.2(supports-color@7.2.0)(typescript@5.9.3))': @@ -8957,8 +8231,6 @@ snapshots: '@sinclair/typebox@0.34.48': {} - '@sindresorhus/fnv1a@2.0.1': {} - '@sindresorhus/is@4.6.0': {} '@sindresorhus/merge-streams@4.0.0': {} @@ -9037,14 +8309,6 @@ snapshots: dependencies: '@types/node': 25.3.0 - '@types/seedrandom@3.0.8': {} - - '@types/set-cookie-parser@2.4.10': - dependencies: - '@types/node': 25.3.0 - - '@types/trusted-types@2.0.7': {} - '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} @@ -9127,13 +8391,6 @@ snapshots: dependencies: argparse: 2.0.1 - abstract-logging@2.0.1: {} - - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - accepts@2.0.0: dependencies: mime-types: 3.0.2 @@ -9199,10 +8456,6 @@ snapshots: '@opentelemetry/api': 1.9.0 zod: 4.3.6 - ajv-draft-04@1.0.0(ajv@8.18.0): - optionalDependencies: - ajv: 8.18.0 - ajv-formats@3.0.1(ajv@8.18.0): optionalDependencies: ajv: 8.18.0 @@ -9255,8 +8508,6 @@ snapshots: aria-query@5.3.2: {} - array-flatten@1.1.1: {} - array-ify@1.0.0: {} array-iterate@2.0.1: {} @@ -9374,13 +8625,6 @@ snapshots: asynckit@0.4.0: {} - atomic-sleep@1.0.0: {} - - avvio@9.2.0: - dependencies: - '@fastify/error': 4.2.0 - fastq: 1.20.1 - axios@1.18.1(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0): dependencies: follow-redirects: 1.16.0(debug@4.4.3(supports-color@7.2.0)) @@ -9455,10 +8699,6 @@ snapshots: baseline-browser-mapping@2.10.0: {} - basic-auth@2.0.1: - dependencies: - safe-buffer: 5.1.2 - bcp-47-match@2.0.3: {} bcp-47@2.1.0: @@ -9475,8 +8715,6 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - blueimp-md5@2.19.0: {} - body-parser@2.3.0(supports-color@7.2.0): dependencies: bytes: 3.1.2 @@ -9495,8 +8733,6 @@ snapshots: bottleneck@2.19.5: {} - bowser@2.14.1: {} - brace-expansion@5.0.8: dependencies: balanced-match: 4.0.4 @@ -9703,10 +8939,6 @@ snapshots: consola@3.4.2: {} - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - content-disposition@1.0.1: {} content-type@1.0.5: {} @@ -9736,14 +8968,10 @@ snapshots: cookie-es@1.2.3: {} - cookie-signature@1.0.7: {} - cookie-signature@1.2.2: {} cookie@0.7.2: {} - cookie@1.1.1: {} - cookie@2.0.1: {} core-js-compat@3.48.0: @@ -9816,12 +9044,6 @@ snapshots: dependencies: css-tree: 2.2.1 - debug@2.6.9(supports-color@7.2.0): - dependencies: - ms: 2.0.0 - optionalDependencies: - supports-color: 7.2.0 - debug@4.4.3(supports-color@7.2.0): dependencies: ms: 2.1.3 @@ -9850,8 +9072,6 @@ snapshots: destr@2.0.5: {} - destroy@1.2.0: {} - detect-libc@2.1.2: {} detect-port@1.6.1(supports-color@7.2.0): @@ -9903,8 +9123,6 @@ snapshots: dotenv@16.4.7: {} - dotenv@17.3.1: {} - dset@3.1.4: {} dunder-proto@1.0.1: @@ -10133,42 +9351,6 @@ snapshots: transitivePeerDependencies: - supports-color - express@4.22.1(supports-color@7.2.0): - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 2.3.0(supports-color@7.2.0) - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.0.7 - debug: 2.6.9(supports-color@7.2.0) - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.2(supports-color@7.2.0) - fresh: 0.5.2 - http-errors: 2.0.1 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 8.4.2 - proxy-addr: 2.0.7 - qs: 6.15.3 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.2(supports-color@7.2.0) - serve-static: 1.16.3(supports-color@7.2.0) - setprototypeof: 1.2.0 - statuses: 2.0.2 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - express@5.2.1(supports-color@7.2.0): dependencies: accepts: 2.0.0 @@ -10217,34 +9399,8 @@ snapshots: fast-content-type-parse@3.0.0: {} - fast-decode-uri-component@1.0.1: {} - fast-deep-equal@3.1.3: {} - fast-json-stable-stringify@2.1.0: {} - - fast-json-stringify@6.3.0: - dependencies: - '@fastify/merge-json-schemas': 0.2.1 - ajv: 8.18.0 - ajv-formats: 3.0.1(ajv@8.18.0) - fast-uri: 4.1.1 - json-schema-ref-resolver: 3.0.0 - rfdc: 1.4.1 - - fast-json-stringify@7.0.1: - dependencies: - '@fastify/merge-json-schemas': 0.2.1 - ajv: 8.18.0 - ajv-formats: 3.0.1(ajv@8.18.0) - fast-uri: 4.1.1 - json-schema-ref-resolver: 3.0.0 - rfdc: 1.4.1 - - fast-querystring@1.1.2: - dependencies: - fast-decode-uri-component: 1.0.1 - fast-string-truncated-width@3.0.3: {} fast-string-width@3.0.2: @@ -10257,30 +9413,6 @@ snapshots: dependencies: fast-string-width: 3.0.2 - fastify-plugin@4.5.1: {} - - fastify@5.10.0: - dependencies: - '@fastify/ajv-compiler': 4.0.5 - '@fastify/error': 4.2.0 - '@fastify/fast-json-stringify-compiler': 5.0.3 - '@fastify/proxy-addr': 5.1.0 - abstract-logging: 2.0.1 - avvio: 9.2.0 - fast-json-stringify: 7.0.1 - find-my-way: 9.7.0 - light-my-request: 6.6.0 - pino: 10.3.1 - process-warning: 5.0.0 - rfdc: 1.4.1 - secure-json-parse: 4.1.0 - semver: 7.8.5 - toad-cache: 3.7.0 - - fastq@1.20.1: - dependencies: - reusify: 1.1.0 - fdir@6.5.0(picomatch@4.0.5): optionalDependencies: picomatch: 4.0.5 @@ -10305,18 +9437,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@1.3.2(supports-color@7.2.0): - dependencies: - debug: 2.6.9(supports-color@7.2.0) - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - finalhandler@2.1.1(supports-color@7.2.0): dependencies: debug: 4.4.3(supports-color@7.2.0) @@ -10328,12 +9448,6 @@ snapshots: transitivePeerDependencies: - supports-color - find-my-way@9.7.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-querystring: 1.1.2 - safe-regex2: 5.0.0 - find-up-simple@1.0.1: {} find-up@2.1.0: @@ -10377,8 +9491,6 @@ snapshots: forwarded@0.2.0: {} - fresh@0.5.2: {} - fresh@2.0.0: {} from2@2.3.0: @@ -10392,12 +9504,6 @@ snapshots: fs-constants@1.0.0: {} - fs-extra@10.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.0 - universalify: 2.0.1 - fs-extra@11.3.3: dependencies: graceful-fs: 4.2.11 @@ -10755,12 +9861,6 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 - http-graceful-shutdown@3.1.15(supports-color@7.2.0): - dependencies: - debug: 4.4.3(supports-color@7.2.0) - transitivePeerDependencies: - - supports-color - http-proxy-agent@7.0.2(supports-color@7.2.0): dependencies: agent-base: 7.1.4 @@ -10810,8 +9910,6 @@ snapshots: ignore@7.0.5: {} - immediate@3.0.6: {} - import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -10847,12 +9945,8 @@ snapshots: ipaddr.js@1.9.1: {} - ipaddr.js@2.3.0: {} - iron-webcrypto@1.2.1: {} - is-absolute-url@3.0.3: {} - is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -10884,8 +9978,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-promise@2.2.2: {} - is-promise@4.0.0: {} is-stream@2.0.1: {} @@ -10960,10 +10052,6 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-schema-ref-resolver@3.0.0: - dependencies: - dequal: 2.0.3 - json-schema-traverse@1.0.0: {} json-schema-typed@8.0.2: {} @@ -10982,22 +10070,8 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonpointer@5.0.1: {} - klona@2.0.6: {} - leven@4.1.0: {} - - lie@3.3.0: - dependencies: - immediate: 3.0.6 - - light-my-request@6.6.0: - dependencies: - cookie: 1.1.1 - process-warning: 4.0.1 - set-cookie-parser: 2.7.2 - lightningcss-android-arm64@1.33.0: optional: true @@ -11057,22 +10131,6 @@ snapshots: dependencies: uc.micro: 3.0.0 - lit-element@4.2.2: - dependencies: - '@lit-labs/ssr-dom-shim': 1.5.1 - '@lit/reactive-element': 2.1.2 - lit-html: 3.3.2 - - lit-html@3.3.2: - dependencies: - '@types/trusted-types': 2.0.7 - - lit@3.3.2: - dependencies: - '@lit/reactive-element': 2.1.2 - lit-element: 4.2.2 - lit-html: 3.3.2 - load-json-file@4.0.0: dependencies: graceful-fs: 4.2.11 @@ -11108,8 +10166,6 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - loglevel@1.9.2: {} - longest-streak@3.1.0: {} lru-cache@10.4.3: {} @@ -11361,20 +10417,14 @@ snapshots: mdurl@2.0.0: {} - media-typer@0.3.0: {} - media-typer@1.1.0: {} meow@13.2.0: {} - merge-descriptors@1.0.3: {} - merge-descriptors@2.0.0: {} merge-stream@2.0.0: {} - methods@1.1.2: {} - micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.3.0 @@ -11666,8 +10716,6 @@ snapshots: dependencies: mime-db: 1.54.0 - mime@1.6.0: {} - mime@4.1.0: {} mimic-fn@2.1.0: {} @@ -11691,20 +10739,8 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.3 - morgan@1.11.0(supports-color@7.2.0): - dependencies: - basic-auth: 2.0.1 - debug: 2.6.9(supports-color@7.2.0) - depd: 2.0.0 - on-finished: 2.4.1 - on-headers: 1.1.0 - transitivePeerDependencies: - - supports-color - mrmime@2.0.1: {} - ms@2.0.0: {} - ms@2.1.3: {} mute-stream@3.0.0: {} @@ -11717,10 +10753,6 @@ snapshots: nanoid@3.3.16: {} - nanoid@5.1.6: {} - - negotiator@0.6.3: {} - negotiator@1.0.0: {} neo-async@2.6.2: {} @@ -11733,8 +10765,6 @@ snapshots: dependencies: '@types/nlcst': 2.0.3 - nocache@3.0.4: {} - node-emoji@2.2.0: dependencies: '@sindresorhus/is': 4.6.0 @@ -11870,14 +10900,10 @@ snapshots: dependencies: whatwg-fetch: 3.6.20 - on-exit-leak-free@2.1.2: {} - on-finished@2.4.1: dependencies: ee-first: 1.1.1 - on-headers@1.1.0: {} - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -11904,10 +10930,6 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - openapi3-ts@4.5.0: - dependencies: - yaml: 2.9.0 - ora@5.3.0: dependencies: bl: 4.1.0 @@ -12072,26 +11094,6 @@ snapshots: pify@3.0.0: {} - pino-abstract-transport@3.0.0: - dependencies: - split2: 4.2.0 - - pino-std-serializers@7.1.0: {} - - pino@10.3.1: - dependencies: - '@pinojs/redact': 0.4.0 - atomic-sleep: 1.0.0 - on-exit-leak-free: 2.1.2 - pino-abstract-transport: 3.0.0 - pino-std-serializers: 7.1.0 - process-warning: 5.0.0 - quick-format-unescaped: 4.0.4 - real-require: 0.2.0 - safe-stable-stringify: 2.5.0 - sonic-boom: 4.2.1 - thread-stream: 4.0.0 - pirates@4.0.7: {} pkce-challenge@5.0.1: {} @@ -12163,15 +11165,6 @@ snapshots: process-nextick-args@2.0.1: {} - process-warning@4.0.1: {} - - process-warning@5.0.0: {} - - promise-worker-transferable@1.0.4: - dependencies: - is-promise: 2.2.2 - lie: 3.3.0 - property-information@7.1.0: {} proto-list@1.2.4: {} @@ -12192,10 +11185,6 @@ snapshots: es-define-property: 1.0.1 side-channel: 1.1.1 - querystringify@2.2.0: {} - - quick-format-unescaped@4.0.4: {} - radix3@1.1.2: {} range-parser@1.2.1: {} @@ -12264,8 +11253,6 @@ snapshots: readdirp@5.0.0: {} - real-require@0.2.0: {} - recma-build-jsx@1.0.0: dependencies: '@types/estree': 1.0.8 @@ -12433,8 +11420,6 @@ snapshots: require-from-string@2.0.2: {} - requires-port@1.0.0: {} - resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -12454,8 +11439,6 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 - ret@0.5.0: {} - retext-latin@4.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -12481,10 +11464,6 @@ snapshots: retext-stringify: 4.0.0 unified: 11.0.5 - reusify@1.1.0: {} - - rfdc@1.4.1: {} - rimraf@6.1.3: dependencies: glob: 13.0.6 @@ -12542,8 +11521,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.62.2 fsevents: 2.3.3 - route-recognizer@0.3.4: {} - router@2.2.0(supports-color@7.2.0): dependencies: debug: 4.4.3(supports-color@7.2.0) @@ -12556,14 +11533,6 @@ snapshots: safe-buffer@5.1.2: {} - safe-buffer@5.2.1: {} - - safe-regex2@5.0.0: - dependencies: - ret: 0.5.0 - - safe-stable-stringify@2.5.0: {} - safer-buffer@2.1.2: {} satteri@0.9.5: @@ -12587,10 +11556,6 @@ snapshots: sax@1.6.1: {} - secure-json-parse@4.1.0: {} - - seedrandom@3.0.5: {} - semantic-release@25.0.2(supports-color@7.2.0)(typescript@5.9.3): dependencies: '@semantic-release/commit-analyzer': 13.0.1(semantic-release@25.0.2(supports-color@7.2.0)(typescript@5.9.3))(supports-color@7.2.0) @@ -12638,24 +11603,6 @@ snapshots: semver@7.8.5: {} - send@0.19.2(supports-color@7.2.0): - dependencies: - debug: 2.6.9(supports-color@7.2.0) - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.1 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - send@1.2.1(supports-color@7.2.0): dependencies: debug: 4.4.3(supports-color@7.2.0) @@ -12672,15 +11619,6 @@ snapshots: transitivePeerDependencies: - supports-color - serve-static@1.16.3(supports-color@7.2.0): - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.2(supports-color@7.2.0) - transitivePeerDependencies: - - supports-color - serve-static@2.2.1(supports-color@7.2.0): dependencies: encodeurl: 2.0.0 @@ -12690,8 +11628,6 @@ snapshots: transitivePeerDependencies: - supports-color - set-cookie-parser@2.7.2: {} - setprototypeof@1.2.0: {} sharp@0.35.3(@types/node@25.3.0): @@ -12807,14 +11743,8 @@ snapshots: dependencies: unicode-emoji-modifier-base: 1.0.0 - slugify@1.6.6: {} - smol-toml@1.7.0: {} - sonic-boom@4.2.1: - dependencies: - atomic-sleep: 1.0.0 - source-map-js@1.2.1: {} source-map-support@0.5.19: @@ -12848,8 +11778,6 @@ snapshots: dependencies: through2: 2.0.5 - split2@4.2.0: {} - stackback@0.0.2: {} statuses@2.0.2: {} @@ -12978,12 +11906,6 @@ snapshots: dependencies: any-promise: 1.3.0 - thread-stream@4.0.0: - dependencies: - real-require: 0.2.0 - - three@0.172.0: {} - through2@2.0.5: dependencies: readable-stream: 2.3.8 @@ -13017,8 +11939,6 @@ snapshots: tmp@0.2.7: {} - to-arraybuffer@1.0.1: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -13092,11 +12012,6 @@ snapshots: dependencies: tagged-tag: 1.0.0 - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - type-is@2.0.1: dependencies: content-type: 1.0.5 @@ -13251,17 +12166,8 @@ snapshots: url-join@5.0.0: {} - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - - utf8-byte-length@1.0.5: {} - util-deprecate@1.0.2: {} - utils-merge@1.0.1: {} - validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 diff --git a/scripts/brand-assets/README.md b/scripts/brand-assets/README.md index db7f0f89..ea842dd0 100644 --- a/scripts/brand-assets/README.md +++ b/scripts/brand-assets/README.md @@ -1,60 +1,15 @@ -# Brand Asset Generation +# Brand asset generation -Dogfooding the `meshy-content-generator` package to produce Agentic brand imagery. - -## Prerequisites - -- Node.js 20+ -- `MESHY_API_KEY` environment variable (available via Doppler) - -## What It Generates - -| Asset | Directory | Aspect Ratio | Description | -|-------|-----------|--------------|-------------| -| Hero Image | `hero-image/` | 16:9 | Abstract command-center visualization for landing pages | -| OG Background | `og-background/` | 16:9 | Dark textured background for Open Graph / social cards | -| Icon Concept | `icon-concept/` | 1:1 | Geometric logo mark exploration | - -Each directory contains a `manifest.json` that drives the generation and stores state. - -## Running +The declarative `pipeline.json` and `catalogue.json` run through the standalone +`meshy-content-generator`; this monorepo contains no Meshy client. ```bash -# Option 1: Export the key directly -export MESHY_API_KEY="your-key-here" -bash scripts/brand-assets/generate.sh - -# Option 2: Use Doppler to inject secrets -doppler run -- bash scripts/brand-assets/generate.sh +cp .env.example .env +bash scripts/brand-assets/generate.sh --dry-run +bash scripts/brand-assets/generate.sh agentic-hero ``` -The script iterates over every subdirectory that contains a `manifest.json` and runs the `brand-image` pipeline against it. - -## How Idempotent Manifests Work - -Each `manifest.json` starts as a plain asset description. When the pipeline runs: - -1. A deterministic `seed` is written into the manifest (first run only). -2. The Meshy API task is created and polled until completion. -3. Task state (`taskId`, `status`, `outputs`, `artifacts`) is persisted back into the manifest under the `tasks` key. -4. Generated images are downloaded as `concept-0.png`, `concept-1.png`, etc. - -On subsequent runs the runner detects `"status": "SUCCEEDED"` in the manifest and skips the API call entirely. If an artifact file is missing on disk but the task succeeded, only the download step is re-executed. - -To force regeneration, delete the `tasks` key from the manifest and remove the local image files. - -## Customizing Prompts - -Edit the `textToImageTask.prompt` field in any `manifest.json`. Other tunable fields: - -- `aiModel` -- Meshy model variant (default: `nano-banana`) -- `aspectRatio` -- `1:1`, `16:9`, `4:3`, etc. -- `generateMultiView` -- set `true` for multi-view concept sheets - -After editing, re-run `generate.sh`. If the previous task state is still present in the manifest, delete the `tasks` key first so the pipeline treats it as a fresh run. - -## Adding New Assets - -1. Create a new subdirectory under `scripts/brand-assets/`. -2. Add a `manifest.json` following the schema (must have `id`, `name`, `type`, and a `textToImageTask` block). -3. Run `generate.sh` -- the new directory will be picked up automatically. +`--dry-run` validates all three requests without reading the API key, making a +network call, or writing output. The live route delegates credentials, retries, +polling, errors, downloads and job sidecars to `vendor-fabric` through the +standalone package. Generated images land under `generated/`. diff --git a/scripts/brand-assets/catalogue.json b/scripts/brand-assets/catalogue.json new file mode 100644 index 00000000..5e135b7e --- /dev/null +++ b/scripts/brand-assets/catalogue.json @@ -0,0 +1,22 @@ +{ + "assets": [ + { + "id": "agentic-hero", + "prompt": "Abstract digital command center visualization, warm amber and deep orange energy streams connecting geometric nodes against a dark background, representing AI agent orchestration and fleet coordination, minimal clean tech aesthetic, dark moody atmosphere with amber glow highlights, no text, no faces, professional brand imagery", + "model": "nano-banana", + "aspect": "16:9" + }, + { + "id": "agentic-icon", + "prompt": "Minimalist geometric logo mark for an AI orchestration platform called Agentic, central node with radiating connections to satellite nodes forming a command network, warm amber and deep orange on transparent dark background, flat vector style, clean precise lines, professional tech brand icon, single mark centered", + "model": "nano-banana", + "aspect": "1:1" + }, + { + "id": "agentic-og-bg", + "prompt": "Abstract dark background texture with subtle amber and orange geometric patterns, hexagonal grid dissolving into warm light particles, dark near-black base with warm amber energy accents, suitable for text overlay, professional tech brand background, no text", + "model": "nano-banana", + "aspect": "16:9" + } + ] +} diff --git a/scripts/brand-assets/generate.sh b/scripts/brand-assets/generate.sh index 2605d30a..67a52c68 100755 --- a/scripts/brand-assets/generate.sh +++ b/scripts/brand-assets/generate.sh @@ -3,31 +3,17 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" -MESHY_PKG="$REPO_ROOT/packages/meshy-content-generator" -# Require MESHY_API_KEY -if [ -z "${MESHY_API_KEY:-}" ]; then - echo "Error: MESHY_API_KEY is required. Set it in your environment or via Doppler." - echo " doppler run -- bash $0" - exit 1 +ENV_ARGS=() +if [ -f "$REPO_ROOT/.env" ]; then + ENV_ARGS=(--env-file "$REPO_ROOT/.env") fi -echo "=== Generating Agentic Brand Assets ===" -echo "" - -for manifest_dir in "$SCRIPT_DIR"/*/; do - [ -f "$manifest_dir/manifest.json" ] || continue - name=$(basename "$manifest_dir") - echo "--- Generating: $name ---" - - npx content-gen run brand-image "$manifest_dir" \ - --pipelines "$MESHY_PKG/pipelines/definitions" \ - --tasks "$MESHY_PKG/tasks/definitions" \ - --meshy-api-key "$MESHY_API_KEY" - - echo "--- Done: $name ---" - echo "" -done +GENERATOR_SOURCE="meshy-content-generator==0.2.0" +if [ -n "${MESHY_CONTENT_GENERATOR_SOURCE:-}" ]; then + GENERATOR_SOURCE="$MESHY_CONTENT_GENERATOR_SOURCE" +fi -echo "=== All brand assets generated ===" -echo "Check scripts/brand-assets/*/concept-*.png for results" +uvx "${ENV_ARGS[@]}" \ + --from "$GENERATOR_SOURCE" \ + content-gen run "$SCRIPT_DIR/pipeline.json" --root "$REPO_ROOT" "$@" diff --git a/scripts/brand-assets/hero-image/manifest.json b/scripts/brand-assets/hero-image/manifest.json deleted file mode 100644 index 21f5163e..00000000 --- a/scripts/brand-assets/hero-image/manifest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "agentic-hero", - "name": "Agentic Hero Image", - "type": "brand", - "textToImageTask": { - "prompt": "Abstract digital command center visualization, warm amber and deep orange energy streams connecting geometric nodes against a dark background, representing AI agent orchestration and fleet coordination, minimal clean tech aesthetic, dark moody atmosphere with amber glow highlights, no text, no faces, professional brand imagery", - "aiModel": "nano-banana", - "aspectRatio": "16:9" - } -} diff --git a/scripts/brand-assets/icon-concept/manifest.json b/scripts/brand-assets/icon-concept/manifest.json deleted file mode 100644 index 229f25c5..00000000 --- a/scripts/brand-assets/icon-concept/manifest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "agentic-icon", - "name": "Agentic Icon Concept", - "type": "brand", - "textToImageTask": { - "prompt": "Minimalist geometric logo mark for an AI orchestration platform called Agentic, central node with radiating connections to satellite nodes forming a command network, warm amber and deep orange on transparent dark background, flat vector style, clean precise lines, professional tech brand icon, single mark centered", - "aiModel": "nano-banana", - "aspectRatio": "1:1" - } -} diff --git a/scripts/brand-assets/og-background/manifest.json b/scripts/brand-assets/og-background/manifest.json deleted file mode 100644 index 2533b404..00000000 --- a/scripts/brand-assets/og-background/manifest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "agentic-og-bg", - "name": "Agentic OG Image Background", - "type": "brand", - "textToImageTask": { - "prompt": "Abstract dark background texture with subtle amber and orange geometric patterns, hexagonal grid dissolving into warm light particles, dark near-black base with warm amber energy accents, suitable for text overlay, professional tech brand background, no text", - "aiModel": "nano-banana", - "aspectRatio": "16:9" - } -} diff --git a/scripts/brand-assets/pipeline.json b/scripts/brand-assets/pipeline.json new file mode 100644 index 00000000..acf0bfc8 --- /dev/null +++ b/scripts/brand-assets/pipeline.json @@ -0,0 +1,14 @@ +{ + "schema_version": 1, + "name": "agentic-brand-assets", + "source": "scripts/brand-assets/catalogue.json", + "records": "assets", + "generation": { + "id": "{id}", + "prompt": "{prompt}", + "model": "{model}", + "aspect_ratio": "{aspect}", + "output": "scripts/brand-assets/generated/{id}.png" + }, + "postprocess": [] +}