@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.
- package/README.md +129 -0
- package/dist/bin/polargrid.d.ts +3 -0
- package/dist/bin/polargrid.d.ts.map +1 -0
- package/dist/bin/polargrid.js +48 -0
- package/dist/bin/polargrid.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +88 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/keys.d.ts +3 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +134 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/login.d.ts +5 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +87 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/orgs.d.ts +3 -0
- package/dist/commands/orgs.d.ts.map +1 -0
- package/dist/commands/orgs.js +119 -0
- package/dist/commands/orgs.js.map +1 -0
- package/dist/commands/regions.d.ts +3 -0
- package/dist/commands/regions.d.ts.map +1 -0
- package/dist/commands/regions.js +108 -0
- package/dist/commands/regions.js.map +1 -0
- package/dist/commands/test.d.ts +3 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +186 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +40 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +237 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/auth.d.ts +19 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +308 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/config.d.ts +27 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +114 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/output.d.ts +34 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +214 -0
- package/dist/lib/output.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|