@polargrid/cli 0.1.0

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 (50) hide show
  1. package/README.md +129 -0
  2. package/dist/bin/polargrid.d.ts +3 -0
  3. package/dist/bin/polargrid.d.ts.map +1 -0
  4. package/dist/bin/polargrid.js +48 -0
  5. package/dist/bin/polargrid.js.map +1 -0
  6. package/dist/commands/config.d.ts +3 -0
  7. package/dist/commands/config.d.ts.map +1 -0
  8. package/dist/commands/config.js +88 -0
  9. package/dist/commands/config.js.map +1 -0
  10. package/dist/commands/keys.d.ts +3 -0
  11. package/dist/commands/keys.d.ts.map +1 -0
  12. package/dist/commands/keys.js +134 -0
  13. package/dist/commands/keys.js.map +1 -0
  14. package/dist/commands/login.d.ts +5 -0
  15. package/dist/commands/login.d.ts.map +1 -0
  16. package/dist/commands/login.js +87 -0
  17. package/dist/commands/login.js.map +1 -0
  18. package/dist/commands/orgs.d.ts +3 -0
  19. package/dist/commands/orgs.d.ts.map +1 -0
  20. package/dist/commands/orgs.js +119 -0
  21. package/dist/commands/orgs.js.map +1 -0
  22. package/dist/commands/regions.d.ts +3 -0
  23. package/dist/commands/regions.d.ts.map +1 -0
  24. package/dist/commands/regions.js +108 -0
  25. package/dist/commands/regions.js.map +1 -0
  26. package/dist/commands/test.d.ts +3 -0
  27. package/dist/commands/test.d.ts.map +1 -0
  28. package/dist/commands/test.js +186 -0
  29. package/dist/commands/test.js.map +1 -0
  30. package/dist/index.d.ts +5 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +6 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/lib/api.d.ts +40 -0
  35. package/dist/lib/api.d.ts.map +1 -0
  36. package/dist/lib/api.js +237 -0
  37. package/dist/lib/api.js.map +1 -0
  38. package/dist/lib/auth.d.ts +19 -0
  39. package/dist/lib/auth.d.ts.map +1 -0
  40. package/dist/lib/auth.js +308 -0
  41. package/dist/lib/auth.js.map +1 -0
  42. package/dist/lib/config.d.ts +27 -0
  43. package/dist/lib/config.d.ts.map +1 -0
  44. package/dist/lib/config.js +114 -0
  45. package/dist/lib/config.js.map +1 -0
  46. package/dist/lib/output.d.ts +34 -0
  47. package/dist/lib/output.d.ts.map +1 -0
  48. package/dist/lib/output.js +214 -0
  49. package/dist/lib/output.js.map +1 -0
  50. package/package.json +53 -0
package/README.md ADDED
@@ -0,0 +1,129 @@
1
+ # PolarGrid CLI
2
+
3
+ Command-line interface for PolarGrid Edge AI Infrastructure.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g @polargrid/cli
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```bash
14
+ # Login to PolarGrid
15
+ polargrid login
16
+
17
+ # List your organizations
18
+ polargrid orgs list
19
+
20
+ # Create an API key
21
+ polargrid keys create my-app-key
22
+
23
+ # Test inference
24
+ polargrid test inference --region us-east --prompt "Hello world"
25
+ ```
26
+
27
+ ## Commands
28
+
29
+ ### Authentication
30
+
31
+ ```bash
32
+ polargrid login # Browser OAuth flow
33
+ polargrid login --headless # API key authentication (for CI/CD)
34
+ polargrid logout # Clear stored credentials
35
+ polargrid whoami # Show current user and organization
36
+ ```
37
+
38
+ ### Organizations
39
+
40
+ ```bash
41
+ polargrid orgs list # List organizations you belong to
42
+ polargrid orgs switch <org_id> # Switch to a different organization
43
+ polargrid orgs current # Show current organization
44
+ ```
45
+
46
+ ### API Keys
47
+
48
+ ```bash
49
+ polargrid keys list # List API keys
50
+ polargrid keys create <name> # Create a new API key
51
+ --permissions <level> # read-only, read-write, or admin
52
+ --project <id> # Scope to a specific project
53
+ polargrid keys revoke <key_id> # Revoke an API key
54
+ ```
55
+
56
+ ### Regions
57
+
58
+ ```bash
59
+ polargrid regions list # List available regions with latency
60
+ polargrid regions ping # Ping all regions, show RTT
61
+ ```
62
+
63
+ ### Testing
64
+
65
+ ```bash
66
+ polargrid test # Health check (default)
67
+ polargrid test health # Check edge infrastructure health
68
+ --region <region> # Specific region or all
69
+ polargrid test inference # Run a quick inference test
70
+ --region <region> # Required: target region
71
+ --model <model> # Model to use (default: gpt2)
72
+ --prompt <prompt> # Prompt to send
73
+ ```
74
+
75
+ ### Configuration
76
+
77
+ ```bash
78
+ polargrid config list # Show current config
79
+ polargrid config get <key> # Get a config value
80
+ polargrid config set <key> <val> # Set a config value
81
+ polargrid config unset <key> # Remove a config value
82
+ ```
83
+
84
+ **Config options:**
85
+ - `default_region` - Default edge region for requests
86
+ - `output_format` - Output format: json, table, or plain
87
+ - `api_base_url` - Override API base URL
88
+
89
+ ## CI/CD Usage
90
+
91
+ For CI/CD pipelines, use the `--headless` flag with an API key:
92
+
93
+ ```bash
94
+ # Set API key as environment variable
95
+ export POLARGRID_API_KEY="pg_your_api_key_here"
96
+
97
+ # Login in headless mode
98
+ polargrid login --headless
99
+
100
+ # Or pass the key directly
101
+ polargrid login --headless --api-key "pg_your_api_key_here"
102
+ ```
103
+
104
+ ## Configuration Files
105
+
106
+ The CLI stores configuration in `~/.polargrid/`:
107
+
108
+ - `credentials.json` - Authentication tokens (mode 0600)
109
+ - `config.json` - CLI configuration
110
+
111
+ ## Development
112
+
113
+ ```bash
114
+ # Install dependencies
115
+ npm install
116
+
117
+ # Build
118
+ npm run build
119
+
120
+ # Run locally
121
+ npm start -- --help
122
+
123
+ # Watch mode
124
+ npm run dev
125
+ ```
126
+
127
+ ## License
128
+
129
+ MIT
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=polargrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polargrid.d.ts","sourceRoot":"","sources":["../../src/bin/polargrid.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { loginCommand, logoutCommand, whoamiCommand } from '../commands/login.js';
5
+ import { orgsCommand } from '../commands/orgs.js';
6
+ import { keysCommand } from '../commands/keys.js';
7
+ import { regionsCommand } from '../commands/regions.js';
8
+ import { configCommand } from '../commands/config.js';
9
+ import { testCommand } from '../commands/test.js';
10
+ const program = new Command();
11
+ program
12
+ .name('polargrid')
13
+ .description('PolarGrid CLI - Command-line interface for PolarGrid Edge AI Infrastructure')
14
+ .version('0.1.0');
15
+ // Auth commands
16
+ program.addCommand(loginCommand);
17
+ program.addCommand(logoutCommand);
18
+ program.addCommand(whoamiCommand);
19
+ // Resource commands
20
+ program.addCommand(orgsCommand);
21
+ program.addCommand(keysCommand);
22
+ program.addCommand(regionsCommand);
23
+ // Utility commands
24
+ program.addCommand(configCommand);
25
+ program.addCommand(testCommand);
26
+ // Custom help
27
+ program.addHelpText('after', `
28
+ ${chalk.bold('Examples:')}
29
+ ${chalk.dim('# Login to PolarGrid')}
30
+ $ polargrid login
31
+
32
+ ${chalk.dim('# List your organizations')}
33
+ $ polargrid orgs list
34
+
35
+ ${chalk.dim('# Create an API key')}
36
+ $ polargrid keys create my-app-key
37
+
38
+ ${chalk.dim('# Test inference')}
39
+ $ polargrid test inference --region us-east --prompt "Hello world"
40
+
41
+ ${chalk.dim('# Check all regions')}
42
+ $ polargrid regions ping
43
+
44
+ ${chalk.bold('Documentation:')}
45
+ https://docs.polargrid.ai/cli
46
+ `);
47
+ program.parse();
48
+ //# sourceMappingURL=polargrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polargrid.js","sourceRoot":"","sources":["../../src/bin/polargrid.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,6EAA6E,CAAC;KAC1F,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,gBAAgB;AAChB,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AAEnC,mBAAmB;AACnB,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAEhC,cAAc;AACd,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE;EAC3B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;IACrB,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;;;IAGjC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC;;;IAGtC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC;;;IAGhC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC;;;IAG7B,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC;;;EAGlC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC;;CAE7B,CAAC,CAAC;AAEH,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const configCommand: Command;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,eAAO,MAAM,aAAa,SACgB,CAAC"}
@@ -0,0 +1,88 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { getConfig, setConfigValue, deleteConfigValue, listConfig } from '../lib/config.js';
4
+ import { success, error } from '../lib/output.js';
5
+ const VALID_KEYS = [
6
+ 'default_region',
7
+ 'output_format',
8
+ 'api_base_url',
9
+ 'supabase_url',
10
+ 'supabase_anon_key',
11
+ ];
12
+ const KEY_DESCRIPTIONS = {
13
+ default_region: 'Default edge region for requests',
14
+ output_format: 'Output format: json, table, or plain',
15
+ api_base_url: 'Override API base URL',
16
+ supabase_url: 'Supabase project URL',
17
+ supabase_anon_key: 'Supabase anonymous key',
18
+ };
19
+ export const configCommand = new Command('config')
20
+ .description('Manage CLI configuration');
21
+ configCommand
22
+ .command('list')
23
+ .description('List all configuration values')
24
+ .action(() => {
25
+ const config = listConfig();
26
+ console.log();
27
+ console.log(chalk.bold('Configuration'));
28
+ console.log();
29
+ for (const [key, value] of Object.entries(config)) {
30
+ const displayValue = value || chalk.dim('(not set)');
31
+ const description = KEY_DESCRIPTIONS[key] || '';
32
+ console.log(` ${chalk.cyan(key)}: ${displayValue}`);
33
+ if (description) {
34
+ console.log(` ${chalk.dim(description)}`);
35
+ }
36
+ }
37
+ console.log();
38
+ console.log(chalk.dim('Config file: ~/.polargrid/config.json'));
39
+ console.log();
40
+ });
41
+ configCommand
42
+ .command('get <key>')
43
+ .description('Get a configuration value')
44
+ .action((key) => {
45
+ const config = getConfig();
46
+ const value = config[key];
47
+ if (value === undefined) {
48
+ if (!VALID_KEYS.includes(key)) {
49
+ error(`Unknown config key: ${key}`);
50
+ console.log(`\nValid keys: ${VALID_KEYS.join(', ')}\n`);
51
+ process.exit(1);
52
+ }
53
+ console.log(chalk.dim('(not set)'));
54
+ }
55
+ else {
56
+ console.log(value);
57
+ }
58
+ });
59
+ configCommand
60
+ .command('set <key> <value>')
61
+ .description('Set a configuration value')
62
+ .action((key, value) => {
63
+ if (!VALID_KEYS.includes(key)) {
64
+ error(`Unknown config key: ${key}`);
65
+ console.log(`\nValid keys: ${VALID_KEYS.join(', ')}\n`);
66
+ process.exit(1);
67
+ }
68
+ // Validate specific keys
69
+ if (key === 'output_format' && !['json', 'table', 'plain'].includes(value)) {
70
+ error('Invalid output_format. Must be: json, table, or plain');
71
+ process.exit(1);
72
+ }
73
+ setConfigValue(key, value);
74
+ success(`Set ${key} = ${value}`);
75
+ });
76
+ configCommand
77
+ .command('unset <key>')
78
+ .description('Remove a configuration value')
79
+ .action((key) => {
80
+ if (!VALID_KEYS.includes(key)) {
81
+ error(`Unknown config key: ${key}`);
82
+ console.log(`\nValid keys: ${VALID_KEYS.join(', ')}\n`);
83
+ process.exit(1);
84
+ }
85
+ deleteConfigValue(key);
86
+ success(`Unset ${key}`);
87
+ });
88
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const keysCommand: Command;
3
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/commands/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,WAAW,SACS,CAAC"}
@@ -0,0 +1,134 @@
1
+ import { Command } from 'commander';
2
+ import ora from 'ora';
3
+ import chalk from 'chalk';
4
+ import { isLoggedIn } from '../lib/config.js';
5
+ import { getCurrentUser, getApiKeys, createApiKey, revokeApiKey } from '../lib/api.js';
6
+ import { formatKeysTable, error } from '../lib/output.js';
7
+ export const keysCommand = new Command('keys')
8
+ .description('Manage API keys');
9
+ keysCommand
10
+ .command('list')
11
+ .description('List API keys for current organization')
12
+ .action(async () => {
13
+ if (!isLoggedIn()) {
14
+ error('Not logged in. Run `polargrid login` first.');
15
+ process.exit(1);
16
+ }
17
+ const spinner = ora('Fetching API keys...').start();
18
+ try {
19
+ const user = await getCurrentUser();
20
+ if (!user) {
21
+ spinner.fail('Failed to get user info');
22
+ process.exit(1);
23
+ }
24
+ const keys = await getApiKeys(user.id);
25
+ spinner.stop();
26
+ if (keys.length === 0) {
27
+ console.log(chalk.dim('\nNo API keys found.'));
28
+ console.log('Run `polargrid keys create <name>` to create one.\n');
29
+ return;
30
+ }
31
+ const rows = keys.map(k => ({
32
+ id: k.id,
33
+ name: k.name,
34
+ preview: k.key_preview,
35
+ permissions: k.permissions,
36
+ created: k.created_at,
37
+ lastUsed: k.last_used_at || null,
38
+ }));
39
+ console.log();
40
+ console.log(formatKeysTable(rows));
41
+ }
42
+ catch (err) {
43
+ spinner.fail(`Error: ${err instanceof Error ? err.message : 'Unknown error'}`);
44
+ process.exit(1);
45
+ }
46
+ });
47
+ keysCommand
48
+ .command('create <name>')
49
+ .description('Create a new API key')
50
+ .option('-p, --permissions <level>', 'Permission level: read-only, read-write, admin', 'read-write')
51
+ .option('--project <id>', 'Scope key to a specific project')
52
+ .action(async (name, options) => {
53
+ if (!isLoggedIn()) {
54
+ error('Not logged in. Run `polargrid login` first.');
55
+ process.exit(1);
56
+ }
57
+ // Validate permissions
58
+ const validPermissions = ['read-only', 'read-write', 'admin'];
59
+ if (!validPermissions.includes(options.permissions)) {
60
+ error(`Invalid permissions: ${options.permissions}`);
61
+ console.log(`Valid options: ${validPermissions.join(', ')}\n`);
62
+ process.exit(1);
63
+ }
64
+ const spinner = ora('Creating API key...').start();
65
+ try {
66
+ const user = await getCurrentUser();
67
+ if (!user) {
68
+ spinner.fail('Failed to get user info');
69
+ process.exit(1);
70
+ }
71
+ const result = await createApiKey(user.id, name, options.permissions, options.project);
72
+ spinner.succeed('API key created successfully');
73
+ console.log();
74
+ console.log(chalk.bold('Your new API key:'));
75
+ console.log();
76
+ console.log(` ${chalk.green(result.fullKey)}`);
77
+ console.log();
78
+ console.log(chalk.yellow('⚠ Make sure to copy this key now. You won\'t be able to see it again!'));
79
+ console.log();
80
+ console.log('Use this key with the SDK:');
81
+ console.log(chalk.dim(` const client = new PolarGrid({ apiKey: '${result.fullKey}' })`));
82
+ console.log();
83
+ console.log('Or set it as an environment variable:');
84
+ console.log(chalk.dim(` export POLARGRID_API_KEY="${result.fullKey}"`));
85
+ console.log();
86
+ }
87
+ catch (err) {
88
+ spinner.fail(`Error: ${err instanceof Error ? err.message : 'Unknown error'}`);
89
+ process.exit(1);
90
+ }
91
+ });
92
+ keysCommand
93
+ .command('revoke <key_id>')
94
+ .description('Revoke an API key')
95
+ .option('-y, --yes', 'Skip confirmation')
96
+ .action(async (keyId, options) => {
97
+ if (!isLoggedIn()) {
98
+ error('Not logged in. Run `polargrid login` first.');
99
+ process.exit(1);
100
+ }
101
+ if (!options.yes) {
102
+ // Confirmation prompt
103
+ const readline = await import('readline');
104
+ const rl = readline.createInterface({
105
+ input: process.stdin,
106
+ output: process.stdout,
107
+ });
108
+ const confirmed = await new Promise((resolve) => {
109
+ rl.question(chalk.yellow(`Are you sure you want to revoke key ${keyId}? This cannot be undone. [y/N] `), (answer) => {
110
+ rl.close();
111
+ resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
112
+ });
113
+ });
114
+ if (!confirmed) {
115
+ console.log('Cancelled.');
116
+ return;
117
+ }
118
+ }
119
+ const spinner = ora('Revoking API key...').start();
120
+ try {
121
+ const user = await getCurrentUser();
122
+ if (!user) {
123
+ spinner.fail('Failed to get user info');
124
+ process.exit(1);
125
+ }
126
+ await revokeApiKey(user.id, keyId);
127
+ spinner.succeed('API key revoked successfully');
128
+ }
129
+ catch (err) {
130
+ spinner.fail(`Error: ${err instanceof Error ? err.message : 'Unknown error'}`);
131
+ process.exit(1);
132
+ }
133
+ });
134
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/commands/keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Command } from 'commander';
2
+ export declare const loginCommand: Command;
3
+ export declare const logoutCommand: Command;
4
+ export declare const whoamiCommand: Command;
5
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,YAAY,SAoCrB,CAAC;AAEL,eAAO,MAAM,aAAa,SAKtB,CAAC;AAEL,eAAO,MAAM,aAAa,SA0CtB,CAAC"}
@@ -0,0 +1,87 @@
1
+ import chalk from 'chalk';
2
+ import { Command } from 'commander';
3
+ import ora from 'ora';
4
+ import { getCurrentOrganization, getCurrentUser } from '../lib/api.js';
5
+ import { browserLogin, logout } from '../lib/auth.js';
6
+ import { getCredentials, isLoggedIn } from '../lib/config.js';
7
+ import { error, info, success } from '../lib/output.js';
8
+ export const loginCommand = new Command('login')
9
+ .description('Authenticate with PolarGrid')
10
+ .option('--headless', 'Show CI/CD usage instructions')
11
+ .option('--api-key <key>', 'Deprecated: use POLARGRID_API_KEY env var instead')
12
+ .action(async (options) => {
13
+ // CI/CD mode - just show instructions
14
+ if (options.headless || options.apiKey) {
15
+ console.log('\n' + chalk.bold('CI/CD Authentication'));
16
+ console.log('\nFor CI/CD pipelines, no login is needed.');
17
+ console.log('Just set the POLARGRID_API_KEY environment variable:\n');
18
+ console.log(chalk.cyan(' export POLARGRID_API_KEY="pg_your_key_here"'));
19
+ console.log(chalk.cyan(' polargrid test inference --region us-east --prompt "Hello"'));
20
+ console.log('\nFor org/key management, use `polargrid login` (browser auth).\n');
21
+ return;
22
+ }
23
+ // Check if already logged in
24
+ if (isLoggedIn()) {
25
+ const creds = getCredentials();
26
+ info(`Already logged in${creds?.email ? ` as ${creds.email}` : ''}`);
27
+ console.log('Run `polargrid logout` first if you want to switch accounts.\n');
28
+ return;
29
+ }
30
+ // Browser-based OAuth
31
+ const result = await browserLogin();
32
+ if (result.success) {
33
+ console.log();
34
+ success(`Logged in as ${chalk.bold(result.email)}`);
35
+ console.log('\nRun `polargrid whoami` to see your current context.\n');
36
+ }
37
+ else {
38
+ console.log();
39
+ error(`Authentication failed: ${result.error}`);
40
+ process.exit(1);
41
+ }
42
+ });
43
+ export const logoutCommand = new Command('logout')
44
+ .description('Log out of PolarGrid')
45
+ .action(() => {
46
+ logout();
47
+ success('Logged out successfully');
48
+ });
49
+ export const whoamiCommand = new Command('whoami')
50
+ .description('Display current user and organization')
51
+ .action(async () => {
52
+ if (!isLoggedIn()) {
53
+ error('Not logged in. Run `polargrid login` first.');
54
+ process.exit(1);
55
+ }
56
+ const spinner = ora('Fetching user info...').start();
57
+ try {
58
+ const user = await getCurrentUser();
59
+ if (!user) {
60
+ spinner.fail('Failed to get user info. Try logging in again.');
61
+ process.exit(1);
62
+ }
63
+ const org = await getCurrentOrganization(user.id);
64
+ spinner.stop();
65
+ console.log();
66
+ console.log(chalk.bold('User'));
67
+ console.log(` Email: ${chalk.cyan(user.email)}`);
68
+ console.log(` ID: ${chalk.dim(user.id)}`);
69
+ console.log();
70
+ if (org) {
71
+ console.log(chalk.bold('Current Organization'));
72
+ console.log(` Name: ${chalk.cyan(org.name)}`);
73
+ console.log(` ID: ${chalk.dim(org.id)}`);
74
+ console.log(` Plan: ${org.plan}`);
75
+ }
76
+ else {
77
+ console.log(chalk.yellow('No organization selected.'));
78
+ console.log('Run `polargrid orgs list` to see your organizations.');
79
+ }
80
+ console.log();
81
+ }
82
+ catch (err) {
83
+ spinner.fail(`Error: ${err instanceof Error ? err.message : 'Unknown error'}`);
84
+ process.exit(1);
85
+ }
86
+ });
87
+ //# 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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const orgsCommand: Command;
3
+ //# sourceMappingURL=orgs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orgs.d.ts","sourceRoot":"","sources":["../../src/commands/orgs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,WAAW,SACc,CAAC"}