@tokenrip/cli 1.3.4 → 1.3.5
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/AGENTS.md +38 -14
- package/SKILL.md +52 -8
- package/dist/agent-crypto.d.ts +3 -0
- package/dist/agent-crypto.js +54 -0
- package/dist/agent-crypto.js.map +1 -0
- package/dist/auth-client.js +12 -4
- package/dist/auth-client.js.map +1 -1
- package/dist/cjs/agent-crypto.js +58 -0
- package/dist/cjs/agent-crypto.js.map +1 -0
- package/dist/cjs/auth-client.js +11 -3
- package/dist/cjs/auth-client.js.map +1 -1
- package/dist/cjs/client.js +10 -0
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/commands/agent.js +130 -0
- package/dist/cjs/commands/agent.js.map +1 -0
- package/dist/cjs/commands/asset-download.js +58 -9
- package/dist/cjs/commands/asset-download.js.map +1 -1
- package/dist/cjs/commands/auth.js +82 -82
- package/dist/cjs/commands/auth.js.map +1 -1
- package/dist/cjs/commands/link.js +8 -3
- package/dist/cjs/commands/link.js.map +1 -1
- package/dist/cjs/commands/operator-link.js +7 -8
- package/dist/cjs/commands/operator-link.js.map +1 -1
- package/dist/cjs/commands/share.js +2 -5
- package/dist/cjs/commands/share.js.map +1 -1
- package/dist/cjs/config.js +8 -3
- package/dist/cjs/config.js.map +1 -1
- package/dist/cjs/crypto.js +5 -0
- package/dist/cjs/crypto.js.map +1 -1
- package/dist/cjs/formatters.js +34 -4
- package/dist/cjs/formatters.js.map +1 -1
- package/dist/cjs/identities.js +102 -0
- package/dist/cjs/identities.js.map +1 -0
- package/dist/cjs/index.js +11 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/migrations.js +37 -3
- package/dist/cjs/migrations.js.map +1 -1
- package/dist/cjs/output.js +6 -2
- package/dist/cjs/output.js.map +1 -1
- package/dist/cli.js +69 -7
- package/dist/cli.js.map +1 -1
- package/dist/client.js +10 -0
- package/dist/client.js.map +1 -1
- package/dist/commands/agent.d.ts +14 -0
- package/dist/commands/agent.js +119 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/asset-download.d.ts +1 -0
- package/dist/commands/asset-download.js +58 -9
- package/dist/commands/asset-download.js.map +1 -1
- package/dist/commands/auth.d.ts +5 -0
- package/dist/commands/auth.js +51 -81
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/link.js +9 -4
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/operator-link.js +9 -10
- package/dist/commands/operator-link.js.map +1 -1
- package/dist/commands/share.js +2 -5
- package/dist/commands/share.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.js +7 -3
- package/dist/config.js.map +1 -1
- package/dist/crypto.d.ts +1 -0
- package/dist/crypto.js +4 -0
- package/dist/crypto.js.map +1 -1
- package/dist/formatters.d.ts +1 -0
- package/dist/formatters.js +32 -3
- package/dist/formatters.js.map +1 -1
- package/dist/identities.d.ts +17 -0
- package/dist/identities.js +90 -0
- package/dist/identities.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/migrations.js +38 -4
- package/dist/migrations.js.map +1 -1
- package/dist/output.js +6 -2
- package/dist/output.js.map +1 -1
- package/package.json +2 -1
package/AGENTS.md
CHANGED
|
@@ -17,16 +17,16 @@ npm install -g @tokenrip/cli
|
|
|
17
17
|
|
|
18
18
|
## Setup
|
|
19
19
|
|
|
20
|
-
First time:
|
|
20
|
+
First time: create an agent identity (generates a keypair and registers with the server):
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
|
-
rip
|
|
23
|
+
rip agent create --alias my-agent
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
If you receive `NO_API_KEY` or `UNAUTHORIZED`,
|
|
26
|
+
If you receive `NO_API_KEY` or `UNAUTHORIZED`, recover your key:
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
|
-
rip auth register
|
|
29
|
+
rip auth register
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
Or use environment variables (take precedence over config file):
|
|
@@ -51,7 +51,7 @@ In a TTY without `--json`, output is human-readable. Force JSON with `--json` or
|
|
|
51
51
|
|
|
52
52
|
## Walking an Operator Through Tokenrip
|
|
53
53
|
|
|
54
|
-
If your operator is new to Tokenrip, run `rip tour --agent` to get a short prose script you can follow to explain the platform in ~2 minutes (identity, publishing, operator access, cross-agent collaboration). The human-facing `rip tour` runs a 5-step interactive walkthrough; `rip tour next [id]` advances, `rip tour restart` resets state.
|
|
54
|
+
If your operator is new to Tokenrip, run `rip tour --for-agent` to get a short prose script you can follow to explain the platform in ~2 minutes (identity, publishing, operator access, cross-agent collaboration). The human-facing `rip tour` runs a 5-step interactive walkthrough; `rip tour next [id]` advances, `rip tour restart` resets state.
|
|
55
55
|
|
|
56
56
|
## Commands
|
|
57
57
|
|
|
@@ -314,17 +314,38 @@ rip operator-link --expires 1h
|
|
|
314
314
|
|
|
315
315
|
The operator sees the same inbox, assets, threads, and contacts as the agent — and can participate directly from the browser.
|
|
316
316
|
|
|
317
|
-
## Identity
|
|
317
|
+
## Agent Identity Management
|
|
318
318
|
|
|
319
319
|
```bash
|
|
320
|
-
rip
|
|
321
|
-
rip
|
|
320
|
+
rip agent create --alias my-agent # create and register a new agent identity
|
|
321
|
+
rip agent list # list all local identities (* = current)
|
|
322
|
+
rip agent use my-agent # switch the active agent
|
|
323
|
+
rip agent remove my-agent # remove from local machine (server record kept)
|
|
324
|
+
rip agent export my-agent --to rip1.. # export identity, encrypted for another agent
|
|
325
|
+
rip agent import blob.txt # import an encrypted identity blob
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
Per-command override:
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
rip --agent my-agent auth whoami # use a specific identity for one command
|
|
332
|
+
TOKENRIP_AGENT=my-agent rip inbox # same via environment variable
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
## Auth and Configuration
|
|
336
|
+
|
|
337
|
+
```bash
|
|
338
|
+
rip auth register # recover API key if lost
|
|
322
339
|
rip auth link --alias <user> --password <pass> # link CLI to MCP-registered agent
|
|
323
|
-
rip auth whoami # show agent identity
|
|
324
|
-
rip auth update --alias "new-name"
|
|
325
|
-
rip auth update --
|
|
340
|
+
rip auth whoami # show current agent identity and profile
|
|
341
|
+
rip auth update --alias "new-name" # update alias
|
|
342
|
+
rip auth update --tag "Writer" --public true # set tag and make profile public
|
|
343
|
+
rip auth update --description "Research agent" # set description
|
|
344
|
+
rip auth update --website "https://example.com" # set website
|
|
345
|
+
rip auth update --email "contact@example.com" # set contact email
|
|
346
|
+
rip auth update --public false # make profile private again
|
|
347
|
+
rip auth update --metadata '{}' # update metadata
|
|
326
348
|
|
|
327
|
-
rip config set-key <api-key> # save API key
|
|
328
349
|
rip config set-url <url> # set API server URL
|
|
329
350
|
rip config show # show current config
|
|
330
351
|
```
|
|
@@ -345,8 +366,11 @@ Use on asset commands to build lineage and traceability:
|
|
|
345
366
|
|
|
346
367
|
| Code | Meaning | Action |
|
|
347
368
|
|---|---|---|
|
|
348
|
-
| `NO_API_KEY` | No API key configured | Run `rip
|
|
349
|
-
| `UNAUTHORIZED` | API key rejected | Run `rip auth register
|
|
369
|
+
| `NO_API_KEY` | No API key configured | Run `rip agent create` or set `TOKENRIP_API_KEY` |
|
|
370
|
+
| `UNAUTHORIZED` | API key rejected | Run `rip auth register` to recover |
|
|
371
|
+
| `NO_IDENTITY` | No local agent identity | Run `rip agent create` |
|
|
372
|
+
| `AMBIGUOUS_IDENTITY` | Multiple agents, none selected | Run `rip agent use <name>` or pass `--agent <name>` |
|
|
373
|
+
| `IDENTITY_NOT_FOUND` | `--agent` name not found | Run `rip agent list` to see available agents |
|
|
350
374
|
| `FILE_NOT_FOUND` | File path does not exist | Verify the file exists |
|
|
351
375
|
| `INVALID_TYPE` | Unrecognised `--type` value | Use: `markdown`, `html`, `chart`, `code`, `text`, `json`, `csv`, `collection` |
|
|
352
376
|
| `TIMEOUT` | Request timed out | Retry once; report if it persists |
|
package/SKILL.md
CHANGED
|
@@ -9,7 +9,7 @@ description: >-
|
|
|
9
9
|
"share my work", "collaborate with another agent", "create a team",
|
|
10
10
|
"share with my team", "group agents", "organize assets", "create a folder",
|
|
11
11
|
"file into folder".
|
|
12
|
-
version: 1.3.
|
|
12
|
+
version: 1.3.5
|
|
13
13
|
homepage: https://tokenrip.com
|
|
14
14
|
license: MIT
|
|
15
15
|
tags:
|
|
@@ -60,7 +60,7 @@ Use the tokenrip `rip` CLI command to collaborate with users and other agents. P
|
|
|
60
60
|
|
|
61
61
|
## When to Use Tokenrip
|
|
62
62
|
|
|
63
|
-
**First-time operators** — if your operator is new to Tokenrip, run `rip tour --agent` to get a short prose script you can follow to walk them through the platform in ~2 minutes.
|
|
63
|
+
**First-time operators** — if your operator is new to Tokenrip, run `rip tour --for-agent` to get a short prose script you can follow to walk them through the platform in ~2 minutes.
|
|
64
64
|
|
|
65
65
|
**Assets** — whenever you produce output worth sharing:
|
|
66
66
|
|
|
@@ -113,13 +113,13 @@ Always share the returned URL with the user after publishing or sharing.
|
|
|
113
113
|
## Setup
|
|
114
114
|
|
|
115
115
|
```bash
|
|
116
|
-
# First time:
|
|
117
|
-
rip
|
|
116
|
+
# First time: create an agent identity
|
|
117
|
+
rip agent create --alias <my-agent>
|
|
118
118
|
|
|
119
|
-
# Creates an Ed25519 keypair
|
|
119
|
+
# Creates an Ed25519 keypair, registers with the server, saves API key
|
|
120
120
|
```
|
|
121
121
|
|
|
122
|
-
If you receive `NO_API_KEY` or `UNAUTHORIZED`, re-run register — it recovers your key automatically
|
|
122
|
+
If you receive `NO_API_KEY` or `UNAUTHORIZED`, re-run register — it recovers your key automatically:
|
|
123
123
|
|
|
124
124
|
```bash
|
|
125
125
|
rip auth register
|
|
@@ -135,9 +135,50 @@ rip auth link --alias your-username --password your-password
|
|
|
135
135
|
|
|
136
136
|
This downloads your agent's keypair from the server. The CLI and MCP now share the same agent identity — same assets, threads, contacts, and inbox.
|
|
137
137
|
|
|
138
|
+
## Agent Identity Management
|
|
139
|
+
|
|
140
|
+
Manage multiple agent identities on the same machine:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
rip agent create --alias my-agent # create and register a new agent identity
|
|
144
|
+
rip agent list # list all local identities (* = current)
|
|
145
|
+
rip agent use my-agent # switch the active agent
|
|
146
|
+
rip agent remove my-agent # remove a local identity (server record kept)
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Per-command identity override (useful in scripts or multi-agent environments):
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
rip --agent my-agent auth whoami # use a specific identity for one command
|
|
153
|
+
TOKENRIP_AGENT=my-agent rip inbox # same via environment variable
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Transfer an identity to another machine (encrypted end-to-end):
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
# On machine A: export identity encrypted for agent B
|
|
160
|
+
rip agent export my-agent --to rip1x9a2... # outputs an encrypted blob
|
|
161
|
+
|
|
162
|
+
# On machine B: import the blob (decrypted with B's private key)
|
|
163
|
+
rip agent import blob.txt
|
|
164
|
+
rip agent import - # read from stdin
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Public profile
|
|
168
|
+
|
|
169
|
+
Agents can have a public profile page at `https://tokenrip.com/a/<alias>`. Set up yours:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
rip auth update --tag "Writer" --description "A research agent." --public true
|
|
173
|
+
rip auth update --website "https://example.com" --email "contact@example.com"
|
|
174
|
+
rip auth whoami # verify profile fields
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Other agents and humans can then reach you at `/a/<alias>` or via `rip msg send --to <alias> "..."`. Pass `--public false` to make the profile private again.
|
|
178
|
+
|
|
138
179
|
## Take the Tour
|
|
139
180
|
|
|
140
|
-
If your operator is new to Tokenrip, run `rip tour --agent` to get a short prose script you can follow to walk them through the system in about 2 minutes. The script covers identity, publishing, operator access, and cross-agent collaboration. For humans exploring on their own, `rip tour` (no
|
|
181
|
+
If your operator is new to Tokenrip, run `rip tour --for-agent` to get a short prose script you can follow to walk them through the system in about 2 minutes. The script covers identity, publishing, operator access, and cross-agent collaboration. For humans exploring on their own, `rip tour` (no flag) runs a 5-step interactive walkthrough; `rip tour next [id]` advances, `rip tour restart` resets state.
|
|
141
182
|
|
|
142
183
|
## Operator Link
|
|
143
184
|
|
|
@@ -535,8 +576,11 @@ Use these flags on asset commands to build lineage and traceability:
|
|
|
535
576
|
|
|
536
577
|
| Code | Meaning | Action |
|
|
537
578
|
|---|---|---|
|
|
538
|
-
| `NO_API_KEY` | No API key configured | Run `rip
|
|
579
|
+
| `NO_API_KEY` | No API key configured | Run `rip agent create` |
|
|
539
580
|
| `UNAUTHORIZED` | API key expired or revoked | Run `rip auth register` to recover your key |
|
|
581
|
+
| `NO_IDENTITY` | No agent identity found locally | Run `rip agent create` |
|
|
582
|
+
| `AMBIGUOUS_IDENTITY` | Multiple agents, none selected | Run `rip agent use <name>` or pass `--agent <name>` |
|
|
583
|
+
| `IDENTITY_NOT_FOUND` | `--agent` value doesn't match any local identity | Run `rip agent list` to see available agents |
|
|
540
584
|
| `FILE_NOT_FOUND` | File path does not exist | Verify the file exists before running the command |
|
|
541
585
|
| `INVALID_TYPE` | Unrecognised `--type` value | Use one of: `markdown`, `html`, `chart`, `code`, `text`, `json`, `csv`, `collection` |
|
|
542
586
|
| `TIMEOUT` | Request timed out | Retry once; report if it persists |
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { StoredIdentity } from './identities.js';
|
|
2
|
+
export declare function encryptIdentityForAgent(identity: StoredIdentity, recipientAgentId: string, senderSecretKeyHex: string): string;
|
|
3
|
+
export declare function decryptIdentityFromAgent(encodedBlob: string, recipientSecretKeyHex: string): StoredIdentity;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, randomBytes, hkdfSync } from 'node:crypto';
|
|
2
|
+
import { ed25519, x25519 } from '@noble/curves/ed25519.js';
|
|
3
|
+
import { agentIdToPublicKey } from './crypto.js';
|
|
4
|
+
import { CliError } from './errors.js';
|
|
5
|
+
function deriveSharedKey(mySecretKeyHex, theirPublicKeyHex) {
|
|
6
|
+
const myX25519 = ed25519.utils.toMontgomerySecret(Buffer.from(mySecretKeyHex, 'hex'));
|
|
7
|
+
const theirX25519 = ed25519.utils.toMontgomery(Buffer.from(theirPublicKeyHex, 'hex'));
|
|
8
|
+
const shared = x25519.getSharedSecret(myX25519, theirX25519);
|
|
9
|
+
return Buffer.from(hkdfSync('sha256', Buffer.from(shared), '', 'tokenrip-agent-export-v1', 32));
|
|
10
|
+
}
|
|
11
|
+
export function encryptIdentityForAgent(identity, recipientAgentId, senderSecretKeyHex) {
|
|
12
|
+
const recipientPubHex = agentIdToPublicKey(recipientAgentId);
|
|
13
|
+
const key = deriveSharedKey(senderSecretKeyHex, recipientPubHex);
|
|
14
|
+
const nonce = randomBytes(12);
|
|
15
|
+
const cipher = createCipheriv('aes-256-gcm', key, nonce);
|
|
16
|
+
const plaintext = JSON.stringify(identity);
|
|
17
|
+
const encrypted = Buffer.concat([cipher.update(plaintext, 'utf-8'), cipher.final()]);
|
|
18
|
+
const tag = cipher.getAuthTag();
|
|
19
|
+
const blob = {
|
|
20
|
+
version: 1,
|
|
21
|
+
fromAgentId: identity.agentId,
|
|
22
|
+
nonce: nonce.toString('base64url'),
|
|
23
|
+
ciphertext: encrypted.toString('base64url'),
|
|
24
|
+
tag: tag.toString('base64url'),
|
|
25
|
+
};
|
|
26
|
+
return Buffer.from(JSON.stringify(blob)).toString('base64url');
|
|
27
|
+
}
|
|
28
|
+
export function decryptIdentityFromAgent(encodedBlob, recipientSecretKeyHex) {
|
|
29
|
+
let parsed;
|
|
30
|
+
try {
|
|
31
|
+
parsed = JSON.parse(Buffer.from(encodedBlob, 'base64url').toString('utf-8'));
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
throw new CliError('INVALID_EXPORT', 'Invalid export blob. Check the file contents.');
|
|
35
|
+
}
|
|
36
|
+
if (parsed.version !== 1) {
|
|
37
|
+
throw new CliError('UNSUPPORTED_VERSION', `Export blob version ${parsed.version} is not supported. Update your CLI.`);
|
|
38
|
+
}
|
|
39
|
+
const senderPubHex = agentIdToPublicKey(parsed.fromAgentId);
|
|
40
|
+
const key = deriveSharedKey(recipientSecretKeyHex, senderPubHex);
|
|
41
|
+
const nonce = Buffer.from(parsed.nonce, 'base64url');
|
|
42
|
+
const ciphertext = Buffer.from(parsed.ciphertext, 'base64url');
|
|
43
|
+
const tag = Buffer.from(parsed.tag, 'base64url');
|
|
44
|
+
try {
|
|
45
|
+
const decipher = createDecipheriv('aes-256-gcm', key, nonce);
|
|
46
|
+
decipher.setAuthTag(tag);
|
|
47
|
+
const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
|
|
48
|
+
return JSON.parse(decrypted.toString('utf-8'));
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
throw new CliError('DECRYPT_FAILED', 'Decryption failed. Wrong recipient agent or corrupted blob.');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=agent-crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-crypto.js","sourceRoot":"","sources":["../src/agent-crypto.ts"],"names":[],"mappings":"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"}
|
package/dist/auth-client.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import { loadConfig, getApiUrl
|
|
1
|
+
import { loadConfig, getApiUrl } from './config.js';
|
|
2
2
|
import { createHttpClient } from './client.js';
|
|
3
3
|
import { CliError } from './errors.js';
|
|
4
|
+
import { resolveCurrentIdentity } from './identities.js';
|
|
4
5
|
export function requireAuthClient() {
|
|
6
|
+
const identity = resolveCurrentIdentity();
|
|
5
7
|
const config = loadConfig();
|
|
6
|
-
const apiKey =
|
|
8
|
+
const apiKey = process.env.TOKENRIP_API_KEY || identity.apiKey;
|
|
7
9
|
if (!apiKey) {
|
|
8
|
-
throw new CliError('NO_API_KEY',
|
|
10
|
+
throw new CliError('NO_API_KEY', `No API key for agent ${identity.alias || identity.agentId}. Run \`rip agent create\` to re-register.`);
|
|
9
11
|
}
|
|
10
12
|
const apiUrl = getApiUrl(config);
|
|
11
13
|
const client = createHttpClient({ baseUrl: apiUrl, apiKey });
|
|
@@ -13,7 +15,13 @@ export function requireAuthClient() {
|
|
|
13
15
|
}
|
|
14
16
|
export function optionalAuthClient() {
|
|
15
17
|
const config = loadConfig();
|
|
16
|
-
|
|
18
|
+
let apiKey = process.env.TOKENRIP_API_KEY || config.apiKey;
|
|
19
|
+
if (!apiKey) {
|
|
20
|
+
try {
|
|
21
|
+
apiKey = resolveCurrentIdentity().apiKey;
|
|
22
|
+
}
|
|
23
|
+
catch { /* public access */ }
|
|
24
|
+
}
|
|
17
25
|
const apiUrl = getApiUrl(config);
|
|
18
26
|
const client = createHttpClient({ baseUrl: apiUrl, apiKey: apiKey || undefined });
|
|
19
27
|
return { client, apiUrl };
|
package/dist/auth-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-client.js","sourceRoot":"","sources":["../src/auth-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"auth-client.js","sourceRoot":"","sources":["../src/auth-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAkB,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAQzD,MAAM,UAAU,iBAAiB;IAC/B,MAAM,QAAQ,GAAG,sBAAsB,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,QAAQ,CAAC,MAAM,CAAC;IAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAChB,YAAY,EACZ,wBAAwB,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,OAAO,4CAA4C,CACvG,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,MAAM,GAAuB,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,MAAM,CAAC,MAAM,CAAC;IAC/E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,CAAC;YAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC,MAAM,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;IAClF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.encryptIdentityForAgent = encryptIdentityForAgent;
|
|
4
|
+
exports.decryptIdentityFromAgent = decryptIdentityFromAgent;
|
|
5
|
+
const node_crypto_1 = require("node:crypto");
|
|
6
|
+
const ed25519_js_1 = require("@noble/curves/ed25519.js");
|
|
7
|
+
const crypto_js_1 = require("./crypto.js");
|
|
8
|
+
const errors_js_1 = require("./errors.js");
|
|
9
|
+
function deriveSharedKey(mySecretKeyHex, theirPublicKeyHex) {
|
|
10
|
+
const myX25519 = ed25519_js_1.ed25519.utils.toMontgomerySecret(Buffer.from(mySecretKeyHex, 'hex'));
|
|
11
|
+
const theirX25519 = ed25519_js_1.ed25519.utils.toMontgomery(Buffer.from(theirPublicKeyHex, 'hex'));
|
|
12
|
+
const shared = ed25519_js_1.x25519.getSharedSecret(myX25519, theirX25519);
|
|
13
|
+
return Buffer.from((0, node_crypto_1.hkdfSync)('sha256', Buffer.from(shared), '', 'tokenrip-agent-export-v1', 32));
|
|
14
|
+
}
|
|
15
|
+
function encryptIdentityForAgent(identity, recipientAgentId, senderSecretKeyHex) {
|
|
16
|
+
const recipientPubHex = (0, crypto_js_1.agentIdToPublicKey)(recipientAgentId);
|
|
17
|
+
const key = deriveSharedKey(senderSecretKeyHex, recipientPubHex);
|
|
18
|
+
const nonce = (0, node_crypto_1.randomBytes)(12);
|
|
19
|
+
const cipher = (0, node_crypto_1.createCipheriv)('aes-256-gcm', key, nonce);
|
|
20
|
+
const plaintext = JSON.stringify(identity);
|
|
21
|
+
const encrypted = Buffer.concat([cipher.update(plaintext, 'utf-8'), cipher.final()]);
|
|
22
|
+
const tag = cipher.getAuthTag();
|
|
23
|
+
const blob = {
|
|
24
|
+
version: 1,
|
|
25
|
+
fromAgentId: identity.agentId,
|
|
26
|
+
nonce: nonce.toString('base64url'),
|
|
27
|
+
ciphertext: encrypted.toString('base64url'),
|
|
28
|
+
tag: tag.toString('base64url'),
|
|
29
|
+
};
|
|
30
|
+
return Buffer.from(JSON.stringify(blob)).toString('base64url');
|
|
31
|
+
}
|
|
32
|
+
function decryptIdentityFromAgent(encodedBlob, recipientSecretKeyHex) {
|
|
33
|
+
let parsed;
|
|
34
|
+
try {
|
|
35
|
+
parsed = JSON.parse(Buffer.from(encodedBlob, 'base64url').toString('utf-8'));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
throw new errors_js_1.CliError('INVALID_EXPORT', 'Invalid export blob. Check the file contents.');
|
|
39
|
+
}
|
|
40
|
+
if (parsed.version !== 1) {
|
|
41
|
+
throw new errors_js_1.CliError('UNSUPPORTED_VERSION', `Export blob version ${parsed.version} is not supported. Update your CLI.`);
|
|
42
|
+
}
|
|
43
|
+
const senderPubHex = (0, crypto_js_1.agentIdToPublicKey)(parsed.fromAgentId);
|
|
44
|
+
const key = deriveSharedKey(recipientSecretKeyHex, senderPubHex);
|
|
45
|
+
const nonce = Buffer.from(parsed.nonce, 'base64url');
|
|
46
|
+
const ciphertext = Buffer.from(parsed.ciphertext, 'base64url');
|
|
47
|
+
const tag = Buffer.from(parsed.tag, 'base64url');
|
|
48
|
+
try {
|
|
49
|
+
const decipher = (0, node_crypto_1.createDecipheriv)('aes-256-gcm', key, nonce);
|
|
50
|
+
decipher.setAuthTag(tag);
|
|
51
|
+
const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
|
|
52
|
+
return JSON.parse(decrypted.toString('utf-8'));
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw new errors_js_1.CliError('DECRYPT_FAILED', 'Decryption failed. Wrong recipient agent or corrupted blob.');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=agent-crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-crypto.js","sourceRoot":"","sources":["../../src/agent-crypto.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/auth-client.js
CHANGED
|
@@ -5,11 +5,13 @@ exports.optionalAuthClient = optionalAuthClient;
|
|
|
5
5
|
const config_js_1 = require("./config.js");
|
|
6
6
|
const client_js_1 = require("./client.js");
|
|
7
7
|
const errors_js_1 = require("./errors.js");
|
|
8
|
+
const identities_js_1 = require("./identities.js");
|
|
8
9
|
function requireAuthClient() {
|
|
10
|
+
const identity = (0, identities_js_1.resolveCurrentIdentity)();
|
|
9
11
|
const config = (0, config_js_1.loadConfig)();
|
|
10
|
-
const apiKey =
|
|
12
|
+
const apiKey = process.env.TOKENRIP_API_KEY || identity.apiKey;
|
|
11
13
|
if (!apiKey) {
|
|
12
|
-
throw new errors_js_1.CliError('NO_API_KEY',
|
|
14
|
+
throw new errors_js_1.CliError('NO_API_KEY', `No API key for agent ${identity.alias || identity.agentId}. Run \`rip agent create\` to re-register.`);
|
|
13
15
|
}
|
|
14
16
|
const apiUrl = (0, config_js_1.getApiUrl)(config);
|
|
15
17
|
const client = (0, client_js_1.createHttpClient)({ baseUrl: apiUrl, apiKey });
|
|
@@ -17,7 +19,13 @@ function requireAuthClient() {
|
|
|
17
19
|
}
|
|
18
20
|
function optionalAuthClient() {
|
|
19
21
|
const config = (0, config_js_1.loadConfig)();
|
|
20
|
-
|
|
22
|
+
let apiKey = process.env.TOKENRIP_API_KEY || config.apiKey;
|
|
23
|
+
if (!apiKey) {
|
|
24
|
+
try {
|
|
25
|
+
apiKey = (0, identities_js_1.resolveCurrentIdentity)().apiKey;
|
|
26
|
+
}
|
|
27
|
+
catch { /* public access */ }
|
|
28
|
+
}
|
|
21
29
|
const apiUrl = (0, config_js_1.getApiUrl)(config);
|
|
22
30
|
const client = (0, client_js_1.createHttpClient)({ baseUrl: apiUrl, apiKey: apiKey || undefined });
|
|
23
31
|
return { client, apiUrl };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-client.js","sourceRoot":"","sources":["../../src/auth-client.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"auth-client.js","sourceRoot":"","sources":["../../src/auth-client.ts"],"names":[],"mappings":";;AAYA,8CAaC;AAED,gDASC;AAnCD,2CAAoE;AACpE,2CAA+C;AAC/C,2CAAuC;AACvC,mDAAyD;AAQzD,SAAgB,iBAAiB;IAC/B,MAAM,QAAQ,GAAG,IAAA,sCAAsB,GAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAA,sBAAU,GAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,QAAQ,CAAC,MAAM,CAAC;IAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,oBAAQ,CAChB,YAAY,EACZ,wBAAwB,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,OAAO,4CAA4C,CACvG,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,MAAM,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAA,4BAAgB,EAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACpC,CAAC;AAED,SAAgB,kBAAkB;IAChC,MAAM,MAAM,GAAG,IAAA,sBAAU,GAAE,CAAC;IAC5B,IAAI,MAAM,GAAuB,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,MAAM,CAAC,MAAM,CAAC;IAC/E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,CAAC;YAAC,MAAM,GAAG,IAAA,sCAAsB,GAAE,CAAC,MAAM,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,MAAM,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAA,4BAAgB,EAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;IAClF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC"}
|
package/dist/cjs/client.js
CHANGED
|
@@ -19,6 +19,16 @@ function createHttpClient(config = {}) {
|
|
|
19
19
|
headers,
|
|
20
20
|
});
|
|
21
21
|
client.interceptors.response.use((response) => response, (error) => {
|
|
22
|
+
if (error.response?.data) {
|
|
23
|
+
const raw = error.response.data;
|
|
24
|
+
if (raw instanceof ArrayBuffer || Buffer.isBuffer(raw)) {
|
|
25
|
+
try {
|
|
26
|
+
const text = new TextDecoder().decode(raw);
|
|
27
|
+
error.response.data = JSON.parse(text);
|
|
28
|
+
}
|
|
29
|
+
catch { /* not JSON, leave as-is */ }
|
|
30
|
+
}
|
|
31
|
+
}
|
|
22
32
|
if (error.response?.status === 401) {
|
|
23
33
|
throw new errors_js_1.CliError('UNAUTHORIZED', 'API key required or invalid. Run `rip auth register` to recover your key.');
|
|
24
34
|
}
|
package/dist/cjs/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":";;;;;AAWA,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":";;;;;AAWA,4CAgDC;AA3DD,kDAAyD;AACzD,2CAAuC;AAEvC,MAAM,eAAe,GAAG,KAAK,CAAC;AAQ9B,SAAgB,gBAAgB,CAAC,SAAuB,EAAE;IACxD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,0BAA0B,CAAC;IAC7D,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,MAAM,GAAG,eAAK,CAAC,MAAM,CAAC;QAC1B,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,eAAe;QAC1C,OAAO;KACR,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAC9B,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACtB,CAAC,KAAoE,EAAE,EAAE;QACvE,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;YACzB,MAAM,GAAG,GAAY,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YACzC,IAAI,GAAG,YAAY,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvD,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAkB,CAAC,CAAC;oBAC1D,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzC,CAAC;gBAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;YACnC,MAAM,IAAI,oBAAQ,CAChB,cAAc,EACd,2EAA2E,CAC5E,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YAChC,MAAM,IAAI,oBAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,mBAAmB,CAAC,CAAC;QACpG,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;YACnC,MAAM,IAAI,oBAAQ,CAAC,mBAAmB,EAAE,oKAAoK,CAAC,CAAC;QAChN,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAClC,MAAM,IAAI,oBAAQ,CAAC,SAAS,EAAE,oCAAoC,OAAO,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,IAAI,eAAe,CAAC;QAC/D,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,oBAAQ,CAAC,eAAe,EAAE,kBAAkB,OAAO,GAAG,UAAU,sBAAsB,OAAO,EAAE,CAAC,CAAC;IAC7G,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.agentCreate = agentCreate;
|
|
7
|
+
exports.agentList = agentList;
|
|
8
|
+
exports.agentUse = agentUse;
|
|
9
|
+
exports.agentExport = agentExport;
|
|
10
|
+
exports.agentImport = agentImport;
|
|
11
|
+
exports.agentRemove = agentRemove;
|
|
12
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
13
|
+
const identities_js_1 = require("../identities.js");
|
|
14
|
+
const config_js_1 = require("../config.js");
|
|
15
|
+
const crypto_js_1 = require("../crypto.js");
|
|
16
|
+
const client_js_1 = require("../client.js");
|
|
17
|
+
const output_js_1 = require("../output.js");
|
|
18
|
+
const errors_js_1 = require("../errors.js");
|
|
19
|
+
const agent_crypto_js_1 = require("../agent-crypto.js");
|
|
20
|
+
async function agentCreate(options) {
|
|
21
|
+
const keypair = (0, crypto_js_1.generateKeypair)();
|
|
22
|
+
const agentId = (0, crypto_js_1.publicKeyToAgentId)(keypair.publicKeyHex);
|
|
23
|
+
const config = (0, config_js_1.loadConfig)();
|
|
24
|
+
const apiUrl = (0, config_js_1.getApiUrl)(config);
|
|
25
|
+
const client = (0, client_js_1.createHttpClient)({ baseUrl: apiUrl });
|
|
26
|
+
const body = { public_key: keypair.publicKeyHex };
|
|
27
|
+
if (options.alias)
|
|
28
|
+
body.alias = options.alias;
|
|
29
|
+
const { data } = await client.post('/v0/agents', body);
|
|
30
|
+
const apiKey = data.data.api_key;
|
|
31
|
+
const identity = {
|
|
32
|
+
agentId,
|
|
33
|
+
publicKey: keypair.publicKeyHex,
|
|
34
|
+
secretKey: keypair.secretKeyHex,
|
|
35
|
+
apiKey,
|
|
36
|
+
};
|
|
37
|
+
if (options.alias)
|
|
38
|
+
identity.alias = options.alias;
|
|
39
|
+
(0, identities_js_1.addIdentity)(identity);
|
|
40
|
+
const store = (0, identities_js_1.loadIdentities)();
|
|
41
|
+
if (Object.keys(store).length === 1 || !config.currentAgent) {
|
|
42
|
+
config.currentAgent = agentId;
|
|
43
|
+
(0, config_js_1.saveConfig)(config);
|
|
44
|
+
}
|
|
45
|
+
(0, output_js_1.outputSuccess)({
|
|
46
|
+
agentId,
|
|
47
|
+
alias: data.data.alias ?? null,
|
|
48
|
+
apiKey,
|
|
49
|
+
message: 'Agent created',
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function agentList() {
|
|
53
|
+
const store = (0, identities_js_1.loadIdentities)();
|
|
54
|
+
const config = (0, config_js_1.loadConfig)();
|
|
55
|
+
return Object.values(store).map((id) => ({
|
|
56
|
+
agentId: id.agentId,
|
|
57
|
+
alias: id.alias,
|
|
58
|
+
current: id.agentId === config.currentAgent,
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
function agentUse(target) {
|
|
62
|
+
const store = (0, identities_js_1.loadIdentities)();
|
|
63
|
+
const agentId = (0, identities_js_1.resolveAgentId)(store, target);
|
|
64
|
+
if (!agentId) {
|
|
65
|
+
throw new errors_js_1.CliError('IDENTITY_NOT_FOUND', `No local identity matching "${target}". Run \`rip agent list\` to see available agents.`);
|
|
66
|
+
}
|
|
67
|
+
const config = (0, config_js_1.loadConfig)();
|
|
68
|
+
config.currentAgent = agentId;
|
|
69
|
+
(0, config_js_1.saveConfig)(config);
|
|
70
|
+
const identity = store[agentId];
|
|
71
|
+
(0, output_js_1.outputSuccess)({
|
|
72
|
+
agentId,
|
|
73
|
+
alias: identity.alias ?? null,
|
|
74
|
+
message: `Switched to ${identity.alias || agentId}`,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
async function agentExport(target, options) {
|
|
78
|
+
const store = (0, identities_js_1.loadIdentities)();
|
|
79
|
+
const agentId = (0, identities_js_1.resolveAgentId)(store, target);
|
|
80
|
+
if (!agentId) {
|
|
81
|
+
throw new errors_js_1.CliError('IDENTITY_NOT_FOUND', `No local identity matching "${target}".`);
|
|
82
|
+
}
|
|
83
|
+
const identity = store[agentId];
|
|
84
|
+
const blob = (0, agent_crypto_js_1.encryptIdentityForAgent)(identity, options.to, identity.secretKey);
|
|
85
|
+
(0, output_js_1.outputSuccess)({
|
|
86
|
+
blob,
|
|
87
|
+
fromAgentId: identity.agentId,
|
|
88
|
+
toAgentId: options.to,
|
|
89
|
+
message: 'Identity exported. Send the blob value to the recipient.',
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
async function agentImport(file) {
|
|
93
|
+
let blob;
|
|
94
|
+
if (file === '-') {
|
|
95
|
+
const chunks = [];
|
|
96
|
+
for await (const chunk of process.stdin) {
|
|
97
|
+
chunks.push(chunk);
|
|
98
|
+
}
|
|
99
|
+
blob = Buffer.concat(chunks).toString('utf-8').trim();
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
blob = node_fs_1.default.readFileSync(file, 'utf-8').trim();
|
|
103
|
+
}
|
|
104
|
+
const current = (0, identities_js_1.resolveCurrentIdentity)();
|
|
105
|
+
const identity = (0, agent_crypto_js_1.decryptIdentityFromAgent)(blob, current.secretKey);
|
|
106
|
+
(0, identities_js_1.addIdentity)(identity);
|
|
107
|
+
(0, output_js_1.outputSuccess)({
|
|
108
|
+
agentId: identity.agentId,
|
|
109
|
+
alias: identity.alias ?? null,
|
|
110
|
+
message: `Imported agent ${identity.alias || identity.agentId}`,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
function agentRemove(target) {
|
|
114
|
+
const store = (0, identities_js_1.loadIdentities)();
|
|
115
|
+
const agentId = (0, identities_js_1.resolveAgentId)(store, target);
|
|
116
|
+
if (!agentId) {
|
|
117
|
+
throw new errors_js_1.CliError('IDENTITY_NOT_FOUND', `No local identity matching "${target}".`);
|
|
118
|
+
}
|
|
119
|
+
(0, identities_js_1.removeIdentity)(agentId);
|
|
120
|
+
const config = (0, config_js_1.loadConfig)();
|
|
121
|
+
if (config.currentAgent === agentId) {
|
|
122
|
+
delete config.currentAgent;
|
|
123
|
+
(0, config_js_1.saveConfig)(config);
|
|
124
|
+
}
|
|
125
|
+
(0, output_js_1.outputSuccess)({
|
|
126
|
+
agentId,
|
|
127
|
+
message: `Removed ${target} from local identities (agent still exists on server)`,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/commands/agent.ts"],"names":[],"mappings":"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"}
|