@nordsym/apiclaw 2.7.0 → 2.8.0-rc.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 +8 -2
- package/dist/auth-config.d.ts +41 -0
- package/dist/auth-config.d.ts.map +1 -0
- package/dist/auth-config.js +162 -0
- package/dist/auth-config.js.map +1 -0
- package/dist/auth-config.test.d.ts +2 -0
- package/dist/auth-config.test.d.ts.map +1 -0
- package/dist/auth-config.test.js +153 -0
- package/dist/auth-config.test.js.map +1 -0
- package/dist/bin.js +9 -5
- package/dist/bin.js.map +1 -1
- package/dist/cli/commands/auth.d.ts +27 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +340 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/index.js +48 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +23 -16
- package/dist/index.js.map +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +18 -0
- package/dist/session.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* APIClaw CLI auth — browser-loopback flow (Modal/gh/vercel pattern).
|
|
3
|
+
*
|
|
4
|
+
* `apiclaw auth login`
|
|
5
|
+
* 1. Generate PKCE verifier + challenge, random state.
|
|
6
|
+
* 2. Start ephemeral HTTP listener on an OS-assigned port.
|
|
7
|
+
* 3. POST cliAuth:start to Convex → get {authId, browserUrl}.
|
|
8
|
+
* 4. Open browserUrl in default browser (open / xdg-open / start).
|
|
9
|
+
* 5. Wait for /callback?code=X&state=Y on loopback (max 5 min).
|
|
10
|
+
* 6. Validate state, POST cliAuth:exchange with {code, codeVerifier} → session+key.
|
|
11
|
+
* 7. Write ~/.apiclaw.toml, verify, print success + next-step hints.
|
|
12
|
+
*
|
|
13
|
+
* Email fallback: --email-fallback delegates to the existing magic-link
|
|
14
|
+
* loginCommand for headless/SSH users.
|
|
15
|
+
*/
|
|
16
|
+
import { createServer } from 'node:http';
|
|
17
|
+
import { randomBytes, createHash } from 'node:crypto';
|
|
18
|
+
import { spawn } from 'node:child_process';
|
|
19
|
+
import ora from 'ora';
|
|
20
|
+
import chalk from 'chalk';
|
|
21
|
+
import { writeAuthConfig, readAuthConfig, clearAuthConfig, AUTH_CONFIG_PATH } from '../../auth-config.js';
|
|
22
|
+
import { getMachineFingerprint } from '../../session.js';
|
|
23
|
+
import { loginCommand as emailLogin } from './login.js';
|
|
24
|
+
const CONVEX_URL = process.env.APICLAW_CONVEX_URL ||
|
|
25
|
+
'https://adventurous-avocet-799.convex.cloud';
|
|
26
|
+
const APP_URL = process.env.APICLAW_APP_URL || 'https://apiclaw.cloud';
|
|
27
|
+
const LOOPBACK_TIMEOUT_MS = 5 * 60 * 1000; // 5 min
|
|
28
|
+
const PREFERRED_PORT = 41789;
|
|
29
|
+
function base64url(buf) {
|
|
30
|
+
return buf.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');
|
|
31
|
+
}
|
|
32
|
+
function generatePkcePair() {
|
|
33
|
+
const verifier = base64url(randomBytes(48));
|
|
34
|
+
const challenge = base64url(createHash('sha256').update(verifier).digest());
|
|
35
|
+
return { verifier, challenge };
|
|
36
|
+
}
|
|
37
|
+
function generateState() {
|
|
38
|
+
return base64url(randomBytes(24));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Open URL in the user's default browser.
|
|
42
|
+
* Returns true if the OS command was spawned, false if no opener is available.
|
|
43
|
+
*/
|
|
44
|
+
function openBrowser(url) {
|
|
45
|
+
const platform = process.platform;
|
|
46
|
+
let cmd;
|
|
47
|
+
let args;
|
|
48
|
+
if (platform === 'darwin') {
|
|
49
|
+
cmd = 'open';
|
|
50
|
+
args = [url];
|
|
51
|
+
}
|
|
52
|
+
else if (platform === 'win32') {
|
|
53
|
+
cmd = 'cmd';
|
|
54
|
+
args = ['/c', 'start', '', url];
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
cmd = 'xdg-open';
|
|
58
|
+
args = [url];
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
const child = spawn(cmd, args, { detached: true, stdio: 'ignore' });
|
|
62
|
+
child.unref();
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Start a one-shot HTTP listener on a free port.
|
|
71
|
+
* Resolves with the captured query params on first /callback hit.
|
|
72
|
+
*/
|
|
73
|
+
function startLoopbackListener() {
|
|
74
|
+
return new Promise((resolveOuter, rejectOuter) => {
|
|
75
|
+
let resolveResult;
|
|
76
|
+
let rejectResult;
|
|
77
|
+
const result = new Promise((res, rej) => {
|
|
78
|
+
resolveResult = res;
|
|
79
|
+
rejectResult = rej;
|
|
80
|
+
});
|
|
81
|
+
const server = createServer((req, res) => {
|
|
82
|
+
const url = new URL(req.url || '/', `http://127.0.0.1`);
|
|
83
|
+
if (url.pathname !== '/callback') {
|
|
84
|
+
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
85
|
+
res.end('Not found');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const code = url.searchParams.get('code');
|
|
89
|
+
const state = url.searchParams.get('state');
|
|
90
|
+
if (!code || !state) {
|
|
91
|
+
res.writeHead(400, { 'Content-Type': 'text/plain' });
|
|
92
|
+
res.end('Missing code or state');
|
|
93
|
+
rejectResult(new Error('callback_missing_params'));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
97
|
+
res.end(`<!doctype html><html><head><meta charset="utf-8"><title>APIClaw — Authenticated</title><style>
|
|
98
|
+
body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;background:#0a0a0a;color:#fafafa;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;text-align:center}
|
|
99
|
+
.box{max-width:420px;padding:32px}
|
|
100
|
+
.lobster{font-size:48px;margin-bottom:16px}
|
|
101
|
+
h1{font-weight:600;font-size:20px;margin:0 0 8px}
|
|
102
|
+
p{color:#a3a3a3;font-size:14px;line-height:1.5;margin:8px 0}
|
|
103
|
+
code{background:#1a1a1a;padding:2px 6px;border-radius:4px;color:#ef4444;font-size:13px}
|
|
104
|
+
</style></head><body><div class="box">
|
|
105
|
+
<div class="lobster">🦞</div>
|
|
106
|
+
<h1>Authenticated</h1>
|
|
107
|
+
<p>You can close this tab and return to your terminal.</p>
|
|
108
|
+
</div></body></html>`);
|
|
109
|
+
resolveResult({ code, state });
|
|
110
|
+
});
|
|
111
|
+
server.on('error', (err) => {
|
|
112
|
+
if (err.code === 'EADDRINUSE') {
|
|
113
|
+
// Retry on a free OS-assigned port
|
|
114
|
+
server.listen(0, '127.0.0.1');
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
rejectOuter(err);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
server.listen(PREFERRED_PORT, '127.0.0.1', () => {
|
|
121
|
+
const addr = server.address();
|
|
122
|
+
const port = typeof addr === 'object' && addr ? addr.port : PREFERRED_PORT;
|
|
123
|
+
resolveOuter({ server, port, result });
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
async function convexMutation(path, args) {
|
|
128
|
+
const res = await fetch(`${CONVEX_URL}/api/mutation`, {
|
|
129
|
+
method: 'POST',
|
|
130
|
+
headers: { 'Content-Type': 'application/json' },
|
|
131
|
+
body: JSON.stringify({ path, args }),
|
|
132
|
+
});
|
|
133
|
+
if (!res.ok)
|
|
134
|
+
throw new Error(`convex ${path} ${res.status}`);
|
|
135
|
+
const data = await res.json();
|
|
136
|
+
if (data.status === 'error')
|
|
137
|
+
throw new Error(data.errorMessage || `convex ${path} error`);
|
|
138
|
+
return (data.value ?? data);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Fire-and-forget funnel event. Never blocks the auth path on telemetry.
|
|
142
|
+
* Uses the public funnel:recordEvent mutation (no auth required for these events).
|
|
143
|
+
*/
|
|
144
|
+
async function emitFailure(reason, fingerprint) {
|
|
145
|
+
try {
|
|
146
|
+
await fetch(`${CONVEX_URL}/api/mutation`, {
|
|
147
|
+
method: 'POST',
|
|
148
|
+
headers: { 'Content-Type': 'application/json' },
|
|
149
|
+
body: JSON.stringify({
|
|
150
|
+
path: 'funnel:recordEvent',
|
|
151
|
+
args: {
|
|
152
|
+
event: 'cli_browser_callback_failed',
|
|
153
|
+
classification: 'human',
|
|
154
|
+
fingerprint,
|
|
155
|
+
props: { reason },
|
|
156
|
+
},
|
|
157
|
+
}),
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// best-effort
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async function convexAction(path, args) {
|
|
165
|
+
const res = await fetch(`${CONVEX_URL}/api/action`, {
|
|
166
|
+
method: 'POST',
|
|
167
|
+
headers: { 'Content-Type': 'application/json' },
|
|
168
|
+
body: JSON.stringify({ path, args }),
|
|
169
|
+
});
|
|
170
|
+
if (!res.ok)
|
|
171
|
+
throw new Error(`convex action ${path} ${res.status}`);
|
|
172
|
+
const data = await res.json();
|
|
173
|
+
if (data.status === 'error')
|
|
174
|
+
throw new Error(data.errorMessage || `convex action ${path} error`);
|
|
175
|
+
return (data.value ?? data);
|
|
176
|
+
}
|
|
177
|
+
export async function authLoginCommand(options = {}) {
|
|
178
|
+
// Already signed in?
|
|
179
|
+
if (!options.force) {
|
|
180
|
+
const existing = readAuthConfig();
|
|
181
|
+
if (existing) {
|
|
182
|
+
console.log(chalk.green(`\n✓ Already signed in as ${chalk.bold(existing.email)}\n`));
|
|
183
|
+
console.log(chalk.dim(` Use ${chalk.white('apiclaw auth login --force')} to switch accounts, or ${chalk.white('apiclaw auth logout')} to clear.\n`));
|
|
184
|
+
return existing;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Email-fallback branch — delegate to existing magic-link command.
|
|
188
|
+
if (options.emailFallback) {
|
|
189
|
+
const result = await emailLogin({ force: options.force });
|
|
190
|
+
if (!result)
|
|
191
|
+
return null;
|
|
192
|
+
const cfg = {
|
|
193
|
+
workspaceId: result.workspaceId,
|
|
194
|
+
email: result.email,
|
|
195
|
+
sessionToken: result.sessionToken,
|
|
196
|
+
createdAt: Date.now(),
|
|
197
|
+
};
|
|
198
|
+
writeAuthConfig(cfg);
|
|
199
|
+
return cfg;
|
|
200
|
+
}
|
|
201
|
+
console.log('');
|
|
202
|
+
console.log(chalk.bold(' 🦞 APIClaw — agent-native auth'));
|
|
203
|
+
console.log(chalk.dim(' Opening browser for one-tap sign-in...\n'));
|
|
204
|
+
// PKCE + state + fingerprint
|
|
205
|
+
const { verifier, challenge } = generatePkcePair();
|
|
206
|
+
const state = generateState();
|
|
207
|
+
const fingerprint = getMachineFingerprint();
|
|
208
|
+
// Start loopback FIRST so the port is known when we register with Convex
|
|
209
|
+
const loop = await startLoopbackListener();
|
|
210
|
+
let startResult;
|
|
211
|
+
const startSpinner = ora('Registering session...').start();
|
|
212
|
+
try {
|
|
213
|
+
startResult = await convexMutation('cliAuth:start', {
|
|
214
|
+
state,
|
|
215
|
+
challenge,
|
|
216
|
+
port: loop.port,
|
|
217
|
+
fingerprint,
|
|
218
|
+
appUrl: APP_URL,
|
|
219
|
+
});
|
|
220
|
+
startSpinner.succeed('Session registered');
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
startSpinner.fail(`Failed to register session: ${err.message}`);
|
|
224
|
+
loop.server.close();
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
// Open browser (or print URL if --no-open / spawn fails)
|
|
228
|
+
if (!options.noOpen) {
|
|
229
|
+
const opened = openBrowser(startResult.browserUrl);
|
|
230
|
+
if (!opened) {
|
|
231
|
+
console.log(chalk.yellow(' Could not open your browser automatically.'));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
console.log(chalk.dim(' Visit this URL if your browser did not open:'));
|
|
235
|
+
console.log(` ${chalk.cyan(startResult.browserUrl)}\n`);
|
|
236
|
+
// Wait for callback
|
|
237
|
+
const waitSpinner = ora('Waiting for browser sign-in...').start();
|
|
238
|
+
let timedOut = false;
|
|
239
|
+
const timeout = setTimeout(() => {
|
|
240
|
+
timedOut = true;
|
|
241
|
+
waitSpinner.fail('Timed out after 5 minutes');
|
|
242
|
+
loop.server.close();
|
|
243
|
+
}, LOOPBACK_TIMEOUT_MS);
|
|
244
|
+
let callback;
|
|
245
|
+
try {
|
|
246
|
+
callback = await loop.result;
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
clearTimeout(timeout);
|
|
250
|
+
waitSpinner.fail(`Callback failed: ${err.message}`);
|
|
251
|
+
loop.server.close();
|
|
252
|
+
await emitFailure(timedOut ? 'timeout' : 'callback_error', fingerprint);
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
clearTimeout(timeout);
|
|
256
|
+
loop.server.close();
|
|
257
|
+
if (callback.state !== state) {
|
|
258
|
+
waitSpinner.fail('State mismatch — possible CSRF, aborting');
|
|
259
|
+
await emitFailure('state_mismatch', fingerprint);
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
waitSpinner.succeed('Browser sign-in received');
|
|
263
|
+
// Exchange code+verifier for session+key
|
|
264
|
+
const exchSpinner = ora('Exchanging credentials...').start();
|
|
265
|
+
let result;
|
|
266
|
+
try {
|
|
267
|
+
result = await convexAction('cliAuth:exchange', {
|
|
268
|
+
code: callback.code,
|
|
269
|
+
codeVerifier: verifier,
|
|
270
|
+
fingerprint,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
catch (err) {
|
|
274
|
+
exchSpinner.fail(`Exchange failed: ${err.message}`);
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
if (!result.success || !result.sessionToken || !result.workspaceId || !result.email) {
|
|
278
|
+
exchSpinner.fail(`Exchange rejected: ${result.error || 'unknown'}`);
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
exchSpinner.succeed('Credentials exchanged');
|
|
282
|
+
// Write config
|
|
283
|
+
const cfg = {
|
|
284
|
+
workspaceId: result.workspaceId,
|
|
285
|
+
email: result.email,
|
|
286
|
+
sessionToken: result.sessionToken,
|
|
287
|
+
apiKey: result.apiKey,
|
|
288
|
+
createdAt: Date.now(),
|
|
289
|
+
lastUsedAt: Date.now(),
|
|
290
|
+
};
|
|
291
|
+
writeAuthConfig(cfg);
|
|
292
|
+
// Success banner + next-step hints (CLI-first onboarding, not "go to workspace")
|
|
293
|
+
console.log('');
|
|
294
|
+
if (result.isNew) {
|
|
295
|
+
console.log(chalk.bold(` ✅ Workspace created for ${chalk.green(result.email)}`));
|
|
296
|
+
console.log(chalk.dim(` Free tier: 50 calls/month. Tier: ${result.tier ?? 'free'}.`));
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
console.log(chalk.bold(` ✅ Authenticated as ${chalk.green(result.email)}`));
|
|
300
|
+
console.log(chalk.dim(` Tier: ${result.tier ?? 'free'}`));
|
|
301
|
+
}
|
|
302
|
+
console.log(chalk.dim(` Config written to ${AUTH_CONFIG_PATH}`));
|
|
303
|
+
console.log('');
|
|
304
|
+
console.log(chalk.bold(' Try it:'));
|
|
305
|
+
console.log(chalk.dim(' apiclaw discover "currency conversion"'));
|
|
306
|
+
console.log(chalk.dim(' apiclaw call apilayer/fixer-latest --params \'{"base":"USD","symbols":"EUR"}\''));
|
|
307
|
+
console.log(chalk.dim(' apiclaw call openrouter/auto --body \'{"prompt":"hello"}\''));
|
|
308
|
+
if (result.apiKey) {
|
|
309
|
+
console.log('');
|
|
310
|
+
console.log(chalk.bold(' For HTTP runtimes:'));
|
|
311
|
+
console.log(chalk.dim(` export APICLAW_API_KEY=${result.apiKey}`));
|
|
312
|
+
}
|
|
313
|
+
console.log('');
|
|
314
|
+
return cfg;
|
|
315
|
+
}
|
|
316
|
+
export async function authLogoutCommand() {
|
|
317
|
+
const existing = readAuthConfig();
|
|
318
|
+
if (!existing) {
|
|
319
|
+
console.log(chalk.dim(' Not signed in.\n'));
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
clearAuthConfig();
|
|
323
|
+
console.log(chalk.green(`\n✓ Signed out (${existing.email})\n`));
|
|
324
|
+
}
|
|
325
|
+
export async function authWhoamiCommand() {
|
|
326
|
+
const cfg = readAuthConfig();
|
|
327
|
+
if (!cfg) {
|
|
328
|
+
console.log(chalk.dim(' Not signed in. Run: apiclaw auth login\n'));
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
console.log('');
|
|
332
|
+
console.log(` ${chalk.bold('Email:')} ${cfg.email}`);
|
|
333
|
+
console.log(` ${chalk.bold('Workspace:')} ${cfg.workspaceId}`);
|
|
334
|
+
if (cfg.apiKey) {
|
|
335
|
+
console.log(` ${chalk.bold('API key:')} sk-claw-...${cfg.apiKey.slice(-4)}`);
|
|
336
|
+
}
|
|
337
|
+
console.log(` ${chalk.bold('Config:')} ${AUTH_CONFIG_PATH}`);
|
|
338
|
+
console.log('');
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -11,6 +11,7 @@ import { doctorCommand } from './commands/doctor.js';
|
|
|
11
11
|
import { restoreCommand } from './commands/restore.js';
|
|
12
12
|
import { uninstallCommand } from './commands/uninstall.js';
|
|
13
13
|
import { loginCommand } from './commands/login.js';
|
|
14
|
+
import { authLoginCommand, authLogoutCommand, authWhoamiCommand } from './commands/auth.js';
|
|
14
15
|
import { demoCommand } from './commands/demo.js';
|
|
15
16
|
import { missionCommand } from './commands/mission.js';
|
|
16
17
|
import { discoverCommand, callCommand, detailsCommand, balanceCommand } from './commands/direct.js';
|
|
@@ -100,15 +101,58 @@ program
|
|
|
100
101
|
.option('--dry-run', 'Show what would be done without making changes')
|
|
101
102
|
.option('-f, --force', 'Remove even if not configured')
|
|
102
103
|
.action(uninstallCommand);
|
|
103
|
-
//
|
|
104
|
+
// Auth — agent-native browser-loopback flow (canonical from v2.8).
|
|
105
|
+
// `apiclaw auth login` is the recommended path; `apiclaw login` aliases the
|
|
106
|
+
// new flow but keeps the old --email path for back-compat.
|
|
107
|
+
const authCmd = program
|
|
108
|
+
.command('auth')
|
|
109
|
+
.description('Authenticate the APIClaw CLI (Modal-style browser-loopback flow)');
|
|
110
|
+
authCmd
|
|
111
|
+
.command('login')
|
|
112
|
+
.description('Open browser, sign in via Clerk, write ~/.apiclaw.toml')
|
|
113
|
+
.option('-f, --force', 'Re-authenticate even if already signed in')
|
|
114
|
+
.option('--email-fallback', 'Use the legacy email magic-link flow (for headless/SSH)')
|
|
115
|
+
.option('--print-mcp-token', 'Also issue an sk-mcp-* token for Remote MCP fallback (not yet implemented)')
|
|
116
|
+
.option('--no-open', 'Print the URL instead of opening the browser')
|
|
117
|
+
.action(async (options) => {
|
|
118
|
+
await authLoginCommand({
|
|
119
|
+
force: options.force,
|
|
120
|
+
emailFallback: options.emailFallback,
|
|
121
|
+
printMcpToken: options.printMcpToken,
|
|
122
|
+
noOpen: !options.open, // commander inverts --no-open
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
authCmd
|
|
126
|
+
.command('logout')
|
|
127
|
+
.description('Clear local credentials (~/.apiclaw.toml)')
|
|
128
|
+
.action(async () => {
|
|
129
|
+
await authLogoutCommand();
|
|
130
|
+
});
|
|
131
|
+
authCmd
|
|
132
|
+
.command('whoami')
|
|
133
|
+
.description('Show the currently authenticated workspace')
|
|
134
|
+
.action(async () => {
|
|
135
|
+
await authWhoamiCommand();
|
|
136
|
+
});
|
|
137
|
+
// Login / signup command — preserved for back-compat.
|
|
138
|
+
// Defaults to the new browser-loopback flow; --email keeps the legacy magic-link path.
|
|
104
139
|
program
|
|
105
140
|
.command('login')
|
|
106
|
-
.description('Sign in or create a free APIClaw workspace (
|
|
107
|
-
.option('-e, --email <email>', 'Email address to use')
|
|
141
|
+
.description('Sign in or create a free APIClaw workspace (alias of `auth login`)')
|
|
142
|
+
.option('-e, --email <email>', 'Email address to use (legacy magic-link flow)')
|
|
108
143
|
.option('-f, --force', 'Force re-login even if already signed in')
|
|
109
144
|
.option('--no-demo', 'Skip the demo after login')
|
|
110
145
|
.action(async (options) => {
|
|
111
|
-
|
|
146
|
+
// If --email is given, user explicitly wants the old magic-link flow.
|
|
147
|
+
if (options.email) {
|
|
148
|
+
const result = await loginCommand({ email: options.email, force: options.force });
|
|
149
|
+
if (result && options.demo !== false) {
|
|
150
|
+
await demoCommand();
|
|
151
|
+
}
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
// Otherwise use the canonical browser-loopback flow.
|
|
155
|
+
const result = await authLoginCommand({ force: options.force });
|
|
112
156
|
if (result && options.demo !== false) {
|
|
113
157
|
await demoCommand();
|
|
114
158
|
}
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGnE,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,iFAAiF,CAAC;KAC9F,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,mCAAmC;AACnC,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,uBAAuB,EAAE,4EAA4E,CAAC;KAC7G,MAAM,CAAC,iBAAiB,EAAE,yBAAyB,CAAC;KACpD,MAAM,CAAC,sBAAsB,EAAE,+BAA+B,CAAC;KAC/D,MAAM,CAAC,WAAW,EAAE,+CAA+C,CAAC;KACpE,MAAM,CAAC,aAAa,EAAE,0CAA0C,CAAC;KACjE,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;KAC9C,MAAM,CAAC,OAAO,EAAE,gCAAgC,CAAC;KACjD,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,MAAM,CAAC,cAAc,EAAE,uCAAuC,CAAC;KAC/D,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,CAAC;KAC9D,MAAM,CAAC,sBAAsB,EAAE,iDAAiD,CAAC;KACjF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,oCAAoC;IACpC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC;QAChD,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,EAAE;YACxC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,qCAAqC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,8CAA8C,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9E,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO;IACT,CAAC;IAED,eAAe;IACf,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEL,oDAAoD;AACpD,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,+DAA+D,CAAC;KAC5E,MAAM,CAAC,uBAAuB,EAAE,sDAAsD,CAAC;KACvF,MAAM,CAAC,WAAW,EAAE,+CAA+C,CAAC;KACpE,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAE7B,gCAAgC;AAChC,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,sBAAsB,EAAE,yCAAyC,CAAC;KACzE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,yCAAyC;AACzC,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,uBAAuB,EAAE,wBAAwB,CAAC;KACzD,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC;KAC9C,MAAM,CAAC,qBAAqB,EAAE,iCAAiC,CAAC;KAChE,MAAM,CAAC,WAAW,EAAE,gDAAgD,CAAC;KACrE,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,qCAAqC;AACrC,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,uBAAuB,EAAE,wBAAwB,CAAC;KACzD,MAAM,CAAC,OAAO,EAAE,yBAAyB,CAAC;KAC1C,MAAM,CAAC,sBAAsB,EAAE,0CAA0C,CAAC;KAC1E,MAAM,CAAC,aAAa,EAAE,sBAAsB,CAAC;KAC7C,MAAM,CAAC,WAAW,EAAE,gDAAgD,CAAC;KACrE,MAAM,CAAC,aAAa,EAAE,+BAA+B,CAAC;KACtD,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -221,7 +221,7 @@ function checkAnonymousRateLimit(fingerprint) {
|
|
|
221
221
|
error: `Hourly rate limit (${ANONYMOUS_HOURLY_LIMIT} calls/hour)`,
|
|
222
222
|
retry_after_minutes: calculateMinutesUntilNextHour(),
|
|
223
223
|
hint: "Rate limit resets at top of hour",
|
|
224
|
-
action: "
|
|
224
|
+
action: "Authenticate for higher limits: npx @nordsym/apiclaw auth login"
|
|
225
225
|
}, null, 2)
|
|
226
226
|
};
|
|
227
227
|
}
|
|
@@ -232,8 +232,8 @@ function checkAnonymousRateLimit(fingerprint) {
|
|
|
232
232
|
error: JSON.stringify({
|
|
233
233
|
success: false,
|
|
234
234
|
error: `⚡ You've hit your free tier limit (${ANONYMOUS_WEEKLY_LIMIT} calls/week).\n Upgrade: https://apiclaw.cloud/upgrade`,
|
|
235
|
-
hint: "
|
|
236
|
-
action: "Run
|
|
235
|
+
hint: "Authenticate for 50 calls/month, or upgrade for unlimited",
|
|
236
|
+
action: "Run in terminal: npx @nordsym/apiclaw auth login",
|
|
237
237
|
upgrade_url: "https://apiclaw.cloud/upgrade",
|
|
238
238
|
retry_after: getNextMonthUTC()
|
|
239
239
|
}, null, 2)
|
|
@@ -250,7 +250,7 @@ function checkAnonymousRateLimit(fingerprint) {
|
|
|
250
250
|
async function validateSession() {
|
|
251
251
|
const session = readSession();
|
|
252
252
|
if (!session) {
|
|
253
|
-
console.error('[APIClaw] No session found.
|
|
253
|
+
console.error('[APIClaw] No session found. Run `npx @nordsym/apiclaw auth login` to authenticate.');
|
|
254
254
|
return false;
|
|
255
255
|
}
|
|
256
256
|
try {
|
|
@@ -356,11 +356,15 @@ function checkWorkspaceAccess(providerId) {
|
|
|
356
356
|
return {
|
|
357
357
|
allowed: false,
|
|
358
358
|
error: JSON.stringify({
|
|
359
|
-
status: '
|
|
360
|
-
error: '
|
|
361
|
-
message: '
|
|
362
|
-
action: '
|
|
363
|
-
|
|
359
|
+
status: 'agent_auth_required',
|
|
360
|
+
error: 'Authentication required to call APIs.',
|
|
361
|
+
message: 'APIClaw uses an agent-native auth flow. Run the CLI command below in the user\'s terminal. A browser opens, the user signs in with one click, and the CLI writes ~/.apiclaw.toml. Then re-call this tool.',
|
|
362
|
+
action: 'agent_auth_required',
|
|
363
|
+
command: 'npx @nordsym/apiclaw auth login',
|
|
364
|
+
estimated_seconds: 15,
|
|
365
|
+
fallback: 'If no browser available (SSH/headless): npx @nordsym/apiclaw auth login --email-fallback',
|
|
366
|
+
legacy_action: 'register_owner ({ email: "..." }) is still supported but slower (inbox round-trip).',
|
|
367
|
+
free_tier: '50 API calls/month — completely free.',
|
|
364
368
|
}, null, 2),
|
|
365
369
|
isAnonymous: true,
|
|
366
370
|
};
|
|
@@ -377,10 +381,13 @@ function checkWorkspaceAccess(providerId) {
|
|
|
377
381
|
return {
|
|
378
382
|
allowed: false,
|
|
379
383
|
error: JSON.stringify({
|
|
380
|
-
status: '
|
|
384
|
+
status: 'agent_auth_required',
|
|
381
385
|
error: 'An account is required to use APIClaw.',
|
|
382
|
-
message: '
|
|
383
|
-
action: '
|
|
386
|
+
message: 'Run `npx @nordsym/apiclaw auth login` in the user\'s terminal. Browser opens, user clicks once, CLI writes ~/.apiclaw.toml. Then re-call this tool.',
|
|
387
|
+
action: 'agent_auth_required',
|
|
388
|
+
command: 'npx @nordsym/apiclaw auth login',
|
|
389
|
+
estimated_seconds: 15,
|
|
390
|
+
fallback: 'register_owner({ email: "..." }) — legacy email magic-link flow, still works.',
|
|
384
391
|
}, null, 2),
|
|
385
392
|
isAnonymous: true,
|
|
386
393
|
};
|
|
@@ -864,7 +871,7 @@ const tools = [
|
|
|
864
871
|
},
|
|
865
872
|
{
|
|
866
873
|
name: 'call_api',
|
|
867
|
-
description: `Primary execution tool. Use this to actually do the job through APIClaw: live web search, scraping,
|
|
874
|
+
description: `Primary execution tool. Use this to actually do the job through APIClaw: live web search, scraping, speech, LLM calls, invoices, screenshots, currency, weather, and other external API work. Requires a free workspace; if not authenticated, the response will return action="agent_auth_required" with the CLI command to run (npx @nordsym/apiclaw auth login). The legacy register_owner / verify_code flow still works as a fallback.
|
|
868
875
|
|
|
869
876
|
SINGLE CALL: Provide provider + action + params
|
|
870
877
|
CHAIN: Provide chain array to execute multiple APIs in sequence/parallel with cross-step references.
|
|
@@ -1057,7 +1064,7 @@ Example chain:
|
|
|
1057
1064
|
// ============================================
|
|
1058
1065
|
{
|
|
1059
1066
|
name: 'register_owner',
|
|
1060
|
-
description: '
|
|
1067
|
+
description: 'LEGACY auth path (kept for back-compat). The canonical agent-native flow is `npx @nordsym/apiclaw auth login` — when a tool returns action="agent_auth_required", run that CLI command instead of this tool. register_owner sends a 6-digit code to the email and requires the user to paste it back via verify_code.',
|
|
1061
1068
|
inputSchema: {
|
|
1062
1069
|
type: 'object',
|
|
1063
1070
|
properties: {
|
|
@@ -1817,7 +1824,7 @@ Docs: https://apiclaw.cloud
|
|
|
1817
1824
|
text: JSON.stringify({
|
|
1818
1825
|
status: 'error',
|
|
1819
1826
|
error: access.error,
|
|
1820
|
-
hint: '
|
|
1827
|
+
hint: 'Run `npx @nordsym/apiclaw auth login` to authenticate your workspace. (register_owner still works as a fallback.)',
|
|
1821
1828
|
}, null, 2)
|
|
1822
1829
|
}],
|
|
1823
1830
|
isError: true
|
|
@@ -2123,7 +2130,7 @@ Docs: https://apiclaw.cloud
|
|
|
2123
2130
|
if (result.success && workspaceContext && !workspaceContext.email) {
|
|
2124
2131
|
const remaining = UNREGISTERED_CALL_LIMIT - (workspaceContext.usageCount || 0);
|
|
2125
2132
|
if (remaining > 0 && remaining <= 3) {
|
|
2126
|
-
responseData._notice = `${remaining} free calls remaining. Run
|
|
2133
|
+
responseData._notice = `${remaining} free calls remaining. Run \`npx @nordsym/apiclaw auth login\` to unlock more.`;
|
|
2127
2134
|
}
|
|
2128
2135
|
}
|
|
2129
2136
|
return {
|