@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,17 @@
|
|
|
1
|
+
import { type MarketClient } from './client.js';
|
|
2
|
+
export declare class NotLoggedInError extends Error {
|
|
3
|
+
constructor();
|
|
4
|
+
}
|
|
5
|
+
export interface CliClientOptions {
|
|
6
|
+
/** Override the API base URL. Takes precedence over config and defaults. */
|
|
7
|
+
baseUrl?: string;
|
|
8
|
+
/** Require authentication. When true, throws NotLoggedInError if no key is available. */
|
|
9
|
+
requireAuth?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface CliClient {
|
|
12
|
+
client: MarketClient;
|
|
13
|
+
baseUrl: string;
|
|
14
|
+
apiKey: string | undefined;
|
|
15
|
+
}
|
|
16
|
+
export declare function getCliClient(opts?: CliClientOptions): Promise<CliClient>;
|
|
17
|
+
//# sourceMappingURL=cli-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-client.d.ts","sourceRoot":"","sources":["../src/cli-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AAKnE,qBAAa,gBAAiB,SAAQ,KAAK;;CAK1C;AAED,MAAM,WAAW,gBAAgB;IAC/B,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yFAAyF;IACzF,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAC3B;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,CAAC,CAclF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createMarketClient } from './client.js';
|
|
2
|
+
import { loadConfig } from './config.js';
|
|
3
|
+
const DEFAULT_BASE_URL = 'https://api.market.drawcall.ai';
|
|
4
|
+
export class NotLoggedInError extends Error {
|
|
5
|
+
constructor() {
|
|
6
|
+
super('Not logged in. Run `market login` first.');
|
|
7
|
+
this.name = 'NotLoggedInError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export async function getCliClient(opts = {}) {
|
|
11
|
+
const config = await loadConfig();
|
|
12
|
+
const apiKey = process.env.MARKET_API_KEY ?? config?.apiKey;
|
|
13
|
+
const baseUrl = opts.baseUrl ?? process.env.MARKET_API_URL ?? config?.baseUrl ?? DEFAULT_BASE_URL;
|
|
14
|
+
if (opts.requireAuth && !apiKey) {
|
|
15
|
+
throw new NotLoggedInError();
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
client: createMarketClient({ baseUrl, apiKey }),
|
|
19
|
+
baseUrl,
|
|
20
|
+
apiKey,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=cli-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-client.js","sourceRoot":"","sources":["../src/cli-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAqB,MAAM,aAAa,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,gBAAgB,GAAG,gCAAgC,CAAA;AAEzD,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC;QACE,KAAK,CAAC,0CAA0C,CAAC,CAAA;QACjD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;IAChC,CAAC;CACF;AAeD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAyB,EAAE;IAC5D,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;IACjC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM,EAAE,MAAM,CAAA;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM,EAAE,OAAO,IAAI,gBAAgB,CAAA;IAEjG,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI,gBAAgB,EAAE,CAAA;IAC9B,CAAC;IAED,OAAO;QACL,MAAM,EAAE,kBAAkB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC/C,OAAO;QACP,MAAM;KACP,CAAA;AACH,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -1,61 +1,76 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { Command } from 'commander';
|
|
2
|
+
import { Command, Option } from 'commander';
|
|
3
3
|
import chalk from 'chalk';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import { ASSET_TYPES } from './schemas.js';
|
|
5
|
+
import { installCommand } from './commands/install.js';
|
|
6
|
+
import { searchCommand } from './commands/search.js';
|
|
7
|
+
import { generateCommand } from './commands/generate.js';
|
|
8
|
+
import { login } from './commands/login.js';
|
|
9
|
+
import { logout } from './commands/logout.js';
|
|
10
|
+
import { NotLoggedInError } from './cli-client.js';
|
|
7
11
|
const program = new Command();
|
|
12
|
+
const DEFAULT_BASE_URL = 'https://api.market.drawcall.ai';
|
|
13
|
+
const typeOption = new Option('--type <type>', 'Filter by asset type').choices([...ASSET_TYPES]);
|
|
14
|
+
const apiOption = new Option('--api <url>', 'API base URL').default(process.env.MARKET_API_URL, 'from MARKET_API_URL / config / default');
|
|
8
15
|
program.name('market').description('Install assets from the drawcall.ai market').version('0.1.0');
|
|
16
|
+
program
|
|
17
|
+
.command('login')
|
|
18
|
+
.description('Authenticate with the market via your browser')
|
|
19
|
+
.addOption(apiOption)
|
|
20
|
+
.action(async (opts) => {
|
|
21
|
+
await login({ baseUrl: opts.api ?? DEFAULT_BASE_URL });
|
|
22
|
+
});
|
|
23
|
+
program
|
|
24
|
+
.command('logout')
|
|
25
|
+
.description('Remove the local API key')
|
|
26
|
+
.action(async () => {
|
|
27
|
+
await logout();
|
|
28
|
+
});
|
|
9
29
|
program
|
|
10
30
|
.command('install')
|
|
11
|
-
.description('Install assets
|
|
12
|
-
.argument('<assets...>', '
|
|
31
|
+
.description('Install assets. Each arg is tried as an exact name, then a semantic search, then auto-generated.')
|
|
32
|
+
.argument('<assets...>', 'Asset names or natural-language descriptions')
|
|
33
|
+
.addOption(typeOption)
|
|
34
|
+
.addOption(apiOption)
|
|
13
35
|
.option('--unapproved', 'Include unapproved versions', false)
|
|
14
|
-
.option('--api <url>', 'API base URL', process.env.MARKET_API_URL ?? 'https://api.market.drawcall.ai')
|
|
15
36
|
.option('--cwd <dir>', 'Project directory', process.cwd())
|
|
16
|
-
.action(async (
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return { name: arg.slice(0, atIdx), range: arg.slice(atIdx + 1) };
|
|
23
|
-
}
|
|
24
|
-
return { name: arg, range: '*' };
|
|
37
|
+
.action(async (args, opts) => {
|
|
38
|
+
await installCommand(args, {
|
|
39
|
+
type: opts.type,
|
|
40
|
+
baseUrl: opts.api,
|
|
41
|
+
unapproved: opts.unapproved,
|
|
42
|
+
cwd: opts.cwd,
|
|
25
43
|
});
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
console.log(chalk.green(`\n ${npmCount} npm dependenc${npmCount === 1 ? 'y' : 'ies'}:\n`));
|
|
48
|
-
for (const [pkg, range] of Object.entries(resolution.npmDependencies)) {
|
|
49
|
-
console.log(` ${pkg} ${chalk.dim(range)}`);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
// Install
|
|
53
|
-
console.log(chalk.bold('\nInstalling...\n'));
|
|
54
|
-
await install(client, resolution, {
|
|
44
|
+
});
|
|
45
|
+
program
|
|
46
|
+
.command('search')
|
|
47
|
+
.description('Search the market. Prints up to 10 ranked results.')
|
|
48
|
+
.argument('<query>', 'Natural-language query')
|
|
49
|
+
.addOption(typeOption)
|
|
50
|
+
.addOption(apiOption)
|
|
51
|
+
.action(async (query, opts) => {
|
|
52
|
+
await searchCommand(query, { type: opts.type, baseUrl: opts.api });
|
|
53
|
+
});
|
|
54
|
+
program
|
|
55
|
+
.command('generate')
|
|
56
|
+
.description('Generate a new asset from a description and install it.')
|
|
57
|
+
.argument('<description>', 'Description of the asset to generate')
|
|
58
|
+
.addOption(typeOption)
|
|
59
|
+
.addOption(apiOption)
|
|
60
|
+
.option('--cwd <dir>', 'Project directory', process.cwd())
|
|
61
|
+
.action(async (description, opts) => {
|
|
62
|
+
await generateCommand(description, {
|
|
63
|
+
type: opts.type,
|
|
64
|
+
baseUrl: opts.api,
|
|
55
65
|
cwd: opts.cwd,
|
|
56
|
-
onProgress: (msg) => console.log(chalk.dim(` ${msg}`)),
|
|
57
66
|
});
|
|
58
|
-
console.log(chalk.bold.green('\nDone!'));
|
|
59
67
|
});
|
|
60
|
-
program.
|
|
68
|
+
program.parseAsync().catch((err) => {
|
|
69
|
+
// Commands that own a spinner print the error via spinner.fail() and rethrow,
|
|
70
|
+
// so we only print here when nothing else did.
|
|
71
|
+
if (err instanceof NotLoggedInError) {
|
|
72
|
+
console.error(chalk.red(err.message));
|
|
73
|
+
}
|
|
74
|
+
process.exit(1);
|
|
75
|
+
});
|
|
61
76
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,WAAW,EAAkB,MAAM,cAAc,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAElD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,MAAM,gBAAgB,GAAG,gCAAgC,CAAA;AAEzD,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAA;AAEhG,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,OAAO,CACjE,OAAO,CAAC,GAAG,CAAC,cAAc,EAC1B,wCAAwC,CACzC,CAAA;AAED,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,4CAA4C,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;AAEjG,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,SAAS,CAAC,SAAS,CAAC;KACpB,MAAM,CAAC,KAAK,EAAE,IAAsB,EAAE,EAAE;IACvC,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,gBAAgB,EAAE,CAAC,CAAA;AACxD,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,EAAE,CAAA;AAChB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CACV,kGAAkG,CACnG;KACA,QAAQ,CAAC,aAAa,EAAE,8CAA8C,CAAC;KACvE,SAAS,CAAC,UAAU,CAAC;KACrB,SAAS,CAAC,SAAS,CAAC;KACpB,MAAM,CAAC,cAAc,EAAE,6BAA6B,EAAE,KAAK,CAAC;KAC5D,MAAM,CAAC,aAAa,EAAE,mBAAmB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KACzD,MAAM,CACL,KAAK,EACH,IAAc,EACd,IAA0E,EAC1E,EAAE;IACF,MAAM,cAAc,CAAC,IAAI,EAAE;QACzB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,GAAG;QACjB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAA;AACJ,CAAC,CACF,CAAA;AAEH,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,oDAAoD,CAAC;KACjE,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;KAC7C,SAAS,CAAC,UAAU,CAAC;KACrB,SAAS,CAAC,SAAS,CAAC;KACpB,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAAwC,EAAE,EAAE;IACxE,MAAM,aAAa,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;AACpE,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,yDAAyD,CAAC;KACtE,QAAQ,CAAC,eAAe,EAAE,sCAAsC,CAAC;KACjE,SAAS,CAAC,UAAU,CAAC;KACrB,SAAS,CAAC,SAAS,CAAC;KACpB,MAAM,CAAC,aAAa,EAAE,mBAAmB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KACzD,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,IAAqD,EAAE,EAAE;IAC3F,MAAM,eAAe,CAAC,WAAW,EAAE;QACjC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,GAAG;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEJ,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACjC,8EAA8E;IAC9E,+CAA+C;IAC/C,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;IACvC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
package/dist/client.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export type InternalClient = ContractRouterClient<InternalContract>;
|
|
|
6
6
|
export interface MarketClientOptions {
|
|
7
7
|
baseUrl?: string;
|
|
8
8
|
fetch?: typeof globalThis.fetch;
|
|
9
|
+
apiKey?: string;
|
|
9
10
|
}
|
|
10
11
|
export declare function createMarketClient(opts?: MarketClientOptions): MarketClient;
|
|
11
12
|
export declare function createInternalClient(opts?: MarketClientOptions): InternalClient;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAE9D,MAAM,MAAM,YAAY,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAA;AAC5D,MAAM,MAAM,cAAc,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,CAAA;AAInE,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAE9D,MAAM,MAAM,YAAY,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAA;AAC5D,MAAM,MAAM,cAAc,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,CAAA;AAInE,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAMD,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,mBAAwB,GAAG,YAAY,CAQ/E;AAED,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,mBAAwB,GAAG,cAAc,CAQnF"}
|
package/dist/client.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { createORPCClient } from '@orpc/client';
|
|
2
2
|
import { RPCLink } from '@orpc/client/fetch';
|
|
3
3
|
const DEFAULT_BASE_URL = 'https://api.market.drawcall.ai';
|
|
4
|
+
function buildHeaders(apiKey) {
|
|
5
|
+
return apiKey ? { 'x-api-key': apiKey } : undefined;
|
|
6
|
+
}
|
|
4
7
|
export function createMarketClient(opts = {}) {
|
|
5
8
|
const baseUrl = opts.baseUrl || DEFAULT_BASE_URL;
|
|
6
9
|
const link = new RPCLink({
|
|
7
10
|
url: new URL('/api/rpc', baseUrl).href,
|
|
8
11
|
fetch: opts.fetch,
|
|
12
|
+
headers: buildHeaders(opts.apiKey),
|
|
9
13
|
});
|
|
10
14
|
return createORPCClient(link);
|
|
11
15
|
}
|
|
@@ -14,6 +18,7 @@ export function createInternalClient(opts = {}) {
|
|
|
14
18
|
const link = new RPCLink({
|
|
15
19
|
url: new URL('/api/internal-rpc', baseUrl).href,
|
|
16
20
|
fetch: opts.fetch,
|
|
21
|
+
headers: buildHeaders(opts.apiKey),
|
|
17
22
|
});
|
|
18
23
|
return createORPCClient(link);
|
|
19
24
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAQ5C,MAAM,gBAAgB,GAAG,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAQ5C,MAAM,gBAAgB,GAAG,gCAAgC,CAAA;AAQzD,SAAS,YAAY,CAAC,MAAe;IACnC,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA4B,EAAE;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAA;IAChD,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC;QACvB,GAAG,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI;QACtC,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;KACnC,CAAC,CAAA;IACF,OAAO,gBAAgB,CAAe,IAAI,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAA4B,EAAE;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAA;IAChD,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC;QACvB,GAAG,EAAE,IAAI,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC,IAAI;QAC/C,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;KACnC,CAAC,CAAA;IACF,OAAO,gBAAgB,CAAiB,IAAI,CAAC,CAAA;AAC/C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AssetType } from '../schemas.js';
|
|
2
|
+
export interface GenerateCommandOptions {
|
|
3
|
+
type?: AssetType;
|
|
4
|
+
cwd?: string;
|
|
5
|
+
baseUrl?: string;
|
|
6
|
+
unapproved?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function generateCommand(description: string, opts: GenerateCommandOptions): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAoCf"}
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
export async function generateCommand(description, opts) {
|
|
8
|
+
const { client } = await getCliClient({ baseUrl: opts.baseUrl, requireAuth: true });
|
|
9
|
+
const spinner = ora(`Generating "${description}"`).start();
|
|
10
|
+
try {
|
|
11
|
+
const generated = await generateAndWait(client, { description, type: opts.type }, {
|
|
12
|
+
onProgress: (msg) => {
|
|
13
|
+
spinner.text = msg;
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
spinner.text = `Resolving ${generated.assetName}@${generated.version}`;
|
|
17
|
+
const resolution = await resolve(client.asset, [{ name: generated.assetName, range: generated.version }], { includeUnapproved: opts.unapproved ?? false });
|
|
18
|
+
await runInstall(client, resolution, {
|
|
19
|
+
cwd: opts.cwd,
|
|
20
|
+
onProgress: (msg) => {
|
|
21
|
+
spinner.text = msg;
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
spinner.succeed(`Installed ${chalk.cyan(generated.assetName)}${chalk.dim('@' + generated.version)}`);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
spinner.fail(err instanceof Error ? err.message : String(err));
|
|
28
|
+
throw err;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,eAAe,CAAA;AAUrD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAAmB,EACnB,IAA4B;IAE5B,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,eAAe,WAAW,GAAG,CAAC,CAAC,KAAK,EAAE,CAAA;IAC1D,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,eAAe,CACrC,MAAM,EACN,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAChC;YACE,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;gBAClB,OAAO,CAAC,IAAI,GAAG,GAAG,CAAA;YACpB,CAAC;SACF,CACF,CAAA;QAED,OAAO,CAAC,IAAI,GAAG,aAAa,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,OAAO,EAAE,CAAA;QACtE,MAAM,UAAU,GAAG,MAAM,OAAO,CAC9B,MAAM,CAAC,KAAK,EACZ,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,EACzD,EAAE,iBAAiB,EAAE,IAAI,CAAC,UAAU,IAAI,KAAK,EAAE,CAChD,CAAA;QAED,MAAM,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE;YACnC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;gBAClB,OAAO,CAAC,IAAI,GAAG,GAAG,CAAA;YACpB,CAAC;SACF,CAAC,CAAA;QAEF,OAAO,CAAC,OAAO,CACb,aAAa,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,CACpF,CAAA;IACH,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;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type AssetType } from '../schemas.js';
|
|
2
|
+
export interface InstallCommandOptions {
|
|
3
|
+
type?: AssetType;
|
|
4
|
+
unapproved?: boolean;
|
|
5
|
+
cwd?: string;
|
|
6
|
+
baseUrl?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function installCommand(args: string[], opts: InstallCommandOptions): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAKA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAA;AAI/D,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAOD,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC/F"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { resolve } from '../resolve.js';
|
|
4
|
+
import { install as runInstall } from '../install.js';
|
|
5
|
+
import { generateAndWait } from '../generate.js';
|
|
6
|
+
import { assetNameSchema } from '../schemas.js';
|
|
7
|
+
import { getCliClient } from '../cli-client.js';
|
|
8
|
+
export async function installCommand(args, opts) {
|
|
9
|
+
const { client, apiKey } = await getCliClient({ baseUrl: opts.baseUrl });
|
|
10
|
+
const canGenerate = Boolean(apiKey);
|
|
11
|
+
const spinner = ora().start();
|
|
12
|
+
try {
|
|
13
|
+
const requests = [];
|
|
14
|
+
for (const arg of args) {
|
|
15
|
+
spinner.text = `Resolving "${truncate(arg, 40)}"`;
|
|
16
|
+
requests.push(await resolveArg(client, arg, opts.type, spinner, canGenerate));
|
|
17
|
+
}
|
|
18
|
+
spinner.text = 'Resolving dependency tree';
|
|
19
|
+
const resolution = await resolve(client.asset, requests, {
|
|
20
|
+
includeUnapproved: opts.unapproved ?? false,
|
|
21
|
+
});
|
|
22
|
+
await runInstall(client, resolution, {
|
|
23
|
+
cwd: opts.cwd,
|
|
24
|
+
onProgress: (msg) => {
|
|
25
|
+
spinner.text = msg;
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
spinner.succeed(`Installed ${resolution.assets.length} asset(s): ` +
|
|
29
|
+
resolution.assets.map((a) => chalk.cyan(a.name) + chalk.dim('@' + a.version)).join(', '));
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
spinner.fail(err instanceof Error ? err.message : String(err));
|
|
33
|
+
throw err;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Fallthrough: exact-name → top-1 search hit → auto-generate (auth only).
|
|
38
|
+
*/
|
|
39
|
+
async function resolveArg(client, arg, type, spinner, canGenerate) {
|
|
40
|
+
// 1. Try parsing as asset-name[@range] and looking up exact
|
|
41
|
+
const parsed = parseNameAndRange(arg);
|
|
42
|
+
if (parsed) {
|
|
43
|
+
const existing = await client.asset.getByName({ name: parsed.name });
|
|
44
|
+
if (existing)
|
|
45
|
+
return parsed;
|
|
46
|
+
}
|
|
47
|
+
// 2. Semantic search — top-1
|
|
48
|
+
spinner.text = `Searching "${truncate(arg, 40)}"`;
|
|
49
|
+
const results = await client.asset.list({
|
|
50
|
+
search: arg,
|
|
51
|
+
type,
|
|
52
|
+
limit: 1,
|
|
53
|
+
page: 1,
|
|
54
|
+
sort: 'relevance',
|
|
55
|
+
});
|
|
56
|
+
if (results.items.length > 0) {
|
|
57
|
+
const hit = results.items[0];
|
|
58
|
+
spinner.info(`Matched "${chalk.cyan(hit.name)}" ${chalk.dim(`(${hit.type})`)} for "${arg}"`);
|
|
59
|
+
spinner.start();
|
|
60
|
+
return { name: hit.name, range: '*' };
|
|
61
|
+
}
|
|
62
|
+
// 3. Auto-generate (requires auth)
|
|
63
|
+
if (!canGenerate) {
|
|
64
|
+
throw new Error(`No matches for "${arg}". Run \`market login\` to enable auto-generation of missing assets.`);
|
|
65
|
+
}
|
|
66
|
+
spinner.text = `No matches — generating "${truncate(arg, 40)}"`;
|
|
67
|
+
const generated = await generateAndWait(client, { description: arg, type }, {
|
|
68
|
+
onProgress: (msg) => {
|
|
69
|
+
spinner.text = msg;
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
spinner.info(`Generated ${chalk.cyan(generated.assetName)}${chalk.dim('@' + generated.version)} for "${arg}"`);
|
|
73
|
+
spinner.start();
|
|
74
|
+
return { name: generated.assetName, range: generated.version };
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Returns { name, range } if the arg parses as `<asset-name>[@<range>]`.
|
|
78
|
+
* Returns null if the name portion fails the asset-name schema (e.g. has spaces).
|
|
79
|
+
*/
|
|
80
|
+
function parseNameAndRange(arg) {
|
|
81
|
+
const atIdx = arg.indexOf('@');
|
|
82
|
+
const name = atIdx >= 0 ? arg.slice(0, atIdx) : arg;
|
|
83
|
+
const range = atIdx >= 0 ? arg.slice(atIdx + 1) : '*';
|
|
84
|
+
return assetNameSchema.safeParse(name).success ? { name, range } : null;
|
|
85
|
+
}
|
|
86
|
+
function truncate(s, max) {
|
|
87
|
+
return s.length > max ? s.slice(0, max - 1) + '…' : s;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface LoginOptions {
|
|
2
|
+
baseUrl: string;
|
|
3
|
+
timeoutMs?: number;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Spins up a localhost HTTP server, opens the browser to {baseUrl}/cli-auth,
|
|
7
|
+
* waits for the web app to redirect back with the key, saves it to config.
|
|
8
|
+
*/
|
|
9
|
+
export declare function login(opts: LoginOptions): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC7D"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import * as http from 'http';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import open from 'open';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import { createMarketClient } from '../client.js';
|
|
6
|
+
import { saveConfig, getConfigPath } from '../config.js';
|
|
7
|
+
/**
|
|
8
|
+
* Spins up a localhost HTTP server, opens the browser to {baseUrl}/cli-auth,
|
|
9
|
+
* waits for the web app to redirect back with the key, saves it to config.
|
|
10
|
+
*/
|
|
11
|
+
export async function login(opts) {
|
|
12
|
+
const timeoutMs = opts.timeoutMs ?? 120_000;
|
|
13
|
+
const state = crypto.randomUUID();
|
|
14
|
+
const { port, waitForKey, close } = await startCallbackServer(state, timeoutMs);
|
|
15
|
+
const authUrl = new URL('/cli-auth', opts.baseUrl);
|
|
16
|
+
authUrl.searchParams.set('state', state);
|
|
17
|
+
authUrl.searchParams.set('callback', `http://127.0.0.1:${port}/callback`);
|
|
18
|
+
console.log(chalk.dim(`If your browser doesn't open, visit:\n ${authUrl.toString()}`));
|
|
19
|
+
await open(authUrl.toString()).catch(() => { });
|
|
20
|
+
const spinner = ora('Waiting for browser approval…').start();
|
|
21
|
+
try {
|
|
22
|
+
const key = await waitForKey;
|
|
23
|
+
spinner.text = 'Verifying key…';
|
|
24
|
+
const verifyClient = createMarketClient({ baseUrl: opts.baseUrl, apiKey: key });
|
|
25
|
+
const profile = await verifyClient.user.getProfile();
|
|
26
|
+
if (!profile) {
|
|
27
|
+
throw new Error('Key was not accepted by the server.');
|
|
28
|
+
}
|
|
29
|
+
await saveConfig({ apiKey: key, baseUrl: opts.baseUrl });
|
|
30
|
+
spinner.succeed(`Logged in as ${chalk.cyan(profile.email)}`);
|
|
31
|
+
console.log(chalk.dim(` Key saved to ${getConfigPath()}`));
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
spinner.fail(err instanceof Error ? err.message : String(err));
|
|
35
|
+
throw err;
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
close();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function startCallbackServer(expectedState, timeoutMs) {
|
|
42
|
+
let resolveKey;
|
|
43
|
+
let rejectKey;
|
|
44
|
+
const waitForKey = new Promise((resolve, reject) => {
|
|
45
|
+
resolveKey = resolve;
|
|
46
|
+
rejectKey = reject;
|
|
47
|
+
});
|
|
48
|
+
const server = http.createServer((req, res) => {
|
|
49
|
+
if (!req.url) {
|
|
50
|
+
res.writeHead(400).end();
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const url = new URL(req.url, 'http://localhost');
|
|
54
|
+
if (url.pathname !== '/callback') {
|
|
55
|
+
res.writeHead(404).end();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const receivedState = url.searchParams.get('state');
|
|
59
|
+
const receivedKey = url.searchParams.get('key');
|
|
60
|
+
if (receivedState !== expectedState) {
|
|
61
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
62
|
+
res.end('<h1>Invalid state</h1><p>You can close this window.</p>');
|
|
63
|
+
rejectKey(new Error('Invalid state parameter from callback.'));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (!receivedKey) {
|
|
67
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
68
|
+
res.end('<h1>Missing key</h1><p>You can close this window.</p>');
|
|
69
|
+
rejectKey(new Error('Callback did not include a key.'));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
73
|
+
res.end('<h1>Logged in!</h1><p>You can close this window.</p>');
|
|
74
|
+
resolveKey(receivedKey);
|
|
75
|
+
});
|
|
76
|
+
await new Promise((resolve, reject) => {
|
|
77
|
+
server.once('error', reject);
|
|
78
|
+
server.listen(0, '127.0.0.1', () => resolve());
|
|
79
|
+
});
|
|
80
|
+
const address = server.address();
|
|
81
|
+
if (!address)
|
|
82
|
+
throw new Error('Failed to bind local callback server.');
|
|
83
|
+
const timer = setTimeout(() => {
|
|
84
|
+
rejectKey(new Error(`Timed out after ${timeoutMs / 1000}s waiting for browser approval.`));
|
|
85
|
+
}, timeoutMs);
|
|
86
|
+
const close = () => {
|
|
87
|
+
clearTimeout(timer);
|
|
88
|
+
server.close();
|
|
89
|
+
};
|
|
90
|
+
return { port: address.port, waitForKey, close };
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAO5C"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { clearConfig, getConfigPath } from '../config.js';
|
|
3
|
+
export async function logout() {
|
|
4
|
+
const existed = await clearConfig();
|
|
5
|
+
if (existed) {
|
|
6
|
+
console.log(chalk.green('Logged out.') + chalk.dim(` (${getConfigPath()} removed)`));
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
console.log(chalk.dim('Already logged out.'));
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEzD,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAA;IACnC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,aAAa,EAAE,WAAW,CAAC,CAAC,CAAA;IACtF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AssetType } from '../schemas.js';
|
|
2
|
+
export interface SearchCommandOptions {
|
|
3
|
+
type?: AssetType;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function searchCommand(query: string, opts: SearchCommandOptions): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAI9C,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B5F"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { getCliClient } from '../cli-client.js';
|
|
4
|
+
const SEARCH_LIMIT = 10;
|
|
5
|
+
export async function searchCommand(query, opts) {
|
|
6
|
+
const { client } = await getCliClient({ baseUrl: opts.baseUrl });
|
|
7
|
+
const spinner = ora(`Searching "${query}"`).start();
|
|
8
|
+
let results;
|
|
9
|
+
try {
|
|
10
|
+
results = await client.asset.list({
|
|
11
|
+
search: query,
|
|
12
|
+
type: opts.type,
|
|
13
|
+
limit: SEARCH_LIMIT,
|
|
14
|
+
page: 1,
|
|
15
|
+
sort: 'relevance',
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
spinner.fail(err instanceof Error ? err.message : String(err));
|
|
20
|
+
throw err;
|
|
21
|
+
}
|
|
22
|
+
spinner.stop();
|
|
23
|
+
if (results.items.length === 0) {
|
|
24
|
+
console.log(chalk.dim('No matches.'));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
for (const item of results.items) {
|
|
28
|
+
const desc = item.description ? chalk.dim(` — ${item.description}`) : '';
|
|
29
|
+
console.log(` ${chalk.cyan(item.name)} ${chalk.dim(`(${item.type})`)}${desc}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -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,CAAC,CAAA;IAEhE,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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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
|