anyray-connect 0.11.60 → 0.11.62
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 +18 -12
- package/dist/assets/vscodeExtensionAsset.js +4 -4
- package/dist/assets/vscodeExtensionAsset.js.map +1 -1
- package/dist/cli.js +145 -23
- package/dist/cli.js.map +1 -1
- package/dist/commands/cursorWatch.js +2 -2
- package/dist/commands/cursorWatch.js.map +1 -1
- package/dist/commands/doctor.js +33 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/fallbackProxy.js +97 -70
- package/dist/commands/fallbackProxy.js.map +1 -1
- package/dist/commands/shellHook.js +265 -0
- package/dist/commands/shellHook.js.map +1 -0
- package/dist/commands/status.js +6 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/target.js +1 -0
- package/dist/target.js.map +1 -1
- package/dist/tools/claudeCode.js +19 -9
- package/dist/tools/claudeCode.js.map +1 -1
- package/dist/tools/claudeCodeEnv.js +23 -9
- package/dist/tools/claudeCodeEnv.js.map +1 -1
- package/dist/tools/copilotChat.js +5 -2
- package/dist/tools/copilotChat.js.map +1 -1
- package/dist/tools/cursor.js +439 -54
- package/dist/tools/cursor.js.map +1 -1
- package/dist/tools/sharedHooks.js +13 -0
- package/dist/tools/sharedHooks.js.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/util/commandTrim.js +72 -0
- package/dist/util/commandTrim.js.map +1 -1
- package/dist/util/connectHealth.js +118 -0
- package/dist/util/connectHealth.js.map +1 -0
- package/dist/util/connectHealthReport.js +100 -0
- package/dist/util/connectHealthReport.js.map +1 -0
- package/dist/util/cursorPending.js +3 -1
- package/dist/util/cursorPending.js.map +1 -1
- package/dist/util/devRefresh.js +21 -2
- package/dist/util/devRefresh.js.map +1 -1
- package/dist/util/fallback.js +27 -2
- package/dist/util/fallback.js.map +1 -1
- package/dist/util/persist.js +6 -2
- package/dist/util/persist.js.map +1 -1
- package/dist/util/profileTarget.js +1 -0
- package/dist/util/profileTarget.js.map +1 -1
- package/dist/util/proxyService.js +53 -3
- package/dist/util/proxyService.js.map +1 -1
- package/dist/util/verify.js +52 -1
- package/dist/util/verify.js.map +1 -1
- package/dist/util/vscodeExtension.js +103 -6
- package/dist/util/vscodeExtension.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -59,7 +59,7 @@ closed first-party traffic was routed.
|
|
|
59
59
|
| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
60
60
|
| **Claude Code** | **Automatic** — writes the supported `env` block in `~/.claude/settings.json`. | **Automatic** — API-key and Anthropic seat traffic is attributed on the gateway path. | Seat OAuth passes through unchanged; provider routing applies only to API-key traffic. |
|
|
61
61
|
| **Codex app / CLI / IDE** | **Automatic** — all three share `~/.codex/config.toml`; Connect makes the `anyray` provider the default without replacing foreign config. | **Automatic** — API-key and ChatGPT-seat traffic is attributed on the gateway path. | Retrieval is automatic. Source-side tool-output trim remains unavailable: Codex's blocking `PostToolUse` response rejects an already-completed tool promise in code mode, which can make a successful side effect look failed. Connect removes its retired hook rather than risk duplicate execution. Hosted tools and Codex cloud/web tasks also stay outside local hooks. |
|
|
62
|
-
| **Cursor** | **Automatic for
|
|
62
|
+
| **Cursor** | **Automatic for native Team Claude/Opus context hooks by default**: Connect leaves inference and either password or SSO-backed Team sign-in inside Cursor, then installs user-level Shell/MCP hooks plus the retrieval MCP server. The separate OpenAI BYOK custom-model lane requires explicit `--org`; its exact custom-endpoint cells have a reversible backup and queue while Cursor is open. | Hook savings are content-free. BYOK requests that Cursor sends to the custom endpoint are visible on the gateway path. Native inference has no gateway trace. Cursor's docs conflict on Team Admin API availability, so test an `admin:*` key against `/teams/filtered-usage-events`; Anyray can import native usage only when that call succeeds. | No Anthropic key is added in native mode. On macOS/Linux, recognized simple test/search Shell commands run through an exit-code-preserving output reducer; object-valued MCP results use `updated_mcp_tool_output`. Windows keeps MCP handling but skips Shell rewriting. Read/Write, complex Shell, native prompts/responses, and cloud agents remain outside this user-level seam. The opt-in BYOK lane needs public TLS and an upstream API key; its exact Agent wire behavior varies by Cursor release and it cannot consume the Cursor Team entitlement. |
|
|
63
63
|
| **OpenCode** | **Automatic** for direct API providers and its Copilot provider. | **Automatic** for those routed lanes. | Restart OpenCode afterward. Built-in ChatGPT OAuth exposes no endpoint override; use Codex for that seat. |
|
|
64
64
|
| **VS Code Copilot Chat** | **Automatic** on VS Code 1.121+ — Connect installs and configures an explicit Anyray chat provider through VS Code's supported language-model-provider API. | **Automatic** for gateway API-key mode. Copilot-seat/native automatic reporting requires Copilot Business or Enterprise plus the official GitHub connector; the current Anyray connector does not cover Individual plans. | The developer selects an “Anyray · …” chat model. Native Copilot Chat and inline completions remain GitHub traffic. VS Code profiles scope extensions: Connect installs into every profile registered at apply time (config is shared); a profile created later needs a re-run or the official **Apply Extension to all Profiles** action. |
|
|
65
65
|
| **JetBrains AI Assistant** | **Automatic** on IDE 2025.3.2+ with enabled JetBrains AI 253.30387.147+ — registers pinned Claude and Codex ACP launchers in `~/.jetbrains/acp.json`. | **Automatic** on those ACP carriers; native Copilot reporting requires Copilot Business or Enterprise plus the official GitHub connector. | Connect proves both versions from local JetBrains metadata before writing. Native JetBrains AI and Copilot traffic is untouched. A carrier may request its normal provider sign-in on first launch. |
|
|
@@ -73,12 +73,14 @@ only writes routing and attribution configuration; it never reads or persists
|
|
|
73
73
|
prompt/response content. Routed requests are handled by the gateway under the
|
|
74
74
|
deployment's configured content mode.
|
|
75
75
|
|
|
76
|
-
These adapters use application-owned configuration only. Cursor
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
76
|
+
These adapters use application-owned configuration only. Cursor native subscription mode writes no
|
|
77
|
+
model credential or base URL: it owns only its user hooks and one MCP entry. Cursor's separate BYOK
|
|
78
|
+
route is a supported UI setting, but Cursor publishes no managed-config contract for it; Connect's
|
|
79
|
+
best-effort automation targets only its exact journaled settings cells. Existing malformed values
|
|
80
|
+
fail closed. Missing rows are seeded as first use, so a future release moving the keys cannot be
|
|
81
|
+
distinguished automatically; a scheduled repo probe (`connect/scripts/probe-cursor-shape.mjs`)
|
|
82
|
+
checks each latest Cursor build still ships the managed cell names, and the UI remains the fallback
|
|
83
|
+
when the override disappears.
|
|
82
84
|
Claude Desktop similarly publishes its third-party inference UI, not a managed contract for the
|
|
83
85
|
local config-library files. The macOS write is limited to builds verified by a scheduled
|
|
84
86
|
per-release probe, is journaled, and fails closed to the supported UI on every other or
|
|
@@ -178,11 +180,15 @@ on Windows it invokes the `.cmd` through the system `cmd.exe` instead of relying
|
|
|
178
180
|
Honored directly by Claude Code (Anthropic seats) and Codex
|
|
179
181
|
(ChatGPT seats), by Claude Desktop's helper on verified macOS
|
|
180
182
|
builds when the Claude Code Keychain credential is readable,
|
|
181
|
-
and by supported Copilot provider routes.
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
183
|
+
and by supported Copilot provider routes. Cursor is the
|
|
184
|
+
explicit exception: AUTO already keeps its native Team
|
|
185
|
+
credential inside Cursor and installs only the supported local
|
|
186
|
+
hooks/MCP seam; --org is required for Cursor BYOK. Claude
|
|
187
|
+
Desktop on Windows fails closed for
|
|
188
|
+
this selection. Unsupported first-party endpoints are left
|
|
189
|
+
untouched. With a personal gateway key (--enroll / --sso /
|
|
190
|
+
$ANYRAY_CLIENT_KEY), the key rides x-anyray-api-key while a
|
|
191
|
+
routed seat token stays the bearer.
|
|
186
192
|
--dry-run Show what would change without writing
|
|
187
193
|
--yes, -y Skip confirmation (scripted/fleet rollout)
|
|
188
194
|
--revert Undo a previous run: unpick every tool config we wrote and
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* same installable extension without a Marketplace dependency.
|
|
6
6
|
*/
|
|
7
7
|
export const BUNDLED_VSCODE_EXTENSION_VERSION = "0.1.14";
|
|
8
|
-
export const BUNDLED_VSCODE_EXTENSION_SOURCE_SHA256 = "
|
|
9
|
-
export const BUNDLED_VSCODE_EXTENSION_DIST_SHA256 = "
|
|
10
|
-
export const BUNDLED_VSCODE_EXTENSION_SHA256 = "
|
|
11
|
-
export const BUNDLED_VSCODE_EXTENSION_BASE64 = "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";
|
|
8
|
+
export const BUNDLED_VSCODE_EXTENSION_SOURCE_SHA256 = "e071cfb1406ac5a6eca7cea3edef94f2d270a89f720e8a525bc8642eff5e0b51";
|
|
9
|
+
export const BUNDLED_VSCODE_EXTENSION_DIST_SHA256 = "95eefccd0762153769ad73b23e28924dc866d1d84c057832968e7b96fc9b8112";
|
|
10
|
+
export const BUNDLED_VSCODE_EXTENSION_SHA256 = "82ca213b3da54a0f6e168e65887b978a4d3e122a3fb3ebe486f64d9d79ce5f6f";
|
|
11
|
+
export const BUNDLED_VSCODE_EXTENSION_BASE64 = "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";
|
|
12
12
|
//# sourceMappingURL=vscodeExtensionAsset.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vscodeExtensionAsset.js","sourceRoot":"","sources":["../../src/assets/vscodeExtensionAsset.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,QAAQ,CAAC;AACzD,MAAM,CAAC,MAAM,sCAAsC,GACjD,kEAAkE,CAAC;AACrE,MAAM,CAAC,MAAM,oCAAoC,GAC/C,kEAAkE,CAAC;AACrE,MAAM,CAAC,MAAM,+BAA+B,GAC1C,kEAAkE,CAAC;AACrE,MAAM,CAAC,MAAM,+BAA+B,GAC1C,
|
|
1
|
+
{"version":3,"file":"vscodeExtensionAsset.js","sourceRoot":"","sources":["../../src/assets/vscodeExtensionAsset.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,QAAQ,CAAC;AACzD,MAAM,CAAC,MAAM,sCAAsC,GACjD,kEAAkE,CAAC;AACrE,MAAM,CAAC,MAAM,oCAAoC,GAC/C,kEAAkE,CAAC;AACrE,MAAM,CAAC,MAAM,+BAA+B,GAC1C,kEAAkE,CAAC;AACrE,MAAM,CAAC,MAAM,+BAA+B,GAC1C,8vmBAA8vmB,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* stays in the gateway; this only writes supported routing configuration,
|
|
10
10
|
* personal gateway authentication, and content-free attribution.
|
|
11
11
|
*/
|
|
12
|
-
import { isPersonalClientKey, isInsecureRemoteOrigin, resolveOrigin, resolveTarget, withLocalProxy, } from "./target.js";
|
|
12
|
+
import { isPersonalClientKey, isInsecureRemoteOrigin, normalizeOrigin, resolveOrigin, resolveTarget, withLocalProxy, } from "./target.js";
|
|
13
13
|
import { pickFallbackPort, installProxyService, uninstallProxyService, probeHealth, } from "./util/proxyService.js";
|
|
14
14
|
import { clearBundle, clearQueue } from "./util/fallbackStore.js";
|
|
15
15
|
import { runFallbackProxy } from "./commands/fallbackProxy.js";
|
|
@@ -23,6 +23,7 @@ import { checkGateway } from "./util/preflight.js";
|
|
|
23
23
|
import { maskKey } from "./util/redeem.js";
|
|
24
24
|
import { parseEnrollLink, isEnrollArg, resolveEnrollLink, } from "./util/enrollLink.js";
|
|
25
25
|
import { canReuseEnrolledCert, enrollAndVerify, enrollTokenHash, GatewayVerifyError, verifyWithGateway, } from "./util/devVerify.js";
|
|
26
|
+
import { detectDisplayName } from "./util/identity.js";
|
|
26
27
|
import { parseSsoLink, ssoEnroll } from "./util/ssoEnroll.js";
|
|
27
28
|
import { refreshIfDue } from "./util/devRefresh.js";
|
|
28
29
|
import { REGISTRY, byId } from "./tools/index.js";
|
|
@@ -40,6 +41,7 @@ import { runSync } from "./commands/sync.js";
|
|
|
40
41
|
import { runPostToolUseHook } from "./commands/hook.js";
|
|
41
42
|
import { runCodexPostToolUseHook } from "./commands/codexHook.js";
|
|
42
43
|
import { runUserPromptSubmitHook } from "./commands/userPromptHook.js";
|
|
44
|
+
import { runShellPreToolHook, runShellRunCommand, } from "./commands/shellHook.js";
|
|
43
45
|
import { runSsoGateCommand } from "./commands/ssoGate.js";
|
|
44
46
|
import { runSsoPollCommand } from "./commands/ssoPoll.js";
|
|
45
47
|
import { runLoginCommand } from "./commands/login.js";
|
|
@@ -89,7 +91,9 @@ ${bold("Options")}
|
|
|
89
91
|
--user <id> Attribute spend to this user (default: cached name, else
|
|
90
92
|
git config user.name/email, else OS user; '' clears the cache).
|
|
91
93
|
For an enp_ provisioning token: the developer email your MDM
|
|
92
|
-
injects per device
|
|
94
|
+
injects per device. For a shared enrollment link: the
|
|
95
|
+
identity you enroll as (defaults to the detected name).
|
|
96
|
+
Ignored for a personal enrollment link.
|
|
93
97
|
--team <id> Attribute spend to this team ('' clears the cached team)
|
|
94
98
|
--intent <id> Tag traffic with an intent (filterable as intent:<id> in the console)
|
|
95
99
|
--intent-label <s> Human-readable label for the intent
|
|
@@ -125,18 +129,33 @@ ${bold("Options")}
|
|
|
125
129
|
instead of the org API key. Honored by Claude Code (Anthropic
|
|
126
130
|
seats), Codex (ChatGPT seats), and Claude Desktop on verified
|
|
127
131
|
macOS builds with a Claude Code Keychain sign-in. Unsupported
|
|
128
|
-
Desktop platforms fail closed.
|
|
132
|
+
Desktop platforms fail closed. Cursor is the explicit native
|
|
133
|
+
exception: Team/Opus inference remains Cursor-hosted while
|
|
134
|
+
Connect installs only supported local hooks/MCP optimization.
|
|
129
135
|
--placeholder, --org
|
|
130
136
|
Force org API billing for every provider family (never use a
|
|
131
137
|
local seat). The personal ark_ gateway key still authenticates
|
|
132
138
|
the developer. (Default is AUTO: each tool uses a detected
|
|
133
|
-
subscription where supported, else org API billing.
|
|
139
|
+
subscription where supported, else org API billing. Cursor is
|
|
140
|
+
always native Team mode under AUTO; only --org enables its
|
|
141
|
+
separate API-key BYOK lane.)
|
|
142
|
+
--upstream <url> BYO upstream: your org's Anthropic-compatible endpoint
|
|
143
|
+
(e.g. a LiteLLM proxy). Requires --upstream-key. Your
|
|
144
|
+
personal upstream key passes through the gateway verbatim
|
|
145
|
+
(x-anyray-auth-mode: passthrough + x-anyray-custom-host) —
|
|
146
|
+
the org's server-held provider key is never used. The
|
|
147
|
+
upstream host must be allowlisted on the gateway
|
|
148
|
+
(ANYRAY_CUSTOM_HOST_ALLOWLIST). Honored by Claude Code.
|
|
149
|
+
--upstream-key <key>
|
|
150
|
+
Your personal key for the --upstream endpoint (e.g. your
|
|
151
|
+
LiteLLM virtual key). Stored locally (mode 600) and in the
|
|
152
|
+
tool config, never sent to Anyray's control plane.
|
|
134
153
|
--tools <ids> Comma-separated subset: ${REGISTRY.map((t) => t.id).join(", ")}
|
|
135
154
|
--dry-run Show what would change without writing anything
|
|
136
155
|
--yes, -y Don't prompt for confirmation (for scripted rollout)
|
|
137
156
|
--force Skip the gateway reachability check before writing
|
|
138
|
-
--skip-verify Skip the post-apply smoke test (
|
|
139
|
-
|
|
157
|
+
--skip-verify Skip the post-apply smoke test (one tiny inference request for
|
|
158
|
+
routed tools, or a key-only check for native Cursor mode)
|
|
140
159
|
--fallback Opt in to the local fallback proxy: a small daemon on
|
|
141
160
|
127.0.0.1 your tools point at. It forwards to the gateway,
|
|
142
161
|
and if the gateway is unavailable or returns a transient
|
|
@@ -158,6 +177,21 @@ ${bold("What it does")}
|
|
|
158
177
|
metadata (user/team) is attached — never prompt content.
|
|
159
178
|
~/.anyray (mode 600) remembers your gateway, name/team, personal key, and the
|
|
160
179
|
per-skill versions ${dim("sync")} last wrote — for zero-question re-runs.`;
|
|
180
|
+
/**
|
|
181
|
+
* The identity submitted with an `--enroll` redemption. A SHARED link binds no
|
|
182
|
+
* identity, and the control plane refuses an identity-less redemption (it has
|
|
183
|
+
* nothing to put in the DevCert / attribute spend to) — so when `--user` is
|
|
184
|
+
* absent, fall back to the same detected identity the apply flow attributes
|
|
185
|
+
* spend with. Personal links ignore this server-side (pre-bound identity wins),
|
|
186
|
+
* and connect adopts the cert's user afterwards, so roster, cert, and spend
|
|
187
|
+
* attribution all carry one identity. `--user ''` is the documented cache-clear
|
|
188
|
+
* sentinel (and `?? ` would pass it through), so blank values fall back too —
|
|
189
|
+
* the CP refuses an identity-less shared redemption.
|
|
190
|
+
*/
|
|
191
|
+
export const enrollIdentity = (user) => {
|
|
192
|
+
const explicit = user?.trim();
|
|
193
|
+
return explicit ? explicit : detectDisplayName();
|
|
194
|
+
};
|
|
161
195
|
export const parseArgs = (argv) => {
|
|
162
196
|
const args = {
|
|
163
197
|
subscription: false,
|
|
@@ -210,6 +244,12 @@ export const parseArgs = (argv) => {
|
|
|
210
244
|
case "--org":
|
|
211
245
|
args.placeholder = true;
|
|
212
246
|
break;
|
|
247
|
+
case "--upstream":
|
|
248
|
+
args.upstream = next();
|
|
249
|
+
break;
|
|
250
|
+
case "--upstream-key":
|
|
251
|
+
args.upstreamKey = next();
|
|
252
|
+
break;
|
|
213
253
|
case "--tools":
|
|
214
254
|
args.tools = (next() ?? "")
|
|
215
255
|
.split(",")
|
|
@@ -279,7 +319,13 @@ const selectAdapters = (ids) => {
|
|
|
279
319
|
const printTarget = (target, adapters) => {
|
|
280
320
|
heading("Gateway target");
|
|
281
321
|
info(` Origin: ${cyan(target.origin)}`);
|
|
282
|
-
if (target.
|
|
322
|
+
if (target.byoUpstream) {
|
|
323
|
+
info(` Auth: BYO upstream key ${dim(`(passthrough to ${target.byoUpstream.url}; Claude Code)`)}`);
|
|
324
|
+
if (target.clientKey) {
|
|
325
|
+
info(` Client key: personal gateway key (${maskKey(target.clientKey)}) ${dim("rides x-anyray-api-key")}`);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
else if (target.authMode === "auto") {
|
|
283
329
|
const claude = effectiveSubscription(target, "anthropic")
|
|
284
330
|
? cyan("your subscription")
|
|
285
331
|
: "org key";
|
|
@@ -303,6 +349,10 @@ const printTarget = (target, adapters) => {
|
|
|
303
349
|
else {
|
|
304
350
|
info(` Enrollment: ${dim("required before a real apply (no configuration will be written)")}`);
|
|
305
351
|
}
|
|
352
|
+
if (target.authMode !== "placeholder" &&
|
|
353
|
+
adapters.some((adapter) => adapter.id === "cursor")) {
|
|
354
|
+
info(` Cursor: ${cyan("native Team subscription")} ${dim("(Claude/Opus inference remains Cursor-hosted; Anyray hooks/MCP optimize supported local context)")}`);
|
|
355
|
+
}
|
|
306
356
|
if (adapters.some((adapter) => adapter.id === "claude-desktop")) {
|
|
307
357
|
if (effectiveSubscription(target, "anthropic")) {
|
|
308
358
|
info(` Claude Desktop: ${cyan("subscription-backed Gateway lane")} ${dim("(verified macOS builds; Windows fails closed)")}`);
|
|
@@ -581,6 +631,21 @@ export const run = async (argv) => {
|
|
|
581
631
|
if (argv[0] === "__anyray-prompt-hook") {
|
|
582
632
|
return runUserPromptSubmitHook();
|
|
583
633
|
}
|
|
634
|
+
// Cursor `preToolUse` (matcher `Shell`) — Cursor discards a postToolUse
|
|
635
|
+
// replacement for built-in tools, so Shell output is trimmed by REWRITING the
|
|
636
|
+
// command to run through `__anyray-shell-run`. Fails open (empty stdout ⇒
|
|
637
|
+
// Cursor's normal flow). Speaks the hook stdin/stdout protocol; dispatch
|
|
638
|
+
// before any human-facing logging. Never throws.
|
|
639
|
+
if (argv[0] === "__anyray-shell-pretool") {
|
|
640
|
+
return runShellPreToolHook();
|
|
641
|
+
}
|
|
642
|
+
// The wrapper the rewrite points at: runs the original Shell command via argv
|
|
643
|
+
// (no shell), trims its output through the shared pipeline, and exits with the
|
|
644
|
+
// command's real exit code. Its stdout is the (trimmed) command output Cursor
|
|
645
|
+
// captures, so it must run before any human-facing logging.
|
|
646
|
+
if (argv[0] === "__anyray-shell-run") {
|
|
647
|
+
return runShellRunCommand(argv.slice(1));
|
|
648
|
+
}
|
|
584
649
|
// Deferred managed enrollment: the prompt gate receives only configuration
|
|
585
650
|
// in argv and discards hook stdin; the detached poller receives its secret
|
|
586
651
|
// handoff only through stdin. Both must dispatch before human-facing output.
|
|
@@ -745,7 +810,51 @@ const runApplyCommand = async (argv, forceWizard) => {
|
|
|
745
810
|
fail("--revert cannot be combined with --sso or --enroll. It removes Anyray configuration; re-run with --sso <link> --yes (without --revert) to configure a new CLI.");
|
|
746
811
|
return 1;
|
|
747
812
|
}
|
|
813
|
+
if (Boolean(args.upstream) !== Boolean(args.upstreamKey)) {
|
|
814
|
+
fail("--upstream and --upstream-key go together: the URL says where your personal key is valid, the key is what the gateway forwards there.");
|
|
815
|
+
return 1;
|
|
816
|
+
}
|
|
817
|
+
if (args.upstream && (args.subscription || args.placeholder)) {
|
|
818
|
+
fail("--upstream cannot be combined with --subscription or --org: BYO passthrough sends your personal upstream key — not a seat OAuth token, and never the org's server-held key.");
|
|
819
|
+
return 1;
|
|
820
|
+
}
|
|
821
|
+
let byoUpstream;
|
|
822
|
+
if (args.upstream) {
|
|
823
|
+
let parsed;
|
|
824
|
+
try {
|
|
825
|
+
parsed = new URL(args.upstream.trim());
|
|
826
|
+
}
|
|
827
|
+
catch {
|
|
828
|
+
fail(`invalid --upstream URL: "${args.upstream}"`);
|
|
829
|
+
return 1;
|
|
830
|
+
}
|
|
831
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
832
|
+
fail(`invalid --upstream URL: "${args.upstream}" — must start with http:// or https://`);
|
|
833
|
+
return 1;
|
|
834
|
+
}
|
|
835
|
+
const key = args.upstreamKey.trim();
|
|
836
|
+
if (!key) {
|
|
837
|
+
fail("--upstream-key must not be empty.");
|
|
838
|
+
return 1;
|
|
839
|
+
}
|
|
840
|
+
// x-anyray-custom-host replaces the provider's base host: no trailing /v1.
|
|
841
|
+
byoUpstream = { url: normalizeOrigin(args.upstream), key };
|
|
842
|
+
}
|
|
748
843
|
const profile = await loadProfile();
|
|
844
|
+
// A plain re-run keeps the stored BYO upstream (like the gateway URL);
|
|
845
|
+
// forcing another lane (--org / --subscription) or reverting drops it.
|
|
846
|
+
if (!byoUpstream &&
|
|
847
|
+
!args.subscription &&
|
|
848
|
+
!args.placeholder &&
|
|
849
|
+
!args.revert) {
|
|
850
|
+
byoUpstream = profile.byoUpstream;
|
|
851
|
+
}
|
|
852
|
+
// On a gateway outage the daemon would route to the provider's PUBLIC API
|
|
853
|
+
// host, sending the personal upstream key to a third party.
|
|
854
|
+
if (byoUpstream && args.fallback) {
|
|
855
|
+
fail("--fallback is not supported with a BYO upstream: the fallback daemon routes to the provider's public API host, where your personal upstream key must never be sent.");
|
|
856
|
+
return 1;
|
|
857
|
+
}
|
|
749
858
|
// Wizard: explicit `wizard` subcommand, or a bare interactive invocation
|
|
750
859
|
// (no gateway, not a revert/dry-run/scripted run). Non-TTY always falls
|
|
751
860
|
// through to the flag-driven flow.
|
|
@@ -973,7 +1082,7 @@ const runApplyCommand = async (argv, forceWizard) => {
|
|
|
973
1082
|
await runEnrollment({
|
|
974
1083
|
cpOrigin: link.cpOrigin,
|
|
975
1084
|
token: link.token,
|
|
976
|
-
email: args.user,
|
|
1085
|
+
email: enrollIdentity(args.user),
|
|
977
1086
|
team: args.team,
|
|
978
1087
|
machineId,
|
|
979
1088
|
deploymentId: enrollDeploymentId,
|
|
@@ -1033,9 +1142,11 @@ const runApplyCommand = async (argv, forceWizard) => {
|
|
|
1033
1142
|
if (!args.revert && !args.subscription && !args.placeholder) {
|
|
1034
1143
|
seat = await detectSeatState();
|
|
1035
1144
|
heading("Detecting your sign-ins");
|
|
1036
|
-
info(` Claude (Anthropic): ${
|
|
1037
|
-
? cyan("
|
|
1038
|
-
:
|
|
1145
|
+
info(` Claude (Anthropic): ${byoUpstream
|
|
1146
|
+
? cyan("BYO upstream key (passthrough)")
|
|
1147
|
+
: seat.anthropic
|
|
1148
|
+
? cyan("signed in → your subscription")
|
|
1149
|
+
: dim("not signed in → org key")}`);
|
|
1039
1150
|
info(` Codex (ChatGPT): ${seat.openai
|
|
1040
1151
|
? cyan("signed in → your subscription")
|
|
1041
1152
|
: dim("not signed in → org key")}`);
|
|
@@ -1046,6 +1157,7 @@ const runApplyCommand = async (argv, forceWizard) => {
|
|
|
1046
1157
|
clientKey,
|
|
1047
1158
|
subscription: args.subscription,
|
|
1048
1159
|
placeholder: args.placeholder,
|
|
1160
|
+
byoUpstream,
|
|
1049
1161
|
seat,
|
|
1050
1162
|
user: resolvedUser,
|
|
1051
1163
|
team: resolvedTeam,
|
|
@@ -1185,6 +1297,7 @@ const runApplyCommand = async (argv, forceWizard) => {
|
|
|
1185
1297
|
? profile.clientKeyExpiresAt
|
|
1186
1298
|
: undefined)),
|
|
1187
1299
|
authMode: target.authMode,
|
|
1300
|
+
byoUpstream: target.byoUpstream,
|
|
1188
1301
|
fallbackEnabled: resolvedFallbackEnabled,
|
|
1189
1302
|
fallbackPort: resolvedFallbackPort,
|
|
1190
1303
|
};
|
|
@@ -1259,7 +1372,7 @@ const runApplyCommand = async (argv, forceWizard) => {
|
|
|
1259
1372
|
!args.dryRun &&
|
|
1260
1373
|
(profile.fallbackEnabled || profile.fallbackPort)) {
|
|
1261
1374
|
heading("Local fallback proxy");
|
|
1262
|
-
const svc = await uninstallProxyService();
|
|
1375
|
+
const svc = await uninstallProxyService(profile.fallbackPort);
|
|
1263
1376
|
for (const m of svc.messages)
|
|
1264
1377
|
info(` ${m}`);
|
|
1265
1378
|
await clearBundle();
|
|
@@ -1342,17 +1455,26 @@ const runApplyCommand = async (argv, forceWizard) => {
|
|
|
1342
1455
|
await runVerify(target, adapters.map((a) => a.id));
|
|
1343
1456
|
}
|
|
1344
1457
|
info("\nRe-test by hand any time:");
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
`
|
|
1458
|
+
const nativeCursorOnly = target.authMode !== "placeholder" &&
|
|
1459
|
+
adapters.length === 1 &&
|
|
1460
|
+
adapters[0]?.id === "cursor";
|
|
1461
|
+
if (nativeCursorOnly) {
|
|
1462
|
+
info(dim(` curl -sS ${target.origin}/connect/savings \\\n` +
|
|
1463
|
+
` -H "x-anyray-api-key: $(anyray-connect print-key)"`));
|
|
1464
|
+
info(dim(" Validate Opus itself inside Cursor: keep the Team login, select a native Claude Opus model, and run an Agent prompt."));
|
|
1465
|
+
}
|
|
1466
|
+
else {
|
|
1467
|
+
// A minimal chat completion is the one request every API-routed gateway
|
|
1468
|
+
// serves. `anyray-default` lets gateway policy choose model/provider.
|
|
1469
|
+
info(dim(
|
|
1470
|
+
// Never echo a personal key — point at the tool config it landed in.
|
|
1471
|
+
` curl -sS ${target.openaiBaseUrl}/chat/completions \\\n` +
|
|
1472
|
+
` -H "Content-Type: application/json" \\\n` +
|
|
1473
|
+
` -H "Authorization: Bearer ${target.clientKey
|
|
1474
|
+
? `<your personal key (${maskKey(target.clientKey)}) — see your tool config>`
|
|
1475
|
+
: "<enrollment required>"}" \\\n` +
|
|
1476
|
+
` -d '{"model":"anyray-default","messages":[{"role":"user","content":"ping"}],"max_tokens":16}'`));
|
|
1477
|
+
}
|
|
1356
1478
|
info(dim(" Revert: npx anyray-connect --revert"));
|
|
1357
1479
|
// Close onboarding with the tangible savings number (best-effort).
|
|
1358
1480
|
await printSavings(target);
|