@closedrouter/cli 1.1.22 → 1.1.23
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 +1 -1
- package/dist/commands/model-branding.d.ts +2 -2
- package/dist/commands/model-branding.d.ts.map +1 -1
- package/dist/index.js +33 -20
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -155,7 +155,7 @@ On macOS, Claude uses a compatible Electron runtime installed by Cockpit, or the
|
|
|
155
155
|
|
|
156
156
|
Antigravity uses the CCPA envelope conversion documented in `~/Projects/antigravity-mods`. The launcher briefly opens a loopback Node inspector and installs its language-server hook. A browser debugger replaces the launched renderer's model catalog with native custom-model entries, then detaches. Each entry carries a distinct routing alias and a positive context and output budget. The picker lists the supported pool models, and selecting one changes inference routing. App bundles and global hook configuration are not modified. Unsupported launcher builds fail before opening; `--open-only` remains available.
|
|
157
157
|
|
|
158
|
-
Supported desktop views display the colored ClosedRouter logo beside model names.
|
|
158
|
+
Supported desktop views display the colored ClosedRouter logo beside model names. Twelve miniature white-core neon-blue lightning bolts surround the active chat-box logo on four intersecting 3D orbits, with a brief burst every five seconds and immediately on hover or keyboard focus. The orbit measures the logo, so model-label width does not move or enlarge it. The bolts keep their orientation; perspective enlarges the front pass and the logo occludes the rear pass. Reduced-motion preferences keep the mark static; hidden windows pause the effect. Launch requests also carry the configured model ID in system context so native client identity prompts do not misidentify the underlying model. The relay resolves the requested model on each turn and preserves tools and streamed responses. Unsupported model IDs are rejected before forwarding. Catalogs are snapshots of the models available to the platform key at launch; provider quotas can change during a session.
|
|
159
159
|
|
|
160
160
|
`cr start` checks the selected model's actual tool call, tool-result continuation, and streamed completion before opening a client. Successful checks are cached for six hours by gateway and platform key. Confirmed protocol rejections are removed from that harness's selector; quota, authorization, and connection failures are reported as temporary availability failures. Malformed model-generated tool arguments leave a check unverified and can be retried without hiding the model. Use `cr verify --all-models --output compatibility.json` to audit every available tool-capable model across Responses, Chat Completions, Anthropic Messages, and Gemini. `cr verify codex --model <id>` checks one harness protocol. Reports distinguish gateway protocol checks from native client tests. `--no-verify-model` skips this check for a previously verified private gateway. The [October 3 acceptance report](../docs/acceptance/desktop-harnesses-2026-10-03.json) records the protocol sweep, native checks, and remaining limits.
|
|
161
161
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export declare const CLOSEDROUTER_LOGO = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><rect width=\"24\" height=\"24\" rx=\"6\" fill=\"#D4FE51\"/><path d=\"M16.68 7.82A6.5 6.5 0 1 0 16.68 16.18\" fill=\"none\" stroke=\"#04080A\" stroke-width=\"2.6\" stroke-linecap=\"round\"/><circle cx=\"18.2\" cy=\"12\" r=\"1.9\" fill=\"#04080A\"/></svg>";
|
|
2
2
|
import type { DesktopAccountIdentity } from "./desktop-account";
|
|
3
|
-
export declare const CLOSEDROUTER_ELECTRIC_CSS = "\n[data-closedrouter-logo]{position:relative;isolation:isolate}\n[data-closedrouter-charged-control]{overflow:visible!important}\n[data-closedrouter-supercharged]{perspective:80px;transform-style:preserve-3d;isolation:auto;overflow:visible}\n[data-closedrouter-electric]{position:absolute;inset:0;pointer-events:none;transform-style:preserve-3d;opacity:0}\n[data-cr-lightning-orbit]{position:absolute;left:50%;top:50%;width:0;height:0;transform-style:preserve-3d}\n[data-cr-lightning-bolt]{position:absolute;width:
|
|
3
|
+
export declare const CLOSEDROUTER_ELECTRIC_CSS = "\n[data-closedrouter-logo]{position:relative;isolation:isolate}\n[data-closedrouter-charged-control]{overflow:visible!important}\n[data-closedrouter-supercharged]{perspective:80px;transform-style:preserve-3d;isolation:auto;overflow:visible;margin-inline-end:9px!important}\n[data-closedrouter-electric]{position:absolute;inset:0;pointer-events:none;transform-style:preserve-3d;opacity:0}\n[data-cr-lightning-orbit]{position:absolute;left:50%;top:50%;width:0;height:0;transform-style:preserve-3d}\n[data-cr-lightning-bolt]{position:absolute;width:4.5px;height:8px;left:-2.25px;top:-4px;overflow:visible;filter:drop-shadow(0 0 1.5px #58caff) drop-shadow(0 0 3px #159aff)}\n@media(prefers-reduced-motion:no-preference){[data-closedrouter-electric]{opacity:1}}\n";
|
|
4
4
|
/** Position a bolt along a tilted orbit around the provider logo in world
|
|
5
5
|
* space. The bolt keeps its orientation as its x, y and depth change. */
|
|
6
|
-
export declare function lightningOrbitKeyframes(width: number, height: number, phase: number): Keyframe[];
|
|
6
|
+
export declare function lightningOrbitKeyframes(width: number, height: number, phase: number, plane?: number): Keyframe[];
|
|
7
7
|
/** Add the provider mark to native controls without changing click handlers,
|
|
8
8
|
* model IDs, keyboard behavior, or the application's typography. */
|
|
9
9
|
export declare function installModelBranding(models: string[], artwork: string, electricCss: string, orbitKeyframes: typeof lightningOrbitKeyframes): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-branding.d.ts","sourceRoot":"","sources":["../../src/commands/model-branding.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,mUAAqS,CAAC;AACpU,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEhE,eAAO,MAAM,yBAAyB,
|
|
1
|
+
{"version":3,"file":"model-branding.d.ts","sourceRoot":"","sources":["../../src/commands/model-branding.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,mUAAqS,CAAC;AACpU,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEhE,eAAO,MAAM,yBAAyB,2vBAQrC,CAAC;AAEF;yEACyE;AACzE,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,QAAQ,EAAE,CAwB3G;AAED;oEACoE;AACpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,uBAAuB,GAAG,IAAI,CA+FjJ;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAoC/F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAS5F"}
|
package/dist/index.js
CHANGED
|
@@ -10287,25 +10287,30 @@ var CLOSEDROUTER_LOGO = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24
|
|
|
10287
10287
|
var CLOSEDROUTER_ELECTRIC_CSS = `
|
|
10288
10288
|
[data-closedrouter-logo]{position:relative;isolation:isolate}
|
|
10289
10289
|
[data-closedrouter-charged-control]{overflow:visible!important}
|
|
10290
|
-
[data-closedrouter-supercharged]{perspective:80px;transform-style:preserve-3d;isolation:auto;overflow:visible}
|
|
10290
|
+
[data-closedrouter-supercharged]{perspective:80px;transform-style:preserve-3d;isolation:auto;overflow:visible;margin-inline-end:9px!important}
|
|
10291
10291
|
[data-closedrouter-electric]{position:absolute;inset:0;pointer-events:none;transform-style:preserve-3d;opacity:0}
|
|
10292
10292
|
[data-cr-lightning-orbit]{position:absolute;left:50%;top:50%;width:0;height:0;transform-style:preserve-3d}
|
|
10293
|
-
[data-cr-lightning-bolt]{position:absolute;width:
|
|
10293
|
+
[data-cr-lightning-bolt]{position:absolute;width:4.5px;height:8px;left:-2.25px;top:-4px;overflow:visible;filter:drop-shadow(0 0 1.5px #58caff) drop-shadow(0 0 3px #159aff)}
|
|
10294
10294
|
@media(prefers-reduced-motion:no-preference){[data-closedrouter-electric]{opacity:1}}
|
|
10295
10295
|
`;
|
|
10296
|
-
function lightningOrbitKeyframes(width, height, phase) {
|
|
10296
|
+
function lightningOrbitKeyframes(width, height, phase, plane = 0) {
|
|
10297
10297
|
const frames = [];
|
|
10298
|
-
|
|
10299
|
-
|
|
10300
|
-
|
|
10301
|
-
|
|
10302
|
-
const
|
|
10303
|
-
const
|
|
10304
|
-
const
|
|
10298
|
+
const inclination = [Math.PI / 2.7, Math.PI / 2.2, Math.PI / 3.2, Math.PI / 2.5][plane % 4];
|
|
10299
|
+
const bearing = [-Math.PI / 7, Math.PI / 2.7, -Math.PI / 2.5, Math.PI / 10][plane % 4];
|
|
10300
|
+
const radius = Math.max(width, height) / 2 + 4;
|
|
10301
|
+
for (let step = 0;step <= 64; step++) {
|
|
10302
|
+
const progress = step / 64;
|
|
10303
|
+
const angle = (phase + progress * (plane % 2 ? -1 : 1) * (1 + plane * 0.12)) * Math.PI * 2;
|
|
10304
|
+
const localX = radius * Math.cos(angle);
|
|
10305
|
+
const localY = radius * Math.sin(angle) * Math.cos(inclination);
|
|
10306
|
+
const x = localX * Math.cos(bearing) - localY * Math.sin(bearing);
|
|
10307
|
+
const y = localX * Math.sin(bearing) + localY * Math.cos(bearing);
|
|
10308
|
+
const z = radius * Math.sin(angle) * Math.sin(inclination);
|
|
10305
10309
|
const scale = 80 / (80 - z);
|
|
10306
|
-
const
|
|
10307
|
-
const fade = Math.min(1, progress *
|
|
10308
|
-
|
|
10310
|
+
const behindLogo = z < -1 && Math.abs(x * scale) < width / 2 && Math.abs(y * scale) < height / 2;
|
|
10311
|
+
const fade = Math.min(1, progress * 12, (1 - progress) * 12);
|
|
10312
|
+
const shimmer = 0.8 + 0.2 * Math.sin((progress * 2 + phase) * Math.PI) ** 2;
|
|
10313
|
+
frames.push({ offset: progress * 0.28, transform: `translate3d(${x}px,${y}px,${z}px)`, opacity: behindLogo ? 0 : fade * shimmer * (z < 0 ? 0.38 : 0.95) });
|
|
10309
10314
|
}
|
|
10310
10315
|
frames.push({ ...frames[0], offset: 1, opacity: 0 });
|
|
10311
10316
|
return frames;
|
|
@@ -10325,9 +10330,12 @@ function installModelBranding(models, artwork, electricCss, orbitKeyframes) {
|
|
|
10325
10330
|
const previous = charged.get(button) || [];
|
|
10326
10331
|
const time = previous[0]?.currentTime;
|
|
10327
10332
|
previous.forEach((animation) => animation.cancel());
|
|
10328
|
-
const
|
|
10333
|
+
const mark = button.querySelector("[data-closedrouter-supercharged]");
|
|
10334
|
+
const width = mark?.offsetWidth || 16, height = mark?.offsetHeight || 16;
|
|
10329
10335
|
const animations = motion.matches ? [] : [...button.querySelectorAll("[data-cr-lightning-bolt]")].map((bolt, index) => {
|
|
10330
|
-
const
|
|
10336
|
+
const plane = index % 4;
|
|
10337
|
+
const phase = Math.floor(index / 4) / 3 + plane * 0.07;
|
|
10338
|
+
const animation = bolt.animate(orbitKeyframes(width, height, phase, plane), { duration: 5000, iterations: Infinity, easing: "linear" });
|
|
10331
10339
|
if (typeof time === "number")
|
|
10332
10340
|
animation.currentTime = time;
|
|
10333
10341
|
if (document.hidden)
|
|
@@ -10380,12 +10388,17 @@ function installModelBranding(models, artwork, electricCss, orbitKeyframes) {
|
|
|
10380
10388
|
layer.setAttribute("aria-hidden", "true");
|
|
10381
10389
|
const orbit = document.createElement("span");
|
|
10382
10390
|
orbit.dataset.crLightningOrbit = "true";
|
|
10383
|
-
for (
|
|
10391
|
+
for (let index = 0;index < 12; index++) {
|
|
10384
10392
|
const bolt = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
10385
|
-
bolt.setAttribute("viewBox", "0 0
|
|
10386
|
-
bolt.setAttribute("data-cr-lightning-bolt",
|
|
10387
|
-
const
|
|
10388
|
-
|
|
10393
|
+
bolt.setAttribute("viewBox", "0 0 20 34");
|
|
10394
|
+
bolt.setAttribute("data-cr-lightning-bolt", String(index));
|
|
10395
|
+
const size = [0.82, 1, 0.9][Math.floor(index / 4)];
|
|
10396
|
+
bolt.style.width = `${4.5 * size}px`;
|
|
10397
|
+
bolt.style.height = `${8 * size}px`;
|
|
10398
|
+
bolt.style.left = `${-2.25 * size}px`;
|
|
10399
|
+
bolt.style.top = `${-4 * size}px`;
|
|
10400
|
+
const path = index % 2 ? "M15 2 6 13 13 14 4 31 M6 13 2 10" : "M14 2 5 15 12 16 4 32 M12 16 18 22";
|
|
10401
|
+
for (const [color, width] of [["#42bdff", "3.5"], ["#f5fcff", "1.3"]]) {
|
|
10389
10402
|
const line = document.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
10390
10403
|
line.setAttribute("d", path);
|
|
10391
10404
|
line.setAttribute("fill", "none");
|
package/package.json
CHANGED