@drawcall/market 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-client.d.ts +17 -0
- package/dist/cli-client.d.ts.map +1 -0
- package/dist/cli-client.js +23 -0
- package/dist/cli-client.js.map +1 -0
- package/dist/cli.js +63 -48
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +5 -0
- package/dist/client.js.map +1 -1
- package/dist/commands/generate.d.ts +9 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +31 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/install.d.ts +9 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +89 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/login.d.ts +10 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +92 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +12 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/search.d.ts +7 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +32 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +47 -0
- package/dist/config.js.map +1 -0
- package/dist/contract.d.ts +25 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +20 -24
- package/dist/contract.js.map +1 -1
- package/dist/generate.d.ts +20 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +33 -0
- package/dist/generate.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -1
- package/src/cli-client.ts +40 -0
- package/src/cli.ts +78 -57
- package/src/client.ts +7 -0
- package/src/commands/generate.ts +55 -0
- package/src/commands/install.ts +126 -0
- package/src/commands/login.ts +113 -0
- package/src/commands/logout.ts +11 -0
- package/src/commands/search.ts +41 -0
- package/src/config.ts +53 -0
- package/src/contract.ts +33 -23
- package/src/generate.ts +62 -0
- package/src/index.ts +5 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,QAAA,MAAM,YAAY;;;iBAGhB,CAAA;AAEF,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAcjD,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQzD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK9D;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAOpD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as os from 'os';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
const configSchema = z.object({
|
|
6
|
+
apiKey: z.string().startsWith('mk_'),
|
|
7
|
+
baseUrl: z.string().url().optional(),
|
|
8
|
+
});
|
|
9
|
+
function configDir() {
|
|
10
|
+
if (process.platform === 'win32' && process.env.APPDATA) {
|
|
11
|
+
return path.join(process.env.APPDATA, 'drawcall-market');
|
|
12
|
+
}
|
|
13
|
+
const base = process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), '.config');
|
|
14
|
+
return path.join(base, 'drawcall-market');
|
|
15
|
+
}
|
|
16
|
+
function configPath() {
|
|
17
|
+
return path.join(configDir(), 'config.json');
|
|
18
|
+
}
|
|
19
|
+
export async function loadConfig() {
|
|
20
|
+
try {
|
|
21
|
+
const raw = await fs.readFile(configPath(), 'utf-8');
|
|
22
|
+
const parsed = configSchema.safeParse(JSON.parse(raw));
|
|
23
|
+
return parsed.success ? parsed.data : null;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export async function saveConfig(config) {
|
|
30
|
+
const dir = configDir();
|
|
31
|
+
await fs.mkdir(dir, { recursive: true });
|
|
32
|
+
const file = configPath();
|
|
33
|
+
await fs.writeFile(file, JSON.stringify(config, null, 2) + '\n', { mode: 0o600 });
|
|
34
|
+
}
|
|
35
|
+
export async function clearConfig() {
|
|
36
|
+
try {
|
|
37
|
+
await fs.unlink(configPath());
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function getConfigPath() {
|
|
45
|
+
return configPath();
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAA;AAIF,SAAS,SAAS;IAChB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAA;IAC1D,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAA;IAC9E,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAA;AAC3C,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,CAAA;QACpD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;QACtD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc;IAC7C,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;IACvB,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACxC,MAAM,IAAI,GAAG,UAAU,EAAE,CAAA;IACzB,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;AACnF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;QAC7B,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,EAAE,CAAA;AACrB,CAAC"}
|
package/dist/contract.d.ts
CHANGED
|
@@ -80,6 +80,14 @@ export interface FileTreeEntry {
|
|
|
80
80
|
path: string;
|
|
81
81
|
size: number;
|
|
82
82
|
}
|
|
83
|
+
export interface GenerateJobStatus {
|
|
84
|
+
jobId: string;
|
|
85
|
+
state: 'queued' | 'running' | 'done' | 'failed';
|
|
86
|
+
message: string | null;
|
|
87
|
+
assetName: string | null;
|
|
88
|
+
version: string | null;
|
|
89
|
+
error: string | null;
|
|
90
|
+
}
|
|
83
91
|
export declare const contract: {
|
|
84
92
|
asset: {
|
|
85
93
|
getByName: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
@@ -193,6 +201,23 @@ export declare const contract: {
|
|
|
193
201
|
tag: {
|
|
194
202
|
list: import("@orpc/contract").ContractProcedureBuilderWithOutput<import("@orpc/contract").Schema<unknown, unknown>, z.ZodCustom<TagWithCount[], TagWithCount[]>, Record<never, never>, Record<never, never>>;
|
|
195
203
|
};
|
|
204
|
+
generate: {
|
|
205
|
+
start: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
206
|
+
description: z.ZodString;
|
|
207
|
+
type: z.ZodOptional<z.ZodEnum<{
|
|
208
|
+
generic: "generic";
|
|
209
|
+
model: "model";
|
|
210
|
+
hdri: "hdri";
|
|
211
|
+
material: "material";
|
|
212
|
+
music: "music";
|
|
213
|
+
}>>;
|
|
214
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
215
|
+
jobId: z.ZodString;
|
|
216
|
+
}, z.core.$strip>, Record<never, never>, Record<never, never>>;
|
|
217
|
+
status: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
218
|
+
jobId: z.ZodString;
|
|
219
|
+
}, z.core.$strip>, z.ZodCustom<GenerateJobStatus, GenerateJobStatus>, Record<never, never>, Record<never, never>>;
|
|
220
|
+
};
|
|
196
221
|
};
|
|
197
222
|
export type AppContract = typeof contract;
|
|
198
223
|
//# sourceMappingURL=contract.d.ts.map
|
package/dist/contract.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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"}
|
package/dist/contract.js
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { oc } from '@orpc/contract';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { assetNameSchema, semverSchema, listAssetsSchema, updateProfileSchema, uploadGenericSchema, uploadTypedSchema, uploadMaterialSchema, } from './schemas.js';
|
|
3
|
+
import { assetNameSchema, assetTypeSchema, semverSchema, listAssetsSchema, updateProfileSchema, uploadGenericSchema, uploadTypedSchema, uploadMaterialSchema, } from './schemas.js';
|
|
4
4
|
// ─── Contract ─────────────────────────────────────────────────────────────────
|
|
5
5
|
export const contract = {
|
|
6
6
|
asset: {
|
|
7
7
|
getByName: oc
|
|
8
8
|
.input(z.object({ name: assetNameSchema }))
|
|
9
9
|
.output(z.custom()),
|
|
10
|
-
list: oc
|
|
11
|
-
.input(listAssetsSchema)
|
|
12
|
-
.output(z.custom()),
|
|
10
|
+
list: oc.input(listAssetsSchema).output(z.custom()),
|
|
13
11
|
getVersionTree: oc
|
|
14
12
|
.input(z.object({ name: z.string(), version: semverSchema }))
|
|
15
13
|
.output(z.custom()),
|
|
@@ -30,35 +28,33 @@ export const contract = {
|
|
|
30
28
|
music: oc
|
|
31
29
|
.input(uploadTypedSchema.extend({ file: z.instanceof(File) }))
|
|
32
30
|
.output(z.custom()),
|
|
33
|
-
material: oc
|
|
34
|
-
.input(uploadMaterialSchema)
|
|
35
|
-
.output(z.custom()),
|
|
31
|
+
material: oc.input(uploadMaterialSchema).output(z.custom()),
|
|
36
32
|
},
|
|
37
33
|
admin: {
|
|
38
|
-
listUnapproved: oc
|
|
39
|
-
.output(z.custom()),
|
|
34
|
+
listUnapproved: oc.output(z.custom()),
|
|
40
35
|
approve: oc
|
|
41
36
|
.input(z.object({ assetName: z.string(), version: z.string() }))
|
|
42
37
|
.output(z.object({ success: z.boolean() })),
|
|
43
|
-
backfillEmbeddings: oc
|
|
44
|
-
.output(z.object({ indexed: z.number() })),
|
|
38
|
+
backfillEmbeddings: oc.output(z.object({ indexed: z.number() })),
|
|
45
39
|
},
|
|
46
40
|
user: {
|
|
47
|
-
getProfile: oc
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
getApiKey: oc
|
|
53
|
-
.output(z.custom()),
|
|
54
|
-
regenerateApiKey: oc
|
|
55
|
-
.output(z.object({ key: z.string(), prefix: z.string() })),
|
|
56
|
-
myAssets: oc
|
|
57
|
-
.output(z.custom()),
|
|
41
|
+
getProfile: oc.output(z.custom()),
|
|
42
|
+
updateProfile: oc.input(updateProfileSchema).output(z.custom()),
|
|
43
|
+
getApiKey: oc.output(z.custom()),
|
|
44
|
+
regenerateApiKey: oc.output(z.object({ key: z.string(), prefix: z.string() })),
|
|
45
|
+
myAssets: oc.output(z.custom()),
|
|
58
46
|
},
|
|
59
47
|
tag: {
|
|
60
|
-
list: oc
|
|
61
|
-
|
|
48
|
+
list: oc.output(z.custom()),
|
|
49
|
+
},
|
|
50
|
+
generate: {
|
|
51
|
+
start: oc
|
|
52
|
+
.input(z.object({
|
|
53
|
+
description: z.string().min(3).max(1000),
|
|
54
|
+
type: assetTypeSchema.optional(),
|
|
55
|
+
}))
|
|
56
|
+
.output(z.object({ jobId: z.string() })),
|
|
57
|
+
status: oc.input(z.object({ jobId: z.string() })).output(z.custom()),
|
|
62
58
|
},
|
|
63
59
|
};
|
|
64
60
|
//# sourceMappingURL=contract.js.map
|
package/dist/contract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AACnC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EACL,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { MarketClient } from './client.js';
|
|
2
|
+
import type { AssetType } from './schemas.js';
|
|
3
|
+
export declare class GenerateError extends Error {
|
|
4
|
+
constructor(message: string);
|
|
5
|
+
}
|
|
6
|
+
export interface GenerateInput {
|
|
7
|
+
description: string;
|
|
8
|
+
type?: AssetType;
|
|
9
|
+
}
|
|
10
|
+
export interface GenerateResult {
|
|
11
|
+
assetName: string;
|
|
12
|
+
version: string;
|
|
13
|
+
}
|
|
14
|
+
export interface GenerateOptions {
|
|
15
|
+
onProgress?: (message: string) => void;
|
|
16
|
+
pollIntervalMs?: number;
|
|
17
|
+
timeoutMs?: number;
|
|
18
|
+
}
|
|
19
|
+
export declare function generateAndWait(client: MarketClient, input: GenerateInput, opts?: GenerateOptions): Promise<GenerateResult>;
|
|
20
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,aAAa,EACpB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,cAAc,CAAC,CA2BzB"}
|
package/dist/generate.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export class GenerateError extends Error {
|
|
2
|
+
constructor(message) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = 'GenerateError';
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export async function generateAndWait(client, input, opts = {}) {
|
|
8
|
+
const pollIntervalMs = opts.pollIntervalMs ?? 1500;
|
|
9
|
+
const timeoutMs = opts.timeoutMs ?? 60_000;
|
|
10
|
+
const report = opts.onProgress ?? (() => { });
|
|
11
|
+
const { jobId } = await client.generate.start(input);
|
|
12
|
+
const deadline = Date.now() + timeoutMs;
|
|
13
|
+
while (Date.now() < deadline) {
|
|
14
|
+
const status = await client.generate.status({ jobId });
|
|
15
|
+
if (status.message)
|
|
16
|
+
report(status.message);
|
|
17
|
+
if (status.state === 'done') {
|
|
18
|
+
if (!status.assetName || !status.version) {
|
|
19
|
+
throw new GenerateError('Generation completed without an asset name.');
|
|
20
|
+
}
|
|
21
|
+
return { assetName: status.assetName, version: status.version };
|
|
22
|
+
}
|
|
23
|
+
if (status.state === 'failed') {
|
|
24
|
+
throw new GenerateError(status.error ?? 'Generation failed.');
|
|
25
|
+
}
|
|
26
|
+
await sleep(pollIntervalMs);
|
|
27
|
+
}
|
|
28
|
+
throw new GenerateError(`Generation timed out after ${timeoutMs}ms.`);
|
|
29
|
+
}
|
|
30
|
+
function sleep(ms) {
|
|
31
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,eAAe,CAAA;IAC7B,CAAC;CACF;AAkBD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAoB,EACpB,KAAoB,EACpB,OAAwB,EAAE;IAE1B,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAA;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAA;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAE5C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAEpD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;IACvC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QACtD,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAE1C,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACzC,MAAM,IAAI,aAAa,CAAC,6CAA6C,CAAC,CAAA;YACxE,CAAC;YACD,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAA;QACjE,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI,oBAAoB,CAAC,CAAA;QAC/D,CAAC;QAED,MAAM,KAAK,CAAC,cAAc,CAAC,CAAA;IAC7B,CAAC;IAED,MAAM,IAAI,aAAa,CAAC,8BAA8B,SAAS,KAAK,CAAC,CAAA;AACvE,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC1D,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,9 +4,11 @@ export { contract } from './contract.js';
|
|
|
4
4
|
export type { AppContract } from './contract.js';
|
|
5
5
|
export { internalContract } from './internal-contract.js';
|
|
6
6
|
export type { InternalContract } from './internal-contract.js';
|
|
7
|
-
export type { Asset, AssetVersion, AssetWithVersionsAndTags, AssetWithVersions, AssetListItem, PaginatedList, User, UnapprovedItem, TagWithCount, FileTreeEntry, } from './contract.js';
|
|
7
|
+
export type { Asset, AssetVersion, AssetWithVersionsAndTags, AssetWithVersions, AssetListItem, PaginatedList, User, UnapprovedItem, TagWithCount, FileTreeEntry, GenerateJobStatus, } from './contract.js';
|
|
8
8
|
export { resolve, ResolutionError } from './resolve.js';
|
|
9
9
|
export type { ResolvedAsset, ResolveResult } from './resolve.js';
|
|
10
|
+
export { generateAndWait, GenerateError } from './generate.js';
|
|
11
|
+
export type { GenerateInput, GenerateResult, GenerateOptions } from './generate.js';
|
|
10
12
|
export { ASSET_TYPES, assetTypeSchema, semverSchema, assetNameSchema, npmDependenciesSchema, assetDependenciesSchema, uploadGenericSchema, uploadTypedSchema, uploadMaterialSchema, updateProfileSchema, listAssetsSchema, } from './schemas.js';
|
|
11
13
|
export type { AssetType } from './schemas.js';
|
|
12
14
|
export { MAX_FILE_SIZE, ALLOWED_EXTENSIONS, ASSET_TYPE_LABELS } from './constants.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACtE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGpF,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAG9D,YAAY,EACV,KAAK,EACL,YAAY,EACZ,wBAAwB,EACxB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,IAAI,EACJ,cAAc,EACd,YAAY,EACZ,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACtE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGpF,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAG9D,YAAY,EACV,KAAK,EACL,YAAY,EACZ,wBAAwB,EACxB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,IAAI,EACJ,cAAc,EACd,YAAY,EACZ,aAAa,EACb,iBAAiB,GAClB,MAAM,eAAe,CAAA;AAGtB,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACvD,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAGhE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC9D,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAGnF,OAAO,EACL,WAAW,EACX,eAAe,EACf,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAG7C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,8 @@ export { contract } from './contract.js';
|
|
|
5
5
|
export { internalContract } from './internal-contract.js';
|
|
6
6
|
// Resolve
|
|
7
7
|
export { resolve, ResolutionError } from './resolve.js';
|
|
8
|
+
// Generate
|
|
9
|
+
export { generateAndWait, GenerateError } from './generate.js';
|
|
8
10
|
// Schemas
|
|
9
11
|
export { ASSET_TYPES, assetTypeSchema, semverSchema, assetNameSchema, npmDependenciesSchema, assetDependenciesSchema, uploadGenericSchema, uploadTypedSchema, uploadMaterialSchema, updateProfileSchema, listAssetsSchema, } from './schemas.js';
|
|
10
12
|
// Constants
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAGtE,YAAY;AACZ,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAGtE,YAAY;AACZ,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAkBzD,UAAU;AACV,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAGvD,WAAW;AACX,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAG9D,UAAU;AACV,OAAO,EACL,WAAW,EACX,eAAe,EACf,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,cAAc,CAAA;AAGrB,YAAY;AACZ,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@drawcall/market",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/drawcall-ai/market",
|
|
@@ -20,6 +20,8 @@
|
|
|
20
20
|
"chalk": "^5.6.2",
|
|
21
21
|
"commander": "^14.0.3",
|
|
22
22
|
"nypm": "^0.6.0",
|
|
23
|
+
"open": "^10.1.0",
|
|
24
|
+
"ora": "^8.1.1",
|
|
23
25
|
"semver": "^7.7.0",
|
|
24
26
|
"zod": "^4.3.6"
|
|
25
27
|
},
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { createMarketClient, type MarketClient } from './client.js'
|
|
2
|
+
import { loadConfig } from './config.js'
|
|
3
|
+
|
|
4
|
+
const DEFAULT_BASE_URL = 'https://api.market.drawcall.ai'
|
|
5
|
+
|
|
6
|
+
export class NotLoggedInError extends Error {
|
|
7
|
+
constructor() {
|
|
8
|
+
super('Not logged in. Run `market login` first.')
|
|
9
|
+
this.name = 'NotLoggedInError'
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface CliClientOptions {
|
|
14
|
+
/** Override the API base URL. Takes precedence over config and defaults. */
|
|
15
|
+
baseUrl?: string
|
|
16
|
+
/** Require authentication. When true, throws NotLoggedInError if no key is available. */
|
|
17
|
+
requireAuth?: boolean
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface CliClient {
|
|
21
|
+
client: MarketClient
|
|
22
|
+
baseUrl: string
|
|
23
|
+
apiKey: string | undefined
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export async function getCliClient(opts: CliClientOptions = {}): Promise<CliClient> {
|
|
27
|
+
const config = await loadConfig()
|
|
28
|
+
const apiKey = process.env.MARKET_API_KEY ?? config?.apiKey
|
|
29
|
+
const baseUrl = opts.baseUrl ?? process.env.MARKET_API_URL ?? config?.baseUrl ?? DEFAULT_BASE_URL
|
|
30
|
+
|
|
31
|
+
if (opts.requireAuth && !apiKey) {
|
|
32
|
+
throw new NotLoggedInError()
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
client: createMarketClient({ baseUrl, apiKey }),
|
|
37
|
+
baseUrl,
|
|
38
|
+
apiKey,
|
|
39
|
+
}
|
|
40
|
+
}
|
package/src/cli.ts
CHANGED
|
@@ -1,76 +1,97 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import { Command } from 'commander'
|
|
3
|
+
import { Command, Option } from 'commander'
|
|
4
4
|
import chalk from 'chalk'
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
5
|
+
import { ASSET_TYPES, type AssetType } from './schemas.js'
|
|
6
|
+
import { installCommand } from './commands/install.js'
|
|
7
|
+
import { searchCommand } from './commands/search.js'
|
|
8
|
+
import { generateCommand } from './commands/generate.js'
|
|
9
|
+
import { login } from './commands/login.js'
|
|
10
|
+
import { logout } from './commands/logout.js'
|
|
11
|
+
import { NotLoggedInError } from './cli-client.js'
|
|
8
12
|
|
|
9
13
|
const program = new Command()
|
|
10
14
|
|
|
15
|
+
const DEFAULT_BASE_URL = 'https://api.market.drawcall.ai'
|
|
16
|
+
|
|
17
|
+
const typeOption = new Option('--type <type>', 'Filter by asset type').choices([...ASSET_TYPES])
|
|
18
|
+
|
|
19
|
+
const apiOption = new Option('--api <url>', 'API base URL').default(
|
|
20
|
+
process.env.MARKET_API_URL,
|
|
21
|
+
'from MARKET_API_URL / config / default',
|
|
22
|
+
)
|
|
23
|
+
|
|
11
24
|
program.name('market').description('Install assets from the drawcall.ai market').version('0.1.0')
|
|
12
25
|
|
|
26
|
+
program
|
|
27
|
+
.command('login')
|
|
28
|
+
.description('Authenticate with the market via your browser')
|
|
29
|
+
.addOption(apiOption)
|
|
30
|
+
.action(async (opts: { api?: string }) => {
|
|
31
|
+
await login({ baseUrl: opts.api ?? DEFAULT_BASE_URL })
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
program
|
|
35
|
+
.command('logout')
|
|
36
|
+
.description('Remove the local API key')
|
|
37
|
+
.action(async () => {
|
|
38
|
+
await logout()
|
|
39
|
+
})
|
|
40
|
+
|
|
13
41
|
program
|
|
14
42
|
.command('install')
|
|
15
|
-
.description(
|
|
16
|
-
|
|
17
|
-
.option('--unapproved', 'Include unapproved versions', false)
|
|
18
|
-
.option(
|
|
19
|
-
'--api <url>',
|
|
20
|
-
'API base URL',
|
|
21
|
-
process.env.MARKET_API_URL ?? 'https://api.market.drawcall.ai',
|
|
43
|
+
.description(
|
|
44
|
+
'Install assets. Each arg is tried as an exact name, then a semantic search, then auto-generated.',
|
|
22
45
|
)
|
|
46
|
+
.argument('<assets...>', 'Asset names or natural-language descriptions')
|
|
47
|
+
.addOption(typeOption)
|
|
48
|
+
.addOption(apiOption)
|
|
49
|
+
.option('--unapproved', 'Include unapproved versions', false)
|
|
23
50
|
.option('--cwd <dir>', 'Project directory', process.cwd())
|
|
24
|
-
.action(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
// Resolve
|
|
37
|
-
console.log(chalk.bold('Resolving dependencies...\n'))
|
|
38
|
-
|
|
39
|
-
let resolution: ResolveResult
|
|
40
|
-
try {
|
|
41
|
-
resolution = await resolve(client.asset, requests, {
|
|
42
|
-
includeUnapproved: opts.unapproved,
|
|
51
|
+
.action(
|
|
52
|
+
async (
|
|
53
|
+
args: string[],
|
|
54
|
+
opts: { type?: AssetType; api?: string; unapproved: boolean; cwd: string },
|
|
55
|
+
) => {
|
|
56
|
+
await installCommand(args, {
|
|
57
|
+
type: opts.type,
|
|
58
|
+
baseUrl: opts.api,
|
|
59
|
+
unapproved: opts.unapproved,
|
|
60
|
+
cwd: opts.cwd,
|
|
43
61
|
})
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
console.error(chalk.red('Resolution failed:\n') + err.message)
|
|
47
|
-
process.exit(1)
|
|
48
|
-
}
|
|
49
|
-
throw err
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
console.log(chalk.green(` ${resolution.assets.length} asset(s) resolved:\n`))
|
|
53
|
-
for (const asset of resolution.assets) {
|
|
54
|
-
console.log(` ${chalk.cyan(asset.name)}${chalk.dim('@' + asset.version)}`)
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const npmCount = Object.keys(resolution.npmDependencies).length
|
|
58
|
-
if (npmCount > 0) {
|
|
59
|
-
console.log(chalk.green(`\n ${npmCount} npm dependenc${npmCount === 1 ? 'y' : 'ies'}:\n`))
|
|
60
|
-
for (const [pkg, range] of Object.entries(resolution.npmDependencies)) {
|
|
61
|
-
console.log(` ${pkg} ${chalk.dim(range)}`)
|
|
62
|
-
}
|
|
63
|
-
}
|
|
62
|
+
},
|
|
63
|
+
)
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
program
|
|
66
|
+
.command('search')
|
|
67
|
+
.description('Search the market. Prints up to 10 ranked results.')
|
|
68
|
+
.argument('<query>', 'Natural-language query')
|
|
69
|
+
.addOption(typeOption)
|
|
70
|
+
.addOption(apiOption)
|
|
71
|
+
.action(async (query: string, opts: { type?: AssetType; api?: string }) => {
|
|
72
|
+
await searchCommand(query, { type: opts.type, baseUrl: opts.api })
|
|
73
|
+
})
|
|
67
74
|
|
|
68
|
-
|
|
75
|
+
program
|
|
76
|
+
.command('generate')
|
|
77
|
+
.description('Generate a new asset from a description and install it.')
|
|
78
|
+
.argument('<description>', 'Description of the asset to generate')
|
|
79
|
+
.addOption(typeOption)
|
|
80
|
+
.addOption(apiOption)
|
|
81
|
+
.option('--cwd <dir>', 'Project directory', process.cwd())
|
|
82
|
+
.action(async (description: string, opts: { type?: AssetType; api?: string; cwd: string }) => {
|
|
83
|
+
await generateCommand(description, {
|
|
84
|
+
type: opts.type,
|
|
85
|
+
baseUrl: opts.api,
|
|
69
86
|
cwd: opts.cwd,
|
|
70
|
-
onProgress: (msg) => console.log(chalk.dim(` ${msg}`)),
|
|
71
87
|
})
|
|
72
|
-
|
|
73
|
-
console.log(chalk.bold.green('\nDone!'))
|
|
74
88
|
})
|
|
75
89
|
|
|
76
|
-
program.
|
|
90
|
+
program.parseAsync().catch((err) => {
|
|
91
|
+
// Commands that own a spinner print the error via spinner.fail() and rethrow,
|
|
92
|
+
// so we only print here when nothing else did.
|
|
93
|
+
if (err instanceof NotLoggedInError) {
|
|
94
|
+
console.error(chalk.red(err.message))
|
|
95
|
+
}
|
|
96
|
+
process.exit(1)
|
|
97
|
+
})
|
package/src/client.ts
CHANGED
|
@@ -12,6 +12,11 @@ const DEFAULT_BASE_URL = 'https://api.market.drawcall.ai'
|
|
|
12
12
|
export interface MarketClientOptions {
|
|
13
13
|
baseUrl?: string
|
|
14
14
|
fetch?: typeof globalThis.fetch
|
|
15
|
+
apiKey?: string
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function buildHeaders(apiKey?: string): Record<string, string> | undefined {
|
|
19
|
+
return apiKey ? { 'x-api-key': apiKey } : undefined
|
|
15
20
|
}
|
|
16
21
|
|
|
17
22
|
export function createMarketClient(opts: MarketClientOptions = {}): MarketClient {
|
|
@@ -19,6 +24,7 @@ export function createMarketClient(opts: MarketClientOptions = {}): MarketClient
|
|
|
19
24
|
const link = new RPCLink({
|
|
20
25
|
url: new URL('/api/rpc', baseUrl).href,
|
|
21
26
|
fetch: opts.fetch,
|
|
27
|
+
headers: buildHeaders(opts.apiKey),
|
|
22
28
|
})
|
|
23
29
|
return createORPCClient<MarketClient>(link)
|
|
24
30
|
}
|
|
@@ -28,6 +34,7 @@ export function createInternalClient(opts: MarketClientOptions = {}): InternalCl
|
|
|
28
34
|
const link = new RPCLink({
|
|
29
35
|
url: new URL('/api/internal-rpc', baseUrl).href,
|
|
30
36
|
fetch: opts.fetch,
|
|
37
|
+
headers: buildHeaders(opts.apiKey),
|
|
31
38
|
})
|
|
32
39
|
return createORPCClient<InternalClient>(link)
|
|
33
40
|
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import chalk from 'chalk'
|
|
2
|
+
import ora from 'ora'
|
|
3
|
+
import { getCliClient } from '../cli-client.js'
|
|
4
|
+
import { generateAndWait } from '../generate.js'
|
|
5
|
+
import { resolve } from '../resolve.js'
|
|
6
|
+
import { install as runInstall } from '../install.js'
|
|
7
|
+
import type { AssetType } from '../schemas.js'
|
|
8
|
+
|
|
9
|
+
export interface GenerateCommandOptions {
|
|
10
|
+
type?: AssetType
|
|
11
|
+
cwd?: string
|
|
12
|
+
baseUrl?: string
|
|
13
|
+
unapproved?: boolean
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export async function generateCommand(
|
|
17
|
+
description: string,
|
|
18
|
+
opts: GenerateCommandOptions,
|
|
19
|
+
): Promise<void> {
|
|
20
|
+
const { client } = await getCliClient({ baseUrl: opts.baseUrl, requireAuth: true })
|
|
21
|
+
|
|
22
|
+
const spinner = ora(`Generating "${description}"`).start()
|
|
23
|
+
try {
|
|
24
|
+
const generated = await generateAndWait(
|
|
25
|
+
client,
|
|
26
|
+
{ description, type: opts.type },
|
|
27
|
+
{
|
|
28
|
+
onProgress: (msg) => {
|
|
29
|
+
spinner.text = msg
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
spinner.text = `Resolving ${generated.assetName}@${generated.version}`
|
|
35
|
+
const resolution = await resolve(
|
|
36
|
+
client.asset,
|
|
37
|
+
[{ name: generated.assetName, range: generated.version }],
|
|
38
|
+
{ includeUnapproved: opts.unapproved ?? false },
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
await runInstall(client, resolution, {
|
|
42
|
+
cwd: opts.cwd,
|
|
43
|
+
onProgress: (msg) => {
|
|
44
|
+
spinner.text = msg
|
|
45
|
+
},
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
spinner.succeed(
|
|
49
|
+
`Installed ${chalk.cyan(generated.assetName)}${chalk.dim('@' + generated.version)}`,
|
|
50
|
+
)
|
|
51
|
+
} catch (err) {
|
|
52
|
+
spinner.fail(err instanceof Error ? err.message : String(err))
|
|
53
|
+
throw err
|
|
54
|
+
}
|
|
55
|
+
}
|