@veroq/sdk 1.0.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +108 -0
  3. package/dist/cjs/agent.d.ts +144 -0
  4. package/dist/cjs/agent.d.ts.map +1 -0
  5. package/dist/cjs/agent.js +143 -0
  6. package/dist/cjs/agent.js.map +1 -0
  7. package/dist/cjs/cli.d.ts +3 -0
  8. package/dist/cjs/cli.d.ts.map +1 -0
  9. package/dist/cjs/cli.js +206 -0
  10. package/dist/cjs/cli.js.map +1 -0
  11. package/dist/cjs/client.d.ts +153 -0
  12. package/dist/cjs/client.d.ts.map +1 -0
  13. package/dist/cjs/client.js +800 -0
  14. package/dist/cjs/client.js.map +1 -0
  15. package/dist/cjs/errors.d.ts +21 -0
  16. package/dist/cjs/errors.d.ts.map +1 -0
  17. package/dist/cjs/errors.js +44 -0
  18. package/dist/cjs/errors.js.map +1 -0
  19. package/dist/cjs/index.d.ts +6 -0
  20. package/dist/cjs/index.d.ts.map +1 -0
  21. package/dist/cjs/index.js +16 -0
  22. package/dist/cjs/index.js.map +1 -0
  23. package/dist/cjs/types.d.ts +779 -0
  24. package/dist/cjs/types.d.ts.map +1 -0
  25. package/dist/cjs/types.js +3 -0
  26. package/dist/cjs/types.js.map +1 -0
  27. package/dist/esm/agent.d.ts +144 -0
  28. package/dist/esm/agent.d.ts.map +1 -0
  29. package/dist/esm/agent.js +139 -0
  30. package/dist/esm/agent.js.map +1 -0
  31. package/dist/esm/cli.d.ts +3 -0
  32. package/dist/esm/cli.d.ts.map +1 -0
  33. package/dist/esm/cli.js +204 -0
  34. package/dist/esm/cli.js.map +1 -0
  35. package/dist/esm/client.d.ts +153 -0
  36. package/dist/esm/client.d.ts.map +1 -0
  37. package/dist/esm/client.js +796 -0
  38. package/dist/esm/client.js.map +1 -0
  39. package/dist/esm/errors.d.ts +21 -0
  40. package/dist/esm/errors.d.ts.map +1 -0
  41. package/dist/esm/errors.js +36 -0
  42. package/dist/esm/errors.js.map +1 -0
  43. package/dist/esm/index.d.ts +6 -0
  44. package/dist/esm/index.d.ts.map +1 -0
  45. package/dist/esm/index.js +4 -0
  46. package/dist/esm/index.js.map +1 -0
  47. package/dist/esm/types.d.ts +779 -0
  48. package/dist/esm/types.d.ts.map +1 -0
  49. package/dist/esm/types.js +2 -0
  50. package/dist/esm/types.js.map +1 -0
  51. package/package.json +74 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 VEROQ
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,108 @@
1
+ # @veroq/sdk
2
+
3
+ Official TypeScript SDK for [VEROQ](https://veroq.ai) — verified intelligence for AI agents.
4
+
5
+ > **Migrating from `polaris-news-api`?** This is the same SDK, rebranded. Drop-in replacement — just change your import.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @veroq/sdk
11
+ ```
12
+
13
+ ## Quick Start
14
+
15
+ ### Authenticate via CLI
16
+
17
+ ```bash
18
+ veroq login # opens GitHub in your browser — API key saved automatically
19
+ veroq whoami # check your auth status
20
+ veroq logout # remove saved credentials
21
+ ```
22
+
23
+ ### Use the client
24
+
25
+ ```typescript
26
+ import { VeroqClient } from "@veroq/sdk";
27
+
28
+ const client = new VeroqClient(); // auto-reads saved credentials
29
+ const feed = await client.feed({ category: "technology", limit: 10 });
30
+ feed.briefs.forEach((brief) => console.log(brief.headline));
31
+ ```
32
+
33
+ You can also pass a key explicitly or set the `VEROQ_API_KEY` (or `POLARIS_API_KEY`) environment variable.
34
+
35
+ ## Universal Agent
36
+
37
+ ```typescript
38
+ import { Agent } from '@veroq/sdk';
39
+
40
+ const agent = new Agent({ apiKey: 'pr_live_...' });
41
+ const result = await agent.ask("What's happening with NVDA?");
42
+ console.log(result.summary);
43
+
44
+ const full = await agent.full('AAPL');
45
+ console.log(full.price, full.technicals, full.earnings);
46
+ ```
47
+
48
+ ## Methods
49
+
50
+ | Method | Description |
51
+ |--------|-------------|
52
+ | `feed(options?)` | Get the news feed |
53
+ | `brief(id, options?)` | Get a single brief by ID |
54
+ | `search(query, options?)` | Search briefs |
55
+ | `generate(topic, category?)` | Generate a brief on a topic |
56
+ | `entities(options?)` | List entities |
57
+ | `entityBriefs(name, options?)` | Get briefs for an entity |
58
+ | `trendingEntities(limit?)` | Get trending entities |
59
+ | `similar(id, options?)` | Get similar briefs |
60
+ | `clusters(options?)` | Get brief clusters |
61
+ | `data(options?)` | Get structured data points |
62
+ | `agentFeed(options?)` | Get agent-optimized feed |
63
+ | `compareSources(briefId)` | Compare sources for a brief |
64
+ | `trending(options?)` | Get trending briefs |
65
+ | `verify(claim, options?)` | Fact-check a claim against briefs |
66
+ | `stream(options?)` | Stream briefs via SSE |
67
+
68
+ ## Error Handling
69
+
70
+ ```typescript
71
+ import { VeroqClient, AuthenticationError, RateLimitError, NotFoundError } from "@veroq/sdk";
72
+
73
+ const client = new VeroqClient();
74
+
75
+ try {
76
+ const brief = await client.brief("abc123");
77
+ } catch (e) {
78
+ if (e instanceof AuthenticationError) {
79
+ console.log("Invalid API key");
80
+ } else if (e instanceof NotFoundError) {
81
+ console.log("Brief not found");
82
+ } else if (e instanceof RateLimitError) {
83
+ console.log(`Rate limited. Retry after: ${e.retryAfter}s`);
84
+ }
85
+ }
86
+ ```
87
+
88
+ ## Streaming
89
+
90
+ ```typescript
91
+ const client = new VeroqClient();
92
+
93
+ const stream = client.stream({ categories: "technology,science" });
94
+ stream.start(
95
+ (brief) => console.log(`[${brief.category}] ${brief.headline}`),
96
+ (error) => console.error("Stream error:", error)
97
+ );
98
+
99
+ // Later: stream.stop();
100
+ ```
101
+
102
+ ## Backward Compatibility
103
+
104
+ Both `VeroqClient` and `PolarisClient` are exported. The SDK reads credentials from both `VEROQ_API_KEY` and `POLARIS_API_KEY`, and checks both `~/.veroq/` and `~/.polaris/` for saved credentials.
105
+
106
+ ## Documentation
107
+
108
+ Full API documentation: https://veroq.ai/docs
@@ -0,0 +1,144 @@
1
+ /**
2
+ * VEROQ Universal Agent Connector (TypeScript)
3
+ *
4
+ * The simplest way to give any AI agent financial intelligence.
5
+ *
6
+ * import { Agent } from '@veroq/sdk';
7
+ *
8
+ * const agent = new Agent({ apiKey: 'pr_live_...' });
9
+ * const result = await agent.ask("What's happening with NVDA?");
10
+ * console.log(result.summary);
11
+ *
12
+ * const full = await agent.full('AAPL');
13
+ * console.log(full.price, full.technicals, full.earnings);
14
+ */
15
+ export interface AskResult {
16
+ question: string;
17
+ intents: string[];
18
+ tickers: string[];
19
+ reasoning: string[];
20
+ summary: string;
21
+ data: Record<string, any>;
22
+ credits_used: number;
23
+ endpoints_called: string[];
24
+ }
25
+ export interface FullResult {
26
+ ticker: string;
27
+ entity_name: string;
28
+ sector: string;
29
+ asset_type: string;
30
+ price: {
31
+ current?: number;
32
+ change_pct?: number;
33
+ market_state?: string;
34
+ };
35
+ sentiment: {
36
+ score?: number;
37
+ label?: string;
38
+ briefs_24h?: number;
39
+ signals?: any[];
40
+ current_streak?: any;
41
+ };
42
+ technicals: {
43
+ signal?: string;
44
+ rsi_14?: number;
45
+ sma_20?: number;
46
+ macd?: any;
47
+ bollinger?: any;
48
+ };
49
+ earnings: {
50
+ next_date?: string;
51
+ fiscal_quarter?: string;
52
+ eps_estimate?: number;
53
+ revenue_estimate?: number;
54
+ };
55
+ news: {
56
+ total: number;
57
+ briefs: {
58
+ id: string;
59
+ headline: string;
60
+ deck: string;
61
+ category: string;
62
+ published_at: string;
63
+ }[];
64
+ };
65
+ insider: {
66
+ transactions: any[];
67
+ total: number;
68
+ };
69
+ filings: {
70
+ recent: any[];
71
+ total: number;
72
+ };
73
+ analysts: {
74
+ consensus: any;
75
+ ratings: any[];
76
+ total: number;
77
+ };
78
+ institutions: {
79
+ holders: any[];
80
+ total: number;
81
+ };
82
+ data_sources: string[];
83
+ fetched_at: string;
84
+ }
85
+ export interface SubscribeEvent {
86
+ type: string;
87
+ ticker: string | null;
88
+ data: Record<string, any>;
89
+ timestamp: string;
90
+ }
91
+ export interface AgentOptions {
92
+ apiKey?: string;
93
+ baseUrl?: string;
94
+ timeout?: number;
95
+ }
96
+ export declare class Agent {
97
+ private apiKey;
98
+ private baseUrl;
99
+ private timeout;
100
+ constructor(options?: AgentOptions);
101
+ private request;
102
+ /**
103
+ * Ask any financial question. Returns structured data + markdown summary.
104
+ *
105
+ * const result = await agent.ask("What's happening with NVDA?");
106
+ * console.log(result.summary);
107
+ * console.log(result.tickers); // ['NVDA']
108
+ * console.log(result.reasoning); // ['Identified ticker: NVDA', ...]
109
+ */
110
+ ask(question: string): Promise<AskResult>;
111
+ /**
112
+ * Get EVERYTHING about a ticker in one call.
113
+ *
114
+ * const result = await agent.full('NVDA');
115
+ * console.log(result.price); // { current: 178.68, change_pct: -0.95 }
116
+ * console.log(result.technicals); // { signal: 'neutral', rsi_14: 46.4 }
117
+ * console.log(result.insider); // { transactions: [...], total: 20 }
118
+ */
119
+ full(ticker: string): Promise<FullResult>;
120
+ /**
121
+ * Subscribe to real-time financial events via SSE.
122
+ *
123
+ * const stream = agent.subscribe({ tickers: ['NVDA', 'AAPL'], events: ['brief'] });
124
+ * for await (const event of stream) {
125
+ * console.log(event.type, event.ticker, event.data);
126
+ * }
127
+ */
128
+ subscribe(options?: {
129
+ tickers?: string[];
130
+ events?: string[];
131
+ }): AsyncGenerator<SubscribeEvent>;
132
+ /**
133
+ * Run a marketplace agent.
134
+ *
135
+ * const result = await agent.runAgent('sector-pulse', { sector: 'Technology' });
136
+ * console.log(result.summary);
137
+ */
138
+ runAgent(slug: string, inputs?: Record<string, any>): Promise<any>;
139
+ /** Search intelligence briefs. */
140
+ search(query: string, perPage?: number): Promise<any>;
141
+ /** Fact-check a claim against the intelligence corpus. */
142
+ verify(claim: string): Promise<any>;
143
+ }
144
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ /**
3
+ * VEROQ Universal Agent Connector (TypeScript)
4
+ *
5
+ * The simplest way to give any AI agent financial intelligence.
6
+ *
7
+ * import { Agent } from '@veroq/sdk';
8
+ *
9
+ * const agent = new Agent({ apiKey: 'pr_live_...' });
10
+ * const result = await agent.ask("What's happening with NVDA?");
11
+ * console.log(result.summary);
12
+ *
13
+ * const full = await agent.full('AAPL');
14
+ * console.log(full.price, full.technicals, full.earnings);
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.Agent = void 0;
18
+ class Agent {
19
+ constructor(options = {}) {
20
+ this.apiKey = options.apiKey || process.env.VEROQ_API_KEY || process.env.POLARIS_API_KEY || '';
21
+ this.baseUrl = (options.baseUrl || 'https://api.thepolarisreport.com').replace(/\/$/, '');
22
+ this.timeout = options.timeout || 30000;
23
+ }
24
+ async request(method, path, body) {
25
+ const controller = new AbortController();
26
+ const timer = setTimeout(() => controller.abort(), this.timeout);
27
+ try {
28
+ const resp = await fetch(`${this.baseUrl}${path}`, {
29
+ method,
30
+ headers: {
31
+ 'Authorization': `Bearer ${this.apiKey}`,
32
+ 'Content-Type': 'application/json',
33
+ 'User-Agent': 'veroq-agent/1.0',
34
+ },
35
+ ...(body ? { body: JSON.stringify(body) } : {}),
36
+ signal: controller.signal,
37
+ });
38
+ if (!resp.ok) {
39
+ const error = await resp.json().catch(() => ({ message: `HTTP ${resp.status}` }));
40
+ throw new Error(error.message || `HTTP ${resp.status}`);
41
+ }
42
+ return resp.json();
43
+ }
44
+ finally {
45
+ clearTimeout(timer);
46
+ }
47
+ }
48
+ /**
49
+ * Ask any financial question. Returns structured data + markdown summary.
50
+ *
51
+ * const result = await agent.ask("What's happening with NVDA?");
52
+ * console.log(result.summary);
53
+ * console.log(result.tickers); // ['NVDA']
54
+ * console.log(result.reasoning); // ['Identified ticker: NVDA', ...]
55
+ */
56
+ async ask(question) {
57
+ return this.request('POST', '/api/v1/ask', { question });
58
+ }
59
+ /**
60
+ * Get EVERYTHING about a ticker in one call.
61
+ *
62
+ * const result = await agent.full('NVDA');
63
+ * console.log(result.price); // { current: 178.68, change_pct: -0.95 }
64
+ * console.log(result.technicals); // { signal: 'neutral', rsi_14: 46.4 }
65
+ * console.log(result.insider); // { transactions: [...], total: 20 }
66
+ */
67
+ async full(ticker) {
68
+ return this.request('GET', `/api/v1/ticker/${ticker.toUpperCase()}/full`);
69
+ }
70
+ /**
71
+ * Subscribe to real-time financial events via SSE.
72
+ *
73
+ * const stream = agent.subscribe({ tickers: ['NVDA', 'AAPL'], events: ['brief'] });
74
+ * for await (const event of stream) {
75
+ * console.log(event.type, event.ticker, event.data);
76
+ * }
77
+ */
78
+ async *subscribe(options = {}) {
79
+ const params = new URLSearchParams();
80
+ params.set('tickers', options.tickers?.map(t => t.toUpperCase()).join(',') || '*');
81
+ if (options.events)
82
+ params.set('events', options.events.join(','));
83
+ const resp = await fetch(`${this.baseUrl}/api/v1/subscribe?${params}`, {
84
+ headers: {
85
+ 'Authorization': `Bearer ${this.apiKey}`,
86
+ 'Accept': 'text/event-stream',
87
+ 'User-Agent': 'veroq-agent/1.0',
88
+ },
89
+ });
90
+ if (!resp.ok || !resp.body)
91
+ throw new Error(`Subscribe failed: ${resp.status}`);
92
+ const reader = resp.body.getReader();
93
+ const decoder = new TextDecoder();
94
+ let buffer = '';
95
+ let eventType = '';
96
+ let dataLines = [];
97
+ while (true) {
98
+ const { done, value } = await reader.read();
99
+ if (done)
100
+ break;
101
+ buffer += decoder.decode(value, { stream: true });
102
+ const lines = buffer.split('\n');
103
+ buffer = lines.pop() || '';
104
+ for (const line of lines) {
105
+ const trimmed = line.trim();
106
+ if (trimmed.startsWith('event:')) {
107
+ eventType = trimmed.slice(6).trim();
108
+ }
109
+ else if (trimmed.startsWith('data:')) {
110
+ dataLines.push(trimmed.slice(5).trim());
111
+ }
112
+ else if (trimmed === '' && eventType && dataLines.length > 0) {
113
+ try {
114
+ const data = JSON.parse(dataLines.join(''));
115
+ yield { type: eventType, ticker: data.ticker || null, data: data.data || data, timestamp: data.timestamp || '' };
116
+ }
117
+ catch { /* ignore parse errors */ }
118
+ eventType = '';
119
+ dataLines = [];
120
+ }
121
+ }
122
+ }
123
+ }
124
+ /**
125
+ * Run a marketplace agent.
126
+ *
127
+ * const result = await agent.runAgent('sector-pulse', { sector: 'Technology' });
128
+ * console.log(result.summary);
129
+ */
130
+ async runAgent(slug, inputs = {}) {
131
+ return this.request('POST', `/api/v1/agents/run/${slug}`, inputs);
132
+ }
133
+ /** Search intelligence briefs. */
134
+ async search(query, perPage = 10) {
135
+ return this.request('GET', `/api/v1/search?q=${encodeURIComponent(query)}&per_page=${perPage}`);
136
+ }
137
+ /** Fact-check a claim against the intelligence corpus. */
138
+ async verify(claim) {
139
+ return this.request('POST', '/api/v1/verify', { claim });
140
+ }
141
+ }
142
+ exports.Agent = Agent;
143
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,206 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const fs_1 = require("fs");
5
+ const os_1 = require("os");
6
+ const path_1 = require("path");
7
+ const child_process_1 = require("child_process");
8
+ const GITHUB_CLIENT_ID = "Ov23ligfgbZkJDvu8JwO";
9
+ const GITHUB_DEVICE_CODE_URL = "https://github.com/login/device/code";
10
+ const GITHUB_ACCESS_TOKEN_URL = "https://github.com/login/oauth/access_token";
11
+ const VEROQ_API_URL = "https://api.thepolarisreport.com";
12
+ const CREDENTIALS_DIR = (0, path_1.join)((0, os_1.homedir)(), ".veroq");
13
+ const CREDENTIALS_FILE = (0, path_1.join)(CREDENTIALS_DIR, "credentials");
14
+ // Legacy fallback
15
+ const LEGACY_CREDENTIALS_FILE = (0, path_1.join)((0, os_1.homedir)(), ".polaris", "credentials");
16
+ function readCredentials() {
17
+ try {
18
+ const key = (0, fs_1.readFileSync)(CREDENTIALS_FILE, "utf-8").trim();
19
+ return key || null;
20
+ }
21
+ catch {
22
+ // Fall back to legacy location
23
+ try {
24
+ const key = (0, fs_1.readFileSync)(LEGACY_CREDENTIALS_FILE, "utf-8").trim();
25
+ return key || null;
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ }
32
+ function sleep(ms) {
33
+ return new Promise((resolve) => setTimeout(resolve, ms));
34
+ }
35
+ function openBrowser(url) {
36
+ const cmd = process.platform === "darwin"
37
+ ? `open "${url}"`
38
+ : process.platform === "win32"
39
+ ? `start "${url}"`
40
+ : `xdg-open "${url}"`;
41
+ (0, child_process_1.exec)(cmd, () => { });
42
+ }
43
+ async function login() {
44
+ // Step 1: Request device code
45
+ const codeResp = await fetch(GITHUB_DEVICE_CODE_URL, {
46
+ method: "POST",
47
+ headers: { "Content-Type": "application/json", Accept: "application/json" },
48
+ body: JSON.stringify({ client_id: GITHUB_CLIENT_ID, scope: "user:email" }),
49
+ });
50
+ if (!codeResp.ok) {
51
+ console.error("Failed to initiate GitHub device flow.");
52
+ process.exit(1);
53
+ }
54
+ const codeData = await codeResp.json();
55
+ const { device_code, user_code, verification_uri } = codeData;
56
+ let interval = (codeData.interval ?? 5) * 1000;
57
+ const expiresIn = (codeData.expires_in ?? 900) * 1000;
58
+ console.log();
59
+ console.log(` Go to: ${verification_uri}`);
60
+ console.log(` Enter code: ${user_code}`);
61
+ console.log();
62
+ openBrowser(verification_uri);
63
+ process.stdout.write("Waiting for authorization...");
64
+ // Step 2: Poll for access token
65
+ const deadline = Date.now() + expiresIn;
66
+ let ghAccessToken = null;
67
+ while (Date.now() < deadline) {
68
+ await sleep(interval);
69
+ process.stdout.write(".");
70
+ const tokenResp = await fetch(GITHUB_ACCESS_TOKEN_URL, {
71
+ method: "POST",
72
+ headers: { "Content-Type": "application/json", Accept: "application/json" },
73
+ body: JSON.stringify({
74
+ client_id: GITHUB_CLIENT_ID,
75
+ device_code,
76
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
77
+ }),
78
+ });
79
+ const tokenData = await tokenResp.json();
80
+ const error = tokenData.error;
81
+ if (error === "authorization_pending")
82
+ continue;
83
+ if (error === "slow_down") {
84
+ interval = (tokenData.interval ?? interval / 1000 + 5) * 1000;
85
+ continue;
86
+ }
87
+ if (error === "expired_token") {
88
+ console.error("\nDevice code expired. Please try again.");
89
+ process.exit(1);
90
+ }
91
+ if (error === "access_denied") {
92
+ console.error("\nAuthorization denied.");
93
+ process.exit(1);
94
+ }
95
+ if (error) {
96
+ console.error(`\nGitHub error: ${error}`);
97
+ process.exit(1);
98
+ }
99
+ if (tokenData.access_token) {
100
+ ghAccessToken = tokenData.access_token;
101
+ break;
102
+ }
103
+ }
104
+ if (!ghAccessToken) {
105
+ console.error("\nTimed out waiting for authorization.");
106
+ process.exit(1);
107
+ }
108
+ console.log(" authorized!");
109
+ // Step 3: Exchange GitHub token for API JWT
110
+ const authResp = await fetch(`${VEROQ_API_URL}/api/v1/auth/github/device`, {
111
+ method: "POST",
112
+ headers: { "Content-Type": "application/json" },
113
+ body: JSON.stringify({ access_token: ghAccessToken }),
114
+ });
115
+ if (!authResp.ok) {
116
+ const errData = await authResp.json();
117
+ console.error(`Auth error: ${errData.message || "Authentication failed"}`);
118
+ process.exit(1);
119
+ }
120
+ const authData = await authResp.json();
121
+ const jwtToken = authData.token;
122
+ const email = authData.email || "";
123
+ // Step 4: Create an API key
124
+ const keyResp = await fetch(`${VEROQ_API_URL}/api/v1/keys/create`, {
125
+ method: "POST",
126
+ headers: {
127
+ "Content-Type": "application/json",
128
+ Authorization: `Bearer ${jwtToken}`,
129
+ },
130
+ body: JSON.stringify({ name: `CLI (${(0, os_1.hostname)()})` }),
131
+ });
132
+ if (!keyResp.ok) {
133
+ const errData = await keyResp.json();
134
+ console.error(`Key creation error: ${errData.message || "Failed to create API key"}`);
135
+ process.exit(1);
136
+ }
137
+ const keyData = await keyResp.json();
138
+ const apiKey = keyData.key;
139
+ // Step 5: Save credentials
140
+ (0, fs_1.mkdirSync)(CREDENTIALS_DIR, { recursive: true, mode: 0o700 });
141
+ (0, fs_1.writeFileSync)(CREDENTIALS_FILE, apiKey, { mode: 0o600 });
142
+ console.log();
143
+ console.log(`Authenticated as ${email} — API key saved to ~/.veroq/credentials`);
144
+ }
145
+ async function whoami() {
146
+ const apiKey = process.env.VEROQ_API_KEY || process.env.POLARIS_API_KEY || readCredentials();
147
+ if (!apiKey) {
148
+ console.error("Not logged in. Run `veroq login` to authenticate.");
149
+ process.exit(1);
150
+ }
151
+ const resp = await fetch(`${VEROQ_API_URL}/api/v1/user/api-keys`, {
152
+ headers: { Authorization: `Bearer ${apiKey}` },
153
+ });
154
+ if (resp.status === 401) {
155
+ console.error("Invalid or expired API key. Run `veroq login` to re-authenticate.");
156
+ process.exit(1);
157
+ }
158
+ if (!resp.ok) {
159
+ console.error(`Error checking credentials (HTTP ${resp.status}).`);
160
+ process.exit(1);
161
+ }
162
+ const data = await resp.json();
163
+ console.log(`Logged in — key prefix: ${apiKey.slice(0, 12)}`);
164
+ if (data.keys) {
165
+ console.log(`Active keys: ${data.keys.length}`);
166
+ }
167
+ }
168
+ function logout() {
169
+ let removed = false;
170
+ if ((0, fs_1.existsSync)(CREDENTIALS_FILE)) {
171
+ (0, fs_1.unlinkSync)(CREDENTIALS_FILE);
172
+ removed = true;
173
+ }
174
+ // Also clean up legacy credentials
175
+ if ((0, fs_1.existsSync)(LEGACY_CREDENTIALS_FILE)) {
176
+ (0, fs_1.unlinkSync)(LEGACY_CREDENTIALS_FILE);
177
+ removed = true;
178
+ }
179
+ if (removed) {
180
+ console.log("Logged out — credentials removed.");
181
+ }
182
+ else {
183
+ console.log("No credentials found.");
184
+ }
185
+ }
186
+ const command = process.argv[2];
187
+ switch (command) {
188
+ case "login":
189
+ login();
190
+ break;
191
+ case "whoami":
192
+ whoami();
193
+ break;
194
+ case "logout":
195
+ logout();
196
+ break;
197
+ default:
198
+ console.log("Usage: veroq <command>");
199
+ console.log();
200
+ console.log("Commands:");
201
+ console.log(" login Authenticate via GitHub");
202
+ console.log(" whoami Show current authentication status");
203
+ console.log(" logout Remove stored credentials");
204
+ process.exit(1);
205
+ }
206
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}