@grantex/cli 0.1.6 → 0.1.7
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 +177 -52
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +18 -13
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/credentials.d.ts +3 -0
- package/dist/commands/credentials.d.ts.map +1 -0
- package/dist/commands/credentials.js +106 -0
- package/dist/commands/credentials.js.map +1 -0
- package/dist/commands/grants.d.ts.map +1 -1
- package/dist/commands/grants.js +8 -4
- package/dist/commands/grants.js.map +1 -1
- package/dist/commands/passports.d.ts +3 -0
- package/dist/commands/passports.d.ts.map +1 -0
- package/dist/commands/passports.js +89 -0
- package/dist/commands/passports.js.map +1 -0
- package/dist/commands/scim.d.ts.map +1 -1
- package/dist/commands/scim.js +81 -1
- package/dist/commands/scim.js.map +1 -1
- package/dist/commands/sso.d.ts.map +1 -1
- package/dist/commands/sso.js +19 -0
- package/dist/commands/sso.js.map +1 -1
- package/dist/commands/vault.d.ts +3 -0
- package/dist/commands/vault.d.ts.map +1 -0
- package/dist/commands/vault.js +117 -0
- package/dist/commands/vault.js.map +1 -0
- package/dist/commands/webauthn.d.ts +3 -0
- package/dist/commands/webauthn.d.ts.map +1 -0
- package/dist/commands/webauthn.js +78 -0
- package/dist/commands/webauthn.js.map +1 -0
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
Command-line tool for the [Grantex](https://grantex.dev) delegated authorization protocol.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
83 commands covering the full Grantex API — agents, grants, tokens, policies, budgets, audit, compliance, credentials, and more. All commands support `--json` for machine-readable output.
|
|
6
6
|
|
|
7
|
-
> **[Homepage](https://grantex.dev)** | **[Docs](https://grantex.dev
|
|
7
|
+
> **[Homepage](https://grantex.dev)** | **[Docs](https://docs.grantex.dev)** | **[CLI Docs](https://docs.grantex.dev/integrations/cli)** | **[GitHub](https://github.com/mishrasanjeev/grantex)**
|
|
8
8
|
|
|
9
9
|
## Install
|
|
10
10
|
|
|
@@ -14,122 +14,247 @@ npm install -g @grantex/cli
|
|
|
14
14
|
|
|
15
15
|
## Configure
|
|
16
16
|
|
|
17
|
-
Point the CLI at your Grantex server and set your API key:
|
|
18
|
-
|
|
19
17
|
```bash
|
|
20
|
-
# Interactive setup
|
|
21
18
|
grantex config set --url https://grantex-auth-dd4mtrt2gq-uc.a.run.app --key YOUR_API_KEY
|
|
22
19
|
|
|
23
20
|
# Or use environment variables
|
|
24
21
|
export GRANTEX_URL=https://grantex-auth-dd4mtrt2gq-uc.a.run.app
|
|
25
22
|
export GRANTEX_KEY=YOUR_API_KEY
|
|
23
|
+
|
|
24
|
+
# Verify your setup
|
|
25
|
+
grantex me
|
|
26
26
|
```
|
|
27
27
|
|
|
28
28
|
Config is saved to `~/.grantex/config.json`. Environment variables override the config file.
|
|
29
29
|
|
|
30
|
+
## JSON Output
|
|
31
|
+
|
|
32
|
+
All commands support `--json` for machine-readable output — ideal for scripting, `jq`, and AI coding assistants (Claude Code, Cursor, Codex).
|
|
33
|
+
|
|
30
34
|
```bash
|
|
31
|
-
|
|
32
|
-
grantex
|
|
35
|
+
grantex --json agents list | jq '.[0].agentId'
|
|
36
|
+
grantex --json tokens verify <jwt> | jq '.valid'
|
|
33
37
|
```
|
|
34
38
|
|
|
39
|
+
Set `NO_COLOR=1` to disable colored output.
|
|
40
|
+
|
|
35
41
|
## Commands
|
|
36
42
|
|
|
43
|
+
### Core Flow
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# 1. Register an agent
|
|
47
|
+
grantex agents register --name "My Bot" --description "Reads email" --scopes email:read
|
|
48
|
+
|
|
49
|
+
# 2. Start authorization
|
|
50
|
+
grantex authorize --agent ag_... --principal user@example.com --scopes email:read
|
|
51
|
+
|
|
52
|
+
# 3. Exchange code for token
|
|
53
|
+
grantex tokens exchange --code <code> --agent-id ag_...
|
|
54
|
+
|
|
55
|
+
# 4. Verify the token
|
|
56
|
+
grantex tokens verify <jwt>
|
|
57
|
+
|
|
58
|
+
# 5. Refresh when needed
|
|
59
|
+
grantex tokens refresh --refresh-token <token> --agent-id ag_...
|
|
60
|
+
|
|
61
|
+
# 6. Revoke when done
|
|
62
|
+
grantex grants revoke grnt_...
|
|
63
|
+
```
|
|
64
|
+
|
|
37
65
|
### Agents
|
|
38
66
|
|
|
39
67
|
```bash
|
|
40
68
|
grantex agents list
|
|
41
|
-
grantex agents register --name
|
|
42
|
-
grantex agents get
|
|
43
|
-
grantex agents update
|
|
44
|
-
grantex agents delete
|
|
69
|
+
grantex agents register --name bot --description "..." --scopes email:read,calendar:write
|
|
70
|
+
grantex agents get ag_...
|
|
71
|
+
grantex agents update ag_... --name new-name --scopes email:read
|
|
72
|
+
grantex agents delete ag_...
|
|
45
73
|
```
|
|
46
74
|
|
|
47
75
|
### Grants
|
|
48
76
|
|
|
49
77
|
```bash
|
|
50
|
-
grantex grants list
|
|
51
|
-
grantex grants
|
|
52
|
-
grantex grants revoke
|
|
78
|
+
grantex grants list [--agent ag_... --status active]
|
|
79
|
+
grantex grants get grnt_...
|
|
80
|
+
grantex grants revoke grnt_...
|
|
81
|
+
grantex grants delegate --grant-token <jwt> --agent-id ag_child... --scopes email:read
|
|
53
82
|
```
|
|
54
83
|
|
|
55
84
|
### Tokens
|
|
56
85
|
|
|
57
86
|
```bash
|
|
58
|
-
grantex tokens
|
|
87
|
+
grantex tokens exchange --code <code> --agent-id ag_...
|
|
88
|
+
grantex tokens verify <jwt>
|
|
89
|
+
grantex tokens refresh --refresh-token <token> --agent-id ag_...
|
|
59
90
|
grantex tokens revoke <jti>
|
|
60
91
|
```
|
|
61
92
|
|
|
62
|
-
###
|
|
93
|
+
### Authorize
|
|
63
94
|
|
|
64
95
|
```bash
|
|
65
|
-
grantex
|
|
66
|
-
grantex
|
|
96
|
+
grantex authorize --agent ag_... --principal user@example.com --scopes email:read
|
|
97
|
+
grantex authorize --agent ag_... --principal user@example.com --scopes email:read \
|
|
98
|
+
--code-challenge <S256-challenge> --redirect-uri https://app.com/callback
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Audit
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
grantex audit list [--agent ag_... --grant grnt_... --action email.read --since 2026-01-01]
|
|
105
|
+
grantex audit get alog_...
|
|
106
|
+
grantex audit log --agent-id ag_... --agent-did did:grantex:ag_... --grant-id grnt_... \
|
|
107
|
+
--principal-id user@example.com --action email.read --status success
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Policies
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
grantex policies list
|
|
114
|
+
grantex policies get pol_...
|
|
115
|
+
grantex policies create --name "Allow Bot" --effect allow --agent-id ag_... --scopes email:read
|
|
116
|
+
grantex policies update pol_... --priority 50
|
|
117
|
+
grantex policies delete pol_...
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Budgets
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
grantex budgets allocate --grant-id grnt_... --amount 100 [--currency USD]
|
|
124
|
+
grantex budgets debit --grant-id grnt_... --amount 25.50 --description "API call"
|
|
125
|
+
grantex budgets balance grnt_...
|
|
126
|
+
grantex budgets transactions grnt_...
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Usage
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
grantex usage current
|
|
133
|
+
grantex usage history [--days 7]
|
|
67
134
|
```
|
|
68
135
|
|
|
69
136
|
### Webhooks
|
|
70
137
|
|
|
71
138
|
```bash
|
|
72
139
|
grantex webhooks list
|
|
73
|
-
grantex webhooks create --url https://example.com/hook --events grant.created,
|
|
74
|
-
grantex webhooks delete
|
|
140
|
+
grantex webhooks create --url https://example.com/hook --events grant.created,token.issued
|
|
141
|
+
grantex webhooks delete wh_...
|
|
75
142
|
```
|
|
76
143
|
|
|
77
|
-
|
|
144
|
+
### Events
|
|
78
145
|
|
|
79
|
-
|
|
146
|
+
```bash
|
|
147
|
+
grantex events stream [--types grant.created,token.issued]
|
|
148
|
+
grantex --json events stream # One JSON object per line
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Domains
|
|
80
152
|
|
|
81
153
|
```bash
|
|
82
|
-
|
|
83
|
-
grantex
|
|
84
|
-
grantex
|
|
154
|
+
grantex domains list
|
|
155
|
+
grantex domains add --domain auth.mycompany.com
|
|
156
|
+
grantex domains verify dom_...
|
|
157
|
+
grantex domains delete dom_...
|
|
158
|
+
```
|
|
85
159
|
|
|
86
|
-
|
|
87
|
-
grantex compliance export grants --format json --output grants.json
|
|
160
|
+
### Vault (Credential Storage)
|
|
88
161
|
|
|
89
|
-
|
|
90
|
-
grantex
|
|
162
|
+
```bash
|
|
163
|
+
grantex vault list [--principal user@example.com --service google]
|
|
164
|
+
grantex vault get cred_...
|
|
165
|
+
grantex vault store --principal-id user@example.com --service google --access-token ya29...
|
|
166
|
+
grantex vault delete cred_...
|
|
167
|
+
grantex vault exchange --grant-token <jwt> --service google
|
|
168
|
+
```
|
|
91
169
|
|
|
92
|
-
|
|
170
|
+
### WebAuthn / FIDO2
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
grantex webauthn register-options --principal-id user@example.com
|
|
174
|
+
grantex webauthn register-verify --challenge-id ch_... --response '{"id":"..."}' --device-name "MacBook"
|
|
175
|
+
grantex webauthn list user@example.com
|
|
176
|
+
grantex webauthn delete cred_...
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Verifiable Credentials
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
grantex credentials list [--grant-id grnt_... --status active]
|
|
183
|
+
grantex credentials get vc_...
|
|
184
|
+
grantex credentials verify --vc-jwt eyJ...
|
|
185
|
+
grantex credentials present --sd-jwt eyJ... --nonce abc123
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Agent Passports (MPP)
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
grantex passports issue --agent-id ag_... --grant-id grnt_... --categories "compute,storage" --max-amount 100
|
|
192
|
+
grantex passports list [--agent-id ag_...]
|
|
193
|
+
grantex passports get pp_...
|
|
194
|
+
grantex passports revoke pp_...
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Principal Sessions
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
grantex principal-sessions create --principal-id user@example.com [--expires-in 1h]
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Account
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
grantex me
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Compliance
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
grantex compliance summary [--since 2026-01-01 --until 2026-02-01]
|
|
213
|
+
grantex compliance export grants --format json --output grants.json
|
|
214
|
+
grantex compliance export audit --format json --output audit.json
|
|
93
215
|
grantex compliance evidence-pack --framework soc2 --output evidence.json
|
|
94
216
|
```
|
|
95
217
|
|
|
96
|
-
###
|
|
218
|
+
### Anomalies
|
|
97
219
|
|
|
98
220
|
```bash
|
|
99
221
|
grantex anomalies detect
|
|
100
|
-
grantex anomalies list
|
|
101
|
-
grantex anomalies
|
|
102
|
-
grantex anomalies acknowledge anom_01XYZ...
|
|
222
|
+
grantex anomalies list [--unacknowledged]
|
|
223
|
+
grantex anomalies acknowledge anom_...
|
|
103
224
|
```
|
|
104
225
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
For local development with `docker compose`:
|
|
226
|
+
### Billing
|
|
108
227
|
|
|
109
228
|
```bash
|
|
110
|
-
grantex
|
|
229
|
+
grantex billing status
|
|
230
|
+
grantex billing checkout pro --success-url https://app.com/ok --cancel-url https://app.com/cancel
|
|
231
|
+
grantex billing portal --return-url https://app.com/settings
|
|
111
232
|
```
|
|
112
233
|
|
|
113
|
-
|
|
234
|
+
### SCIM
|
|
114
235
|
|
|
115
|
-
|
|
236
|
+
```bash
|
|
237
|
+
grantex scim tokens list | create --label "Okta" | revoke tok_...
|
|
238
|
+
grantex scim users list | get usr_... | create --user-name john@co.com | update usr_... | delete usr_...
|
|
239
|
+
```
|
|
116
240
|
|
|
117
|
-
|
|
241
|
+
### SSO
|
|
118
242
|
|
|
119
|
-
|
|
120
|
-
-
|
|
121
|
-
|
|
122
|
-
|
|
243
|
+
```bash
|
|
244
|
+
grantex sso get | configure --issuer-url ... --client-id ... | delete
|
|
245
|
+
grantex sso login-url my-org
|
|
246
|
+
grantex sso callback --code CODE --state STATE
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
## Local Development
|
|
123
250
|
|
|
124
|
-
|
|
251
|
+
```bash
|
|
252
|
+
grantex config set --url http://localhost:3001 --key dev-api-key-local
|
|
253
|
+
```
|
|
125
254
|
|
|
126
|
-
|
|
255
|
+
## Requirements
|
|
127
256
|
|
|
128
|
-
-
|
|
129
|
-
- [`grantex`](https://pypi.org/project/grantex/) — Python SDK
|
|
130
|
-
- [`@grantex/langchain`](https://www.npmjs.com/package/@grantex/langchain) — LangChain integration
|
|
131
|
-
- [`@grantex/mcp`](https://www.npmjs.com/package/@grantex/mcp) — MCP server for Claude Desktop / Cursor / Windsurf
|
|
132
|
-
- [`@grantex/vercel-ai`](https://www.npmjs.com/package/@grantex/vercel-ai) — Vercel AI SDK integration
|
|
257
|
+
- Node.js 18+
|
|
133
258
|
|
|
134
259
|
## License
|
|
135
260
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,aAAa,IAAI,OAAO,CAuGvC"}
|
package/dist/commands/agents.js
CHANGED
|
@@ -2,6 +2,10 @@ import { Command } from 'commander';
|
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import { requireClient } from '../client.js';
|
|
4
4
|
import { printTable, printRecord, shortDate, isJsonMode } from '../format.js';
|
|
5
|
+
// The API returns `agentId` but the SDK type says `id`. Handle both.
|
|
6
|
+
function agentId(a) {
|
|
7
|
+
return String(a.agentId ?? a.id ?? '');
|
|
8
|
+
}
|
|
5
9
|
export function agentsCommand() {
|
|
6
10
|
const cmd = new Command('agents').description('Manage registered agents');
|
|
7
11
|
cmd
|
|
@@ -11,7 +15,7 @@ export function agentsCommand() {
|
|
|
11
15
|
const client = await requireClient();
|
|
12
16
|
const { agents } = await client.agents.list();
|
|
13
17
|
printTable(agents.map((a) => ({
|
|
14
|
-
ID: a
|
|
18
|
+
ID: agentId(a),
|
|
15
19
|
NAME: a.name,
|
|
16
20
|
DID: a.did,
|
|
17
21
|
CREATED: shortDate(a.createdAt),
|
|
@@ -34,9 +38,10 @@ export function agentsCommand() {
|
|
|
34
38
|
console.log(JSON.stringify(agent, null, 2));
|
|
35
39
|
return;
|
|
36
40
|
}
|
|
37
|
-
|
|
41
|
+
const id = agentId(agent);
|
|
42
|
+
console.log(chalk.green('✓') + ` Agent registered: ${id}`);
|
|
38
43
|
printRecord({
|
|
39
|
-
id
|
|
44
|
+
id,
|
|
40
45
|
name: agent.name,
|
|
41
46
|
did: agent.did,
|
|
42
47
|
scopes: agent.scopes.join(', '),
|
|
@@ -46,15 +51,15 @@ export function agentsCommand() {
|
|
|
46
51
|
cmd
|
|
47
52
|
.command('get <agentId>')
|
|
48
53
|
.description('Get details for a single agent')
|
|
49
|
-
.action(async (
|
|
54
|
+
.action(async (agentIdArg) => {
|
|
50
55
|
const client = await requireClient();
|
|
51
|
-
const agent = await client.agents.get(
|
|
56
|
+
const agent = await client.agents.get(agentIdArg);
|
|
52
57
|
if (isJsonMode()) {
|
|
53
58
|
console.log(JSON.stringify(agent, null, 2));
|
|
54
59
|
return;
|
|
55
60
|
}
|
|
56
61
|
printRecord({
|
|
57
|
-
id: agent
|
|
62
|
+
id: agentId(agent),
|
|
58
63
|
name: agent.name,
|
|
59
64
|
did: agent.did,
|
|
60
65
|
description: agent.description,
|
|
@@ -68,7 +73,7 @@ export function agentsCommand() {
|
|
|
68
73
|
.option('--name <name>', 'New agent name')
|
|
69
74
|
.option('--description <desc>', 'New agent description')
|
|
70
75
|
.option('--scopes <scopes>', 'New comma-separated scopes')
|
|
71
|
-
.action(async (
|
|
76
|
+
.action(async (agentIdArg, opts) => {
|
|
72
77
|
const client = await requireClient();
|
|
73
78
|
const updates = {};
|
|
74
79
|
if (opts.name !== undefined)
|
|
@@ -77,24 +82,24 @@ export function agentsCommand() {
|
|
|
77
82
|
updates.description = opts.description;
|
|
78
83
|
if (opts.scopes !== undefined)
|
|
79
84
|
updates.scopes = opts.scopes.split(',').map((s) => s.trim());
|
|
80
|
-
const agent = await client.agents.update(
|
|
85
|
+
const agent = await client.agents.update(agentIdArg, updates);
|
|
81
86
|
if (isJsonMode()) {
|
|
82
87
|
console.log(JSON.stringify(agent, null, 2));
|
|
83
88
|
return;
|
|
84
89
|
}
|
|
85
|
-
console.log(chalk.green('✓') + ` Agent ${
|
|
90
|
+
console.log(chalk.green('✓') + ` Agent ${agentIdArg} updated.`);
|
|
86
91
|
});
|
|
87
92
|
cmd
|
|
88
93
|
.command('delete <agentId>')
|
|
89
94
|
.description('Delete an agent')
|
|
90
|
-
.action(async (
|
|
95
|
+
.action(async (agentIdArg) => {
|
|
91
96
|
const client = await requireClient();
|
|
92
|
-
await client.agents.delete(
|
|
97
|
+
await client.agents.delete(agentIdArg);
|
|
93
98
|
if (isJsonMode()) {
|
|
94
|
-
console.log(JSON.stringify({ deleted:
|
|
99
|
+
console.log(JSON.stringify({ deleted: agentIdArg }));
|
|
95
100
|
return;
|
|
96
101
|
}
|
|
97
|
-
console.log(chalk.green('✓') + ` Agent ${
|
|
102
|
+
console.log(chalk.green('✓') + ` Agent ${agentIdArg} deleted.`);
|
|
98
103
|
});
|
|
99
104
|
return cmd;
|
|
100
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE9E,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAE1E,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iBAAiB,CAAC;SAC9B,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9C,UAAU,CACR,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjB,EAAE,EAAE,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/commands/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,kBAAkB,IAAI,OAAO,CA2G5C"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { requireClient } from '../client.js';
|
|
4
|
+
import { printTable, printRecord, shortDate, isJsonMode } from '../format.js';
|
|
5
|
+
export function credentialsCommand() {
|
|
6
|
+
const cmd = new Command('credentials').description('Manage verifiable credentials and SD-JWT');
|
|
7
|
+
cmd
|
|
8
|
+
.command('list')
|
|
9
|
+
.description('List verifiable credentials')
|
|
10
|
+
.option('--grant-id <grantId>', 'Filter by grant ID')
|
|
11
|
+
.option('--principal-id <principalId>', 'Filter by principal ID')
|
|
12
|
+
.option('--status <status>', 'Filter by status')
|
|
13
|
+
.action(async (opts) => {
|
|
14
|
+
const client = await requireClient();
|
|
15
|
+
const res = await client.credentials.list({
|
|
16
|
+
...(opts.grantId !== undefined ? { grantId: opts.grantId } : {}),
|
|
17
|
+
...(opts.principalId !== undefined ? { principalId: opts.principalId } : {}),
|
|
18
|
+
...(opts.status !== undefined ? { status: opts.status } : {}),
|
|
19
|
+
});
|
|
20
|
+
printTable(res.credentials.map((c) => ({
|
|
21
|
+
ID: c.id,
|
|
22
|
+
GRANT: c.grantId,
|
|
23
|
+
TYPE: c.credentialType,
|
|
24
|
+
FORMAT: c.format,
|
|
25
|
+
STATUS: c.status,
|
|
26
|
+
ISSUED: shortDate(c.issuedAt),
|
|
27
|
+
})), ['ID', 'GRANT', 'TYPE', 'FORMAT', 'STATUS', 'ISSUED'], res.credentials.map((c) => ({ ...c })));
|
|
28
|
+
});
|
|
29
|
+
cmd
|
|
30
|
+
.command('get <credentialId>')
|
|
31
|
+
.description('Get a verifiable credential by ID')
|
|
32
|
+
.action(async (credentialId) => {
|
|
33
|
+
const client = await requireClient();
|
|
34
|
+
const cred = await client.credentials.get(credentialId);
|
|
35
|
+
if (isJsonMode()) {
|
|
36
|
+
console.log(JSON.stringify(cred, null, 2));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
printRecord({
|
|
40
|
+
id: cred.id,
|
|
41
|
+
grantId: cred.grantId,
|
|
42
|
+
credentialType: cred.credentialType,
|
|
43
|
+
format: cred.format,
|
|
44
|
+
status: cred.status,
|
|
45
|
+
issuedAt: shortDate(cred.issuedAt),
|
|
46
|
+
expiresAt: shortDate(cred.expiresAt),
|
|
47
|
+
credential: cred.credential.slice(0, 60) + '...',
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
cmd
|
|
51
|
+
.command('verify')
|
|
52
|
+
.description('Verify a VC-JWT credential')
|
|
53
|
+
.requiredOption('--vc-jwt <jwt>', 'The VC-JWT string to verify')
|
|
54
|
+
.action(async (opts) => {
|
|
55
|
+
const client = await requireClient();
|
|
56
|
+
const res = await client.credentials.verify(opts.vcJwt);
|
|
57
|
+
if (isJsonMode()) {
|
|
58
|
+
console.log(JSON.stringify(res, null, 2));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (res.valid) {
|
|
62
|
+
console.log(chalk.green('✓') + ' Credential is valid.');
|
|
63
|
+
printRecord({
|
|
64
|
+
credentialType: res.credentialType ?? '',
|
|
65
|
+
issuer: res.issuer ?? '',
|
|
66
|
+
expiresAt: res.expiresAt ? shortDate(res.expiresAt) : '—',
|
|
67
|
+
revoked: String(res.revoked ?? false),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
console.error(chalk.red('✗') + ' Credential is invalid.');
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
cmd
|
|
76
|
+
.command('present')
|
|
77
|
+
.description('Verify an SD-JWT presentation (selective disclosure)')
|
|
78
|
+
.requiredOption('--sd-jwt <sdJwt>', 'The SD-JWT string to present')
|
|
79
|
+
.option('--nonce <nonce>', 'Presentation nonce')
|
|
80
|
+
.option('--audience <aud>', 'Intended audience')
|
|
81
|
+
.action(async (opts) => {
|
|
82
|
+
const client = await requireClient();
|
|
83
|
+
const res = await client.credentials.present({
|
|
84
|
+
sdJwt: opts.sdJwt,
|
|
85
|
+
...(opts.nonce !== undefined ? { nonce: opts.nonce } : {}),
|
|
86
|
+
...(opts.audience !== undefined ? { audience: opts.audience } : {}),
|
|
87
|
+
});
|
|
88
|
+
if (isJsonMode()) {
|
|
89
|
+
console.log(JSON.stringify(res, null, 2));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (res.valid) {
|
|
93
|
+
console.log(chalk.green('✓') + ' SD-JWT presentation is valid.');
|
|
94
|
+
if (res.disclosedClaims) {
|
|
95
|
+
console.log('\nDisclosed claims:');
|
|
96
|
+
console.log(JSON.stringify(res.disclosedClaims, null, 2));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
console.error(chalk.red('✗') + ` Presentation invalid: ${res.error ?? 'unknown error'}`);
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
return cmd;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/commands/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grants.d.ts","sourceRoot":"","sources":["../../src/commands/grants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"grants.d.ts","sourceRoot":"","sources":["../../src/commands/grants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,aAAa,IAAI,OAAO,CAsGvC"}
|
package/dist/commands/grants.js
CHANGED
|
@@ -2,6 +2,10 @@ import { Command } from 'commander';
|
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import { requireClient } from '../client.js';
|
|
4
4
|
import { printTable, printRecord, shortDate, isJsonMode } from '../format.js';
|
|
5
|
+
// The API returns `grantId` but the SDK type says `id`. Handle both.
|
|
6
|
+
function grantId(g) {
|
|
7
|
+
return String(g.grantId ?? g.id ?? '');
|
|
8
|
+
}
|
|
5
9
|
export function grantsCommand() {
|
|
6
10
|
const cmd = new Command('grants').description('View and manage grants');
|
|
7
11
|
cmd
|
|
@@ -18,7 +22,7 @@ export function grantsCommand() {
|
|
|
18
22
|
...(opts.status ? { status: opts.status } : {}),
|
|
19
23
|
});
|
|
20
24
|
printTable(grants.map((g) => ({
|
|
21
|
-
ID: g
|
|
25
|
+
ID: grantId(g),
|
|
22
26
|
AGENT: g.agentId,
|
|
23
27
|
PRINCIPAL: g.principalId,
|
|
24
28
|
STATUS: g.status,
|
|
@@ -29,15 +33,15 @@ export function grantsCommand() {
|
|
|
29
33
|
cmd
|
|
30
34
|
.command('get <grantId>')
|
|
31
35
|
.description('Get details for a single grant')
|
|
32
|
-
.action(async (
|
|
36
|
+
.action(async (grantIdArg) => {
|
|
33
37
|
const client = await requireClient();
|
|
34
|
-
const grant = await client.grants.get(
|
|
38
|
+
const grant = await client.grants.get(grantIdArg);
|
|
35
39
|
if (isJsonMode()) {
|
|
36
40
|
console.log(JSON.stringify(grant, null, 2));
|
|
37
41
|
return;
|
|
38
42
|
}
|
|
39
43
|
printRecord({
|
|
40
|
-
id: grant
|
|
44
|
+
id: grantId(grant),
|
|
41
45
|
agentId: grant.agentId,
|
|
42
46
|
principalId: grant.principalId,
|
|
43
47
|
status: grant.status,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grants.js","sourceRoot":"","sources":["../../src/commands/grants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE9E,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAExE,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,aAAa,CAAC;SAC1B,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,CAAC;SACjD,MAAM,CAAC,2BAA2B,EAAE,wBAAwB,CAAC;SAC7D,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,CAAC;SACxE,MAAM,CAAC,KAAK,EAAE,IAA6D,EAAE,EAAE;QAC9E,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YAC1C,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAA0C,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpF,CAAC,CAAC;QACH,UAAU,CACR,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjB,EAAE,EAAE,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"grants.js","sourceRoot":"","sources":["../../src/commands/grants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passports.d.ts","sourceRoot":"","sources":["../../src/commands/passports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,gBAAgB,IAAI,OAAO,CAwG1C"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { requireClient } from '../client.js';
|
|
4
|
+
import { printTable, printRecord, shortDate, isJsonMode } from '../format.js';
|
|
5
|
+
export function passportsCommand() {
|
|
6
|
+
const cmd = new Command('passports').description('Manage agent passports (MPP spend authorization)');
|
|
7
|
+
cmd
|
|
8
|
+
.command('issue')
|
|
9
|
+
.description('Issue a new agent passport')
|
|
10
|
+
.requiredOption('--agent-id <agentId>', 'Agent to issue passport for')
|
|
11
|
+
.requiredOption('--grant-id <grantId>', 'Grant backing this passport')
|
|
12
|
+
.requiredOption('--categories <cats>', 'Comma-separated MPP categories')
|
|
13
|
+
.requiredOption('--max-amount <n>', 'Maximum transaction amount', parseFloat)
|
|
14
|
+
.option('--currency <currency>', 'Currency code (default: USD)', 'USD')
|
|
15
|
+
.option('--payment-rails <rails>', 'Comma-separated payment rails')
|
|
16
|
+
.option('--expires-in <duration>', 'Expiry duration (e.g. 24h)')
|
|
17
|
+
.option('--parent-passport-id <id>', 'Parent passport for delegation')
|
|
18
|
+
.action(async (opts) => {
|
|
19
|
+
const client = await requireClient();
|
|
20
|
+
const res = await client.passports.issue({
|
|
21
|
+
agentId: opts.agentId,
|
|
22
|
+
grantId: opts.grantId,
|
|
23
|
+
allowedMPPCategories: opts.categories.split(',').map((c) => c.trim()),
|
|
24
|
+
maxTransactionAmount: { amount: opts.maxAmount, currency: opts.currency },
|
|
25
|
+
...(opts.paymentRails !== undefined ? { paymentRails: opts.paymentRails.split(',').map((r) => r.trim()) } : {}),
|
|
26
|
+
...(opts.expiresIn !== undefined ? { expiresIn: opts.expiresIn } : {}),
|
|
27
|
+
...(opts.parentPassportId !== undefined ? { parentPassportId: opts.parentPassportId } : {}),
|
|
28
|
+
});
|
|
29
|
+
if (isJsonMode()) {
|
|
30
|
+
console.log(JSON.stringify(res, null, 2));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
console.log(chalk.green('✓') + ` Passport issued: ${res.passportId}`);
|
|
34
|
+
printRecord({
|
|
35
|
+
passportId: res.passportId,
|
|
36
|
+
expiresAt: shortDate(res.expiresAt),
|
|
37
|
+
encodedCredential: res.encodedCredential.slice(0, 60) + '...',
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
cmd
|
|
41
|
+
.command('get <passportId>')
|
|
42
|
+
.description('Get a passport by ID')
|
|
43
|
+
.action(async (passportId) => {
|
|
44
|
+
const client = await requireClient();
|
|
45
|
+
const res = await client.passports.get(passportId);
|
|
46
|
+
if (isJsonMode()) {
|
|
47
|
+
console.log(JSON.stringify(res, null, 2));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
printRecord({
|
|
51
|
+
status: res.status,
|
|
52
|
+
...Object.fromEntries(Object.entries(res)
|
|
53
|
+
.filter(([k]) => k !== 'status')
|
|
54
|
+
.map(([k, v]) => [k, typeof v === 'string' ? v : JSON.stringify(v)])),
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
cmd
|
|
58
|
+
.command('list')
|
|
59
|
+
.description('List issued passports')
|
|
60
|
+
.option('--agent-id <agentId>', 'Filter by agent ID')
|
|
61
|
+
.option('--grant-id <grantId>', 'Filter by grant ID')
|
|
62
|
+
.option('--status <status>', 'Filter by status')
|
|
63
|
+
.action(async (opts) => {
|
|
64
|
+
const client = await requireClient();
|
|
65
|
+
const passports = await client.passports.list({
|
|
66
|
+
...(opts.agentId !== undefined ? { agentId: opts.agentId } : {}),
|
|
67
|
+
...(opts.grantId !== undefined ? { grantId: opts.grantId } : {}),
|
|
68
|
+
...(opts.status !== undefined ? { status: opts.status } : {}),
|
|
69
|
+
});
|
|
70
|
+
printTable(passports.map((p) => ({
|
|
71
|
+
ID: p.passportId,
|
|
72
|
+
EXPIRES: shortDate(p.expiresAt),
|
|
73
|
+
})), ['ID', 'EXPIRES'], passports.map((p) => ({ ...p })));
|
|
74
|
+
});
|
|
75
|
+
cmd
|
|
76
|
+
.command('revoke <passportId>')
|
|
77
|
+
.description('Revoke an agent passport')
|
|
78
|
+
.action(async (passportId) => {
|
|
79
|
+
const client = await requireClient();
|
|
80
|
+
const res = await client.passports.revoke(passportId);
|
|
81
|
+
if (isJsonMode()) {
|
|
82
|
+
console.log(JSON.stringify(res, null, 2));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
console.log(chalk.green('✓') + ` Passport ${passportId} revoked at ${res.revokedAt}.`);
|
|
86
|
+
});
|
|
87
|
+
return cmd;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=passports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passports.js","sourceRoot":"","sources":["../../src/commands/passports.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scim.d.ts","sourceRoot":"","sources":["../../src/commands/scim.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,WAAW,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"scim.d.ts","sourceRoot":"","sources":["../../src/commands/scim.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,WAAW,IAAI,OAAO,CAyLrC"}
|
package/dist/commands/scim.js
CHANGED
|
@@ -47,7 +47,7 @@ export function scimCommand() {
|
|
|
47
47
|
});
|
|
48
48
|
cmd.addCommand(tokens);
|
|
49
49
|
// ── scim users ───────────────────────────────────────────────────────────
|
|
50
|
-
const users = new Command('users').description('
|
|
50
|
+
const users = new Command('users').description('Manage SCIM-provisioned users');
|
|
51
51
|
users
|
|
52
52
|
.command('list')
|
|
53
53
|
.description('List SCIM users')
|
|
@@ -84,6 +84,86 @@ export function scimCommand() {
|
|
|
84
84
|
emails: u.emails.map((e) => e.value).join(', ') || '—',
|
|
85
85
|
});
|
|
86
86
|
});
|
|
87
|
+
users
|
|
88
|
+
.command('create')
|
|
89
|
+
.description('Create a SCIM user')
|
|
90
|
+
.requiredOption('--user-name <userName>', 'Unique user name')
|
|
91
|
+
.option('--display-name <name>', 'Display name')
|
|
92
|
+
.option('--external-id <id>', 'External system user ID')
|
|
93
|
+
.option('--email <email>', 'Primary email address')
|
|
94
|
+
.action(async (opts) => {
|
|
95
|
+
const client = await requireClient();
|
|
96
|
+
const res = await client.scim.createUser({
|
|
97
|
+
userName: opts.userName,
|
|
98
|
+
...(opts.displayName !== undefined ? { displayName: opts.displayName } : {}),
|
|
99
|
+
...(opts.externalId !== undefined ? { externalId: opts.externalId } : {}),
|
|
100
|
+
...(opts.email !== undefined ? { emails: [{ value: opts.email, primary: true }] } : {}),
|
|
101
|
+
});
|
|
102
|
+
if (isJsonMode()) {
|
|
103
|
+
console.log(JSON.stringify(res, null, 2));
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
console.log(chalk.green('✓') + ` SCIM user created: ${res.id}`);
|
|
107
|
+
});
|
|
108
|
+
users
|
|
109
|
+
.command('update <userId>')
|
|
110
|
+
.description('Update a SCIM user (PATCH)')
|
|
111
|
+
.option('--display-name <name>', 'New display name')
|
|
112
|
+
.option('--active <bool>', 'Set active status (true/false)')
|
|
113
|
+
.option('--user-name <userName>', 'New user name')
|
|
114
|
+
.action(async (userId, opts) => {
|
|
115
|
+
const client = await requireClient();
|
|
116
|
+
const operations = [];
|
|
117
|
+
if (opts.displayName !== undefined)
|
|
118
|
+
operations.push({ op: 'replace', path: 'displayName', value: opts.displayName });
|
|
119
|
+
if (opts.active !== undefined)
|
|
120
|
+
operations.push({ op: 'replace', path: 'active', value: opts.active === 'true' });
|
|
121
|
+
if (opts.userName !== undefined)
|
|
122
|
+
operations.push({ op: 'replace', path: 'userName', value: opts.userName });
|
|
123
|
+
if (operations.length === 0) {
|
|
124
|
+
console.error('Error: provide at least one field to update (--display-name, --active, --user-name).');
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
const res = await client.scim.updateUser(userId, operations);
|
|
128
|
+
if (isJsonMode()) {
|
|
129
|
+
console.log(JSON.stringify(res, null, 2));
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
console.log(chalk.green('✓') + ` SCIM user ${userId} updated.`);
|
|
133
|
+
});
|
|
134
|
+
users
|
|
135
|
+
.command('replace <userId>')
|
|
136
|
+
.description('Replace a SCIM user (PUT)')
|
|
137
|
+
.requiredOption('--user-name <userName>', 'User name')
|
|
138
|
+
.option('--display-name <name>', 'Display name')
|
|
139
|
+
.option('--email <email>', 'Primary email address')
|
|
140
|
+
.option('--active <bool>', 'Active status (true/false)', 'true')
|
|
141
|
+
.action(async (userId, opts) => {
|
|
142
|
+
const client = await requireClient();
|
|
143
|
+
const res = await client.scim.replaceUser(userId, {
|
|
144
|
+
userName: opts.userName,
|
|
145
|
+
...(opts.displayName !== undefined ? { displayName: opts.displayName } : {}),
|
|
146
|
+
...(opts.email !== undefined ? { emails: [{ value: opts.email, primary: true }] } : {}),
|
|
147
|
+
active: opts.active === 'true',
|
|
148
|
+
});
|
|
149
|
+
if (isJsonMode()) {
|
|
150
|
+
console.log(JSON.stringify(res, null, 2));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
console.log(chalk.green('✓') + ` SCIM user ${userId} replaced.`);
|
|
154
|
+
});
|
|
155
|
+
users
|
|
156
|
+
.command('delete <userId>')
|
|
157
|
+
.description('Delete a SCIM user')
|
|
158
|
+
.action(async (userId) => {
|
|
159
|
+
const client = await requireClient();
|
|
160
|
+
await client.scim.deleteUser(userId);
|
|
161
|
+
if (isJsonMode()) {
|
|
162
|
+
console.log(JSON.stringify({ deleted: userId }));
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
console.log(chalk.green('✓') + ` SCIM user ${userId} deleted.`);
|
|
166
|
+
});
|
|
87
167
|
cmd.addCommand(users);
|
|
88
168
|
return cmd;
|
|
89
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scim.js","sourceRoot":"","sources":["../../src/commands/scim.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"scim.js","sourceRoot":"","sources":["../../src/commands/scim.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso.d.ts","sourceRoot":"","sources":["../../src/commands/sso.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,UAAU,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"sso.d.ts","sourceRoot":"","sources":["../../src/commands/sso.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,UAAU,IAAI,OAAO,CAiFpC"}
|
package/dist/commands/sso.js
CHANGED
|
@@ -54,6 +54,25 @@ export function ssoCommand() {
|
|
|
54
54
|
}
|
|
55
55
|
console.log(authorizeUrl);
|
|
56
56
|
});
|
|
57
|
+
cmd
|
|
58
|
+
.command('callback')
|
|
59
|
+
.description('Handle an SSO callback (exchange code + state for user info)')
|
|
60
|
+
.requiredOption('--code <code>', 'Authorization code from SSO provider')
|
|
61
|
+
.requiredOption('--state <state>', 'State parameter from SSO redirect')
|
|
62
|
+
.action(async (opts) => {
|
|
63
|
+
const client = await requireClient();
|
|
64
|
+
const res = await client.sso.handleCallback(opts.code, opts.state);
|
|
65
|
+
if (isJsonMode()) {
|
|
66
|
+
console.log(JSON.stringify(res, null, 2));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
printRecord({
|
|
70
|
+
email: res.email ?? '—',
|
|
71
|
+
name: res.name ?? '—',
|
|
72
|
+
sub: res.sub ?? '—',
|
|
73
|
+
developerId: res.developerId,
|
|
74
|
+
});
|
|
75
|
+
});
|
|
57
76
|
return cmd;
|
|
58
77
|
}
|
|
59
78
|
//# sourceMappingURL=sso.js.map
|
package/dist/commands/sso.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso.js","sourceRoot":"","sources":["../../src/commands/sso.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAElE,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAEvE,GAAG;SACA,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QAC5C,WAAW,CACT;YACE,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;SACvC,EACD,EAAE,GAAG,MAAM,EAAE,CACd,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,oCAAoC,CAAC;SACjD,cAAc,CAAC,oBAAoB,EAAE,iBAAiB,CAAC;SACvD,cAAc,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;SACpD,cAAc,CAAC,0BAA0B,EAAE,oBAAoB,CAAC;SAChE,cAAc,CAAC,sBAAsB,EAAE,uBAAuB,CAAC;SAC/D,MAAM,CAAC,KAAK,EAAE,IAAwF,EAAE,EAAE;QACzG,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;YAC5B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,2BAA2B,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,6BAA6B,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;QAC5B,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC3D,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
1
|
+
{"version":3,"file":"sso.js","sourceRoot":"","sources":["../../src/commands/sso.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/commands/vault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,YAAY,IAAI,OAAO,CAmItC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { requireClient } from '../client.js';
|
|
4
|
+
import { printTable, printRecord, shortDate, isJsonMode } from '../format.js';
|
|
5
|
+
export function vaultCommand() {
|
|
6
|
+
const cmd = new Command('vault').description('Manage encrypted credential storage');
|
|
7
|
+
cmd
|
|
8
|
+
.command('list')
|
|
9
|
+
.description('List stored credentials')
|
|
10
|
+
.option('--principal <principalId>', 'Filter by principal ID')
|
|
11
|
+
.option('--service <service>', 'Filter by service name')
|
|
12
|
+
.action(async (opts) => {
|
|
13
|
+
const client = await requireClient();
|
|
14
|
+
const res = await client.vault.list({
|
|
15
|
+
...(opts.principal !== undefined ? { principalId: opts.principal } : {}),
|
|
16
|
+
...(opts.service !== undefined ? { service: opts.service } : {}),
|
|
17
|
+
});
|
|
18
|
+
printTable(res.credentials.map((c) => ({
|
|
19
|
+
ID: c.id,
|
|
20
|
+
PRINCIPAL: c.principalId,
|
|
21
|
+
SERVICE: c.service,
|
|
22
|
+
TYPE: c.credentialType,
|
|
23
|
+
EXPIRES: c.tokenExpiresAt ? shortDate(c.tokenExpiresAt) : '—',
|
|
24
|
+
CREATED: shortDate(c.createdAt),
|
|
25
|
+
})), ['ID', 'PRINCIPAL', 'SERVICE', 'TYPE', 'EXPIRES', 'CREATED'], res.credentials.map((c) => ({ ...c })));
|
|
26
|
+
});
|
|
27
|
+
cmd
|
|
28
|
+
.command('get <credentialId>')
|
|
29
|
+
.description('Get a stored credential by ID')
|
|
30
|
+
.action(async (credentialId) => {
|
|
31
|
+
const client = await requireClient();
|
|
32
|
+
const cred = await client.vault.get(credentialId);
|
|
33
|
+
if (isJsonMode()) {
|
|
34
|
+
console.log(JSON.stringify(cred, null, 2));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
printRecord({
|
|
38
|
+
id: cred.id,
|
|
39
|
+
principalId: cred.principalId,
|
|
40
|
+
service: cred.service,
|
|
41
|
+
credentialType: cred.credentialType,
|
|
42
|
+
tokenExpiresAt: cred.tokenExpiresAt ? shortDate(cred.tokenExpiresAt) : '—',
|
|
43
|
+
createdAt: shortDate(cred.createdAt),
|
|
44
|
+
updatedAt: shortDate(cred.updatedAt),
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
cmd
|
|
48
|
+
.command('store')
|
|
49
|
+
.description('Store a credential in the vault')
|
|
50
|
+
.requiredOption('--principal-id <principalId>', 'Principal who owns this credential')
|
|
51
|
+
.requiredOption('--service <service>', 'Service name (e.g. google, slack)')
|
|
52
|
+
.requiredOption('--access-token <token>', 'OAuth access token')
|
|
53
|
+
.option('--refresh-token <token>', 'OAuth refresh token')
|
|
54
|
+
.option('--credential-type <type>', 'Credential type (default: oauth2)')
|
|
55
|
+
.option('--token-expires-at <iso>', 'Token expiration (ISO date)')
|
|
56
|
+
.option('--metadata <json>', 'JSON metadata object')
|
|
57
|
+
.action(async (opts) => {
|
|
58
|
+
const client = await requireClient();
|
|
59
|
+
let metadata;
|
|
60
|
+
if (opts.metadata !== undefined) {
|
|
61
|
+
try {
|
|
62
|
+
metadata = JSON.parse(opts.metadata);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
console.error('Error: --metadata must be valid JSON.');
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const res = await client.vault.store({
|
|
70
|
+
principalId: opts.principalId,
|
|
71
|
+
service: opts.service,
|
|
72
|
+
accessToken: opts.accessToken,
|
|
73
|
+
...(opts.refreshToken !== undefined ? { refreshToken: opts.refreshToken } : {}),
|
|
74
|
+
...(opts.credentialType !== undefined ? { credentialType: opts.credentialType } : {}),
|
|
75
|
+
...(opts.tokenExpiresAt !== undefined ? { tokenExpiresAt: opts.tokenExpiresAt } : {}),
|
|
76
|
+
...(metadata !== undefined ? { metadata } : {}),
|
|
77
|
+
});
|
|
78
|
+
if (isJsonMode()) {
|
|
79
|
+
console.log(JSON.stringify(res, null, 2));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
console.log(chalk.green('✓') + ` Credential stored: ${res.id}`);
|
|
83
|
+
});
|
|
84
|
+
cmd
|
|
85
|
+
.command('delete <credentialId>')
|
|
86
|
+
.description('Delete a stored credential')
|
|
87
|
+
.action(async (credentialId) => {
|
|
88
|
+
const client = await requireClient();
|
|
89
|
+
await client.vault.delete(credentialId);
|
|
90
|
+
if (isJsonMode()) {
|
|
91
|
+
console.log(JSON.stringify({ deleted: credentialId }));
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
console.log(chalk.green('✓') + ` Credential ${credentialId} deleted.`);
|
|
95
|
+
});
|
|
96
|
+
cmd
|
|
97
|
+
.command('exchange')
|
|
98
|
+
.description('Exchange a grant token for a stored service credential')
|
|
99
|
+
.requiredOption('--grant-token <jwt>', 'Grant token (JWT)')
|
|
100
|
+
.requiredOption('--service <service>', 'Service name to exchange for')
|
|
101
|
+
.action(async (opts) => {
|
|
102
|
+
const client = await requireClient();
|
|
103
|
+
const res = await client.vault.exchange(opts.grantToken, { service: opts.service });
|
|
104
|
+
if (isJsonMode()) {
|
|
105
|
+
console.log(JSON.stringify(res, null, 2));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
printRecord({
|
|
109
|
+
service: res.service,
|
|
110
|
+
credentialType: res.credentialType,
|
|
111
|
+
accessToken: res.accessToken.slice(0, 20) + '...',
|
|
112
|
+
tokenExpiresAt: res.tokenExpiresAt ?? '—',
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
return cmd;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/commands/vault.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webauthn.d.ts","sourceRoot":"","sources":["../../src/commands/webauthn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,eAAe,IAAI,OAAO,CAmFzC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { requireClient } from '../client.js';
|
|
4
|
+
import { printTable, shortDate, isJsonMode } from '../format.js';
|
|
5
|
+
export function webauthnCommand() {
|
|
6
|
+
const cmd = new Command('webauthn').description('Manage FIDO2/WebAuthn credentials');
|
|
7
|
+
cmd
|
|
8
|
+
.command('register-options')
|
|
9
|
+
.description('Generate a WebAuthn registration challenge')
|
|
10
|
+
.requiredOption('--principal-id <principalId>', 'Principal to register for')
|
|
11
|
+
.action(async (opts) => {
|
|
12
|
+
const client = await requireClient();
|
|
13
|
+
const res = await client.webauthn.registerOptions({ principalId: opts.principalId });
|
|
14
|
+
if (isJsonMode()) {
|
|
15
|
+
console.log(JSON.stringify(res, null, 2));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
console.log(chalk.green('✓') + ` Registration challenge created: ${res.challengeId}`);
|
|
19
|
+
console.log('\nPass the publicKey options to your WebAuthn client:');
|
|
20
|
+
console.log(JSON.stringify(res.publicKey, null, 2));
|
|
21
|
+
});
|
|
22
|
+
cmd
|
|
23
|
+
.command('register-verify')
|
|
24
|
+
.description('Verify a WebAuthn registration response')
|
|
25
|
+
.requiredOption('--challenge-id <id>', 'Challenge ID from register-options')
|
|
26
|
+
.requiredOption('--response <json>', 'JSON attestation response from browser')
|
|
27
|
+
.option('--device-name <name>', 'Human-readable device name')
|
|
28
|
+
.action(async (opts) => {
|
|
29
|
+
const client = await requireClient();
|
|
30
|
+
let response;
|
|
31
|
+
try {
|
|
32
|
+
response = JSON.parse(opts.response);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
console.error('Error: --response must be valid JSON.');
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
const res = await client.webauthn.registerVerify({
|
|
39
|
+
challengeId: opts.challengeId,
|
|
40
|
+
response,
|
|
41
|
+
...(opts.deviceName !== undefined ? { deviceName: opts.deviceName } : {}),
|
|
42
|
+
});
|
|
43
|
+
if (isJsonMode()) {
|
|
44
|
+
console.log(JSON.stringify(res, null, 2));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
console.log(chalk.green('✓') + ` Credential registered: ${res.id}`);
|
|
48
|
+
});
|
|
49
|
+
cmd
|
|
50
|
+
.command('list <principalId>')
|
|
51
|
+
.description('List WebAuthn credentials for a principal')
|
|
52
|
+
.action(async (principalId) => {
|
|
53
|
+
const client = await requireClient();
|
|
54
|
+
const res = await client.webauthn.listCredentials(principalId);
|
|
55
|
+
printTable(res.credentials.map((c) => ({
|
|
56
|
+
ID: c.id,
|
|
57
|
+
DEVICE: c.deviceName ?? '—',
|
|
58
|
+
BACKED_UP: c.backedUp ? 'yes' : 'no',
|
|
59
|
+
TRANSPORTS: c.transports.join(', '),
|
|
60
|
+
CREATED: shortDate(c.createdAt),
|
|
61
|
+
LAST_USED: c.lastUsedAt ? shortDate(c.lastUsedAt) : '—',
|
|
62
|
+
})), ['ID', 'DEVICE', 'BACKED_UP', 'TRANSPORTS', 'CREATED', 'LAST_USED'], res.credentials.map((c) => ({ ...c })));
|
|
63
|
+
});
|
|
64
|
+
cmd
|
|
65
|
+
.command('delete <credentialId>')
|
|
66
|
+
.description('Delete a WebAuthn credential')
|
|
67
|
+
.action(async (credentialId) => {
|
|
68
|
+
const client = await requireClient();
|
|
69
|
+
await client.webauthn.deleteCredential(credentialId);
|
|
70
|
+
if (isJsonMode()) {
|
|
71
|
+
console.log(JSON.stringify({ deleted: credentialId }));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
console.log(chalk.green('✓') + ` Credential ${credentialId} deleted.`);
|
|
75
|
+
});
|
|
76
|
+
return cmd;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=webauthn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webauthn.js","sourceRoot":"","sources":["../../src/commands/webauthn.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -9,22 +9,26 @@ import { billingCommand } from './commands/billing.js';
|
|
|
9
9
|
import { budgetsCommand } from './commands/budgets.js';
|
|
10
10
|
import { complianceCommand } from './commands/compliance.js';
|
|
11
11
|
import { configCommand } from './commands/config.js';
|
|
12
|
+
import { credentialsCommand } from './commands/credentials.js';
|
|
12
13
|
import { domainsCommand } from './commands/domains.js';
|
|
13
14
|
import { eventsCommand } from './commands/events.js';
|
|
14
15
|
import { grantsCommand } from './commands/grants.js';
|
|
15
16
|
import { meCommand } from './commands/me.js';
|
|
17
|
+
import { passportsCommand } from './commands/passports.js';
|
|
16
18
|
import { policiesCommand } from './commands/policies.js';
|
|
17
19
|
import { principalSessionsCommand } from './commands/principal-sessions.js';
|
|
18
20
|
import { scimCommand } from './commands/scim.js';
|
|
19
21
|
import { ssoCommand } from './commands/sso.js';
|
|
20
22
|
import { tokensCommand } from './commands/tokens.js';
|
|
21
23
|
import { usageCommand } from './commands/usage.js';
|
|
24
|
+
import { vaultCommand } from './commands/vault.js';
|
|
25
|
+
import { webauthnCommand } from './commands/webauthn.js';
|
|
22
26
|
import { webhooksCommand } from './commands/webhooks.js';
|
|
23
27
|
const program = new Command();
|
|
24
28
|
program
|
|
25
29
|
.name('grantex')
|
|
26
30
|
.description('CLI for the Grantex delegated authorization protocol')
|
|
27
|
-
.version('0.1.
|
|
31
|
+
.version('0.1.7')
|
|
28
32
|
.option('--json', 'Output results as JSON (machine-readable)')
|
|
29
33
|
.hook('preAction', () => {
|
|
30
34
|
if (program.opts().json) {
|
|
@@ -45,6 +49,10 @@ program.addCommand(usageCommand());
|
|
|
45
49
|
program.addCommand(domainsCommand());
|
|
46
50
|
program.addCommand(eventsCommand());
|
|
47
51
|
program.addCommand(principalSessionsCommand());
|
|
52
|
+
program.addCommand(credentialsCommand());
|
|
53
|
+
program.addCommand(passportsCommand());
|
|
54
|
+
program.addCommand(vaultCommand());
|
|
55
|
+
program.addCommand(webauthnCommand());
|
|
48
56
|
program.addCommand(complianceCommand());
|
|
49
57
|
program.addCommand(anomaliesCommand());
|
|
50
58
|
program.addCommand(billingCommand());
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,sDAAsD,CAAC;KACnE,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,QAAQ,EAAE,2CAA2C,CAAC;KAC7D,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;IACtB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QACxB,WAAW,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,wBAAwB,EAAE,CAAC,CAAC;AAC/C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;AACxC,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;AAEjC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|