@closedrouter/cli 1.1.8 → 1.1.10

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 CHANGED
@@ -125,12 +125,54 @@ cr logout
125
125
  ```
126
126
 
127
127
  ### `cr start` / `cr launch`
128
+
129
+ Run `cr start` to choose a CLI or desktop app from the tool selector. Desktop entries are labeled Codex Desktop, Antigravity Desktop, Cursor Desktop, and Claude Desktop. Use `cr start --desktop` to show only desktop apps. Explicit tool names such as `cr start codex` still default to the CLI; add `--desktop` to launch the app. The names `codex-desktop`, `claude-desktop`, `cursor-desktop`, and `antigravity-desktop` also work.
130
+
131
+ ```bash
132
+ cr start codex --desktop --model gpt-4.1
133
+ cr start claude --desktop --model claude-sonnet-4-6
134
+ cr start cursor --desktop --model gpt-4o-mini
135
+ cr start antigravity --desktop --model gpt-5-nano
136
+ cr start codex --desktop --open-only
137
+ # Override app discovery with a macOS bundle or an executable on any platform
138
+ cr start claude --desktop --model claude-sonnet-4-6 --path /Applications/Claude.app
139
+ ```
140
+
141
+ | Desktop app | Support |
142
+ | --- | --- |
143
+ | Codex | Configures a Responses provider and API-key authentication in an isolated `CODEX_HOME`. |
144
+ | Claude | Configures its native `3p` gateway profile, displays the selected pool model, and maps the compatible Anthropic transport name to that model. No Claude subscription or login is required for gateway sessions. |
145
+ | Cursor | Enables the bundled local agent engine in the launched process and routes requests directly through the ClosedRouter relay. Existing logins are reused. Without a login, the UI accepts the configured provider key and skips the login screen. No Cursor subscription is used for inference. |
146
+ | Antigravity | On macOS, installs a process-local request hook and translates Cloud Code generation envelopes into Gemini gateway requests for the selected pool model. Account and model-discovery traffic uses the existing `antigravity-mods` proxy. Requires its daemon running on ports 59997 and 59998. |
147
+
148
+ Desktop launches follow the isolation and gateway configuration in `reference_repos/cockpit-tools`. Each launch creates a new Electron profile under `~/.closedrouter/desktop/<tool>/`, or your `CLOSEDROUTER_CONFIG_DIR`. Those profiles retain the app's session files. Cursor copies only its login state, and Antigravity retains its native language-server account and conversation store for compatibility with `antigravity-mods`. Use `--open-only` to open an app without creating a gateway configuration or requiring ClosedRouter login. An open-only Antigravity instance continues using your existing account-rotation hook when that daemon is running.
149
+
150
+ Desktop clients use a streaming loopback relay with a per-launch local credential. The platform key stays in the launcher process. Cursor's local engine uses the relay directly, so the gateway does not need to be publicly reachable from Cursor's servers. Generated files and profile directories start with private permissions. Keep `cr` running and close the launched app instance to end the session. Interrupting `cr` stops local routing; macOS may leave the app open. Start a new session with `cr start` to reconnect.
151
+
152
+ Cursor's startup hook enables local provider mode in memory and serves an app-owned workbench script. The installed app files and signature are preserved. All tool-capable pool models are offered, including Claude and Gemini names. The relay pins requests to the selected model, avoiding Cursor's built-in Fireworks aliases. Native model and login controllers are checked before injection; unsupported app builds fail with an update instruction. A valid existing login retains its normal authentication policy checks. Set `CLOSEDROUTER_CURSOR_AUTH_DB` to a different SQLite source, or a nonexistent path to test the no-login case.
153
+
154
+ Claude normally uses its signed native app and gateway configuration, without a debugger. For a startup hook, use `cr start claude --desktop --desktop-inspector`. The launcher reuses a compatible Electron runtime already installed by Cockpit, or the executable supplied through `CLOSEDROUTER_CLAUDE_ELECTRON`. It runs the installed Claude archive and resources under that runtime, avoiding an app copy or signing changes. The inspector binds to loopback and closes after injection. If no compatible runtime is available, native gateway mode remains available without the option. The displayed model label identifies the actual pool model; the Anthropic transport ID is an internal compatibility name.
155
+
156
+ Antigravity uses the CCPA envelope conversion documented in `~/Projects/antigravity-mods`. The launcher briefly opens a loopback Node inspector, installs its language-server spawn hook before the app starts, then closes the inspector. It overrides generation routing only in the launched process and prevents the global mods daemon from overwriting that session's endpoint. App bundles and global hook configuration are not modified. The app still displays its native model names; the actual pool model is the one selected by `cr start`. Unsupported launcher builds fail before opening; `--open-only` remains available.
157
+
158
+ macOS app bundles are discovered in `/Applications` and `~/Applications`. Common Windows and Linux installation paths are checked, with `--path` available for other installations. Live conversation tests verified the installed Cursor, Claude Code desktop view, and Antigravity apps using a ClosedRouter OpenAI route. Cursor was tested with no OAuth tokens and no paid login. Gemma's route reached Google's API, but the full agent request received an upstream quota error; provider quotas still apply. Desktop hooks are verified against inspected app builds and fail closed when expected controllers change. See the [Codex provider configuration](https://developers.openai.com/codex/config-advanced) and [Electron fuse documentation](https://www.electronjs.org/docs/latest/tutorial/fuses) for configuration and inspector behavior.
159
+
160
+ The model picker uses ClosedRouter's lime selection accent, colored provider names, gold favorites, and a framed live-search field. Wide terminals show details for the highlighted model beside the list. Smaller terminals use a compact layout. Closing the picker restores your previous terminal screen. Color adapts to truecolor, 256-color, or standard ANSI terminals; set `NO_COLOR=1` for plain text.
161
+
128
162
  Configure and start an installed coding CLI using models exposed to your platform key. The command discovers available tool-capable models and keeps keys out of arguments and generated client profiles. Starting Claude Code as a client uses the Anthropic-compatible platform endpoint; `cr gateway` separately contributes a local Claude Code subscription to the shared pool.
129
163
 
130
164
  ```bash
131
165
  # Interactive model and tool selection
132
166
  cr start
133
167
 
168
+ # Save the selector grouping, or open interactive settings with cr settings
169
+ cr settings --model-grouping model-provider
170
+ cr settings --model-grouping account-provider
171
+ cr settings --model-grouping none
172
+
173
+ # Override grouping for one launch
174
+ cr start codex --group-by account-provider
175
+
134
176
  # Start a selected tool and model
135
177
  cr start claude --model claude-sonnet-4-6
136
178
  cr start codex --model gpt-4.1
@@ -138,13 +180,33 @@ cr start gemini --model gemini-2.5-flash
138
180
  cr start agy --model gpt-5-nano
139
181
  cr start aider --model gpt-4o-mini
140
182
  cr start opencode --model gpt-4o-mini
183
+ cr start cursor --model gpt-4o-mini
141
184
 
142
185
  # Forward arguments to the coding tool
143
186
  cr start claude --model claude-sonnet-4-6 -- --resume
144
187
  ```
145
188
 
189
+ The model selector lists every account provider in brackets, for example `claude-sonnet-4-6 [Antigravity, Claude Code]`. Type to filter models and provider names as you type. Use Up/Down to move, Enter to start, and `*` to favorite or unfavorite the highlighted model. Favorites appear first within each group, or at the top of the ungrouped list. Backspace edits the search, Ctrl+U clears it, and Esc clears a search or cancels an empty search.
190
+
191
+ Tab cycles between grouping by model owner, grouping by account provider, and one ungrouped model list. Tab also saves the grouping for future launches. Models with multiple account providers appear in each provider's group; selecting any entry launches the same pool model. Grouping and favorites are stored locally in `~/.closedrouter/config.json` and survive logout. Older servers that omit provider metadata show `provider info unavailable` until the server is updated.
192
+
146
193
  Claude Code uses the Anthropic-compatible endpoint and can route through any eligible provider account. Codex gets a separate `~/.codex/closedrouter-launch.config.toml` profile using the Responses API. Gemini gets an app-owned authentication settings file under `~/.closedrouter/`, and OpenCode receives inline launch configuration. Antigravity CLI requires `modelProvider: "gemini"` in `~/.gemini/antigravity-cli/settings.json`. Its launcher starts a local adapter that maps Antigravity's built-in Gemini model name to the tool-capable pool model you select. The adapter binds only to localhost and stops when Antigravity exits. The launchers do not change the tools' main configuration files.
147
194
 
195
+ Cursor CLI launch support uses the separate **Cursor Agent Local** preview package, tested with version `2026.09.28-64d2043`. Install it on macOS or Linux using Cursor's installer:
196
+
197
+ ```bash
198
+ curl -fsSL 'https://cursor.com/internal-local-install-nHZIc6RZgTXIfai0aO?darwin=true&channel=prod' | bash
199
+ cr start cursor --model gpt-4o-mini
200
+
201
+ # Use an installation outside PATH
202
+ cr start cursor --model gpt-4o-mini --path /path/to/cursor-agent-local
203
+
204
+ # Run a headless prompt through the pool
205
+ cr start cursor --model gpt-4o-mini -- --print "Explain this project"
206
+ ```
207
+
208
+ The standard Cursor `agent` / `cursor-agent` package does not include this local runtime. ClosedRouter checks for `agent-local` or `cursor-agent-local`, starts it in authless mode, and points its OpenAI-compatible requests at the launch relay. Model calls and function tools use the selected pool model. A Cursor account or Cursor API key is not required. Global Cursor settings and history for these launches live under `~/.closedrouter/cursor-launch`, or under your `CLOSEDROUTER_CONFIG_DIR` override. The launcher keeps the platform key in the child environment and rejects forwarded model, provider, and authentication overrides. The separate package and its installer are experimental and may change between Cursor releases.
209
+
148
210
  Cursor SDK keys can also be connected in the web account dialog or imported from `CURSOR_API_KEY`. ClosedRouter discovers models using Cursor's SDK and sends text-only, tools-disabled SDK runs through its normal gateway and telemetry path. This credential type is separate from Cursor OAuth tokens imported from the editor.
149
211
 
150
212
  Desktop application launch support is deferred from the MVP. Antigravity credentials and models remain available through the account pool and compatible gateway endpoints.
@@ -1,5 +1,5 @@
1
1
  /** Streaming transport relay: inject attribution for clients with no custom-header setting. */
2
- export declare function startLaunchProxy(gatewayUrl: string, apiKey: string, harness: string): Promise<{
2
+ export declare function startLaunchProxy(gatewayUrl: string, apiKey: string, harness: string, localKey?: string, modelOverride?: string): Promise<{
3
3
  baseUrl: string;
4
4
  launchId: `${string}-${string}-${string}-${string}-${string}`;
5
5
  close: () => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"launch-proxy.d.ts","sourceRoot":"","sources":["../../src/bridge/launch-proxy.ts"],"names":[],"mappings":"AAMA,+FAA+F;AAC/F,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;;GAqDzF"}
1
+ {"version":3,"file":"launch-proxy.d.ts","sourceRoot":"","sources":["../../src/bridge/launch-proxy.ts"],"names":[],"mappings":"AAMA,+FAA+F;AAC/F,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAS,EAAE,aAAa,CAAC,EAAE,MAAM;;;;GAmFpI"}
package/dist/client.d.ts CHANGED
@@ -27,6 +27,15 @@ export interface AccountPayload {
27
27
  max_concurrency?: number;
28
28
  credentials: Record<string, string>;
29
29
  }
30
+ export interface GatewayModel {
31
+ id?: string;
32
+ name?: string;
33
+ owned_by?: string;
34
+ provider_types?: string[];
35
+ supported_parameters?: string[];
36
+ status?: string;
37
+ available_tool_account_count?: number;
38
+ }
30
39
  export declare class ClosedRouterClient {
31
40
  private baseUrl;
32
41
  private sessionToken?;
@@ -54,7 +63,7 @@ export declare class ClosedRouterClient {
54
63
  listApiKeys(): Promise<Record<string, any>[]>;
55
64
  listGatewayModels(options?: {
56
65
  preferApiKey?: boolean;
57
- }): Promise<Record<string, any>[]>;
66
+ }): Promise<GatewayModel[]>;
58
67
  listClaudeBridgeModels(): Promise<string[]>;
59
68
  listBridgeNodes(): Promise<Record<string, any>[]>;
60
69
  formatAccountForIngestion(account: DiscoveredAccount, isShared?: boolean, includeProviderDefaults?: boolean): AccountPayload;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAS;IAExB,YAAY,OAAO,EAAE,gBAAgB,EAIpC;IAED,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEnC;IAED,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3B;IAED,OAAO,CAAC,UAAU;IAgBZ,WAAW,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAc/E;IAEK,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAqCjF;IAEK,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAqCnE;IAED,OAAO,CAAC,cAAc;IAUhB,UAAU,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAoB/E;IAEK,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAUnD;IAEK,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAqBzE;IAEK,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,EACrB,aAAa,CAAC,EAAE,MAAM,EAAE,EACxB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CA0B9B;IAEK,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAclD;IAEK,iBAAiB,CAAC,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAUhG;IAEK,sBAAsB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CA+BhD;IAEK,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAUtD;IAED,yBAAyB,CACvB,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,CAAC,EAAE,OAAO,EAClB,uBAAuB,UAAO,GAC7B,cAAc,CA2BhB;CACF"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { DesktopLaunchPlan } from "./desktop-launch";
2
+ export declare function assertAntigravityModsAvailable(): Promise<void>;
3
+ export declare function assertAntigravityDesktopHookSupport(executable: string): void;
4
+ /** The same CCPA envelope bridge used by antigravity-mods, with ClosedRouter
5
+ * handling model selection and credentials. Account/discovery traffic continues
6
+ * through the user's existing account-rotation proxy. */
7
+ export declare function startAgyDesktopProxy(gatewayUrl: string, localKey: string, model: string, modsUrl?: string): Promise<{
8
+ baseUrl: string;
9
+ close: () => Promise<void>;
10
+ }>;
11
+ export declare function addAntigravityDesktopHook(plan: DesktopLaunchPlan, endpoint: string): void;
12
+ //# sourceMappingURL=agy-desktop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agy-desktop.d.ts","sourceRoot":"","sources":["../../src/commands/agy-desktop.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAK1D,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,IAAI,CAAC,CAYpE;AAED,wBAAgB,mCAAmC,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAa5E;AAED;;yDAEyD;AACzD,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,SAAiB;;;GA0FvH;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAkCzF"}
@@ -0,0 +1,5 @@
1
+ import type { DesktopLaunchPlan } from "./desktop-launch";
2
+ export declare function findClaudeSharedElectron(sourceApp: string, home?: string): string | undefined;
3
+ export declare function useClaudeSharedElectron(plan: DesktopLaunchPlan, runtime: string, sourceApp: string, toolArgs?: string[]): void;
4
+ export declare function addClaudeDesktopHook(plan: DesktopLaunchPlan, baseUrl: string, localKey: string, sourceApp?: string): void;
5
+ //# sourceMappingURL=claude-desktop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-desktop.d.ts","sourceRoot":"","sources":["../../src/commands/claude-desktop.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,SAAY,GAAG,MAAM,GAAG,SAAS,CAShG;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,EAAO,GAAG,IAAI,CAGlI;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CA4BzH"}
@@ -0,0 +1,3 @@
1
+ import type { DesktopLaunchPlan } from "./desktop-launch";
2
+ export declare function addCursorDesktopLocalHook(plan: DesktopLaunchPlan, app: string): void;
3
+ //# sourceMappingURL=cursor-desktop-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-desktop-hook.d.ts","sourceRoot":"","sources":["../../src/commands/cursor-desktop-hook.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAI1D,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAsDpF"}
@@ -0,0 +1,3 @@
1
+ export declare const CURSOR_APPLICATION_STORAGE = "src.vs.platform.reactivestorage.browser.reactiveStorageServiceImpl.persistentStorage.applicationUser";
2
+ export declare function configureCursorDesktop(profileDir: string, baseUrl: string, apiKey: string, model: string, sourceDb?: string): Promise<string>;
3
+ //# sourceMappingURL=cursor-desktop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-desktop.d.ts","sourceRoot":"","sources":["../../src/commands/cursor-desktop.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,0BAA0B,yGAAyG,CAAC;AAyCjJ,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAClE,QAAQ,SAAqE,GAC5E,OAAO,CAAC,MAAM,CAAC,CA0CjB"}
@@ -0,0 +1,6 @@
1
+ import type { LaunchPlan } from "./start";
2
+ export declare const CURSOR_LOCAL_INSTALL_URL = "https://cursor.com/internal-local-install-nHZIc6RZgTXIfai0aO?darwin=true&channel=prod";
3
+ export declare function buildCursorLaunchPlan(serverUrl: string, apiKey: string, model: string, toolArgs?: string[], homeDir?: string, executablePath?: string): LaunchPlan;
4
+ /** Verify the separate local runtime without using a Cursor account or the gateway. */
5
+ export declare function resolveCursorLocalExecutable(executablePath?: string, homeDir?: string): string;
6
+ //# sourceMappingURL=cursor-launch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-launch.d.ts","sourceRoot":"","sources":["../../src/commands/cursor-launch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,eAAO,MAAM,wBAAwB,0FAA0F,CAAC;AAOhI,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,GAAE,MAAM,EAAO,EACvB,OAAO,SAAY,EACnB,cAAc,SAAgB,GAC7B,UAAU,CAiBZ;AAED,uFAAuF;AACvF,wBAAgB,4BAA4B,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,OAAO,SAAY,GAAG,MAAM,CAkBjG"}
@@ -0,0 +1,12 @@
1
+ /** Inject before Desktop app's first application module, then detach. Packaged
2
+ * Electron rejects --require in NODE_OPTIONS but supports this loopback inspector. */
3
+ export declare function installDesktopInspectorHook(hookPath: string, logPath: string, signal: AbortSignal, options?: {
4
+ readyPath?: string;
5
+ startupBreakpoint?: {
6
+ urlRegex: string;
7
+ lineNumber: number;
8
+ columnNumber: number;
9
+ condition: string;
10
+ };
11
+ }): Promise<void>;
12
+ //# sourceMappingURL=desktop-inspector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-inspector.d.ts","sourceRoot":"","sources":["../../src/commands/desktop-inspector.ts"],"names":[],"mappings":"AAIA;sFACsF;AACtF,wBAAsB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE;IACjH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAClG,GAAG,OAAO,CAAC,IAAI,CAAC,CAkErB"}
@@ -0,0 +1,33 @@
1
+ export type DesktopTool = "codex" | "claude" | "cursor" | "agy";
2
+ export interface DesktopLaunchPlan {
3
+ command: string;
4
+ args: string[];
5
+ env: NodeJS.ProcessEnv;
6
+ files: Array<{
7
+ path: string;
8
+ contents: string;
9
+ }>;
10
+ profileDir: string;
11
+ inspectorHook?: {
12
+ path: string;
13
+ logPath: string;
14
+ readyPath?: string;
15
+ startupBreakpoint?: {
16
+ urlRegex: string;
17
+ lineNumber: number;
18
+ columnNumber: number;
19
+ condition: string;
20
+ };
21
+ };
22
+ }
23
+ export declare function isDesktopTool(tool: string): tool is DesktopTool;
24
+ /** Resolve desktop apps separately from same-named CLI shims. */
25
+ export declare function resolveDesktopExecutable(tool: DesktopTool, explicitPath?: string, platform?: NodeJS.Platform, home?: string): string;
26
+ export declare function validateDesktopArgs(args: string[]): void;
27
+ export declare function createDesktopProfile(tool: DesktopTool): string;
28
+ export declare function buildDesktopLaunchPlan(tool: DesktopTool, executable: string, profileDir: string, baseUrl?: string, localKey?: string, model?: string, toolArgs?: string[], platform?: NodeJS.Platform): DesktopLaunchPlan;
29
+ export declare function writeDesktopLaunchPlan(plan: DesktopLaunchPlan): void;
30
+ /** Check Claude's installed config support without changing its bundle. */
31
+ export declare function assertClaudeDesktopGatewaySupport(executable: string): void;
32
+ export declare function runDesktopLaunch(plan: DesktopLaunchPlan): Promise<number>;
33
+ //# sourceMappingURL=desktop-launch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-launch.d.ts","sourceRoot":"","sources":["../../src/commands/desktop-launch.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;AAMhE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAClD,iBAAiB,CAAC,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;KACvG,CAAC;CACH;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,WAAW,CAE/D;AAED,iEAAiE;AACjE,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,kBAAmB,EAAE,IAAI,SAAY,GACtF,MAAM,CAoBR;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAIxD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAI9D;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EACzD,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EACnD,QAAQ,GAAE,MAAM,EAAO,EAAE,QAAQ,kBAAmB,GACnD,iBAAiB,CAiDnB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAQpE;AAED,2EAA2E;AAC3E,wBAAgB,iCAAiC,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAO1E;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB/E"}
@@ -0,0 +1,6 @@
1
+ import { type ModelGrouping } from "../config";
2
+ export declare function parseModelGrouping(value: string): ModelGrouping;
3
+ export declare function settingsCommand(options?: {
4
+ modelGrouping?: string;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/commands/settings.ts"],"names":[],"mappings":"AACA,OAAO,EAA4D,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAGzG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAK/D;AAED,wBAAsB,eAAe,CAAC,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB7F"}
@@ -3,7 +3,8 @@
3
3
  * The per-tool adapters follow the launcher pattern used by Ollama: discover a
4
4
  * model, write only app-owned config, then start the installed client process.
5
5
  */
6
- export type StartTool = "claude" | "codex" | "gemini" | "agy" | "aider" | "opencode";
6
+ import { type GatewayModel } from "../client";
7
+ export type StartTool = "claude" | "codex" | "gemini" | "agy" | "aider" | "opencode" | "cursor";
7
8
  type CliTool = StartTool;
8
9
  export interface StartCommandOptions {
9
10
  tool?: string;
@@ -11,7 +12,11 @@ export interface StartCommandOptions {
11
12
  server?: string;
12
13
  key?: string;
13
14
  model?: string;
15
+ groupBy?: string;
14
16
  executablePath?: string;
17
+ desktop?: boolean;
18
+ openOnly?: boolean;
19
+ desktopInspector?: boolean;
15
20
  }
16
21
  interface ConfigFile {
17
22
  path: string;
@@ -25,11 +30,20 @@ export interface LaunchPlan {
25
30
  configFile?: ConfigFile;
26
31
  }
27
32
  export declare function isGatewayModelAvailable(availableModels: string[], model: string): boolean;
33
+ export declare function getStartToolOptions(desktopOnly?: boolean): {
34
+ value: string;
35
+ label: string;
36
+ hint: string;
37
+ }[];
38
+ export declare function resolveStartTarget(value: string, desktop?: boolean): {
39
+ tool: StartTool;
40
+ desktop: boolean;
41
+ };
28
42
  export declare function buildLaunchPlan(tool: CliTool, serverUrl: string, apiKey: string, model: string, toolArgs?: string[], homeDir?: string, executablePath?: string, agyRouting?: {
29
43
  baseUrl: string;
30
44
  recognizedModel: string;
31
45
  }): LaunchPlan;
32
- export declare function modelSupportsHarness(model: Record<string, any>, tool: StartTool): boolean;
46
+ export declare function modelSupportsHarness(model: GatewayModel, tool: StartTool): boolean;
33
47
  export declare function startCommand(options?: StartCommandOptions): Promise<void>;
34
48
  export {};
35
49
  //# sourceMappingURL=start.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,UAAU,CAAC;AACrF,KAAK,OAAO,GAAG,SAAS,CAAC;AAEzB,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzF;AA8BD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,GAAE,MAAM,EAAO,EACvB,OAAO,SAAY,EACnB,cAAc,CAAC,EAAE,MAAM,EACvB,UAAU,CAAC,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,GACxD,UAAU,CAiHZ;AAmBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAKzF;AA2ED,wBAAsB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDnF"}
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAclE,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;AAChG,KAAK,OAAO,GAAG,SAAS,CAAC;AAEzB,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzF;AAmBD,wBAAgB,mBAAmB,CAAC,WAAW,UAAQ;;;;IAEtD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAUxG;AAqBD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,GAAE,MAAM,EAAO,EACvB,OAAO,SAAY,EACnB,cAAc,CAAC,EAAE,MAAM,EACvB,UAAU,CAAC,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,GACxD,UAAU,CAqHZ;AAeD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAKlF;AAuED,wBAAsB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsHnF"}
package/dist/config.d.ts CHANGED
@@ -7,12 +7,17 @@ export interface UserProfile {
7
7
  email: string;
8
8
  name?: string;
9
9
  }
10
+ export declare const MODEL_GROUPINGS: readonly ["model-provider", "account-provider", "none"];
11
+ export type ModelGrouping = typeof MODEL_GROUPINGS[number];
12
+ export declare function isModelGrouping(value: unknown): value is ModelGrouping;
10
13
  export interface CliConfig {
11
14
  serverUrl: string;
12
15
  sessionToken?: string;
13
16
  apiKey?: string;
14
17
  bridgeApiKey?: string;
15
18
  user?: UserProfile;
19
+ modelGrouping?: ModelGrouping;
20
+ favoriteModels?: string[];
16
21
  }
17
22
  export declare function getConfigDir(): string;
18
23
  export declare function getConfigPath(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAID,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,UAAU,IAAI,SAAS,CAkBtC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAmBjE;AAED,wBAAgB,YAAY,IAAI,IAAI,CAgBnC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,eAAe,YAAI,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,CAAU,CAAC;AACvF,MAAM,MAAM,aAAa,GAAG,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AAE3D,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAID,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,UAAU,IAAI,SAAS,CAsBtC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAmBjE;AAED,wBAAgB,YAAY,IAAI,IAAI,CAgBnC"}