@forgeax/engine-skinning 0.1.21 → 0.1.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/errors.d.ts CHANGED
@@ -11,7 +11,7 @@
11
11
  * |:--|:--|:--|
12
12
  * | `'skeleton-resolve-failed'` | `SkeletonResolveFailedError` | `assets.get<SkeletonAsset>(skin.skeleton)` returns null/undefined |
13
13
  * | `'joint-count-mismatch'` | `JointCountMismatchError` | `Skin.joints.length !== SkeletonAsset.jointCount` |
14
- * | `'joint-entity-dangling'` | `JointEntityDanglingError` | `Skin.joints[i]` Entity is despawned (Transform.world view undefined) |
14
+ * | `'joint-entity-dangling'` | `JointEntityDanglingError` | `Skin.joints[i]` Entity is despawned (GlobalTransform.world view undefined) |
15
15
  *
16
16
  * AI users discriminate via `switch (err.code)` over `RuntimeErrorCode`;
17
17
  * each member narrows to its `*Error` class with structured `.detail`.
@@ -189,7 +189,7 @@ export declare class JointCountMismatchError extends Error {
189
189
  *
190
190
  * Emitted at extract time when `Skin.joints[i]` points at an Entity that has
191
191
  * been despawned (or lost its Transform component) so
192
- * `worldInternal._getArrayView(jointEntity, Transform, 'world')` returns
192
+ * `worldInternal._getArrayView(jointEntity, GlobalTransform, 'world')` returns
193
193
  * undefined. `jointIndex` is the position within `Skin.joints[]`.
194
194
  */
195
195
  export interface JointEntityDanglingDetail {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/assets/skin-decoder.ts","../src/errors.ts","../src/skin.ts","../src/plugin.ts","../src/resolve-skin-joints.ts"],"sourcesContent":["import {\n type AssetDecoderContribution,\n type AssetKind,\n err,\n ok,\n type SkeletonAsset,\n type SkinAsset,\n} from '@forgeax/engine-types';\n\nfunction floatArray(value: unknown): Float32Array | undefined {\n if (value instanceof Float32Array) return value;\n if (Array.isArray(value) && value.every((item) => typeof item === 'number')) {\n return Float32Array.from(value);\n }\n return undefined;\n}\n\nexport const skinContribution: AssetDecoderContribution<SkinAsset, 'skin'> = {\n kind: { kind: 'skin' } as AssetKind<SkinAsset, 'skin'>,\n consumer: 'resolveSkinJoints',\n decoder: {\n async decode({ envelope }) {\n const payload = envelope.payload;\n if (\n payload.kind === 'skin' &&\n payload.skeletonGuid.length > 0 &&\n payload.jointPaths.length > 0\n ) {\n return ok(payload);\n }\n return err({\n code: 'asset-package-invalid',\n expected: 'a skin payload with a skeleton GUID and joint paths',\n hint: 'recook the skin binding and publish its skeleton reference',\n detail: { guid: envelope.guid, reason: 'skin owner validation failed' },\n });\n },\n },\n};\n\nexport const skeletonContribution: AssetDecoderContribution<SkeletonAsset, 'skeleton'> = {\n kind: { kind: 'skeleton' } as AssetKind<SkeletonAsset, 'skeleton'>,\n consumer: 'resolveSkinJoints',\n decoder: {\n async decode({ envelope }) {\n const payload = envelope.payload as unknown;\n if (payload !== null && typeof payload === 'object') {\n const source = payload as Record<string, unknown>;\n const inverseBindMatrices = floatArray(source.inverseBindMatrices);\n const jointCount = source.jointCount;\n if (\n source.kind === 'skeleton' &&\n inverseBindMatrices !== undefined &&\n Number.isSafeInteger(jointCount) &&\n (jointCount as number) >= 0 &&\n inverseBindMatrices.length === (jointCount as number) * 16\n ) {\n return ok({ kind: 'skeleton', inverseBindMatrices, jointCount: jointCount as number });\n }\n }\n return err({\n code: 'asset-package-invalid',\n expected: 'a skeleton payload with one inverse-bind matrix per joint',\n hint: 'recook the skeleton and publish its complete joint data',\n detail: { guid: envelope.guid, reason: 'skeleton owner validation failed' },\n });\n },\n },\n};\n","// @forgeax/engine-runtime -- skin cluster error classes.\n//\n// feat-20260704-runtime-tier1-decomposition M2 / w8 (D-3): skin / skeleton\n// animation cluster -- joint count / despawn / path / coexistence and\n// extract-stage binding failures. Palette/material/GPU failures stay in the\n// render error union because render owns the emitting frame stages. Binding\n// class names, .code literals, and .detail shapes are preserved byte-for-byte\n// (OOS-4).\n//\n// SkinExtractErrorCode (the 3-member extract-stage subset union) is kept as a\n// named export and folded into SkinErrorCode, preserving the pre-existing\n// public symbol (OOS-4).\n\n// ── SkinExtractErrorCode subset union ───────────────────────────────────────\n\n/**\n * feat-20260612-skin-palette-per-frame-upload M2 / m2-5 subset union.\n *\n * Covers the three new fail-fast extract-stage errors that fire from\n * `render-system-extract.ts` `hasSkin` segment when the per-frame palette\n * upload pipeline cannot resolve a slice for an entity. Single-entity\n * `continue` semantics: the entity is skipped, sibling entities in the\n * same frame keep extracting (plan-strategy D-5).\n *\n * | code | class | trigger |\n * |:--|:--|:--|\n * | `'skeleton-resolve-failed'` | `SkeletonResolveFailedError` | `assets.get<SkeletonAsset>(skin.skeleton)` returns null/undefined |\n * | `'joint-count-mismatch'` | `JointCountMismatchError` | `Skin.joints.length !== SkeletonAsset.jointCount` |\n * | `'joint-entity-dangling'` | `JointEntityDanglingError` | `Skin.joints[i]` Entity is despawned (Transform.world view undefined) |\n *\n * AI users discriminate via `switch (err.code)` over `RuntimeErrorCode`;\n * each member narrows to its `*Error` class with structured `.detail`.\n *\n * NOTE: distinct from the pre-existing `'skin-joint-despawned'` /\n * `'skin-joint-path-unresolved'` / `'skin-joint-count-exceeded'`\n * (advanceAnimationPlayer + post-spawn jointPath resolution); plan-strategy\n * D-4 forbids reusing those codes for the new extract-stage triggers.\n */\nexport type SkinExtractErrorCode =\n | 'skeleton-resolve-failed'\n | 'joint-count-mismatch'\n | 'joint-entity-dangling';\n\n// ── SkinJointCountExceededError ────────────────────────────────────────────\n\n/**\n * Detail for `RuntimeErrorCode 'skin-joint-count-exceeded'`.\n *\n * Emitted when a glTF skin has more than MAX_JOINTS (256) joints.\n */\nexport interface SkinJointCountExceededDetail {\n readonly jointCount: number;\n readonly max: number;\n}\n\n/**\n * Structured error for skin joint count exceeding the engine cap.\n *\n * Emitted during skin import/validation. Four-field surface:\n * - `.code = 'skin-joint-count-exceeded'`\n * - `.expected` — max allowed (256)\n * - `.hint` — reduce joint count in the source asset\n * - `.detail = { jointCount, max }` — actual vs limit\n */\nexport class SkinJointCountExceededError extends Error {\n readonly code = 'skin-joint-count-exceeded' as const;\n readonly expected: string;\n readonly hint: string;\n readonly detail: SkinJointCountExceededDetail;\n\n constructor(jointCount: number, max = 256) {\n const expected = `jointCount <= ${max}`;\n const hint = `skin has ${jointCount} joints (max ${max}); reduce joint count in the source glTF asset (OOS-skin-many-joints)`;\n super(`skin joint count ${jointCount} exceeds max ${max}`);\n this.name = 'SkinJointCountExceededError';\n this.expected = expected;\n this.hint = hint;\n this.detail = { jointCount, max };\n }\n}\n\n// ── SkinJointDespawnedError ─────────────────────────────────────────────\n\n/**\n * Detail for `RuntimeErrorCode 'skin-joint-despawned'`.\n *\n * Emitted at extract time when a Skin.joints[i] Entity has been despawned.\n */\nexport interface SkinJointDespawnedDetail {\n readonly meshEntity: number;\n readonly jointIndex: number;\n}\n\n/**\n * Structured error for despawned skin joint Entity.\n *\n * Emitted at extract time; the mesh draw is fully skipped.\n * - `.code = 'skin-joint-despawned'`\n * - `.expected` — all Skin.joints alive\n * - `.hint` — remove the Skin component or re-spawn joints\n * - `.detail = { meshEntity, jointIndex }`\n */\nexport class SkinJointDespawnedError extends Error {\n readonly code = 'skin-joint-despawned' as const;\n readonly expected: string;\n readonly hint: string;\n readonly detail: SkinJointDespawnedDetail;\n\n constructor(meshEntity: number, jointIndex: number) {\n const expected = `Skin.joints[${jointIndex}] references a live entity`;\n const hint = `joint[${jointIndex}] of entity ${meshEntity} has been despawned; remove Skin component or re-spawn the joint entity (OOS-skin-joint-respawn)`;\n super(`skin joint[${jointIndex}] despawned for entity ${meshEntity}`);\n this.name = 'SkinJointDespawnedError';\n this.expected = expected;\n this.hint = hint;\n this.detail = { meshEntity, jointIndex };\n }\n}\n\n// ── SkinJointPathUnresolvedError ────────────────────────────────────────\n\n/**\n * Detail for `RuntimeErrorCode 'skin-joint-path-unresolved'`.\n *\n * Emitted at post-spawn time when a jointPath leaf name cannot be found.\n */\nexport interface SkinJointPathUnresolvedDetail {\n readonly skinEntity: number;\n readonly path: readonly string[];\n readonly failedAtIndex: number;\n}\n\n/**\n * Structured error for unresolved jointPath post-spawn.\n *\n * Emitted by resolveSkinJoints when Name lookup fails.\n * - `.code = 'skin-joint-path-unresolved'`\n * - `.expected` — Name-bearing entity exists for each jointPath leaf\n * - `.hint` — verify glTF node Name preservation in the importer\n * - `.detail = { skinEntity, path, failedAtIndex }`\n */\nexport class SkinJointPathUnresolvedError extends Error {\n readonly code = 'skin-joint-path-unresolved' as const;\n readonly expected: string;\n readonly hint: string;\n readonly detail: SkinJointPathUnresolvedDetail;\n\n constructor(skinEntity: number, path: readonly string[], failedAtIndex: number) {\n const leafName = path[failedAtIndex] ?? '<unknown>';\n const expected = `joint entity with Name=\"${leafName}\" exists in the world`;\n const hint = `joint path \"${path.join('/')}\" for skin entity ${skinEntity} could not be resolved; verify glTF node names are preserved`;\n super(\n `joint path \"${path.join('/')}\" unresolved at index ${failedAtIndex} for entity ${skinEntity}`,\n );\n this.name = 'SkinJointPathUnresolvedError';\n this.expected = expected;\n this.hint = hint;\n this.detail = { skinEntity, path, failedAtIndex };\n }\n}\n\n// ── SkinInstancesCoexistForbiddenError ──────────────────────────────────\n\n/**\n * Detail for `RuntimeErrorCode 'skin-instances-coexist-forbidden'`.\n *\n * Emitted at extract time when Skin + Instances coexist on the same entity.\n */\nexport interface SkinInstancesCoexistForbiddenDetail {\n readonly entity: number;\n}\n\n/**\n * Structured error for Skin + Instances coexistence on same entity.\n *\n * Emitted at extract time; the entity draw is skipped.\n * - `.code = 'skin-instances-coexist-forbidden'`\n * - `.expected` — Skin and Instances on separate entities\n * - `.hint` — split skinned meshes from instanced meshes into separate entities (OOS-skin-instances-coexist)\n * - `.detail = { entity }`\n */\nexport class SkinInstancesCoexistForbiddenError extends Error {\n readonly code = 'skin-instances-coexist-forbidden' as const;\n readonly expected: string;\n readonly hint: string;\n readonly detail: SkinInstancesCoexistForbiddenDetail;\n\n constructor(entity: number) {\n const expected = 'Skin and Instances must not coexist on the same entity';\n const hint = `entity ${entity} has both Skin and Instances; split skinned meshes from instanced meshes into separate entities (OOS-skin-instances-coexist)`;\n super(`Skin + Instances coexistence forbidden on entity ${entity}`);\n this.name = 'SkinInstancesCoexistForbiddenError';\n this.expected = expected;\n this.hint = hint;\n this.detail = { entity };\n }\n}\n\n// ── SkeletonResolveFailedError ─────────────────────────────────────────────\n\n/**\n * Detail for `RuntimeErrorCode 'skeleton-resolve-failed'`.\n *\n * Emitted at extract time when `assets.get<SkeletonAsset>(skin.skeleton)`\n * returns `null` / `undefined`. The skeleton handle is non-zero (the entity\n * declared a Skin) but the asset is not registered (importer drift /\n * AssetRegistry not warmed).\n */\nexport interface SkeletonResolveFailedDetail {\n readonly entity: number;\n readonly skeletonHandle: number;\n}\n\n/**\n * Structured error for unresolved SkeletonAsset handle at extract time\n * (feat-20260612-skin-palette-per-frame-upload M2 / m2-5).\n *\n * Emitted at extract time; the entity draw is skipped (continue), other\n * entities in the same frame keep extracting.\n * - `.code = 'skeleton-resolve-failed'`\n * - `.expected` — Skin.skeleton handle resolves to a registered SkeletonAsset\n * - `.hint` — verify SkeletonAsset is imported into pack-index AND registered\n * via AssetRegistry.register(handle, asset) before extractFrame\n * - `.detail = { entity, skeletonHandle }`\n */\nexport class SkeletonResolveFailedError extends Error {\n readonly code = 'skeleton-resolve-failed' as const;\n readonly expected: string;\n readonly hint: string;\n readonly detail: SkeletonResolveFailedDetail;\n\n constructor(entity: number, skeletonHandle: number) {\n const expected = `Skin.skeleton handle ${skeletonHandle} resolves to a registered SkeletonAsset`;\n const hint = `entity ${entity} Skin.skeleton handle ${skeletonHandle} is not registered; check that the SkeletonAsset went through the gltf importer into pack-index AND that AssetRegistry.register was called for the handle before extractFrame runs`;\n super(`Skin skeleton resolve failed on entity ${entity}: handle ${skeletonHandle}`);\n this.name = 'SkeletonResolveFailedError';\n this.expected = expected;\n this.hint = hint;\n this.detail = { entity, skeletonHandle };\n }\n}\n\n// ── JointCountMismatchError ────────────────────────────────────────────────\n\n/**\n * Detail for `RuntimeErrorCode 'joint-count-mismatch'`.\n *\n * Emitted at extract time when `Skin.joints.length !== SkeletonAsset.jointCount`.\n * `expected` is the SkeletonAsset's jointCount (the source of truth);\n * `actual` is the entity's `Skin.joints.length` (the runtime entity reference\n * list materialized at post-spawn time).\n */\nexport interface JointCountMismatchDetail {\n readonly entity: number;\n readonly expected: number;\n readonly actual: number;\n}\n\n/**\n * Structured error for SkinAsset.joints[] vs SkeletonAsset.jointCount disagreement\n * (feat-20260612-skin-palette-per-frame-upload M2 / m2-5).\n *\n * Emitted at extract time; the entity draw is skipped (continue).\n * - `.code = 'joint-count-mismatch'`\n * - `.expected` — Skin.joints.length === SkeletonAsset.jointCount\n * - `.hint` — verify SkinAsset.joints[] and SkeletonAsset jointPaths[]\n * come from the same glTF skin node\n * - `.detail = { entity, expected, actual }`\n */\nexport class JointCountMismatchError extends Error {\n readonly code = 'joint-count-mismatch' as const;\n readonly expected: string;\n readonly hint: string;\n readonly detail: JointCountMismatchDetail;\n\n constructor(entity: number, expected: number, actual: number) {\n const expectedStr = `Skin.joints.length === SkeletonAsset.jointCount (=${expected})`;\n const hint = `entity ${entity}: Skin.joints.length=${actual} disagrees with SkeletonAsset.jointCount=${expected}; verify SkinAsset.joints[] and SkeletonAsset jointPaths[] come from the same glTF skin node`;\n super(\n `joint count mismatch on entity ${entity}: SkeletonAsset.jointCount=${expected}, Skin.joints.length=${actual}`,\n );\n this.name = 'JointCountMismatchError';\n this.expected = expectedStr;\n this.hint = hint;\n this.detail = { entity, expected, actual };\n }\n}\n\n// ── JointEntityDanglingError ──────────────────────────────────────────────\n\n/**\n * Detail for `RuntimeErrorCode 'joint-entity-dangling'`.\n *\n * Emitted at extract time when `Skin.joints[i]` points at an Entity that has\n * been despawned (or lost its Transform component) so\n * `worldInternal._getArrayView(jointEntity, Transform, 'world')` returns\n * undefined. `jointIndex` is the position within `Skin.joints[]`.\n */\nexport interface JointEntityDanglingDetail {\n readonly entity: number;\n readonly jointIndex: number;\n}\n\n/**\n * Structured error for despawned (or Transform-less) joint Entity at extract\n * time (feat-20260612-skin-palette-per-frame-upload M2 / m2-5).\n *\n * Distinct from the pre-existing `SkinJointDespawnedError` which fires from\n * advanceAnimationPlayer (animation-stage); this one fires from extractFrame\n * (palette-upload stage) when the per-joint world mat4 view is missing.\n *\n * Emitted at extract time; the entity draw is skipped (continue).\n * - `.code = 'joint-entity-dangling'`\n * - `.expected` — Skin.joints[i] references a live Entity with Transform\n * - `.hint` — sync Skin.joints[] when joint entities are despawned, or\n * re-import the scene through the gltf importer to refresh Entity refs\n * - `.detail = { entity, jointIndex }`\n */\nexport class JointEntityDanglingError extends Error {\n readonly code = 'joint-entity-dangling' as const;\n readonly expected: string;\n readonly hint: string;\n readonly detail: JointEntityDanglingDetail;\n\n constructor(entity: number, jointIndex: number) {\n const expected = `Skin.joints[${jointIndex}] references a live Entity with Transform`;\n const hint = `entity ${entity} Skin.joints[${jointIndex}] points at a despawned (or Transform-less) Entity; sync Skin.joints[] when joint entities are despawned, or re-import the scene through the gltf importer to refresh Entity references`;\n super(`joint entity dangling on entity ${entity} at jointIndex ${jointIndex}`);\n this.name = 'JointEntityDanglingError';\n this.expected = expected;\n this.hint = hint;\n this.detail = { entity, jointIndex };\n }\n}\n\n// -- SkinErrorCode / SkinError closed unions ------------------------------------\n\n/**\n * Closed union of skin-cluster error codes derived from the correlated error\n * union. AI users perform exhaustive `switch (err.code)` without default; TS\n * guards completeness.\n */\nexport type SkinErrorCode = SkinError['code'];\n\n/**\n * Closed union of the skin-cluster structured error classes, each carrying a\n * `SkinErrorCode` discriminant on `.code`.\n */\nexport type SkinError =\n | SkinJointCountExceededError\n | SkinJointDespawnedError\n | SkinJointPathUnresolvedError\n | SkinInstancesCoexistForbiddenError\n | SkeletonResolveFailedError\n | JointCountMismatchError\n | JointEntityDanglingError;\n","// @forgeax/engine-runtime - Skin component (skeleton handle + joint Entity slots).\n//\n// Schema: { skeleton: 'shared<SkeletonAsset>', joints: 'array<entity>' }.\n//\n// `skeleton` carries the immutable SkeletonAsset handle (IBM + jointCount);\n// `joints` carries the live Entity[] resolved at post-spawn time from the\n// SkinAsset.jointPaths via Name-component BFS/DFS lookup. The joint list is\n// consumed by advanceAnimationPlayer (write target) and render-system-extract\n// (CPU palette pre-multiply source).\n//\n// Naming: single-semantic component drops the 'Component' suffix\n// (AGENTS.md §Component naming rule #1). `joints` field takes the holder's\n// perspective (AGENTS.md §Component naming rule #3).\n//\n// Component registered alongside MeshFilter / MeshRenderer / Transform as\n// a sibling on the same entity (AC-13 / AC-37). Skin + Instances coexistence\n// on the same entity is forbidden (M2 fail-fast 'skin-instances-coexist-forbidden').\n//\n// Decision anchors:\n// - requirements AC-13 (Skin sibling to MeshFilter / MeshRenderer)\n// - requirements AC-15 (joint Entity slots, no marker component)\n// - requirements AC-37 (no Component suffix)\n// - plan-strategy D-10 (SkinPaletteSlice naming + Skin x Instances fail-fast)\n// - charter P3 (explicit failure: joint despawn fail-fast)\n// - schema vocab 'shared<SkeletonAsset>' v1 missing item #4 alignment\n//\n// ## Transform contract (post-bug-20260615 fix)\n//\n// **Old (buggy) implicit contract (pre-bug-20260615):** The Skin entity's\n// Transform.world was double-applied during skinning -- the shader computed\n// `world = meshes[0].worldFromLocal x palette x pos`, so any non-identity\n// Transform on the Skin entity (or its non-joint ancestors) caused doubled\n// motion (translation 2x, rotation 2x). Holders had to manually pin the Skin\n// entity's Transform to identity to avoid doubled motion. This contract was\n// undocumented and easy to violate.\n//\n// **New explicit contract (post-bug-20260615 fix):** An entity carrying `Skin`\n// has its own `Transform` ignored at render time; the world transform is\n// determined entirely by the joints' world matrices fed through the palette:\n//\n// palette[i] = jointWorld_i x IBM_i\n// shader: world = palette[i] x pos\n//\n// No additional left-multiply by `meshes[0].worldFromLocal` or `instanceLocal`.\n// To move the rig, parent the joint root (or any common ancestor of the joints\n// in `Skin.joints[]`) to your driving entity -- moving the Skin entity itself\n// has no rendering effect. This aligns with glTF 2.0 SSkins Implementation\n// Note: \"the transform of the node that the mesh is attached to must be\n// ignored when performing skinning.\"\n//\n// Full pipeline documentation: packages/runtime/README.md\n// SSkinPaletteAllocator.\n//\n// Fix commits:\n// - M0 (red): 15425c2b -- parented skin double-transform unit test\n// - M1 (green): 2ad509b7 -- shader Plan A: drop meshes[0] left-multiply\n// - M2 (cleanup): 4118e463 -- extract.ts joint read -> world.get API\n// - M3 (demo): 94d7db66 -- hello-skin parented Fox under non-identity rig\n// - M4 (baseline): b6ddf46d -- palette-hash counter-proof + submodule pointer\n\nimport { defineComponent } from '@forgeax/engine-ecs';\n\nexport const Skin = defineComponent('Skin', {\n // The renderer owns the live skeleton asset/palette binding; joint entity\n // relationships remain the portable simulation-side pose contract.\n skeleton: { type: 'shared<SkeletonAsset>' },\n joints: { type: 'array<entity>' },\n});\n","import type { Component, World } from '@forgeax/engine-ecs';\nimport type { Plugin } from '@forgeax/engine-plugin';\nimport { Skin } from './skin';\n\nconst SKINNING_COMPONENTS: readonly Component[] = [Skin];\n\nfunction registerSkinningComponents(world: World): () => void {\n const leases = SKINNING_COMPONENTS.map((component) =>\n world.components.register(component).unwrap(),\n );\n return () => {\n for (let index = leases.length - 1; index >= 0; index -= 1) leases[index]?.dispose();\n };\n}\n\n/** Install skeletal binding components in a World that consumes skinned scenes. */\nexport function skinningPlugin(): Plugin {\n return {\n name: 'skinning',\n inject: ['world'],\n apply(ctx) {\n ctx.effect(() => registerSkinningComponents(ctx.world), 'skinning/components');\n },\n };\n}\n","import type { EntityHandle } from '@forgeax/engine-ecs';\nimport { type SkinError, SkinJointPathUnresolvedError } from './errors.js';\n\nexport function resolveSkinJoints(\n jointPaths: readonly string[],\n names: ReadonlyMap<string, EntityHandle>,\n skinEntity: EntityHandle,\n): { ok: true; value: Uint32Array } | { ok: false; error: SkinError } {\n const joints: number[] = [];\n for (const path of jointPaths) {\n const segments = path.split('/').filter(Boolean);\n if (segments.length === 0) continue;\n const failedAtIndex = segments.length - 1;\n const entity = names.get(segments[failedAtIndex] ?? '');\n if (entity === undefined) {\n return {\n ok: false,\n error: new SkinJointPathUnresolvedError(skinEntity as number, segments, failedAtIndex),\n };\n }\n joints.push(entity as number);\n }\n return { ok: true, value: new Uint32Array(joints) };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/assets/skin-decoder.ts","../src/errors.ts","../src/skin.ts","../src/plugin.ts","../src/resolve-skin-joints.ts"],"sourcesContent":["import {\n type AssetDecoderContribution,\n type AssetKind,\n err,\n ok,\n type SkeletonAsset,\n type SkinAsset,\n} from '@forgeax/engine-types';\n\nfunction floatArray(value: unknown): Float32Array | undefined {\n if (value instanceof Float32Array) return value;\n if (Array.isArray(value) && value.every((item) => typeof item === 'number')) {\n return Float32Array.from(value);\n }\n return undefined;\n}\n\nexport const skinContribution: AssetDecoderContribution<SkinAsset, 'skin'> = {\n kind: { kind: 'skin' } as AssetKind<SkinAsset, 'skin'>,\n consumer: 'resolveSkinJoints',\n decoder: {\n async decode({ envelope }) {\n const payload = envelope.payload;\n if (\n payload.kind === 'skin' &&\n payload.skeletonGuid.length > 0 &&\n payload.jointPaths.length > 0\n ) {\n return ok(payload);\n }\n return err({\n code: 'asset-package-invalid',\n expected: 'a skin payload with a skeleton GUID and joint paths',\n hint: 'recook the skin binding and publish its skeleton reference',\n detail: { guid: envelope.guid, reason: 'skin owner validation failed' },\n });\n },\n },\n};\n\nexport const skeletonContribution: AssetDecoderContribution<SkeletonAsset, 'skeleton'> = {\n kind: { kind: 'skeleton' } as AssetKind<SkeletonAsset, 'skeleton'>,\n consumer: 'resolveSkinJoints',\n decoder: {\n async decode({ envelope }) {\n const payload = envelope.payload as unknown;\n if (payload !== null && typeof payload === 'object') {\n const source = payload as Record<string, unknown>;\n const inverseBindMatrices = floatArray(source.inverseBindMatrices);\n const jointCount = source.jointCount;\n if (\n source.kind === 'skeleton' &&\n inverseBindMatrices !== undefined &&\n Number.isSafeInteger(jointCount) &&\n (jointCount as number) >= 0 &&\n inverseBindMatrices.length === (jointCount as number) * 16\n ) {\n return ok({ kind: 'skeleton', inverseBindMatrices, jointCount: jointCount as number });\n }\n }\n return err({\n code: 'asset-package-invalid',\n expected: 'a skeleton payload with one inverse-bind matrix per joint',\n hint: 'recook the skeleton and publish its complete joint data',\n detail: { guid: envelope.guid, reason: 'skeleton owner validation failed' },\n });\n },\n },\n};\n","// @forgeax/engine-runtime -- skin cluster error classes.\n//\n// feat-20260704-runtime-tier1-decomposition M2 / w8 (D-3): skin / skeleton\n// animation cluster -- joint count / despawn / path / coexistence and\n// extract-stage binding failures. Palette/material/GPU failures stay in the\n// render error union because render owns the emitting frame stages. Binding\n// class names, .code literals, and .detail shapes are preserved byte-for-byte\n// (OOS-4).\n//\n// SkinExtractErrorCode (the 3-member extract-stage subset union) is kept as a\n// named export and folded into SkinErrorCode, preserving the pre-existing\n// public symbol (OOS-4).\n\n// ── SkinExtractErrorCode subset union ───────────────────────────────────────\n\n/**\n * feat-20260612-skin-palette-per-frame-upload M2 / m2-5 subset union.\n *\n * Covers the three new fail-fast extract-stage errors that fire from\n * `render-system-extract.ts` `hasSkin` segment when the per-frame palette\n * upload pipeline cannot resolve a slice for an entity. Single-entity\n * `continue` semantics: the entity is skipped, sibling entities in the\n * same frame keep extracting (plan-strategy D-5).\n *\n * | code | class | trigger |\n * |:--|:--|:--|\n * | `'skeleton-resolve-failed'` | `SkeletonResolveFailedError` | `assets.get<SkeletonAsset>(skin.skeleton)` returns null/undefined |\n * | `'joint-count-mismatch'` | `JointCountMismatchError` | `Skin.joints.length !== SkeletonAsset.jointCount` |\n * | `'joint-entity-dangling'` | `JointEntityDanglingError` | `Skin.joints[i]` Entity is despawned (GlobalTransform.world view undefined) |\n *\n * AI users discriminate via `switch (err.code)` over `RuntimeErrorCode`;\n * each member narrows to its `*Error` class with structured `.detail`.\n *\n * NOTE: distinct from the pre-existing `'skin-joint-despawned'` /\n * `'skin-joint-path-unresolved'` / `'skin-joint-count-exceeded'`\n * (advanceAnimationPlayer + post-spawn jointPath resolution); plan-strategy\n * D-4 forbids reusing those codes for the new extract-stage triggers.\n */\nexport type SkinExtractErrorCode =\n | 'skeleton-resolve-failed'\n | 'joint-count-mismatch'\n | 'joint-entity-dangling';\n\n// ── SkinJointCountExceededError ────────────────────────────────────────────\n\n/**\n * Detail for `RuntimeErrorCode 'skin-joint-count-exceeded'`.\n *\n * Emitted when a glTF skin has more than MAX_JOINTS (256) joints.\n */\nexport interface SkinJointCountExceededDetail {\n readonly jointCount: number;\n readonly max: number;\n}\n\n/**\n * Structured error for skin joint count exceeding the engine cap.\n *\n * Emitted during skin import/validation. Four-field surface:\n * - `.code = 'skin-joint-count-exceeded'`\n * - `.expected` — max allowed (256)\n * - `.hint` — reduce joint count in the source asset\n * - `.detail = { jointCount, max }` — actual vs limit\n */\nexport class SkinJointCountExceededError extends Error {\n readonly code = 'skin-joint-count-exceeded' as const;\n readonly expected: string;\n readonly hint: string;\n readonly detail: SkinJointCountExceededDetail;\n\n constructor(jointCount: number, max = 256) {\n const expected = `jointCount <= ${max}`;\n const hint = `skin has ${jointCount} joints (max ${max}); reduce joint count in the source glTF asset (OOS-skin-many-joints)`;\n super(`skin joint count ${jointCount} exceeds max ${max}`);\n this.name = 'SkinJointCountExceededError';\n this.expected = expected;\n this.hint = hint;\n this.detail = { jointCount, max };\n }\n}\n\n// ── SkinJointDespawnedError ─────────────────────────────────────────────\n\n/**\n * Detail for `RuntimeErrorCode 'skin-joint-despawned'`.\n *\n * Emitted at extract time when a Skin.joints[i] Entity has been despawned.\n */\nexport interface SkinJointDespawnedDetail {\n readonly meshEntity: number;\n readonly jointIndex: number;\n}\n\n/**\n * Structured error for despawned skin joint Entity.\n *\n * Emitted at extract time; the mesh draw is fully skipped.\n * - `.code = 'skin-joint-despawned'`\n * - `.expected` — all Skin.joints alive\n * - `.hint` — remove the Skin component or re-spawn joints\n * - `.detail = { meshEntity, jointIndex }`\n */\nexport class SkinJointDespawnedError extends Error {\n readonly code = 'skin-joint-despawned' as const;\n readonly expected: string;\n readonly hint: string;\n readonly detail: SkinJointDespawnedDetail;\n\n constructor(meshEntity: number, jointIndex: number) {\n const expected = `Skin.joints[${jointIndex}] references a live entity`;\n const hint = `joint[${jointIndex}] of entity ${meshEntity} has been despawned; remove Skin component or re-spawn the joint entity (OOS-skin-joint-respawn)`;\n super(`skin joint[${jointIndex}] despawned for entity ${meshEntity}`);\n this.name = 'SkinJointDespawnedError';\n this.expected = expected;\n this.hint = hint;\n this.detail = { meshEntity, jointIndex };\n }\n}\n\n// ── SkinJointPathUnresolvedError ────────────────────────────────────────\n\n/**\n * Detail for `RuntimeErrorCode 'skin-joint-path-unresolved'`.\n *\n * Emitted at post-spawn time when a jointPath leaf name cannot be found.\n */\nexport interface SkinJointPathUnresolvedDetail {\n readonly skinEntity: number;\n readonly path: readonly string[];\n readonly failedAtIndex: number;\n}\n\n/**\n * Structured error for unresolved jointPath post-spawn.\n *\n * Emitted by resolveSkinJoints when Name lookup fails.\n * - `.code = 'skin-joint-path-unresolved'`\n * - `.expected` — Name-bearing entity exists for each jointPath leaf\n * - `.hint` — verify glTF node Name preservation in the importer\n * - `.detail = { skinEntity, path, failedAtIndex }`\n */\nexport class SkinJointPathUnresolvedError extends Error {\n readonly code = 'skin-joint-path-unresolved' as const;\n readonly expected: string;\n readonly hint: string;\n readonly detail: SkinJointPathUnresolvedDetail;\n\n constructor(skinEntity: number, path: readonly string[], failedAtIndex: number) {\n const leafName = path[failedAtIndex] ?? '<unknown>';\n const expected = `joint entity with Name=\"${leafName}\" exists in the world`;\n const hint = `joint path \"${path.join('/')}\" for skin entity ${skinEntity} could not be resolved; verify glTF node names are preserved`;\n super(\n `joint path \"${path.join('/')}\" unresolved at index ${failedAtIndex} for entity ${skinEntity}`,\n );\n this.name = 'SkinJointPathUnresolvedError';\n this.expected = expected;\n this.hint = hint;\n this.detail = { skinEntity, path, failedAtIndex };\n }\n}\n\n// ── SkinInstancesCoexistForbiddenError ──────────────────────────────────\n\n/**\n * Detail for `RuntimeErrorCode 'skin-instances-coexist-forbidden'`.\n *\n * Emitted at extract time when Skin + Instances coexist on the same entity.\n */\nexport interface SkinInstancesCoexistForbiddenDetail {\n readonly entity: number;\n}\n\n/**\n * Structured error for Skin + Instances coexistence on same entity.\n *\n * Emitted at extract time; the entity draw is skipped.\n * - `.code = 'skin-instances-coexist-forbidden'`\n * - `.expected` — Skin and Instances on separate entities\n * - `.hint` — split skinned meshes from instanced meshes into separate entities (OOS-skin-instances-coexist)\n * - `.detail = { entity }`\n */\nexport class SkinInstancesCoexistForbiddenError extends Error {\n readonly code = 'skin-instances-coexist-forbidden' as const;\n readonly expected: string;\n readonly hint: string;\n readonly detail: SkinInstancesCoexistForbiddenDetail;\n\n constructor(entity: number) {\n const expected = 'Skin and Instances must not coexist on the same entity';\n const hint = `entity ${entity} has both Skin and Instances; split skinned meshes from instanced meshes into separate entities (OOS-skin-instances-coexist)`;\n super(`Skin + Instances coexistence forbidden on entity ${entity}`);\n this.name = 'SkinInstancesCoexistForbiddenError';\n this.expected = expected;\n this.hint = hint;\n this.detail = { entity };\n }\n}\n\n// ── SkeletonResolveFailedError ─────────────────────────────────────────────\n\n/**\n * Detail for `RuntimeErrorCode 'skeleton-resolve-failed'`.\n *\n * Emitted at extract time when `assets.get<SkeletonAsset>(skin.skeleton)`\n * returns `null` / `undefined`. The skeleton handle is non-zero (the entity\n * declared a Skin) but the asset is not registered (importer drift /\n * AssetRegistry not warmed).\n */\nexport interface SkeletonResolveFailedDetail {\n readonly entity: number;\n readonly skeletonHandle: number;\n}\n\n/**\n * Structured error for unresolved SkeletonAsset handle at extract time\n * (feat-20260612-skin-palette-per-frame-upload M2 / m2-5).\n *\n * Emitted at extract time; the entity draw is skipped (continue), other\n * entities in the same frame keep extracting.\n * - `.code = 'skeleton-resolve-failed'`\n * - `.expected` — Skin.skeleton handle resolves to a registered SkeletonAsset\n * - `.hint` — verify SkeletonAsset is imported into pack-index AND registered\n * via AssetRegistry.register(handle, asset) before extractFrame\n * - `.detail = { entity, skeletonHandle }`\n */\nexport class SkeletonResolveFailedError extends Error {\n readonly code = 'skeleton-resolve-failed' as const;\n readonly expected: string;\n readonly hint: string;\n readonly detail: SkeletonResolveFailedDetail;\n\n constructor(entity: number, skeletonHandle: number) {\n const expected = `Skin.skeleton handle ${skeletonHandle} resolves to a registered SkeletonAsset`;\n const hint = `entity ${entity} Skin.skeleton handle ${skeletonHandle} is not registered; check that the SkeletonAsset went through the gltf importer into pack-index AND that AssetRegistry.register was called for the handle before extractFrame runs`;\n super(`Skin skeleton resolve failed on entity ${entity}: handle ${skeletonHandle}`);\n this.name = 'SkeletonResolveFailedError';\n this.expected = expected;\n this.hint = hint;\n this.detail = { entity, skeletonHandle };\n }\n}\n\n// ── JointCountMismatchError ────────────────────────────────────────────────\n\n/**\n * Detail for `RuntimeErrorCode 'joint-count-mismatch'`.\n *\n * Emitted at extract time when `Skin.joints.length !== SkeletonAsset.jointCount`.\n * `expected` is the SkeletonAsset's jointCount (the source of truth);\n * `actual` is the entity's `Skin.joints.length` (the runtime entity reference\n * list materialized at post-spawn time).\n */\nexport interface JointCountMismatchDetail {\n readonly entity: number;\n readonly expected: number;\n readonly actual: number;\n}\n\n/**\n * Structured error for SkinAsset.joints[] vs SkeletonAsset.jointCount disagreement\n * (feat-20260612-skin-palette-per-frame-upload M2 / m2-5).\n *\n * Emitted at extract time; the entity draw is skipped (continue).\n * - `.code = 'joint-count-mismatch'`\n * - `.expected` — Skin.joints.length === SkeletonAsset.jointCount\n * - `.hint` — verify SkinAsset.joints[] and SkeletonAsset jointPaths[]\n * come from the same glTF skin node\n * - `.detail = { entity, expected, actual }`\n */\nexport class JointCountMismatchError extends Error {\n readonly code = 'joint-count-mismatch' as const;\n readonly expected: string;\n readonly hint: string;\n readonly detail: JointCountMismatchDetail;\n\n constructor(entity: number, expected: number, actual: number) {\n const expectedStr = `Skin.joints.length === SkeletonAsset.jointCount (=${expected})`;\n const hint = `entity ${entity}: Skin.joints.length=${actual} disagrees with SkeletonAsset.jointCount=${expected}; verify SkinAsset.joints[] and SkeletonAsset jointPaths[] come from the same glTF skin node`;\n super(\n `joint count mismatch on entity ${entity}: SkeletonAsset.jointCount=${expected}, Skin.joints.length=${actual}`,\n );\n this.name = 'JointCountMismatchError';\n this.expected = expectedStr;\n this.hint = hint;\n this.detail = { entity, expected, actual };\n }\n}\n\n// ── JointEntityDanglingError ──────────────────────────────────────────────\n\n/**\n * Detail for `RuntimeErrorCode 'joint-entity-dangling'`.\n *\n * Emitted at extract time when `Skin.joints[i]` points at an Entity that has\n * been despawned (or lost its Transform component) so\n * `worldInternal._getArrayView(jointEntity, GlobalTransform, 'world')` returns\n * undefined. `jointIndex` is the position within `Skin.joints[]`.\n */\nexport interface JointEntityDanglingDetail {\n readonly entity: number;\n readonly jointIndex: number;\n}\n\n/**\n * Structured error for despawned (or Transform-less) joint Entity at extract\n * time (feat-20260612-skin-palette-per-frame-upload M2 / m2-5).\n *\n * Distinct from the pre-existing `SkinJointDespawnedError` which fires from\n * advanceAnimationPlayer (animation-stage); this one fires from extractFrame\n * (palette-upload stage) when the per-joint world mat4 view is missing.\n *\n * Emitted at extract time; the entity draw is skipped (continue).\n * - `.code = 'joint-entity-dangling'`\n * - `.expected` — Skin.joints[i] references a live Entity with Transform\n * - `.hint` — sync Skin.joints[] when joint entities are despawned, or\n * re-import the scene through the gltf importer to refresh Entity refs\n * - `.detail = { entity, jointIndex }`\n */\nexport class JointEntityDanglingError extends Error {\n readonly code = 'joint-entity-dangling' as const;\n readonly expected: string;\n readonly hint: string;\n readonly detail: JointEntityDanglingDetail;\n\n constructor(entity: number, jointIndex: number) {\n const expected = `Skin.joints[${jointIndex}] references a live Entity with Transform`;\n const hint = `entity ${entity} Skin.joints[${jointIndex}] points at a despawned (or Transform-less) Entity; sync Skin.joints[] when joint entities are despawned, or re-import the scene through the gltf importer to refresh Entity references`;\n super(`joint entity dangling on entity ${entity} at jointIndex ${jointIndex}`);\n this.name = 'JointEntityDanglingError';\n this.expected = expected;\n this.hint = hint;\n this.detail = { entity, jointIndex };\n }\n}\n\n// -- SkinErrorCode / SkinError closed unions ------------------------------------\n\n/**\n * Closed union of skin-cluster error codes derived from the correlated error\n * union. AI users perform exhaustive `switch (err.code)` without default; TS\n * guards completeness.\n */\nexport type SkinErrorCode = SkinError['code'];\n\n/**\n * Closed union of the skin-cluster structured error classes, each carrying a\n * `SkinErrorCode` discriminant on `.code`.\n */\nexport type SkinError =\n | SkinJointCountExceededError\n | SkinJointDespawnedError\n | SkinJointPathUnresolvedError\n | SkinInstancesCoexistForbiddenError\n | SkeletonResolveFailedError\n | JointCountMismatchError\n | JointEntityDanglingError;\n","// @forgeax/engine-runtime - Skin component (skeleton handle + joint Entity slots).\n//\n// Schema: { skeleton: 'shared<SkeletonAsset>', joints: 'array<entity>' }.\n//\n// `skeleton` carries the immutable SkeletonAsset handle (IBM + jointCount);\n// `joints` carries the live Entity[] resolved at post-spawn time from the\n// SkinAsset.jointPaths via Name-component BFS/DFS lookup. The joint list is\n// consumed by advanceAnimationPlayer (write target) and render-system-extract\n// (CPU palette pre-multiply source).\n//\n// Naming: single-semantic component drops the 'Component' suffix\n// (AGENTS.md §Component naming rule #1). `joints` field takes the holder's\n// perspective (AGENTS.md §Component naming rule #3).\n//\n// Component registered alongside MeshFilter / MeshRenderer / Transform as\n// a sibling on the same entity (AC-13 / AC-37). Skin + Instances coexistence\n// on the same entity is forbidden (M2 fail-fast 'skin-instances-coexist-forbidden').\n//\n// Decision anchors:\n// - requirements AC-13 (Skin sibling to MeshFilter / MeshRenderer)\n// - requirements AC-15 (joint Entity slots, no marker component)\n// - requirements AC-37 (no Component suffix)\n// - plan-strategy D-10 (SkinPaletteSlice naming + Skin x Instances fail-fast)\n// - charter P3 (explicit failure: joint despawn fail-fast)\n// - schema vocab 'shared<SkeletonAsset>' v1 missing item #4 alignment\n//\n// ## Transform contract (post-bug-20260615 fix)\n//\n// **Old (buggy) implicit contract (pre-bug-20260615):** The Skin entity's\n// GlobalTransform.world was double-applied during skinning -- the shader computed\n// `world = meshes[0].worldFromLocal x palette x pos`, so any non-identity\n// Transform on the Skin entity (or its non-joint ancestors) caused doubled\n// motion (translation 2x, rotation 2x). Holders had to manually pin the Skin\n// entity's Transform to identity to avoid doubled motion. This contract was\n// undocumented and easy to violate.\n//\n// **New explicit contract (post-bug-20260615 fix):** An entity carrying `Skin`\n// has its own `Transform` ignored at render time; the world transform is\n// determined entirely by the joints' world matrices fed through the palette:\n//\n// palette[i] = jointWorld_i x IBM_i\n// shader: world = palette[i] x pos\n//\n// No additional left-multiply by `meshes[0].worldFromLocal` or `instanceLocal`.\n// To move the rig, parent the joint root (or any common ancestor of the joints\n// in `Skin.joints[]`) to your driving entity -- moving the Skin entity itself\n// has no rendering effect. This aligns with glTF 2.0 SSkins Implementation\n// Note: \"the transform of the node that the mesh is attached to must be\n// ignored when performing skinning.\"\n//\n// Full pipeline documentation: packages/runtime/README.md\n// SSkinPaletteAllocator.\n//\n// Fix commits:\n// - M0 (red): 15425c2b -- parented skin double-transform unit test\n// - M1 (green): 2ad509b7 -- shader Plan A: drop meshes[0] left-multiply\n// - M2 (cleanup): 4118e463 -- extract.ts joint read -> world.get API\n// - M3 (demo): 94d7db66 -- hello-skin parented Fox under non-identity rig\n// - M4 (baseline): b6ddf46d -- palette-hash counter-proof + submodule pointer\n\nimport { defineComponent } from '@forgeax/engine-ecs';\n\nexport const Skin = defineComponent('Skin', {\n // The renderer owns the live skeleton asset/palette binding; joint entity\n // relationships remain the portable simulation-side pose contract.\n skeleton: { type: 'shared<SkeletonAsset>' },\n joints: { type: 'array<entity>' },\n});\n","import type { Component, World } from '@forgeax/engine-ecs';\nimport type { Plugin } from '@forgeax/engine-plugin';\nimport { Skin } from './skin';\n\nconst SKINNING_COMPONENTS: readonly Component[] = [Skin];\n\nfunction registerSkinningComponents(world: World): () => void {\n const leases = SKINNING_COMPONENTS.map((component) =>\n world.components.register(component).unwrap(),\n );\n return () => {\n for (let index = leases.length - 1; index >= 0; index -= 1) leases[index]?.dispose();\n };\n}\n\n/** Install skeletal binding components in a World that consumes skinned scenes. */\nexport function skinningPlugin(): Plugin {\n return {\n name: 'skinning',\n inject: ['world'],\n apply(ctx) {\n ctx.effect(() => registerSkinningComponents(ctx.world), 'skinning/components');\n },\n };\n}\n","import type { EntityHandle } from '@forgeax/engine-ecs';\nimport { type SkinError, SkinJointPathUnresolvedError } from './errors.js';\n\nexport function resolveSkinJoints(\n jointPaths: readonly string[],\n names: ReadonlyMap<string, EntityHandle>,\n skinEntity: EntityHandle,\n): { ok: true; value: Uint32Array } | { ok: false; error: SkinError } {\n const joints: number[] = [];\n for (const path of jointPaths) {\n const segments = path.split('/').filter(Boolean);\n if (segments.length === 0) continue;\n const failedAtIndex = segments.length - 1;\n const entity = names.get(segments[failedAtIndex] ?? '');\n if (entity === undefined) {\n return {\n ok: false,\n error: new SkinJointPathUnresolvedError(skinEntity as number, segments, failedAtIndex),\n };\n }\n joints.push(entity as number);\n }\n return { ok: true, value: new Uint32Array(joints) };\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forgeax/engine-skinning",
3
- "version": "0.1.21",
3
+ "version": "0.1.24",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -22,9 +22,9 @@
22
22
  "LICENSE"
23
23
  ],
24
24
  "dependencies": {
25
- "@forgeax/engine-ecs": "0.1.21",
26
- "@forgeax/engine-plugin": "0.1.21",
27
- "@forgeax/engine-types": "0.1.21"
25
+ "@forgeax/engine-ecs": "0.1.24",
26
+ "@forgeax/engine-plugin": "0.1.24",
27
+ "@forgeax/engine-types": "0.1.24"
28
28
  },
29
29
  "forgeax": {
30
30
  "metrics": {
package/src/errors.ts CHANGED
@@ -26,7 +26,7 @@
26
26
  * |:--|:--|:--|
27
27
  * | `'skeleton-resolve-failed'` | `SkeletonResolveFailedError` | `assets.get<SkeletonAsset>(skin.skeleton)` returns null/undefined |
28
28
  * | `'joint-count-mismatch'` | `JointCountMismatchError` | `Skin.joints.length !== SkeletonAsset.jointCount` |
29
- * | `'joint-entity-dangling'` | `JointEntityDanglingError` | `Skin.joints[i]` Entity is despawned (Transform.world view undefined) |
29
+ * | `'joint-entity-dangling'` | `JointEntityDanglingError` | `Skin.joints[i]` Entity is despawned (GlobalTransform.world view undefined) |
30
30
  *
31
31
  * AI users discriminate via `switch (err.code)` over `RuntimeErrorCode`;
32
32
  * each member narrows to its `*Error` class with structured `.detail`.
@@ -293,7 +293,7 @@ export class JointCountMismatchError extends Error {
293
293
  *
294
294
  * Emitted at extract time when `Skin.joints[i]` points at an Entity that has
295
295
  * been despawned (or lost its Transform component) so
296
- * `worldInternal._getArrayView(jointEntity, Transform, 'world')` returns
296
+ * `worldInternal._getArrayView(jointEntity, GlobalTransform, 'world')` returns
297
297
  * undefined. `jointIndex` is the position within `Skin.joints[]`.
298
298
  */
299
299
  export interface JointEntityDanglingDetail {
package/src/skin.ts CHANGED
@@ -27,7 +27,7 @@
27
27
  // ## Transform contract (post-bug-20260615 fix)
28
28
  //
29
29
  // **Old (buggy) implicit contract (pre-bug-20260615):** The Skin entity's
30
- // Transform.world was double-applied during skinning -- the shader computed
30
+ // GlobalTransform.world was double-applied during skinning -- the shader computed
31
31
  // `world = meshes[0].worldFromLocal x palette x pos`, so any non-identity
32
32
  // Transform on the Skin entity (or its non-joint ancestors) caused doubled
33
33
  // motion (translation 2x, rotation 2x). Holders had to manually pin the Skin
package/dist/.tsbuildinfo DELETED
@@ -1 +0,0 @@
1
- {"fileNames":["../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../src/errors.ts","../../types/dist/animation-target.d.ts","../../types/dist/asset-errors.d.ts","../../types/dist/result.d.ts","../../types/dist/asset-evidence.d.ts","../../types/dist/asset.d.ts","../../types/dist/material/color-space.d.ts","../../types/dist/material/asset.d.ts","../../types/dist/vfx.d.ts","../../types/dist/asset-runtime.d.ts","../../types/dist/handle.d.ts","../../types/dist/material/errors.d.ts","../../types/dist/material/resolve.d.ts","../../types/dist/material/index.d.ts","../../types/dist/asset-producer.d.ts","../../types/dist/catalog.d.ts","../../types/dist/runtime-scope.d.ts","../../types/dist/texture/asset.d.ts","../../types/dist/texture/errors.d.ts","../../types/dist/texture/layout.d.ts","../../types/dist/texture/index.d.ts","../../types/dist/derive-paramschema.d.ts","../../types/dist/import.d.ts","../../types/dist/index.d.ts","../src/assets/skin-decoder.ts","../../ecs/dist/entity-handle.d.ts","../../ecs/dist/storage/column.d.ts","../../ecs/dist/component-schema.d.ts","../../ecs/dist/component.d.ts","../../ecs/dist/entity.d.ts","../../ecs/dist/errors/query-and-component-errors.d.ts","../../ecs/dist/errors/relationship-errors.d.ts","../../ecs/dist/errors/sprite-and-shared-errors.d.ts","../../ecs/dist/errors/validation-errors.d.ts","../../ecs/dist/world-internal.d.ts","../../ecs/dist/query/query.d.ts","../../ecs/dist/relationship-index.d.ts","../../ecs/dist/shared-ref-store.d.ts","../../ecs/dist/world-change-journal.d.ts","../../ecs/dist/storage/table.d.ts","../../ecs/dist/storage/archetype.d.ts","../../ecs/dist/storage/archetype-graph.d.ts","../../ecs/dist/storage/change-detection.d.ts","../../ecs/dist/time.d.ts","../../ecs/dist/schedule-token.d.ts","../../ecs/dist/world.d.ts","../../ecs/dist/commands.d.ts","../../ecs/dist/schedule.d.ts","../../ecs/dist/execution/shared-kernel.d.ts","../../ecs/dist/errors.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cosmokit@1.8.2/node_modules/@deepseek-ai/cosmokit/lib/types/array.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cosmokit@1.8.2/node_modules/@deepseek-ai/cosmokit/lib/types/types.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cosmokit@1.8.2/node_modules/@deepseek-ai/cosmokit/lib/types/misc.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cosmokit@1.8.2/node_modules/@deepseek-ai/cosmokit/lib/types/string.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cosmokit@1.8.2/node_modules/@deepseek-ai/cosmokit/lib/types/time.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cosmokit@1.8.2/node_modules/@deepseek-ai/cosmokit/lib/types/index.d.ts","../../../node_modules/.pnpm/@standard-schema+spec@1.1.0/node_modules/@standard-schema/spec/dist/index.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/utils.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/registry.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/reflect.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/fiber.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/events.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/logger.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/context.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/service.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/index.d.ts","../../tool-runtime/dist/types.d.ts","../../tool-runtime/dist/errors.d.ts","../../tool-runtime/dist/artifacts.d.ts","../../tool-runtime/dist/capability.d.ts","../../tool-runtime/dist/carrier.d.ts","../../tool-runtime/dist/lease.d.ts","../../tool-runtime/dist/migration.d.ts","../../tool-runtime/dist/runtime.d.ts","../../tool-runtime/dist/snapshot.d.ts","../../tool-runtime/dist/timing.d.ts","../../tool-runtime/dist/transport.d.ts","../../tool-runtime/dist/index.d.ts","../../plugin/dist/capability.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis-plugin-loader@1.0.2_patch_hash=6e77a3b82171afbdac249c0e31290cc06386_1a14a168fdebad14b739afc92f305e1c/node_modules/@deepseek-ai/cordis-plugin-loader/lib/types/internal.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis-plugin-loader@1.0.2_patch_hash=6e77a3b82171afbdac249c0e31290cc06386_1a14a168fdebad14b739afc92f305e1c/node_modules/@deepseek-ai/cordis-plugin-loader/lib/types/config/tree.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis-plugin-loader@1.0.2_patch_hash=6e77a3b82171afbdac249c0e31290cc06386_1a14a168fdebad14b739afc92f305e1c/node_modules/@deepseek-ai/cordis-plugin-loader/lib/types/config/group.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis-plugin-loader@1.0.2_patch_hash=6e77a3b82171afbdac249c0e31290cc06386_1a14a168fdebad14b739afc92f305e1c/node_modules/@deepseek-ai/cordis-plugin-loader/lib/types/config/entry.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis-plugin-loader@1.0.2_patch_hash=6e77a3b82171afbdac249c0e31290cc06386_1a14a168fdebad14b739afc92f305e1c/node_modules/@deepseek-ai/cordis-plugin-loader/lib/types/config/isolate.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis-plugin-loader@1.0.2_patch_hash=6e77a3b82171afbdac249c0e31290cc06386_1a14a168fdebad14b739afc92f305e1c/node_modules/@deepseek-ai/cordis-plugin-loader/lib/types/config/utils.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis-plugin-loader@1.0.2_patch_hash=6e77a3b82171afbdac249c0e31290cc06386_1a14a168fdebad14b739afc92f305e1c/node_modules/@deepseek-ai/cordis-plugin-loader/lib/types/index.d.ts","../../plugin/dist/tool-plugin.d.ts","../../plugin/dist/loader.d.ts","../../plugin/dist/index.d.ts","../../ecs/dist/plugin-service.d.ts","../../ecs/dist/index.d.ts","../src/skin.ts","../src/plugin.ts","../src/resolve-skin-joints.ts","../src/index.ts","../../../node_modules/.pnpm/@vitest+pretty-format@4.1.11/node_modules/@vitest/pretty-format/dist/index.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.11/node_modules/@vitest/utils/dist/display.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.11/node_modules/@vitest/utils/dist/types.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.11/node_modules/@vitest/utils/dist/helpers.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.11/node_modules/@vitest/utils/dist/timers.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.11/node_modules/@vitest/utils/dist/index.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.11/node_modules/@vitest/utils/dist/types.d-BCElaP-c.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.11/node_modules/@vitest/utils/dist/diff.d.ts","../../../node_modules/.pnpm/@vitest+runner@4.1.11/node_modules/@vitest/runner/dist/tasks.d-DEYaIMIu.d.ts","../../../node_modules/.pnpm/@vitest+runner@4.1.11/node_modules/@vitest/runner/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.1.11_@types+node@20.19.40_@vitest+browser-playwright@4.1.11_@vitest+coverage-v_127da6c4db5f633b4e0a459eab2c3062/node_modules/vitest/dist/chunks/traces.d.D2T_R8rx.d.ts","../../../node_modules/.pnpm/vite@8.0.10_@types+node@20.19.40_esbuild@0.27.7_jiti@1.21.7/node_modules/vite/types/hmrPayload.d.ts","../../../node_modules/.pnpm/vite@8.0.10_@types+node@20.19.40_esbuild@0.27.7_jiti@1.21.7/node_modules/vite/dist/node/chunks/moduleRunnerTransport.d.ts","../../../node_modules/.pnpm/vite@8.0.10_@types+node@20.19.40_esbuild@0.27.7_jiti@1.21.7/node_modules/vite/types/customEvent.d.ts","../../../node_modules/.pnpm/vite@8.0.10_@types+node@20.19.40_esbuild@0.27.7_jiti@1.21.7/node_modules/vite/types/hot.d.ts","../../../node_modules/.pnpm/vite@8.0.10_@types+node@20.19.40_esbuild@0.27.7_jiti@1.21.7/node_modules/vite/dist/node/module-runner.d.ts","../../../node_modules/.pnpm/@vitest+snapshot@4.1.11/node_modules/@vitest/snapshot/dist/environment.d-DOJxxZV9.d.ts","../../../node_modules/.pnpm/@vitest+snapshot@4.1.11/node_modules/@vitest/snapshot/dist/rawSnapshot.d-D_X3-62x.d.ts","../../../node_modules/.pnpm/@vitest+snapshot@4.1.11/node_modules/@vitest/snapshot/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.1.11_@types+node@20.19.40_@vitest+browser-playwright@4.1.11_@vitest+coverage-v_127da6c4db5f633b4e0a459eab2c3062/node_modules/vitest/dist/chunks/config.d.A1h_Y6Jt.d.ts","../../../node_modules/.pnpm/vitest@4.1.11_@types+node@20.19.40_@vitest+browser-playwright@4.1.11_@vitest+coverage-v_127da6c4db5f633b4e0a459eab2c3062/node_modules/vitest/dist/chunks/environment.d.CrsxCzP1.d.ts","../../../node_modules/.pnpm/vitest@4.1.11_@types+node@20.19.40_@vitest+browser-playwright@4.1.11_@vitest+coverage-v_127da6c4db5f633b4e0a459eab2c3062/node_modules/vitest/dist/chunks/rpc.d.B_8sPU0w.d.ts","../../../node_modules/.pnpm/vitest@4.1.11_@types+node@20.19.40_@vitest+browser-playwright@4.1.11_@vitest+coverage-v_127da6c4db5f633b4e0a459eab2c3062/node_modules/vitest/dist/chunks/worker.d.ZpHpO4yb.d.ts","../../../node_modules/.pnpm/vitest@4.1.11_@types+node@20.19.40_@vitest+browser-playwright@4.1.11_@vitest+coverage-v_127da6c4db5f633b4e0a459eab2c3062/node_modules/vitest/dist/chunks/browser.d.BcoexmFG.d.ts","../../../node_modules/.pnpm/@vitest+spy@4.1.11/node_modules/@vitest/spy/optional-types.d.ts","../../../node_modules/.pnpm/@vitest+spy@4.1.11/node_modules/@vitest/spy/dist/index.d.ts","../../../node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.d.ts","../../../node_modules/.pnpm/@types+deep-eql@4.0.2/node_modules/@types/deep-eql/index.d.ts","../../../node_modules/.pnpm/assertion-error@2.0.1/node_modules/assertion-error/index.d.ts","../../../node_modules/.pnpm/@types+chai@5.2.3/node_modules/@types/chai/index.d.ts","../../../node_modules/.pnpm/@vitest+expect@4.1.11/node_modules/@vitest/expect/dist/index.d.ts","../../../node_modules/.pnpm/@vitest+runner@4.1.11/node_modules/@vitest/runner/dist/utils.d.ts","../../../node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.1.11_@types+node@20.19.40_@vitest+browser-playwright@4.1.11_@vitest+coverage-v_127da6c4db5f633b4e0a459eab2c3062/node_modules/vitest/dist/chunks/benchmark.d.DAaHLpsq.d.ts","../../../node_modules/.pnpm/vitest@4.1.11_@types+node@20.19.40_@vitest+browser-playwright@4.1.11_@vitest+coverage-v_127da6c4db5f633b4e0a459eab2c3062/node_modules/vitest/dist/chunks/global.d.DVsSRdQ5.d.ts","../../../node_modules/.pnpm/vitest@4.1.11_@types+node@20.19.40_@vitest+browser-playwright@4.1.11_@vitest+coverage-v_127da6c4db5f633b4e0a459eab2c3062/node_modules/vitest/optional-runtime-types.d.ts","../../../node_modules/.pnpm/@vitest+mocker@4.1.11_vite@8.0.10_@types+node@20.19.40_esbuild@0.27.7_jiti@1.21.7_/node_modules/@vitest/mocker/dist/types.d-BjI5eAwu.d.ts","../../../node_modules/.pnpm/@vitest+mocker@4.1.11_vite@8.0.10_@types+node@20.19.40_esbuild@0.27.7_jiti@1.21.7_/node_modules/@vitest/mocker/dist/index.d-B41z0AuW.d.ts","../../../node_modules/.pnpm/@vitest+mocker@4.1.11_vite@8.0.10_@types+node@20.19.40_esbuild@0.27.7_jiti@1.21.7_/node_modules/@vitest/mocker/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.1.11_@types+node@20.19.40_@vitest+browser-playwright@4.1.11_@vitest+coverage-v_127da6c4db5f633b4e0a459eab2c3062/node_modules/vitest/dist/chunks/suite.d.udJtyAgw.d.ts","../../../node_modules/.pnpm/vitest@4.1.11_@types+node@20.19.40_@vitest+browser-playwright@4.1.11_@vitest+coverage-v_127da6c4db5f633b4e0a459eab2c3062/node_modules/vitest/dist/chunks/evaluatedModules.d.BxJ5omdx.d.ts","../../../node_modules/.pnpm/vitest@4.1.11_@types+node@20.19.40_@vitest+browser-playwright@4.1.11_@vitest+coverage-v_127da6c4db5f633b4e0a459eab2c3062/node_modules/vitest/dist/runners.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.1.11_@types+node@20.19.40_@vitest+browser-playwright@4.1.11_@vitest+coverage-v_127da6c4db5f633b4e0a459eab2c3062/node_modules/vitest/dist/index.d.ts","../src/__tests__/binding.unit.test.ts","../src/__tests__/errors.unit.test.ts","../src/__tests__/plugin.integration.test.ts","../src/__tests__/skin-error-code-owner.test-d.ts"],"fileIdsList":[[125,140,141,145,148],[125,140,142,143,145,148],[115,125,142,143,145,148],[115,125,141,142,143,145,148],[115,125,139,140,141,142,143,144,145,148],[115],[115,117,118,119,120,121,122],[115,118,119,120,121,122,123],[115,116,117,118,119,120,121,122,123],[117,118,119,120,121,122,123,124],[117,118,119,120,121,122,123],[125,145,148],[110,111,112,113,114],[182,183],[116,156,162,180,181,184],[191],[191,192],[160,162,163],[160,162],[160],[155,160,171,172],[155,160,171],[179],[155,161],[155],[157],[155,156,157,158,159],[197,198],[197,198,199,200],[197,199],[197],[166],[166,167,168,169],[168],[164,186,187,189],[164,165,177,189],[155,162,164,165,173,189],[170],[155,164,165,173,185,188,189],[164,165,170,173,189],[164,186,187,188,189],[164,170,174,175,176,189],[155,160,162,164,165,170,173,174,175,176,177,178,180,185,186,187,188,189,190,193,194,195,196,201],[155,162,164,165,173,174,186,187,188,189,194],[83,85,88,94,105,109],[88],[83,85,86,87],[90,91,92,93,108],[95,104,107],[85,87,88,89,95,96,97,103,104,105,106,107,109,149],[105,148,149],[83,85,88,94,109],[85,88],[83,88,95,104,105,106,109],[83,109],[88,99,100,102],[88,99],[85,88,98,99,101],[85,86,88,102],[85],[83,85,88,94,95,96,97,102,103,104,107,108,109],[125,137,145,148],[125,138,145,146,147,148],[125,137,138,145,146,148],[88,154,202],[154,202],[150,154,202],[60,154],[83],[60,84,151,152,153],[148,149,150,151],[60,150],[150],[126,127],[126],[126,127,128,129,130,131,132,133,134,135,136],[126,130],[62,63,65],[62,63,65,83],[64],[63,65,74],[62,74,75,76,83],[61,62,63,65,67,68,69,70,73,74,75,76,77,80,81,82],[66,83],[67],[66,67,71,72],[63,67,71],[74,75],[63,77],[77,78,79],[63,77,78]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"d6b1eba8496bdd0eed6fc8a685768fe01b2da4a0388b5fe7df558290bffcf32f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"d424fad811a03b336ef52f89aaa1ac3c84c7ad17501a488c05726eb164d36dcc","signature":"eb7fa7f10c8fa3046a70afcc62e60463ad5bcbbad51a34038aaf52e203272f57"},"89fe170d9a59f81cd9a9d95de3278f108ff91491810b2529cc0ffb502a57b6c0","0b4928041c807c01b33b1fa028236df635c52f7acff5a40f2c2d0d677b53428b","5ad2e5b8b17893d0eb1f11a1b6e8c03b17344be03a6a72a624cd38ab05fe4d5c","6a1e553079e654a1771463e9eeb98ea4f7bb4b6417a5237d4fdf9b546d49647f","7f11be86b9ac5c2cd5127cd9d40ccc7694c58868a3157692a153d452fc171525","6e3488ee1183ea915eb43f08aebc5f75e30be25aef1f678d1965324bdd7506e1","08b2edc86cfd71fe5a832912df79e79040c90c9df60ed2af1dc50f7baef36aeb","a318d8734523d9e750681e7b8e685ef817d4049c5612451f4e849da8b2b572a9","8b52dd8be86f44f871db89a6c1f77f7585688d53141ff55b6c5fac3eb67b1241","beae2d03867dde9fdf8da461c7e7e84da71612842422d4b482ab1c2a15fe6b12","2aa457dd6699d3015c3c98457ac72a2dd47349f75a1edddbace0ee86dd7177c9","51342c51a9090c0bc8bae60c5ec1a0f46d6d44db84392f12a8cd46e6d8a9f617","ae777307a0baeb9b5d7ba18e6a029a54eb0b612b1491591dcedb020cc8d36f97","d7ba738e316b7baed10ca49cc156b57b8c973b747bec6612e62a925e9f7f33a4","1d5292578fcf0329a43ef19fe2481d7d1cde75e75610019a7897c70dcfff0b31","459b3765e622008ed590474ae6b61ab55107a7b9529a28d05087a6fef51d7248","d4acac107ca8b949e32947d9b5afa27721584f4ffd7ad7a4008fae892a4ec913","b52569fa5c5793a182d033b2fc7443e27205625dc67782a03d2e2e972a2918f3","097ebdc98e0de1205b1104df5038026ca5830b80faee3707b78e7c28ce6dde55","1ae177260d032e05e62f0432227af19a857b327fa604a9b34baa535f44db130e","e1f11ad703121f97a74001059d054aba25c9c4662af44da05ead0a247fe18742","d9c64d02dfe3a9c74da35fdbcc645cf4e8d4ca0f4162ec312de51474103ac3a7","ef30959e03d8e4ede695c8b400a9b9004a49ed6448214f087271d4f1e56352ba",{"version":"4d107b8278e99ee19877a8bfa8067237d090a2f0e2ae6dd351e8a66e84832739","signature":"a77a5c5b7f9fd417a272a2f0605235f3287e70814687021ecfd0a3021be9afc1"},"b866405af1564f0690ea323f070c87509bfeb2ba8afa7c49c255dbe13c176bf8","ce648e4449eb59292b997226148647ce9ca22bc9ff9062959f5f1fe6bfe06cd8","ce3d7045ddbf0f8c968829a4e32d5064af66cba795f8c8490afec9eb677a4f45","6192bdb56ca09fde8176590331c36f3eec2fd5fb3ad7dd7401727efb2398d7fb","0810b73622b33b91f89f5d0f8b1fc0b92841e6b751a84d2c005508c563748d16","9a1b69540b9533e337c81d470724ebb054a15b994a11b759a969367b28e81368","854cbb22c44beb0fe44a46f5428521a27e8b9fb645e6ce803a5622ff44ec74ce","dd6776bc5480997847e4d3c495951de5f0401667e1880b6176f57584c49aa401","21f4110077118497558bb4ca8462c9cd1dfd391e6c1608bcac4b437a4ed77d7d","2278fcff8ca72dc791b3907ac363bd7370ec04e38653827c14c5dbd3fc99e335","ee7cd212dd2cfef9efd135a36a577fa35cb4af99f7e6fd3023cc9d2f7c6f438b","0bc016e4da8853d924fbfde9820db77121de75539641d02012232396b09e7dd6","6647e4b21b341f971ef92cbdbeaee6a42d77b291a43cdc73b970b2ad505bb912","2f9485d1b731e3d1d373c2a2a20e3ad41b55616b9fa13bf261d2a058cd23149b","d9df407e562a322f63c0cc3f1bcea9c1cbec38d0c92b3f49169291f22374cb6c","ba9d80c5b60b7708524491768da7d44a796042529ed945678f45356beb2504f9","7689fbecdcdb8f32296c94fe5cf5edef16a9db673d696a2aaa40ad54470e5965","2c2b0520a51bf2f420ec605fa5e327ea7d96732cc97a373c167e12ad71dda21f","5f15c8ce469d7e9da71f9ca502370c454eb29629d6c2e548fa722d00700dfb46","ce5251c882968a3ce8fc6c2e3b2c3b739a740f614eebf066b73e8ee7c5dc4f63","33652e868da0fef68b0f8622283a014fe66a21e409f4000e77778d9dc3edc8af","8f373e06438a141f82616c5e0b171e0bf613cc95aa1e6b8b41a8ae520dd2948e","5c9cf44d7fea3b0c9876102abc143967f2e7015dd0a89edcbe28a49906621206","6db8a395b3c5f988123adb6cc84b6410a82a060c4acde2491012b9b44b32b300","28d3e288a396ce5654f673fc8bc2330edb14e52dd33d75a3e999ecf68197de1a",{"version":"fb6f2007d60e8b519a2ef0c5a27026ddfe06418ae6261c4eb0cb670cca5e1bc2","impliedFormat":99},{"version":"a48f1b69ec0b94b16c7ece2cf6d6003cc8d0c329538117c1c364d8525a100850","impliedFormat":99},{"version":"cd5713ac354e4869fdf837e12d24d3ae14fd9d94a5bb2d340df63b899b74e6ca","impliedFormat":99},{"version":"56210599298d6eca6285eab99c7e9333d7e275c3a73a7f401b3055e8d55c67e8","impliedFormat":99},{"version":"2845576622e416da9871e1f3c788ba41dc4f24eb764362b10eceeb0dbaa67208","impliedFormat":99},{"version":"f0421e04e2a5238754cf444bf2a56fe7e7a94a08c14c1f9d063ff51c85825823","impliedFormat":99},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"967b227fad024ba8a7c32127534089bce5adc800840b0288f44d41c4c849278e","impliedFormat":99},{"version":"ffd229492af3cb444c01e8e51a78dfdbed670940bac40dde083675d57d6984fc","impliedFormat":99},{"version":"57cdef8252cb041b4b646cc9e80dcb27d2180bb78fcf95761136d99be4079cb3","impliedFormat":99},{"version":"eb5fd8d19b0330da4dccb6cab3eae0304f056ac8fbd5bd9589ce48f0920bff78","impliedFormat":99},{"version":"db565a086622cbe616a950186dc90e82a74060864b9cd1d0f25285860daea9b4","impliedFormat":99},{"version":"71087395cc862f52662ab2629a0f3838f8f2aaf84eb40c97f4f4004f2fcbbed6","impliedFormat":99},{"version":"1e2e6cfcab26ae01d7f2dd1f78a1d25ddb7f3b2e27f50c9eb3b54ee206a87884","impliedFormat":99},{"version":"489ec23ef8dc0e869cf3d8d77a39ba83ab24e5e71362320f5662491b3dc5bd04","impliedFormat":99},{"version":"c93dd79fae382105510c69cc8eef95a96c8c43e50b47e16efa98a3f9e76f304b","impliedFormat":99},"4a5b020726455dd70acdf34ccc435273e6333cbb1a3ff08b6c451148c61b21fd","eb4d76417ff2ac49726b2efaf83e5b9924f7040151293d092e1ba38905479a02","3bae912eb95706a507e668cdfe378bb612c81b46323aae337689fabc00c3ae29","129aaa58f8b8ed74d8ef3ab03d3219f1b5a7b2902c4e111e080abdaf043686ef","c0a9cb9a3fe662b66cf598c1e2e6bc799b423699b81249bb62586acbc817b1e7","7d3bbcb2ef65e80202188d77d2e06f30c5d5d2603ca49cde35a6b298565247e9","f90ae41777b29281dcd4aa3fafb9d84c6b328860d639114a8c3fcf36beb23817","eadfe727983087acea4f17095671faba65ba5233acaed7213f140269d4528c9a","6bbe3b367d76debfa83ec26a13d0013f8dad891cddd8909a1fbdcdb719b064d9","9fec96292881b3ee00f9b34d757887223221db25d0fb534b521743e9be298d9f","fbd59a37ab9b1a3a21f2e968b539f91453e560507d9e92748f0623f7118306be","92523b7353d096bd2464e1611035b284803894aa952541021922567dfe9f15aa","49ca23a8e2de57d49da1b5b5aa2f0e0d341b4230a899efe1a6078d3779e2ea53",{"version":"be53d0833468d1d4de05770f4af2d3ec465b7ef5d5181b748997a02bf362ebd0","impliedFormat":99},{"version":"4920f950330f6a8a00a084beb7998de838a15cd54f5c774962b75614c15f8bed","impliedFormat":99},{"version":"e892ea4cf5fc5e5ab078f265c617efa3ab44a1cbd477f91fd29a27698c45eb77","impliedFormat":99},{"version":"6a33bd0416049803becacbdccd852c02f342eedce7dea12956d1176966269eeb","impliedFormat":99},{"version":"f74c6749e3944913d8002c1dd30523c520de426e9113d47b6730565318349154","impliedFormat":99},{"version":"ac5d5fd3358d3f7491400869278ea288df297b4fbc1ba035c7fd09c8df822358","impliedFormat":99},{"version":"0ce13f49afeb385ad05698a5420580c7381d758779b730c1992be7386578e1e7","impliedFormat":99},"8fa74a106f75c2eed4b65fa571e4e9b78e9a3a68f65b6c70261e87f7f47b931d","d82719b8e8a552f66dea370df85e00f9473537bb9c35dcb711d7f48cb5e707cd","a3c435d1e1eb110bb7382103c522bf44e9abb8b6883a493360fc5859db0aee10","1487f3b04d5e9ed9c5d823ff91bedbd7a8ce7a4c44b7ef16fa64a2d930a731e9","18dfdac2f4092e68e453e7a9da3d0e800e597e82fa567c49c2c7bb4c4dfb26ff",{"version":"6e9882237bd8b36b3b5945abc51708f6ec74043f031741e37ded13f0bd4dcd0f","signature":"efb766d40ef9f7c96a371f74bb144217f7698764ab830ff9b471dad660bcedb4"},{"version":"8eb7494dfd3f9546d5893b2259d8dd3322aac7680b0b096e6e04af197a417d84","signature":"ea706983d85b650deb29fe6569b165046a5393b169dd69df930dcc8009b0e807"},{"version":"30ca892b49280106cf82a433e1f6bbd43a67bd453a97496297a663f18c11b12c","signature":"0e1214488a400d3ae4d3a480073a97659096c5824c42041e3d0f147995d2416e"},{"version":"0f0c78daf0799d99aa0ff4474c2b6ff5fae78c283e094a3199bc9f4dfcb2db41","signature":"eccb7546195f806e03a134cb3ba47f6fc806158954b472228598486ed1b025e6"},{"version":"3a582c6e8906f5b094ccf0de6cc6f4f8a54b05a34f52517aba5c9c7f704f6b28","impliedFormat":99},{"version":"0528f6d21f7a02d4092895090d2dd86104bd5a3e79eced96d5a1a7dd90943d17","impliedFormat":99},{"version":"b5ce343886d23392be9c8280e9f24a87f1d7d3667f6672c2fe4aa61fa4ece7d4","impliedFormat":99},{"version":"72ce5b734c05da85c85a6f6dc05823b051d6aa41acaedeeb1d17c72f3b4efa72","impliedFormat":99},{"version":"b0857bb28fd5236ace84280f79a25093f919fd0eff13e47cc26ea03de60a7294","impliedFormat":99},{"version":"5e43e0824f10cd8c48e7a8c5c673638488925a12c31f0f9e0957965c290eb14c","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"49ab4f1d153a252779958fc87b700743d32b5ffa42addd70ae23ad3f429daa5c","impliedFormat":99},{"version":"53cf4076f42b29b8d411259d168d51b3a0274c42c8814e5b44dfa8803a35d4fc","impliedFormat":99},{"version":"a39461ee1f27cf3e6cfd63d21045713d26d521da55ea4d8efccb705f689e6dbb","impliedFormat":99},{"version":"61bb64660ee150f3ab618340e15cca0a81664801bede7c966ca0eca3a952fe63","impliedFormat":99},{"version":"3b89216a7e38a454985ad17bb2ff85792837dc812f2a89fa5f60ad0a2e216fa7","impliedFormat":99},{"version":"16fe60bb544cfedfd2b5bb2f7d0b3957be7978706d57d9f06edc9c0c8dbdba23","impliedFormat":99},{"version":"82179358c2d9d7347f1602dc9300039a2250e483137b38ebf31d4d2e5519c181","impliedFormat":99},{"version":"4e003c868b0d8f8ad200b96cbc653e18e513fa23e1c19c4fe3cc25d4394efc47","impliedFormat":99},{"version":"605450898939e8abce51e8085a41b60640278337a969c33cd6b169e7c4f9c3f2","impliedFormat":99},{"version":"42a12f2faa483c9b48195ed794d22698162274e755f6e07219c2351c4f08d732","impliedFormat":99},{"version":"ec0c42bb0f465e4993f2bc68a6ce9df9a2dcbc7b83e21748f82f1b69561938e3","impliedFormat":99},{"version":"f50ff37a9cbbe74475f426474d9827083c7c2c138a954d28f1690df338f69291","impliedFormat":99},{"version":"61fd6c17235d530c40f543dd7c40afab091d91c1ef890baeed30db6d82b04b28","impliedFormat":99},{"version":"bcbd3becd08b4515225880abea0dbfbbf0d1181ce3af8f18f72f61edbe4febfb","impliedFormat":99},{"version":"091767bc841f937654ed597d49e023ed59850355e746ae1a6f20ab31076ee1fb","impliedFormat":99},{"version":"19c6d6135af59693698d384050b45a8a049493500add442f58e4bd7c8a255ab6","impliedFormat":99},{"version":"6a0dba12d55314638a8c51108b20fe2f68f1364a619d098918bda91c22dec154","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"4ead13a482c539b77394b2a97e3b877b809eac596390371cea490286f53b996a","impliedFormat":99},{"version":"06db2f8ba1d1dfacf04529cb731081ab23f133f29c7608ebdfbcab356996827c","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"5c935b7fc4ddc1410ea1cd7cd4e35ed106a6e4920dd27a9480a40fd224359dc3","affectsGlobalScope":true,"impliedFormat":99},{"version":"2b39c6cf59088713babbfc3e20ee85f1375d40e66953156fa658346b8346f24f","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"6987dfb4b0c4e02112cc4e548e7a77b3d9ddfeffa8c8a2db13ceac361a4567d9","impliedFormat":99},{"version":"4ffba3c5848b4fe62ee59b754fd5f256ad9656a0db6d37b9a2a8cb40dfc7ac21","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"5e2ba3d18d78aebbde1f34bde356e41e9c76eeaeaeee56a37036596a9eff4211","impliedFormat":99},{"version":"8280ae8ccc0493b32d1742d585357ab9f0a508ea050af25a5a20d64010d0a5cf","impliedFormat":99},{"version":"7adfd9f9056ecd4ae6c65fde2a98654960c662714c73f048478959d04c09e144","impliedFormat":99},{"version":"32b35cf0dc3a1b1a7118b61c34ce2ad1a29695851679f9ec34e0776f2ece2a69","impliedFormat":99},{"version":"b413fbc6658fe2774f8bf9a15cf4c53e586fc38a2d5256b3b9647da242c14389","impliedFormat":99},{"version":"59e5e964b84fdb2378e9455e4e59405030e4ed2b4c6f891ce395f17796af3cbb","impliedFormat":99},{"version":"c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","impliedFormat":1},{"version":"72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","impliedFormat":1},{"version":"da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","impliedFormat":1},{"version":"64db14db2bf37ac089766fdb3c7e1160fabc10e9929bc2deeede7237e4419fc8","impliedFormat":1},{"version":"98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","impliedFormat":1},{"version":"90ba95a763101bb61b8a799731a2ed60b5016b8135c1a2d5186862d4b534d4a1","impliedFormat":99},{"version":"9c2eb76167deeae6539feb9a4742dafc383429579e166ec14a15a12d9598397b","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"f95cc2db299cf41ab966c3eb08b408359a6abb906deb4a62e34f288bf6812503","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"2c39ad9d57772ab7fd4480a35314ce06ff7ae05b93f6d59f2c51a24d1233b6fb","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"f3799f1837d10ec401a3372dcf913ff1b59eab4e6ae496d08c8f3af1c7fdccc6","signature":"9acb81caf34a2899564d0f644e7e7c3e1d286713ac67d79039a8a6730ddd1ab5"}],"root":[60,84,[151,154],[203,206]],"options":{"composite":true,"declaration":true,"declarationMap":true,"emitDeclarationOnly":true,"exactOptionalPropertyTypes":true,"module":99,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"strict":true,"target":9,"tsBuildInfoFile":"./.tsbuildinfo","useDefineForClassFields":true,"verbatimModuleSyntax":true},"referencedMap":[[142,1],[141,2],[143,3],[140,4],[145,5],[139,6],[123,7],[121,8],[120,9],[125,10],[122,11],[119,8],[118,9],[124,11],[117,12],[115,13],[184,14],[185,15],[192,16],[193,17],[164,18],[163,19],[186,18],[171,20],[173,21],[172,22],[180,23],[162,24],[156,25],[158,26],[160,27],[161,25],[199,28],[201,29],[200,30],[198,31],[167,32],[170,33],[168,32],[169,34],[188,35],[178,36],[174,37],[175,20],[195,38],[189,39],[176,40],[194,41],[177,42],[202,43],[196,44],[106,45],[87,46],[88,47],[89,46],[109,48],[93,46],[108,49],[150,50],[149,51],[95,52],[96,53],[107,54],[97,55],[101,56],[100,57],[102,58],[86,46],[99,59],[98,60],[105,61],[138,62],[148,63],[147,64],[146,62],[203,65],[204,66],[205,67],[206,68],[84,69],[154,70],[152,71],[153,72],[151,73],[128,74],[129,75],[127,75],[137,76],[132,75],[133,75],[134,75],[135,75],[136,77],[64,78],[69,79],[65,80],[75,81],[81,69],[70,69],[82,82],[83,83],[67,84],[66,85],[73,86],[72,87],[76,88],[78,89],[80,90],[79,91]],"latestChangedDtsFile":"./__tests__/skin-error-code-owner.test-d.d.ts","version":"6.0.3"}