dsh-coding-subscription-oauth 0.5.8 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +211 -196
- package/CONTRIBUTING.md +120 -120
- package/INSTALL.md +240 -209
- package/LICENSE +19 -19
- package/NOTICE +11 -11
- package/README.de.md +298 -293
- package/README.es.md +299 -294
- package/README.fr.md +299 -294
- package/README.ja.md +299 -294
- package/README.ko.md +299 -294
- package/README.md +313 -306
- package/README.pt-BR.md +299 -294
- package/README.ru.md +299 -294
- package/README.zh-CN.md +311 -304
- package/compatibility/dsh-bom.json +43 -0
- package/cordis.patch.yml +13 -13
- package/docs/00-project-rules.md +195 -195
- package/docs/02-architecture.md +134 -129
- package/docs/02-architecture.zh-CN.md +134 -129
- package/lib/auth-routes.d.ts +8 -15
- package/lib/auth-routes.d.ts.map +1 -1
- package/lib/bin.js +746 -1402
- package/lib/bin.js.map +4 -4
- package/lib/capability-routes.d.ts +3 -3
- package/lib/capability-routes.d.ts.map +1 -1
- package/lib/capability-settings.d.ts +5 -4
- package/lib/capability-settings.d.ts.map +1 -1
- package/lib/client.js +27 -8
- package/lib/client.js.map +4 -4
- package/lib/compatibility.d.ts +46 -0
- package/lib/compatibility.d.ts.map +1 -0
- package/lib/dsh-host-adapter.d.ts +18 -0
- package/lib/dsh-host-adapter.d.ts.map +1 -0
- package/lib/gateway-auth.d.ts +1 -2
- package/lib/gateway-auth.d.ts.map +1 -1
- package/lib/gateway-routes.d.ts +3 -4
- package/lib/gateway-routes.d.ts.map +1 -1
- package/lib/gateway.d.ts +4 -0
- package/lib/gateway.d.ts.map +1 -1
- package/lib/ids.d.ts +3 -32
- package/lib/ids.d.ts.map +1 -1
- package/lib/imagine-routes.d.ts +2 -0
- package/lib/imagine-routes.d.ts.map +1 -1
- package/lib/index.d.ts +19 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +26573 -1023
- package/lib/index.js.map +4 -4
- package/lib/invariant.js.map +1 -1
- package/lib/oauth-import-routes.d.ts +3 -4
- package/lib/oauth-import-routes.d.ts.map +1 -1
- package/lib/proxy.d.ts +3 -16
- package/lib/proxy.d.ts.map +1 -1
- package/lib/web-origin.d.ts +28 -4
- package/lib/web-origin.d.ts.map +1 -1
- package/lib/web-routes.d.ts.map +1 -1
- package/media/en/settings_accounts.png +0 -0
- package/media/en/settings_capabilities.png +0 -0
- package/media/en/settings_gateway.png +0 -0
- package/media/zh-CN/settings_accounts.png +0 -0
- package/media/zh-CN/settings_capabilities.png +0 -0
- package/media/zh-CN/settings_gateway.png +0 -0
- package/package.json +209 -172
- package/patches/dsh-agy@0.1.2.patch +25 -25
- package/scripts/release.mjs +186 -170
- package/scripts/smoke-deployed-routes.mjs +146 -146
- package/scripts/verify-deployed-catalog.mjs +87 -87
- package/src/adapter.ts +287 -287
- package/src/alias-adapter.ts +153 -153
- package/src/auth-routes.ts +921 -871
- package/src/auth.ts +67 -67
- package/src/bin.ts +350 -350
- package/src/capability-routes.ts +279 -275
- package/src/capability-runtime.ts +313 -313
- package/src/capability-settings.ts +658 -657
- package/src/capability-tools.ts +666 -666
- package/src/catalog.ts +271 -271
- package/src/client/GrokBuildSettings.tsx +770 -718
- package/src/client/api.ts +88 -88
- package/src/client/components/AboutTab.tsx +30 -30
- package/src/client/components/AccountsTab.tsx +241 -224
- package/src/client/components/Badge.tsx +33 -33
- package/src/client/components/CapabilitiesTab.tsx +265 -227
- package/src/client/components/CliPullPreview.tsx +116 -107
- package/src/client/components/CopyButton.tsx +57 -57
- package/src/client/components/GatewayTab.tsx +469 -409
- package/src/client/components/NoticeBanner.tsx +46 -46
- package/src/client/components/ProgressBar.tsx +53 -53
- package/src/client/components/ProviderCard.tsx +606 -502
- package/src/client/components/SettingsTabs.tsx +75 -75
- package/src/client/components/ToggleSwitch.tsx +71 -62
- package/src/client/constants.ts +224 -206
- package/src/client/display.ts +61 -61
- package/src/client/dshClientAdapter.ts +109 -0
- package/src/client/gatewaySnippets.ts +37 -36
- package/src/client/index.tsx +156 -37
- package/src/client/locales.ts +535 -491
- package/src/client/microStyles.ts +52 -33
- package/src/client/parsers.ts +396 -386
- package/src/client/styles.ts +325 -307
- package/src/client/types.ts +197 -185
- package/src/codex-http.ts +447 -447
- package/src/codex-images.ts +485 -485
- package/src/codex-model-capabilities.ts +320 -320
- package/src/codex-search.ts +245 -245
- package/src/codex-usage.ts +263 -263
- package/src/compatibility.ts +55 -0
- package/src/dsh-host-adapter.ts +171 -0
- package/src/gateway-anthropic-messages.ts +84 -84
- package/src/gateway-auth.ts +102 -100
- package/src/gateway-backend.ts +274 -274
- package/src/gateway-body.ts +49 -49
- package/src/gateway-config.ts +76 -76
- package/src/gateway-http.ts +104 -104
- package/src/gateway-openai-chat.ts +124 -124
- package/src/gateway-openai-responses.ts +53 -53
- package/src/gateway-parse.ts +224 -224
- package/src/gateway-protocol.ts +52 -52
- package/src/gateway-routes.ts +158 -152
- package/src/gateway.ts +258 -242
- package/src/grok-errors.ts +24 -24
- package/src/grok-imagine.ts +1627 -1627
- package/src/grok-import.ts +151 -151
- package/src/http-json.ts +82 -82
- package/src/ids.ts +59 -45
- package/src/imagine-routes.ts +463 -461
- package/src/index.ts +748 -598
- package/src/invariant.ts +17 -17
- package/src/kimi-errors.ts +26 -26
- package/src/media-store.ts +927 -927
- package/src/oauth-import-routes.ts +324 -314
- package/src/oauth-providers.ts +152 -152
- package/src/oauth-session.ts +183 -183
- package/src/oauth-sources.ts +1104 -1104
- package/src/oauth.ts +620 -620
- package/src/provider.ts +128 -128
- package/src/proxy.ts +11 -99
- package/src/redact.ts +72 -72
- package/src/session.ts +218 -218
- package/src/store.ts +217 -217
- package/src/web-origin.ts +296 -60
- package/src/web-routes.ts +38 -75
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
/** Accessible segmented tablist for Coding OAuth settings. */
|
|
2
|
-
|
|
3
|
-
import type { KeyboardEvent } from "react";
|
|
4
|
-
import { SETTINGS_TABS } from "../constants.ts";
|
|
5
|
-
import { segmentedNavStyle, segmentedTabActiveStyle, segmentedTabStyle } from "../styles.ts";
|
|
6
|
-
import type { GrokBuildSettingsInjected, SettingsTabId } from "../types.ts";
|
|
7
|
-
|
|
8
|
-
export interface SettingsTabHint {
|
|
9
|
-
id: SettingsTabId;
|
|
10
|
-
suffix?: string;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface SettingsTabsProps {
|
|
14
|
-
t: GrokBuildSettingsInjected["t"];
|
|
15
|
-
activeTab: SettingsTabId;
|
|
16
|
-
onChange: (tab: SettingsTabId) => void;
|
|
17
|
-
hints?: readonly SettingsTabHint[];
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function SettingsTabs({ t, activeTab, onChange, hints }: SettingsTabsProps) {
|
|
21
|
-
const hintFor = (id: SettingsTabId): string | undefined => hints?.find((entry) => entry.id === id)?.suffix;
|
|
22
|
-
|
|
23
|
-
const focusTab = (index: number): void => {
|
|
24
|
-
const tab = SETTINGS_TABS[index];
|
|
25
|
-
if (tab === undefined) return;
|
|
26
|
-
onChange(tab.id);
|
|
27
|
-
const button = document.getElementById(`coding-oauth-tab-${tab.id}`);
|
|
28
|
-
button?.focus();
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
const onKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {
|
|
32
|
-
const current = SETTINGS_TABS.findIndex((tab) => tab.id === activeTab);
|
|
33
|
-
if (current < 0) return;
|
|
34
|
-
if (event.key === "ArrowRight" || event.key === "ArrowDown") {
|
|
35
|
-
event.preventDefault();
|
|
36
|
-
focusTab((current + 1) % SETTINGS_TABS.length);
|
|
37
|
-
} else if (event.key === "ArrowLeft" || event.key === "ArrowUp") {
|
|
38
|
-
event.preventDefault();
|
|
39
|
-
focusTab((current - 1 + SETTINGS_TABS.length) % SETTINGS_TABS.length);
|
|
40
|
-
} else if (event.key === "Home") {
|
|
41
|
-
event.preventDefault();
|
|
42
|
-
focusTab(0);
|
|
43
|
-
} else if (event.key === "End") {
|
|
44
|
-
event.preventDefault();
|
|
45
|
-
focusTab(SETTINGS_TABS.length - 1);
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
return (
|
|
50
|
-
<div role="tablist" aria-label={t("title")} style={segmentedNavStyle} onKeyDown={onKeyDown}>
|
|
51
|
-
{SETTINGS_TABS.map((tab) => {
|
|
52
|
-
const selected = activeTab === tab.id;
|
|
53
|
-
const suffix = hintFor(tab.id);
|
|
54
|
-
const label = suffix === undefined ? t(tab.label) : `${t(tab.label)} (${suffix})`;
|
|
55
|
-
return (
|
|
56
|
-
<button
|
|
57
|
-
key={tab.id}
|
|
58
|
-
id={`coding-oauth-tab-${tab.id}`}
|
|
59
|
-
type="button"
|
|
60
|
-
role="tab"
|
|
61
|
-
aria-selected={selected}
|
|
62
|
-
aria-controls={`coding-oauth-panel-${tab.id}`}
|
|
63
|
-
tabIndex={selected ? 0 : -1}
|
|
64
|
-
style={selected ? segmentedTabActiveStyle : segmentedTabStyle}
|
|
65
|
-
onClick={() => {
|
|
66
|
-
onChange(tab.id);
|
|
67
|
-
}}
|
|
68
|
-
>
|
|
69
|
-
{label}
|
|
70
|
-
</button>
|
|
71
|
-
);
|
|
72
|
-
})}
|
|
73
|
-
</div>
|
|
74
|
-
);
|
|
75
|
-
}
|
|
1
|
+
/** Accessible segmented tablist for Coding OAuth settings. */
|
|
2
|
+
|
|
3
|
+
import type { KeyboardEvent } from "react";
|
|
4
|
+
import { SETTINGS_TABS } from "../constants.ts";
|
|
5
|
+
import { segmentedNavStyle, segmentedTabActiveStyle, segmentedTabStyle } from "../styles.ts";
|
|
6
|
+
import type { GrokBuildSettingsInjected, SettingsTabId } from "../types.ts";
|
|
7
|
+
|
|
8
|
+
export interface SettingsTabHint {
|
|
9
|
+
id: SettingsTabId;
|
|
10
|
+
suffix?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface SettingsTabsProps {
|
|
14
|
+
t: GrokBuildSettingsInjected["t"];
|
|
15
|
+
activeTab: SettingsTabId;
|
|
16
|
+
onChange: (tab: SettingsTabId) => void;
|
|
17
|
+
hints?: readonly SettingsTabHint[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function SettingsTabs({ t, activeTab, onChange, hints }: SettingsTabsProps) {
|
|
21
|
+
const hintFor = (id: SettingsTabId): string | undefined => hints?.find((entry) => entry.id === id)?.suffix;
|
|
22
|
+
|
|
23
|
+
const focusTab = (index: number): void => {
|
|
24
|
+
const tab = SETTINGS_TABS[index];
|
|
25
|
+
if (tab === undefined) return;
|
|
26
|
+
onChange(tab.id);
|
|
27
|
+
const button = document.getElementById(`coding-oauth-tab-${tab.id}`);
|
|
28
|
+
button?.focus();
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const onKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {
|
|
32
|
+
const current = SETTINGS_TABS.findIndex((tab) => tab.id === activeTab);
|
|
33
|
+
if (current < 0) return;
|
|
34
|
+
if (event.key === "ArrowRight" || event.key === "ArrowDown") {
|
|
35
|
+
event.preventDefault();
|
|
36
|
+
focusTab((current + 1) % SETTINGS_TABS.length);
|
|
37
|
+
} else if (event.key === "ArrowLeft" || event.key === "ArrowUp") {
|
|
38
|
+
event.preventDefault();
|
|
39
|
+
focusTab((current - 1 + SETTINGS_TABS.length) % SETTINGS_TABS.length);
|
|
40
|
+
} else if (event.key === "Home") {
|
|
41
|
+
event.preventDefault();
|
|
42
|
+
focusTab(0);
|
|
43
|
+
} else if (event.key === "End") {
|
|
44
|
+
event.preventDefault();
|
|
45
|
+
focusTab(SETTINGS_TABS.length - 1);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<div role="tablist" aria-label={t("title")} style={segmentedNavStyle} onKeyDown={onKeyDown}>
|
|
51
|
+
{SETTINGS_TABS.map((tab) => {
|
|
52
|
+
const selected = activeTab === tab.id;
|
|
53
|
+
const suffix = hintFor(tab.id);
|
|
54
|
+
const label = suffix === undefined ? t(tab.label) : `${t(tab.label)} (${suffix})`;
|
|
55
|
+
return (
|
|
56
|
+
<button
|
|
57
|
+
key={tab.id}
|
|
58
|
+
id={`coding-oauth-tab-${tab.id}`}
|
|
59
|
+
type="button"
|
|
60
|
+
role="tab"
|
|
61
|
+
aria-selected={selected}
|
|
62
|
+
aria-controls={selected ? `coding-oauth-panel-${tab.id}` : undefined}
|
|
63
|
+
tabIndex={selected ? 0 : -1}
|
|
64
|
+
style={selected ? segmentedTabActiveStyle : segmentedTabStyle}
|
|
65
|
+
onClick={() => {
|
|
66
|
+
onChange(tab.id);
|
|
67
|
+
}}
|
|
68
|
+
>
|
|
69
|
+
{label}
|
|
70
|
+
</button>
|
|
71
|
+
);
|
|
72
|
+
})}
|
|
73
|
+
</div>
|
|
74
|
+
);
|
|
75
|
+
}
|
|
@@ -1,62 +1,71 @@
|
|
|
1
|
-
/** Accessible toggle switch replacing native checkboxes for capability settings. */
|
|
2
|
-
|
|
3
|
-
import type { CSSProperties } from "react";
|
|
4
|
-
import { TRANSITION } from "../styles.ts";
|
|
5
|
-
|
|
6
|
-
export interface ToggleSwitchProps {
|
|
7
|
-
checked: boolean;
|
|
8
|
-
disabled?: boolean;
|
|
9
|
-
onChange: (checked: boolean) => void;
|
|
10
|
-
/** Accessible label (visually hidden when label prop is rendered externally). */
|
|
11
|
-
ariaLabel?: string;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
1
|
+
/** Accessible toggle switch replacing native checkboxes for capability settings. */
|
|
2
|
+
|
|
3
|
+
import type { CSSProperties } from "react";
|
|
4
|
+
import { TRANSITION } from "../styles.ts";
|
|
5
|
+
|
|
6
|
+
export interface ToggleSwitchProps {
|
|
7
|
+
checked: boolean;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
onChange: (checked: boolean) => void;
|
|
10
|
+
/** Accessible label (visually hidden when label prop is rendered externally). */
|
|
11
|
+
ariaLabel?: string;
|
|
12
|
+
ariaDescribedBy?: string;
|
|
13
|
+
id?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const trackStyle = (checked: boolean, disabled: boolean): CSSProperties => ({
|
|
17
|
+
position: "relative",
|
|
18
|
+
width: 40,
|
|
19
|
+
height: 22,
|
|
20
|
+
borderRadius: 11,
|
|
21
|
+
flex: "0 0 auto",
|
|
22
|
+
background: checked
|
|
23
|
+
? "var(--dsw-alias-button-primary-fill)"
|
|
24
|
+
: "var(--dsw-alias-border-l4, rgba(127, 127, 127, 0.45))",
|
|
25
|
+
opacity: disabled ? 0.5 : 1,
|
|
26
|
+
cursor: disabled ? "not-allowed" : "pointer",
|
|
27
|
+
transition: TRANSITION,
|
|
28
|
+
border: "none",
|
|
29
|
+
padding: 0,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const thumbStyle = (checked: boolean): CSSProperties => ({
|
|
33
|
+
position: "absolute",
|
|
34
|
+
top: 2,
|
|
35
|
+
left: checked ? 20 : 2,
|
|
36
|
+
width: 18,
|
|
37
|
+
height: 18,
|
|
38
|
+
borderRadius: "50%",
|
|
39
|
+
// Match DSH primary fill/foreground pairing so the thumb stays visible when
|
|
40
|
+
// dark theme inverts brand-primary to near-white.
|
|
41
|
+
background: checked ? "var(--dsw-alias-label-primary-foreground)" : "var(--dsw-alias-button-elevated-fill)",
|
|
42
|
+
boxShadow: "0 1px 3px rgba(0, 0, 0, 0.25)",
|
|
43
|
+
transition: TRANSITION,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
export function ToggleSwitch({
|
|
47
|
+
checked,
|
|
48
|
+
disabled = false,
|
|
49
|
+
onChange,
|
|
50
|
+
ariaLabel,
|
|
51
|
+
ariaDescribedBy,
|
|
52
|
+
id,
|
|
53
|
+
}: ToggleSwitchProps) {
|
|
54
|
+
return (
|
|
55
|
+
<button
|
|
56
|
+
id={id}
|
|
57
|
+
type="button"
|
|
58
|
+
role="switch"
|
|
59
|
+
aria-checked={checked}
|
|
60
|
+
aria-label={ariaLabel}
|
|
61
|
+
aria-describedby={ariaDescribedBy}
|
|
62
|
+
disabled={disabled}
|
|
63
|
+
style={trackStyle(checked, disabled)}
|
|
64
|
+
onClick={() => {
|
|
65
|
+
if (!disabled) onChange(!checked);
|
|
66
|
+
}}
|
|
67
|
+
>
|
|
68
|
+
<span aria-hidden="true" style={thumbStyle(checked)} />
|
|
69
|
+
</button>
|
|
70
|
+
);
|
|
71
|
+
}
|