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.
Files changed (51) hide show
  1. package/README.md +18 -12
  2. package/dist/assets/vscodeExtensionAsset.js +4 -4
  3. package/dist/assets/vscodeExtensionAsset.js.map +1 -1
  4. package/dist/cli.js +145 -23
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/cursorWatch.js +2 -2
  7. package/dist/commands/cursorWatch.js.map +1 -1
  8. package/dist/commands/doctor.js +33 -1
  9. package/dist/commands/doctor.js.map +1 -1
  10. package/dist/commands/fallbackProxy.js +97 -70
  11. package/dist/commands/fallbackProxy.js.map +1 -1
  12. package/dist/commands/shellHook.js +265 -0
  13. package/dist/commands/shellHook.js.map +1 -0
  14. package/dist/commands/status.js +6 -0
  15. package/dist/commands/status.js.map +1 -1
  16. package/dist/target.js +1 -0
  17. package/dist/target.js.map +1 -1
  18. package/dist/tools/claudeCode.js +19 -9
  19. package/dist/tools/claudeCode.js.map +1 -1
  20. package/dist/tools/claudeCodeEnv.js +23 -9
  21. package/dist/tools/claudeCodeEnv.js.map +1 -1
  22. package/dist/tools/copilotChat.js +5 -2
  23. package/dist/tools/copilotChat.js.map +1 -1
  24. package/dist/tools/cursor.js +439 -54
  25. package/dist/tools/cursor.js.map +1 -1
  26. package/dist/tools/sharedHooks.js +13 -0
  27. package/dist/tools/sharedHooks.js.map +1 -1
  28. package/dist/types.js.map +1 -1
  29. package/dist/util/commandTrim.js +72 -0
  30. package/dist/util/commandTrim.js.map +1 -1
  31. package/dist/util/connectHealth.js +118 -0
  32. package/dist/util/connectHealth.js.map +1 -0
  33. package/dist/util/connectHealthReport.js +100 -0
  34. package/dist/util/connectHealthReport.js.map +1 -0
  35. package/dist/util/cursorPending.js +3 -1
  36. package/dist/util/cursorPending.js.map +1 -1
  37. package/dist/util/devRefresh.js +21 -2
  38. package/dist/util/devRefresh.js.map +1 -1
  39. package/dist/util/fallback.js +27 -2
  40. package/dist/util/fallback.js.map +1 -1
  41. package/dist/util/persist.js +6 -2
  42. package/dist/util/persist.js.map +1 -1
  43. package/dist/util/profileTarget.js +1 -0
  44. package/dist/util/profileTarget.js.map +1 -1
  45. package/dist/util/proxyService.js +53 -3
  46. package/dist/util/proxyService.js.map +1 -1
  47. package/dist/util/verify.js +52 -1
  48. package/dist/util/verify.js.map +1 -1
  49. package/dist/util/vscodeExtension.js +103 -6
  50. package/dist/util/vscodeExtension.js.map +1 -1
  51. 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 OpenAI BYOK chat (Ask/Plan)** Connect updates the exact application-owned custom-endpoint cells with a reversible value backup. If Cursor is running, the write is queued until it quits. `status`/`doctor` verify the base URL, enable toggle, and minted local credential; `doctor --repair` fixes managed drift. | **Automatic** for routed BYOK requests; native Cursor Teams usage can be imported by the official Admin API connector. | Native Agent/Composer, Edit, Tab, indexing, and subscription traffic remain direct. Cursor's ACP command exposes Cursor CLI as an agent server; it is not an inbound custom-provider seam. Cursor's hook can replace oversized MCP results, but its documented `updated_mcp_tool_output` does not replace built-in Shell/Read/Write results. Use Claude Code, Codex, or OpenCode in Cursor's terminal for a fully gateway-routed agent loop. The BYOK lane needs a public TLS gateway and bypasses Connect's unreachable loopback fallback proxy. |
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's BYOK route is a supported UI
77
- setting, but Cursor publishes no managed-config contract for it; Connect's best-effort automation
78
- targets only its exact journaled settings cells. Existing malformed values fail closed. Missing rows
79
- are seeded as first use, so a future release moving the keys cannot be distinguished automatically;
80
- a scheduled repo probe (`connect/scripts/probe-cursor-shape.mjs`) checks each latest Cursor build
81
- still ships the managed cell names, and the UI remains the fallback when the override disappears.
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. Claude Desktop on
182
- Windows fails closed for this selection. Unsupported
183
- first-party endpoints are left untouched. With a
184
- personal gateway key (--enroll / --sso / $ANYRAY_CLIENT_KEY), the key
185
- rides x-anyray-api-key while the seat token stays the bearer.
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 = "8498d029bb403cca82f13b28ba7a6130879163b13989d8ac3fa4d3c26ca813e9";
9
- export const BUNDLED_VSCODE_EXTENSION_DIST_SHA256 = "93b443c04c21d494b6ad0d431f1e34570de8cb1c4c1604235dba3ee129c34112";
10
- export const BUNDLED_VSCODE_EXTENSION_SHA256 = "061cf70a812eeca2f5ea833a2218a6b5011a2671cf62fdc9914b096626b0e09a";
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,0vjBAA0vjB,CAAC"}
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 (ignored for a personal enrollment link).
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 (it sends one tiny request
139
- through the gateway to confirm auth + routing actually work)
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.authMode === "auto") {
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): ${seat.anthropic
1037
- ? cyan("signed in your subscription")
1038
- : dim("not signed in → org key")}`);
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
- // A minimal chat completion is the one request every healthy gateway
1346
- // serves (there is no unauthenticated GET under /v1). "anyray-default"
1347
- // lets the gateway's routing config pick the real model/provider.
1348
- info(dim(
1349
- // Never echo a personal key — point at the tool config it landed in.
1350
- ` curl -sS ${target.openaiBaseUrl}/chat/completions \\\n` +
1351
- ` -H "Content-Type: application/json" \\\n` +
1352
- ` -H "Authorization: Bearer ${target.clientKey
1353
- ? `<your personal key (${maskKey(target.clientKey)}) — see your tool config>`
1354
- : "<enrollment required>"}" \\\n` +
1355
- ` -d '{"model":"anyray-default","messages":[{"role":"user","content":"ping"}],"max_tokens":16}'`));
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);