anyray-connect 0.11.39 → 0.11.40
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 +0 -55
- package/dist/cli.js +43 -20
- package/dist/cli.js.map +1 -1
- package/dist/tools/copilotChat.js +3 -2
- package/dist/tools/copilotChat.js.map +1 -1
- package/dist/tools/manual.js +26 -5
- package/dist/tools/manual.js.map +1 -1
- package/dist/tools/shellEnv.js +3 -1
- package/dist/tools/shellEnv.js.map +1 -1
- package/dist/util/persist.js.map +1 -1
- package/package.json +1 -1
- package/dist/commands/agent.js +0 -347
- package/dist/commands/agent.js.map +0 -1
- package/dist/commands/agentProxy.js +0 -670
- package/dist/commands/agentProxy.js.map +0 -1
- package/dist/util/agentAllowlist.js +0 -107
- package/dist/util/agentAllowlist.js.map +0 -1
- package/dist/util/agentCa.js +0 -209
- package/dist/util/agentCa.js.map +0 -1
- package/dist/util/agentPaths.js +0 -38
- package/dist/util/agentPaths.js.map +0 -1
- package/dist/util/agentService.js +0 -215
- package/dist/util/agentService.js.map +0 -1
- package/dist/util/agentTrust.js +0 -517
- package/dist/util/agentTrust.js.map +0 -1
package/dist/commands/agent.js
DELETED
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `anyray-connect agent <install|start|stop|status|uninstall>` — the
|
|
3
|
-
* device-capture agent lifecycle (RFC 0002 / 0002a).
|
|
4
|
-
*
|
|
5
|
-
* This is Tier 2 capture: for apps `connect` can't redirect (ChatGPT desktop,
|
|
6
|
-
* Claude desktop, Copilot, browsers) it installs a local intercepting proxy + a
|
|
7
|
-
* device-trusted CA that MITMs ONLY the AI-domain allowlist and forwards to the
|
|
8
|
-
* org gateway. Everything else is tunneled, never decrypted.
|
|
9
|
-
*
|
|
10
|
-
* Orchestration only — the real work lives in the modules (agentCa, agentTrust,
|
|
11
|
-
* agentService, agentProxy). Best-effort + fail-open: a failed step is reported,
|
|
12
|
-
* never left in a half-broken state that traps the machine offline.
|
|
13
|
-
*/
|
|
14
|
-
import { platform } from 'node:os';
|
|
15
|
-
import { loadProfile, saveProfile } from '../util/persist.js';
|
|
16
|
-
import { bold, cyan, dim, fail, heading, info, ok, warn, } from '../util/log.js';
|
|
17
|
-
import { caCertPath, DEFAULT_AGENT_PORT } from '../util/agentPaths.js';
|
|
18
|
-
import { gatewayAllowlistHosts, AI_ALLOWLIST, } from '../util/agentAllowlist.js';
|
|
19
|
-
import { ensureCa, removeCa, isOpensslAvailable } from '../util/agentCa.js';
|
|
20
|
-
import { installTrust, uninstallTrust, enableSystemProxy, restoreSystemProxy, readProxyState, } from '../util/agentTrust.js';
|
|
21
|
-
import { installAgentService, uninstallAgentService, probeAgentHealth, } from '../util/agentService.js';
|
|
22
|
-
import { isSafeGatewayOrigin } from './agentProxy.js';
|
|
23
|
-
const AGENT_HELP = `${bold('anyray-connect agent')} — capture AI usage from desktop & browser apps
|
|
24
|
-
|
|
25
|
-
Installs a local intercepting proxy + a device-trusted CA that meters ONLY
|
|
26
|
-
AI-provider domains (ChatGPT, Claude, Copilot, OpenAI, Anthropic) through your
|
|
27
|
-
gateway. All other traffic is tunneled, never decrypted.
|
|
28
|
-
|
|
29
|
-
${bold('Subcommands')}
|
|
30
|
-
install Generate the device CA, trust it, install the proxy service, and
|
|
31
|
-
point the system proxy at it. Asks once for admin (CA trust).
|
|
32
|
-
status Show whether the agent is running + which domains it intercepts.
|
|
33
|
-
stop Pause: remove the system-proxy setting + the service (keeps the CA).
|
|
34
|
-
start Resume a stopped agent.
|
|
35
|
-
uninstall Full teardown: restore the system proxy, untrust + delete the CA,
|
|
36
|
-
remove the service.
|
|
37
|
-
repair With sudo only: remove a legacy root-scoped install left by
|
|
38
|
-
versions 0.11.33–0.11.35. Does not install an agent.
|
|
39
|
-
|
|
40
|
-
${bold('Notes')}
|
|
41
|
-
Run \`anyray-connect --enroll <link>\` (or a plain connect) FIRST so the agent
|
|
42
|
-
knows your gateway + identity. The gateway must allowlist the AI domains via
|
|
43
|
-
ANYRAY_CUSTOM_HOST_ALLOWLIST (see the agent docs).
|
|
44
|
-
Run lifecycle commands as your normal user. Use \`sudo ... agent repair\` only
|
|
45
|
-
to clean up a legacy root-scoped install.`;
|
|
46
|
-
const printInterceptDomains = () => {
|
|
47
|
-
heading('Intercepted domains (only these are decrypted)');
|
|
48
|
-
for (const entry of AI_ALLOWLIST) {
|
|
49
|
-
const host = entry.suffix ? `${entry.host} (+ subdomains)` : entry.host;
|
|
50
|
-
info(` ${cyan(host)} ${dim(`→ ${entry.app}`)}`);
|
|
51
|
-
}
|
|
52
|
-
info(dim(' Everything else is tunneled byte-for-byte, never decrypted.'));
|
|
53
|
-
};
|
|
54
|
-
const requireGateway = async () => {
|
|
55
|
-
const profile = await loadProfile();
|
|
56
|
-
if (!profile.gateway) {
|
|
57
|
-
fail('No gateway configured.');
|
|
58
|
-
info(dim(' Run `anyray-connect --enroll <link>` (or `anyray-connect <gateway-url>`) first,\n' +
|
|
59
|
-
' so the agent knows where to meter and who you are.'));
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
// The agent forwards DECRYPTED prompts + the app's session token to the
|
|
63
|
-
// gateway — a plaintext remote gateway would leak both on the wire. Refuse it
|
|
64
|
-
// (unlike plain connect, which only warns) since a capture agent decrypts.
|
|
65
|
-
if (!isSafeGatewayOrigin(profile.gateway)) {
|
|
66
|
-
fail(`Refusing a plaintext gateway for capture: ${profile.gateway}`);
|
|
67
|
-
info(dim(' The agent forwards decrypted traffic + your session token — use an\n' +
|
|
68
|
-
' https:// gateway (or a loopback address) so nothing crosses the network in the clear.'));
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
|
-
return profile.gateway;
|
|
72
|
-
};
|
|
73
|
-
/**
|
|
74
|
-
* Install the service, point the system proxy at it, and confirm it answers.
|
|
75
|
-
* The proxy is enabled ONLY once the service is installed, and reverted if the
|
|
76
|
-
* daemon never comes up — so `install`/`start` can never leave the machine
|
|
77
|
-
* pointed at a dead listener while reporting success (fail-open).
|
|
78
|
-
*/
|
|
79
|
-
const bringUpProxy = async (port, gateway) => {
|
|
80
|
-
heading('Proxy service');
|
|
81
|
-
const svc = await installAgentService();
|
|
82
|
-
for (const m of svc.messages)
|
|
83
|
-
info(` ${m}`);
|
|
84
|
-
if (!svc.ok) {
|
|
85
|
-
fail(' Could not install the agent service — not enabling the system proxy.');
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
heading('System proxy');
|
|
89
|
-
const proxied = await enableSystemProxy(port);
|
|
90
|
-
for (const m of proxied.messages)
|
|
91
|
-
info(` ${m}`);
|
|
92
|
-
if (!proxied.ok) {
|
|
93
|
-
warn(' System proxy setup was incomplete — reverting it so you stay online.');
|
|
94
|
-
const restored = await restoreSystemProxy(port);
|
|
95
|
-
for (const m of restored.messages)
|
|
96
|
-
info(` ${m}`);
|
|
97
|
-
await uninstallAgentService();
|
|
98
|
-
return false;
|
|
99
|
-
}
|
|
100
|
-
heading('Health');
|
|
101
|
-
let health = null;
|
|
102
|
-
for (let i = 0; i < 15 && !health; i++) {
|
|
103
|
-
health = await probeAgentHealth(port);
|
|
104
|
-
if (!health)
|
|
105
|
-
await sleep(400);
|
|
106
|
-
}
|
|
107
|
-
if (health) {
|
|
108
|
-
ok(` Agent running on 127.0.0.1:${port} → ${gateway}.`);
|
|
109
|
-
return true;
|
|
110
|
-
}
|
|
111
|
-
// Never leave the system proxy pointing at a daemon that won't answer.
|
|
112
|
-
warn(' Agent did not come up — reverting the system proxy so you stay online.');
|
|
113
|
-
const restored = await restoreSystemProxy(port);
|
|
114
|
-
for (const m of restored.messages)
|
|
115
|
-
info(` ${m}`);
|
|
116
|
-
await uninstallAgentService();
|
|
117
|
-
info(dim(' Check the service logs, then re-run `anyray-connect agent install`.'));
|
|
118
|
-
return false;
|
|
119
|
-
};
|
|
120
|
-
const preflight = () => {
|
|
121
|
-
if (platform() !== 'darwin') {
|
|
122
|
-
fail('The device-capture agent is macOS-only in this phase.');
|
|
123
|
-
info(dim(' Windows/Linux support is planned (RFC 0002a §7). On other platforms,\n' +
|
|
124
|
-
' use `anyray-connect` to redirect the tools that support a base URL.'));
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
if (!isOpensslAvailable()) {
|
|
128
|
-
fail('`openssl` was not found on PATH — it is required to mint the device CA.');
|
|
129
|
-
return false;
|
|
130
|
-
}
|
|
131
|
-
return true;
|
|
132
|
-
};
|
|
133
|
-
const runInstall = async () => {
|
|
134
|
-
if (!preflight())
|
|
135
|
-
return 1;
|
|
136
|
-
const gateway = await requireGateway();
|
|
137
|
-
if (!gateway)
|
|
138
|
-
return 1;
|
|
139
|
-
const profile = await loadProfile();
|
|
140
|
-
const port = profile.agentPort ?? DEFAULT_AGENT_PORT;
|
|
141
|
-
info(bold('Installing the Anyray device-capture agent'));
|
|
142
|
-
printInterceptDomains();
|
|
143
|
-
// 1. Device CA.
|
|
144
|
-
heading('Device CA');
|
|
145
|
-
try {
|
|
146
|
-
await ensureCa();
|
|
147
|
-
ok(` CA ready (${caCertPath()}).`);
|
|
148
|
-
}
|
|
149
|
-
catch (error) {
|
|
150
|
-
fail(` Could not create the device CA: ${msg(error)}`);
|
|
151
|
-
return 1;
|
|
152
|
-
}
|
|
153
|
-
// 2. Trust the CA (the one admin prompt).
|
|
154
|
-
heading('Trusting the CA');
|
|
155
|
-
info(dim(' macOS will ask for your password once — trusting a root CA is deliberate.'));
|
|
156
|
-
const trust = await installTrust(caCertPath());
|
|
157
|
-
for (const m of trust.messages)
|
|
158
|
-
info(` ${m}`);
|
|
159
|
-
if (!trust.ok) {
|
|
160
|
-
warn(' CA trust did not complete — intercepted apps will reject the proxy until it does.');
|
|
161
|
-
}
|
|
162
|
-
// 3. Bring up the service + system proxy (guarded: proxy only enabled behind a
|
|
163
|
-
// healthy daemon, reverted if it never answers).
|
|
164
|
-
const up = await bringUpProxy(port, gateway);
|
|
165
|
-
if (!up)
|
|
166
|
-
return 1;
|
|
167
|
-
await saveProfile({ ...profile, agentEnabled: true, agentPort: port });
|
|
168
|
-
info('\nUninstall any time: ' + cyan('anyray-connect agent uninstall'));
|
|
169
|
-
return 0;
|
|
170
|
-
};
|
|
171
|
-
const runStatus = async () => {
|
|
172
|
-
const profile = await loadProfile();
|
|
173
|
-
const port = profile.agentPort ?? DEFAULT_AGENT_PORT;
|
|
174
|
-
heading('Anyray device-capture agent');
|
|
175
|
-
info(` Gateway: ${profile.gateway ? cyan(profile.gateway) : dim('(not configured)')}`);
|
|
176
|
-
info(` Enabled: ${profile.agentEnabled ? cyan('yes') : dim('no')}`);
|
|
177
|
-
const health = await probeAgentHealth(port);
|
|
178
|
-
if (health)
|
|
179
|
-
ok(` Running on 127.0.0.1:${port}.`);
|
|
180
|
-
else
|
|
181
|
-
warn(` Not responding on 127.0.0.1:${port}.`);
|
|
182
|
-
if (platform() === 'darwin') {
|
|
183
|
-
const proxy = readProxyState();
|
|
184
|
-
if (proxy) {
|
|
185
|
-
const on = proxy.secureEnabled || proxy.webEnabled;
|
|
186
|
-
info(` System proxy (${proxy.service}): ${on
|
|
187
|
-
? cyan(`${proxy.secureHost ?? proxy.webHost}:${proxy.securePort ?? proxy.webPort}`)
|
|
188
|
-
: dim('off')}`);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
printInterceptDomains();
|
|
192
|
-
heading('Gateway requirement');
|
|
193
|
-
info(dim(' The gateway must allowlist these hosts (ANYRAY_CUSTOM_HOST_ALLOWLIST):\n' +
|
|
194
|
-
' ' +
|
|
195
|
-
gatewayAllowlistHosts().join(',')));
|
|
196
|
-
return 0;
|
|
197
|
-
};
|
|
198
|
-
const runStop = async () => {
|
|
199
|
-
const profile = await loadProfile();
|
|
200
|
-
const port = profile.agentPort ?? DEFAULT_AGENT_PORT;
|
|
201
|
-
heading('Stopping the agent');
|
|
202
|
-
// Restore the system proxy FIRST so the machine is never left pointing at a
|
|
203
|
-
// dead daemon (fail-open).
|
|
204
|
-
const restored = await restoreSystemProxy(port);
|
|
205
|
-
for (const m of restored.messages)
|
|
206
|
-
info(` ${m}`);
|
|
207
|
-
if (!restored.ok) {
|
|
208
|
-
fail(' Proxy restoration was incomplete — the agent was left running for safety.');
|
|
209
|
-
return 1;
|
|
210
|
-
}
|
|
211
|
-
const svc = await uninstallAgentService();
|
|
212
|
-
for (const m of svc.messages)
|
|
213
|
-
info(` ${m}`);
|
|
214
|
-
await saveProfile({ ...profile, agentEnabled: false });
|
|
215
|
-
ok(' Agent stopped (the device CA is kept — `agent start` to resume).');
|
|
216
|
-
return 0;
|
|
217
|
-
};
|
|
218
|
-
const runStart = async () => {
|
|
219
|
-
if (!preflight())
|
|
220
|
-
return 1;
|
|
221
|
-
const gateway = await requireGateway();
|
|
222
|
-
if (!gateway)
|
|
223
|
-
return 1;
|
|
224
|
-
const profile = await loadProfile();
|
|
225
|
-
const port = profile.agentPort ?? DEFAULT_AGENT_PORT;
|
|
226
|
-
heading('Starting the agent');
|
|
227
|
-
const up = await bringUpProxy(port, gateway);
|
|
228
|
-
if (!up)
|
|
229
|
-
return 1;
|
|
230
|
-
await saveProfile({ ...profile, agentEnabled: true, agentPort: port });
|
|
231
|
-
return 0;
|
|
232
|
-
};
|
|
233
|
-
const runUninstall = async () => {
|
|
234
|
-
const profile = await loadProfile();
|
|
235
|
-
const port = profile.agentPort ?? DEFAULT_AGENT_PORT;
|
|
236
|
-
heading('Uninstalling the agent');
|
|
237
|
-
const restored = await restoreSystemProxy(port);
|
|
238
|
-
for (const m of restored.messages)
|
|
239
|
-
info(` ${m}`);
|
|
240
|
-
if (!restored.ok) {
|
|
241
|
-
fail(' Proxy restoration was incomplete — no agent or CA state was removed.');
|
|
242
|
-
return 1;
|
|
243
|
-
}
|
|
244
|
-
const untrust = await uninstallTrust(caCertPath());
|
|
245
|
-
for (const m of untrust.messages)
|
|
246
|
-
info(` ${m}`);
|
|
247
|
-
const svc = await uninstallAgentService();
|
|
248
|
-
for (const m of svc.messages)
|
|
249
|
-
info(` ${m}`);
|
|
250
|
-
await removeCa();
|
|
251
|
-
await saveProfile({ ...profile, agentEnabled: false, agentPort: undefined });
|
|
252
|
-
ok(' Removed the agent, restored the system proxy, and deleted the device CA.');
|
|
253
|
-
return 0;
|
|
254
|
-
};
|
|
255
|
-
const runRepair = async () => {
|
|
256
|
-
if (platform() !== 'darwin') {
|
|
257
|
-
fail('The legacy agent repair is macOS-only.');
|
|
258
|
-
return 1;
|
|
259
|
-
}
|
|
260
|
-
const profile = await loadProfile();
|
|
261
|
-
const port = profile.agentPort ?? DEFAULT_AGENT_PORT;
|
|
262
|
-
heading('Repairing a legacy root-scoped agent install');
|
|
263
|
-
const restored = await restoreSystemProxy(port);
|
|
264
|
-
for (const m of restored.messages)
|
|
265
|
-
info(` ${m}`);
|
|
266
|
-
const untrust = await uninstallTrust(caCertPath());
|
|
267
|
-
for (const m of untrust.messages)
|
|
268
|
-
info(` ${m}`);
|
|
269
|
-
const svc = await uninstallAgentService();
|
|
270
|
-
for (const m of svc.messages)
|
|
271
|
-
info(` ${m}`);
|
|
272
|
-
await removeCa();
|
|
273
|
-
await saveProfile({ ...profile, agentEnabled: false, agentPort: undefined });
|
|
274
|
-
if (!restored.ok || !untrust.ok || !svc.ok) {
|
|
275
|
-
fail(' Legacy cleanup was incomplete; fix the errors above and run repair again.');
|
|
276
|
-
return 1;
|
|
277
|
-
}
|
|
278
|
-
ok(' Removed legacy root-scoped agent state and disabled stale Anyray proxies.');
|
|
279
|
-
info(dim(' Reinstall as your normal user: anyray-connect agent install'));
|
|
280
|
-
return 0;
|
|
281
|
-
};
|
|
282
|
-
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
283
|
-
const msg = (error) => error instanceof Error ? error.message : String(error);
|
|
284
|
-
/**
|
|
285
|
-
* True when the CLI was launched via `sudo`. The capture agent is a strictly
|
|
286
|
-
* PER-USER install — a LaunchAgent in the user's `gui/<uid>` domain, a CA
|
|
287
|
-
* trusted in the login keychain, and the user's own network-service proxy — each
|
|
288
|
-
* elevated through a macOS GUI auth prompt, never sudo. Under sudo
|
|
289
|
-
* `process.getuid()` is 0 and `os.homedir()` is /var/root, so every artifact
|
|
290
|
-
* would target root's domain and leave the real user session untouched: a `sudo
|
|
291
|
-
* install` silently strands a stale daemon (the service lands in `gui/0`, which
|
|
292
|
-
* has no Aqua session and never runs), and a `sudo stop`/`uninstall` can't
|
|
293
|
-
* restore the user's proxy, trapping the machine offline. So the lifecycle
|
|
294
|
-
* commands refuse every root context. `SUDO_UID` remains useful for diagnostics
|
|
295
|
-
* and for identifying the legacy cleanup path.
|
|
296
|
-
*/
|
|
297
|
-
export const isRunningUnderSudo = () => process.getuid?.() === 0 && !!process.env.SUDO_UID;
|
|
298
|
-
export const isRunningAsRoot = () => process.getuid?.() === 0;
|
|
299
|
-
const refuseRoot = (sub) => {
|
|
300
|
-
fail(`Run \`anyray-connect agent ${sub}\` as your normal user — not as root.`);
|
|
301
|
-
info(dim(' The capture agent is a per-user login service (a LaunchAgent, a\n' +
|
|
302
|
-
' login-keychain CA, and your own network proxy). macOS prompts for your\n' +
|
|
303
|
-
" password when it needs elevation; root instead puts everything in root's\n" +
|
|
304
|
-
' domain and leaves your user session untouched.'));
|
|
305
|
-
info(' Re-run: ' + cyan(`anyray-connect agent ${sub}`));
|
|
306
|
-
};
|
|
307
|
-
/** Lifecycle subcommands that mutate per-user state and must never run as root. */
|
|
308
|
-
const ROOT_GUARDED = new Set(['install', 'start', 'stop', 'uninstall']);
|
|
309
|
-
export const shouldRefuseRootLifecycle = (sub) => ROOT_GUARDED.has(sub) && isRunningAsRoot();
|
|
310
|
-
/** Entry point routed from cli.ts for the `agent` subcommand. */
|
|
311
|
-
export const runAgent = async (argv) => {
|
|
312
|
-
const sub = argv[0];
|
|
313
|
-
if (sub && shouldRefuseRootLifecycle(sub)) {
|
|
314
|
-
refuseRoot(sub);
|
|
315
|
-
return 1;
|
|
316
|
-
}
|
|
317
|
-
if (sub === 'repair' && !isRunningAsRoot()) {
|
|
318
|
-
fail('`agent repair` is only for cleaning a legacy root-scoped install.');
|
|
319
|
-
info(' Use: ' + cyan('sudo anyray-connect agent repair'));
|
|
320
|
-
return 1;
|
|
321
|
-
}
|
|
322
|
-
switch (sub) {
|
|
323
|
-
case 'install':
|
|
324
|
-
return runInstall();
|
|
325
|
-
case 'status':
|
|
326
|
-
return runStatus();
|
|
327
|
-
case 'stop':
|
|
328
|
-
return runStop();
|
|
329
|
-
case 'start':
|
|
330
|
-
return runStart();
|
|
331
|
-
case 'uninstall':
|
|
332
|
-
return runUninstall();
|
|
333
|
-
case 'repair':
|
|
334
|
-
return runRepair();
|
|
335
|
-
case undefined:
|
|
336
|
-
case 'help':
|
|
337
|
-
case '--help':
|
|
338
|
-
case '-h':
|
|
339
|
-
info(AGENT_HELP);
|
|
340
|
-
return 0;
|
|
341
|
-
default:
|
|
342
|
-
fail(`unknown agent subcommand: ${sub}`);
|
|
343
|
-
info('\n' + AGENT_HELP);
|
|
344
|
-
return 1;
|
|
345
|
-
}
|
|
346
|
-
};
|
|
347
|
-
//# sourceMappingURL=agent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
|