tuningengines-cli 0.1.0 → 0.2.1

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 ADDED
@@ -0,0 +1,206 @@
1
+ # Tuning Engines CLI & MCP Server
2
+
3
+ Fine-tune large language models from your terminal or AI assistant. Train custom models on your code repositories with a single command.
4
+
5
+ **[Tuning Engines](https://tuningengines.com)** is a managed fine-tuning platform that handles GPU infrastructure, training orchestration, billing, and model storage — so you can focus on building better models.
6
+
7
+ ## Features
8
+
9
+ - **Browser-based auth** — `te auth login` opens your browser to sign up or log in (like `gh auth login`)
10
+ - **Full training lifecycle** — create, monitor, cancel, and retry fine-tuning jobs
11
+ - **Model management** — list, import, export, and delete your trained models
12
+ - **Cost estimation** — get estimates before committing to a training run
13
+ - **S3 integration** — validate credentials and export models to your own S3 buckets
14
+ - **MCP server** — 18 tools for AI assistants (Claude, ChatGPT, Cursor, VS Code Copilot, etc.)
15
+ - **Billing** — check balance, open browser to add credits
16
+
17
+ ## Quick Start
18
+
19
+ ```bash
20
+ npm install -g tuningengines-cli
21
+
22
+ # Sign up or log in (opens browser)
23
+ te auth login
24
+
25
+ # Check your balance
26
+ te billing show
27
+
28
+ # Estimate cost for a training job
29
+ te jobs estimate --base-model meta-llama/Llama-3.1-8B --repo-url https://github.com/you/repo
30
+
31
+ # Create a training job
32
+ te jobs create --base-model meta-llama/Llama-3.1-8B \
33
+ --repo-url https://github.com/you/repo \
34
+ --output-name my-model
35
+
36
+ # Watch training progress
37
+ te jobs status <job-id> --watch
38
+
39
+ # List your trained models
40
+ te models list
41
+ ```
42
+
43
+ ## MCP Server Setup
44
+
45
+ The CLI includes a built-in MCP server with 18 tools for AI-powered fine-tuning workflows.
46
+
47
+ ### Claude Desktop
48
+
49
+ Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
50
+
51
+ ```json
52
+ {
53
+ "mcpServers": {
54
+ "tuning-engines": {
55
+ "command": "npx",
56
+ "args": ["-y", "tuningengines-cli", "mcp", "serve"],
57
+ "env": {
58
+ "TE_API_KEY": "te_your_key_here"
59
+ }
60
+ }
61
+ }
62
+ }
63
+ ```
64
+
65
+ ### Claude Code
66
+
67
+ ```bash
68
+ claude mcp add tuning-engines -- npx -y tuningengines-cli mcp serve
69
+ ```
70
+
71
+ ### VS Code / Cursor / Windsurf
72
+
73
+ Add to your MCP settings (`.vscode/mcp.json` or equivalent):
74
+
75
+ ```json
76
+ {
77
+ "servers": {
78
+ "tuning-engines": {
79
+ "command": "npx",
80
+ "args": ["-y", "tuningengines-cli", "mcp", "serve"],
81
+ "env": {
82
+ "TE_API_KEY": "te_your_key_here"
83
+ }
84
+ }
85
+ }
86
+ }
87
+ ```
88
+
89
+ ### ChatGPT
90
+
91
+ ChatGPT supports remote MCP servers. Add via Settings > Connectors with the Tuning Engines MCP URL.
92
+
93
+ ## CLI Commands
94
+
95
+ ### Authentication
96
+
97
+ | Command | Description |
98
+ |---------|-------------|
99
+ | `te auth login` | Sign up or log in via browser |
100
+ | `te auth logout` | Clear saved credentials |
101
+ | `te auth status` | Show current auth status |
102
+
103
+ ### Training Jobs
104
+
105
+ | Command | Description |
106
+ |---------|-------------|
107
+ | `te jobs list` | List all training jobs |
108
+ | `te jobs show <id>` | Show job details |
109
+ | `te jobs create` | Submit a new training job |
110
+ | `te jobs status <id>` | Live job status (supports `--watch`) |
111
+ | `te jobs cancel <id>` | Cancel a running job |
112
+ | `te jobs retry <id>` | Retry from last checkpoint |
113
+ | `te jobs estimate` | Get cost estimate |
114
+ | `te jobs validate-s3` | Pre-validate S3 credentials |
115
+
116
+ ### Models
117
+
118
+ | Command | Description |
119
+ |---------|-------------|
120
+ | `te models list` | List your trained models |
121
+ | `te models show <id>` | Show model details |
122
+ | `te models base` | List supported base models |
123
+ | `te models import` | Import a model from S3 |
124
+ | `te models export <id>` | Export a model to S3 |
125
+ | `te models delete <id>` | Delete a model |
126
+ | `te models status <id>` | Check import/export status |
127
+
128
+ ### Billing & Account
129
+
130
+ | Command | Description |
131
+ |---------|-------------|
132
+ | `te billing show` | Show balance and transactions |
133
+ | `te billing add-credits` | Open browser to add credits |
134
+ | `te account` | Show account info |
135
+
136
+ ### Configuration
137
+
138
+ | Command | Description |
139
+ |---------|-------------|
140
+ | `te config set-token <key>` | Set API key manually |
141
+ | `te config set-url <url>` | Override API URL |
142
+ | `te config show` | Show current config |
143
+
144
+ All commands support `--json` for machine-readable output.
145
+
146
+ ## MCP Tools
147
+
148
+ The MCP server exposes these tools for AI assistants:
149
+
150
+ | Tool | Description |
151
+ |------|-------------|
152
+ | `list_jobs` | List training jobs with optional status filter |
153
+ | `show_job` | Get details of a specific training job |
154
+ | `create_job` | Submit a new fine-tuning job (supports `agent`, `quality_tier`) |
155
+ | `cancel_job` | Cancel a running or queued job |
156
+ | `job_status` | Get live status with GPU usage and charges |
157
+ | `retry_job` | Retry a failed job from its last checkpoint |
158
+ | `estimate_job` | Get cost estimate before submitting |
159
+ | `validate_s3` | Validate S3 credentials before job submission |
160
+ | `list_models` | List your trained and imported models |
161
+ | `show_model` | Get details of a specific model |
162
+ | `delete_model` | Delete a model from cloud storage |
163
+ | `import_model` | Import a model from S3 |
164
+ | `export_model` | Export a model to S3 |
165
+ | `model_status` | Check model import/export status |
166
+ | `list_supported_models` | List available base models for fine-tuning |
167
+ | `get_balance` | Check account balance and transactions |
168
+ | `get_account` | Get account information |
169
+
170
+ ### Example Prompts
171
+
172
+ - "Fine-tune Llama 3.1 8B on my-org/my-repo and name it custom-model"
173
+ - "How much would 3 epochs of training cost for an 8B model?"
174
+ - "What's the status of my latest training job?"
175
+ - "Show my account balance"
176
+ - "List all my trained models"
177
+ - "Export my model to s3://my-bucket/models/"
178
+
179
+ ## Environment Variables
180
+
181
+ | Variable | Description |
182
+ |----------|-------------|
183
+ | `TE_API_KEY` | API key (overrides config file) |
184
+ | `TE_API_URL` | API URL (default: `https://app.tuningengines.com`) |
185
+
186
+ ## Authentication
187
+
188
+ `te auth login` uses a secure device authorization flow:
189
+
190
+ 1. CLI generates a device code and opens your browser
191
+ 2. You sign up or log in (email, Google, or GitHub)
192
+ 3. Click "Authorize" to grant CLI access
193
+ 4. Token flows back to CLI automatically — no copy-paste needed
194
+
195
+ Token is saved to `~/.tuningengines/config.json` with `0600` permissions.
196
+
197
+ ## Links
198
+
199
+ - [Website](https://tuningengines.com)
200
+ - [Documentation](https://tuningengines.com)
201
+ - [GitHub](https://github.com/ockhamlabs/tuning-engines-cli)
202
+ - [npm](https://www.npmjs.com/package/tuningengines-cli)
203
+
204
+ ## License
205
+
206
+ MIT
package/dist/cli.js CHANGED
@@ -42,11 +42,12 @@ const jobs_1 = require("./commands/jobs");
42
42
  const models_1 = require("./commands/models");
43
43
  const billing_1 = require("./commands/billing");
44
44
  const account_1 = require("./commands/account");
45
+ const auth_1 = require("./commands/auth");
45
46
  const program = new commander_1.Command();
46
47
  program
47
48
  .name("te")
48
49
  .description("Tuning Engines CLI — fine-tune LLMs from your terminal")
49
- .version("0.1.0");
50
+ .version("0.2.0");
50
51
  // Lazy client initialization (only when a command actually needs it)
51
52
  const getClient = () => {
52
53
  return new client_1.TuningEnginesClient({
@@ -55,6 +56,7 @@ const getClient = () => {
55
56
  });
56
57
  };
57
58
  // Register all command groups
59
+ (0, auth_1.registerAuthCommands)(program);
58
60
  (0, config_2.registerConfigCommands)(program);
59
61
  (0, jobs_1.registerJobCommands)(program, getClient);
60
62
  (0, models_1.registerModelCommands)(program, getClient);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAAoC;AACpC,qCAA+C;AAC/C,qCAAgD;AAChD,8CAA2D;AAC3D,0CAAsD;AACtD,8CAA0D;AAC1D,gDAA6D;AAC7D,gDAA6D;AAE7D,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,wDAAwD,CAAC;KACrE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,qEAAqE;AACrE,MAAM,SAAS,GAAG,GAAwB,EAAE;IAC1C,OAAO,IAAI,4BAAmB,CAAC;QAC7B,MAAM,EAAE,IAAA,kBAAS,GAAE;QACnB,MAAM,EAAE,IAAA,kBAAS,GAAE;KACpB,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,8BAA8B;AAC9B,IAAA,+BAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,0BAAmB,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACxC,IAAA,8BAAqB,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAC1C,IAAA,iCAAuB,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAC5C,IAAA,iCAAuB,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAE5C,wBAAwB;AACxB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,yCAAyC,CAAC;KACtD,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,wEAAwE;IACxE,MAAM,EAAE,cAAc,EAAE,GAAG,wDAAa,OAAO,GAAC,CAAC;IACjD,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAAoC;AACpC,qCAA+C;AAC/C,qCAAgD;AAChD,8CAA2D;AAC3D,0CAAsD;AACtD,8CAA0D;AAC1D,gDAA6D;AAC7D,gDAA6D;AAC7D,0CAAuD;AAEvD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,wDAAwD,CAAC;KACrE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,qEAAqE;AACrE,MAAM,SAAS,GAAG,GAAwB,EAAE;IAC1C,OAAO,IAAI,4BAAmB,CAAC;QAC7B,MAAM,EAAE,IAAA,kBAAS,GAAE;QACnB,MAAM,EAAE,IAAA,kBAAS,GAAE;KACpB,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,8BAA8B;AAC9B,IAAA,2BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,+BAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,0BAAmB,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACxC,IAAA,8BAAqB,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAC1C,IAAA,iCAAuB,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAC5C,IAAA,iCAAuB,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAE5C,wBAAwB;AACxB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,yCAAyC,CAAC;KACtD,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,wEAAwE;IACxE,MAAM,EAAE,cAAc,EAAE,GAAG,wDAAa,OAAO,GAAC,CAAC;IACjD,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
package/dist/client.d.ts CHANGED
@@ -17,7 +17,7 @@ export declare class TuningEnginesClient {
17
17
  }): Promise<any>;
18
18
  getJob(jobId: string): Promise<any>;
19
19
  createJob(params: {
20
- base_model: string;
20
+ base_model?: string;
21
21
  output_name: string;
22
22
  repo_url?: string;
23
23
  branch?: string;
@@ -29,12 +29,14 @@ export declare class TuningEnginesClient {
29
29
  s3_access_key_id?: string;
30
30
  s3_secret_access_key?: string;
31
31
  s3_region?: string;
32
+ agent?: string;
33
+ quality_tier?: string;
32
34
  }): Promise<any>;
33
35
  cancelJob(jobId: string): Promise<any>;
34
36
  getJobStatus(jobId: string): Promise<any>;
35
- retryJob(jobId: string): Promise<any>;
37
+ retryJob(jobId: string, githubToken?: string): Promise<any>;
36
38
  estimateJob(params: {
37
- base_model: string;
39
+ base_model?: string;
38
40
  num_epochs?: number;
39
41
  max_examples?: number;
40
42
  repo_size_mb?: number;
@@ -60,9 +62,26 @@ export declare class TuningEnginesClient {
60
62
  s3_region: string;
61
63
  delete_after?: boolean;
62
64
  }): Promise<any>;
65
+ validateS3(params: {
66
+ s3_bucket: string;
67
+ s3_access_key_id: string;
68
+ s3_secret_access_key: string;
69
+ s3_region: string;
70
+ }): Promise<any>;
63
71
  listModels(): Promise<any>;
64
72
  getBilling(): Promise<any>;
65
73
  getAccount(): Promise<any>;
74
+ static createDeviceSession(apiUrl: string): Promise<{
75
+ device_code: string;
76
+ verification_url: string;
77
+ expires_in: number;
78
+ poll_interval: number;
79
+ }>;
80
+ static pollDeviceSession(apiUrl: string, deviceCode: string): Promise<{
81
+ status: string;
82
+ api_token?: string;
83
+ }>;
84
+ private static requestNoAuth;
66
85
  private request;
67
86
  }
68
87
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -68,8 +68,11 @@ class TuningEnginesClient {
68
68
  async getJobStatus(jobId) {
69
69
  return this.request("GET", `/api/v1/jobs/${jobId}/status`);
70
70
  }
71
- async retryJob(jobId) {
72
- return this.request("POST", `/api/v1/jobs/${jobId}/retry`);
71
+ async retryJob(jobId, githubToken) {
72
+ const body = {};
73
+ if (githubToken)
74
+ body.github_token = githubToken;
75
+ return this.request("POST", `/api/v1/jobs/${jobId}/retry`, Object.keys(body).length ? body : undefined);
73
76
  }
74
77
  async estimateJob(params) {
75
78
  return this.request("POST", "/api/v1/jobs/estimate", params);
@@ -93,6 +96,10 @@ class TuningEnginesClient {
93
96
  async exportModel(modelId, params) {
94
97
  return this.request("POST", `/api/v1/user_models/${modelId}/export`, params);
95
98
  }
99
+ // --- S3 Validation ---
100
+ async validateS3(params) {
101
+ return this.request("POST", "/api/v1/jobs/validate_s3", params);
102
+ }
96
103
  // --- Supported Models ---
97
104
  async listModels() {
98
105
  return this.request("GET", "/api/v1/models");
@@ -105,6 +112,63 @@ class TuningEnginesClient {
105
112
  async getAccount() {
106
113
  return this.request("GET", "/api/v1/account");
107
114
  }
115
+ // --- Device Auth (unauthenticated) ---
116
+ static async createDeviceSession(apiUrl) {
117
+ return TuningEnginesClient.requestNoAuth(apiUrl, "POST", "/api/v1/auth/device");
118
+ }
119
+ static async pollDeviceSession(apiUrl, deviceCode) {
120
+ return TuningEnginesClient.requestNoAuth(apiUrl, "GET", `/api/v1/auth/device/poll?device_code=${encodeURIComponent(deviceCode)}`);
121
+ }
122
+ static requestNoAuth(apiUrl, method, path, body) {
123
+ return new Promise((resolve, reject) => {
124
+ const baseUrl = apiUrl.replace(/\/$/, "");
125
+ const url = new url_1.URL(path, baseUrl);
126
+ const isHttps = url.protocol === "https:";
127
+ const transport = isHttps ? https : http;
128
+ const options = {
129
+ hostname: url.hostname,
130
+ port: url.port || (isHttps ? 443 : 80),
131
+ path: url.pathname + url.search,
132
+ method,
133
+ headers: {
134
+ "Content-Type": "application/json",
135
+ Accept: "application/json",
136
+ "User-Agent": "tuning-engines-cli/0.2.0",
137
+ },
138
+ };
139
+ const req = transport.request(options, (res) => {
140
+ let data = "";
141
+ res.on("data", (chunk) => {
142
+ data += chunk.toString();
143
+ });
144
+ res.on("end", () => {
145
+ try {
146
+ const parsed = JSON.parse(data);
147
+ if (res.statusCode && res.statusCode >= 400) {
148
+ const error = parsed.error || { code: "unknown", message: data };
149
+ reject(new Error(`API Error (${res.statusCode}): ${error.message || JSON.stringify(error)}`));
150
+ }
151
+ else {
152
+ resolve(parsed);
153
+ }
154
+ }
155
+ catch {
156
+ if (res.statusCode && res.statusCode >= 400) {
157
+ reject(new Error(`API Error (${res.statusCode}): ${data}`));
158
+ }
159
+ else {
160
+ resolve(data);
161
+ }
162
+ }
163
+ });
164
+ });
165
+ req.on("error", reject);
166
+ if (body) {
167
+ req.write(JSON.stringify(body));
168
+ }
169
+ req.end();
170
+ });
171
+ }
108
172
  // --- HTTP ---
109
173
  request(method, path, body) {
110
174
  return new Promise((resolve, reject) => {
@@ -120,7 +184,7 @@ class TuningEnginesClient {
120
184
  Authorization: `Bearer ${this.apiKey}`,
121
185
  "Content-Type": "application/json",
122
186
  Accept: "application/json",
123
- "User-Agent": "tuning-engines-cli/0.1.0",
187
+ "User-Agent": "tuning-engines-cli/0.2.0",
124
188
  },
125
189
  };
126
190
  const req = transport.request(options, (res) => {
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerAuthCommands(program: Command): void;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkI3D"}
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerAuthCommands = registerAuthCommands;
4
+ const child_process_1 = require("child_process");
5
+ const client_1 = require("../client");
6
+ const config_1 = require("../config");
7
+ function openBrowser(url) {
8
+ const platform = process.platform;
9
+ let cmd;
10
+ if (platform === "darwin") {
11
+ cmd = `open "${url}"`;
12
+ }
13
+ else if (platform === "win32") {
14
+ cmd = `start "" "${url}"`;
15
+ }
16
+ else {
17
+ cmd = `xdg-open "${url}"`;
18
+ }
19
+ (0, child_process_1.exec)(cmd, (err) => {
20
+ if (err) {
21
+ console.log(`Could not open browser automatically. Please visit:\n ${url}`);
22
+ }
23
+ });
24
+ }
25
+ function sleep(ms) {
26
+ return new Promise((resolve) => setTimeout(resolve, ms));
27
+ }
28
+ function registerAuthCommands(program) {
29
+ const auth = program.command("auth").description("Authenticate with Tuning Engines");
30
+ auth
31
+ .command("login")
32
+ .description("Authenticate via browser (sign up or log in)")
33
+ .action(async () => {
34
+ try {
35
+ const config = (0, config_1.loadConfig)();
36
+ if (config.api_key) {
37
+ console.log("You are already authenticated. Run `te auth logout` first to re-authenticate.");
38
+ process.exit(0);
39
+ }
40
+ const apiUrl = (0, config_1.getApiUrl)();
41
+ console.log("Starting authentication...\n");
42
+ const session = await client_1.TuningEnginesClient.createDeviceSession(apiUrl);
43
+ console.log(`Your device code: ${session.device_code}\n`);
44
+ console.log("Opening browser to complete authentication...");
45
+ console.log(`If the browser doesn't open, visit:\n ${session.verification_url}\n`);
46
+ openBrowser(session.verification_url);
47
+ console.log("Waiting for authorization... (press Ctrl+C to cancel)\n");
48
+ const pollInterval = (session.poll_interval || 5) * 1000;
49
+ const expiresAt = Date.now() + (session.expires_in || 600) * 1000;
50
+ while (Date.now() < expiresAt) {
51
+ await sleep(pollInterval);
52
+ try {
53
+ const result = await client_1.TuningEnginesClient.pollDeviceSession(apiUrl, session.device_code);
54
+ if (result.status === "complete" && result.api_token) {
55
+ (0, config_1.saveConfig)({ api_key: result.api_token });
56
+ console.log("Authenticated successfully!");
57
+ // Fetch account info to show who we're logged in as
58
+ try {
59
+ const client = new client_1.TuningEnginesClient({
60
+ apiKey: result.api_token,
61
+ apiUrl,
62
+ });
63
+ const account = await client.getAccount();
64
+ console.log(`Logged in as: ${account.email}`);
65
+ }
66
+ catch {
67
+ // Non-critical — token is saved
68
+ }
69
+ console.log("\nAPI token saved to ~/.tuningengines/config.json");
70
+ return;
71
+ }
72
+ if (result.status === "expired") {
73
+ console.error("Session expired. Please run `te auth login` again.");
74
+ process.exit(1);
75
+ }
76
+ if (result.status === "consumed") {
77
+ console.error("This session has already been used. Please run `te auth login` again.");
78
+ process.exit(1);
79
+ }
80
+ // status === "pending" — keep polling
81
+ }
82
+ catch (err) {
83
+ // 429 or transient errors — keep polling
84
+ if (!err.message?.includes("429")) {
85
+ // Log non-rate-limit errors but keep trying
86
+ }
87
+ }
88
+ }
89
+ console.error("Authentication timed out. Please run `te auth login` again.");
90
+ process.exit(1);
91
+ }
92
+ catch (err) {
93
+ console.error(`Authentication failed: ${err.message}`);
94
+ process.exit(1);
95
+ }
96
+ });
97
+ auth
98
+ .command("logout")
99
+ .description("Clear saved authentication token")
100
+ .action(() => {
101
+ (0, config_1.clearApiKey)();
102
+ console.log("Logged out. API token cleared.");
103
+ });
104
+ auth
105
+ .command("status")
106
+ .description("Show current authentication status")
107
+ .action(async () => {
108
+ try {
109
+ const config = (0, config_1.loadConfig)();
110
+ if (!config.api_key) {
111
+ console.log("Not authenticated.");
112
+ console.log("Run `te auth login` to authenticate.");
113
+ return;
114
+ }
115
+ const apiUrl = (0, config_1.getApiUrl)();
116
+ const client = new client_1.TuningEnginesClient({
117
+ apiKey: config.api_key,
118
+ apiUrl,
119
+ });
120
+ const account = await client.getAccount();
121
+ console.log(`Authenticated as: ${account.email}`);
122
+ if (account.tenant) {
123
+ console.log(`Organization: ${account.tenant}`);
124
+ }
125
+ if (account.balance_cents !== undefined) {
126
+ const credits = account.balance_cents;
127
+ console.log(`Balance: ${credits.toLocaleString()} Credits ($${(credits / 100).toFixed(2)})`);
128
+ }
129
+ }
130
+ catch (err) {
131
+ if (err.message?.includes("401") || err.message?.includes("403")) {
132
+ console.log("Token is invalid or expired.");
133
+ console.log("Run `te auth login` to re-authenticate.");
134
+ }
135
+ else {
136
+ console.error(`Error checking status: ${err.message}`);
137
+ }
138
+ process.exit(1);
139
+ }
140
+ });
141
+ }
142
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/commands/billing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAGhD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,mBAAmB,GACnC,IAAI,CAiDN"}
1
+ {"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/commands/billing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAuBhD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,mBAAmB,GACnC,IAAI,CA8DN"}
@@ -34,10 +34,31 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.registerBillingCommands = registerBillingCommands;
37
+ const child_process_1 = require("child_process");
38
+ const config_1 = require("../config");
37
39
  const output = __importStar(require("../output"));
40
+ function openBrowser(url) {
41
+ const platform = process.platform;
42
+ let cmd;
43
+ if (platform === "darwin") {
44
+ cmd = `open "${url}"`;
45
+ }
46
+ else if (platform === "win32") {
47
+ cmd = `start "" "${url}"`;
48
+ }
49
+ else {
50
+ cmd = `xdg-open "${url}"`;
51
+ }
52
+ (0, child_process_1.exec)(cmd, (err) => {
53
+ if (err) {
54
+ console.log(`Could not open browser automatically. Please visit:\n ${url}`);
55
+ }
56
+ });
57
+ }
38
58
  function registerBillingCommands(program, getClient) {
39
- program
40
- .command("billing")
59
+ const billing = program.command("billing").description("Billing and credits");
60
+ billing
61
+ .command("show")
41
62
  .description("Show account balance and recent transactions")
42
63
  .option("--json", "Output as JSON")
43
64
  .action(async (opts) => {
@@ -79,5 +100,15 @@ function registerBillingCommands(program, getClient) {
79
100
  process.exit(1);
80
101
  }
81
102
  });
103
+ billing
104
+ .command("add-credits")
105
+ .description("Open the billing page in your browser to add credits")
106
+ .action(() => {
107
+ const apiUrl = (0, config_1.getApiUrl)();
108
+ const billingUrl = `${apiUrl}/billing`;
109
+ console.log("Opening billing page to add credits...");
110
+ openBrowser(billingUrl);
111
+ console.log(`\nIf the browser didn't open, visit:\n ${billingUrl}`);
112
+ });
82
113
  }
83
114
  //# sourceMappingURL=billing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/commands/billing.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,0DAoDC;AAtDD,kDAAoC;AAEpC,SAAgB,uBAAuB,CACrC,OAAgB,EAChB,SAAoC;IAEpC,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;YAE1C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;gBACnE,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;oBACtE,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBAClE,CAAC;gBACD,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,CAAC;YAED,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;gBACpC,MAAM,CAAC,KAAK,CACV,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,CAAC,EAC1D,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC;oBAChC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE;oBAC3C,CAAC,CAAC,gBAAgB,IAAI,GAAG;oBACzB,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;oBAClC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC;oBACzC,CAAC,CAAC,WAAW,IAAI,GAAG;iBACrB,CAAC,CACH,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/commands/billing.ts"],"names":[],"mappings":"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"}