@helixdev/helix-manifest 0.2.1-staging.6

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Hypersonic Labs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,48 @@
1
+ # @hypersoniclabs/helix-manifest
2
+
3
+ The HELIX Instant world **manifest schema and validator** — the single source of truth for bundle
4
+ validation, shared by every component that touches a world bundle:
5
+
6
+ - the **backend** (`helix-backend-api` Instant World module) validates manifests at publish and finalize,
7
+ - the **CLI** (`helix-creator-cli`) validates a bundle before upload,
8
+ - the **SDK** (`helix-web-sdk`) consumes the manifest types,
9
+ - and the **MCP** agent tooling validates what it generates.
10
+
11
+ Because all of them import the same `validateManifest` / `validatePackageEnvelope`, the rules can
12
+ never drift between client and server.
13
+
14
+ ## Install
15
+
16
+ ```bash
17
+ npm install @hypersoniclabs/helix-manifest
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ ```ts
23
+ import { validateManifest, BUNDLE_MAX_TOTAL_BYTES, bundleContentType } from '@hypersoniclabs/helix-manifest';
24
+
25
+ const result = validateManifest(JSON.parse(helixJson));
26
+ if (!result.valid) throw new Error(result.errors.join('; '));
27
+ const manifest = result.manifest; // NormalizedHelixManifest — defaults applied
28
+ ```
29
+
30
+ ### Exports
31
+
32
+ - `validateManifest(data)` / `parseManifest(json)` — validate + normalize a world `helix.json` (v0.1).
33
+ - `validatePackageEnvelope(data)` / `parsePackageEnvelope(json)` — validate the `system | ability | asset-pack` envelope (v1, reserved for the ability-packaging milestone).
34
+ - Bundle rules: `BUNDLE_MAX_FILES`, `BUNDLE_MAX_FILE_BYTES`, `BUNDLE_MAX_TOTAL_BYTES`, `BUNDLE_PATH_PATTERN`, `bundleContentType(path)`, `bundleLimitsForKind(kind)`, `classifyBundleFile(kind, path)`, `ASSET_EXTENSIONS`.
35
+ - Vocabulary + federation maps: `BUNDLE_KINDS`, `MAIN_BACKEND_PACKAGE_TYPE`, `MAIN_BACKEND_CONTENT_RATING`, `PERMISSIONS_V01`, `MANIFEST_FILENAME`, `MANIFEST_VERSIONS`.
36
+ - Types: `HelixManifest`, `NormalizedHelixManifest`, `HelixBundleKind`, `HelixContentRating`, `HelixPermission`, `HelixPackageEnvelope`, `NormalizedPackageEnvelope`.
37
+
38
+ ## Develop
39
+
40
+ ```bash
41
+ npm install
42
+ npm test # jest
43
+ npm run build # tsc → dist/
44
+ npm run lint
45
+ ```
46
+
47
+ The JSON schemas live in `schema/` and are bundled into the published package alongside the
48
+ compiled `dist/`.
@@ -0,0 +1,73 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://helix.dev/schemas/manifest-v0.1.schema.json",
4
+ "title": "HELIX Instant World Manifest v0.1",
5
+ "description": "Declares a world's identity, entry point, and the platform capabilities it is allowed to use. Lives at the bundle root as helix.json.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["helixVersion", "title", "slug", "entry"],
9
+ "properties": {
10
+ "helixVersion": {
11
+ "const": "0.1",
12
+ "description": "Manifest schema version. Determines which fields and permissions are available."
13
+ },
14
+ "title": {
15
+ "type": "string",
16
+ "minLength": 1,
17
+ "maxLength": 80,
18
+ "description": "Display name shown on the world page and in listings."
19
+ },
20
+ "slug": {
21
+ "type": "string",
22
+ "pattern": "^[a-z0-9](?:[a-z0-9-]{1,48})[a-z0-9]$",
23
+ "description": "URL identifier (3-50 chars: lowercase letters, digits, hyphens; no leading/trailing hyphen). Globally unique; the world's play URL is /g/{slug}."
24
+ },
25
+ "entry": {
26
+ "type": "string",
27
+ "pattern": "^(?!/)(?!.*\\.\\.)[A-Za-z0-9._/-]+\\.html$",
28
+ "description": "Bundle-relative path to the HTML entry point (e.g. index.html). Must not be absolute or contain '..'."
29
+ },
30
+ "maxPlayers": {
31
+ "type": "integer",
32
+ "minimum": 1,
33
+ "maximum": 100,
34
+ "default": 1,
35
+ "description": "Player slots per room. 1 = single-player. Only meaningful with the multiplayer permission (M2)."
36
+ },
37
+ "permissions": {
38
+ "type": "array",
39
+ "uniqueItems": true,
40
+ "default": [],
41
+ "items": {
42
+ "enum": ["auth.profile"]
43
+ },
44
+ "description": "Platform capabilities the world requests, OAuth-scope style. Worlds get nothing by default. v0.1 defines: auth.profile (read the player's id, username, display name). Later versions add multiplayer, voice.*, wallet.*, inventory.*."
45
+ },
46
+ "supportsMobile": {
47
+ "type": "boolean",
48
+ "default": false,
49
+ "description": "Whether the world is playable on mobile browsers. Surfaces as a compatibility tag."
50
+ },
51
+ "requiresAuth": {
52
+ "type": "boolean",
53
+ "default": false,
54
+ "description": "When true, players must log in before playing — the shell's login overlay offers no guest option, and the world page shows an 'Account required' badge. Leave false (default) for instant guest play."
55
+ },
56
+ "contentRating": {
57
+ "enum": ["unrated", "everyone", "teen", "mature"],
58
+ "default": "unrated",
59
+ "description": "Self-declared content rating. Curated review may override. 'unrated' worlds may be restricted from public listing. Maps 1:1 onto the main backend's ContentRating (Everyone/Teen/Mature); 'unrated' has no counterpart there and must be rated before catalog federation."
60
+ },
61
+ "kind": {
62
+ "enum": ["world"],
63
+ "default": "world",
64
+ "description": "What this bundle is. v0.1 accepts only 'world'; the reserved vocabulary (system, ability, asset-pack) lands with the ability-packaging milestone and maps onto the main backend's PackageType — see MAIN_BACKEND_PACKAGE_TYPE in @hypersoniclabs/helix-manifest. A system is a runtime framework that hosts abilities (the humanoid character is the first); abilities declare the system they target."
65
+ },
66
+ "version": {
67
+ "type": "string",
68
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-[0-9A-Za-z.-]+)?$",
69
+ "default": "1.0.0",
70
+ "description": "Semver identity for catalog federation with the main backend (its packages version by semver). Worlds may ignore it — builds number independently — but every stored manifest carries one so a future sync is a column map, not a translation layer."
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,85 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://helix.dev/schemas/manifest-v0.2.schema.json",
4
+ "title": "HELIX Instant World Manifest v0.2",
5
+ "description": "v0.1 plus pinned system/ability dependencies. A v0.2 world declares the systems and abilities it builds on as slug -> semver-range maps; the consumer build resolves them to exact versions and bakes the resolved CDN URLs into the immutable build. Lives at the bundle root as helix.json.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["helixVersion", "title", "slug", "entry"],
9
+ "properties": {
10
+ "helixVersion": {
11
+ "const": "0.2",
12
+ "description": "Manifest schema version. Determines which fields and permissions are available."
13
+ },
14
+ "title": {
15
+ "type": "string",
16
+ "minLength": 1,
17
+ "maxLength": 80,
18
+ "description": "Display name shown on the world page and in listings."
19
+ },
20
+ "slug": {
21
+ "type": "string",
22
+ "pattern": "^[a-z0-9](?:[a-z0-9-]{1,48})[a-z0-9]$",
23
+ "description": "URL identifier (3-50 chars: lowercase letters, digits, hyphens; no leading/trailing hyphen). Globally unique; the world's play URL is /g/{slug}."
24
+ },
25
+ "entry": {
26
+ "type": "string",
27
+ "pattern": "^(?!/)(?!.*\\.\\.)[A-Za-z0-9._/-]+\\.html$",
28
+ "description": "Bundle-relative path to the HTML entry point (e.g. index.html). Must not be absolute or contain '..'."
29
+ },
30
+ "maxPlayers": {
31
+ "type": "integer",
32
+ "minimum": 1,
33
+ "maximum": 100,
34
+ "default": 1,
35
+ "description": "Player slots per room. 1 = single-player. Only meaningful with the multiplayer permission (M2)."
36
+ },
37
+ "permissions": {
38
+ "type": "array",
39
+ "uniqueItems": true,
40
+ "default": [],
41
+ "items": {
42
+ "enum": ["auth.profile"]
43
+ },
44
+ "description": "Platform capabilities the world requests, OAuth-scope style. Worlds get nothing by default. v0.1 defines: auth.profile (read the player's id, username, display name). Later versions add multiplayer, voice.*, wallet.*, inventory.*."
45
+ },
46
+ "supportsMobile": {
47
+ "type": "boolean",
48
+ "default": false,
49
+ "description": "Whether the world is playable on mobile browsers. Surfaces as a compatibility tag."
50
+ },
51
+ "requiresAuth": {
52
+ "type": "boolean",
53
+ "default": false,
54
+ "description": "When true, players must log in before playing — the shell's login overlay offers no guest option, and the world page shows an 'Account required' badge. Leave false (default) for instant guest play."
55
+ },
56
+ "contentRating": {
57
+ "enum": ["unrated", "everyone", "teen", "mature"],
58
+ "default": "unrated",
59
+ "description": "Self-declared content rating. Curated review may override. 'unrated' worlds may be restricted from public listing. Maps 1:1 onto the main backend's ContentRating (Everyone/Teen/Mature); 'unrated' has no counterpart there and must be rated before catalog federation."
60
+ },
61
+ "kind": {
62
+ "enum": ["world"],
63
+ "default": "world",
64
+ "description": "What this bundle is. v0.2 worlds still set 'world'; the reserved vocabulary (system, ability, asset-pack) uses the package envelope, not this manifest."
65
+ },
66
+ "version": {
67
+ "type": "string",
68
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-[0-9A-Za-z.-]+)?$",
69
+ "default": "1.0.0",
70
+ "description": "Semver identity for catalog federation with the main backend (its packages version by semver). Worlds may ignore it — builds number independently — but every stored manifest carries one so a future sync is a column map, not a translation layer."
71
+ },
72
+ "systems": {
73
+ "type": "object",
74
+ "additionalProperties": { "type": "string", "minLength": 1 },
75
+ "propertyNames": { "pattern": "^[a-z0-9](?:[a-z0-9-]{1,48})[a-z0-9]$" },
76
+ "description": "Pinned system dependencies as slug -> semver range (e.g. { \"humanoid-character\": \"^0.1\" }). Resolved to exact active versions at build; the resolved code + asset-pack CDN bases are baked into the immutable build. The asset-pack is discovered via the system's own envelope, not pinned here."
77
+ },
78
+ "abilities": {
79
+ "type": "object",
80
+ "additionalProperties": { "type": "string", "minLength": 1 },
81
+ "propertyNames": { "pattern": "^[a-z0-9](?:[a-z0-9-]{1,48})[a-z0-9]$" },
82
+ "description": "Pinned ability dependencies as slug -> semver range (e.g. { \"fly\": \"^0.1\", \"swim\": \"^0.1\" }). Resolved to exact active versions at build; each ability's code + asset CDN base are baked into the immutable build."
83
+ }
84
+ }
85
+ }
@@ -0,0 +1,95 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://helix.dev/schemas/package-envelope-v1.schema.json",
4
+ "title": "HELIX Package Envelope v1",
5
+ "description": "Thin platform envelope for non-world bundles (system | ability | asset-pack). Derived by the CLI at publish from the system payload (e.g. ability.json); the platform never learns system concepts. Worlds keep their own helix.json (manifest-v0.1) — this envelope is for the ability-packaging milestone's reserved kinds.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["envelopeVersion", "kind", "slug", "version", "title"],
9
+ "properties": {
10
+ "envelopeVersion": {
11
+ "const": "1",
12
+ "description": "Envelope schema version. Determines which fields are available."
13
+ },
14
+ "kind": {
15
+ "enum": ["system", "ability", "asset-pack"],
16
+ "description": "What this bundle is. A system is a versioned runtime framework that hosts abilities (the humanoid character is the first); an ability declares the system it targets; an asset-pack is CDN-served content (clips/textures/sounds) with no runtime code. Maps onto the main backend's PackageType via MAIN_BACKEND_PACKAGE_TYPE."
17
+ },
18
+ "slug": {
19
+ "type": "string",
20
+ "pattern": "^[a-z0-9](?:[a-z0-9-]{1,48})[a-z0-9]$",
21
+ "description": "Globally unique, stable identifier (3-50 chars: lowercase letters, digits, hyphens; no leading/trailing hyphen). The federation/lookup key — for abilities this is the ability id; for the character system it is 'humanoid-character'."
22
+ },
23
+ "version": {
24
+ "type": "string",
25
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-[0-9A-Za-z.-]+)?$",
26
+ "description": "Semver identity (the resolution key abilities pin with ^/~ ranges). Every published version carries one; the platform also assigns a sequential revision."
27
+ },
28
+ "title": {
29
+ "type": "string",
30
+ "minLength": 1,
31
+ "maxLength": 80,
32
+ "description": "Display name shown in catalog listings."
33
+ },
34
+ "description": {
35
+ "type": "string",
36
+ "maxLength": 2000,
37
+ "default": "",
38
+ "description": "Human/agent-readable summary surfaced in discovery."
39
+ },
40
+ "entry": {
41
+ "type": "string",
42
+ "pattern": "^(?!/)(?!.*\\.\\.)[A-Za-z0-9._/-]+$",
43
+ "description": "Bundle-relative path to the code entry (e.g. index.js). Required for system and ability; omitted for asset-pack (which ships no code). Must not be absolute or contain '..'."
44
+ },
45
+ "system": {
46
+ "type": "object",
47
+ "additionalProperties": false,
48
+ "required": ["id", "version"],
49
+ "properties": {
50
+ "id": {
51
+ "type": "string",
52
+ "description": "Host system id this ability targets (e.g. humanoid-character)."
53
+ },
54
+ "version": {
55
+ "type": "string",
56
+ "description": "Host system semver range (e.g. ^1.0.0)."
57
+ }
58
+ },
59
+ "description": "Abilities only: the host system pin, lifted into indexed catalog columns at finalize (the one payload read the platform performs)."
60
+ },
61
+ "assetPack": {
62
+ "type": "object",
63
+ "additionalProperties": false,
64
+ "required": ["slug", "range"],
65
+ "properties": {
66
+ "slug": {
67
+ "type": "string",
68
+ "pattern": "^[a-z0-9](?:[a-z0-9-]{1,48})[a-z0-9]$",
69
+ "description": "The base asset-pack slug this system's code requires (e.g. humanoid-character-assets)."
70
+ },
71
+ "range": {
72
+ "type": "string",
73
+ "minLength": 1,
74
+ "description": "Semver range for the asset-pack (e.g. ^0.1). The system owns the compat range; the consumer resolves it in-range and bakes the pack's CDN base."
75
+ }
76
+ },
77
+ "description": "Systems only (optional): the base asset-pack this system's runtime needs. The consumer build resolves it and bakes its assetBaseUrl; abilities/asset-packs omit it. A system without it falls back to the <slug>-assets@latest convention."
78
+ },
79
+ "three": {
80
+ "type": "string",
81
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$",
82
+ "description": "Systems only (optional): the full three.js version this system's code was built against (e.g. 0.172.0). `helix install` points the world's import map + KTX2 transcoder path at the platform-hosted runtime/three/<version>/ — the single shared three instance — so the world never bundles its own copy."
83
+ }
84
+ },
85
+ "allOf": [
86
+ {
87
+ "if": { "required": ["kind"], "properties": { "kind": { "const": "ability" } } },
88
+ "then": { "required": ["entry", "system"] }
89
+ },
90
+ {
91
+ "if": { "required": ["kind"], "properties": { "kind": { "const": "system" } } },
92
+ "then": { "required": ["entry"] }
93
+ }
94
+ ]
95
+ }
@@ -0,0 +1,13 @@
1
+ export declare const BUNDLE_MAX_FILES = 200;
2
+ export declare const BUNDLE_MAX_FILE_BYTES: number;
3
+ export declare const BUNDLE_MAX_TOTAL_BYTES: number;
4
+ export declare const BUNDLE_PATH_PATTERN: RegExp;
5
+ export declare function bundleContentType(path: string): string | null;
6
+ export declare const ASSET_EXTENSIONS: Set<string>;
7
+ export declare function bundleLimitsForKind(kind: string): {
8
+ maxFiles: number;
9
+ maxTotalBytes: number;
10
+ };
11
+ export declare function classifyBundleFile(kind: string, path: string): 'code' | 'asset';
12
+ export declare const HELIX_MODULES_DIR = "helix_modules";
13
+ export declare function embeddedModuleAssets(paths: string[]): string[];
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HELIX_MODULES_DIR = exports.ASSET_EXTENSIONS = exports.BUNDLE_PATH_PATTERN = exports.BUNDLE_MAX_TOTAL_BYTES = exports.BUNDLE_MAX_FILE_BYTES = exports.BUNDLE_MAX_FILES = void 0;
4
+ exports.bundleContentType = bundleContentType;
5
+ exports.bundleLimitsForKind = bundleLimitsForKind;
6
+ exports.classifyBundleFile = classifyBundleFile;
7
+ exports.embeddedModuleAssets = embeddedModuleAssets;
8
+ // Bundle constraints for manifest v0.1 publishes. Deliberately conservative —
9
+ // raising a cap is painless, lowering one breaks creators.
10
+ exports.BUNDLE_MAX_FILES = 200;
11
+ exports.BUNDLE_MAX_FILE_BYTES = 25 * 1024 * 1024;
12
+ exports.BUNDLE_MAX_TOTAL_BYTES = 50 * 1024 * 1024;
13
+ exports.BUNDLE_PATH_PATTERN = /^(?!.*\.\.)(?!\/)[A-Za-z0-9._/-]{1,200}$/;
14
+ const MIME_BY_EXTENSION = {
15
+ html: 'text/html',
16
+ js: 'text/javascript',
17
+ mjs: 'text/javascript',
18
+ css: 'text/css',
19
+ json: 'application/json',
20
+ map: 'application/json',
21
+ wasm: 'application/wasm',
22
+ png: 'image/png',
23
+ jpg: 'image/jpeg',
24
+ jpeg: 'image/jpeg',
25
+ gif: 'image/gif',
26
+ webp: 'image/webp',
27
+ svg: 'image/svg+xml',
28
+ ico: 'image/x-icon',
29
+ ktx2: 'image/ktx2',
30
+ glb: 'model/gltf-binary',
31
+ gltf: 'model/gltf+json',
32
+ bin: 'application/octet-stream',
33
+ mp3: 'audio/mpeg',
34
+ ogg: 'audio/ogg',
35
+ wav: 'audio/wav',
36
+ woff: 'font/woff',
37
+ woff2: 'font/woff2',
38
+ ttf: 'font/ttf',
39
+ txt: 'text/plain',
40
+ md: 'text/markdown',
41
+ };
42
+ // Returns the MIME type for an allowed bundle file, or null if the extension
43
+ // is not allowlisted. The server picks the type — clients are not trusted.
44
+ // `.d.ts` (TypeScript declarations, shipped in the system code channel for
45
+ // consumer types) is allowed by SUFFIX so raw `.ts` source stays disallowed.
46
+ function bundleContentType(path) {
47
+ const lower = path.toLowerCase();
48
+ if (lower.endsWith('.d.ts'))
49
+ return 'text/plain';
50
+ const ext = lower.split('.').pop() ?? '';
51
+ return MIME_BY_EXTENSION[ext] ?? null;
52
+ }
53
+ // Binary runtime content: animations, models, textures, sounds. These are the
54
+ // CDN-resident, never-embedded assets — split into the `assets/` channel at
55
+ // publish so the code (downloadable, embedded by consumers) never carries them.
56
+ exports.ASSET_EXTENSIONS = new Set([
57
+ 'glb', 'gltf', 'bin', 'ktx2', 'png', 'jpg', 'jpeg', 'webp', 'gif', 'mp3', 'ogg', 'wav',
58
+ ]);
59
+ // Per-kind bundle caps. Asset-packs hold large clip sets (and later KTX2/sounds/
60
+ // LODs), so they get a higher ceiling than code bundles. Raising a cap is
61
+ // painless; lowering one breaks publishers.
62
+ function bundleLimitsForKind(kind) {
63
+ if (kind === 'asset-pack')
64
+ return { maxFiles: 1000, maxTotalBytes: 256 * 1024 * 1024 };
65
+ return { maxFiles: exports.BUNDLE_MAX_FILES, maxTotalBytes: exports.BUNDLE_MAX_TOTAL_BYTES };
66
+ }
67
+ // Splits a bundle file into the `code` (downloadable, embedded by consumers) or
68
+ // `asset` (CDN-resident, fetched at runtime) channel. An asset-pack is all
69
+ // assets (incl. clip-meta.json/measurement.json); for system/ability code,
70
+ // asset-extension files are assets and everything else (manifest/js/schema) is code.
71
+ function classifyBundleFile(kind, path) {
72
+ if (kind === 'asset-pack')
73
+ return 'asset';
74
+ return exports.ASSET_EXTENSIONS.has(path.split('.').pop()?.toLowerCase() ?? '') ? 'asset' : 'code';
75
+ }
76
+ // A v0.2 world embeds HELIX system/ability CODE under helix_modules/, but their
77
+ // ASSETS must never be embedded — they stream from the CDN (the licensing
78
+ // invariant). Returns the asset-extension files found under helix_modules/; a
79
+ // non-empty result is a violation the world publish path rejects. (A creator's
80
+ // OWN assets elsewhere in the bundle are theirs to embed and are not flagged.)
81
+ exports.HELIX_MODULES_DIR = 'helix_modules';
82
+ function embeddedModuleAssets(paths) {
83
+ const prefix = `${exports.HELIX_MODULES_DIR}/`;
84
+ return paths.filter((p) => p.startsWith(prefix) &&
85
+ exports.ASSET_EXTENSIONS.has(p.split('.').pop()?.toLowerCase() ?? ''));
86
+ }
87
+ //# sourceMappingURL=bundle-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle-rules.js","sourceRoot":"","sources":["../../src/bundle-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ export * from './bundle-rules';
2
+ export declare const MANIFEST_FILENAME = "helix.json";
3
+ export declare const MANIFEST_VERSIONS: readonly ["0.1", "0.2"];
4
+ export declare const PERMISSIONS_V01: readonly ["auth.profile"];
5
+ export type HelixPermission = (typeof PERMISSIONS_V01)[number];
6
+ /**
7
+ * Bundle vocabulary, pinned for main-backend compatibility. A **system** is a
8
+ * versioned runtime framework that hosts abilities (the humanoid character is
9
+ * the first; vehicles/quadrupeds later) — abilities declare which system they
10
+ * target, worlds pin one or more systems plus abilities compatible with them.
11
+ * Each kind maps onto the main backend's PackageType (its `packages` module is
12
+ * the catalog/commerce system of record; HELIX Instant stays the web runtime +
13
+ * bundle-delivery service).
14
+ */
15
+ export declare const BUNDLE_KINDS: readonly ["world", "system", "ability", "asset-pack"];
16
+ export type HelixBundleKind = (typeof BUNDLE_KINDS)[number];
17
+ /**
18
+ * kind → main-backend PackageType. 'World' exists there today; the others are PROPOSED additions
19
+ * to its enum (their existing 'Character' means a UE content package, not our web character
20
+ * system — hence new names). Agree with the main-backend team before catalog federation.
21
+ */
22
+ export declare const MAIN_BACKEND_PACKAGE_TYPE: Record<HelixBundleKind, string>;
23
+ export type HelixContentRating = 'unrated' | 'everyone' | 'teen' | 'mature';
24
+ /**
25
+ * contentRating → main-backend ContentRating. 'unrated' has no counterpart there (their enum is
26
+ * Everyone/Teen/Mature) — an unrated bundle cannot federate into the catalog until it is rated.
27
+ */
28
+ export declare const MAIN_BACKEND_CONTENT_RATING: Record<HelixContentRating, 'Everyone' | 'Teen' | 'Mature' | null>;
29
+ export type HelixManifest = {
30
+ helixVersion: '0.1' | '0.2';
31
+ title: string;
32
+ slug: string;
33
+ entry: string;
34
+ maxPlayers?: number;
35
+ permissions?: HelixPermission[];
36
+ supportsMobile?: boolean;
37
+ requiresAuth?: boolean;
38
+ contentRating?: HelixContentRating;
39
+ /** Always 'world' (defaulted). Reserved kinds arrive with ability packaging — see BUNDLE_KINDS. */
40
+ kind?: 'world';
41
+ /** Semver identity for catalog federation (defaulted to '1.0.0'); worlds build-number independently. */
42
+ version?: string;
43
+ /** v0.2: pinned system dependencies (slug -> semver range), resolved + baked at build. */
44
+ systems?: Record<string, string>;
45
+ /** v0.2: pinned ability dependencies (slug -> semver range), resolved + baked at build. */
46
+ abilities?: Record<string, string>;
47
+ };
48
+ export type NormalizedHelixManifest = Required<Omit<HelixManifest, 'systems' | 'abilities'>> & Pick<HelixManifest, 'systems' | 'abilities'>;
49
+ export type ManifestValidationResult = {
50
+ valid: true;
51
+ manifest: NormalizedHelixManifest;
52
+ } | {
53
+ valid: false;
54
+ errors: string[];
55
+ };
56
+ export declare function validateManifest(data: unknown): ManifestValidationResult;
57
+ export declare function parseManifest(json: string): ManifestValidationResult;
58
+ export declare const PACKAGE_ENVELOPE_VERSION: "1";
59
+ export type HelixPackageEnvelope = {
60
+ envelopeVersion: '1';
61
+ kind: Exclude<HelixBundleKind, 'world'>;
62
+ slug: string;
63
+ version: string;
64
+ title: string;
65
+ /** Required for system/ability code bundles; omitted for asset-packs. */
66
+ entry?: string;
67
+ /** Abilities only: the host system pin, lifted into catalog columns at finalize. */
68
+ system?: {
69
+ id: string;
70
+ version: string;
71
+ };
72
+ /** Systems only (optional): the base asset-pack the system's runtime needs (slug + semver range). */
73
+ assetPack?: {
74
+ slug: string;
75
+ range: string;
76
+ };
77
+ /** Systems only (optional): the full three.js version the code was built against — `helix install` points the import map + transcoder at runtime/three/<version>/. */
78
+ three?: string;
79
+ description?: string;
80
+ };
81
+ export type NormalizedPackageEnvelope = HelixPackageEnvelope & {
82
+ description: string;
83
+ };
84
+ export type PackageEnvelopeValidationResult = {
85
+ valid: true;
86
+ envelope: NormalizedPackageEnvelope;
87
+ } | {
88
+ valid: false;
89
+ errors: string[];
90
+ };
91
+ export declare function validatePackageEnvelope(data: unknown): PackageEnvelopeValidationResult;
92
+ export declare function parsePackageEnvelope(json: string): PackageEnvelopeValidationResult;
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ var __importDefault = (this && this.__importDefault) || function (mod) {
17
+ return (mod && mod.__esModule) ? mod : { "default": mod };
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.PACKAGE_ENVELOPE_VERSION = exports.MAIN_BACKEND_CONTENT_RATING = exports.MAIN_BACKEND_PACKAGE_TYPE = exports.BUNDLE_KINDS = exports.PERMISSIONS_V01 = exports.MANIFEST_VERSIONS = exports.MANIFEST_FILENAME = void 0;
21
+ exports.validateManifest = validateManifest;
22
+ exports.parseManifest = parseManifest;
23
+ exports.validatePackageEnvelope = validatePackageEnvelope;
24
+ exports.parsePackageEnvelope = parsePackageEnvelope;
25
+ __exportStar(require("./bundle-rules"), exports);
26
+ const _2020_1 = require("ajv/dist/2020");
27
+ const manifest_v0_1_schema_json_1 = __importDefault(require("../schema/manifest-v0.1.schema.json"));
28
+ const manifest_v0_2_schema_json_1 = __importDefault(require("../schema/manifest-v0.2.schema.json"));
29
+ const package_envelope_v1_schema_json_1 = __importDefault(require("../schema/package-envelope-v1.schema.json"));
30
+ exports.MANIFEST_FILENAME = 'helix.json';
31
+ exports.MANIFEST_VERSIONS = ['0.1', '0.2'];
32
+ exports.PERMISSIONS_V01 = ['auth.profile'];
33
+ /**
34
+ * Bundle vocabulary, pinned for main-backend compatibility. A **system** is a
35
+ * versioned runtime framework that hosts abilities (the humanoid character is
36
+ * the first; vehicles/quadrupeds later) — abilities declare which system they
37
+ * target, worlds pin one or more systems plus abilities compatible with them.
38
+ * Each kind maps onto the main backend's PackageType (its `packages` module is
39
+ * the catalog/commerce system of record; HELIX Instant stays the web runtime +
40
+ * bundle-delivery service).
41
+ */
42
+ exports.BUNDLE_KINDS = ['world', 'system', 'ability', 'asset-pack'];
43
+ /**
44
+ * kind → main-backend PackageType. 'World' exists there today; the others are PROPOSED additions
45
+ * to its enum (their existing 'Character' means a UE content package, not our web character
46
+ * system — hence new names). Agree with the main-backend team before catalog federation.
47
+ */
48
+ exports.MAIN_BACKEND_PACKAGE_TYPE = {
49
+ world: 'World',
50
+ system: 'System', // proposed
51
+ ability: 'Ability', // proposed
52
+ 'asset-pack': 'AssetPack', // proposed
53
+ };
54
+ /**
55
+ * contentRating → main-backend ContentRating. 'unrated' has no counterpart there (their enum is
56
+ * Everyone/Teen/Mature) — an unrated bundle cannot federate into the catalog until it is rated.
57
+ */
58
+ exports.MAIN_BACKEND_CONTENT_RATING = {
59
+ unrated: null,
60
+ everyone: 'Everyone',
61
+ teen: 'Teen',
62
+ mature: 'Mature',
63
+ };
64
+ const ajv = new _2020_1.Ajv2020({ allErrors: true, useDefaults: true });
65
+ const validateV01 = ajv.compile(manifest_v0_1_schema_json_1.default);
66
+ const validateV02 = ajv.compile(manifest_v0_2_schema_json_1.default);
67
+ function formatError(err, label = 'manifest') {
68
+ const path = err.instancePath ? err.instancePath.replace(/^\//, '').replace(/\//g, '.') : label;
69
+ if (err.keyword === 'additionalProperties') {
70
+ return `${label}: unknown field "${err.params.additionalProperty}"`;
71
+ }
72
+ if (err.keyword === 'required') {
73
+ return `${label}: missing required field "${err.params.missingProperty}"`;
74
+ }
75
+ return `${path}: ${err.message}`;
76
+ }
77
+ // Validates and normalizes a parsed helix.json. Same code runs in the CLI
78
+ // (pre-upload) and the backend (finalize) so the two can never disagree.
79
+ function validateManifest(data) {
80
+ if (typeof data !== 'object' || data === null || Array.isArray(data)) {
81
+ return { valid: false, errors: ['manifest: must be a JSON object'] };
82
+ }
83
+ // ajv mutates its input when applying defaults — validate a copy.
84
+ const candidate = structuredClone(data);
85
+ if (candidate.helixVersion !== undefined && !exports.MANIFEST_VERSIONS.includes(candidate.helixVersion)) {
86
+ return {
87
+ valid: false,
88
+ errors: [`manifest: unsupported helixVersion "${String(candidate.helixVersion)}" (supported: ${exports.MANIFEST_VERSIONS.join(', ')})`],
89
+ };
90
+ }
91
+ // Route to the schema for the declared version (omitted → v0.1, which requires helixVersion).
92
+ const validate = candidate.helixVersion === '0.2' ? validateV02 : validateV01;
93
+ if (!validate(candidate)) {
94
+ const errors = (validate.errors ?? []).map((e) => formatError(e));
95
+ return { valid: false, errors: [...new Set(errors)] };
96
+ }
97
+ return { valid: true, manifest: candidate };
98
+ }
99
+ function parseManifest(json) {
100
+ try {
101
+ return validateManifest(JSON.parse(json));
102
+ }
103
+ catch (err) {
104
+ return { valid: false, errors: [`manifest: invalid JSON — ${err instanceof Error ? err.message : String(err)}`] };
105
+ }
106
+ }
107
+ // --- Package envelope (system | ability | asset-pack) -----------------------
108
+ // The thin platform envelope for non-world bundles, derived by the CLI at
109
+ // publish from the system payload (e.g. ability.json). Validated by the same
110
+ // shared code in the CLI (pre-upload) and the backend (publish) — never two
111
+ // implementations. Worlds keep validateManifest above; the platform never
112
+ // learns system concepts.
113
+ exports.PACKAGE_ENVELOPE_VERSION = '1';
114
+ const validatePackageV1 = ajv.compile(package_envelope_v1_schema_json_1.default);
115
+ // Validates and normalizes a package envelope. Same code runs in the CLI
116
+ // (pre-upload) and the backend (publish) so the two can never disagree.
117
+ function validatePackageEnvelope(data) {
118
+ if (typeof data !== 'object' || data === null || Array.isArray(data)) {
119
+ return { valid: false, errors: ['envelope: must be a JSON object'] };
120
+ }
121
+ // ajv mutates its input when applying defaults — validate a copy.
122
+ const candidate = structuredClone(data);
123
+ if (candidate.envelopeVersion !== undefined && candidate.envelopeVersion !== exports.PACKAGE_ENVELOPE_VERSION) {
124
+ return {
125
+ valid: false,
126
+ errors: [`envelope: unsupported envelopeVersion "${String(candidate.envelopeVersion)}" (supported: ${exports.PACKAGE_ENVELOPE_VERSION})`],
127
+ };
128
+ }
129
+ if (!validatePackageV1(candidate)) {
130
+ const errors = (validatePackageV1.errors ?? []).map((e) => formatError(e, 'envelope'));
131
+ return { valid: false, errors: [...new Set(errors)] };
132
+ }
133
+ return { valid: true, envelope: candidate };
134
+ }
135
+ function parsePackageEnvelope(json) {
136
+ try {
137
+ return validatePackageEnvelope(JSON.parse(json));
138
+ }
139
+ catch (err) {
140
+ return { valid: false, errors: [`envelope: invalid JSON — ${err instanceof Error ? err.message : String(err)}`] };
141
+ }
142
+ }
143
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.es2021.d.ts","../node_modules/typescript/lib/lib.es2022.d.ts","../node_modules/typescript/lib/lib.es2023.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.es2021.promise.d.ts","../node_modules/typescript/lib/lib.es2021.string.d.ts","../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../node_modules/typescript/lib/lib.es2021.intl.d.ts","../node_modules/typescript/lib/lib.es2022.array.d.ts","../node_modules/typescript/lib/lib.es2022.error.d.ts","../node_modules/typescript/lib/lib.es2022.intl.d.ts","../node_modules/typescript/lib/lib.es2022.object.d.ts","../node_modules/typescript/lib/lib.es2022.string.d.ts","../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../node_modules/typescript/lib/lib.es2023.array.d.ts","../node_modules/typescript/lib/lib.es2023.collection.d.ts","../node_modules/typescript/lib/lib.es2023.intl.d.ts","../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../src/bundle-rules.ts","../node_modules/fast-uri/types/index.d.ts","../node_modules/ajv/dist/compile/codegen/code.d.ts","../node_modules/ajv/dist/compile/codegen/scope.d.ts","../node_modules/ajv/dist/compile/codegen/index.d.ts","../node_modules/ajv/dist/compile/rules.d.ts","../node_modules/ajv/dist/compile/util.d.ts","../node_modules/ajv/dist/compile/validate/subschema.d.ts","../node_modules/ajv/dist/compile/errors.d.ts","../node_modules/ajv/dist/compile/validate/index.d.ts","../node_modules/ajv/dist/compile/validate/dataType.d.ts","../node_modules/ajv/dist/vocabularies/applicator/additionalItems.d.ts","../node_modules/ajv/dist/vocabularies/applicator/items2020.d.ts","../node_modules/ajv/dist/vocabularies/applicator/contains.d.ts","../node_modules/ajv/dist/vocabularies/applicator/dependencies.d.ts","../node_modules/ajv/dist/vocabularies/applicator/propertyNames.d.ts","../node_modules/ajv/dist/vocabularies/applicator/additionalProperties.d.ts","../node_modules/ajv/dist/vocabularies/applicator/not.d.ts","../node_modules/ajv/dist/vocabularies/applicator/anyOf.d.ts","../node_modules/ajv/dist/vocabularies/applicator/oneOf.d.ts","../node_modules/ajv/dist/vocabularies/applicator/if.d.ts","../node_modules/ajv/dist/vocabularies/applicator/index.d.ts","../node_modules/ajv/dist/vocabularies/validation/limitNumber.d.ts","../node_modules/ajv/dist/vocabularies/validation/multipleOf.d.ts","../node_modules/ajv/dist/vocabularies/validation/pattern.d.ts","../node_modules/ajv/dist/vocabularies/validation/required.d.ts","../node_modules/ajv/dist/vocabularies/validation/uniqueItems.d.ts","../node_modules/ajv/dist/vocabularies/validation/const.d.ts","../node_modules/ajv/dist/vocabularies/validation/enum.d.ts","../node_modules/ajv/dist/vocabularies/validation/index.d.ts","../node_modules/ajv/dist/vocabularies/format/format.d.ts","../node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.d.ts","../node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.d.ts","../node_modules/ajv/dist/vocabularies/validation/dependentRequired.d.ts","../node_modules/ajv/dist/vocabularies/discriminator/types.d.ts","../node_modules/ajv/dist/vocabularies/discriminator/index.d.ts","../node_modules/ajv/dist/vocabularies/errors.d.ts","../node_modules/ajv/dist/types/json-schema.d.ts","../node_modules/ajv/dist/types/jtd-schema.d.ts","../node_modules/ajv/dist/runtime/validation_error.d.ts","../node_modules/ajv/dist/compile/ref_error.d.ts","../node_modules/ajv/dist/core.d.ts","../node_modules/ajv/dist/ajv.d.ts","../node_modules/ajv/dist/compile/resolve.d.ts","../node_modules/ajv/dist/compile/index.d.ts","../node_modules/ajv/dist/types/index.d.ts","../node_modules/ajv/dist/2020.d.ts","../schema/manifest-v0.1.schema.json","../schema/manifest-v0.2.schema.json","../schema/package-envelope-v1.schema.json","../src/index.ts","../node_modules/@babel/types/lib/index.d.ts","../node_modules/@types/babel__generator/index.d.ts","../node_modules/@babel/parser/typings/babel-parser.d.ts","../node_modules/@types/babel__template/index.d.ts","../node_modules/@types/babel__traverse/index.d.ts","../node_modules/@types/babel__core/index.d.ts","../node_modules/@types/node/ts5.7/compatibility/float16array.d.ts","../node_modules/@types/node/globals.typedarray.d.ts","../node_modules/@types/node/buffer.buffer.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/web-globals/abortcontroller.d.ts","../node_modules/@types/node/web-globals/blob.d.ts","../node_modules/@types/node/web-globals/console.d.ts","../node_modules/@types/node/web-globals/crypto.d.ts","../node_modules/@types/node/web-globals/domexception.d.ts","../node_modules/@types/node/web-globals/encoding.d.ts","../node_modules/@types/node/web-globals/events.d.ts","../node_modules/undici-types/utility.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client-stats.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/round-robin-pool.d.ts","../node_modules/undici-types/h2c-client.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/dispatcher1-wrapper.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-call-history.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/snapshot-agent.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/socks5-proxy-agent.d.ts","../node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/undici-types/retry-handler.d.ts","../node_modules/undici-types/retry-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/cache-interceptor.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/util.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/eventsource.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/web-globals/fetch.d.ts","../node_modules/@types/node/web-globals/importmeta.d.ts","../node_modules/@types/node/web-globals/messaging.d.ts","../node_modules/@types/node/web-globals/navigator.d.ts","../node_modules/@types/node/web-globals/performance.d.ts","../node_modules/@types/node/web-globals/storage.d.ts","../node_modules/@types/node/web-globals/streams.d.ts","../node_modules/@types/node/web-globals/timers.d.ts","../node_modules/@types/node/web-globals/url.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/inspector.generated.d.ts","../node_modules/@types/node/inspector/promises.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/path/posix.d.ts","../node_modules/@types/node/path/win32.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/quic.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/sea.d.ts","../node_modules/@types/node/sqlite.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/iter.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/test/reporters.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/util/types.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/zlib/iter.d.ts","../node_modules/@types/node/ts5.7/index.d.ts","../node_modules/@types/graceful-fs/index.d.ts","../node_modules/@types/istanbul-lib-coverage/index.d.ts","../node_modules/@types/istanbul-lib-report/index.d.ts","../node_modules/@types/istanbul-reports/index.d.ts","../node_modules/@jest/expect-utils/build/index.d.ts","../node_modules/chalk/index.d.ts","../node_modules/@sinclair/typebox/typebox.d.ts","../node_modules/@jest/schemas/build/index.d.ts","../node_modules/pretty-format/build/index.d.ts","../node_modules/jest-diff/build/index.d.ts","../node_modules/jest-matcher-utils/build/index.d.ts","../node_modules/expect/build/index.d.ts","../node_modules/@types/jest/index.d.ts","../node_modules/@types/stack-utils/index.d.ts","../node_modules/@types/yargs-parser/index.d.ts","../node_modules/@types/yargs/index.d.ts"],"fileIdsList":[[114,122,187,195,199,202,204,205,206,218],[122,187,195,199,202,204,205,206,218],[122,187,195,199,202,204,205,206,218,252],[114,115,116,117,118,122,187,195,199,202,204,205,206,218],[114,116,122,187,195,199,202,204,205,206,218],[122,187,195,199,202,204,205,206,218,245],[122,187,195,199,202,204,205,206,218,247],[122,187,195,199,202,204,205,206,218,248],[122,187,195,199,202,204,205,206,218,254,257],[122,184,185,187,195,199,202,204,205,206,218],[122,186,187,195,199,202,204,205,206,218],[187,195,199,202,204,205,206,218],[122,187,195,199,202,204,205,206,218,227],[122,187,188,193,195,198,199,202,204,205,206,208,218,223,236],[122,187,188,189,195,198,199,202,204,205,206,218],[122,187,190,195,199,202,204,205,206,218,237],[122,187,191,192,195,199,202,204,205,206,209,218],[122,187,192,195,199,202,204,205,206,218,223,233],[122,187,193,195,198,199,202,204,205,206,208,218],[122,186,187,194,195,199,202,204,205,206,218],[122,187,195,196,199,202,204,205,206,218],[122,187,195,197,198,199,202,204,205,206,218],[122,186,187,195,198,199,202,204,205,206,218],[122,187,195,198,199,200,202,204,205,206,218,223,236],[122,187,195,198,199,200,202,204,205,206,218,223,225,227],[122,174,187,195,198,199,201,202,204,205,206,208,218,223,236],[122,187,195,198,199,201,202,204,205,206,208,218,223,233,236],[122,187,195,199,201,202,203,204,205,206,218,223,233,236],[122,187,195,198,199,202,204,205,206,218],[122,187,195,199,202,204,206,218],[122,187,195,199,202,204,205,206,207,218,236],[122,187,195,198,199,202,204,205,206,208,218,223],[122,187,195,199,202,204,205,206,209,218],[122,187,195,199,202,204,205,206,210,218],[122,187,195,198,199,202,204,205,206,213,218],[122,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243],[122,187,195,199,202,204,205,206,215,218],[122,187,195,199,202,204,205,206,216,218],[122,187,192,195,199,202,204,205,206,208,218,227],[122,187,195,198,199,202,204,205,206,218,219],[122,187,195,199,202,204,205,206,218,220,237,240],[122,187,195,198,199,202,204,205,206,218,223,226,227],[122,187,195,199,202,204,205,206,218,224,227],[122,187,195,199,202,204,205,206,218,225],[122,187,195,199,202,204,205,206,218,227,237],[122,187,195,199,202,204,205,206,218,228],[122,184,187,195,199,202,204,205,206,218,223,230,236],[122,187,195,199,202,204,205,206,218,223,229],[122,187,195,198,199,202,204,205,206,218,231,232],[122,187,195,199,202,204,205,206,218,231,232],[122,187,192,195,199,202,204,205,206,208,218,223,233],[122,187,195,199,202,204,205,206,218,234],[120,121,122,123,124,125,126,127,128,129,130,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244],[122,187,195,199,202,204,205,206,208,218,235],[122,187,195,199,201,202,204,205,206,216,218,236],[122,187,195,199,202,204,205,206,218,237,238],[122,187,192,195,199,202,204,205,206,218,238],[122,187,195,199,202,204,205,206,218,223,239],[122,187,195,199,202,204,205,206,207,218,240],[122,187,195,199,202,204,205,206,218,241],[122,187,190,195,199,202,204,205,206,218],[122,187,192,195,199,202,204,205,206,218],[122,187,195,199,202,204,205,206,218,237],[122,174,187,195,199,202,204,205,206,218],[122,187,195,199,202,204,205,206,218,236],[122,187,195,199,202,204,205,206,218,242],[122,187,195,199,202,204,205,206,213,218],[122,187,195,199,202,204,205,206,218,232],[122,174,187,195,198,199,200,202,204,205,206,213,218,223,227,236,239,240,242],[122,187,195,199,202,204,205,206,218,223,243],[122,187,195,199,202,204,205,206,218,225,244],[122,187,195,199,202,204,205,206,218,260],[67,68,72,99,100,102,103,104,107,108,122,187,195,199,202,204,205,206,218],[65,66,122,187,195,199,202,204,205,206,218],[65,122,187,195,199,202,204,205,206,218],[67,108,122,187,195,199,202,204,205,206,218],[67,68,104,106,108,122,187,195,199,202,204,205,206,218],[108,122,187,195,199,202,204,205,206,218],[64,105,108,122,187,195,199,202,204,205,206,218],[67,68,107,108,122,187,195,199,202,204,205,206,218],[67,68,70,71,107,108,122,187,195,199,202,204,205,206,218],[67,68,69,107,108,122,187,195,199,202,204,205,206,218],[67,68,72,99,100,101,102,103,107,108,122,187,195,199,202,204,205,206,218],[64,67,68,72,104,107,122,187,195,199,202,204,205,206,218],[72,108,122,187,195,199,202,204,205,206,218],[74,75,76,77,78,79,80,81,82,83,108,122,187,195,199,202,204,205,206,218],[97,108,122,187,195,199,202,204,205,206,218],[73,84,92,93,94,95,96,98,122,187,195,199,202,204,205,206,218],[77,108,122,187,195,199,202,204,205,206,218],[85,86,87,88,89,90,91,108,122,187,195,199,202,204,205,206,218],[122,187,195,199,202,204,205,206,218,250,256],[122,187,195,199,202,204,205,206,218,254],[122,187,195,199,202,204,205,206,218,251,255],[122,187,195,199,202,204,205,206,218,253],[122,137,140,143,144,187,195,199,202,204,205,206,218,236],[122,140,187,195,199,202,204,205,206,218,223,236],[122,140,144,187,195,199,202,204,205,206,218,236],[122,187,195,199,202,204,205,206,218,223],[122,134,187,195,199,202,204,205,206,218],[122,138,187,195,199,202,204,205,206,218],[122,136,137,140,187,195,199,202,204,205,206,218,236],[122,187,195,199,202,204,205,206,208,218,233],[122,134,187,195,199,202,204,205,206,218,245],[122,136,140,187,195,199,202,204,205,206,208,218,236],[122,131,132,133,135,139,187,195,198,199,202,204,205,206,218,223,236],[122,140,187,195,199,202,204,205,206,218],[122,140,149,158,187,195,199,202,204,205,206,218],[122,132,138,187,195,199,202,204,205,206,218],[122,140,168,169,187,195,199,202,204,205,206,218],[122,132,135,140,187,195,199,202,204,205,206,218,227,236,245],[122,136,140,187,195,199,202,204,205,206,218,236],[122,131,187,195,199,202,204,205,206,218],[122,134,135,136,138,139,140,141,142,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,169,170,171,172,173,187,195,199,202,204,205,206,218],[122,140,161,164,187,195,199,202,204,205,206,218],[122,140,149,151,152,187,195,199,202,204,205,206,218],[122,138,140,151,153,187,195,199,202,204,205,206,218],[122,139,187,195,199,202,204,205,206,218],[122,132,134,140,187,195,199,202,204,205,206,218],[122,140,144,151,153,187,195,199,202,204,205,206,218],[122,144,187,195,199,202,204,205,206,218],[122,138,140,143,187,195,199,202,204,205,206,218,236],[122,132,136,140,149,187,195,199,202,204,205,206,218],[122,140,161,187,195,199,202,204,205,206,218],[122,153,187,195,199,202,204,205,206,218],[122,132,136,140,144,187,195,199,202,204,205,206,218],[122,134,140,168,187,195,199,202,204,205,206,218,227,242,245],[63,105,109,110,111,112,122,187,195,199,202,204,205,206,218]],"fileInfos":[{"version":"e41c290ef7dd7dab3493e6cbe5909e0148edf4a8dad0271be08edec368a0f7b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"62bb211266ee48b2d0edf0d8d1b191f0c24fc379a82bd4c1692a082c540bc6b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1e2a172204962276504466a6393426d2ca9c54894b1ad0a6c9dad867a65f876","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"bab26767638ab3557de12c900f0b91f710c7dc40ee9793d5a27d32c04f0bf646","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ceba003026beadb99e49dc319cbc1020fef15fc3a47b440719b4aa45afbe3f0","signature":"23b11f36c8e7539e2470b3d0499e56c758fed3e53b71a66d115a3c62c37e2814"},{"version":"84bcc7c6b06f4d643a55dc63b56be0c81d990f8d549b66ea615c553268774dc3","impliedFormat":1},{"version":"2d225e7bda2871c066a7079c88174340950fb604f624f2586d3ea27bb9e5f4ff","impliedFormat":1},{"version":"6a785f84e63234035e511817dd48ada756d984dd8f9344e56eb8b2bdcd8fd001","impliedFormat":1},{"version":"c1422d016f7df2ccd3594c06f2923199acd09898f2c42f50ea8159f1f856f618","impliedFormat":1},{"version":"2973b1b7857ca144251375b97f98474e9847a890331e27132d5a8b3aea9350a8","impliedFormat":1},{"version":"0eb6152d37c84d6119295493dfcc20c331c6fda1304a513d159cdaa599dcb78b","impliedFormat":1},{"version":"237df26f8c326ca00cd9d2deb40214a079749062156386b6d75bdcecc6988a6b","impliedFormat":1},{"version":"cd44995ee13d5d23df17a10213fed7b483fabfd5ea08f267ab52c07ce0b6b4da","impliedFormat":1},{"version":"58ce1486f851942bd2d3056b399079bc9cb978ec933fe9833ea417e33eab676e","impliedFormat":1},{"version":"7557d4d7f19f94341f4413575a3453ba7f6039c9591015bcf4282a8e75414043","impliedFormat":1},{"version":"a3b2cc16f3ce2d882eca44e1066f57a24751545f2a5e4a153d4de31b4cac9bb5","impliedFormat":1},{"version":"ac2b3b377d3068bfb6e1cb8889c99098f2c875955e2325315991882a74d92cc8","impliedFormat":1},{"version":"8deb39d89095469957f73bd194d11f01d9894b8c1f1e27fbf3f6e8122576b336","impliedFormat":1},{"version":"a38a9c41f433b608a0d37e645a31eecf7233ef3d3fffeb626988d3219f80e32f","impliedFormat":1},{"version":"8e1428dcba6a984489863935049893631170a37f9584c0479f06e1a5b1f04332","impliedFormat":1},{"version":"1fce9ecb87a2d3898941c60df617e52e50fb0c03c9b7b2ba8381972448327285","impliedFormat":1},{"version":"5ef0597b8238443908b2c4bf69149ed3894ac0ddd0515ac583d38c7595b151f1","impliedFormat":1},{"version":"ac52b775a80badff5f4ac329c5725a26bd5aaadd57afa7ad9e98b4844767312a","impliedFormat":1},{"version":"6ae5b4a63010c82bf2522b4ecfc29ffe6a8b0c5eea6b2b35120077e9ac54d7a1","impliedFormat":1},{"version":"dd7109c49f416f218915921d44f0f28975df78e04e437c62e1e1eb3be5e18a35","impliedFormat":1},{"version":"eee181112e420b345fc78422a6cc32385ede3d27e2eaf8b8c4ad8b2c29e3e52e","impliedFormat":1},{"version":"25fbe57c8ee3079e2201fe580578fab4f3a78881c98865b7c96233af00bf9624","impliedFormat":1},{"version":"62cc8477858487b4c4de7d7ae5e745a8ce0015c1592f398b63ee05d6e64ca295","impliedFormat":1},{"version":"cc2a9ec3cb10e4c0b8738b02c31798fad312d21ef20b6a2f5be1d077e9f5409d","impliedFormat":1},{"version":"4b4fadcda7d34034737598c07e2dca5d7e1e633cb3ba8dd4d2e6a7782b30b296","impliedFormat":1},{"version":"360fdc8829a51c5428636f1f83e7db36fef6c5a15ed4411b582d00a1c2bd6e97","impliedFormat":1},{"version":"1cf0d15e6ab1ecabbf329b906ae8543e6b8955133b7f6655f04d433e3a0597ab","impliedFormat":1},{"version":"7c9f98fe812643141502b30fb2b5ec56d16aaf94f98580276ae37b7924dd44a4","impliedFormat":1},{"version":"b3547893f24f59d0a644c52f55901b15a3fa1a115bc5ea9a582911469b9348b7","impliedFormat":1},{"version":"596e5b88b6ca8399076afcc22af6e6e0c4700c7cd1f420a78d637c3fb44a885e","impliedFormat":1},{"version":"adddf736e08132c7059ee572b128fdacb1c2650ace80d0f582e93d097ed4fbaf","impliedFormat":1},{"version":"d4cad9dc13e9c5348637170ddd5d95f7ed5fdfc856ddca40234fa55518bc99a6","impliedFormat":1},{"version":"d70675ba7ba7d02e52b7070a369957a70827e4b2bca2c1680c38a832e87b61fd","impliedFormat":1},{"version":"3be71f4ce8988a01e2f5368bdd58e1d60236baf511e4510ee9291c7b3729a27e","impliedFormat":1},{"version":"423d2ccc38e369a7527988d682fafc40267bcd6688a7473e59c5eea20a29b64f","impliedFormat":1},{"version":"2f9fde0868ed030277c678b435f63fcf03d27c04301299580a4017963cc04ce6","impliedFormat":1},{"version":"feeb73d48cc41c6dd23d17473521b0af877751504c30c18dc84267c8eeea429a","impliedFormat":1},{"version":"25f1159094dc0bf3a71313a74e0885426af21c5d6564a254004f2cadf9c5b052","impliedFormat":1},{"version":"cde493e09daad4bb29922fe633f760be9f0e8e2f39cdca999cce3b8690b5e13a","impliedFormat":1},{"version":"3d7f9eb12aface876f7b535cc89dcd416daf77f0b3573333f16ec0a70bcf902a","impliedFormat":1},{"version":"4304f640f7cb4724ea82441accb7c7607fa7207541182470d625adda99b2900b","impliedFormat":1},{"version":"41b8775befd7ded7245a627e9f4de6110236688ce4c124d2d40c37bc1a3bfe05","impliedFormat":1},{"version":"e0205f04611bea8b5b82168065b8ef1476a8e96236201494eb8c785331c43118","impliedFormat":1},{"version":"62d26d8ba4fa15ab425c1b57a050ed76c5b0ecbffaa53f182110aa3a02405a07","impliedFormat":1},{"version":"9941cbf7ca695e95d588f5f1692ab040b078d44a95d231fa9a8f828186b7b77d","impliedFormat":1},{"version":"66a5ace456d19768103c1da9df2abafa9cb2e78ff61c938746527ec2524e5d11","impliedFormat":1},"13dfc5c1e90ddaeb9e317c78f078ee819a328b31b816b62e869fd584f9628634","fb2c5c453c17678971c2580652cb00d753449e91e75b8556f6c7b72319b16f18","f6999da0525119abd0f1b5fad499bad1aba252a91cd15273438fa66fff53b217",{"version":"9fe06270bd3f363126e3ebe2cfd7e189d53819f9194965983df58c9bddfba070","signature":"8f8216ce16b08b001e0329b3f955d452dc0e7aa39b76bba04f86d8f01fc82473"},{"version":"556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"cebfeedf63623d54f7423d58cae1ec204c0d8d97a66d5fb17579e26a902085e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc2110f7decca6bfb9392e30421cfa1436479e4a6756e8fec6cbc22625d4f881","affectsGlobalScope":true,"impliedFormat":1},{"version":"f53a7652392cf26ebbe4e29fd0672aa87c93bd6d0241289c13fab87b9ac35c8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"b00a630557d1622ad312633bdbfbdb9c6b7220d948dca9f899db30679f160074","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"88809d6c1b9c78d04a133646a6feb926def05a8774c308c7c93bc32ee163d271","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"3ac40516c33b87f751f7507346933081a26cdb8a3e11a6b3aa07d23f803c85db","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"14e9acf826baba0ef4b5665704084896e7bcc06f65a9ab13af7e93d27d6b7069","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"829bc57ee8f287b490ab5bbc5a962fca57e432c1e38ec680ecd3ecaf12800613","impliedFormat":1},{"version":"eec76bf6b9346f3f95fa402621b889489e96930e72295b0369022f332e9b4a6a","impliedFormat":1},{"version":"3a3ff14da53d5013f3e6d8c4ad55225e3649c08786c4421ce639c00d8d589b7d","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"38004e6801340cb890afb8cb5a9fc8972297e7f88ab94026e4b0b3c61fb32f8a","impliedFormat":1},{"version":"d243db6b25788f439e7e2f03c05688e92f46764351673bb0e7b2f3631232e186","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"149f9a9e7f04e67afa0e2a49fc0ff421035c01d6b793cfcae7d2e9f6819431e2","impliedFormat":1},{"version":"e8a9dfa4c75ef6d25df8b40eaa9c31e0a69452aaf2ced4a3f4215dbdbaa876f4","impliedFormat":1},{"version":"a70af845a2eb9dd6e2723e319e14ea7fb28b129ec1361c21509b49305448c323","impliedFormat":1},{"version":"b53dc572d4f187904207ae1166652de47aab8eeb00c254d009cb226863076b56","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"f501234c5aeeeb5d7659412335227466aaacf30b952372d60afeb21c02c96348","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"9ac977503f15bf13ca7c82ad9a32a782f42d43e474824e8b3bffe228fd5f2639","impliedFormat":1},{"version":"8b91ff5bb912be3ea213cbcf0075aace1f5d4ff249a0d227ed673868cb7bfabc","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"98498b101803bb3dde9f76a56e65c14b75db1cc8bec5f4db72be541570f74fc5","impliedFormat":1},{"version":"7cb4f431a4591b0e23002bed805dc871a874dfed6b9a3994dce68a6df73e6739","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"436d7b4543b340b0f3eef4310d524242e41369b9652aa9c70428767c4dcac455","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"e99963ae1e3a48ca7a7958c02f3e88bb963eb7978c28b68ae6b8c9f03309d83c","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"594ae90cacd813fa392ff80d2e0a8eff4e41f4a136329a940e321399dd8895b4","impliedFormat":1},{"version":"d1f333ade8ff35a409b4984e1f11956fe11c61855b0c7e9b59f0313e48b40c4a","impliedFormat":1},{"version":"0224aa4b3464895d69c413a640a19ac2166778a74eb5eb3b36b021c72d42b274","impliedFormat":1},{"version":"0828724f6c17d63075bc7bfdd2f22875c4d00f90a6d8ef16d2e718a9e5f7e135","affectsGlobalScope":true,"impliedFormat":1},{"version":"177459cba484e2f1e08872a3d2fdbca3162d9d43ca5ec9dc0c946835b55f74be","impliedFormat":1},{"version":"2fbf504c4791f9d32cd766cfe6b605bcda63289b925401953a7900db9af85348","impliedFormat":1},{"version":"ed0fb633cae35948d9e144004299a4bdf1ab912667c787b7fbffcd6d8c7b92a2","impliedFormat":1},{"version":"1678b04557dca52feab73cc67610918a7f5e25bfdba3e7fa081acd625d93106d","impliedFormat":1},{"version":"637e244cbc5174cce5482388be2b4b51c49f7ce6dead7316448da61d7aa283b1","impliedFormat":1},{"version":"2ea729503db9793f2691162fec3dd1118cab62e96d025f8eeb376d43ec293395","impliedFormat":1},{"version":"0dc7f45811b1cc811c2701a280f038e9e150b79ad90ae3917e999bdc43c100b4","impliedFormat":1},{"version":"6a0de93048a43c4f492e1fe43cc4ec52eed57d4e03a07c78b2d502e20dbdcfd8","impliedFormat":1},{"version":"2bc7aa4fba46df0bd495425a7c8201437a7d465f83854fac859df2d67f664df3","impliedFormat":1},{"version":"41d17e1ad9a002feb11c8cdd2777e5bbc0cdb1e3f595d237e4dded0b6949983b","impliedFormat":1},{"version":"8c7e618c2a91ea7f6b5cca272a295864e92c16413be8fc56a943e8c7d5320011","affectsGlobalScope":true,"impliedFormat":1},{"version":"66e5d81f637da29b03689fbc84cc61f18c6fdde769b134e0649259384df453e2","impliedFormat":1},{"version":"f2bb6c145c2112b33fa26e7464c9c69212fd3fc163ee389230c22db39408ad1e","impliedFormat":1},{"version":"b02c915a1b0d9777a17e3249674735eec3f2fd929f0d63da84157aac7f9a4345","impliedFormat":1},{"version":"62e8f884c3bc6dff6189b6e662ebe8b238a645938f2df7a97b8a82fca56773a4","impliedFormat":1},{"version":"2c2bdaa1d8ead9f68628d6d9d250e46ee8e81aa4898b4769a36956ae15e060fe","impliedFormat":1},{"version":"57a0d1b3d59063d4af2d3f8aac27cfe3c20a0f5d1faf0f8598ccf0b779637939","impliedFormat":1},{"version":"5ff4433a2deae4f85ab1377e90a7554ce6b47ae51c69a84ca30a6e22fae85834","impliedFormat":1},{"version":"82b91e4e42e6c41bc7fc1b6c2dc5eba6a2ba98375eb1f210e6ff6bba2d54177e","impliedFormat":1},{"version":"97234c5303866576f913d0ccae7d58d6322d9e803c7bf1228a3fda46ab8087b2","affectsGlobalScope":true,"impliedFormat":1},{"version":"93ecf87143cac7b9d05cffc1d6bdc075b7e4fdd48ff05f1fad85043f6ae678d3","impliedFormat":1},{"version":"6f200afcb82b3e9a54bed6db23f2edf2508cd266801257312c0f124b47f2bdb9","impliedFormat":1},{"version":"ec501101c2a96133a6c695f934c8f6642149cc728571b29cbb7b770984c1088e","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"39338f84e8c4d0e3de7b3c4a7024fb3925f42100eed5cbe73be58902799dff4d","impliedFormat":1},{"version":"f1c92c0b24d678486042dfc038c7c1d6e8520fe384b82155720a42a893204588","affectsGlobalScope":true,"impliedFormat":1},{"version":"230763250f20449fa7b3c9273e1967adb0023dc890d4be1553faca658ee65971","impliedFormat":1},{"version":"c3e9078b60cb329d1221f5878e88cecfa3e74460550e605a58fcfb41a66029ff","impliedFormat":1},{"version":"8413d0641f293aed551c7464615b770d34a02dedede889b9591172287d68e773","impliedFormat":1},{"version":"441b9bb09013654aa3d050e68b06464d8959b473e85868249d9d18f692acd35b","impliedFormat":1},{"version":"bc18a1991ba681f03e13285fa1d7b99b03b67ee671b7bc936254467177543890","impliedFormat":1},{"version":"55246f15e33ff1e2e9e679b25fa9790a48db55dc63d567fe25fac8b6a0efe911","impliedFormat":1},{"version":"fa94bbf532b7af8f394b95fa310980d6e20bd2d4c871c6a6cb9f70f03750a44b","impliedFormat":1},{"version":"8bb351077998efc2d986a6a7373cba6f098a91a3679cefce3ba2aab90493161c","impliedFormat":1},{"version":"734665cf52eb63e20252412ca891601b1405f7c6abef6425f1939cbb15ed239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"7fa2214bb0d64701bc6f9ce8cde2fd2ff8c571e0b23065fa04a8a5a6beb91511","impliedFormat":1},{"version":"f36b3fbe2be150a9ca140da48593f21e6a8172004f92ddc549b43efec39f3e54","impliedFormat":1},{"version":"f12624a4a8d042b68914eac1b0a16571fc1c523173fcdf2517c65d191bd5a86c","impliedFormat":1},{"version":"b4769767f13a1692a66186e01c3aa186ff808d5ff72ed36eda8c37738fb2ac92","impliedFormat":1},{"version":"841983e39bd4cbb463be385e92fda11057cab368bf27100a801c492f1d86cbaa","impliedFormat":1},{"version":"ae6adca0538007af480cf43e20b1e7631c5321406bc515bff980a0d31252f79f","impliedFormat":1},{"version":"1ec3f3a5f04cc42df33274fbe5c0937d9a9e06f249a7a26288d7d54f0763ffd4","impliedFormat":1},{"version":"e4156ddb25aa0e3b5303d372f26957b36778f0f6bbd4326359269873295e3058","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc1b433a84cae05ddc5672d4823170af78606ad21ecef60dbc4570190cbf1357","impliedFormat":1},{"version":"e47f532d6e1617833f13a5b0710c0089d402c89c2f2b54f324e5a20e418d287a","impliedFormat":1},{"version":"7f78cfb2b343838612c192cb251746e3a7c62ac7675726a47e130d9b213f6580","impliedFormat":1},{"version":"201db9cf1687fab1adf5282fcba861f382b32303dc4f67c89d59655e78a25461","impliedFormat":1},{"version":"8e2577e7262051fd3c5bd6ca2b2056d358ff8853565720f92455860824c25188","impliedFormat":1},{"version":"5cbb49cb13edc05e52b239329932cfde34323c6bfe33020e381faa97d2300b22","impliedFormat":1},{"version":"bb9dbb4b2ad81e3e71ec5ba4314973718555b9d04ba2a17dfbf875efecb8e2c0","impliedFormat":1},{"version":"62e02b8bbc05076243cf153d10c27b3d886c7c08558dfb797f280d837881b3cd","impliedFormat":1},{"version":"045a210189ec63c5488410b33f9fca53d77d051599d0d6506d8048551399c5f3","impliedFormat":1},{"version":"99ab6d0d660ce4d21efb52288a39fd35bb3f556980ec5463b1ae8f304a3bbc85","impliedFormat":1},{"version":"3ead5b9bea1c59a375acdd494ac503f6e16a2b47cffbc31da1824fc17d023205","impliedFormat":1},{"version":"c9a2daf6cd1eb854cd5b9e424247c5e306692055738c2effd35f7871d942b76e","impliedFormat":1},{"version":"afa1c49f8e559e413d57343339db857d2a8159435cf9cf7d4deb41718fff1b88","impliedFormat":1},{"version":"bec726f1f7d2061cf17cfbb01b74283ada49933037695423f37fc91c1c2e2db6","impliedFormat":1},{"version":"afe73051ff6a03a9565cbd8ebb0e956ee3df5e913ad5c1ded64218aabfa3dcb5","impliedFormat":1},{"version":"035a5df183489c2e22f3cf59fc1ed2b043d27f357eecc0eb8d8e840059d44245","impliedFormat":1},{"version":"a4809f4d92317535e6b22b01019437030077a76fec1d93b9881c9ed4738fcc54","impliedFormat":1},{"version":"5f53fa0bd22096d2a78533f94e02c899143b8f0f9891a46965294ee8b91a9434","impliedFormat":1},{"version":"cdcc132f207d097d7d3aa75615ab9a2e71d6a478162dde8b67f88ea19f3e54de","impliedFormat":1},{"version":"0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","impliedFormat":1},{"version":"e1028394c1cf96d5d057ecc647e31e457b919092f882ed0c7092152b077fed9d","impliedFormat":1},{"version":"f315e1e65a1f80992f0509e84e4ae2df15ecd9ef73df975f7c98813b71e4c8da","impliedFormat":1},{"version":"5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e","impliedFormat":1},{"version":"3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","impliedFormat":1},{"version":"ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","impliedFormat":1},{"version":"d96cc6598148bf1a98fb2e8dcf01c63a4b3558bdaec6ef35e087fd0562eb40ec","impliedFormat":1},{"version":"f8db4fea512ab759b2223b90ecbbe7dae919c02f8ce95ec03f7fb1cf757cfbeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab82804a14454734010dcdcd43f564ff7b0389bee4c5692eec76ff5b30d4cf66","impliedFormat":1},{"version":"bae8d023ef6b23df7da26f51cea44321f95817c190342a36882e93b80d07a960","impliedFormat":1},{"version":"26a770cec4bd2e7dbba95c6e536390fffe83c6268b78974a93727903b515c4e7","impliedFormat":1}],"root":[63,113],"options":{"declaration":true,"esModuleInterop":true,"module":1,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"outDir":"./","skipLibCheck":true,"sourceMap":true,"strict":true,"strictPropertyInitialization":false,"target":10},"referencedMap":[[116,1],[114,2],[250,2],[253,3],[252,2],[119,4],[115,1],[117,5],[118,1],[246,6],[247,2],[248,7],[249,8],[258,9],[184,10],[185,10],[186,11],[122,12],[187,13],[188,14],[189,15],[190,16],[191,17],[192,18],[193,19],[194,20],[195,21],[196,21],[197,22],[198,23],[199,24],[200,25],[123,2],[121,2],[201,26],[202,27],[203,28],[204,29],[205,30],[206,29],[207,31],[208,32],[209,33],[210,34],[211,34],[212,34],[213,35],[214,36],[215,37],[216,38],[217,39],[218,40],[219,40],[220,41],[221,2],[222,2],[223,42],[224,43],[225,44],[226,42],[227,45],[228,46],[229,47],[230,48],[231,49],[232,50],[233,51],[234,52],[120,2],[245,53],[235,54],[236,55],[237,56],[238,57],[239,58],[240,59],[241,60],[124,29],[125,2],[126,61],[127,62],[128,2],[129,63],[130,2],[175,64],[176,65],[177,66],[178,66],[179,67],[180,2],[181,13],[182,68],[183,65],[242,69],[243,70],[244,71],[259,2],[260,2],[261,72],[109,73],[105,73],[65,2],[67,74],[66,75],[71,76],[107,77],[103,78],[106,79],[68,78],[69,80],[73,80],[72,81],[70,82],[104,83],[102,78],[108,84],[100,2],[101,2],[74,85],[79,78],[81,78],[76,78],[77,85],[83,78],[84,86],[75,78],[80,78],[82,78],[78,78],[98,87],[97,78],[99,88],[93,78],[95,78],[94,78],[90,78],[96,89],[91,78],[92,90],[85,78],[86,78],[87,78],[88,78],[89,78],[251,2],[257,91],[64,2],[255,92],[256,93],[254,94],[61,2],[62,2],[12,2],[11,2],[2,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[3,2],[21,2],[22,2],[4,2],[23,2],[27,2],[24,2],[25,2],[26,2],[28,2],[29,2],[30,2],[5,2],[31,2],[32,2],[33,2],[34,2],[6,2],[38,2],[35,2],[36,2],[37,2],[39,2],[7,2],[40,2],[45,2],[46,2],[41,2],[42,2],[43,2],[44,2],[8,2],[50,2],[47,2],[48,2],[49,2],[51,2],[9,2],[52,2],[53,2],[54,2],[56,2],[55,2],[57,2],[58,2],[10,2],[59,2],[1,2],[60,2],[149,95],[163,96],[146,97],[164,98],[173,99],[137,100],[138,101],[136,102],[172,6],[167,103],[171,104],[140,105],[150,106],[160,107],[139,108],[170,109],[134,110],[135,103],[141,106],[142,2],[148,111],[145,106],[132,112],[174,113],[165,114],[153,115],[152,106],[154,116],[157,117],[151,118],[155,119],[168,6],[143,120],[144,121],[158,122],[133,98],[162,123],[161,106],[147,121],[156,124],[159,125],[166,2],[131,2],[169,126],[110,2],[111,2],[112,2],[63,2],[113,127]],"version":"5.7.3"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@helixdev/helix-manifest",
3
+ "version": "0.2.1-staging.6",
4
+ "description": "HELIX Instant world manifest schema and validator — the platform contract between worlds, the CLI, the SDK, and the backend",
5
+ "main": "dist/src/index.js",
6
+ "types": "dist/src/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "schema"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsc -p tsconfig.build.json",
13
+ "lint": "eslint \"src/**/*.ts\"",
14
+ "test": "jest"
15
+ },
16
+ "dependencies": {
17
+ "ajv": "^8.17.1"
18
+ },
19
+ "devDependencies": {
20
+ "@types/jest": "^29.5.14",
21
+ "jest": "^29.7.0",
22
+ "ts-jest": "^29.2.5",
23
+ "typescript": "~5.7.3"
24
+ },
25
+ "jest": {
26
+ "moduleFileExtensions": [
27
+ "js",
28
+ "json",
29
+ "ts"
30
+ ],
31
+ "rootDir": "src",
32
+ "testRegex": ".*\\.spec\\.ts$",
33
+ "transform": {
34
+ "^.+\\.(t|j)s$": "ts-jest"
35
+ },
36
+ "testEnvironment": "node"
37
+ },
38
+ "license": "MIT",
39
+ "publishConfig": {
40
+ "access": "public",
41
+ "registry": "https://registry.npmjs.org"
42
+ }
43
+ }
@@ -0,0 +1,73 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://helix.dev/schemas/manifest-v0.1.schema.json",
4
+ "title": "HELIX Instant World Manifest v0.1",
5
+ "description": "Declares a world's identity, entry point, and the platform capabilities it is allowed to use. Lives at the bundle root as helix.json.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["helixVersion", "title", "slug", "entry"],
9
+ "properties": {
10
+ "helixVersion": {
11
+ "const": "0.1",
12
+ "description": "Manifest schema version. Determines which fields and permissions are available."
13
+ },
14
+ "title": {
15
+ "type": "string",
16
+ "minLength": 1,
17
+ "maxLength": 80,
18
+ "description": "Display name shown on the world page and in listings."
19
+ },
20
+ "slug": {
21
+ "type": "string",
22
+ "pattern": "^[a-z0-9](?:[a-z0-9-]{1,48})[a-z0-9]$",
23
+ "description": "URL identifier (3-50 chars: lowercase letters, digits, hyphens; no leading/trailing hyphen). Globally unique; the world's play URL is /g/{slug}."
24
+ },
25
+ "entry": {
26
+ "type": "string",
27
+ "pattern": "^(?!/)(?!.*\\.\\.)[A-Za-z0-9._/-]+\\.html$",
28
+ "description": "Bundle-relative path to the HTML entry point (e.g. index.html). Must not be absolute or contain '..'."
29
+ },
30
+ "maxPlayers": {
31
+ "type": "integer",
32
+ "minimum": 1,
33
+ "maximum": 100,
34
+ "default": 1,
35
+ "description": "Player slots per room. 1 = single-player. Only meaningful with the multiplayer permission (M2)."
36
+ },
37
+ "permissions": {
38
+ "type": "array",
39
+ "uniqueItems": true,
40
+ "default": [],
41
+ "items": {
42
+ "enum": ["auth.profile"]
43
+ },
44
+ "description": "Platform capabilities the world requests, OAuth-scope style. Worlds get nothing by default. v0.1 defines: auth.profile (read the player's id, username, display name). Later versions add multiplayer, voice.*, wallet.*, inventory.*."
45
+ },
46
+ "supportsMobile": {
47
+ "type": "boolean",
48
+ "default": false,
49
+ "description": "Whether the world is playable on mobile browsers. Surfaces as a compatibility tag."
50
+ },
51
+ "requiresAuth": {
52
+ "type": "boolean",
53
+ "default": false,
54
+ "description": "When true, players must log in before playing — the shell's login overlay offers no guest option, and the world page shows an 'Account required' badge. Leave false (default) for instant guest play."
55
+ },
56
+ "contentRating": {
57
+ "enum": ["unrated", "everyone", "teen", "mature"],
58
+ "default": "unrated",
59
+ "description": "Self-declared content rating. Curated review may override. 'unrated' worlds may be restricted from public listing. Maps 1:1 onto the main backend's ContentRating (Everyone/Teen/Mature); 'unrated' has no counterpart there and must be rated before catalog federation."
60
+ },
61
+ "kind": {
62
+ "enum": ["world"],
63
+ "default": "world",
64
+ "description": "What this bundle is. v0.1 accepts only 'world'; the reserved vocabulary (system, ability, asset-pack) lands with the ability-packaging milestone and maps onto the main backend's PackageType — see MAIN_BACKEND_PACKAGE_TYPE in @hypersoniclabs/helix-manifest. A system is a runtime framework that hosts abilities (the humanoid character is the first); abilities declare the system they target."
65
+ },
66
+ "version": {
67
+ "type": "string",
68
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-[0-9A-Za-z.-]+)?$",
69
+ "default": "1.0.0",
70
+ "description": "Semver identity for catalog federation with the main backend (its packages version by semver). Worlds may ignore it — builds number independently — but every stored manifest carries one so a future sync is a column map, not a translation layer."
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,85 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://helix.dev/schemas/manifest-v0.2.schema.json",
4
+ "title": "HELIX Instant World Manifest v0.2",
5
+ "description": "v0.1 plus pinned system/ability dependencies. A v0.2 world declares the systems and abilities it builds on as slug -> semver-range maps; the consumer build resolves them to exact versions and bakes the resolved CDN URLs into the immutable build. Lives at the bundle root as helix.json.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["helixVersion", "title", "slug", "entry"],
9
+ "properties": {
10
+ "helixVersion": {
11
+ "const": "0.2",
12
+ "description": "Manifest schema version. Determines which fields and permissions are available."
13
+ },
14
+ "title": {
15
+ "type": "string",
16
+ "minLength": 1,
17
+ "maxLength": 80,
18
+ "description": "Display name shown on the world page and in listings."
19
+ },
20
+ "slug": {
21
+ "type": "string",
22
+ "pattern": "^[a-z0-9](?:[a-z0-9-]{1,48})[a-z0-9]$",
23
+ "description": "URL identifier (3-50 chars: lowercase letters, digits, hyphens; no leading/trailing hyphen). Globally unique; the world's play URL is /g/{slug}."
24
+ },
25
+ "entry": {
26
+ "type": "string",
27
+ "pattern": "^(?!/)(?!.*\\.\\.)[A-Za-z0-9._/-]+\\.html$",
28
+ "description": "Bundle-relative path to the HTML entry point (e.g. index.html). Must not be absolute or contain '..'."
29
+ },
30
+ "maxPlayers": {
31
+ "type": "integer",
32
+ "minimum": 1,
33
+ "maximum": 100,
34
+ "default": 1,
35
+ "description": "Player slots per room. 1 = single-player. Only meaningful with the multiplayer permission (M2)."
36
+ },
37
+ "permissions": {
38
+ "type": "array",
39
+ "uniqueItems": true,
40
+ "default": [],
41
+ "items": {
42
+ "enum": ["auth.profile"]
43
+ },
44
+ "description": "Platform capabilities the world requests, OAuth-scope style. Worlds get nothing by default. v0.1 defines: auth.profile (read the player's id, username, display name). Later versions add multiplayer, voice.*, wallet.*, inventory.*."
45
+ },
46
+ "supportsMobile": {
47
+ "type": "boolean",
48
+ "default": false,
49
+ "description": "Whether the world is playable on mobile browsers. Surfaces as a compatibility tag."
50
+ },
51
+ "requiresAuth": {
52
+ "type": "boolean",
53
+ "default": false,
54
+ "description": "When true, players must log in before playing — the shell's login overlay offers no guest option, and the world page shows an 'Account required' badge. Leave false (default) for instant guest play."
55
+ },
56
+ "contentRating": {
57
+ "enum": ["unrated", "everyone", "teen", "mature"],
58
+ "default": "unrated",
59
+ "description": "Self-declared content rating. Curated review may override. 'unrated' worlds may be restricted from public listing. Maps 1:1 onto the main backend's ContentRating (Everyone/Teen/Mature); 'unrated' has no counterpart there and must be rated before catalog federation."
60
+ },
61
+ "kind": {
62
+ "enum": ["world"],
63
+ "default": "world",
64
+ "description": "What this bundle is. v0.2 worlds still set 'world'; the reserved vocabulary (system, ability, asset-pack) uses the package envelope, not this manifest."
65
+ },
66
+ "version": {
67
+ "type": "string",
68
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-[0-9A-Za-z.-]+)?$",
69
+ "default": "1.0.0",
70
+ "description": "Semver identity for catalog federation with the main backend (its packages version by semver). Worlds may ignore it — builds number independently — but every stored manifest carries one so a future sync is a column map, not a translation layer."
71
+ },
72
+ "systems": {
73
+ "type": "object",
74
+ "additionalProperties": { "type": "string", "minLength": 1 },
75
+ "propertyNames": { "pattern": "^[a-z0-9](?:[a-z0-9-]{1,48})[a-z0-9]$" },
76
+ "description": "Pinned system dependencies as slug -> semver range (e.g. { \"humanoid-character\": \"^0.1\" }). Resolved to exact active versions at build; the resolved code + asset-pack CDN bases are baked into the immutable build. The asset-pack is discovered via the system's own envelope, not pinned here."
77
+ },
78
+ "abilities": {
79
+ "type": "object",
80
+ "additionalProperties": { "type": "string", "minLength": 1 },
81
+ "propertyNames": { "pattern": "^[a-z0-9](?:[a-z0-9-]{1,48})[a-z0-9]$" },
82
+ "description": "Pinned ability dependencies as slug -> semver range (e.g. { \"fly\": \"^0.1\", \"swim\": \"^0.1\" }). Resolved to exact active versions at build; each ability's code + asset CDN base are baked into the immutable build."
83
+ }
84
+ }
85
+ }
@@ -0,0 +1,95 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://helix.dev/schemas/package-envelope-v1.schema.json",
4
+ "title": "HELIX Package Envelope v1",
5
+ "description": "Thin platform envelope for non-world bundles (system | ability | asset-pack). Derived by the CLI at publish from the system payload (e.g. ability.json); the platform never learns system concepts. Worlds keep their own helix.json (manifest-v0.1) — this envelope is for the ability-packaging milestone's reserved kinds.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["envelopeVersion", "kind", "slug", "version", "title"],
9
+ "properties": {
10
+ "envelopeVersion": {
11
+ "const": "1",
12
+ "description": "Envelope schema version. Determines which fields are available."
13
+ },
14
+ "kind": {
15
+ "enum": ["system", "ability", "asset-pack"],
16
+ "description": "What this bundle is. A system is a versioned runtime framework that hosts abilities (the humanoid character is the first); an ability declares the system it targets; an asset-pack is CDN-served content (clips/textures/sounds) with no runtime code. Maps onto the main backend's PackageType via MAIN_BACKEND_PACKAGE_TYPE."
17
+ },
18
+ "slug": {
19
+ "type": "string",
20
+ "pattern": "^[a-z0-9](?:[a-z0-9-]{1,48})[a-z0-9]$",
21
+ "description": "Globally unique, stable identifier (3-50 chars: lowercase letters, digits, hyphens; no leading/trailing hyphen). The federation/lookup key — for abilities this is the ability id; for the character system it is 'humanoid-character'."
22
+ },
23
+ "version": {
24
+ "type": "string",
25
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-[0-9A-Za-z.-]+)?$",
26
+ "description": "Semver identity (the resolution key abilities pin with ^/~ ranges). Every published version carries one; the platform also assigns a sequential revision."
27
+ },
28
+ "title": {
29
+ "type": "string",
30
+ "minLength": 1,
31
+ "maxLength": 80,
32
+ "description": "Display name shown in catalog listings."
33
+ },
34
+ "description": {
35
+ "type": "string",
36
+ "maxLength": 2000,
37
+ "default": "",
38
+ "description": "Human/agent-readable summary surfaced in discovery."
39
+ },
40
+ "entry": {
41
+ "type": "string",
42
+ "pattern": "^(?!/)(?!.*\\.\\.)[A-Za-z0-9._/-]+$",
43
+ "description": "Bundle-relative path to the code entry (e.g. index.js). Required for system and ability; omitted for asset-pack (which ships no code). Must not be absolute or contain '..'."
44
+ },
45
+ "system": {
46
+ "type": "object",
47
+ "additionalProperties": false,
48
+ "required": ["id", "version"],
49
+ "properties": {
50
+ "id": {
51
+ "type": "string",
52
+ "description": "Host system id this ability targets (e.g. humanoid-character)."
53
+ },
54
+ "version": {
55
+ "type": "string",
56
+ "description": "Host system semver range (e.g. ^1.0.0)."
57
+ }
58
+ },
59
+ "description": "Abilities only: the host system pin, lifted into indexed catalog columns at finalize (the one payload read the platform performs)."
60
+ },
61
+ "assetPack": {
62
+ "type": "object",
63
+ "additionalProperties": false,
64
+ "required": ["slug", "range"],
65
+ "properties": {
66
+ "slug": {
67
+ "type": "string",
68
+ "pattern": "^[a-z0-9](?:[a-z0-9-]{1,48})[a-z0-9]$",
69
+ "description": "The base asset-pack slug this system's code requires (e.g. humanoid-character-assets)."
70
+ },
71
+ "range": {
72
+ "type": "string",
73
+ "minLength": 1,
74
+ "description": "Semver range for the asset-pack (e.g. ^0.1). The system owns the compat range; the consumer resolves it in-range and bakes the pack's CDN base."
75
+ }
76
+ },
77
+ "description": "Systems only (optional): the base asset-pack this system's runtime needs. The consumer build resolves it and bakes its assetBaseUrl; abilities/asset-packs omit it. A system without it falls back to the <slug>-assets@latest convention."
78
+ },
79
+ "three": {
80
+ "type": "string",
81
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$",
82
+ "description": "Systems only (optional): the full three.js version this system's code was built against (e.g. 0.172.0). `helix install` points the world's import map + KTX2 transcoder path at the platform-hosted runtime/three/<version>/ — the single shared three instance — so the world never bundles its own copy."
83
+ }
84
+ },
85
+ "allOf": [
86
+ {
87
+ "if": { "required": ["kind"], "properties": { "kind": { "const": "ability" } } },
88
+ "then": { "required": ["entry", "system"] }
89
+ },
90
+ {
91
+ "if": { "required": ["kind"], "properties": { "kind": { "const": "system" } } },
92
+ "then": { "required": ["entry"] }
93
+ }
94
+ ]
95
+ }