@helix3/helix-cli 0.1.13-helix3.52 → 0.1.13-helix3.54
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/README.md +42 -3
- package/dist/api.d.ts +1 -0
- package/dist/api.js +20 -0
- package/dist/api.js.map +1 -1
- package/dist/assets.d.ts +148 -0
- package/dist/assets.js +246 -0
- package/dist/assets.js.map +1 -0
- package/dist/config.js +17 -3
- package/dist/config.js.map +1 -1
- package/dist/index.js +401 -4
- package/dist/index.js.map +1 -1
- package/dist/init.js +65 -7
- package/dist/init.js.map +1 -1
- package/dist/item.d.ts +135 -0
- package/dist/item.js +481 -0
- package/dist/item.js.map +1 -0
- package/dist/lib.d.ts +101 -1
- package/dist/lib.js +220 -7
- package/dist/lib.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
backend. It shares bundle validation with the server via `@hypersoniclabs/helix-manifest`, so "validate passed but
|
|
5
5
|
publish failed" can't happen for contract reasons.
|
|
6
6
|
|
|
7
|
+
## Architecture boundary
|
|
8
|
+
|
|
9
|
+
All creator feature and operational logic, validation, file mutation, network behavior, and tests
|
|
10
|
+
live here. MCP packages may expose transport schemas, resources, instructions, and thin delegation
|
|
11
|
+
to these commands, but must not reimplement this logic.
|
|
12
|
+
|
|
7
13
|
## Install
|
|
8
14
|
|
|
9
15
|
```bash
|
|
@@ -35,8 +41,14 @@ The token is stored in `~/.helix/credentials.json` (mode `600`). It's sent as
|
|
|
35
41
|
| `helix init <dir>` | Scaffold a minimal Three.js world (`helix.json` + `index.html` + `main.js`). |
|
|
36
42
|
| `helix install [--update]` | Resolve a world's `systems`/`abilities` pins (a v0.2 **or v0.3** manifest) → materialize the modules, the `three` import map, and `helix.runtime.ts`. |
|
|
37
43
|
| `helix validate [dir]` | Validate a bundle locally — the exact rules the server enforces. |
|
|
38
|
-
| `helix publish [dir]` | Validate → resolve/create the world → upload files → finalize → print the play URL. |
|
|
44
|
+
| `helix publish [dir] [--thumbnail <file>]` | Validate → resolve/create the world → upload files → finalize → set the cover image → print the play URL. |
|
|
39
45
|
| `helix list` | List your worlds. |
|
|
46
|
+
| `helix item list-slots [--json]` | Print the Character-Creator vocabulary a wearable declares: the cosmetic slot tags, and the genders. |
|
|
47
|
+
| `helix item publish <mesh.glb> --title <t> [--kind <k>] [--slot <tag>] [--gender <g>] [--price-lix <n> \| --personal] [--thumbnail <f>] [--dry-run]` | Publish a universal item (wearable / avatar / home item) from one `.glb`; the server verifies the mesh inline. |
|
|
48
|
+
| `helix preview-video <slug> <youtube-url>` | Set or clear a published world's YouTube preview. |
|
|
49
|
+
| `helix thumbnail set <slug> <file>` | Upload a thumbnail or preview image through the CLI-owned media path. |
|
|
50
|
+
| `helix assets materials\|material\|search\|get\|install` | Discover platform materials and Vault assets, then install immutable assets with provenance receipts. |
|
|
51
|
+
| `helix assets generate\|resume\|generate-image\|generate-audio\|generate-environment` | Run Dreamer asset generation and resume existing jobs. |
|
|
40
52
|
| `helix doctor [--project <dir>]` | Print the environment + whether the @helix toolchain (CLI/MCP/SDK/manifest) is current. |
|
|
41
53
|
|
|
42
54
|
## Publish flow
|
|
@@ -51,8 +63,35 @@ The token is stored in `~/.helix/credentials.json` (mode `600`). It's sent as
|
|
|
51
63
|
5. `POST /api/v1/instant-worlds/:id/builds/:buildId/finalize` → byte-exact verify, activate, publish.
|
|
52
64
|
6. `GET /api/v1/instant-worlds/:slug` → the play URL.
|
|
53
65
|
|
|
54
|
-
The programmatic surface (`publishWorld`, `checkBundle`, `whoAmI`, …) is exported
|
|
55
|
-
|
|
66
|
+
The programmatic surface (`publishWorld`, `checkBundle`, `whoAmI`, …) is exported for other CLI
|
|
67
|
+
modules. Agent integrations should instruct or delegate to the `helix` commands above rather than
|
|
68
|
+
reimplementing operational behavior in a transport package.
|
|
69
|
+
|
|
70
|
+
## Item publish flow
|
|
71
|
+
|
|
72
|
+
`helix item publish` is a different shape from a world publish: one mesh, one round trip, an
|
|
73
|
+
inline verdict — which is what an editor (Helix Studio) needs when an artist clicks Publish.
|
|
74
|
+
|
|
75
|
+
1. Local validation, before anything leaves the machine: the `--kind`, the Character-Creator
|
|
76
|
+
`--slot` and `--gender` (**both required** for a wearable, exact-match), the title/slug/tag
|
|
77
|
+
limits, and the GLB container magic. `--dry-run` stops here and prints exactly what would be
|
|
78
|
+
sent.
|
|
79
|
+
2. `POST /api/v1/universal-items/upload` — `multipart/form-data` with a `mesh` file part, an
|
|
80
|
+
optional `thumbnail` file part, and the metadata as ONE JSON string in `payload`.
|
|
81
|
+
3. The server verifies the mesh **inline** (triangles, texture edges, materials, and — for a
|
|
82
|
+
wearable — whether it is a skinned garment or a rigid socketed accessory) and returns the
|
|
83
|
+
created item together with the verification verdict and warnings.
|
|
84
|
+
|
|
85
|
+
The slot table in `src/item.ts` MIRRORS `helix-backend-api → src/universal-items/cc-wearable-slot.ts`,
|
|
86
|
+
and the gender list mirrors `src/universal-items/cc-gender.ts` the same way. They are a local fast
|
|
87
|
+
path so a typo costs no upload; the server remains the authority and its 400 lists every valid
|
|
88
|
+
value. Adding a slot or a gender means editing both, in the same PR wave.
|
|
89
|
+
|
|
90
|
+
`--gender` takes `male`, `female`, or `male,female`, and is **required** for `--kind wearable`.
|
|
91
|
+
There is no `both`/`unisex`/`all`: Unreal's cosmetics enum has exactly Male and Female, so a garment
|
|
92
|
+
that fits every body names both — one HELIX row with `{male, female}` is the web equivalent of
|
|
93
|
+
Unreal's two entries sharing one mesh. The field goes on the wire as `genders`; `ccGenders` is the
|
|
94
|
+
database column and the backend rejects it by name rather than dropping it in silence.
|
|
56
95
|
|
|
57
96
|
## Develop
|
|
58
97
|
|
package/dist/api.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ export declare class HelixApi {
|
|
|
18
18
|
setToken(token: string): void;
|
|
19
19
|
request<T>(method: string, path: string, body?: unknown): Promise<T>;
|
|
20
20
|
requestItem<T>(method: string, path: string, body?: unknown): Promise<T>;
|
|
21
|
+
postMultipart<T>(path: string, form: FormData): Promise<T>;
|
|
21
22
|
static forCredentials(creds: CliCredentials): HelixApi;
|
|
22
23
|
}
|
|
23
24
|
export declare function uploadToTicket(url: string, body: Buffer, contentType: string, cacheControl?: string): Promise<void>;
|
package/dist/api.js
CHANGED
|
@@ -59,6 +59,26 @@ class HelixApi {
|
|
|
59
59
|
const envelope = await this.request(method, path, body);
|
|
60
60
|
return envelope.item;
|
|
61
61
|
}
|
|
62
|
+
// multipart/form-data POST — for the endpoints that take file parts alongside
|
|
63
|
+
// JSON (universal-item uploads). Deliberately does NOT set content-type: the
|
|
64
|
+
// boundary is generated by the runtime and a hand-written header loses it,
|
|
65
|
+
// which the server sees as a malformed body. Uses Node's built-in FormData /
|
|
66
|
+
// Blob (globals since Node 18, same undici that already backs `fetch` above),
|
|
67
|
+
// so multipart needs no dependency.
|
|
68
|
+
async postMultipart(path, form) {
|
|
69
|
+
const res = await fetch(`${this.baseUrl}${path}`, {
|
|
70
|
+
method: 'POST',
|
|
71
|
+
headers: this.token ? { authorization: `Bearer ${this.token}` } : {},
|
|
72
|
+
body: form,
|
|
73
|
+
});
|
|
74
|
+
if (!res.ok) {
|
|
75
|
+
const problem = (await res.json().catch(() => ({})));
|
|
76
|
+
throw new ApiError(res.status, problem);
|
|
77
|
+
}
|
|
78
|
+
if (res.status === 204)
|
|
79
|
+
return undefined;
|
|
80
|
+
return (await res.json());
|
|
81
|
+
}
|
|
62
82
|
static forCredentials(creds) {
|
|
63
83
|
return new HelixApi(creds.apiUrl, creds.token);
|
|
64
84
|
}
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/assets.d.ts
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { CliCredentials } from './config';
|
|
2
|
+
export type DreamerAssetKind = 'prop' | 'character';
|
|
3
|
+
export type StandaloneAssetKind = 'image' | 'audio' | 'gaussian_splat' | 'animation';
|
|
4
|
+
export type DreamerApprovalGate = 'concept' | 'preview';
|
|
5
|
+
export type DreamerAssetJob = {
|
|
6
|
+
id: string;
|
|
7
|
+
status: string;
|
|
8
|
+
currentStage?: string;
|
|
9
|
+
title?: string;
|
|
10
|
+
awaitingApproval: {
|
|
11
|
+
gate: DreamerApprovalGate;
|
|
12
|
+
} | null;
|
|
13
|
+
sparkSpentTotal?: number;
|
|
14
|
+
error?: string;
|
|
15
|
+
publishedItemId?: string | null;
|
|
16
|
+
artifacts?: {
|
|
17
|
+
meshUrl?: string;
|
|
18
|
+
thumbnailUrl?: string;
|
|
19
|
+
referenceSheetUrl?: string;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export type GenerateAssetInput = {
|
|
23
|
+
kind: DreamerAssetKind;
|
|
24
|
+
prompt: string;
|
|
25
|
+
title?: string;
|
|
26
|
+
additionalPrompt?: string;
|
|
27
|
+
targetPolycount?: number;
|
|
28
|
+
};
|
|
29
|
+
export type GenerateAssetOptions = {
|
|
30
|
+
pollIntervalMs?: number;
|
|
31
|
+
timeoutMs?: number;
|
|
32
|
+
visibility?: 'public' | 'unlisted' | 'private';
|
|
33
|
+
onProgress?: (job: DreamerAssetJob) => void;
|
|
34
|
+
};
|
|
35
|
+
export type StandaloneGeneratedAsset = {
|
|
36
|
+
jobId: string;
|
|
37
|
+
status: 'queued' | 'running' | 'succeeded' | 'failed';
|
|
38
|
+
asset?: {
|
|
39
|
+
url: string;
|
|
40
|
+
contentType: string;
|
|
41
|
+
sizeBytes: number;
|
|
42
|
+
kind: Exclude<StandaloneAssetKind, 'animation'>;
|
|
43
|
+
};
|
|
44
|
+
error?: string;
|
|
45
|
+
units?: number;
|
|
46
|
+
vaultAssetId?: string | null;
|
|
47
|
+
vaultAutoPublish?: 'published' | 'disabled';
|
|
48
|
+
};
|
|
49
|
+
export type VaultAssetSummary = {
|
|
50
|
+
assetId: string;
|
|
51
|
+
slug: string;
|
|
52
|
+
title: string;
|
|
53
|
+
kind: string;
|
|
54
|
+
origin: string;
|
|
55
|
+
visibility: string;
|
|
56
|
+
artifactUrl?: string;
|
|
57
|
+
mimeType?: string;
|
|
58
|
+
artifactMimeType?: string;
|
|
59
|
+
currentVersion?: number;
|
|
60
|
+
[key: string]: unknown;
|
|
61
|
+
};
|
|
62
|
+
export type VaultAssetDetail = VaultAssetSummary & {
|
|
63
|
+
artifact?: {
|
|
64
|
+
url: string;
|
|
65
|
+
mimeType?: string;
|
|
66
|
+
sizeBytes?: number;
|
|
67
|
+
version?: number;
|
|
68
|
+
checksumSha256?: string;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
export type VaultAssetSearch = {
|
|
72
|
+
q?: string;
|
|
73
|
+
kind?: string[];
|
|
74
|
+
skeleton?: string;
|
|
75
|
+
engine?: string;
|
|
76
|
+
license?: string;
|
|
77
|
+
source?: string;
|
|
78
|
+
origin?: string;
|
|
79
|
+
creatorId?: string;
|
|
80
|
+
page?: number;
|
|
81
|
+
limit?: number;
|
|
82
|
+
};
|
|
83
|
+
export type InstalledVaultAsset = {
|
|
84
|
+
assetId: string;
|
|
85
|
+
slug: string;
|
|
86
|
+
kind: string;
|
|
87
|
+
version: number | null;
|
|
88
|
+
path: string;
|
|
89
|
+
sourceUrl: string;
|
|
90
|
+
checksumSha256: string;
|
|
91
|
+
};
|
|
92
|
+
export type MaterialCatalogEntry = {
|
|
93
|
+
id: string;
|
|
94
|
+
name: string;
|
|
95
|
+
category: string;
|
|
96
|
+
kind: 'texture' | 'glass' | 'procedural_water';
|
|
97
|
+
tags: string[];
|
|
98
|
+
maps?: {
|
|
99
|
+
albedo: string;
|
|
100
|
+
normal: string;
|
|
101
|
+
orm: string;
|
|
102
|
+
};
|
|
103
|
+
[key: string]: unknown;
|
|
104
|
+
};
|
|
105
|
+
export type MaterialCatalogResult = {
|
|
106
|
+
slug: string;
|
|
107
|
+
version: string;
|
|
108
|
+
assetBaseUrl: string;
|
|
109
|
+
materials: MaterialCatalogEntry[];
|
|
110
|
+
};
|
|
111
|
+
export declare function generateAndPublishAsset(creds: CliCredentials, input: GenerateAssetInput, options?: GenerateAssetOptions): Promise<DreamerAssetJob>;
|
|
112
|
+
export declare function resumeAndPublishAsset(creds: CliCredentials, jobId: string, options?: GenerateAssetOptions): Promise<DreamerAssetJob>;
|
|
113
|
+
export declare function generateStandaloneAsset(creds: CliCredentials, input: {
|
|
114
|
+
kind: StandaloneAssetKind;
|
|
115
|
+
prompt: string;
|
|
116
|
+
additionalPrompt?: string;
|
|
117
|
+
projectId?: string;
|
|
118
|
+
title?: string;
|
|
119
|
+
loop?: boolean;
|
|
120
|
+
durationSeconds?: number;
|
|
121
|
+
}, options?: {
|
|
122
|
+
pollIntervalMs?: number;
|
|
123
|
+
timeoutMs?: number;
|
|
124
|
+
onProgress?: (job: StandaloneGeneratedAsset) => void;
|
|
125
|
+
}): Promise<StandaloneGeneratedAsset>;
|
|
126
|
+
export declare function generateImage(creds: CliCredentials, input: {
|
|
127
|
+
prompt: string;
|
|
128
|
+
additionalPrompt?: string;
|
|
129
|
+
projectId?: string;
|
|
130
|
+
}, options?: {
|
|
131
|
+
pollIntervalMs?: number;
|
|
132
|
+
timeoutMs?: number;
|
|
133
|
+
onProgress?: (job: StandaloneGeneratedAsset) => void;
|
|
134
|
+
}): Promise<StandaloneGeneratedAsset>;
|
|
135
|
+
export declare function searchVaultAssets(apiUrl: string, query?: VaultAssetSearch, creds?: CliCredentials): Promise<{
|
|
136
|
+
items: VaultAssetSummary[];
|
|
137
|
+
totalItems: number;
|
|
138
|
+
}>;
|
|
139
|
+
export declare function getVaultAsset(apiUrl: string, assetId: string, creds?: CliCredentials): Promise<VaultAssetDetail>;
|
|
140
|
+
export declare function installVaultAsset(worldDir: string, apiUrl: string, assetId: string, creds?: CliCredentials): Promise<InstalledVaultAsset>;
|
|
141
|
+
export declare function listMaterials(apiUrl: string, query?: {
|
|
142
|
+
q?: string;
|
|
143
|
+
category?: string;
|
|
144
|
+
limit?: number;
|
|
145
|
+
}, slug?: string): Promise<MaterialCatalogResult>;
|
|
146
|
+
export declare function resolveMaterial(apiUrl: string, id: string, slug?: string): Promise<MaterialCatalogEntry & {
|
|
147
|
+
resolvedMaps?: Record<string, string>;
|
|
148
|
+
}>;
|
package/dist/assets.js
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateAndPublishAsset = generateAndPublishAsset;
|
|
4
|
+
exports.resumeAndPublishAsset = resumeAndPublishAsset;
|
|
5
|
+
exports.generateStandaloneAsset = generateStandaloneAsset;
|
|
6
|
+
exports.generateImage = generateImage;
|
|
7
|
+
exports.searchVaultAssets = searchVaultAssets;
|
|
8
|
+
exports.getVaultAsset = getVaultAsset;
|
|
9
|
+
exports.installVaultAsset = installVaultAsset;
|
|
10
|
+
exports.listMaterials = listMaterials;
|
|
11
|
+
exports.resolveMaterial = resolveMaterial;
|
|
12
|
+
const node_crypto_1 = require("node:crypto");
|
|
13
|
+
const promises_1 = require("node:fs/promises");
|
|
14
|
+
const node_path_1 = require("node:path");
|
|
15
|
+
const api_1 = require("./api");
|
|
16
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
17
|
+
function isTerminalFailure(job) {
|
|
18
|
+
return ['failed', 'blocked_insufficient_spark', 'cancelled'].includes(job.status);
|
|
19
|
+
}
|
|
20
|
+
async function generateAndPublishAsset(creds, input, options = {}) {
|
|
21
|
+
const api = api_1.HelixApi.forCredentials(creds);
|
|
22
|
+
const job = await api.request('POST', '/api/v1/dreamer/generate', {
|
|
23
|
+
...input,
|
|
24
|
+
kind: input.kind === 'prop' ? 'home_item' : 'avatar',
|
|
25
|
+
});
|
|
26
|
+
return driveDreamerAssetJob(api, job, options);
|
|
27
|
+
}
|
|
28
|
+
async function resumeAndPublishAsset(creds, jobId, options = {}) {
|
|
29
|
+
const api = api_1.HelixApi.forCredentials(creds);
|
|
30
|
+
const job = await api.request('GET', `/api/v1/dreamer/jobs/${encodeURIComponent(jobId)}`);
|
|
31
|
+
return driveDreamerAssetJob(api, job, options);
|
|
32
|
+
}
|
|
33
|
+
async function driveDreamerAssetJob(api, initialJob, options) {
|
|
34
|
+
const pollIntervalMs = options.pollIntervalMs ?? 2_000;
|
|
35
|
+
const deadline = Date.now() + (options.timeoutMs ?? 20 * 60_000);
|
|
36
|
+
let job = initialJob;
|
|
37
|
+
const approved = new Set();
|
|
38
|
+
while (Date.now() < deadline) {
|
|
39
|
+
options.onProgress?.(job);
|
|
40
|
+
if (isTerminalFailure(job)) {
|
|
41
|
+
throw new Error(`Dreamer asset generation ${job.status}: ${job.error ?? 'no details'}`);
|
|
42
|
+
}
|
|
43
|
+
if (job.publishedItemId)
|
|
44
|
+
return job;
|
|
45
|
+
const gate = job.awaitingApproval?.gate;
|
|
46
|
+
if (gate && !approved.has(gate)) {
|
|
47
|
+
job = await api.request('POST', `/api/v1/dreamer/jobs/${encodeURIComponent(job.id)}/approve`, { gate });
|
|
48
|
+
approved.add(gate);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (!job.awaitingApproval &&
|
|
52
|
+
(job.status === 'preview_ready' || job.currentStage === 'publish')) {
|
|
53
|
+
job = await api.request('POST', `/api/v1/dreamer/jobs/${encodeURIComponent(job.id)}/publish`, { visibility: options.visibility ?? 'public' });
|
|
54
|
+
if (job.publishedItemId)
|
|
55
|
+
return job;
|
|
56
|
+
}
|
|
57
|
+
await sleep(pollIntervalMs);
|
|
58
|
+
job = await api.request('GET', `/api/v1/dreamer/jobs/${encodeURIComponent(job.id)}`);
|
|
59
|
+
}
|
|
60
|
+
throw new Error(`Dreamer asset generation job ${job.id} timed out after ${options.timeoutMs ?? 20 * 60_000}ms at ${job.status}:${job.awaitingApproval?.gate ?? job.currentStage ?? 'unknown'}`);
|
|
61
|
+
}
|
|
62
|
+
async function generateStandaloneAsset(creds, input, options = {}) {
|
|
63
|
+
const api = api_1.HelixApi.forCredentials(creds);
|
|
64
|
+
const pollIntervalMs = options.pollIntervalMs ?? 2_000;
|
|
65
|
+
const deadline = Date.now() + (options.timeoutMs ?? 10 * 60_000);
|
|
66
|
+
const accepted = await api.request('POST', '/api/v1/dreamer/assets/generate', input);
|
|
67
|
+
while (Date.now() < deadline) {
|
|
68
|
+
const job = await api.request('GET', `/api/v1/dreamer/assets/jobs/${encodeURIComponent(accepted.jobId)}`);
|
|
69
|
+
options.onProgress?.(job);
|
|
70
|
+
if (job.status === 'succeeded')
|
|
71
|
+
return job;
|
|
72
|
+
if (job.status === 'failed') {
|
|
73
|
+
throw new Error(`Dreamer ${input.kind} generation failed: ${job.error ?? 'no details'}`);
|
|
74
|
+
}
|
|
75
|
+
await sleep(pollIntervalMs);
|
|
76
|
+
}
|
|
77
|
+
throw new Error(`Dreamer ${input.kind} generation job ${accepted.jobId} timed out after ${options.timeoutMs ?? 10 * 60_000}ms`);
|
|
78
|
+
}
|
|
79
|
+
function generateImage(creds, input, options = {}) {
|
|
80
|
+
return generateStandaloneAsset(creds, { kind: 'image', ...input }, options);
|
|
81
|
+
}
|
|
82
|
+
async function searchVaultAssets(apiUrl, query = {}, creds) {
|
|
83
|
+
const api = creds ? api_1.HelixApi.forCredentials(creds) : new api_1.HelixApi(apiUrl);
|
|
84
|
+
const params = new URLSearchParams();
|
|
85
|
+
if (query.q)
|
|
86
|
+
params.set('q', query.q);
|
|
87
|
+
for (const kind of query.kind ?? [])
|
|
88
|
+
params.append('kind', kind);
|
|
89
|
+
for (const key of ['skeleton', 'engine', 'license', 'source', 'origin', 'creatorId']) {
|
|
90
|
+
if (query[key])
|
|
91
|
+
params.set(key, String(query[key]));
|
|
92
|
+
}
|
|
93
|
+
if (query.page)
|
|
94
|
+
params.set('page', String(query.page));
|
|
95
|
+
if (query.limit)
|
|
96
|
+
params.set('limit', String(query.limit));
|
|
97
|
+
const suffix = params.size ? `?${params}` : '';
|
|
98
|
+
return api.request('GET', `/api/v1/vault/assets${suffix}`);
|
|
99
|
+
}
|
|
100
|
+
function getVaultAsset(apiUrl, assetId, creds) {
|
|
101
|
+
const api = creds ? api_1.HelixApi.forCredentials(creds) : new api_1.HelixApi(apiUrl);
|
|
102
|
+
return api.request('GET', `/api/v1/vault/assets/${encodeURIComponent(assetId)}`);
|
|
103
|
+
}
|
|
104
|
+
function extensionFor(url, mimeType) {
|
|
105
|
+
const fromUrl = (0, node_path_1.extname)(new URL(url).pathname).toLowerCase();
|
|
106
|
+
if (/^\.[a-z0-9]{2,5}$/.test(fromUrl))
|
|
107
|
+
return fromUrl;
|
|
108
|
+
const byMime = {
|
|
109
|
+
'model/gltf-binary': '.glb',
|
|
110
|
+
'model/gltf+json': '.gltf',
|
|
111
|
+
'image/png': '.png',
|
|
112
|
+
'image/jpeg': '.jpg',
|
|
113
|
+
'image/webp': '.webp',
|
|
114
|
+
'audio/mpeg': '.mp3',
|
|
115
|
+
'audio/ogg': '.ogg',
|
|
116
|
+
};
|
|
117
|
+
return byMime[mimeType ?? ''] ?? '.bin';
|
|
118
|
+
}
|
|
119
|
+
async function installVaultAsset(worldDir, apiUrl, assetId, creds) {
|
|
120
|
+
const detail = await getVaultAsset(apiUrl, assetId, creds);
|
|
121
|
+
const artifactUrl = detail.artifact?.url ?? detail.artifactUrl;
|
|
122
|
+
if (!artifactUrl)
|
|
123
|
+
throw new Error(`Vault asset ${assetId} has no downloadable artifact`);
|
|
124
|
+
const version = detail.artifact?.version ?? detail.currentVersion ?? null;
|
|
125
|
+
const downloadUrl = `${apiUrl.replace(/\/+$/, '')}/api/v1/vault/assets/${encodeURIComponent(assetId)}/download${version ? `?version=${version}` : ''}`;
|
|
126
|
+
const response = await fetch(downloadUrl, {
|
|
127
|
+
headers: creds?.token ? { authorization: `Bearer ${creds.token}` } : {},
|
|
128
|
+
});
|
|
129
|
+
if (!response.ok) {
|
|
130
|
+
throw new Error(`Vault asset download failed (${response.status})`);
|
|
131
|
+
}
|
|
132
|
+
const bytes = Buffer.from(await response.arrayBuffer());
|
|
133
|
+
const extension = extensionFor(artifactUrl, detail.artifact?.mimeType ?? detail.artifactMimeType ?? detail.mimeType);
|
|
134
|
+
const safeSlug = (detail.slug || (0, node_path_1.basename)(new URL(artifactUrl).pathname, extension) || 'asset')
|
|
135
|
+
.replace(/[^a-z0-9-]+/gi, '-')
|
|
136
|
+
.replace(/^-+|-+$/g, '')
|
|
137
|
+
.toLowerCase();
|
|
138
|
+
const relativePath = (0, node_path_1.join)('public', 'assets', 'vault', assetId, `${safeSlug}${extension}`);
|
|
139
|
+
const outputPath = (0, node_path_1.join)(worldDir, relativePath);
|
|
140
|
+
await (0, promises_1.mkdir)((0, node_path_1.join)(worldDir, 'public', 'assets', 'vault', assetId), { recursive: true });
|
|
141
|
+
await (0, promises_1.writeFile)(outputPath, bytes);
|
|
142
|
+
const receiptPath = (0, node_path_1.join)(worldDir, 'public', 'helix.assets.json');
|
|
143
|
+
let prior = {
|
|
144
|
+
version: 1,
|
|
145
|
+
vaultAssets: [],
|
|
146
|
+
assets: [],
|
|
147
|
+
};
|
|
148
|
+
try {
|
|
149
|
+
prior = JSON.parse(await (0, promises_1.readFile)(receiptPath, 'utf8'));
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// First installed Vault asset in this world.
|
|
153
|
+
}
|
|
154
|
+
const installed = {
|
|
155
|
+
assetId,
|
|
156
|
+
slug: detail.slug,
|
|
157
|
+
kind: detail.kind,
|
|
158
|
+
version,
|
|
159
|
+
path: relativePath,
|
|
160
|
+
sourceUrl: downloadUrl,
|
|
161
|
+
checksumSha256: (0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex'),
|
|
162
|
+
};
|
|
163
|
+
const artifactKey = new URL(artifactUrl).pathname.replace(/^\/+/, '');
|
|
164
|
+
prior.vaultAssets = [
|
|
165
|
+
...(prior.vaultAssets ?? []).filter((entry) => entry.assetId !== assetId),
|
|
166
|
+
{
|
|
167
|
+
assetId,
|
|
168
|
+
version,
|
|
169
|
+
kind: detail.kind,
|
|
170
|
+
artifactKey,
|
|
171
|
+
integrity: `sha256-${installed.checksumSha256}`,
|
|
172
|
+
},
|
|
173
|
+
];
|
|
174
|
+
prior.assets = [
|
|
175
|
+
...(prior.assets ?? []).filter((entry) => entry.assetId !== assetId),
|
|
176
|
+
{
|
|
177
|
+
assetId,
|
|
178
|
+
path: relativePath.replace(/^public[\\/]/, '').replaceAll('\\', '/'),
|
|
179
|
+
provenance: 'vault',
|
|
180
|
+
source: 'Vault',
|
|
181
|
+
...(typeof detail.license === 'string' ? { licence: detail.license } : {}),
|
|
182
|
+
},
|
|
183
|
+
];
|
|
184
|
+
const temporaryReceipt = `${receiptPath}.tmp-${process.pid}`;
|
|
185
|
+
await (0, promises_1.writeFile)(temporaryReceipt, `${JSON.stringify(prior, null, 2)}\n`);
|
|
186
|
+
await (0, promises_1.rename)(temporaryReceipt, receiptPath);
|
|
187
|
+
return installed;
|
|
188
|
+
}
|
|
189
|
+
function assetBaseFromManifest(manifest) {
|
|
190
|
+
const direct = manifest.assetBaseUrl;
|
|
191
|
+
if (typeof direct === 'string')
|
|
192
|
+
return direct;
|
|
193
|
+
const payload = manifest.payload;
|
|
194
|
+
if (payload && typeof payload === 'object') {
|
|
195
|
+
const nested = payload.assetBaseUrl;
|
|
196
|
+
if (typeof nested === 'string')
|
|
197
|
+
return nested;
|
|
198
|
+
}
|
|
199
|
+
throw new Error('Material pack manifest does not expose assetBaseUrl');
|
|
200
|
+
}
|
|
201
|
+
async function listMaterials(apiUrl, query = {}, slug = 'helix-materials') {
|
|
202
|
+
const api = new api_1.HelixApi(apiUrl);
|
|
203
|
+
const manifest = await api.requestItem('GET', `/api/v1/instant-packages/${encodeURIComponent(slug)}/versions/latest`);
|
|
204
|
+
const assetBaseUrl = assetBaseFromManifest(manifest).replace(/\/+$/, '');
|
|
205
|
+
const response = await fetch(`${assetBaseUrl}/catalog.json`);
|
|
206
|
+
if (!response.ok)
|
|
207
|
+
throw new Error(`Material catalog request failed (${response.status})`);
|
|
208
|
+
const catalog = (await response.json());
|
|
209
|
+
if (!Array.isArray(catalog.materials))
|
|
210
|
+
throw new Error('Material catalog is invalid');
|
|
211
|
+
const needle = query.q?.trim().toLowerCase() ?? '';
|
|
212
|
+
const matched = catalog.materials.filter((material) => {
|
|
213
|
+
if (query.category && material.category !== query.category)
|
|
214
|
+
return false;
|
|
215
|
+
return (!needle ||
|
|
216
|
+
[material.id, material.name, material.category, ...(material.tags ?? [])]
|
|
217
|
+
.join(' ')
|
|
218
|
+
.toLowerCase()
|
|
219
|
+
.includes(needle));
|
|
220
|
+
});
|
|
221
|
+
const materials = query.limit === undefined
|
|
222
|
+
? matched
|
|
223
|
+
: matched.slice(0, Math.max(0, Math.floor(query.limit)));
|
|
224
|
+
return {
|
|
225
|
+
slug: catalog.pack?.slug ?? slug,
|
|
226
|
+
version: catalog.pack?.version ?? 'latest',
|
|
227
|
+
assetBaseUrl,
|
|
228
|
+
materials,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
async function resolveMaterial(apiUrl, id, slug = 'helix-materials') {
|
|
232
|
+
const catalog = await listMaterials(apiUrl, {}, slug);
|
|
233
|
+
const material = catalog.materials.find((candidate) => candidate.id === id);
|
|
234
|
+
if (!material)
|
|
235
|
+
throw new Error(`Material "${id}" was not found in ${slug}`);
|
|
236
|
+
const resolvedMaps = material.maps
|
|
237
|
+
? Object.fromEntries(Object.entries(material.maps).map(([key, value]) => [
|
|
238
|
+
key,
|
|
239
|
+
/^https?:\/\//i.test(value)
|
|
240
|
+
? value
|
|
241
|
+
: `${catalog.assetBaseUrl}/${value.replace(/^\/+/, '')}`,
|
|
242
|
+
]))
|
|
243
|
+
: undefined;
|
|
244
|
+
return { ...material, ...(resolvedMaps ? { resolvedMaps } : {}) };
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../src/assets.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -34,15 +34,29 @@ const ENVIRONMENTS = {
|
|
|
34
34
|
helix3: { apiUrl: 'https://helix-backend-api-helix3.up.railway.app', webUrl: 'https://new.helixgame.com' },
|
|
35
35
|
};
|
|
36
36
|
const SCOPE_ENVS = { '@helixdev': 'staging', '@helix3': 'helix3' };
|
|
37
|
+
const ENV_SCOPES = {
|
|
38
|
+
production: '@hypersoniclabs',
|
|
39
|
+
staging: '@helixdev',
|
|
40
|
+
helix3: '@helix3',
|
|
41
|
+
};
|
|
37
42
|
// Pure resolver (testable without the ambient package.json / process.env): the npm scope
|
|
38
43
|
// picks the environment; HELIX_API_URL/HELIX_WEB_URL override. The site is its OWN value —
|
|
39
44
|
// only an API-only override derives it (api.-strip); otherwise the env default applies.
|
|
40
45
|
function resolveEnvironment(scope, override = {}) {
|
|
41
|
-
|
|
46
|
+
// A local file-linked build still carries the production package name. When
|
|
47
|
+
// its explicit API override exactly names a known lane, label and package
|
|
48
|
+
// suggestions must follow that lane rather than falsely saying production.
|
|
49
|
+
const normalizedOverride = override.apiUrl?.replace(/\/+$/, '').toLowerCase();
|
|
50
|
+
const overrideEnv = normalizedOverride
|
|
51
|
+
? Object.entries(ENVIRONMENTS).find(([, value]) => value.apiUrl.replace(/\/+$/, '').toLowerCase() === normalizedOverride)?.[0]
|
|
52
|
+
: undefined;
|
|
53
|
+
const env = overrideEnv ?? SCOPE_ENVS[scope] ?? 'production';
|
|
54
|
+
const resolvedScope = overrideEnv ? ENV_SCOPES[overrideEnv] : scope;
|
|
42
55
|
const preset = ENVIRONMENTS[env];
|
|
43
56
|
const apiUrl = override.apiUrl ?? preset.apiUrl;
|
|
44
|
-
const webUrl = override.webUrl ??
|
|
45
|
-
|
|
57
|
+
const webUrl = override.webUrl ??
|
|
58
|
+
(override.apiUrl && !overrideEnv ? (0, browserLogin_1.deriveWebUrl)(apiUrl) : preset.webUrl);
|
|
59
|
+
return { scope: resolvedScope, env, apiUrl, webUrl };
|
|
46
60
|
}
|
|
47
61
|
// This build's resolved scope/environment + default API & website URLs. Scope comes from
|
|
48
62
|
// our own package.json name; HELIX_API_URL/HELIX_WEB_URL override per run.
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|