anyray-connect 0.2.0 → 0.3.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 +5 -0
- package/dist/cli.js +154 -58
- package/dist/cli.js.map +1 -1
- package/dist/commands/doctor.js +86 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/shared.js +83 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/commands/status.js +71 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.js +87 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/tools/claudeCode.js +17 -0
- package/dist/tools/claudeCode.js.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/util/persist.js +32 -7
- package/dist/util/persist.js.map +1 -1
- package/dist/util/policySync.js +143 -0
- package/dist/util/policySync.js.map +1 -0
- package/dist/util/savings.js +71 -0
- package/dist/util/savings.js.map +1 -0
- package/dist/util/setupLink.js +5 -1
- package/dist/util/setupLink.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,6 +5,8 @@ coding tools at the **Anyray gateway** by writing each tool's base URL and a
|
|
|
5
5
|
**placeholder** API key. The gateway stays the brain (routing, spend store,
|
|
6
6
|
content encryption, optimizer) — this only does capture/onboarding.
|
|
7
7
|
|
|
8
|
+
> The Anyray gateway you target may itself front an existing gateway (LiteLLM, OpenRouter, Portkey, homegrown) via the `anyray-upstream` provider — that's configured server-side on the gateway, with no client-side difference to `connect`.
|
|
9
|
+
|
|
8
10
|
```bash
|
|
9
11
|
npx anyray-connect --gateway https://gw.yourorg.internal --user you@yourorg.com
|
|
10
12
|
```
|
|
@@ -78,6 +80,9 @@ touched.**
|
|
|
78
80
|
--revert Undo a previous run
|
|
79
81
|
```
|
|
80
82
|
|
|
83
|
+
Without a TTY (CI, piped stdin) the CLI exits 1 instead of prompting — pass
|
|
84
|
+
`--yes` for any scripted run, including `--revert` (piping `y` no longer works).
|
|
85
|
+
|
|
81
86
|
## Adding a tool
|
|
82
87
|
|
|
83
88
|
Adapters live in `src/tools/` and are registered in `src/tools/index.ts`
|
package/dist/cli.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `anyray-connect` CLI orchestration.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* A small subcommand dispatcher routes to one of: the apply flow (the default —
|
|
5
|
+
* resolve target → detect tools → confirm → apply → summary), an interactive
|
|
6
|
+
* `wizard`, and the read-only `status`, `doctor`, and `sync` commands. A bare
|
|
7
|
+
* invocation with no subcommand runs apply (wizard-driven on a TTY) so existing
|
|
8
|
+
* usage keeps working. All intelligence stays in the gateway; this only writes
|
|
9
|
+
* base URLs + placeholder keys + content-free attribution.
|
|
8
10
|
*/
|
|
9
|
-
import { createInterface } from 'node:readline/promises';
|
|
10
11
|
import { resolveOrigin, resolveTarget } from './target.js';
|
|
11
12
|
import { checkGateway } from './util/preflight.js';
|
|
12
13
|
import { maskKey, redeemInvite } from './util/redeem.js';
|
|
@@ -14,8 +15,12 @@ import { parseSetupLink, resolveSetupLink } from './util/setupLink.js';
|
|
|
14
15
|
import { REGISTRY, byId } from './tools/index.js';
|
|
15
16
|
import { metadataHeaderValue } from './types.js';
|
|
16
17
|
import { bold, cyan, dim, fail, heading, info, note, ok, warn, } from './util/log.js';
|
|
17
|
-
import { detectDisplayName } from './util/identity.js';
|
|
18
18
|
import { loadProfile, saveProfile } from './util/persist.js';
|
|
19
|
+
import { confirm, isInteractive, prompt, resolveDisplayName, resolveTeam, } from './commands/shared.js';
|
|
20
|
+
import { fetchSavings, formatSavingsLine } from './util/savings.js';
|
|
21
|
+
import { runStatus } from './commands/status.js';
|
|
22
|
+
import { runDoctor } from './commands/doctor.js';
|
|
23
|
+
import { runSync } from './commands/sync.js';
|
|
19
24
|
const HELP = `${bold('anyray-connect')} — point your local coding tools at the Anyray gateway
|
|
20
25
|
|
|
21
26
|
${bold('Usage')}
|
|
@@ -24,6 +29,13 @@ ${bold('Usage')}
|
|
|
24
29
|
admin shared; resolves the org's gateway for you)
|
|
25
30
|
npx anyray-connect [options] (gateway from $ANYRAY_GATEWAY_URL, the ~/.anyray cache, or http://localhost:8787)
|
|
26
31
|
|
|
32
|
+
${bold('Subcommands')}
|
|
33
|
+
wizard Interactive guided setup (also the default on a TTY)
|
|
34
|
+
status Show current config: tools pointed at Anyray, gateway, name/team, savings
|
|
35
|
+
doctor Diagnose gateway reachability + tool config; exits non-zero on problems
|
|
36
|
+
sync Pull the team's shared skills/instructions into each tool's skills dir
|
|
37
|
+
(no subcommand) Apply the connect flow (wizard-driven when interactive)
|
|
38
|
+
|
|
27
39
|
${bold('Options')}
|
|
28
40
|
--gateway <url> Gateway origin or a shared setup link (default:
|
|
29
41
|
$ANYRAY_GATEWAY_URL, then the ~/.anyray cache, then
|
|
@@ -40,7 +52,9 @@ ${bold('Options')}
|
|
|
40
52
|
--subscription it rides x-anyray-api-key instead (your seat
|
|
41
53
|
OAuth token stays the bearer). Defaults --user/--team from
|
|
42
54
|
the invite unless you pass them. Redemption is single-use,
|
|
43
|
-
so --dry-run skips it (the invite is not consumed).
|
|
55
|
+
so --dry-run skips it (the invite is not consumed). The key
|
|
56
|
+
is saved to ~/.anyray (mode 600) so ${dim('status')} and ${dim('sync')} reuse it
|
|
57
|
+
(needed once the gateway enforces per-user keys).
|
|
44
58
|
Already have a key? Set $ANYRAY_CLIENT_KEY instead.
|
|
45
59
|
--subscription Keep seat (subscription) sign-in: the tool's own OAuth token
|
|
46
60
|
passes through the gateway instead of the org API key.
|
|
@@ -57,7 +71,8 @@ ${bold('What it does')}
|
|
|
57
71
|
Writes each tool's base URL + a ${dim('placeholder')} key so requests flow through the
|
|
58
72
|
gateway. The real provider key stays server-side (ANYRAY_PROVIDER_KEY_*); your
|
|
59
73
|
tools never hold it. Only metadata (user/team) is attached — never prompt content.
|
|
60
|
-
|
|
74
|
+
~/.anyray (mode 600) remembers your gateway, name/team, personal key, and the
|
|
75
|
+
per-skill versions ${dim('sync')} last wrote — for zero-question re-runs.`;
|
|
61
76
|
const parseArgs = (argv) => {
|
|
62
77
|
const args = {
|
|
63
78
|
subscription: false,
|
|
@@ -164,55 +179,6 @@ const printTarget = (target) => {
|
|
|
164
179
|
}
|
|
165
180
|
info(` Attribution: ${metadataHeaderValue(target.metadata) ?? dim('(none — pass --user)')}`);
|
|
166
181
|
};
|
|
167
|
-
const confirm = async (question) => {
|
|
168
|
-
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
169
|
-
try {
|
|
170
|
-
const answer = (await rl.question(`${question} ${dim('[y/N]')} `)).trim();
|
|
171
|
-
return /^y(es)?$/i.test(answer);
|
|
172
|
-
}
|
|
173
|
-
finally {
|
|
174
|
-
rl.close();
|
|
175
|
-
}
|
|
176
|
-
};
|
|
177
|
-
const prompt = async (question, defaultValue) => {
|
|
178
|
-
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
179
|
-
try {
|
|
180
|
-
const hint = defaultValue ? ` ${dim(`[${defaultValue}]`)}` : '';
|
|
181
|
-
const raw = (await rl.question(`${question}${hint}: `)).trim();
|
|
182
|
-
return raw || defaultValue;
|
|
183
|
-
}
|
|
184
|
-
finally {
|
|
185
|
-
rl.close();
|
|
186
|
-
}
|
|
187
|
-
};
|
|
188
|
-
/** Explicit flag wins ('' clears the cache) → cached → detected, prompted on a TTY. */
|
|
189
|
-
const resolveDisplayName = async (explicit, cached, yes) => {
|
|
190
|
-
if (explicit !== undefined)
|
|
191
|
-
return explicit.trim() || undefined;
|
|
192
|
-
if (cached) {
|
|
193
|
-
note(`Your name: ${cached} ${dim('(cached — pass --user to change)')}`);
|
|
194
|
-
return cached;
|
|
195
|
-
}
|
|
196
|
-
const detected = detectDisplayName();
|
|
197
|
-
// Without a TTY, prompting would block forever on a silent pipe — behave like --yes.
|
|
198
|
-
if (yes || !process.stdin.isTTY) {
|
|
199
|
-
note(`Your name: ${detected} ${dim('(auto-detected — pass --user to change)')}`);
|
|
200
|
-
return detected;
|
|
201
|
-
}
|
|
202
|
-
return prompt('? Your name', detected);
|
|
203
|
-
};
|
|
204
|
-
/** Explicit flag wins ('' clears the cache) → cached → optional prompt on a TTY. */
|
|
205
|
-
const resolveTeam = async (explicit, cached, yes) => {
|
|
206
|
-
if (explicit !== undefined)
|
|
207
|
-
return explicit.trim() || undefined;
|
|
208
|
-
if (cached) {
|
|
209
|
-
note(`Team: ${cached} ${dim('(cached — pass --team to change)')}`);
|
|
210
|
-
return cached;
|
|
211
|
-
}
|
|
212
|
-
if (yes || !process.stdin.isTTY)
|
|
213
|
-
return undefined;
|
|
214
|
-
return prompt('? Team (optional)');
|
|
215
|
-
};
|
|
216
182
|
const runApply = async (adapters, target, opts, revert) => {
|
|
217
183
|
let changes = 0;
|
|
218
184
|
for (const adapter of adapters) {
|
|
@@ -245,7 +211,105 @@ const runApply = async (adapters, target, opts, revert) => {
|
|
|
245
211
|
}
|
|
246
212
|
return changes;
|
|
247
213
|
};
|
|
214
|
+
/**
|
|
215
|
+
* Interactive wizard — guided first-run setup on a TTY. Detects installed
|
|
216
|
+
* tools, lets the dev pick which to configure, confirms the gateway URL, name,
|
|
217
|
+
* and team, then hands back the chosen args for the apply flow. Mutates and
|
|
218
|
+
* returns `args`; falls through untouched if anything is already specified.
|
|
219
|
+
*
|
|
220
|
+
* Only the questions the dev hasn't already answered via flags are asked, so
|
|
221
|
+
* `wizard --user x` stays terse. The apply flow still does the real work (and
|
|
222
|
+
* its own preflight + persistence) — the wizard only gathers input.
|
|
223
|
+
*/
|
|
224
|
+
const runWizard = async (args, profile) => {
|
|
225
|
+
info(bold('Anyray connect — guided setup'));
|
|
226
|
+
info(dim('Point your local coding tools at the Anyray gateway. Ctrl-C to abort.'));
|
|
227
|
+
// Tool selection: show what's installed, let the dev narrow it down.
|
|
228
|
+
if (!args.tools || args.tools.length === 0) {
|
|
229
|
+
heading('Tools detected');
|
|
230
|
+
const installed = [];
|
|
231
|
+
for (const adapter of REGISTRY) {
|
|
232
|
+
const detected = await adapter.detect();
|
|
233
|
+
if (detected.installed) {
|
|
234
|
+
installed.push(adapter.id);
|
|
235
|
+
ok(` ${adapter.title} ${dim(`(${adapter.id})`)}`);
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
note(` ${adapter.title} — not installed`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
const pick = await prompt('? Tools to configure (comma-separated, blank = all detected)', installed.join(',') || undefined);
|
|
242
|
+
const chosen = (pick ?? '')
|
|
243
|
+
.split(',')
|
|
244
|
+
.map((s) => s.trim())
|
|
245
|
+
.filter(Boolean);
|
|
246
|
+
if (chosen.length > 0)
|
|
247
|
+
args.tools = chosen;
|
|
248
|
+
}
|
|
249
|
+
// Gateway URL: default to the cached/env/default origin.
|
|
250
|
+
if (!args.gateway) {
|
|
251
|
+
heading('Gateway');
|
|
252
|
+
const fallback = profile.gateway || process.env.ANYRAY_GATEWAY_URL;
|
|
253
|
+
const answer = await prompt('? Gateway URL', fallback);
|
|
254
|
+
if (answer)
|
|
255
|
+
args.gateway = answer;
|
|
256
|
+
}
|
|
257
|
+
// Identity is resolved by the apply flow's resolveDisplayName/resolveTeam,
|
|
258
|
+
// which already prompt on a TTY — leave args.user/args.team untouched so the
|
|
259
|
+
// wizard doesn't double-ask.
|
|
260
|
+
return args;
|
|
261
|
+
};
|
|
262
|
+
/**
|
|
263
|
+
* Print the dev's content-free savings after a successful apply (and reused by
|
|
264
|
+
* `status`). Best-effort: an older gateway (404) or a network hiccup silently
|
|
265
|
+
* skips the line — it must never break the apply flow.
|
|
266
|
+
*/
|
|
267
|
+
const printSavings = async (target) => {
|
|
268
|
+
try {
|
|
269
|
+
const key = target.clientKey ?? target.placeholderKey;
|
|
270
|
+
const savings = await fetchSavings(target.origin, key);
|
|
271
|
+
if (savings) {
|
|
272
|
+
heading('Your savings');
|
|
273
|
+
info(` ${formatSavingsLine(savings)}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
// Never let the savings readout break onboarding.
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
const SUBCOMMANDS = new Set(['wizard', 'status', 'doctor', 'sync']);
|
|
248
281
|
export const run = async (argv) => {
|
|
282
|
+
// Subcommand dispatch: a known verb as the first token routes to that
|
|
283
|
+
// command. Everything else (a gateway URL, flags, or nothing) runs the apply
|
|
284
|
+
// flow, so the bare `anyray-connect` invocation stays backward compatible.
|
|
285
|
+
const sub = argv[0];
|
|
286
|
+
if (sub && SUBCOMMANDS.has(sub)) {
|
|
287
|
+
const rest = argv.slice(1);
|
|
288
|
+
let parsed;
|
|
289
|
+
try {
|
|
290
|
+
parsed = parseArgs(rest);
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
fail(error.message);
|
|
294
|
+
info('\nRun `anyray-connect --help` for usage.');
|
|
295
|
+
return 1;
|
|
296
|
+
}
|
|
297
|
+
if (parsed.help) {
|
|
298
|
+
info(HELP);
|
|
299
|
+
return 0;
|
|
300
|
+
}
|
|
301
|
+
if (sub === 'status')
|
|
302
|
+
return runStatus({ gateway: parsed.gateway });
|
|
303
|
+
if (sub === 'doctor')
|
|
304
|
+
return runDoctor({ gateway: parsed.gateway });
|
|
305
|
+
if (sub === 'sync')
|
|
306
|
+
return runSync({ gateway: parsed.gateway });
|
|
307
|
+
// 'wizard' → apply flow with the wizard enabled.
|
|
308
|
+
return runApplyCommand(rest, true);
|
|
309
|
+
}
|
|
310
|
+
return runApplyCommand(argv, false);
|
|
311
|
+
};
|
|
312
|
+
const runApplyCommand = async (argv, forceWizard) => {
|
|
249
313
|
let args;
|
|
250
314
|
try {
|
|
251
315
|
args = parseArgs(argv);
|
|
@@ -259,6 +323,20 @@ export const run = async (argv) => {
|
|
|
259
323
|
info(HELP);
|
|
260
324
|
return 0;
|
|
261
325
|
}
|
|
326
|
+
const profile = await loadProfile();
|
|
327
|
+
// Wizard: explicit `wizard` subcommand, or a bare interactive invocation
|
|
328
|
+
// (no gateway, not a revert/dry-run/scripted run). Non-TTY always falls
|
|
329
|
+
// through to the flag-driven flow.
|
|
330
|
+
const bareInteractive = !forceWizard &&
|
|
331
|
+
isInteractive() &&
|
|
332
|
+
!args.gateway &&
|
|
333
|
+
!args.revert &&
|
|
334
|
+
!args.yes &&
|
|
335
|
+
!args.dryRun &&
|
|
336
|
+
!args.invite;
|
|
337
|
+
if ((forceWizard || bareInteractive) && isInteractive()) {
|
|
338
|
+
args = await runWizard(args, profile);
|
|
339
|
+
}
|
|
262
340
|
let adapters;
|
|
263
341
|
try {
|
|
264
342
|
adapters = selectAdapters(args.tools);
|
|
@@ -267,7 +345,6 @@ export const run = async (argv) => {
|
|
|
267
345
|
fail(error.message);
|
|
268
346
|
return 1;
|
|
269
347
|
}
|
|
270
|
-
const profile = await loadProfile();
|
|
271
348
|
info(bold(args.revert ? 'Anyray connect — revert' : 'Anyray connect'));
|
|
272
349
|
// A pasted shareable setup link (https://app.anyray.ai/setup/<token>)
|
|
273
350
|
// resolves to the org's gateway URL via the portal's setup-info endpoint —
|
|
@@ -280,6 +357,13 @@ export const run = async (argv) => {
|
|
|
280
357
|
const resolved = await resolveSetupLink(setupLink);
|
|
281
358
|
args.gateway = resolved.gatewayUrl;
|
|
282
359
|
note(`Setup link${resolved.org ? ` for ${resolved.org}` : ''}: gateway ${resolved.gatewayUrl}`);
|
|
360
|
+
// Subscription-seat org → default to pass-through auth so the dev's own
|
|
361
|
+
// Claude Code / Codex seat is used. An explicit --subscription already
|
|
362
|
+
// set it; this only fills in the default (there is no --no-subscription).
|
|
363
|
+
if (resolved.seatMode && !args.subscription) {
|
|
364
|
+
args.subscription = true;
|
|
365
|
+
note('Subscription org: using pass-through auth (--subscription) — your own seat sign-in is used.');
|
|
366
|
+
}
|
|
283
367
|
}
|
|
284
368
|
catch (error) {
|
|
285
369
|
fail(error instanceof Error ? error.message : String(error));
|
|
@@ -350,6 +434,10 @@ export const run = async (argv) => {
|
|
|
350
434
|
if (args.dryRun)
|
|
351
435
|
note('\nDry run — no files will be written.');
|
|
352
436
|
if (!args.yes && !args.dryRun) {
|
|
437
|
+
if (!isInteractive()) {
|
|
438
|
+
fail('\nNon-interactive session — cannot ask for confirmation. Pass --yes to proceed.');
|
|
439
|
+
return 1;
|
|
440
|
+
}
|
|
353
441
|
const verb = args.revert ? 'remove Anyray config from' : 'configure';
|
|
354
442
|
const proceed = await confirm(`\n${verb} ${adapters.length} tool target(s)?`);
|
|
355
443
|
if (!proceed) {
|
|
@@ -395,15 +483,23 @@ export const run = async (argv) => {
|
|
|
395
483
|
` -d '{"model":"anyray-default","messages":[{"role":"user","content":"ping"}],"max_tokens":16}'`));
|
|
396
484
|
info(dim(' Revert: npx anyray-connect --revert'));
|
|
397
485
|
try {
|
|
486
|
+
// Preserve any prior sync state — saveProfile replaces the file wholesale.
|
|
487
|
+
// Persist a freshly redeemed personal key so the read-only status/sync
|
|
488
|
+
// commands can present it (else they'd 401 under key enforcement); keep
|
|
489
|
+
// any previously stored key when this run didn't redeem one.
|
|
398
490
|
await saveProfile({
|
|
491
|
+
...profile,
|
|
399
492
|
gateway: target.origin,
|
|
400
493
|
name: resolvedUser,
|
|
401
494
|
team: resolvedTeam,
|
|
495
|
+
clientKey: target.clientKey ?? profile.clientKey,
|
|
402
496
|
});
|
|
403
497
|
}
|
|
404
498
|
catch (error) {
|
|
405
499
|
warn(`Could not save profile: ${error instanceof Error ? error.message : String(error)}`);
|
|
406
500
|
}
|
|
501
|
+
// Close onboarding with the tangible savings number (best-effort).
|
|
502
|
+
await printSavings(target);
|
|
407
503
|
}
|
|
408
504
|
return 0;
|
|
409
505
|
};
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `anyray-connect doctor` — read-only diagnostics with actionable fixes.
|
|
3
|
+
*
|
|
4
|
+
* Checks: gateway reachability, whether each detected tool's config points at
|
|
5
|
+
* the gateway, and whether a personal key is present (vs the shared
|
|
6
|
+
* placeholder). Prints a fix for every problem and exits non-zero when any
|
|
7
|
+
* problem is found, so it's usable as a CI/health gate. Writes nothing.
|
|
8
|
+
*
|
|
9
|
+
* PRIVACY: inspects metadata only (gateway origin, tool base URLs, whether a
|
|
10
|
+
* key is set) — never prompt/response content, and never prints a key.
|
|
11
|
+
*/
|
|
12
|
+
import { REGISTRY } from '../tools/index.js';
|
|
13
|
+
import { loadProfile } from '../util/persist.js';
|
|
14
|
+
import { checkGateway } from '../util/preflight.js';
|
|
15
|
+
import { resolveGatewayOrigin } from './shared.js';
|
|
16
|
+
import { bold, dim, fail, heading, info, ok, warn } from '../util/log.js';
|
|
17
|
+
export const runDoctor = async (args) => {
|
|
18
|
+
const profile = await loadProfile();
|
|
19
|
+
info(bold('Anyray connect — doctor'));
|
|
20
|
+
let origin;
|
|
21
|
+
try {
|
|
22
|
+
origin = resolveGatewayOrigin(args.gateway, profile);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
fail(` Gateway URL: ${error.message}`);
|
|
26
|
+
info(dim(' Fix: pass a gateway URL, e.g. `anyray-connect doctor http://localhost:8787`.'));
|
|
27
|
+
return 1;
|
|
28
|
+
}
|
|
29
|
+
let problems = 0;
|
|
30
|
+
heading('Gateway');
|
|
31
|
+
const probe = await checkGateway(origin);
|
|
32
|
+
if (probe.reachable) {
|
|
33
|
+
ok(` Reachable: ${origin} ${dim(`(${probe.detail})`)}`);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
problems += 1;
|
|
37
|
+
fail(` Unreachable: ${origin} (${probe.detail})`);
|
|
38
|
+
info(dim(' Fix: start the gateway, or check the URL with `anyray-connect status`.'));
|
|
39
|
+
}
|
|
40
|
+
heading('Personal key');
|
|
41
|
+
if (process.env.ANYRAY_CLIENT_KEY?.trim()) {
|
|
42
|
+
ok(' Personal gateway key present ($ANYRAY_CLIENT_KEY).');
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// Not a hard failure — placeholder mode is a valid setup — but worth
|
|
46
|
+
// surfacing, since per-user attribution/savings need a personal key.
|
|
47
|
+
warn(' No personal key — using the shared placeholder.');
|
|
48
|
+
info(dim(' Fix (optional): redeem an invite (`anyray-connect --invite <token>`) or set $ANYRAY_CLIENT_KEY for per-user attribution.'));
|
|
49
|
+
}
|
|
50
|
+
heading('Tools');
|
|
51
|
+
let anyPointed = false;
|
|
52
|
+
for (const adapter of REGISTRY) {
|
|
53
|
+
const detected = await adapter.detect();
|
|
54
|
+
if (!detected.installed) {
|
|
55
|
+
info(dim(` ${adapter.title}: not installed (skipped)`));
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (!adapter.pointsAt) {
|
|
59
|
+
info(dim(` ${adapter.title}: installed (config not introspectable)`));
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const pointed = await adapter.pointsAt(origin);
|
|
63
|
+
if (pointed) {
|
|
64
|
+
anyPointed = true;
|
|
65
|
+
ok(` ${adapter.title}: pointed at ${origin}`);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
problems += 1;
|
|
69
|
+
fail(` ${adapter.title}: installed but not pointed at ${origin}`);
|
|
70
|
+
info(dim(' Fix: run `anyray-connect` to (re)configure it.'));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (!anyPointed && problems === 0) {
|
|
74
|
+
// No introspectable tool is configured and nothing else is wrong — nudge.
|
|
75
|
+
warn(' No tools are pointed at this gateway yet.');
|
|
76
|
+
info(dim(' Fix: run `anyray-connect` to configure your tools.'));
|
|
77
|
+
}
|
|
78
|
+
heading('Summary');
|
|
79
|
+
if (problems === 0) {
|
|
80
|
+
ok(' No problems found.');
|
|
81
|
+
return 0;
|
|
82
|
+
}
|
|
83
|
+
fail(` ${problems} problem(s) found — see fixes above.`);
|
|
84
|
+
return 1;
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for the `anyray-connect` subcommands.
|
|
3
|
+
*
|
|
4
|
+
* The apply/wizard/status/doctor/sync commands all need the same primitives:
|
|
5
|
+
* interactive prompts, identity resolution, and the gateway origin resolved
|
|
6
|
+
* from flags → env → the ~/.anyray cache. Keeping them here lets each command
|
|
7
|
+
* stay small and avoids cli.ts ⇄ command circular imports.
|
|
8
|
+
*
|
|
9
|
+
* PRIVACY: nothing here logs or persists prompt/response content — only the
|
|
10
|
+
* gateway origin and content-free identity (user/team).
|
|
11
|
+
*/
|
|
12
|
+
import { createInterface } from 'node:readline/promises';
|
|
13
|
+
import { resolveOrigin } from '../target.js';
|
|
14
|
+
import { detectDisplayName } from '../util/identity.js';
|
|
15
|
+
import { dim, note } from '../util/log.js';
|
|
16
|
+
export const isInteractive = () => Boolean(process.stdin.isTTY);
|
|
17
|
+
export const confirm = async (question) => {
|
|
18
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
19
|
+
try {
|
|
20
|
+
const answer = (await rl.question(`${question} ${dim('[y/N]')} `)).trim();
|
|
21
|
+
return /^y(es)?$/i.test(answer);
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
rl.close();
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
export const prompt = async (question, defaultValue) => {
|
|
28
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
29
|
+
try {
|
|
30
|
+
const hint = defaultValue ? ` ${dim(`[${defaultValue}]`)}` : '';
|
|
31
|
+
const raw = (await rl.question(`${question}${hint}: `)).trim();
|
|
32
|
+
return raw || defaultValue;
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
rl.close();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
/** Explicit flag wins ('' clears the cache) → cached → detected, prompted on a TTY. */
|
|
39
|
+
export const resolveDisplayName = async (explicit, cached, yes) => {
|
|
40
|
+
if (explicit !== undefined)
|
|
41
|
+
return explicit.trim() || undefined;
|
|
42
|
+
if (cached) {
|
|
43
|
+
note(`Your name: ${cached} ${dim('(cached — pass --user to change)')}`);
|
|
44
|
+
return cached;
|
|
45
|
+
}
|
|
46
|
+
const detected = detectDisplayName();
|
|
47
|
+
// Without a TTY, prompting would block forever on a silent pipe — behave like --yes.
|
|
48
|
+
if (yes || !isInteractive()) {
|
|
49
|
+
note(`Your name: ${detected} ${dim('(auto-detected — pass --user to change)')}`);
|
|
50
|
+
return detected;
|
|
51
|
+
}
|
|
52
|
+
return prompt('? Your name', detected);
|
|
53
|
+
};
|
|
54
|
+
/** Explicit flag wins ('' clears the cache) → cached → optional prompt on a TTY. */
|
|
55
|
+
export const resolveTeam = async (explicit, cached, yes) => {
|
|
56
|
+
if (explicit !== undefined)
|
|
57
|
+
return explicit.trim() || undefined;
|
|
58
|
+
if (cached) {
|
|
59
|
+
note(`Team: ${cached} ${dim('(cached — pass --team to change)')}`);
|
|
60
|
+
return cached;
|
|
61
|
+
}
|
|
62
|
+
if (yes || !isInteractive())
|
|
63
|
+
return undefined;
|
|
64
|
+
return prompt('? Team (optional)');
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Resolve the gateway origin a read-only command should act on: explicit flag →
|
|
68
|
+
* `$ANYRAY_GATEWAY_URL` → the ~/.anyray cache → the default. Validated as an
|
|
69
|
+
* http(s) URL (throws on a bad value).
|
|
70
|
+
*/
|
|
71
|
+
export const resolveGatewayOrigin = (explicit, profile) => {
|
|
72
|
+
const cached = !explicit && !process.env.ANYRAY_GATEWAY_URL ? profile.gateway : undefined;
|
|
73
|
+
return resolveOrigin(explicit ?? cached);
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* The key a read-only request to the gateway should present, in precedence
|
|
77
|
+
* order: an explicit `$ANYRAY_CLIENT_KEY` override, the personal key persisted
|
|
78
|
+
* by a prior invite redemption (`profile.clientKey`), else the shared
|
|
79
|
+
* placeholder. Without the persisted key, `status`/`sync` would send the
|
|
80
|
+
* placeholder and 401 under key enforcement.
|
|
81
|
+
*/
|
|
82
|
+
export const requestKey = (storedKey, placeholder) => process.env.ANYRAY_CLIENT_KEY?.trim() || storedKey?.trim() || placeholder;
|
|
83
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `anyray-connect status` — read-only snapshot of the current setup.
|
|
3
|
+
*
|
|
4
|
+
* Prints which tools are pointed at Anyray (via each adapter's `pointsAt` /
|
|
5
|
+
* `detect`), the active gateway origin, the cached name/team from ~/.anyray, and
|
|
6
|
+
* the dev's content-free savings so far. Writes nothing.
|
|
7
|
+
*
|
|
8
|
+
* PRIVACY: reads metadata only (gateway origin, cached identity, content-free
|
|
9
|
+
* savings aggregates) — never prompt/response content.
|
|
10
|
+
*/
|
|
11
|
+
import { REGISTRY } from '../tools/index.js';
|
|
12
|
+
import { loadProfile } from '../util/persist.js';
|
|
13
|
+
import { resolveGatewayOrigin, requestKey } from './shared.js';
|
|
14
|
+
import { fetchSavings, formatSavingsLine } from '../util/savings.js';
|
|
15
|
+
import { bold, cyan, dim, heading, info, note, ok } from '../util/log.js';
|
|
16
|
+
export const runStatus = async (args) => {
|
|
17
|
+
const profile = await loadProfile();
|
|
18
|
+
let origin;
|
|
19
|
+
try {
|
|
20
|
+
origin = resolveGatewayOrigin(args.gateway, profile);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
info(bold('Anyray connect — status'));
|
|
24
|
+
note(`Gateway: ${error.message}`);
|
|
25
|
+
return 0;
|
|
26
|
+
}
|
|
27
|
+
info(bold('Anyray connect — status'));
|
|
28
|
+
heading('Gateway');
|
|
29
|
+
info(` Origin: ${cyan(origin)}`);
|
|
30
|
+
if (profile.gateway) {
|
|
31
|
+
note(` (cached in ~/.anyray)`);
|
|
32
|
+
}
|
|
33
|
+
else if (process.env.ANYRAY_GATEWAY_URL) {
|
|
34
|
+
note(` (from $ANYRAY_GATEWAY_URL)`);
|
|
35
|
+
}
|
|
36
|
+
else if (!args.gateway) {
|
|
37
|
+
note(` (default — not yet connected; run \`anyray-connect\` to set up)`);
|
|
38
|
+
}
|
|
39
|
+
heading('Identity');
|
|
40
|
+
info(` Name: ${profile.name ?? dim('(not set)')}`);
|
|
41
|
+
info(` Team: ${profile.team ?? dim('(not set)')}`);
|
|
42
|
+
heading('Tools');
|
|
43
|
+
for (const adapter of REGISTRY) {
|
|
44
|
+
const detected = await adapter.detect();
|
|
45
|
+
if (!detected.installed) {
|
|
46
|
+
note(` ${adapter.title}: not installed`);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (!adapter.pointsAt) {
|
|
50
|
+
note(` ${adapter.title}: installed ${dim('(status not introspectable)')}`);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const pointed = await adapter.pointsAt(origin);
|
|
54
|
+
if (pointed) {
|
|
55
|
+
ok(` ${adapter.title}: pointed at Anyray`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
note(` ${adapter.title}: installed, not pointed at this gateway`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Savings: best-effort. An older gateway (404) or a network hiccup just omits
|
|
62
|
+
// the line — status must never fail because the endpoint is missing.
|
|
63
|
+
const key = requestKey(profile.clientKey, 'anyray-placeholder');
|
|
64
|
+
const savings = await fetchSavings(origin, key);
|
|
65
|
+
if (savings) {
|
|
66
|
+
heading('Savings');
|
|
67
|
+
info(` ${formatSavingsLine(savings)}`);
|
|
68
|
+
}
|
|
69
|
+
return 0;
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `anyray-connect sync` — pull the team's shared skills/instructions from the
|
|
3
|
+
* gateway and write them as `SKILL.md` files into each supported tool's skills
|
|
4
|
+
* directory. Only files whose version changed are rewritten; the per-skill
|
|
5
|
+
* version baseline lives in ~/.anyray.
|
|
6
|
+
*
|
|
7
|
+
* PRIVACY: skill bodies are content-free TEAM POLICY text (instructions), not
|
|
8
|
+
* user prompts — persisting them is intended. Nothing here logs prompt/response
|
|
9
|
+
* content, and ~/.anyray keeps only ids + version strings, never bodies.
|
|
10
|
+
*/
|
|
11
|
+
import { REGISTRY } from '../tools/index.js';
|
|
12
|
+
import { loadProfile, saveProfile } from '../util/persist.js';
|
|
13
|
+
import { fetchTeamPolicy, syncPolicyToDirs } from '../util/policySync.js';
|
|
14
|
+
import { resolveGatewayOrigin, requestKey } from './shared.js';
|
|
15
|
+
import { bold, cyan, dim, fail, heading, info, note, ok } from '../util/log.js';
|
|
16
|
+
/** Skills dirs of every adapter that models one (e.g. Claude Code). */
|
|
17
|
+
const collectSkillsDirs = () => {
|
|
18
|
+
const dirs = [];
|
|
19
|
+
for (const adapter of REGISTRY) {
|
|
20
|
+
const dir = adapter.skillsDir?.();
|
|
21
|
+
if (dir)
|
|
22
|
+
dirs.push(dir);
|
|
23
|
+
}
|
|
24
|
+
return dirs;
|
|
25
|
+
};
|
|
26
|
+
export const runSync = async (args) => {
|
|
27
|
+
const profile = await loadProfile();
|
|
28
|
+
info(bold('Anyray connect — sync'));
|
|
29
|
+
let origin;
|
|
30
|
+
try {
|
|
31
|
+
origin = resolveGatewayOrigin(args.gateway, profile);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
fail(error.message);
|
|
35
|
+
return 1;
|
|
36
|
+
}
|
|
37
|
+
note(`Gateway: ${origin}`);
|
|
38
|
+
const skillsDirs = collectSkillsDirs();
|
|
39
|
+
if (skillsDirs.length === 0) {
|
|
40
|
+
warnNoDirs();
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
const key = requestKey(profile.clientKey, 'anyray-placeholder');
|
|
44
|
+
let policy;
|
|
45
|
+
try {
|
|
46
|
+
policy = await fetchTeamPolicy(origin, key);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
// Graceful: a non-200/network error prints the reason and exits non-zero,
|
|
50
|
+
// but never crashes.
|
|
51
|
+
fail(error.message);
|
|
52
|
+
return 1;
|
|
53
|
+
}
|
|
54
|
+
if (policy.skills.length === 0) {
|
|
55
|
+
note('No team skills published yet — nothing to sync.');
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
const summary = await syncPolicyToDirs(policy, skillsDirs, profile.syncedSkills ?? {});
|
|
59
|
+
heading('Skills');
|
|
60
|
+
for (const result of summary.results) {
|
|
61
|
+
if (result.written) {
|
|
62
|
+
ok(` ${result.name} ${dim(`(${result.id}@${result.version})`)} → ${result.files.length} file(s)`);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
note(` ${result.name} ${dim(`(${result.id}@${result.version})`)} — up to date`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Persist the new version baseline (preserving the rest of the profile) so
|
|
69
|
+
// the next sync only rewrites what changed.
|
|
70
|
+
try {
|
|
71
|
+
await saveProfile({
|
|
72
|
+
...profile,
|
|
73
|
+
syncedSkills: summary.versions,
|
|
74
|
+
syncedAt: summary.updatedAt ?? new Date().toISOString(),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
note(`Could not record sync state: ${error instanceof Error ? error.message : String(error)}`);
|
|
79
|
+
}
|
|
80
|
+
heading('Summary');
|
|
81
|
+
info(` ${cyan(String(summary.changed))} updated, ${summary.unchanged} unchanged, across ${skillsDirs.length} tool dir(s).`);
|
|
82
|
+
return 0;
|
|
83
|
+
};
|
|
84
|
+
const warnNoDirs = () => {
|
|
85
|
+
note('No installed tool exposes a skills directory — nothing to sync.');
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/claudeCode.js
CHANGED
|
@@ -116,6 +116,23 @@ export const claudeCode = {
|
|
|
116
116
|
await writeJson(path, settings);
|
|
117
117
|
return { status: 'configured', messages, changedFiles: [path] };
|
|
118
118
|
},
|
|
119
|
+
skillsDir() {
|
|
120
|
+
return join(homedir(), '.claude', 'skills');
|
|
121
|
+
},
|
|
122
|
+
async pointsAt(origin) {
|
|
123
|
+
const path = settingsPath();
|
|
124
|
+
if (!(await fileExists(path)))
|
|
125
|
+
return false;
|
|
126
|
+
try {
|
|
127
|
+
const settings = await readJson(path);
|
|
128
|
+
const env = settings.env;
|
|
129
|
+
const base = env?.ANTHROPIC_BASE_URL;
|
|
130
|
+
return typeof base === 'string' && base.replace(/\/+$/, '') === origin;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
},
|
|
119
136
|
async revert(opts) {
|
|
120
137
|
const path = settingsPath();
|
|
121
138
|
if (!(await fileExists(path))) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claudeCode.js","sourceRoot":"","sources":["../../src/tools/claudeCode.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"claudeCode.js","sourceRoot":"","sources":["../../src/tools/claudeCode.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAkHH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,QAA6B,EACT,EAAE;IACtB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;AACrD,CAAC,CAAC"}
|
package/dist/util/persist.js
CHANGED
|
@@ -1,11 +1,35 @@
|
|
|
1
|
-
import { writeFile, readFile, chmod } from 'node:fs/promises';
|
|
1
|
+
import { writeFile, readFile, chmod, stat } from 'node:fs/promises';
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
// Resolved per-call (not cached) so a changed $HOME is always honored.
|
|
5
|
+
const stateDir = () => join(homedir(), '.anyray');
|
|
6
|
+
/**
|
|
7
|
+
* Where the connect profile lives.
|
|
8
|
+
*
|
|
9
|
+
* Historically this is the file `~/.anyray`. But a locally-run Anyray gateway
|
|
10
|
+
* uses `~/.anyray/` as its DATA DIRECTORY (audit logs etc.), so on a machine
|
|
11
|
+
* that also runs the gateway, `~/.anyray` is a directory and writing it as a
|
|
12
|
+
* file fails with EISDIR. Resolve the collision: when `~/.anyray` is a
|
|
13
|
+
* directory, store the profile as a file inside it; otherwise use the simple
|
|
14
|
+
* `~/.anyray` file. The two states are mutually exclusive (a path is a file or
|
|
15
|
+
* a directory, never both), so no migration is needed.
|
|
16
|
+
*/
|
|
17
|
+
const profilePath = async () => {
|
|
18
|
+
const dir = stateDir();
|
|
19
|
+
try {
|
|
20
|
+
if ((await stat(dir)).isDirectory()) {
|
|
21
|
+
return join(dir, 'connect.json');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
/* missing → use the simple ~/.anyray file path */
|
|
26
|
+
}
|
|
27
|
+
return dir;
|
|
28
|
+
};
|
|
29
|
+
/** Read the connect profile; returns {} on missing or corrupt file. */
|
|
6
30
|
export const loadProfile = async () => {
|
|
7
31
|
try {
|
|
8
|
-
const raw = await readFile(profilePath(), 'utf-8');
|
|
32
|
+
const raw = await readFile(await profilePath(), 'utf-8');
|
|
9
33
|
const parsed = JSON.parse(raw);
|
|
10
34
|
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
11
35
|
return {};
|
|
@@ -15,13 +39,14 @@ export const loadProfile = async () => {
|
|
|
15
39
|
return {};
|
|
16
40
|
}
|
|
17
41
|
};
|
|
18
|
-
/** Write
|
|
42
|
+
/** Write the connect profile (mode 600) — replaced, not merged, so cleared values stay cleared. */
|
|
19
43
|
export const saveProfile = async (profile) => {
|
|
20
44
|
const clean = Object.fromEntries(Object.entries(profile).filter(([, v]) => v !== undefined));
|
|
21
|
-
await
|
|
45
|
+
const path = await profilePath();
|
|
46
|
+
await writeFile(path, `${JSON.stringify(clean, null, 2)}\n`, {
|
|
22
47
|
mode: 0o600,
|
|
23
48
|
});
|
|
24
49
|
// mode only applies on creation — tighten a pre-existing file too.
|
|
25
|
-
await chmod(
|
|
50
|
+
await chmod(path, 0o600);
|
|
26
51
|
};
|
|
27
52
|
//# sourceMappingURL=persist.js.map
|
package/dist/util/persist.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persist.js","sourceRoot":"","sources":["../../src/util/persist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"persist.js","sourceRoot":"","sources":["../../src/util/persist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA0BjC,uEAAuE;AACvE,MAAM,QAAQ,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,MAAM,WAAW,GAAG,KAAK,IAAqB,EAAE;IAC9C,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IACvB,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;IACpD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,uEAAuE;AACvE,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAA4B,EAAE;IAC5D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QACtF,OAAO,MAAuB,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAEF,mGAAmG;AACnG,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,OAAsB,EAAiB,EAAE;IACzE,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAC9B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAC1C,CAAC;IACnB,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;IACjC,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QAC3D,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IACH,mEAAmE;IACnE,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team skills/policy sync (client side).
|
|
3
|
+
*
|
|
4
|
+
* `anyray-connect sync` pulls the org's shared skills/instructions from the
|
|
5
|
+
* gateway and writes them as `SKILL.md` files into each supported coding tool's
|
|
6
|
+
* skills directory (e.g. Claude Code `~/.claude/skills/<id>/SKILL.md`). This is
|
|
7
|
+
* content-free TEAM POLICY text (instructions the org wants its tools to
|
|
8
|
+
* follow) — it is NOT user prompt/response content, so writing it to disk is
|
|
9
|
+
* fine and does not touch the privacy invariant.
|
|
10
|
+
*
|
|
11
|
+
* Contract (gateway-side): `GET <gatewayUrl>/connect/policy` with header
|
|
12
|
+
* `x-anyray-api-key: <personal key or placeholder>` → 200
|
|
13
|
+
* { "skills": [ { "id", "name", "version", "body" } ], "updatedAt": "ISO" }
|
|
14
|
+
*
|
|
15
|
+
* On a non-200 or a network error we fail gracefully with a clear message
|
|
16
|
+
* (never crash). The last-synced version per skill is tracked in ~/.anyray so
|
|
17
|
+
* re-runs only rewrite files whose `version` changed.
|
|
18
|
+
*/
|
|
19
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
const POLICY_TIMEOUT_MS = 10_000;
|
|
22
|
+
const optionalString = (value) => typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
23
|
+
/**
|
|
24
|
+
* A skill `id` becomes a directory name (`<skillsDir>/<id>/SKILL.md`). The
|
|
25
|
+
* gateway only validates it as non-empty, so a malicious or mistyped id like
|
|
26
|
+
* `../../evil` would escape the skills dir and write SKILL.md anywhere. Restrict
|
|
27
|
+
* it to a single safe path segment: a leading alphanumeric, then alphanumerics,
|
|
28
|
+
* `.`, `_`, `-` — which excludes `/`, `\`, `..`, and absolute paths.
|
|
29
|
+
*/
|
|
30
|
+
const isSafeSkillId = (id) => /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(id) && id !== '.' && id !== '..';
|
|
31
|
+
/**
|
|
32
|
+
* Fetch the team policy from the gateway. Throws an Error with a clear,
|
|
33
|
+
* content-free message on non-200 or network failure — callers catch it and
|
|
34
|
+
* print it (no crash).
|
|
35
|
+
*/
|
|
36
|
+
export const fetchTeamPolicy = async (gatewayUrl, apiKey, opts = {}) => {
|
|
37
|
+
const timeoutMs = opts.timeoutMs ?? POLICY_TIMEOUT_MS;
|
|
38
|
+
const url = `${gatewayUrl}/connect/policy`;
|
|
39
|
+
const controller = new AbortController();
|
|
40
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
41
|
+
let res;
|
|
42
|
+
try {
|
|
43
|
+
res = await fetch(url, {
|
|
44
|
+
method: 'GET',
|
|
45
|
+
headers: { 'x-anyray-api-key': apiKey },
|
|
46
|
+
signal: controller.signal,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
const reason = error instanceof Error && error.name === 'AbortError'
|
|
51
|
+
? `no response within ${timeoutMs}ms`
|
|
52
|
+
: error instanceof Error
|
|
53
|
+
? error.message
|
|
54
|
+
: String(error);
|
|
55
|
+
throw new Error(`could not reach the gateway at ${url}: ${reason}`);
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
clearTimeout(timer);
|
|
59
|
+
}
|
|
60
|
+
if (!res.ok) {
|
|
61
|
+
throw new Error(`team policy fetch failed: the gateway responded ${res.status} at ${url}`);
|
|
62
|
+
}
|
|
63
|
+
let body;
|
|
64
|
+
try {
|
|
65
|
+
body = (await res.json());
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
throw new Error('team policy fetch failed: the gateway returned a malformed response');
|
|
69
|
+
}
|
|
70
|
+
const rawSkills = Array.isArray(body.skills) ? body.skills : [];
|
|
71
|
+
const skills = [];
|
|
72
|
+
for (const raw of rawSkills) {
|
|
73
|
+
const entry = raw;
|
|
74
|
+
const id = optionalString(entry?.id);
|
|
75
|
+
const version = optionalString(entry?.version);
|
|
76
|
+
// Skip entries that can't be keyed/diffed; an id+version are required for
|
|
77
|
+
// the SKILL.md path and the version diff. Reject ids that aren't a safe path
|
|
78
|
+
// segment — they'd let a hostile policy write outside the skills dir.
|
|
79
|
+
if (!id || !version || !isSafeSkillId(id))
|
|
80
|
+
continue;
|
|
81
|
+
skills.push({
|
|
82
|
+
id,
|
|
83
|
+
name: optionalString(entry?.name) ?? id,
|
|
84
|
+
version,
|
|
85
|
+
body: typeof entry?.body === 'string' ? entry.body : '',
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return { skills, updatedAt: optionalString(body.updatedAt) };
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Diff the fetched policy against the previously synced versions and write
|
|
92
|
+
* `SKILL.md` for every skill whose version changed into each provided skills
|
|
93
|
+
* dir. Returns a content-free summary plus the new version baseline to persist.
|
|
94
|
+
*
|
|
95
|
+
* Pure I/O over the inputs — fetching and persistence are the caller's job, so
|
|
96
|
+
* this stays unit-testable with a real temp dir and no network.
|
|
97
|
+
*/
|
|
98
|
+
export const syncPolicyToDirs = async (policy, skillsDirs, previousVersions) => {
|
|
99
|
+
const results = [];
|
|
100
|
+
const versions = {};
|
|
101
|
+
let changed = 0;
|
|
102
|
+
let unchanged = 0;
|
|
103
|
+
for (const skill of policy.skills) {
|
|
104
|
+
// Defense-in-depth: never turn an unsafe id into a write path, even if a
|
|
105
|
+
// caller passed skills that didn't go through fetchTeamPolicy's filter.
|
|
106
|
+
if (!isSafeSkillId(skill.id))
|
|
107
|
+
continue;
|
|
108
|
+
versions[skill.id] = skill.version;
|
|
109
|
+
const isUpToDate = previousVersions[skill.id] === skill.version;
|
|
110
|
+
if (isUpToDate) {
|
|
111
|
+
unchanged += 1;
|
|
112
|
+
results.push({
|
|
113
|
+
id: skill.id,
|
|
114
|
+
name: skill.name,
|
|
115
|
+
version: skill.version,
|
|
116
|
+
written: false,
|
|
117
|
+
files: [],
|
|
118
|
+
});
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const files = [];
|
|
122
|
+
for (const dir of skillsDirs) {
|
|
123
|
+
const skillDir = join(dir, skill.id);
|
|
124
|
+
const file = join(skillDir, 'SKILL.md');
|
|
125
|
+
await mkdir(skillDir, { recursive: true });
|
|
126
|
+
// Skill bodies are team policy text (content-free); persisting them is
|
|
127
|
+
// intended. A trailing newline keeps the files diff-friendly.
|
|
128
|
+
await writeFile(file, ensureTrailingNewline(skill.body), 'utf-8');
|
|
129
|
+
files.push(file);
|
|
130
|
+
}
|
|
131
|
+
changed += 1;
|
|
132
|
+
results.push({
|
|
133
|
+
id: skill.id,
|
|
134
|
+
name: skill.name,
|
|
135
|
+
version: skill.version,
|
|
136
|
+
written: true,
|
|
137
|
+
files,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return { results, changed, unchanged, versions, updatedAt: policy.updatedAt };
|
|
141
|
+
};
|
|
142
|
+
const ensureTrailingNewline = (body) => body.endsWith('\n') ? body : `${body}\n`;
|
|
143
|
+
//# sourceMappingURL=policySync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policySync.js","sourceRoot":"","sources":["../../src/util/policySync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Personal savings readout — the tangible number that ends onboarding.
|
|
3
|
+
*
|
|
4
|
+
* Contract (gateway-side): `GET <origin>/connect/savings` with header
|
|
5
|
+
* `x-anyray-api-key: <personal key or placeholder>` → 200
|
|
6
|
+
* { "tokensSaved": number, "savingsUsd": number,
|
|
7
|
+
* "requestCount": number, "windowDays": number }
|
|
8
|
+
*
|
|
9
|
+
* Best-effort: an older gateway returns 404 (or the network fails); callers
|
|
10
|
+
* silently skip the savings line — it must NEVER break the apply flow. Brand-new
|
|
11
|
+
* users see all-zero numbers, which we render as an encouraging "start sending
|
|
12
|
+
* traffic" line rather than "$0.00".
|
|
13
|
+
*
|
|
14
|
+
* PRIVACY: the endpoint returns content-free aggregates only (token counts, a
|
|
15
|
+
* dollar figure, a request count). Nothing here touches prompt/response content.
|
|
16
|
+
*/
|
|
17
|
+
const SAVINGS_TIMEOUT_MS = 5000;
|
|
18
|
+
const finiteNumber = (value) => typeof value === 'number' && Number.isFinite(value) ? value : 0;
|
|
19
|
+
/**
|
|
20
|
+
* Fetch the dev's content-free savings, or `undefined` on any error / non-200
|
|
21
|
+
* (older gateway, network hiccup). Never throws — onboarding must not break.
|
|
22
|
+
*/
|
|
23
|
+
export const fetchSavings = async (origin, apiKey, opts = {}) => {
|
|
24
|
+
const timeoutMs = opts.timeoutMs ?? SAVINGS_TIMEOUT_MS;
|
|
25
|
+
const url = `${origin}/connect/savings`;
|
|
26
|
+
const controller = new AbortController();
|
|
27
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
28
|
+
try {
|
|
29
|
+
const res = await fetch(url, {
|
|
30
|
+
method: 'GET',
|
|
31
|
+
headers: { 'x-anyray-api-key': apiKey },
|
|
32
|
+
signal: controller.signal,
|
|
33
|
+
});
|
|
34
|
+
if (!res.ok)
|
|
35
|
+
return undefined;
|
|
36
|
+
const body = (await res.json());
|
|
37
|
+
return {
|
|
38
|
+
tokensSaved: finiteNumber(body.tokensSaved),
|
|
39
|
+
savingsUsd: finiteNumber(body.savingsUsd),
|
|
40
|
+
requestCount: finiteNumber(body.requestCount),
|
|
41
|
+
windowDays: finiteNumber(body.windowDays),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
clearTimeout(timer);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
/** Round to whole tokens and group with thousands separators. */
|
|
52
|
+
const formatTokens = (tokens) => Math.round(tokens).toLocaleString('en-US');
|
|
53
|
+
/** Two-decimal USD, e.g. `$12.30`. */
|
|
54
|
+
const formatUsd = (usd) => `$${usd.toLocaleString('en-US', {
|
|
55
|
+
minimumFractionDigits: 2,
|
|
56
|
+
maximumFractionDigits: 2,
|
|
57
|
+
})}`;
|
|
58
|
+
/**
|
|
59
|
+
* Render the savings line for onboarding/status. Returns the encouraging
|
|
60
|
+
* zero-state line when there's no traffic yet (no requests / nothing saved).
|
|
61
|
+
*/
|
|
62
|
+
export const formatSavingsLine = (savings) => {
|
|
63
|
+
const noTraffic = savings.requestCount <= 0 ||
|
|
64
|
+
(savings.tokensSaved <= 0 && savings.savingsUsd <= 0);
|
|
65
|
+
if (noTraffic) {
|
|
66
|
+
return 'No savings yet — start sending traffic through Anyray to see them add up.';
|
|
67
|
+
}
|
|
68
|
+
const window = savings.windowDays > 0 ? ` (last ${Math.round(savings.windowDays)}d)` : '';
|
|
69
|
+
return `You've saved ~${formatUsd(savings.savingsUsd)} / ~${formatTokens(savings.tokensSaved)} tokens via Anyray so far${window}.`;
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=savings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"savings.js","sourceRoot":"","sources":["../../src/util/savings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAkBhC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAU,EAAE,CAC9C,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAElE;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,MAAc,EACd,MAAc,EACd,OAAuB,EAAE,EACK,EAAE;IAChC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC;IACvD,MAAM,GAAG,GAAG,GAAG,MAAM,kBAAkB,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE;YACvC,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,SAAS,CAAC;QAC9B,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAC;QAC3D,OAAO;YACL,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;YAC3C,UAAU,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;YACzC,YAAY,EAAE,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;YAC7C,UAAU,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;SAC1C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC,CAAC;AAEF,iEAAiE;AACjE,MAAM,YAAY,GAAG,CAAC,MAAc,EAAU,EAAE,CAC9C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AAE7C,sCAAsC;AACtC,MAAM,SAAS,GAAG,CAAC,GAAW,EAAU,EAAE,CACxC,IAAI,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE;IAC9B,qBAAqB,EAAE,CAAC;IACxB,qBAAqB,EAAE,CAAC;CACzB,CAAC,EAAE,CAAC;AAEP;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAgB,EAAU,EAAE;IAC5D,MAAM,SAAS,GACb,OAAO,CAAC,YAAY,IAAI,CAAC;QACzB,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;IACxD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,2EAA2E,CAAC;IACrF,CAAC;IACD,MAAM,MAAM,GACV,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,OAAO,iBAAiB,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,YAAY,CACtE,OAAO,CAAC,WAAW,CACpB,4BAA4B,MAAM,GAAG,CAAC;AACzC,CAAC,CAAC"}
|
package/dist/util/setupLink.js
CHANGED
|
@@ -74,6 +74,10 @@ export const resolveSetupLink = async (link, opts = {}) => {
|
|
|
74
74
|
if (!gatewayUrl) {
|
|
75
75
|
throw new Error('this setup link has no gateway configured yet — ask your admin to add a gateway in the Anyray console, then re-run.');
|
|
76
76
|
}
|
|
77
|
-
return {
|
|
77
|
+
return {
|
|
78
|
+
gatewayUrl,
|
|
79
|
+
org: optionalString(body.org),
|
|
80
|
+
seatMode: body.seatMode === true,
|
|
81
|
+
};
|
|
78
82
|
};
|
|
79
83
|
//# sourceMappingURL=setupLink.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupLink.js","sourceRoot":"","sources":["../../src/util/setupLink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,qBAAqB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"setupLink.js","sourceRoot":"","sources":["../../src/util/setupLink.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "anyray-connect",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Anyray connect — points local coding tools (Claude Code, Cursor, Windsurf, SDKs) at the Anyray gateway by writing their base URL + a placeholder key. The gateway stays the brain; this is just the on-ramp.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|