@clawapps/cli 0.6.0 → 0.6.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 +86 -123
- package/dist/commands/balance.d.ts +3 -0
- package/dist/commands/balance.js +31 -0
- package/dist/commands/balance.js.map +1 -0
- package/dist/commands/connect.d.ts +7 -0
- package/dist/commands/connect.js +143 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/helpers/resolve-credentials.d.ts +12 -0
- package/dist/commands/helpers/resolve-credentials.js +29 -0
- package/dist/commands/helpers/resolve-credentials.js.map +1 -0
- package/dist/commands/login-code.d.ts +5 -0
- package/dist/commands/login-code.js +25 -0
- package/dist/commands/login-code.js.map +1 -0
- package/dist/commands/login-poll.d.ts +5 -0
- package/dist/commands/login-poll.js +30 -0
- package/dist/commands/login-poll.js.map +1 -0
- package/dist/commands/login.d.ts +3 -5
- package/dist/commands/login.js +66 -128
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +3 -18
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/send.d.ts +8 -0
- package/dist/commands/send.js +112 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/sessions.d.ts +6 -0
- package/dist/commands/sessions.js +36 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/index.js +49 -34
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +4 -15
- package/dist/lib/config.js +6 -21
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/login-service.d.ts +23 -0
- package/dist/lib/login-service.js +68 -0
- package/dist/lib/login-service.js.map +1 -0
- package/dist/lib/relay-client.d.ts +25 -0
- package/dist/lib/relay-client.js +113 -0
- package/dist/lib/relay-client.js.map +1 -0
- package/dist/lib/sse-parser.d.ts +12 -0
- package/dist/lib/sse-parser.js +61 -0
- package/dist/lib/sse-parser.js.map +1 -0
- package/dist/lib/types.d.ts +17 -27
- package/package.json +3 -2
- package/dist/auth/apple.d.ts +0 -5
- package/dist/auth/apple.js +0 -15
- package/dist/auth/apple.js.map +0 -1
- package/dist/auth/exchange.d.ts +0 -6
- package/dist/auth/exchange.js +0 -25
- package/dist/auth/exchange.js.map +0 -1
- package/dist/auth/google.d.ts +0 -5
- package/dist/auth/google.js +0 -16
- package/dist/auth/google.js.map +0 -1
- package/dist/auth/login-server.d.ts +0 -10
- package/dist/auth/login-server.js +0 -62
- package/dist/auth/login-server.js.map +0 -1
- package/dist/auth/payment-server.d.ts +0 -10
- package/dist/auth/payment-server.js +0 -66
- package/dist/auth/payment-server.js.map +0 -1
- package/dist/auth/qr-poll.d.ts +0 -32
- package/dist/auth/qr-poll.js +0 -72
- package/dist/auth/qr-poll.js.map +0 -1
- package/dist/auth/server.d.ts +0 -17
- package/dist/auth/server.js +0 -102
- package/dist/auth/server.js.map +0 -1
- package/dist/commands/credit.d.ts +0 -1
- package/dist/commands/credit.js +0 -28
- package/dist/commands/credit.js.map +0 -1
- package/dist/commands/helpers/ensure-token.d.ts +0 -6
- package/dist/commands/helpers/ensure-token.js +0 -29
- package/dist/commands/helpers/ensure-token.js.map +0 -1
- package/dist/commands/membership.d.ts +0 -1
- package/dist/commands/membership.js +0 -28
- package/dist/commands/membership.js.map +0 -1
- package/dist/commands/payment-grant.d.ts +0 -5
- package/dist/commands/payment-grant.js +0 -132
- package/dist/commands/payment-grant.js.map +0 -1
- package/dist/commands/recharge-credits.d.ts +0 -1
- package/dist/commands/recharge-credits.js +0 -10
- package/dist/commands/recharge-credits.js.map +0 -1
- package/dist/commands/subscribe.d.ts +0 -1
- package/dist/commands/subscribe.js +0 -10
- package/dist/commands/subscribe.js.map +0 -1
- package/dist/commands/token.d.ts +0 -1
- package/dist/commands/token.js +0 -17
- package/dist/commands/token.js.map +0 -1
- package/dist/commands/whoami.d.ts +0 -1
- package/dist/commands/whoami.js +0 -59
- package/dist/commands/whoami.js.map +0 -1
- package/dist/html/callback.d.ts +0 -12
- package/dist/html/callback.js +0 -246
- package/dist/html/callback.js.map +0 -1
- package/dist/html/logo-data.d.ts +0 -1
- package/dist/html/logo-data.js +0 -2
- package/dist/html/logo-data.js.map +0 -1
- package/dist/lib/api.d.ts +0 -13
- package/dist/lib/api.js +0 -26
- package/dist/lib/api.js.map +0 -1
package/dist/commands/login.js
CHANGED
|
@@ -1,158 +1,96 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import ora from 'ora';
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
// --wait <code>: poll for login result only
|
|
10
|
-
if (options.wait) {
|
|
11
|
-
return loginWait(options.wait);
|
|
12
|
-
}
|
|
13
|
-
// --url-only: create code, output JSON, exit immediately
|
|
14
|
-
if (options.urlOnly) {
|
|
15
|
-
return loginUrlOnly();
|
|
16
|
-
}
|
|
17
|
-
// Default: interactive mode (QR + poll)
|
|
18
|
-
return loginInteractive();
|
|
3
|
+
import qrcode from 'qrcode-terminal';
|
|
4
|
+
import { loadCredentials } from '../lib/credentials.js';
|
|
5
|
+
import { getBalance } from '../lib/relay-client.js';
|
|
6
|
+
import { createLoginCode, pollLoginCode } from '../lib/login-service.js';
|
|
7
|
+
function jsonOut(obj) {
|
|
8
|
+
process.stdout.write(JSON.stringify(obj) + '\n');
|
|
19
9
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
* Agent workflow: parse JSON to get code and qr_url.
|
|
23
|
-
*/
|
|
24
|
-
async function loginUrlOnly() {
|
|
10
|
+
export async function loginCommand(options) {
|
|
11
|
+
const isJson = !!options.json;
|
|
25
12
|
// Check if already logged in
|
|
26
13
|
const existing = await loadCredentials();
|
|
27
14
|
if (existing) {
|
|
28
15
|
try {
|
|
29
|
-
const
|
|
30
|
-
if (
|
|
31
|
-
|
|
32
|
-
if (res.ok) {
|
|
33
|
-
const user = res.data.data;
|
|
34
|
-
console.log(JSON.stringify({
|
|
35
|
-
status: 'already_logged_in',
|
|
36
|
-
user: user.email || user.name || 'user',
|
|
37
|
-
access_token: validated.access_token,
|
|
38
|
-
}));
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
16
|
+
const balance = await getBalance(existing.access_token);
|
|
17
|
+
if (isJson) {
|
|
18
|
+
jsonOut({ event: 'already_logged_in', display_name: balance.display_name });
|
|
41
19
|
}
|
|
20
|
+
else {
|
|
21
|
+
console.log(chalk.green(`Already logged in as ${chalk.bold(balance.display_name || 'user')}.`));
|
|
22
|
+
console.log(chalk.gray('Run `clawapps logout` first to switch accounts.'));
|
|
23
|
+
}
|
|
24
|
+
return;
|
|
42
25
|
}
|
|
43
26
|
catch {
|
|
44
|
-
// Token invalid, continue
|
|
27
|
+
// Token invalid, continue with login
|
|
45
28
|
}
|
|
46
29
|
}
|
|
30
|
+
// Create login code
|
|
47
31
|
let loginCode;
|
|
48
32
|
try {
|
|
49
33
|
loginCode = await createLoginCode();
|
|
50
34
|
}
|
|
51
35
|
catch (err) {
|
|
52
|
-
const
|
|
53
|
-
|
|
36
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
37
|
+
if (isJson) {
|
|
38
|
+
jsonOut({ event: 'error', code: 'LOGIN_CODE_FAILED', message: msg });
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
console.error(chalk.red(`Failed to create login code: ${msg}`));
|
|
42
|
+
}
|
|
54
43
|
process.exit(1);
|
|
55
44
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
* --wait <code>: poll for login result, save credentials on success.
|
|
65
|
-
*/
|
|
66
|
-
async function loginWait(code) {
|
|
67
|
-
try {
|
|
68
|
-
const result = await pollAuthCode(code, 'login');
|
|
69
|
-
await saveCredentials({
|
|
70
|
-
provider: 'google',
|
|
71
|
-
access_token: result.access_token,
|
|
72
|
-
refresh_token: result.refresh_token,
|
|
73
|
-
logged_in_at: new Date().toISOString(),
|
|
45
|
+
// Display login info
|
|
46
|
+
if (isJson) {
|
|
47
|
+
jsonOut({
|
|
48
|
+
event: 'login_url',
|
|
49
|
+
url: loginCode.qr_url,
|
|
50
|
+
qr_image: loginCode.qr_image,
|
|
51
|
+
expires_at: loginCode.expires_at,
|
|
52
|
+
instructions: 'Show the URL and QR image to the user. They need to open the link or scan the QR code with WeChat to authenticate.',
|
|
74
53
|
});
|
|
75
|
-
const userRes = await apiGet(CONFIG.CLAW_ME, result.access_token);
|
|
76
|
-
const user = userRes.ok ? userRes.data.data : null;
|
|
77
|
-
console.log(JSON.stringify({
|
|
78
|
-
status: 'success',
|
|
79
|
-
access_token: result.access_token,
|
|
80
|
-
user: user ? (user.email || user.name || 'user') : null,
|
|
81
|
-
email: user?.email || null,
|
|
82
|
-
}));
|
|
83
54
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
console.log(
|
|
87
|
-
|
|
55
|
+
else {
|
|
56
|
+
console.log(chalk.bold('\nLogin URL:'));
|
|
57
|
+
console.log(chalk.cyan(loginCode.qr_url));
|
|
58
|
+
console.log();
|
|
59
|
+
qrcode.generate(loginCode.qr_url, { small: true });
|
|
60
|
+
console.log(chalk.gray('\nOpen the link or scan QR code with WeChat to authenticate.'));
|
|
61
|
+
console.log(chalk.yellow('Waiting for verification (valid for 3 minutes)...\n'));
|
|
88
62
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
if (existing) {
|
|
97
|
-
try {
|
|
98
|
-
const validated = await ensureValidToken(existing);
|
|
99
|
-
if (validated) {
|
|
100
|
-
const res = await apiGet(CONFIG.CLAW_ME, validated.access_token);
|
|
101
|
-
if (res.ok) {
|
|
102
|
-
const user = res.data.data;
|
|
103
|
-
console.log(chalk.green(`Already logged in as ${chalk.bold(user.email || user.name || 'user')}.`));
|
|
104
|
-
console.log(chalk.gray('Session refreshed. Run `clawapps logout` first to switch accounts.'));
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
63
|
+
// Poll for verification
|
|
64
|
+
const spinner = isJson ? null : ora('Waiting for authentication...').start();
|
|
65
|
+
const result = await pollLoginCode(loginCode.code, (remaining) => {
|
|
66
|
+
if (spinner) {
|
|
67
|
+
const min = Math.floor(remaining / 60);
|
|
68
|
+
const sec = remaining % 60;
|
|
69
|
+
spinner.text = `Waiting for authentication... ${min}:${sec.toString().padStart(2, '0')}`;
|
|
108
70
|
}
|
|
109
|
-
|
|
110
|
-
|
|
71
|
+
else if (remaining % 30 === 0) {
|
|
72
|
+
jsonOut({ event: 'waiting', remaining });
|
|
111
73
|
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
123
|
-
console.log(chalk.gray('\nScan the QR code to login:\n'));
|
|
124
|
-
displayQRCode(loginCode.qr_url);
|
|
125
|
-
console.log(chalk.gray(`\nOr visit: ${loginCode.qr_url}\n`));
|
|
126
|
-
console.log(chalk.yellow('Waiting for QR code verification (valid for 3 minutes)...\n'));
|
|
127
|
-
const spinner = ora('Waiting for authentication...').start();
|
|
128
|
-
try {
|
|
129
|
-
const result = await pollAuthCode(loginCode.code, 'login');
|
|
130
|
-
// Save credentials
|
|
131
|
-
await saveCredentials({
|
|
132
|
-
provider: 'google',
|
|
133
|
-
access_token: result.access_token,
|
|
134
|
-
refresh_token: result.refresh_token,
|
|
135
|
-
logged_in_at: new Date().toISOString(),
|
|
136
|
-
});
|
|
137
|
-
spinner.text = 'Fetching user info...';
|
|
138
|
-
const userRes = await apiGet(CONFIG.CLAW_ME, result.access_token);
|
|
139
|
-
spinner.stop();
|
|
140
|
-
console.log(chalk.green('\nLogin successful!'));
|
|
141
|
-
console.log(chalk.gray(`Access Token: ${result.access_token}`));
|
|
142
|
-
if (userRes.ok) {
|
|
143
|
-
const user = userRes.data.data;
|
|
144
|
-
const name = user.name || user.email || 'user';
|
|
145
|
-
console.log(chalk.gray(`User: ${name}`));
|
|
146
|
-
if (user.email) {
|
|
147
|
-
console.log(chalk.gray(`Email: ${user.email}`));
|
|
74
|
+
});
|
|
75
|
+
spinner?.stop();
|
|
76
|
+
if (result.success) {
|
|
77
|
+
if (isJson) {
|
|
78
|
+
jsonOut({ event: 'login_success', display_name: result.display_name || null });
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
console.log(chalk.green('\nLogin successful!'));
|
|
82
|
+
if (result.display_name) {
|
|
83
|
+
console.log(chalk.gray(`User: ${result.display_name}`));
|
|
148
84
|
}
|
|
149
85
|
}
|
|
150
86
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
87
|
+
else {
|
|
88
|
+
if (isJson) {
|
|
89
|
+
jsonOut({ event: 'error', code: 'LOGIN_FAILED', message: result.error });
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
console.error(chalk.red(`\n${result.error}. Run \`clawapps login\` to try again.`));
|
|
93
|
+
}
|
|
156
94
|
process.exit(1);
|
|
157
95
|
}
|
|
158
96
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/logout.js
CHANGED
|
@@ -1,24 +1,9 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import { apiPost } from '../lib/api.js';
|
|
5
|
-
import { CONFIG } from '../lib/config.js';
|
|
2
|
+
import { clearCredentials } from '../lib/credentials.js';
|
|
3
|
+
import { clearSessions } from '../lib/relay-client.js';
|
|
6
4
|
export async function logoutCommand() {
|
|
7
|
-
const credentials = await loadCredentials();
|
|
8
|
-
if (!credentials) {
|
|
9
|
-
console.log(chalk.yellow('Not logged in.'));
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
const spinner = ora('Logging out...').start();
|
|
13
|
-
try {
|
|
14
|
-
// Call server-side logout
|
|
15
|
-
await apiPost(CONFIG.CLAW_LOGOUT, { refresh_token: credentials.refresh_token }, credentials.access_token);
|
|
16
|
-
}
|
|
17
|
-
catch {
|
|
18
|
-
// Ignore API errors — we still clear local credentials
|
|
19
|
-
}
|
|
20
5
|
await clearCredentials();
|
|
21
|
-
|
|
6
|
+
await clearSessions();
|
|
22
7
|
console.log(chalk.green('Logged out successfully.'));
|
|
23
8
|
}
|
|
24
9
|
//# sourceMappingURL=logout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,gBAAgB,EAAE,CAAC;IACzB,MAAM,aAAa,EAAE,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { resolveCredentials } from './helpers/resolve-credentials.js';
|
|
4
|
+
import { createSession, sendMessage, saveSession, getLastSessionId, } from '../lib/relay-client.js';
|
|
5
|
+
export async function sendCommand(message, options) {
|
|
6
|
+
const isJson = !!options.json;
|
|
7
|
+
try {
|
|
8
|
+
const creds = await resolveCredentials();
|
|
9
|
+
const token = creds.access_token;
|
|
10
|
+
// Resolve session
|
|
11
|
+
let sessionId;
|
|
12
|
+
if (options.sessionId) {
|
|
13
|
+
sessionId = options.sessionId;
|
|
14
|
+
}
|
|
15
|
+
else if (options.newSession) {
|
|
16
|
+
const session = await createSession(token);
|
|
17
|
+
sessionId = session.session_id;
|
|
18
|
+
await saveSession({ session_id: sessionId, created_at: new Date().toISOString() });
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
// Try to reuse last session, fall back to new
|
|
22
|
+
const lastId = await getLastSessionId();
|
|
23
|
+
if (lastId) {
|
|
24
|
+
sessionId = lastId;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
const session = await createSession(token);
|
|
28
|
+
sessionId = session.session_id;
|
|
29
|
+
await saveSession({ session_id: sessionId, created_at: new Date().toISOString() });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (isJson) {
|
|
33
|
+
process.stdout.write(JSON.stringify({ event: 'session_created', session_id: sessionId }) + '\n');
|
|
34
|
+
}
|
|
35
|
+
// Send message and collect response
|
|
36
|
+
const spinner = isJson ? null : ora('Thinking...').start();
|
|
37
|
+
let fullResponse = '';
|
|
38
|
+
let usage = null;
|
|
39
|
+
let creditsUsed = 0;
|
|
40
|
+
let balanceAfter = 0;
|
|
41
|
+
for await (const evt of sendMessage(token, sessionId, message)) {
|
|
42
|
+
switch (evt.event) {
|
|
43
|
+
case 'text':
|
|
44
|
+
fullResponse += evt.data.content || '';
|
|
45
|
+
if (isJson) {
|
|
46
|
+
process.stdout.write(JSON.stringify({ event: 'text', content: evt.data.content }) + '\n');
|
|
47
|
+
}
|
|
48
|
+
else if (spinner?.isSpinning) {
|
|
49
|
+
spinner.stop();
|
|
50
|
+
}
|
|
51
|
+
break;
|
|
52
|
+
case 'status':
|
|
53
|
+
case 'log':
|
|
54
|
+
if (spinner?.isSpinning) {
|
|
55
|
+
const state = (evt.data.state || evt.data.level || 'processing');
|
|
56
|
+
spinner.text = state;
|
|
57
|
+
}
|
|
58
|
+
if (isJson) {
|
|
59
|
+
process.stdout.write(JSON.stringify({ event: evt.event, ...evt.data }) + '\n');
|
|
60
|
+
}
|
|
61
|
+
break;
|
|
62
|
+
case 'mode_change':
|
|
63
|
+
if (isJson) {
|
|
64
|
+
process.stdout.write(JSON.stringify({ event: 'mode_change', ...evt.data }) + '\n');
|
|
65
|
+
}
|
|
66
|
+
break;
|
|
67
|
+
case 'complete':
|
|
68
|
+
usage = evt.data.usage || null;
|
|
69
|
+
if (isJson) {
|
|
70
|
+
process.stdout.write(JSON.stringify({ event: 'complete', ...evt.data }) + '\n');
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
case 'cost':
|
|
74
|
+
creditsUsed = evt.data.credits_used || 0;
|
|
75
|
+
balanceAfter = evt.data.balance_after || 0;
|
|
76
|
+
if (isJson) {
|
|
77
|
+
process.stdout.write(JSON.stringify({ event: 'cost', ...evt.data }) + '\n');
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
case 'error':
|
|
81
|
+
if (spinner?.isSpinning)
|
|
82
|
+
spinner.fail(evt.data.message);
|
|
83
|
+
if (isJson) {
|
|
84
|
+
process.stdout.write(JSON.stringify({ event: 'error', ...evt.data }) + '\n');
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
console.error(chalk.red(`Error: ${evt.data.message}`));
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (spinner?.isSpinning)
|
|
93
|
+
spinner.stop();
|
|
94
|
+
if (!isJson && fullResponse) {
|
|
95
|
+
console.log(fullResponse);
|
|
96
|
+
if (creditsUsed > 0) {
|
|
97
|
+
console.log(chalk.gray(`\n[Credits used: ${creditsUsed} | Balance: ${balanceAfter}]`));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
103
|
+
if (isJson) {
|
|
104
|
+
process.stdout.write(JSON.stringify({ event: 'error', code: 'CLI_ERROR', message: msg }) + '\n');
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
console.error(chalk.red(msg));
|
|
108
|
+
}
|
|
109
|
+
process.exit(msg.includes('authenticated') || msg.includes('expired') ? 2 : 1);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=send.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { loadSessions, clearSessions } from '../lib/relay-client.js';
|
|
3
|
+
export async function sessionsCommand(options) {
|
|
4
|
+
if (options.clear) {
|
|
5
|
+
await clearSessions();
|
|
6
|
+
if (options.json) {
|
|
7
|
+
process.stdout.write(JSON.stringify({ cleared: true }) + '\n');
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
console.log(chalk.green('Session history cleared.'));
|
|
11
|
+
}
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const store = await loadSessions();
|
|
15
|
+
const entries = Object.values(store.sessions);
|
|
16
|
+
if (options.json) {
|
|
17
|
+
process.stdout.write(JSON.stringify({
|
|
18
|
+
last_session_id: store.last_session_id || null,
|
|
19
|
+
sessions: entries,
|
|
20
|
+
}) + '\n');
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (entries.length === 0) {
|
|
24
|
+
console.log(chalk.gray('No sessions found.'));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
console.log(chalk.bold('Recent Sessions'));
|
|
28
|
+
console.log();
|
|
29
|
+
for (const s of entries) {
|
|
30
|
+
const isCurrent = s.session_id === store.last_session_id;
|
|
31
|
+
const marker = isCurrent ? chalk.green(' (current)') : '';
|
|
32
|
+
console.log(` ${s.session_id}${marker}`);
|
|
33
|
+
console.log(` Created: ${s.created_at}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAOrE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAwB;IAC5D,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,aAAa,EAAE,CAAC;QACtB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE9C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAClC,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,IAAI;YAC9C,QAAQ,EAAE,OAAO;SAClB,CAAC,GAAG,IAAI,CAAC,CAAC;QACX,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,CAAC,CAAC,UAAU,KAAK,KAAK,CAAC,eAAe,CAAC;QACzD,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,MAAM,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,48 +1,63 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import { loginCommand } from './commands/login.js';
|
|
3
|
+
import { loginCodeCommand } from './commands/login-code.js';
|
|
4
|
+
import { loginPollCommand } from './commands/login-poll.js';
|
|
3
5
|
import { logoutCommand } from './commands/logout.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { subscribeCommand } from './commands/subscribe.js';
|
|
6
|
+
import { connectCommand } from './commands/connect.js';
|
|
7
|
+
import { sendCommand } from './commands/send.js';
|
|
8
|
+
import { sessionsCommand } from './commands/sessions.js';
|
|
9
|
+
import { balanceCommand } from './commands/balance.js';
|
|
9
10
|
const program = new Command();
|
|
10
11
|
program
|
|
11
12
|
.name('clawapps')
|
|
12
|
-
.description('ClawApps CLI -
|
|
13
|
+
.description('ClawApps CLI - AI agent platform client')
|
|
13
14
|
.version('0.6.0');
|
|
15
|
+
// Auth
|
|
14
16
|
program
|
|
15
17
|
.command('login')
|
|
16
|
-
.description('Log in via QR code (
|
|
17
|
-
.option('--
|
|
18
|
-
.
|
|
19
|
-
.action((options) => loginCommand(options));
|
|
18
|
+
.description('Log in via WeChat QR code (interactive)')
|
|
19
|
+
.option('--json', 'Output as JSON')
|
|
20
|
+
.action(loginCommand);
|
|
20
21
|
program
|
|
21
|
-
.command('
|
|
22
|
-
.description('
|
|
23
|
-
.action(
|
|
24
|
-
program
|
|
25
|
-
.command('whoami')
|
|
26
|
-
.description('Show your ClawApps account info')
|
|
27
|
-
.action(whoamiCommand);
|
|
28
|
-
program
|
|
29
|
-
.command('token')
|
|
30
|
-
.description('Print valid access token (auto-refreshes if expired)')
|
|
31
|
-
.action(tokenCommand);
|
|
22
|
+
.command('login-code')
|
|
23
|
+
.description('Create login code and QR image (non-blocking, for AI agents)')
|
|
24
|
+
.action(loginCodeCommand);
|
|
32
25
|
program
|
|
33
|
-
.command('
|
|
34
|
-
.description('
|
|
35
|
-
.argument('<
|
|
36
|
-
.
|
|
37
|
-
.option('--wait <code>', 'Poll for payment result using a previously created code')
|
|
38
|
-
.action((skillId, options) => paymentGrantCommand(skillId, options));
|
|
26
|
+
.command('login-poll')
|
|
27
|
+
.description('Poll for login verification (for AI agents)')
|
|
28
|
+
.argument('<code>', 'Login code from login-code command')
|
|
29
|
+
.action(loginPollCommand);
|
|
39
30
|
program
|
|
40
|
-
.command('
|
|
41
|
-
.description('
|
|
42
|
-
.action(
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
.
|
|
46
|
-
.
|
|
31
|
+
.command('logout')
|
|
32
|
+
.description('Log out and clear local credentials')
|
|
33
|
+
.action(logoutCommand);
|
|
34
|
+
// Agent workspace
|
|
35
|
+
program
|
|
36
|
+
.command('connect')
|
|
37
|
+
.description('Connect to agent workspace (persistent session)')
|
|
38
|
+
.option('--session-id <id>', 'Resume a specific session')
|
|
39
|
+
.option('--json', 'JSON I/O mode (NDJSON stdin/stdout)')
|
|
40
|
+
.option('--timeout <ms>', 'Connection timeout in milliseconds')
|
|
41
|
+
.action(connectCommand);
|
|
42
|
+
program
|
|
43
|
+
.command('send')
|
|
44
|
+
.description('Send a message to agent workspace')
|
|
45
|
+
.argument('<message>', 'Message to send')
|
|
46
|
+
.option('--session-id <id>', 'Use a specific session')
|
|
47
|
+
.option('--new-session', 'Force create a new session')
|
|
48
|
+
.option('--json', 'Output as JSON')
|
|
49
|
+
.option('--timeout <ms>', 'Response timeout in milliseconds')
|
|
50
|
+
.action(sendCommand);
|
|
51
|
+
program
|
|
52
|
+
.command('sessions')
|
|
53
|
+
.description('List or manage workspace sessions')
|
|
54
|
+
.option('--clear', 'Clear session history')
|
|
55
|
+
.option('--json', 'Output as JSON')
|
|
56
|
+
.action(sessionsCommand);
|
|
57
|
+
program
|
|
58
|
+
.command('balance')
|
|
59
|
+
.description('Check credit balance')
|
|
60
|
+
.option('--json', 'Output as JSON')
|
|
61
|
+
.action(balanceCommand);
|
|
47
62
|
program.parse();
|
|
48
63
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,yCAAyC,CAAC;KACtD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;AACP,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,8DAA8D,CAAC;KAC3E,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,QAAQ,CAAC,QAAQ,EAAE,oCAAoC,CAAC;KACxD,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,kBAAkB;AAClB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;KACxD,MAAM,CAAC,QAAQ,EAAE,qCAAqC,CAAC;KACvD,MAAM,CAAC,gBAAgB,EAAE,oCAAoC,CAAC;KAC9D,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,mCAAmC,CAAC;KAChD,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;KACxC,MAAM,CAAC,mBAAmB,EAAE,wBAAwB,CAAC;KACrD,MAAM,CAAC,eAAe,EAAE,4BAA4B,CAAC;KACrD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,gBAAgB,EAAE,kCAAkC,CAAC;KAC5D,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,SAAS,EAAE,uBAAuB,CAAC;KAC1C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,eAAe,CAAC,CAAC;AAE3B,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -1,19 +1,8 @@
|
|
|
1
1
|
export declare const CONFIG: {
|
|
2
|
-
readonly
|
|
3
|
-
readonly
|
|
4
|
-
readonly
|
|
5
|
-
readonly OD_GOOGLE_AUTH: "https://api.opendigits.ai/api/v1/auth/oauth/google";
|
|
6
|
-
readonly OD_APPLE_AUTHORIZE: "https://api.opendigits.ai/api/v1/auth/oauth/apple/authorize";
|
|
7
|
-
readonly CLAW_EXCHANGE: "https://api.clawapps.ai/api/v1/auth/exchange";
|
|
8
|
-
readonly CLAW_ME: "https://api.clawapps.ai/api/v1/auth/me";
|
|
9
|
-
readonly CLAW_REFRESH: "https://api.clawapps.ai/api/v1/auth/refresh";
|
|
10
|
-
readonly CLAW_LOGOUT: "https://api.clawapps.ai/api/v1/auth/logout";
|
|
11
|
-
readonly CLAW_WEB_BASE: "https://clawapps.ai";
|
|
12
|
-
readonly AGENT_CREATE_LOGIN_CODE: "https://api.clawapps.ai/api/v1/agent/create-login-code";
|
|
13
|
-
readonly AGENT_CREATE_PAYMENT_CODE: "https://api.clawapps.ai/api/v1/agent/create-payment-code";
|
|
14
|
-
readonly AGENT_AUTH_CODE: "https://api.clawapps.ai/api/v1/agent/auth-code";
|
|
15
|
-
readonly AUTH_POLL_INTERVAL_MS: number;
|
|
16
|
-
readonly AUTH_TIMEOUT_MS: number;
|
|
2
|
+
readonly CLI_RELAY_BASE: "https://api.clawapps.ai/cli/v1";
|
|
3
|
+
readonly CLI_CONNECT_TIMEOUT_MS: number;
|
|
4
|
+
readonly CLI_MESSAGE_TIMEOUT_MS: number;
|
|
17
5
|
readonly CREDENTIALS_DIR: ".clawapps";
|
|
18
6
|
readonly CREDENTIALS_FILE: "credentials.json";
|
|
7
|
+
readonly SESSIONS_FILE: "sessions.json";
|
|
19
8
|
};
|