@drawcall/market 0.1.2 → 0.1.4

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.
Files changed (59) hide show
  1. package/dist/cli-client.d.ts +17 -0
  2. package/dist/cli-client.d.ts.map +1 -0
  3. package/dist/cli-client.js +23 -0
  4. package/dist/cli-client.js.map +1 -0
  5. package/dist/cli.js +63 -48
  6. package/dist/cli.js.map +1 -1
  7. package/dist/client.d.ts +4 -3
  8. package/dist/client.d.ts.map +1 -1
  9. package/dist/client.js +11 -12
  10. package/dist/client.js.map +1 -1
  11. package/dist/commands/generate.d.ts +9 -0
  12. package/dist/commands/generate.d.ts.map +1 -0
  13. package/dist/commands/generate.js +31 -0
  14. package/dist/commands/generate.js.map +1 -0
  15. package/dist/commands/install.d.ts +9 -0
  16. package/dist/commands/install.d.ts.map +1 -0
  17. package/dist/commands/install.js +85 -0
  18. package/dist/commands/install.js.map +1 -0
  19. package/dist/commands/login.d.ts +10 -0
  20. package/dist/commands/login.d.ts.map +1 -0
  21. package/dist/commands/login.js +92 -0
  22. package/dist/commands/login.js.map +1 -0
  23. package/dist/commands/logout.d.ts +2 -0
  24. package/dist/commands/logout.d.ts.map +1 -0
  25. package/dist/commands/logout.js +12 -0
  26. package/dist/commands/logout.js.map +1 -0
  27. package/dist/commands/search.d.ts +7 -0
  28. package/dist/commands/search.d.ts.map +1 -0
  29. package/dist/commands/search.js +32 -0
  30. package/dist/commands/search.js.map +1 -0
  31. package/dist/config.d.ts +12 -0
  32. package/dist/config.d.ts.map +1 -0
  33. package/dist/config.js +47 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/contract.d.ts +25 -0
  36. package/dist/contract.d.ts.map +1 -1
  37. package/dist/contract.js +20 -24
  38. package/dist/contract.js.map +1 -1
  39. package/dist/generate.d.ts +20 -0
  40. package/dist/generate.d.ts.map +1 -0
  41. package/dist/generate.js +33 -0
  42. package/dist/generate.js.map +1 -0
  43. package/dist/index.d.ts +3 -1
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +2 -0
  46. package/dist/index.js.map +1 -1
  47. package/package.json +3 -1
  48. package/src/cli-client.ts +40 -0
  49. package/src/cli.ts +78 -53
  50. package/src/client.ts +14 -12
  51. package/src/commands/generate.ts +55 -0
  52. package/src/commands/install.ts +118 -0
  53. package/src/commands/login.ts +113 -0
  54. package/src/commands/logout.ts +11 -0
  55. package/src/commands/search.ts +41 -0
  56. package/src/config.ts +53 -0
  57. package/src/contract.ts +33 -23
  58. package/src/generate.ts +62 -0
  59. package/src/index.ts +5 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAG/C,MAAM,YAAY,GAAG,EAAE,CAAA;AAOvB,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa,EAAE,IAA0B;IAC3E,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;IAEnF,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,CAAA;IACnD,IAAI,OAAO,CAAA;IACX,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YAChC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,WAAW;SAClB,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAC9D,MAAM,GAAG,CAAA;IACX,CAAC;IACD,OAAO,CAAC,IAAI,EAAE,CAAA;IAEd,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAA;QACrC,OAAM;IACR,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACxE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAA;IACjF,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { z } from 'zod';
2
+ declare const configSchema: z.ZodObject<{
3
+ apiKey: z.ZodString;
4
+ baseUrl: z.ZodOptional<z.ZodString>;
5
+ }, z.core.$strip>;
6
+ export type Config = z.infer<typeof configSchema>;
7
+ export declare function loadConfig(): Promise<Config | null>;
8
+ export declare function saveConfig(config: Config): Promise<void>;
9
+ export declare function clearConfig(): Promise<boolean>;
10
+ export declare function getConfigPath(): string;
11
+ export {};
12
+ //# sourceMappingURL=config.d.ts.map
@@ -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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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"}
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
- .output(z.custom()),
49
- updateProfile: oc
50
- .input(updateProfileSchema)
51
- .output(z.custom()),
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
- .output(z.custom()),
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
@@ -1 +1 @@
1
- {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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"}
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"}
@@ -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';
@@ -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,GACd,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,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"}
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;AAiBzD,UAAU;AACV,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAGvD,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"}
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.2",
3
+ "version": "0.1.4",
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,72 +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 { createMarketClient } from './client.js'
6
- import { resolve, ResolutionError, type ResolveResult } from './resolve.js'
7
- import { install } from './install.js'
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('Install assets into your project')
16
- .argument('<assets...>', 'Assets to install (e.g. my-model, my-model@^2.0.0)')
43
+ .description(
44
+ 'Install assets. Each arg is tried as an exact name, then a semantic search, then auto-generated.',
45
+ )
46
+ .argument('<assets...>', 'Asset names or natural-language descriptions')
47
+ .addOption(typeOption)
48
+ .addOption(apiOption)
17
49
  .option('--unapproved', 'Include unapproved versions', false)
18
- .option('--api <url>', 'API base URL', process.env.MARKET_API_URL ?? 'http://localhost:8787')
19
50
  .option('--cwd <dir>', 'Project directory', process.cwd())
20
- .action(async (assetArgs: string[], opts) => {
21
- const client = createMarketClient({ baseUrl: opts.api })
22
-
23
- // Parse asset[@range] arguments
24
- const requests = assetArgs.map((arg) => {
25
- const atIdx = arg.indexOf('@', 1)
26
- if (atIdx > 0) {
27
- return { name: arg.slice(0, atIdx), range: arg.slice(atIdx + 1) }
28
- }
29
- return { name: arg, range: '*' }
30
- })
31
-
32
- // Resolve
33
- console.log(chalk.bold('Resolving dependencies...\n'))
34
-
35
- let resolution: ResolveResult
36
- try {
37
- resolution = await resolve(client.asset, requests, {
38
- 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,
39
61
  })
40
- } catch (err) {
41
- if (err instanceof ResolutionError) {
42
- console.error(chalk.red('Resolution failed:\n') + err.message)
43
- process.exit(1)
44
- }
45
- throw err
46
- }
47
-
48
- console.log(chalk.green(` ${resolution.assets.length} asset(s) resolved:\n`))
49
- for (const asset of resolution.assets) {
50
- console.log(` ${chalk.cyan(asset.name)}${chalk.dim('@' + asset.version)}`)
51
- }
52
-
53
- const npmCount = Object.keys(resolution.npmDependencies).length
54
- if (npmCount > 0) {
55
- console.log(chalk.green(`\n ${npmCount} npm dependenc${npmCount === 1 ? 'y' : 'ies'}:\n`))
56
- for (const [pkg, range] of Object.entries(resolution.npmDependencies)) {
57
- console.log(` ${pkg} ${chalk.dim(range)}`)
58
- }
59
- }
62
+ },
63
+ )
60
64
 
61
- // Install
62
- console.log(chalk.bold('\nInstalling...\n'))
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
+ })
63
74
 
64
- await install(client, resolution, {
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,
65
86
  cwd: opts.cwd,
66
- onProgress: (msg) => console.log(chalk.dim(` ${msg}`)),
67
87
  })
68
-
69
- console.log(chalk.bold.green('\nDone!'))
70
88
  })
71
89
 
72
- program.parse()
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
@@ -7,32 +7,34 @@ import type { InternalContract } from './internal-contract.js'
7
7
  export type MarketClient = ContractRouterClient<AppContract>
8
8
  export type InternalClient = ContractRouterClient<InternalContract>
9
9
 
10
+ const DEFAULT_BASE_URL = 'https://api.market.drawcall.ai'
11
+
10
12
  export interface MarketClientOptions {
11
- baseUrl: string
13
+ baseUrl?: string
12
14
  fetch?: typeof globalThis.fetch
15
+ apiKey?: string
13
16
  }
14
17
 
15
- function resolveUrl(baseUrl: string, path: string): string {
16
- if (baseUrl) return `${baseUrl}${path}`
17
- // In browser environments, use the current origin for relative URLs
18
- if (typeof globalThis !== 'undefined' && 'location' in globalThis) {
19
- return `${(globalThis as unknown as { location: { origin: string } }).location.origin}${path}`
20
- }
21
- throw new Error('baseUrl is required in non-browser environments')
18
+ function buildHeaders(apiKey?: string): Record<string, string> | undefined {
19
+ return apiKey ? { 'x-api-key': apiKey } : undefined
22
20
  }
23
21
 
24
- export function createMarketClient(opts: MarketClientOptions): MarketClient {
22
+ export function createMarketClient(opts: MarketClientOptions = {}): MarketClient {
23
+ const baseUrl = opts.baseUrl || DEFAULT_BASE_URL
25
24
  const link = new RPCLink({
26
- url: resolveUrl(opts.baseUrl, '/api/rpc'),
25
+ url: new URL('/api/rpc', baseUrl).href,
27
26
  fetch: opts.fetch,
27
+ headers: buildHeaders(opts.apiKey),
28
28
  })
29
29
  return createORPCClient<MarketClient>(link)
30
30
  }
31
31
 
32
- export function createInternalClient(opts: MarketClientOptions): InternalClient {
32
+ export function createInternalClient(opts: MarketClientOptions = {}): InternalClient {
33
+ const baseUrl = opts.baseUrl || DEFAULT_BASE_URL
33
34
  const link = new RPCLink({
34
- url: resolveUrl(opts.baseUrl, '/api/internal-rpc'),
35
+ url: new URL('/api/internal-rpc', baseUrl).href,
35
36
  fetch: opts.fetch,
37
+ headers: buildHeaders(opts.apiKey),
36
38
  })
37
39
  return createORPCClient<InternalClient>(link)
38
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
+ }