@karis-ai/cli 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/influencer.d.ts +3 -0
- package/dist/commands/influencer.d.ts.map +1 -0
- package/dist/commands/influencer.js +235 -0
- package/dist/commands/influencer.js.map +1 -0
- package/dist/commands/login.d.ts +2 -5
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +9 -116
- package/dist/commands/login.js.map +1 -1
- package/dist/core/agent-interface.d.ts +13 -1
- package/dist/core/agent-interface.d.ts.map +1 -1
- package/dist/core/auth.d.ts +18 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +149 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/client.d.ts +2 -1
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +11 -3
- package/dist/core/client.js.map +1 -1
- package/dist/core/errors.js +11 -4
- package/dist/core/errors.js.map +1 -1
- package/dist/core/remote-agent.d.ts.map +1 -1
- package/dist/core/remote-agent.js +22 -0
- package/dist/core/remote-agent.js.map +1 -1
- package/dist/index.js +17 -2
- package/dist/index.js.map +1 -1
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +54 -1
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/run-command.d.ts.map +1 -1
- package/dist/utils/run-command.js +18 -0
- package/dist/utils/run-command.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"influencer.d.ts","sourceRoot":"","sources":["../../src/commands/influencer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4KpC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiKhE"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { KarisClient } from '../core/client.js';
|
|
3
|
+
import { isTextOutput } from '../core/cli-context.js';
|
|
4
|
+
import { printCommandResult } from '../utils/output.js';
|
|
5
|
+
import { runCommand } from '../utils/run-command.js';
|
|
6
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
7
|
+
function formatFollowers(n) {
|
|
8
|
+
if (n == null)
|
|
9
|
+
return '-';
|
|
10
|
+
if (n >= 1_000_000)
|
|
11
|
+
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
12
|
+
if (n >= 1_000)
|
|
13
|
+
return `${(n / 1_000).toFixed(0)}K`;
|
|
14
|
+
return String(n);
|
|
15
|
+
}
|
|
16
|
+
function formatEngagement(rate) {
|
|
17
|
+
if (rate == null)
|
|
18
|
+
return '-';
|
|
19
|
+
return `${(rate * 100).toFixed(2)}%`;
|
|
20
|
+
}
|
|
21
|
+
function renderInfluencers(data) {
|
|
22
|
+
if (!isTextOutput()) {
|
|
23
|
+
printCommandResult({
|
|
24
|
+
search_record_id: data.searchRecordId,
|
|
25
|
+
session_id: data.sessionId,
|
|
26
|
+
influencers: data.influencers,
|
|
27
|
+
pagination: data.pagination,
|
|
28
|
+
excluded_count: data.excludedCount,
|
|
29
|
+
});
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const { influencers, pagination, searchRecordId, sessionId, excludedCount } = data;
|
|
33
|
+
const pct = pagination.total > 0 ? Math.round((influencers.length / pagination.total) * 100) : 0;
|
|
34
|
+
console.log();
|
|
35
|
+
console.log(chalk.bold(`Influencer Results`) +
|
|
36
|
+
chalk.dim(` — page ${pagination.page}/${pagination.totalPages} (${influencers.length} of ${pagination.total} results${excludedCount > 0 ? `, ${excludedCount} excluded` : ''})`));
|
|
37
|
+
console.log(chalk.dim(`Record: ${searchRecordId} Session: ${sessionId}`));
|
|
38
|
+
console.log();
|
|
39
|
+
if (influencers.length === 0) {
|
|
40
|
+
console.log(chalk.yellow(' No influencers found for this page.'));
|
|
41
|
+
console.log();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// Column widths
|
|
45
|
+
const COL = { num: 4, name: 28, platform: 12, followers: 10, er: 8, url: 0 };
|
|
46
|
+
const header = chalk.dim('#'.padStart(COL.num)) +
|
|
47
|
+
' ' +
|
|
48
|
+
chalk.bold('Name'.padEnd(COL.name)) +
|
|
49
|
+
chalk.dim('Platform'.padEnd(COL.platform)) +
|
|
50
|
+
chalk.dim('Followers'.padStart(COL.followers)) +
|
|
51
|
+
' ' +
|
|
52
|
+
chalk.dim('ER'.padStart(COL.er)) +
|
|
53
|
+
' ' +
|
|
54
|
+
chalk.dim('URL');
|
|
55
|
+
console.log(header);
|
|
56
|
+
console.log(chalk.dim('─'.repeat(90)));
|
|
57
|
+
influencers.forEach((inf, i) => {
|
|
58
|
+
const num = chalk.dim(String((pagination.page - 1) * pagination.pageSize + i + 1).padStart(COL.num));
|
|
59
|
+
const name = (inf.fullName || inf.username).slice(0, COL.name - 1).padEnd(COL.name);
|
|
60
|
+
const platform = chalk.dim(inf.platform.padEnd(COL.platform));
|
|
61
|
+
const followers = chalk.cyan(formatFollowers(inf.followerCount).padStart(COL.followers));
|
|
62
|
+
const er = chalk.green(formatEngagement(inf.engagementRate).padStart(COL.er));
|
|
63
|
+
const url = inf.profileUrl ? chalk.dim(inf.profileUrl) : chalk.dim(`@${inf.username}`);
|
|
64
|
+
console.log(`${num} ${name}${platform}${followers} ${er} ${url}`);
|
|
65
|
+
});
|
|
66
|
+
console.log();
|
|
67
|
+
if (pagination.page < pagination.totalPages) {
|
|
68
|
+
console.log(chalk.dim(` Next page: karis influencer results --record-id ${searchRecordId} --session-id ${sessionId} --page ${pagination.page + 1}`));
|
|
69
|
+
}
|
|
70
|
+
console.log();
|
|
71
|
+
}
|
|
72
|
+
async function apiPost(client, path, body) {
|
|
73
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
74
|
+
const baseUrl = client.apiUrl;
|
|
75
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
76
|
+
const apiKey = client.apiKey;
|
|
77
|
+
const res = await fetch(`${baseUrl}${path}`, {
|
|
78
|
+
method: 'POST',
|
|
79
|
+
headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${apiKey}` },
|
|
80
|
+
body: JSON.stringify(body),
|
|
81
|
+
});
|
|
82
|
+
if (!res.ok) {
|
|
83
|
+
let msg = '';
|
|
84
|
+
try {
|
|
85
|
+
const j = (await res.json());
|
|
86
|
+
msg = j.message || '';
|
|
87
|
+
}
|
|
88
|
+
catch { /* empty */ }
|
|
89
|
+
throw new Error(`API error ${res.status}${msg ? ': ' + msg : ''}`);
|
|
90
|
+
}
|
|
91
|
+
const j = (await res.json());
|
|
92
|
+
return j.data;
|
|
93
|
+
}
|
|
94
|
+
async function apiGet(client, path) {
|
|
95
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
96
|
+
const baseUrl = client.apiUrl;
|
|
97
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
98
|
+
const apiKey = client.apiKey;
|
|
99
|
+
const res = await fetch(`${baseUrl}${path}`, {
|
|
100
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
101
|
+
});
|
|
102
|
+
if (!res.ok) {
|
|
103
|
+
let msg = '';
|
|
104
|
+
try {
|
|
105
|
+
const j = (await res.json());
|
|
106
|
+
msg = j.message || '';
|
|
107
|
+
}
|
|
108
|
+
catch { /* empty */ }
|
|
109
|
+
throw new Error(`API error ${res.status}${msg ? ': ' + msg : ''}`);
|
|
110
|
+
}
|
|
111
|
+
const j = (await res.json());
|
|
112
|
+
return j.data;
|
|
113
|
+
}
|
|
114
|
+
// ─── Command ──────────────────────────────────────────────────────────────────
|
|
115
|
+
export function registerInfluencerCommand(program) {
|
|
116
|
+
const inf = program.command('influencer').description('Find and browse influencers');
|
|
117
|
+
// ── search ──────────────────────────────────────────────────────────────────
|
|
118
|
+
inf
|
|
119
|
+
.command('search')
|
|
120
|
+
.description('Search for influencers by keyword')
|
|
121
|
+
.option('-k, --keywords <kw>', 'Comma-separated keywords, e.g. "fitness,workout"')
|
|
122
|
+
.option('-p, --platform <platform>', 'Platform: instagram | tiktok | youtube | twitter (default: instagram)')
|
|
123
|
+
.option('--min-followers <n>', 'Minimum follower count', parseInt)
|
|
124
|
+
.option('--max-followers <n>', 'Maximum follower count', parseInt)
|
|
125
|
+
.option('--min-engagement <rate>', 'Minimum engagement rate 0-1, e.g. 0.03 for 3%', parseFloat)
|
|
126
|
+
.option('--location <cc>', 'Comma-separated country codes, e.g. "US,GB"')
|
|
127
|
+
.option('--language <lang>', 'Language code, e.g. en')
|
|
128
|
+
.option('--count <n>', 'Number of results per page (default: 20)', parseInt)
|
|
129
|
+
.action(runCommand(async (options) => {
|
|
130
|
+
const platform = options.platform || 'instagram';
|
|
131
|
+
const keywords = options.keywords
|
|
132
|
+
? options.keywords.split(',').map((k) => k.trim()).filter(Boolean)
|
|
133
|
+
: [];
|
|
134
|
+
if (keywords.length === 0) {
|
|
135
|
+
throw new Error('--keywords is required. Example: --keywords "fitness,workout"');
|
|
136
|
+
}
|
|
137
|
+
const platformsConfig = [{ platform, matchingMode: 'has' }];
|
|
138
|
+
const body = {
|
|
139
|
+
mode: 'keyword',
|
|
140
|
+
platformsConfig,
|
|
141
|
+
keywords,
|
|
142
|
+
};
|
|
143
|
+
if (options.minFollowers != null || options.maxFollowers != null) {
|
|
144
|
+
body.followerRange = {
|
|
145
|
+
...(options.minFollowers != null && { min: options.minFollowers }),
|
|
146
|
+
...(options.maxFollowers != null && { max: options.maxFollowers }),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
if (options.minEngagement != null)
|
|
150
|
+
body.minEngagementRate = options.minEngagement;
|
|
151
|
+
if (options.location)
|
|
152
|
+
body.locations = options.location.split(',').map((c) => c.trim());
|
|
153
|
+
if (options.language)
|
|
154
|
+
body.language = options.language;
|
|
155
|
+
if (options.count != null)
|
|
156
|
+
body.pageSize = options.count;
|
|
157
|
+
if (isTextOutput()) {
|
|
158
|
+
process.stdout.write(chalk.dim(` Searching ${platform} for "${keywords.join(', ')}"...`));
|
|
159
|
+
}
|
|
160
|
+
const client = await KarisClient.create();
|
|
161
|
+
const data = await apiPost(client, '/api/influencer/search-records', body);
|
|
162
|
+
if (isTextOutput()) {
|
|
163
|
+
process.stdout.write('\r\x1b[2K');
|
|
164
|
+
}
|
|
165
|
+
renderInfluencers(data);
|
|
166
|
+
}));
|
|
167
|
+
// ── results ─────────────────────────────────────────────────────────────────
|
|
168
|
+
inf
|
|
169
|
+
.command('results')
|
|
170
|
+
.description('Browse a page of results from an existing search record')
|
|
171
|
+
.requiredOption('--record-id <id>', 'Search record ID (from a previous search)')
|
|
172
|
+
.option('--session-id <id>', 'Session ID for pagination (required for page > 1)')
|
|
173
|
+
.option('--page <n>', 'Page number (default: 1)', parseInt)
|
|
174
|
+
.option('--count <n>', 'Results per page (default: 20)', parseInt)
|
|
175
|
+
.action(runCommand(async (options) => {
|
|
176
|
+
const client = await KarisClient.create();
|
|
177
|
+
const page = options.page ?? 1;
|
|
178
|
+
if (page === 1) {
|
|
179
|
+
// restore: creates a new session and returns page 1
|
|
180
|
+
const data = await apiPost(client, `/api/influencer/search-records/${options.recordId}/restore`, { pageSize: options.count ?? 20 });
|
|
181
|
+
renderInfluencers(data);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
if (!options.sessionId) {
|
|
185
|
+
throw new Error('--session-id is required for page > 1. Run page 1 first to get a session ID.');
|
|
186
|
+
}
|
|
187
|
+
const data = await apiPost(client, `/api/influencer/search-records/${options.recordId}/page`, {
|
|
188
|
+
sessionId: options.sessionId,
|
|
189
|
+
page,
|
|
190
|
+
pageSize: options.count ?? 20,
|
|
191
|
+
});
|
|
192
|
+
renderInfluencers(data);
|
|
193
|
+
}
|
|
194
|
+
}));
|
|
195
|
+
// ── list ─────────────────────────────────────────────────────────────────────
|
|
196
|
+
inf
|
|
197
|
+
.command('list')
|
|
198
|
+
.description('List your recent influencer searches')
|
|
199
|
+
.option('--limit <n>', 'Number of records to show (default: 10)', parseInt)
|
|
200
|
+
.action(runCommand(async (options) => {
|
|
201
|
+
const limit = options.limit ?? 10;
|
|
202
|
+
const client = await KarisClient.create();
|
|
203
|
+
const data = await apiGet(client, `/api/influencer/search-records?page=1&pageSize=${limit}`);
|
|
204
|
+
const items = data?.items ?? data ?? [];
|
|
205
|
+
if (!isTextOutput()) {
|
|
206
|
+
printCommandResult({ records: items, total: data?.total ?? items.length });
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
console.log();
|
|
210
|
+
if (items.length === 0) {
|
|
211
|
+
console.log(chalk.dim(' No searches yet. Run: karis influencer search --keywords ...'));
|
|
212
|
+
console.log();
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
console.log(chalk.bold(`Recent Searches`) + chalk.dim(` (${items.length} shown)`));
|
|
216
|
+
console.log();
|
|
217
|
+
const COL = { id: 38, name: 30, platform: 14, count: 8 };
|
|
218
|
+
console.log(chalk.dim('Record ID'.padEnd(COL.id)) +
|
|
219
|
+
chalk.bold('Name'.padEnd(COL.name)) +
|
|
220
|
+
chalk.dim('Platform'.padEnd(COL.platform)) +
|
|
221
|
+
chalk.dim('Results'.padStart(COL.count)));
|
|
222
|
+
console.log(chalk.dim('─'.repeat(95)));
|
|
223
|
+
for (const rec of items) {
|
|
224
|
+
const id = chalk.dim(rec.id.padEnd(COL.id));
|
|
225
|
+
const name = rec.name.slice(0, COL.name - 1).padEnd(COL.name);
|
|
226
|
+
const platform = chalk.dim((rec.platforms ?? []).join(',').padEnd(COL.platform));
|
|
227
|
+
const count = chalk.cyan(rec.resultCount != null ? String(rec.resultCount).padStart(COL.count) : '-'.padStart(COL.count));
|
|
228
|
+
console.log(`${id}${name}${platform}${count}`);
|
|
229
|
+
}
|
|
230
|
+
console.log();
|
|
231
|
+
console.log(chalk.dim(' Tip: karis influencer results --record-id <id> to browse results'));
|
|
232
|
+
console.log();
|
|
233
|
+
}));
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=influencer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"influencer.js","sourceRoot":"","sources":["../../src/commands/influencer.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.d.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* and wait for the callback with the API key.
|
|
5
|
-
*/
|
|
6
|
-
export declare function browserLogin(apiUrl: string): Promise<string>;
|
|
2
|
+
import { browserLogin } from '../core/auth.js';
|
|
3
|
+
export { browserLogin };
|
|
7
4
|
export declare function registerLoginCommand(program: Command): void;
|
|
8
5
|
//# sourceMappingURL=login.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,OAAO,EAAE,YAAY,EAAgB,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,CAAC;AAgBxB,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgD3D"}
|
package/dist/commands/login.js
CHANGED
|
@@ -1,99 +1,11 @@
|
|
|
1
|
-
import http from 'node:http';
|
|
2
|
-
import crypto from 'node:crypto';
|
|
3
1
|
import chalk from 'chalk';
|
|
4
|
-
import
|
|
5
|
-
import { setConfigValue, loadResolvedConfig } from '../utils/config.js';
|
|
2
|
+
import { loadResolvedConfig } from '../utils/config.js';
|
|
6
3
|
import { isTextOutput } from '../core/cli-context.js';
|
|
7
4
|
import { printCommandResult } from '../utils/output.js';
|
|
8
5
|
import { runCommand } from '../utils/run-command.js';
|
|
9
6
|
import { KarisClient } from '../core/client.js';
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
if (apiUrl.includes('api-staging'))
|
|
13
|
-
return 'https://app-staging.karis.im';
|
|
14
|
-
if (apiUrl.includes('localhost') || apiUrl.includes('127.0.0.1')) {
|
|
15
|
-
const port = new URL(apiUrl).port || '8000';
|
|
16
|
-
return `http://localhost:${port === '8000' ? '3000' : port}`;
|
|
17
|
-
}
|
|
18
|
-
return 'https://app.karis.im';
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Start a localhost HTTP server, open the browser to the CLI auth page,
|
|
22
|
-
* and wait for the callback with the API key.
|
|
23
|
-
*/
|
|
24
|
-
export async function browserLogin(apiUrl) {
|
|
25
|
-
const state = crypto.randomBytes(16).toString('hex');
|
|
26
|
-
const appUrl = deriveAppUrl(apiUrl);
|
|
27
|
-
return new Promise((resolve, reject) => {
|
|
28
|
-
const server = http.createServer((req, res) => {
|
|
29
|
-
const url = new URL(req.url, `http://localhost`);
|
|
30
|
-
if (url.pathname !== '/callback') {
|
|
31
|
-
res.writeHead(404);
|
|
32
|
-
res.end('Not found');
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
const key = url.searchParams.get('key');
|
|
36
|
-
const returnedState = url.searchParams.get('state');
|
|
37
|
-
const error = url.searchParams.get('error');
|
|
38
|
-
if (error) {
|
|
39
|
-
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
40
|
-
res.end(resultPage(false, error));
|
|
41
|
-
server.close();
|
|
42
|
-
reject(new Error(`Authorization failed: ${error}`));
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
if (returnedState !== state) {
|
|
46
|
-
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
47
|
-
res.end(resultPage(false, 'State mismatch — possible CSRF attack.'));
|
|
48
|
-
server.close();
|
|
49
|
-
reject(new Error('State mismatch'));
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
if (!key) {
|
|
53
|
-
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
54
|
-
res.end(resultPage(false, 'No API key received.'));
|
|
55
|
-
server.close();
|
|
56
|
-
reject(new Error('No API key in callback'));
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
60
|
-
res.end(resultPage(true));
|
|
61
|
-
server.close();
|
|
62
|
-
resolve(key);
|
|
63
|
-
});
|
|
64
|
-
server.listen(0, '127.0.0.1', async () => {
|
|
65
|
-
const addr = server.address();
|
|
66
|
-
const port = typeof addr === 'object' && addr ? addr.port : 0;
|
|
67
|
-
const authUrl = `${appUrl}/cli/auth?port=${port}&state=${state}`;
|
|
68
|
-
try {
|
|
69
|
-
const openModule = await import('open');
|
|
70
|
-
await openModule.default(authUrl);
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
if (isTextOutput()) {
|
|
74
|
-
console.log(chalk.yellow(`\n Could not open browser. Please visit:`));
|
|
75
|
-
console.log(chalk.cyan(` ${authUrl}\n`));
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
const timeout = setTimeout(() => {
|
|
80
|
-
server.close();
|
|
81
|
-
reject(new Error('Login timed out. Please try again.'));
|
|
82
|
-
}, LOGIN_TIMEOUT_MS);
|
|
83
|
-
server.on('close', () => clearTimeout(timeout));
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
function resultPage(success, errorMessage) {
|
|
87
|
-
const title = success ? 'Logged in to Karis' : 'Login failed';
|
|
88
|
-
const body = success
|
|
89
|
-
? '<p style="color:#22c55e;font-size:1.2em;">✓ You can close this tab and return to the terminal.</p>'
|
|
90
|
-
: `<p style="color:#ef4444;font-size:1.2em;">✗ ${errorMessage || 'Unknown error'}</p>`;
|
|
91
|
-
return `<!DOCTYPE html>
|
|
92
|
-
<html><head><meta charset="utf-8"><title>${title}</title>
|
|
93
|
-
<style>body{font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#09090b;color:#fafafa;}
|
|
94
|
-
.card{text-align:center;padding:3rem;border-radius:1rem;background:#18181b;max-width:400px;}</style>
|
|
95
|
-
</head><body><div class="card"><h2>${title}</h2>${body}</div></body></html>`;
|
|
96
|
-
}
|
|
7
|
+
import { browserLogin, performLogin } from '../core/auth.js';
|
|
8
|
+
export { browserLogin };
|
|
97
9
|
async function tryExistingKey(apiUrl) {
|
|
98
10
|
const resolved = await loadResolvedConfig();
|
|
99
11
|
const existingKey = resolved.apiKey.value;
|
|
@@ -134,39 +46,20 @@ export function registerLoginCommand(program) {
|
|
|
134
46
|
return;
|
|
135
47
|
}
|
|
136
48
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
if (spinner)
|
|
141
|
-
spinner.text = 'Waiting for authorization...';
|
|
142
|
-
apiKey = await browserLogin(apiUrl);
|
|
143
|
-
if (spinner)
|
|
144
|
-
spinner.succeed('Authorized');
|
|
145
|
-
}
|
|
146
|
-
catch (error) {
|
|
147
|
-
if (spinner)
|
|
148
|
-
spinner.fail('Login failed');
|
|
149
|
-
throw error;
|
|
150
|
-
}
|
|
151
|
-
await setConfigValue('api-key', apiKey);
|
|
152
|
-
let userName = '';
|
|
153
|
-
try {
|
|
154
|
-
const client = new KarisClient({ apiKey, apiUrl });
|
|
155
|
-
const info = await client.verifyKey();
|
|
156
|
-
userName = info.name || '';
|
|
157
|
-
}
|
|
158
|
-
catch {
|
|
159
|
-
// non-critical
|
|
49
|
+
if (isTextOutput()) {
|
|
50
|
+
console.log(chalk.dim(' Opening browser...'));
|
|
51
|
+
console.log();
|
|
160
52
|
}
|
|
53
|
+
const name = await performLogin(apiUrl);
|
|
161
54
|
if (isTextOutput()) {
|
|
162
|
-
const label =
|
|
55
|
+
const label = name ? ` (key: ${name})` : '';
|
|
163
56
|
console.log(chalk.green(` API key saved${label}`));
|
|
164
57
|
console.log();
|
|
165
58
|
}
|
|
166
59
|
printCommandResult({
|
|
167
60
|
action: 'login',
|
|
168
61
|
success: true,
|
|
169
|
-
key_name:
|
|
62
|
+
key_name: name || undefined,
|
|
170
63
|
});
|
|
171
64
|
}));
|
|
172
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,8 +27,14 @@ export interface HitlFormData {
|
|
|
27
27
|
passthrough?: boolean;
|
|
28
28
|
sections?: HitlFormSection[];
|
|
29
29
|
}
|
|
30
|
+
export interface ArtifactItem {
|
|
31
|
+
name?: string;
|
|
32
|
+
url?: string;
|
|
33
|
+
file_id?: string;
|
|
34
|
+
file_extension?: string;
|
|
35
|
+
}
|
|
30
36
|
export interface StreamChunk {
|
|
31
|
-
type: 'content' | 'tool_start' | 'tool_end' | 'error' | 'done' | 'hitl_request';
|
|
37
|
+
type: 'content' | 'tool_start' | 'tool_end' | 'error' | 'done' | 'hitl_request' | 'working_summary' | 'progress' | 'output_artifact';
|
|
32
38
|
content?: string;
|
|
33
39
|
tool?: string;
|
|
34
40
|
title?: string;
|
|
@@ -41,6 +47,12 @@ export interface StreamChunk {
|
|
|
41
47
|
form_data?: HitlFormData;
|
|
42
48
|
prompt?: string;
|
|
43
49
|
auth_url?: string;
|
|
50
|
+
summary_text?: string;
|
|
51
|
+
steps?: Array<{
|
|
52
|
+
label?: string;
|
|
53
|
+
status?: string;
|
|
54
|
+
}>;
|
|
55
|
+
artifacts?: ArtifactItem[];
|
|
44
56
|
}
|
|
45
57
|
export type AgentMode = 'remote';
|
|
46
58
|
export interface AgentInterface {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-interface.d.ts","sourceRoot":"","sources":["../../src/core/agent-interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,CAAC;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,
|
|
1
|
+
{"version":3,"file":"agent-interface.d.ts","sourceRoot":"","sources":["../../src/core/agent-interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,CAAC;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EACA,SAAS,GACT,YAAY,GACZ,UAAU,GACV,OAAO,GACP,MAAM,GACN,cAAc,GACd,iBAAiB,GACjB,UAAU,GACV,iBAAiB,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;CAC5B;AAED,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC;AAEjC,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC;;OAEG;IACH,eAAe,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAE/C;;OAEG;IACH,UAAU,CACR,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,EACtC,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAE9C;;OAEG;IACH,OAAO,IAAI,SAAS,CAAC;IAErB;;OAEG;IACH,cAAc,IAAI,MAAM,CAAC;CAC1B"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare function resultPage(success: boolean, errorMessage?: string): string;
|
|
2
|
+
/**
|
|
3
|
+
* Start a localhost HTTP server, open the browser to the CLI auth page,
|
|
4
|
+
* and wait for the callback with the API key.
|
|
5
|
+
*/
|
|
6
|
+
export declare function browserLogin(apiUrl: string): Promise<string>;
|
|
7
|
+
/**
|
|
8
|
+
* Run the full browser login flow: open browser, wait for key, save it.
|
|
9
|
+
* Returns the key name on success, throws on failure.
|
|
10
|
+
*/
|
|
11
|
+
export declare function performLogin(apiUrl: string): Promise<string>;
|
|
12
|
+
/**
|
|
13
|
+
* Auto-login flow triggered when AUTH_REQUIRED is detected in a TTY session.
|
|
14
|
+
* Shows a prompt, runs browser login, saves the key.
|
|
15
|
+
* Returns true if login succeeded, false if it failed or was skipped.
|
|
16
|
+
*/
|
|
17
|
+
export declare function autoLogin(): Promise<boolean>;
|
|
18
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"AAmBA,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAW1E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuElE;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAclE;AAED;;;;GAIG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CA6BlD"}
|