@clawapps/cli 0.5.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 -1
- package/dist/commands/login.js +72 -49
- 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 -30
- 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 -1
- package/dist/commands/payment-grant.js +0 -56
- 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/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
[](LICENSE)
|
|
5
5
|
[](https://nodejs.org/)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Command-line client for the [ClawApps](https://www.clawapps.ai) AI agent platform. Authenticate via WeChat, interact with your agent workspace, and integrate with external AI assistants.
|
|
8
8
|
|
|
9
9
|
## Install
|
|
10
10
|
|
|
@@ -12,178 +12,141 @@ A command-line tool for authenticating with the [ClawApps](https://www.clawapps.
|
|
|
12
12
|
npm install -g @clawapps/cli
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
##
|
|
16
|
-
|
|
17
|
-
### `clawapps login`
|
|
18
|
-
|
|
19
|
-
Sign in with Google or Apple. Opens a browser for OAuth, then stores tokens locally. If already logged in, auto-refreshes the token and extends the session.
|
|
15
|
+
## Quick Start
|
|
20
16
|
|
|
21
17
|
```bash
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
✔ Logged in as user@gmail.com
|
|
25
|
-
```
|
|
18
|
+
# 1. Login (scan WeChat QR code)
|
|
19
|
+
clawapps login
|
|
26
20
|
|
|
27
|
-
|
|
21
|
+
# 2. Check balance
|
|
22
|
+
clawapps balance
|
|
28
23
|
|
|
29
|
-
|
|
24
|
+
# 3. Send a message to your agent
|
|
25
|
+
clawapps send "hello"
|
|
30
26
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
ClawApps Account
|
|
34
|
-
──────────────────────────────
|
|
35
|
-
Name: Username
|
|
36
|
-
Email: user@gmail.com
|
|
37
|
-
ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
|
38
|
-
Provider: google
|
|
27
|
+
# 4. Or start a persistent session
|
|
28
|
+
clawapps connect
|
|
39
29
|
```
|
|
40
30
|
|
|
41
|
-
|
|
31
|
+
## Commands
|
|
32
|
+
|
|
33
|
+
### `clawapps login`
|
|
42
34
|
|
|
43
|
-
|
|
35
|
+
Log in via WeChat QR code. Scan with WeChat to authenticate (valid for 3 minutes). Tokens are stored locally for subsequent commands.
|
|
44
36
|
|
|
45
37
|
```bash
|
|
46
|
-
$ clawapps
|
|
47
|
-
|
|
38
|
+
$ clawapps login
|
|
39
|
+
Scan with WeChat to login:
|
|
40
|
+
█████████████████████
|
|
41
|
+
█████████████████████
|
|
42
|
+
Waiting for authentication...
|
|
43
|
+
✔ Login successful!
|
|
48
44
|
```
|
|
49
45
|
|
|
50
|
-
|
|
46
|
+
### `clawapps logout`
|
|
51
47
|
|
|
52
|
-
|
|
53
|
-
curl -H "Authorization: Bearer $(clawapps token)" https://api.clawapps.ai/api/v1/...
|
|
54
|
-
```
|
|
48
|
+
Log out and clear local credentials and session history.
|
|
55
49
|
|
|
56
|
-
### `clawapps
|
|
50
|
+
### `clawapps send <message>`
|
|
57
51
|
|
|
58
|
-
|
|
52
|
+
Send a message to your agent workspace and receive the response.
|
|
59
53
|
|
|
60
54
|
```bash
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
55
|
+
# Human-readable output
|
|
56
|
+
$ clawapps send "what's the weather in Toronto?"
|
|
57
|
+
Toronto today: 7°C, rainy. Bring an umbrella.
|
|
58
|
+
|
|
59
|
+
# JSON output (for AI assistant integration)
|
|
60
|
+
$ clawapps send "hello" --json
|
|
61
|
+
{"event":"session_created","session_id":"abc-123"}
|
|
62
|
+
{"event":"text","content":"Hello! How can I help you?"}
|
|
63
|
+
{"event":"complete","success":true,"usage":{...}}
|
|
64
64
|
```
|
|
65
65
|
|
|
66
|
-
|
|
66
|
+
Options: `--json` `--session-id <id>` `--new-session` `--timeout <ms>`
|
|
67
|
+
|
|
68
|
+
### `clawapps connect`
|
|
67
69
|
|
|
68
|
-
|
|
70
|
+
Start a persistent interactive session with your agent workspace.
|
|
69
71
|
|
|
70
72
|
```bash
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
73
|
+
# Interactive mode
|
|
74
|
+
$ clawapps connect
|
|
75
|
+
Connected to session: abc-123
|
|
76
|
+
> hello
|
|
77
|
+
Hello! How can I help you?
|
|
78
|
+
> /quit
|
|
79
|
+
|
|
80
|
+
# JSON pipe mode (AI assistant integration)
|
|
81
|
+
$ clawapps connect --json
|
|
74
82
|
```
|
|
75
83
|
|
|
76
|
-
|
|
84
|
+
Options: `--json` `--session-id <id>` `--timeout <ms>`
|
|
77
85
|
|
|
78
|
-
|
|
86
|
+
### `clawapps balance`
|
|
87
|
+
|
|
88
|
+
Check your credit balance.
|
|
79
89
|
|
|
80
90
|
```bash
|
|
81
|
-
$ clawapps
|
|
82
|
-
|
|
83
|
-
|
|
91
|
+
$ clawapps balance
|
|
92
|
+
Account Balance
|
|
93
|
+
Credits: 78.16
|
|
94
|
+
Membership: free
|
|
84
95
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
Auto Payment: disabled
|
|
96
|
+
$ clawapps balance --json
|
|
97
|
+
{"credits":78.16,"membership":"free","display_name":"sammi"}
|
|
88
98
|
```
|
|
89
99
|
|
|
90
|
-
### `clawapps
|
|
100
|
+
### `clawapps sessions`
|
|
91
101
|
|
|
92
|
-
|
|
102
|
+
List or manage local session history.
|
|
93
103
|
|
|
94
104
|
```bash
|
|
95
|
-
$ clawapps
|
|
96
|
-
|
|
105
|
+
$ clawapps sessions
|
|
106
|
+
$ clawapps sessions --clear
|
|
97
107
|
```
|
|
98
108
|
|
|
99
|
-
##
|
|
109
|
+
## AI Assistant Integration
|
|
100
110
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
clawapps token
|
|
109
|
-
→ Load local credentials
|
|
110
|
-
→ Validate access token via API
|
|
111
|
-
→ If expired, auto-refresh using refresh token
|
|
112
|
-
→ Output valid access token to stdout
|
|
111
|
+
External AI assistants (e.g., Claude Code) can use the CLI as a subprocess:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
export CLAWAPPS_ACCESS_TOKEN="eyJ..."
|
|
115
|
+
export CLAWAPPS_REFRESH_TOKEN="eyJ..."
|
|
116
|
+
clawapps send "deploy my app" --json
|
|
113
117
|
```
|
|
114
118
|
|
|
115
|
-
|
|
119
|
+
JSON events (stdout, one per line):
|
|
116
120
|
|
|
117
|
-
|
|
121
|
+
| Event | Description |
|
|
122
|
+
|-------|-------------|
|
|
123
|
+
| `session_created` | Session ID assigned |
|
|
124
|
+
| `text` | Assistant response text (streaming) |
|
|
125
|
+
| `mode_change` | Switched from Gemini to Claude mode |
|
|
126
|
+
| `complete` | Response finished with usage stats |
|
|
127
|
+
| `cost` | Credits consumed and remaining balance |
|
|
128
|
+
| `error` | Error occurred |
|
|
118
129
|
|
|
119
|
-
|
|
120
|
-
{
|
|
121
|
-
"provider": "google",
|
|
122
|
-
"access_token": "eyJ...",
|
|
123
|
-
"refresh_token": "eyJ...",
|
|
124
|
-
"logged_in_at": "2026-03-12T11:00:00.000Z"
|
|
125
|
-
}
|
|
126
|
-
```
|
|
130
|
+
## Credentials
|
|
127
131
|
|
|
128
|
-
|
|
132
|
+
Tokens stored at `~/.clawapps/credentials.json` (permissions `0600`).
|
|
129
133
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
│ ├── index.ts # Commander setup
|
|
135
|
-
│ ├── commands/
|
|
136
|
-
│ │ ├── login.ts # OAuth flow with auto-refresh
|
|
137
|
-
│ │ ├── logout.ts # Clear credentials
|
|
138
|
-
│ │ ├── whoami.ts # User info with auto-refresh
|
|
139
|
-
│ │ ├── token.ts # Print valid access token
|
|
140
|
-
│ │ ├── credit.ts # Open credit page
|
|
141
|
-
│ │ ├── membership.ts # Open membership page
|
|
142
|
-
│ │ ├── payment-grant.ts # Payment authorization flow
|
|
143
|
-
│ │ └── helpers/
|
|
144
|
-
│ │ └── ensure-token.ts # Token validation & refresh
|
|
145
|
-
│ ├── auth/
|
|
146
|
-
│ │ ├── login-server.ts # Login callback server
|
|
147
|
-
│ │ ├── payment-server.ts # Payment callback server
|
|
148
|
-
│ │ ├── server.ts # Google OAuth callback server
|
|
149
|
-
│ │ ├── google.ts # Google OAuth URL builder
|
|
150
|
-
│ │ ├── apple.ts # Apple OAuth URL builder
|
|
151
|
-
│ │ └── exchange.ts # Token exchange
|
|
152
|
-
│ ├── lib/
|
|
153
|
-
│ │ ├── config.ts # API endpoints & constants
|
|
154
|
-
│ │ ├── credentials.ts # Read/write credentials
|
|
155
|
-
│ │ ├── api.ts # HTTP request helpers
|
|
156
|
-
│ │ └── types.ts # TypeScript interfaces
|
|
157
|
-
│ └── html/
|
|
158
|
-
│ ├── callback.ts # OAuth callback HTML templates
|
|
159
|
-
│ └── logo-data.ts # Logo (base64 embedded)
|
|
160
|
-
├── package.json
|
|
161
|
-
└── tsconfig.json
|
|
162
|
-
```
|
|
134
|
+
Environment variables override local credentials:
|
|
135
|
+
- `CLAWAPPS_ACCESS_TOKEN` — Access token
|
|
136
|
+
- `CLAWAPPS_REFRESH_TOKEN` — Refresh token
|
|
137
|
+
- `CLAWAPPS_RELAY_URL` — Custom relay endpoint
|
|
163
138
|
|
|
164
139
|
## Development
|
|
165
140
|
|
|
166
141
|
```bash
|
|
167
|
-
npm install
|
|
168
|
-
npm run build
|
|
169
|
-
|
|
170
|
-
node bin/claw.js # Run locally
|
|
142
|
+
npm install
|
|
143
|
+
npm run build
|
|
144
|
+
node bin/claw.js
|
|
171
145
|
```
|
|
172
146
|
|
|
173
147
|
## Requirements
|
|
174
148
|
|
|
175
|
-
- **Node.js >= 18**
|
|
176
|
-
|
|
177
|
-
## Related
|
|
178
|
-
|
|
179
|
-
- [clawapps-skill](https://github.com/ClawApps/clawapps-skill) — Agent Skill for managing apps on ClawApps
|
|
180
|
-
|
|
181
|
-
## Contributing
|
|
182
|
-
|
|
183
|
-
1. Fork the repository
|
|
184
|
-
2. Create a feature branch (`git checkout -b feat/my-feature`)
|
|
185
|
-
3. Commit your changes (use [Conventional Commits](https://www.conventionalcommits.org/))
|
|
186
|
-
4. Push and open a Pull Request
|
|
149
|
+
- **Node.js >= 18**
|
|
187
150
|
|
|
188
151
|
## License
|
|
189
152
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { resolveCredentials } from './helpers/resolve-credentials.js';
|
|
3
|
+
import { getBalance } from '../lib/relay-client.js';
|
|
4
|
+
export async function balanceCommand(options) {
|
|
5
|
+
try {
|
|
6
|
+
const creds = await resolveCredentials();
|
|
7
|
+
const balance = await getBalance(creds.access_token);
|
|
8
|
+
if (options.json) {
|
|
9
|
+
process.stdout.write(JSON.stringify(balance) + '\n');
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
console.log(chalk.bold('Account Balance'));
|
|
13
|
+
console.log(` Credits: ${chalk.green(String(balance.credits))}`);
|
|
14
|
+
console.log(` Membership: ${balance.membership}`);
|
|
15
|
+
if (balance.display_name) {
|
|
16
|
+
console.log(` Name: ${balance.display_name}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
22
|
+
if (options.json) {
|
|
23
|
+
process.stdout.write(JSON.stringify({ error: msg }) + '\n');
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
console.error(chalk.red(msg));
|
|
27
|
+
}
|
|
28
|
+
process.exit(msg.includes('authenticated') || msg.includes('expired') ? 2 : 1);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=balance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.js","sourceRoot":"","sources":["../../src/commands/balance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA2B;IAC9D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,kBAAkB,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAErD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YACnD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { createInterface } from 'node:readline';
|
|
3
|
+
import { resolveCredentials } from './helpers/resolve-credentials.js';
|
|
4
|
+
import { createSession, sendMessage, stopProcessing, closeSession, saveSession, } from '../lib/relay-client.js';
|
|
5
|
+
function jsonOut(obj) {
|
|
6
|
+
process.stdout.write(JSON.stringify(obj) + '\n');
|
|
7
|
+
}
|
|
8
|
+
export async function connectCommand(options) {
|
|
9
|
+
const isJson = !!options.json;
|
|
10
|
+
try {
|
|
11
|
+
const creds = await resolveCredentials();
|
|
12
|
+
const token = creds.access_token;
|
|
13
|
+
// Create or reuse session
|
|
14
|
+
let sessionId;
|
|
15
|
+
if (options.sessionId) {
|
|
16
|
+
sessionId = options.sessionId;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
const session = await createSession(token);
|
|
20
|
+
sessionId = session.session_id;
|
|
21
|
+
await saveSession({ session_id: sessionId, created_at: new Date().toISOString() });
|
|
22
|
+
}
|
|
23
|
+
if (isJson) {
|
|
24
|
+
jsonOut({ event: 'session_created', session_id: sessionId });
|
|
25
|
+
jsonOut({ event: 'ready' });
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
console.log(chalk.green(`Connected to session: ${sessionId}`));
|
|
29
|
+
console.log(chalk.gray('Type your message and press Enter. Use Ctrl+C to exit.\n'));
|
|
30
|
+
}
|
|
31
|
+
// Handle graceful shutdown
|
|
32
|
+
let shuttingDown = false;
|
|
33
|
+
const cleanup = async () => {
|
|
34
|
+
if (shuttingDown)
|
|
35
|
+
return;
|
|
36
|
+
shuttingDown = true;
|
|
37
|
+
try {
|
|
38
|
+
await closeSession(token, sessionId);
|
|
39
|
+
}
|
|
40
|
+
catch { /* ignore */ }
|
|
41
|
+
process.exit(0);
|
|
42
|
+
};
|
|
43
|
+
process.on('SIGINT', cleanup);
|
|
44
|
+
process.on('SIGTERM', cleanup);
|
|
45
|
+
if (isJson) {
|
|
46
|
+
// JSON mode: read NDJSON from stdin
|
|
47
|
+
await jsonMode(token, sessionId);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Interactive mode: readline prompt
|
|
51
|
+
await interactiveMode(token, sessionId);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
56
|
+
if (isJson) {
|
|
57
|
+
jsonOut({ event: 'error', code: 'CLI_ERROR', message: msg });
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
console.error(chalk.red(msg));
|
|
61
|
+
}
|
|
62
|
+
process.exit(msg.includes('authenticated') || msg.includes('expired') ? 2 : 1);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async function jsonMode(token, sessionId) {
|
|
66
|
+
const rl = createInterface({ input: process.stdin });
|
|
67
|
+
for await (const line of rl) {
|
|
68
|
+
if (!line.trim())
|
|
69
|
+
continue;
|
|
70
|
+
let cmd;
|
|
71
|
+
try {
|
|
72
|
+
cmd = JSON.parse(line);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
jsonOut({ event: 'error', code: 'INVALID_JSON', message: 'Invalid JSON input' });
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (cmd.action === 'stop') {
|
|
79
|
+
await stopProcessing(token, sessionId).catch(() => { });
|
|
80
|
+
jsonOut({ event: 'stopped' });
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (cmd.action === 'message' && cmd.content) {
|
|
84
|
+
for await (const evt of sendMessage(token, sessionId, cmd.content)) {
|
|
85
|
+
jsonOut({ event: evt.event, ...evt.data });
|
|
86
|
+
}
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
jsonOut({ event: 'error', code: 'UNKNOWN_ACTION', message: `Unknown action: ${cmd.action}` });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function interactiveMode(token, sessionId) {
|
|
93
|
+
const rl = createInterface({
|
|
94
|
+
input: process.stdin,
|
|
95
|
+
output: process.stderr, // prompts to stderr, data to stdout
|
|
96
|
+
prompt: chalk.cyan('> '),
|
|
97
|
+
});
|
|
98
|
+
rl.prompt();
|
|
99
|
+
for await (const line of rl) {
|
|
100
|
+
const input = line.trim();
|
|
101
|
+
if (!input) {
|
|
102
|
+
rl.prompt();
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (input.toLowerCase() === '/quit' || input.toLowerCase() === '/exit') {
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
if (input.toLowerCase() === '/stop') {
|
|
109
|
+
await stopProcessing(token, sessionId).catch(() => { });
|
|
110
|
+
console.log(chalk.yellow('Stopped.'));
|
|
111
|
+
rl.prompt();
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
for await (const evt of sendMessage(token, sessionId, input)) {
|
|
116
|
+
switch (evt.event) {
|
|
117
|
+
case 'text':
|
|
118
|
+
process.stdout.write(String(evt.data.content || ''));
|
|
119
|
+
break;
|
|
120
|
+
case 'complete':
|
|
121
|
+
process.stdout.write('\n');
|
|
122
|
+
break;
|
|
123
|
+
case 'cost': {
|
|
124
|
+
const used = evt.data.credits_used;
|
|
125
|
+
const after = evt.data.balance_after;
|
|
126
|
+
if (used > 0) {
|
|
127
|
+
console.log(chalk.gray(`[Credits: -${used} | Balance: ${after}]`));
|
|
128
|
+
}
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
case 'error':
|
|
132
|
+
console.error(chalk.red(`Error: ${evt.data.message}`));
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
console.error(chalk.red(err instanceof Error ? err.message : String(err)));
|
|
139
|
+
}
|
|
140
|
+
rl.prompt();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=connect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Credentials } from '../../lib/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve credentials from environment variables or local file.
|
|
4
|
+
*
|
|
5
|
+
* Priority:
|
|
6
|
+
* 1. CLAWAPPS_ACCESS_TOKEN + CLAWAPPS_REFRESH_TOKEN env vars
|
|
7
|
+
* 2. ~/.clawapps/credentials.json
|
|
8
|
+
* 3. Throw with instructions to run `clawapps login`
|
|
9
|
+
*
|
|
10
|
+
* Token validation is done server-side by the Relay.
|
|
11
|
+
*/
|
|
12
|
+
export declare function resolveCredentials(): Promise<Credentials>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { loadCredentials } from '../../lib/credentials.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve credentials from environment variables or local file.
|
|
4
|
+
*
|
|
5
|
+
* Priority:
|
|
6
|
+
* 1. CLAWAPPS_ACCESS_TOKEN + CLAWAPPS_REFRESH_TOKEN env vars
|
|
7
|
+
* 2. ~/.clawapps/credentials.json
|
|
8
|
+
* 3. Throw with instructions to run `clawapps login`
|
|
9
|
+
*
|
|
10
|
+
* Token validation is done server-side by the Relay.
|
|
11
|
+
*/
|
|
12
|
+
export async function resolveCredentials() {
|
|
13
|
+
const envAccess = process.env.CLAWAPPS_ACCESS_TOKEN;
|
|
14
|
+
const envRefresh = process.env.CLAWAPPS_REFRESH_TOKEN;
|
|
15
|
+
if (envAccess && envRefresh) {
|
|
16
|
+
return {
|
|
17
|
+
provider: 'env',
|
|
18
|
+
access_token: envAccess,
|
|
19
|
+
refresh_token: envRefresh,
|
|
20
|
+
logged_in_at: new Date().toISOString(),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const creds = await loadCredentials();
|
|
24
|
+
if (!creds) {
|
|
25
|
+
throw new Error('Not authenticated. Run `clawapps login` or set CLAWAPPS_ACCESS_TOKEN.');
|
|
26
|
+
}
|
|
27
|
+
return creds;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=resolve-credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-credentials.js","sourceRoot":"","sources":["../../../src/commands/helpers/resolve-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAG3D;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACpD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IAEtD,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;QAC5B,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,SAAS;YACvB,aAAa,EAAE,UAAU;YACzB,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createLoginCode } from '../lib/login-service.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a login code and QR image. Returns immediately (non-blocking).
|
|
4
|
+
* Designed for AI agent integration.
|
|
5
|
+
*/
|
|
6
|
+
export async function loginCodeCommand() {
|
|
7
|
+
try {
|
|
8
|
+
const result = await createLoginCode();
|
|
9
|
+
process.stdout.write(JSON.stringify({
|
|
10
|
+
code: result.code,
|
|
11
|
+
url: result.qr_url,
|
|
12
|
+
qr_image: result.qr_image,
|
|
13
|
+
qr_text: result.qr_text,
|
|
14
|
+
expires_at: result.expires_at,
|
|
15
|
+
next: `clawapps login-poll ${result.code}`,
|
|
16
|
+
instructions: 'Read qr_text file to display QR code to user. Then run the next command to wait for verification.',
|
|
17
|
+
}) + '\n');
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
21
|
+
process.stdout.write(JSON.stringify({ error: msg }) + '\n');
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=login-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-code.js","sourceRoot":"","sources":["../../src/commands/login-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;QACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAClC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,GAAG,EAAE,MAAM,CAAC,MAAM;YAClB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,IAAI,EAAE,uBAAuB,MAAM,CAAC,IAAI,EAAE;YAC1C,YAAY,EAAE,mGAAmG;SAClH,CAAC,GAAG,IAAI,CAAC,CAAC;IACb,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { pollLoginCode } from '../lib/login-service.js';
|
|
2
|
+
/**
|
|
3
|
+
* Poll for login code verification. Outputs JSON events.
|
|
4
|
+
* Designed for AI agent integration.
|
|
5
|
+
*/
|
|
6
|
+
export async function loginPollCommand(code) {
|
|
7
|
+
function jsonOut(obj) {
|
|
8
|
+
process.stdout.write(JSON.stringify(obj) + '\n');
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
const result = await pollLoginCode(code, (remaining) => {
|
|
12
|
+
if (remaining % 30 === 0) {
|
|
13
|
+
jsonOut({ event: 'waiting', remaining });
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
if (result.success) {
|
|
17
|
+
jsonOut({ event: 'login_success', display_name: result.display_name || null });
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
jsonOut({ event: 'error', code: 'LOGIN_FAILED', message: result.error });
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
26
|
+
jsonOut({ event: 'error', code: 'POLL_ERROR', message: msg });
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=login-poll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-poll.js","sourceRoot":"","sources":["../../src/commands/login-poll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY;IACjD,SAAS,OAAO,CAAC,GAA4B;QAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,EAAE;YACrD,IAAI,SAAS,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/commands/login.d.ts
CHANGED