@drawcall/market 0.1.3 → 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 +1 -0
  8. package/dist/client.d.ts.map +1 -1
  9. package/dist/client.js +5 -0
  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 -57
  50. package/src/client.ts +7 -0
  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
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.3",
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,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 { 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)')
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(async (assetArgs: string[], opts) => {
25
- const client = createMarketClient({ baseUrl: opts.api })
26
-
27
- // Parse asset[@range] arguments
28
- const requests = assetArgs.map((arg) => {
29
- const atIdx = arg.indexOf('@', 1)
30
- if (atIdx > 0) {
31
- return { name: arg.slice(0, atIdx), range: arg.slice(atIdx + 1) }
32
- }
33
- return { name: arg, range: '*' }
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
- } catch (err) {
45
- if (err instanceof ResolutionError) {
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
- // Install
66
- 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
+ })
67
74
 
68
- 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,
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.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
@@ -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
+ }