@getstackrun/cli 0.4.2 → 0.6.0
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 +56 -16
- package/dist/agent.d.ts +6 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +229 -0
- package/dist/agent.js.map +1 -0
- package/dist/auth.d.ts +11 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +283 -0
- package/dist/auth.js.map +1 -0
- package/dist/index.js +46 -11
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,41 +1,65 @@
|
|
|
1
1
|
# @getstackrun/cli
|
|
2
2
|
|
|
3
|
-
Tail STACK runtime activity in your terminal.
|
|
3
|
+
Tail STACK runtime activity in your terminal. Sign in via OAuth Device flow.
|
|
4
4
|
|
|
5
5
|
```sh
|
|
6
|
-
#
|
|
7
|
-
npx @getstackrun/cli
|
|
6
|
+
# Sign in (browser opens, RFC 8628 Device flow)
|
|
7
|
+
npx @getstackrun/cli auth login
|
|
8
8
|
|
|
9
|
-
#
|
|
10
|
-
|
|
9
|
+
# Tail your audit_log — no env vars needed after auth login
|
|
10
|
+
npx @getstackrun/cli monitor --follow
|
|
11
|
+
|
|
12
|
+
# Replay a real-shape demo (no auth needed)
|
|
13
|
+
npx @getstackrun/cli monitor --demo --loop
|
|
11
14
|
```
|
|
12
15
|
|
|
13
|
-
Both modes render rows of the same shape — straight from `audit_log` columns
|
|
14
|
-
on STACK's API. What you see in `--demo` is the same shape `--follow`
|
|
15
|
-
|
|
16
|
+
Both monitor modes render rows of the same shape — straight from `audit_log` columns
|
|
17
|
+
on STACK's API. What you see in `--demo` is the same shape `--follow` produces against
|
|
18
|
+
your own data.
|
|
16
19
|
|
|
17
20
|
## Commands
|
|
18
21
|
|
|
22
|
+
### `auth`
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
auth login Sign in via the browser (Device flow, RFC 8628).
|
|
26
|
+
Stores a refresh token at ~/.stack/credentials.json
|
|
27
|
+
with mode 0600. SDKs read it automatically.
|
|
28
|
+
auth status Show the current sign-in state (operator email, scope, expiry).
|
|
29
|
+
auth logout Revoke the refresh token and clear the local file.
|
|
30
|
+
```
|
|
31
|
+
|
|
19
32
|
### `monitor`
|
|
20
33
|
|
|
21
34
|
```
|
|
22
35
|
--demo Replay a real-shape mission (no auth needed).
|
|
23
36
|
Same row format as --follow, just scripted.
|
|
24
|
-
--follow Tail your operator's actual audit_log.
|
|
25
|
-
|
|
37
|
+
--follow Tail your operator's actual audit_log. Polls
|
|
38
|
+
every 2s. Auth picked in priority order:
|
|
39
|
+
1. STACK_API_KEY env var (legacy CI path)
|
|
40
|
+
2. ~/.stack/credentials.json (auth login)
|
|
26
41
|
--loop Loop the demo until Ctrl-C (default is one run).
|
|
27
42
|
--agent <agent_id> (--follow) Only show entries for this agent.
|
|
28
43
|
--jti <passport_jti> (--follow) Only show entries for this passport.
|
|
44
|
+
--sandbox (--follow) Tail the public sandbox feed at
|
|
45
|
+
https://api.getstack.run/v1/public/events.
|
|
46
|
+
No auth needed.
|
|
29
47
|
```
|
|
30
48
|
|
|
31
49
|
#### Examples
|
|
32
50
|
|
|
33
51
|
```sh
|
|
34
52
|
# Tail one agent
|
|
35
|
-
|
|
53
|
+
npx @getstackrun/cli monitor --follow --agent agt_abc123
|
|
36
54
|
|
|
37
|
-
# Tail one passport (e.g.
|
|
38
|
-
|
|
55
|
+
# Tail one passport (e.g. debugging a specific revoke chain)
|
|
56
|
+
npx @getstackrun/cli monitor --follow --jti pas_xyz789
|
|
57
|
+
|
|
58
|
+
# Tail the public sandbox (no signup, no key)
|
|
59
|
+
npx @getstackrun/cli monitor --follow --sandbox
|
|
60
|
+
|
|
61
|
+
# CI mode (no browser)
|
|
62
|
+
STACK_API_KEY=sk_live_… npx @getstackrun/cli monitor --follow
|
|
39
63
|
```
|
|
40
64
|
|
|
41
65
|
### `register`
|
|
@@ -46,10 +70,26 @@ npx @getstackrun/cli register
|
|
|
46
70
|
|
|
47
71
|
Prints signup + MCP-install instructions for connecting STACK to Claude Code.
|
|
48
72
|
|
|
49
|
-
##
|
|
73
|
+
## Authentication
|
|
74
|
+
|
|
75
|
+
`auth login` runs the OAuth 2.1 Device Authorization Grant against
|
|
76
|
+
`https://api.getstack.run`:
|
|
77
|
+
|
|
78
|
+
1. CLI dynamically registers itself as a public PKCE client (one client_id per install).
|
|
79
|
+
2. Server issues a `device_code` + a human-readable `user_code` (e.g. `WDJB-MJHT`).
|
|
80
|
+
3. CLI prints the URL + opens your browser to `https://getstack.run/cli/auth?code=...`.
|
|
81
|
+
4. You confirm the code and approve.
|
|
82
|
+
5. CLI persists the refresh token to `~/.stack/credentials.json` (mode 0600).
|
|
83
|
+
|
|
84
|
+
Refresh tokens auto-rotate on every use. The same file is also read by both SDKs
|
|
85
|
+
(`@getstackrun/sdk` for TS/JS, `getstack` for Python), so signing in once gives all
|
|
86
|
+
three surfaces a working credential.
|
|
87
|
+
|
|
88
|
+
For CI environments without a browser: keep `STACK_API_KEY=sk_live_...` —
|
|
89
|
+
the CLI still accepts it as a fallback.
|
|
50
90
|
|
|
51
|
-
|
|
52
|
-
|
|
91
|
+
See [/docs/security/stack-auth](https://getstack.run/docs/security/stack-auth) for
|
|
92
|
+
the full auth model.
|
|
53
93
|
|
|
54
94
|
## License
|
|
55
95
|
|
package/dist/agent.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function cmdAgentEnroll(nameOrId: string, opts: {
|
|
2
|
+
force?: boolean;
|
|
3
|
+
}): Promise<void>;
|
|
4
|
+
export declare function cmdAgentRotate(nameOrId: string): Promise<void>;
|
|
5
|
+
export declare function cmdAgent(args: string[]): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AA0MA,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C/F;AAKD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;AAGD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB5D"}
|
package/dist/agent.js
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
// `stack agent enroll <name|id>` and `stack agent rotate <name|id>`.
|
|
2
|
+
//
|
|
3
|
+
// Pre-enrolls an agent from the CLI so an operator doesn't have to write
|
|
4
|
+
// SDK code first. Closes the arturo-shaped activation hole: register an
|
|
5
|
+
// agent in the dashboard, then enroll its keypair with one CLI command,
|
|
6
|
+
// then any subsequent SDK call (Python or TS) finds the existing
|
|
7
|
+
// ~/.stack/agents/<id>.json and skips re-enrollment.
|
|
8
|
+
//
|
|
9
|
+
// Silent path only — uses the operator's OAuth bearer (from
|
|
10
|
+
// `stack auth login`) or STACK_API_KEY. No browser bootstrap; the human
|
|
11
|
+
// has already authenticated to run this CLI.
|
|
12
|
+
//
|
|
13
|
+
// Same wire contract as packages/sdk/src/agent-auth.ts and
|
|
14
|
+
// sdk-python/src/getstack/agent_auth.py:
|
|
15
|
+
// POST /v1/agents/:id/enrollment-challenge → { challenge_id, challenge }
|
|
16
|
+
// sign challenge bytes with locally-generated Ed25519 privkey
|
|
17
|
+
// POST /v1/agents/:id/enroll [?force=true]
|
|
18
|
+
// body { public_key (JWK), challenge_id, signed_challenge }
|
|
19
|
+
// persist { agent_id, publicKey, privateKey, enrolled_at } to
|
|
20
|
+
// ~/.stack/agents/<id>.json (mode 0600)
|
|
21
|
+
import { env, stdout, stderr } from 'node:process';
|
|
22
|
+
import { generateKeyPairSync, sign as cryptoSign } from 'node:crypto';
|
|
23
|
+
import { writeFile, mkdir, chmod, readFile } from 'node:fs/promises';
|
|
24
|
+
import { existsSync } from 'node:fs';
|
|
25
|
+
import { join } from 'node:path';
|
|
26
|
+
import { homedir } from 'node:os';
|
|
27
|
+
import { getAccessToken } from './auth.js';
|
|
28
|
+
const API_URL = env['STACK_API_URL'] ?? 'https://api.getstack.run';
|
|
29
|
+
function keyPath(agentId) {
|
|
30
|
+
return join(homedir(), '.stack', 'agents', `${agentId}.json`);
|
|
31
|
+
}
|
|
32
|
+
async function bearer() {
|
|
33
|
+
const token = await getAccessToken();
|
|
34
|
+
if (token)
|
|
35
|
+
return token;
|
|
36
|
+
stderr.write('error: not signed in.\n' +
|
|
37
|
+
'Run `stack-cli auth login` first, or set STACK_API_KEY.\n');
|
|
38
|
+
process.exit(2);
|
|
39
|
+
}
|
|
40
|
+
// Resolve a name OR id to an agent row. Names without the agt_ prefix
|
|
41
|
+
// are looked up via /v1/agents (operator-scoped). IDs starting with
|
|
42
|
+
// agt_ are fetched directly via /v1/agents/:id to give a clean 404 if
|
|
43
|
+
// the operator doesn't own it.
|
|
44
|
+
async function resolveAgent(nameOrId, token) {
|
|
45
|
+
if (nameOrId.startsWith('agt_')) {
|
|
46
|
+
const res = await fetch(`${API_URL}/v1/agents/${encodeURIComponent(nameOrId)}`, {
|
|
47
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
48
|
+
});
|
|
49
|
+
if (res.status === 404) {
|
|
50
|
+
stderr.write(`error: no agent with id "${nameOrId}" in your operator.\n`);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
if (!res.ok) {
|
|
54
|
+
const body = await res.text();
|
|
55
|
+
stderr.write(`error: failed to fetch agent (${res.status}): ${body.slice(0, 200)}\n`);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
return (await res.json());
|
|
59
|
+
}
|
|
60
|
+
const listRes = await fetch(`${API_URL}/v1/agents`, {
|
|
61
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
62
|
+
});
|
|
63
|
+
if (!listRes.ok) {
|
|
64
|
+
const body = await listRes.text();
|
|
65
|
+
stderr.write(`error: failed to list agents (${listRes.status}): ${body.slice(0, 200)}\n`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
const agents = (await listRes.json());
|
|
69
|
+
const match = agents.find((a) => a.name === nameOrId);
|
|
70
|
+
if (!match) {
|
|
71
|
+
stderr.write(`error: no agent named "${nameOrId}" in your operator.\n` +
|
|
72
|
+
`Register it first at https://getstack.run/agents.\n`);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
return match;
|
|
76
|
+
}
|
|
77
|
+
// Convert a Node `crypto` Ed25519 public key to a {kty, crv, x} JWK.
|
|
78
|
+
// jwkExport on the public key gives the right shape directly.
|
|
79
|
+
function publicJwkFromKey(publicKey) {
|
|
80
|
+
const jwk = publicKey.export({ format: 'jwk' });
|
|
81
|
+
if (jwk.kty !== 'OKP' || jwk.crv !== 'Ed25519' || !jwk.x) {
|
|
82
|
+
throw new Error('keypair export did not yield an Ed25519 OKP JWK');
|
|
83
|
+
}
|
|
84
|
+
return { kty: jwk.kty, crv: jwk.crv, x: jwk.x };
|
|
85
|
+
}
|
|
86
|
+
function privateJwkFromKey(privateKey) {
|
|
87
|
+
const jwk = privateKey.export({ format: 'jwk' });
|
|
88
|
+
if (jwk.kty !== 'OKP' || jwk.crv !== 'Ed25519' || !jwk.x || !jwk.d) {
|
|
89
|
+
throw new Error('keypair export did not yield a private Ed25519 OKP JWK');
|
|
90
|
+
}
|
|
91
|
+
return { kty: jwk.kty, crv: jwk.crv, x: jwk.x, d: jwk.d };
|
|
92
|
+
}
|
|
93
|
+
// Persist with mode 0600. Best-effort chmod on Windows.
|
|
94
|
+
async function persist(stored) {
|
|
95
|
+
const path = keyPath(stored.agent_id);
|
|
96
|
+
await mkdir(join(homedir(), '.stack', 'agents'), { recursive: true });
|
|
97
|
+
await writeFile(path, JSON.stringify(stored, null, 2), 'utf8');
|
|
98
|
+
try {
|
|
99
|
+
await chmod(path, 0o600);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
/* Windows / unsupported FS */
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function runEnroll(agentId, token, force) {
|
|
106
|
+
// Step 1: challenge.
|
|
107
|
+
const cRes = await fetch(`${API_URL}/v1/agents/${encodeURIComponent(agentId)}/enrollment-challenge`, {
|
|
108
|
+
method: 'POST',
|
|
109
|
+
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
|
|
110
|
+
});
|
|
111
|
+
if (!cRes.ok) {
|
|
112
|
+
const errBody = (await cRes.json().catch(() => ({})));
|
|
113
|
+
throw new Error(`enrollment-challenge failed (${cRes.status}): ${errBody.error?.message ?? cRes.statusText}`);
|
|
114
|
+
}
|
|
115
|
+
const { challenge_id, challenge } = (await cRes.json());
|
|
116
|
+
// Step 2: generate keypair locally.
|
|
117
|
+
const { publicKey, privateKey } = generateKeyPairSync('ed25519');
|
|
118
|
+
const publicJwk = publicJwkFromKey(publicKey);
|
|
119
|
+
const privateJwk = privateJwkFromKey(privateKey);
|
|
120
|
+
// Step 3: sign challenge. Node Ed25519 sign uses `sign(null, ...)`.
|
|
121
|
+
const signature = cryptoSign(null, Buffer.from(challenge, 'utf8'), privateKey);
|
|
122
|
+
const signed_challenge = signature.toString('base64url');
|
|
123
|
+
// Step 4: POST /enroll (with ?force=true on rotation).
|
|
124
|
+
const url = `${API_URL}/v1/agents/${encodeURIComponent(agentId)}/enroll${force ? '?force=true' : ''}`;
|
|
125
|
+
const eRes = await fetch(url, {
|
|
126
|
+
method: 'POST',
|
|
127
|
+
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
|
|
128
|
+
body: JSON.stringify({ public_key: publicJwk, challenge_id, signed_challenge }),
|
|
129
|
+
});
|
|
130
|
+
if (!eRes.ok) {
|
|
131
|
+
const errBody = (await eRes.json().catch(() => ({})));
|
|
132
|
+
const msg = errBody.error?.message ?? eRes.statusText;
|
|
133
|
+
if (eRes.status === 409) {
|
|
134
|
+
throw new Error(`agent already enrolled. Use \`stack-cli agent rotate ${agentId}\` (or pass --force) to rotate the keypair. ` +
|
|
135
|
+
`Rotation requires operator-admin authority.`);
|
|
136
|
+
}
|
|
137
|
+
throw new Error(`enroll failed (${eRes.status}): ${msg}`);
|
|
138
|
+
}
|
|
139
|
+
const enrolled = (await eRes.json());
|
|
140
|
+
const stored = {
|
|
141
|
+
agent_id: agentId,
|
|
142
|
+
publicKey: publicJwk,
|
|
143
|
+
privateKey: privateJwk,
|
|
144
|
+
enrolled_at: enrolled.enrolled_at
|
|
145
|
+
? Math.floor(new Date(enrolled.enrolled_at).getTime() / 1000)
|
|
146
|
+
: Math.floor(Date.now() / 1000),
|
|
147
|
+
};
|
|
148
|
+
await persist(stored);
|
|
149
|
+
return stored;
|
|
150
|
+
}
|
|
151
|
+
// Public entry: `stack-cli agent enroll <name|id> [--force]`.
|
|
152
|
+
//
|
|
153
|
+
// First-time enrollment: any auth (operator key, member, OAuth, session)
|
|
154
|
+
// that's not member-readonly.
|
|
155
|
+
// Rotation (when already enrolled OR --force passed): operator-admin
|
|
156
|
+
// authority required by the API; the CLI surfaces the 409/403 cleanly.
|
|
157
|
+
export async function cmdAgentEnroll(nameOrId, opts) {
|
|
158
|
+
if (!nameOrId) {
|
|
159
|
+
stderr.write('error: agent name or id required.\n');
|
|
160
|
+
stderr.write('usage: stack-cli agent enroll <name|id> [--force]\n');
|
|
161
|
+
process.exit(2);
|
|
162
|
+
}
|
|
163
|
+
const token = await bearer();
|
|
164
|
+
const agent = await resolveAgent(nameOrId, token);
|
|
165
|
+
const force = opts.force === true;
|
|
166
|
+
// Local guard before hitting the network: if we already have a
|
|
167
|
+
// privkey on disk for this agent and the caller didn't pass --force,
|
|
168
|
+
// refuse without consuming an enrollment-challenge slot.
|
|
169
|
+
const path = keyPath(agent.id);
|
|
170
|
+
if (existsSync(path) && !force) {
|
|
171
|
+
const raw = await readFile(path, 'utf8').catch(() => '');
|
|
172
|
+
let enrolledAt = '';
|
|
173
|
+
try {
|
|
174
|
+
const parsed = JSON.parse(raw);
|
|
175
|
+
if (parsed.enrolled_at)
|
|
176
|
+
enrolledAt = ` (enrolled ${new Date(parsed.enrolled_at * 1000).toISOString()})`;
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
/* corrupt local file — fall through */
|
|
180
|
+
}
|
|
181
|
+
stderr.write(`error: ${agent.id} already has a local keypair at ${path}${enrolledAt}.\n` +
|
|
182
|
+
`Use \`stack-cli agent rotate ${nameOrId}\` (or pass --force) to replace it. ` +
|
|
183
|
+
`Rotation requires operator-admin authority on the API.\n`);
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
const stored = await runEnroll(agent.id, token, force);
|
|
188
|
+
stdout.write(`enrolled ${agent.name} (${agent.id})${force ? ' [rotated]' : ''}\n` +
|
|
189
|
+
` keypair saved to ${path}\n` +
|
|
190
|
+
` enrolled_at: ${new Date(stored.enrolled_at * 1000).toISOString()}\n` +
|
|
191
|
+
`\nThe Python and TS SDKs will pick up this keypair automatically. ` +
|
|
192
|
+
`Run any SDK call against agent_id=${agent.id} to mint the first passport.\n`);
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
stderr.write(`error: ${err.message}\n`);
|
|
196
|
+
process.exit(1);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// `stack-cli agent rotate <name|id>` — alias for `enroll --force`.
|
|
200
|
+
// Same auth requirements; the API enforces operator-admin on the
|
|
201
|
+
// rotation branch.
|
|
202
|
+
export async function cmdAgentRotate(nameOrId) {
|
|
203
|
+
await cmdAgentEnroll(nameOrId, { force: true });
|
|
204
|
+
}
|
|
205
|
+
// Subcommand dispatcher: called from main() with args = argv.slice(3).
|
|
206
|
+
export async function cmdAgent(args) {
|
|
207
|
+
const sub = args[0];
|
|
208
|
+
const target = args[1];
|
|
209
|
+
const force = args.includes('--force');
|
|
210
|
+
if (sub === 'enroll') {
|
|
211
|
+
if (!target) {
|
|
212
|
+
stderr.write('usage: stack-cli agent enroll <name|id> [--force]\n');
|
|
213
|
+
process.exit(2);
|
|
214
|
+
}
|
|
215
|
+
await cmdAgentEnroll(target, { force });
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
if (sub === 'rotate') {
|
|
219
|
+
if (!target) {
|
|
220
|
+
stderr.write('usage: stack-cli agent rotate <name|id>\n');
|
|
221
|
+
process.exit(2);
|
|
222
|
+
}
|
|
223
|
+
await cmdAgentRotate(target);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
stderr.write(`error: unknown agent subcommand "${sub ?? ''}". Use enroll | rotate.\n`);
|
|
227
|
+
process.exit(2);
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function cmdLogin(): Promise<void>;
|
|
2
|
+
export declare function cmdStatus(): Promise<void>;
|
|
3
|
+
export declare function cmdLogout(): Promise<void>;
|
|
4
|
+
/**
|
|
5
|
+
* Used by `monitor --follow` and any future authenticated command.
|
|
6
|
+
* Returns a fresh access token by exchanging the stored refresh token.
|
|
7
|
+
* Falls back to STACK_API_KEY env var for back-compat with existing
|
|
8
|
+
* users who haven't migrated. Returns null when no auth source exists.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getAccessToken(): Promise<string | null>;
|
|
11
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AA+IA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CA0E9C;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAkB/C;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAmB/C;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiC7D"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
// CLI auth — Device Authorization Grant (RFC 8628).
|
|
2
|
+
//
|
|
3
|
+
// stack-cli auth login → DCR-register a client (first run only), kick off
|
|
4
|
+
// the device flow, print user_code + URL, open the browser, poll the
|
|
5
|
+
// token endpoint, persist refresh_token to ~/.stack/credentials.json.
|
|
6
|
+
// stack-cli auth status → read credentials, exchange refresh → access,
|
|
7
|
+
// call /v1/operators/me, print operator + scope.
|
|
8
|
+
// stack-cli auth logout → revoke refresh, delete credentials file.
|
|
9
|
+
//
|
|
10
|
+
// No native deps. Refresh tokens live in a file with mode 0600. macOS
|
|
11
|
+
// Keychain / Windows Credential Manager / libsecret integration is a
|
|
12
|
+
// follow-up — Phase 3 closes the file-on-disk threat with passkey-rooted
|
|
13
|
+
// retrieval. Until then this matches the storage model of `aws cli`,
|
|
14
|
+
// `gcloud`, etc.
|
|
15
|
+
import { stdout, stderr, env, exit, platform } from 'node:process';
|
|
16
|
+
import { homedir } from 'node:os';
|
|
17
|
+
import { join } from 'node:path';
|
|
18
|
+
import { mkdir, writeFile, readFile, chmod, unlink } from 'node:fs/promises';
|
|
19
|
+
import { spawn } from 'node:child_process';
|
|
20
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
21
|
+
const API_URL = env['STACK_API_URL'] ?? 'https://api.getstack.run';
|
|
22
|
+
const RESOURCE = env['STACK_OAUTH_RESOURCE'] ?? `${API_URL}`;
|
|
23
|
+
const SCOPE = env['STACK_OAUTH_SCOPE'] ?? 'passports:read agents:read services:read audit:read';
|
|
24
|
+
const useColor = stdout.isTTY === true && !env['NO_COLOR'];
|
|
25
|
+
const color = (n) => (useColor ? `\x1b[${n}m` : '');
|
|
26
|
+
const C = {
|
|
27
|
+
reset: color('0'), bold: color('1'), dim: color('2'),
|
|
28
|
+
red: color('31'), green: color('32'), yellow: color('33'), cyan: color('36'), gray: color('90'), white: color('37'),
|
|
29
|
+
};
|
|
30
|
+
const CREDS_DIR = join(homedir(), '.stack');
|
|
31
|
+
const CREDS_PATH = join(CREDS_DIR, 'credentials.json');
|
|
32
|
+
async function readCreds() {
|
|
33
|
+
try {
|
|
34
|
+
const raw = await readFile(CREDS_PATH, 'utf8');
|
|
35
|
+
return JSON.parse(raw);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function writeCreds(creds) {
|
|
42
|
+
await mkdir(CREDS_DIR, { recursive: true });
|
|
43
|
+
await writeFile(CREDS_PATH, JSON.stringify(creds, null, 2), 'utf8');
|
|
44
|
+
// Restrict to owner — best-effort on Windows where chmod is a no-op,
|
|
45
|
+
// but the default ACL on %USERPROFILE%\.stack is already user-scoped.
|
|
46
|
+
try {
|
|
47
|
+
await chmod(CREDS_PATH, 0o600);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
/* Windows / unsupported FS — ignore */
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function deleteCreds() {
|
|
54
|
+
try {
|
|
55
|
+
await unlink(CREDS_PATH);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
/* already gone */
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function openBrowser(url) {
|
|
62
|
+
// Best-effort. Failure is silent — the URL is also printed.
|
|
63
|
+
try {
|
|
64
|
+
if (platform === 'darwin')
|
|
65
|
+
spawn('open', [url], { stdio: 'ignore', detached: true }).unref();
|
|
66
|
+
else if (platform === 'win32')
|
|
67
|
+
spawn('cmd', ['/c', 'start', '', url], { stdio: 'ignore', detached: true }).unref();
|
|
68
|
+
else
|
|
69
|
+
spawn('xdg-open', [url], { stdio: 'ignore', detached: true }).unref();
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
/* user opens manually */
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async function ensureClientId(creds) {
|
|
76
|
+
if (creds?.client_id)
|
|
77
|
+
return creds.client_id;
|
|
78
|
+
// Dynamic Client Registration (RFC 7591). Public PKCE client; one
|
|
79
|
+
// client_id per CLI install — better blast radius than a single
|
|
80
|
+
// shared client_id.
|
|
81
|
+
const res = await fetch(`${API_URL}/oauth/register`, {
|
|
82
|
+
method: 'POST',
|
|
83
|
+
headers: { 'Content-Type': 'application/json' },
|
|
84
|
+
body: JSON.stringify({
|
|
85
|
+
client_name: 'STACK CLI',
|
|
86
|
+
redirect_uris: ['http://127.0.0.1/callback'], // unused for device flow but required by spec
|
|
87
|
+
grant_types: ['urn:ietf:params:oauth:grant-type:device_code', 'refresh_token'],
|
|
88
|
+
software_id: 'getstack.cli',
|
|
89
|
+
scope: SCOPE,
|
|
90
|
+
}),
|
|
91
|
+
});
|
|
92
|
+
if (!res.ok) {
|
|
93
|
+
const data = await res.json().catch(() => ({}));
|
|
94
|
+
throw new Error(`client registration failed: ${data.error_description ?? data.error ?? res.statusText}`);
|
|
95
|
+
}
|
|
96
|
+
const data = (await res.json());
|
|
97
|
+
return data.client_id;
|
|
98
|
+
}
|
|
99
|
+
async function pollToken(deviceCode, clientId, intervalSeconds) {
|
|
100
|
+
let interval = intervalSeconds * 1000;
|
|
101
|
+
// Cap total wait at the device code TTL (15 min) — the API will return
|
|
102
|
+
// expired_token once it lapses, but bail explicitly so the CLI doesn't
|
|
103
|
+
// loop indefinitely if the API is unreachable.
|
|
104
|
+
const deadline = Date.now() + 15 * 60 * 1000;
|
|
105
|
+
while (Date.now() < deadline) {
|
|
106
|
+
await new Promise((r) => setTimeout(r, interval));
|
|
107
|
+
const res = await fetch(`${API_URL}/oauth/token`, {
|
|
108
|
+
method: 'POST',
|
|
109
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
110
|
+
body: new URLSearchParams({
|
|
111
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
|
|
112
|
+
device_code: deviceCode,
|
|
113
|
+
client_id: clientId,
|
|
114
|
+
}),
|
|
115
|
+
});
|
|
116
|
+
const data = (await res.json().catch(() => ({})));
|
|
117
|
+
if (res.ok && data.access_token && data.refresh_token) {
|
|
118
|
+
return { access_token: data.access_token, refresh_token: data.refresh_token, scope: data.scope ?? SCOPE };
|
|
119
|
+
}
|
|
120
|
+
if (data.error === 'authorization_pending')
|
|
121
|
+
continue;
|
|
122
|
+
if (data.error === 'slow_down') {
|
|
123
|
+
interval = Math.min(interval * 2, 60_000);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (data.error === 'access_denied')
|
|
127
|
+
throw new Error('user denied the request');
|
|
128
|
+
if (data.error === 'expired_token')
|
|
129
|
+
throw new Error('device code expired — run `stack-cli auth login` again');
|
|
130
|
+
if (data.error)
|
|
131
|
+
throw new Error(`token endpoint: ${data.error}`);
|
|
132
|
+
}
|
|
133
|
+
throw new Error('device code expired (CLI timeout)');
|
|
134
|
+
}
|
|
135
|
+
export async function cmdLogin() {
|
|
136
|
+
const existing = await readCreds();
|
|
137
|
+
const clientId = await ensureClientId(existing);
|
|
138
|
+
// Kick off the device flow.
|
|
139
|
+
const deviceRes = await fetch(`${API_URL}/oauth/device/authorize`, {
|
|
140
|
+
method: 'POST',
|
|
141
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
142
|
+
body: new URLSearchParams({ client_id: clientId, scope: SCOPE, resource: RESOURCE }),
|
|
143
|
+
});
|
|
144
|
+
if (!deviceRes.ok) {
|
|
145
|
+
const data = (await deviceRes.json().catch(() => ({})));
|
|
146
|
+
stderr.write(`${C.red}error:${C.reset} ${data.error_description ?? data.error ?? `HTTP ${deviceRes.status}`}\n`);
|
|
147
|
+
exit(1);
|
|
148
|
+
}
|
|
149
|
+
const device = (await deviceRes.json());
|
|
150
|
+
stdout.write(`
|
|
151
|
+
${C.bold}STACK CLI sign-in${C.reset}
|
|
152
|
+
${C.gray}─────────────────${C.reset}
|
|
153
|
+
|
|
154
|
+
${C.dim}1.${C.reset} Open this URL in your browser:
|
|
155
|
+
${C.cyan}${device.verification_uri_complete}${C.reset}
|
|
156
|
+
|
|
157
|
+
${C.dim}2.${C.reset} Confirm this code matches what your browser shows:
|
|
158
|
+
${C.bold}${C.green}${device.user_code}${C.reset}
|
|
159
|
+
|
|
160
|
+
${C.gray}Waiting for approval...${C.reset}
|
|
161
|
+
|
|
162
|
+
`);
|
|
163
|
+
openBrowser(device.verification_uri_complete);
|
|
164
|
+
let tokens;
|
|
165
|
+
try {
|
|
166
|
+
tokens = await pollToken(device.device_code, clientId, device.interval);
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
stderr.write(`${C.red}error:${C.reset} ${err.message}\n`);
|
|
170
|
+
exit(1);
|
|
171
|
+
}
|
|
172
|
+
// Fetch operator email for friendly status display. Best-effort.
|
|
173
|
+
let operatorEmail;
|
|
174
|
+
try {
|
|
175
|
+
const meRes = await fetch(`${API_URL}/v1/operators/me`, {
|
|
176
|
+
headers: { Authorization: `Bearer ${tokens.access_token}` },
|
|
177
|
+
});
|
|
178
|
+
if (meRes.ok) {
|
|
179
|
+
const me = (await meRes.json());
|
|
180
|
+
operatorEmail = me.email;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
/* non-fatal */
|
|
185
|
+
}
|
|
186
|
+
await writeCreds({
|
|
187
|
+
client_id: clientId,
|
|
188
|
+
refresh_token: tokens.refresh_token,
|
|
189
|
+
issued_at: Math.floor(Date.now() / 1000),
|
|
190
|
+
refresh_expires_at: Math.floor(Date.now() / 1000) + 30 * 24 * 60 * 60,
|
|
191
|
+
operator_email: operatorEmail,
|
|
192
|
+
scope: tokens.scope,
|
|
193
|
+
});
|
|
194
|
+
stdout.write(` ${C.green}✓${C.reset} Signed in${operatorEmail ? ` as ${C.bold}${operatorEmail}${C.reset}` : ''}
|
|
195
|
+
${C.gray}Credentials saved to ${CREDS_PATH}${C.reset}
|
|
196
|
+
|
|
197
|
+
`);
|
|
198
|
+
}
|
|
199
|
+
export async function cmdStatus() {
|
|
200
|
+
const creds = await readCreds();
|
|
201
|
+
if (!creds) {
|
|
202
|
+
stdout.write(`${C.gray}Not signed in.${C.reset} Run ${C.cyan}stack-cli auth login${C.reset}.\n`);
|
|
203
|
+
exit(1);
|
|
204
|
+
}
|
|
205
|
+
const refreshExpiresIn = creds.refresh_expires_at - Math.floor(Date.now() / 1000);
|
|
206
|
+
if (refreshExpiresIn <= 0) {
|
|
207
|
+
stdout.write(`${C.yellow}Session expired.${C.reset} Run ${C.cyan}stack-cli auth login${C.reset} again.\n`);
|
|
208
|
+
exit(1);
|
|
209
|
+
}
|
|
210
|
+
const days = Math.floor(refreshExpiresIn / 86400);
|
|
211
|
+
stdout.write(` ${C.green}✓${C.reset} Signed in${creds.operator_email ? ` as ${C.bold}${creds.operator_email}${C.reset}` : ''}
|
|
212
|
+
${C.gray}Scope:${C.reset} ${creds.scope}
|
|
213
|
+
${C.gray}Client:${C.reset} ${creds.client_id}
|
|
214
|
+
${C.gray}Expires:${C.reset} in ${days} day${days === 1 ? '' : 's'}
|
|
215
|
+
${C.gray}File:${C.reset} ${CREDS_PATH}
|
|
216
|
+
`);
|
|
217
|
+
}
|
|
218
|
+
export async function cmdLogout() {
|
|
219
|
+
const creds = await readCreds();
|
|
220
|
+
if (!creds) {
|
|
221
|
+
stdout.write(`${C.gray}Not signed in.${C.reset}\n`);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
// Best-effort revoke. Failure on the network doesn't stop us deleting
|
|
225
|
+
// the local file — that's the user's intent here.
|
|
226
|
+
try {
|
|
227
|
+
await fetch(`${API_URL}/oauth/revoke`, {
|
|
228
|
+
method: 'POST',
|
|
229
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
230
|
+
body: new URLSearchParams({ token: creds.refresh_token, client_id: creds.client_id }),
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
/* network error — local file removal still succeeds */
|
|
235
|
+
}
|
|
236
|
+
await deleteCreds();
|
|
237
|
+
stdout.write(` ${C.green}✓${C.reset} Signed out\n`);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Used by `monitor --follow` and any future authenticated command.
|
|
241
|
+
* Returns a fresh access token by exchanging the stored refresh token.
|
|
242
|
+
* Falls back to STACK_API_KEY env var for back-compat with existing
|
|
243
|
+
* users who haven't migrated. Returns null when no auth source exists.
|
|
244
|
+
*/
|
|
245
|
+
export async function getAccessToken() {
|
|
246
|
+
const apiKey = env['STACK_API_KEY'];
|
|
247
|
+
if (apiKey)
|
|
248
|
+
return apiKey; // legacy path
|
|
249
|
+
const creds = await readCreds();
|
|
250
|
+
if (!creds)
|
|
251
|
+
return null;
|
|
252
|
+
const res = await fetch(`${API_URL}/oauth/token`, {
|
|
253
|
+
method: 'POST',
|
|
254
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
255
|
+
body: new URLSearchParams({
|
|
256
|
+
grant_type: 'refresh_token',
|
|
257
|
+
refresh_token: creds.refresh_token,
|
|
258
|
+
client_id: creds.client_id,
|
|
259
|
+
}),
|
|
260
|
+
});
|
|
261
|
+
if (!res.ok) {
|
|
262
|
+
const data = (await res.json().catch(() => ({})));
|
|
263
|
+
if (data.error === 'invalid_grant') {
|
|
264
|
+
// Refresh revoked or family broken — wipe and force re-login.
|
|
265
|
+
await deleteCreds();
|
|
266
|
+
}
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
const data = (await res.json());
|
|
270
|
+
// Rotate stored refresh.
|
|
271
|
+
await writeCreds({
|
|
272
|
+
...creds,
|
|
273
|
+
refresh_token: data.refresh_token,
|
|
274
|
+
issued_at: Math.floor(Date.now() / 1000),
|
|
275
|
+
refresh_expires_at: Math.floor(Date.now() / 1000) + 30 * 24 * 60 * 60,
|
|
276
|
+
});
|
|
277
|
+
return data.access_token;
|
|
278
|
+
}
|
|
279
|
+
// Suppress unused-import warnings for crypto helpers we may need in
|
|
280
|
+
// future Phase-2 SDK-keypair-style additions; safe no-op today.
|
|
281
|
+
void createHash;
|
|
282
|
+
void randomBytes;
|
|
283
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { argv, env, stdout, stderr } from 'node:process';
|
|
3
|
+
import { cmdLogin, cmdLogout, cmdStatus, getAccessToken } from './auth.js';
|
|
4
|
+
import { cmdAgent } from './agent.js';
|
|
3
5
|
const DASHBOARD_URL = 'https://getstack.run';
|
|
4
6
|
const API_URL = env['STACK_API_URL'] ?? 'https://api.getstack.run';
|
|
5
7
|
// ── ANSI helpers ────────────────────────────────────────────────────
|
|
@@ -101,14 +103,18 @@ async function runDemo(loop) {
|
|
|
101
103
|
}
|
|
102
104
|
} while (loop);
|
|
103
105
|
}
|
|
104
|
-
function authToken() {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
106
|
+
async function authToken() {
|
|
107
|
+
// Three sources, in priority order:
|
|
108
|
+
// 1. STACK_API_KEY env var (legacy sk_live_* path, preserved for CI)
|
|
109
|
+
// 2. ~/.stack/credentials.json refresh_token → exchange for access
|
|
110
|
+
// 3. Nothing — point user at `stack-cli auth login`
|
|
111
|
+
const token = await getAccessToken();
|
|
112
|
+
if (token)
|
|
113
|
+
return token;
|
|
114
|
+
stderr.write(`${C.red}error:${C.reset} not signed in.\n` +
|
|
115
|
+
`Run ${C.cyan}stack-cli auth login${C.reset} (recommended) ` +
|
|
116
|
+
`or set ${C.cyan}STACK_API_KEY${C.reset} for the legacy path.\n`);
|
|
117
|
+
process.exit(2);
|
|
112
118
|
}
|
|
113
119
|
/**
|
|
114
120
|
* Map an audit row (wire layer + action) to its display layer.
|
|
@@ -179,7 +185,7 @@ async function runFollow(filters) {
|
|
|
179
185
|
// API key needed; same shape as /v1/audit. Used by the landing
|
|
180
186
|
// demo + anyone who wants to watch the shared sandbox stream.
|
|
181
187
|
const sandbox = filters.sandbox === true;
|
|
182
|
-
const key = sandbox ? null : authToken();
|
|
188
|
+
const key = sandbox ? null : await authToken();
|
|
183
189
|
let watermark = null;
|
|
184
190
|
let firstTick = true;
|
|
185
191
|
const filterDesc = sandbox ? ' · public sandbox'
|
|
@@ -246,8 +252,13 @@ ${C.white}Usage${C.reset}
|
|
|
246
252
|
npx @getstackrun/cli ${C.cyan}<command>${C.reset} [options]
|
|
247
253
|
|
|
248
254
|
${C.white}Commands${C.reset}
|
|
249
|
-
${C.cyan}
|
|
250
|
-
${C.cyan}
|
|
255
|
+
${C.cyan}auth login${C.reset} Sign in via browser (Device flow, RFC 8628)
|
|
256
|
+
${C.cyan}auth status${C.reset} Show current sign-in state
|
|
257
|
+
${C.cyan}auth logout${C.reset} Revoke session and clear local credentials
|
|
258
|
+
${C.cyan}agent enroll${C.reset} <name|id> Generate keypair + enroll an agent (operator-side)
|
|
259
|
+
${C.cyan}agent rotate${C.reset} <name|id> Rotate an enrolled agent's keypair (admin only)
|
|
260
|
+
${C.cyan}register${C.reset} Print signup + MCP install instructions
|
|
261
|
+
${C.cyan}monitor${C.reset} [--demo|--follow] Tail STACK activity in your terminal
|
|
251
262
|
|
|
252
263
|
${C.white}monitor flags${C.reset}
|
|
253
264
|
--demo Replay a real-shape mission (no auth needed).
|
|
@@ -262,6 +273,9 @@ ${C.white}monitor flags${C.reset}
|
|
|
262
273
|
Same stream visitors see on getstack.run.
|
|
263
274
|
|
|
264
275
|
${C.white}Examples${C.reset}
|
|
276
|
+
${C.gray}# enroll a freshly-registered agent so the SDK skips the dance${C.reset}
|
|
277
|
+
npx @getstackrun/cli agent enroll research-pipeline
|
|
278
|
+
|
|
265
279
|
${C.gray}# replay a credential-exfiltration-caught-by-scope_drift mission${C.reset}
|
|
266
280
|
npx @getstackrun/cli monitor --demo --loop
|
|
267
281
|
|
|
@@ -277,6 +291,27 @@ ${C.white}Examples${C.reset}
|
|
|
277
291
|
}
|
|
278
292
|
async function main() {
|
|
279
293
|
const command = argv[2];
|
|
294
|
+
if (command === 'auth') {
|
|
295
|
+
const sub = argv[3];
|
|
296
|
+
if (sub === 'login') {
|
|
297
|
+
await cmdLogin();
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
if (sub === 'logout') {
|
|
301
|
+
await cmdLogout();
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
if (sub === 'status') {
|
|
305
|
+
await cmdStatus();
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
stderr.write(`error: unknown auth subcommand "${sub ?? ''}". Use login | logout | status.\n`);
|
|
309
|
+
process.exit(2);
|
|
310
|
+
}
|
|
311
|
+
if (command === 'agent') {
|
|
312
|
+
await cmdAgent(argv.slice(3));
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
280
315
|
if (command === 'register') {
|
|
281
316
|
stdout.write(`
|
|
282
317
|
STACK — Infrastructure for agents
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|