dsh-coding-subscription-oauth 0.5.7 → 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 -182
- package/CONTRIBUTING.md +120 -109
- 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 -166
- 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 -20
- 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 -364
- package/src/client/components/NoticeBanner.tsx +46 -46
- package/src/client/components/ProgressBar.tsx +53 -52
- 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 -487
- package/src/client/microStyles.ts +52 -33
- package/src/client/parsers.ts +396 -386
- package/src/client/styles.ts +325 -312
- 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
package/src/alias-adapter.ts
CHANGED
|
@@ -1,153 +1,153 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Harness route aliases over a native-id PiAiAdapter.
|
|
3
|
-
* @module dsh-coding-subscription-oauth/alias-adapter
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type {
|
|
7
|
-
GenerateOptions,
|
|
8
|
-
LlmModelInfo,
|
|
9
|
-
LlmProviderInfo,
|
|
10
|
-
LlmResolvedModelInfo,
|
|
11
|
-
ResolvedRetryPolicy,
|
|
12
|
-
StreamChunk,
|
|
13
|
-
} from "@deepseek-ai/dsh-llm";
|
|
14
|
-
import { LlmAdapter, LlmError } from "@deepseek-ai/dsh-llm";
|
|
15
|
-
import { remapXaiCapacityFailure } from "./grok-errors.ts";
|
|
16
|
-
import { remapAuthFailureIfContextOverflow } from "./kimi-errors.ts";
|
|
17
|
-
|
|
18
|
-
export interface AliasLlmRoutePolicy {
|
|
19
|
-
/** User-facing provider name shown above models in the model selector. */
|
|
20
|
-
displayName?: string;
|
|
21
|
-
/** Return false to hide every model for this route from discovery. */
|
|
22
|
-
isAuthenticated?: () => Promise<boolean>;
|
|
23
|
-
/**
|
|
24
|
-
* After authentication, keep only models this predicate accepts.
|
|
25
|
-
* Used by opt-in routes (e.g. Codex Fast) so ineligible ids stay hidden
|
|
26
|
-
* without hiding the whole authenticated catalog.
|
|
27
|
-
*/
|
|
28
|
-
includeModel?: (modelId: string) => boolean;
|
|
29
|
-
/**
|
|
30
|
-
* Called once when a stream for this route finishes with an AUTH failure
|
|
31
|
-
* (upstream rejected a locally-valid token). Implementations backdate the
|
|
32
|
-
* stored credential's expiry so the retried step refreshes before reuse.
|
|
33
|
-
* Awaiting it here keeps invalidation ordered before the retry executor
|
|
34
|
-
* reruns the step; failures are swallowed so the original AUTH surfaces.
|
|
35
|
-
*/
|
|
36
|
-
onAuthFailure?: () => Promise<void>;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function routePiAiReplayState(value: unknown, route: string): unknown {
|
|
40
|
-
if (typeof value !== "object" || value === null || Array.isArray(value)) return value;
|
|
41
|
-
const state = value as Record<string, unknown>;
|
|
42
|
-
if (state["kind"] !== "pi-ai" || state["provider"] === route) return value;
|
|
43
|
-
return { ...state, provider: route };
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function normalizeReplayForRoute(
|
|
47
|
-
message: GenerateOptions["messages"][number],
|
|
48
|
-
route: string,
|
|
49
|
-
): GenerateOptions["messages"][number] {
|
|
50
|
-
if (message.role !== "assistant" || message.source.kind !== "model") return message;
|
|
51
|
-
if (message.source.provider !== route) {
|
|
52
|
-
if (message.source.replayState === undefined) return message;
|
|
53
|
-
const { replayState: _foreignReplay, ...source } = message.source;
|
|
54
|
-
return { ...message, source };
|
|
55
|
-
}
|
|
56
|
-
const replayState = routePiAiReplayState(message.source.replayState, route);
|
|
57
|
-
if (replayState === message.source.replayState) return message;
|
|
58
|
-
return { ...message, source: { ...message.source, replayState } };
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Keeps pi-ai model.provider identities native while exposing collision-free
|
|
63
|
-
* Harness route names. Every public operation translates exactly once.
|
|
64
|
-
*/
|
|
65
|
-
export class AliasLlmAdapter extends LlmAdapter {
|
|
66
|
-
constructor(
|
|
67
|
-
private readonly inner: LlmAdapter,
|
|
68
|
-
private readonly aliases: ReadonlyMap<string, string>,
|
|
69
|
-
private readonly policies: ReadonlyMap<string, AliasLlmRoutePolicy> = new Map(),
|
|
70
|
-
) {
|
|
71
|
-
super();
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
private nativeProvider(route: string): string {
|
|
75
|
-
const provider = this.aliases.get(route);
|
|
76
|
-
if (provider === undefined) throw new LlmError(`OAuth adapter does not own provider "${route}"`, "NO_ADAPTER");
|
|
77
|
-
return provider;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
providerInfo(provider: string): LlmProviderInfo {
|
|
81
|
-
const native = this.nativeProvider(provider);
|
|
82
|
-
const info = this.inner.providerInfo(native);
|
|
83
|
-
const displayName = this.policies.get(provider)?.displayName;
|
|
84
|
-
return { ...info, id: provider, ...(displayName === undefined ? {} : { name: displayName }) };
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
providerRetryPolicy(provider: string): ResolvedRetryPolicy | undefined {
|
|
88
|
-
return this.inner.providerRetryPolicy(this.nativeProvider(provider));
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
async listModels(provider: string): Promise<readonly LlmModelInfo[]> {
|
|
92
|
-
const native = this.nativeProvider(provider);
|
|
93
|
-
const isAuthenticated = this.policies.get(provider)?.isAuthenticated;
|
|
94
|
-
if (isAuthenticated !== undefined) {
|
|
95
|
-
try {
|
|
96
|
-
if (!(await isAuthenticated())) return [];
|
|
97
|
-
} catch {
|
|
98
|
-
// A corrupt/unreadable credential must hide models instead of breaking
|
|
99
|
-
// the entire model picker or presenting a route that cannot be used.
|
|
100
|
-
return [];
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
const listed = (await this.inner.listModels(native)).map((model) => ({ ...model, provider }));
|
|
104
|
-
const includeModel = this.policies.get(provider)?.includeModel;
|
|
105
|
-
return includeModel === undefined ? listed : listed.filter((model) => includeModel(model.id));
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
async resolveModel(provider: string, model: string, signal?: AbortSignal): Promise<LlmResolvedModelInfo> {
|
|
109
|
-
const native = this.nativeProvider(provider);
|
|
110
|
-
return { ...(await this.inner.resolveModel(native, model, signal)), provider };
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
async *stream(options: GenerateOptions): AsyncIterable<StreamChunk> {
|
|
114
|
-
const route = options.provider;
|
|
115
|
-
const native = this.nativeProvider(route);
|
|
116
|
-
const messages = options.messages.map((message) => normalizeReplayForRoute(message, route));
|
|
117
|
-
let authFailureNotified = false;
|
|
118
|
-
for await (const raw of this.inner.stream({ ...options, provider: native, messages })) {
|
|
119
|
-
const chunk =
|
|
120
|
-
raw.type === "finish" && raw.reason.kind === "error"
|
|
121
|
-
? {
|
|
122
|
-
...raw,
|
|
123
|
-
reason: {
|
|
124
|
-
...raw.reason,
|
|
125
|
-
failure: remapXaiCapacityFailure(remapAuthFailureIfContextOverflow(raw.reason.failure)),
|
|
126
|
-
},
|
|
127
|
-
}
|
|
128
|
-
: raw;
|
|
129
|
-
if (
|
|
130
|
-
!authFailureNotified &&
|
|
131
|
-
chunk.type === "finish" &&
|
|
132
|
-
chunk.reason.kind === "error" &&
|
|
133
|
-
chunk.reason.failure.code === "AUTH"
|
|
134
|
-
) {
|
|
135
|
-
authFailureNotified = true;
|
|
136
|
-
const onAuthFailure = this.policies.get(route)?.onAuthFailure;
|
|
137
|
-
if (onAuthFailure !== undefined) {
|
|
138
|
-
try {
|
|
139
|
-
await onAuthFailure();
|
|
140
|
-
} catch {
|
|
141
|
-
// Invalidation is best-effort: the original AUTH failure must
|
|
142
|
-
// surface unchanged even when the credential store is unreadable.
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
if (chunk.type === "finish" && chunk.replayState !== undefined) {
|
|
147
|
-
yield { ...chunk, replayState: routePiAiReplayState(chunk.replayState, route) };
|
|
148
|
-
} else {
|
|
149
|
-
yield chunk;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Harness route aliases over a native-id PiAiAdapter.
|
|
3
|
+
* @module dsh-coding-subscription-oauth/alias-adapter
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type {
|
|
7
|
+
GenerateOptions,
|
|
8
|
+
LlmModelInfo,
|
|
9
|
+
LlmProviderInfo,
|
|
10
|
+
LlmResolvedModelInfo,
|
|
11
|
+
ResolvedRetryPolicy,
|
|
12
|
+
StreamChunk,
|
|
13
|
+
} from "@deepseek-ai/dsh-llm";
|
|
14
|
+
import { LlmAdapter, LlmError } from "@deepseek-ai/dsh-llm";
|
|
15
|
+
import { remapXaiCapacityFailure } from "./grok-errors.ts";
|
|
16
|
+
import { remapAuthFailureIfContextOverflow } from "./kimi-errors.ts";
|
|
17
|
+
|
|
18
|
+
export interface AliasLlmRoutePolicy {
|
|
19
|
+
/** User-facing provider name shown above models in the model selector. */
|
|
20
|
+
displayName?: string;
|
|
21
|
+
/** Return false to hide every model for this route from discovery. */
|
|
22
|
+
isAuthenticated?: () => Promise<boolean>;
|
|
23
|
+
/**
|
|
24
|
+
* After authentication, keep only models this predicate accepts.
|
|
25
|
+
* Used by opt-in routes (e.g. Codex Fast) so ineligible ids stay hidden
|
|
26
|
+
* without hiding the whole authenticated catalog.
|
|
27
|
+
*/
|
|
28
|
+
includeModel?: (modelId: string) => boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Called once when a stream for this route finishes with an AUTH failure
|
|
31
|
+
* (upstream rejected a locally-valid token). Implementations backdate the
|
|
32
|
+
* stored credential's expiry so the retried step refreshes before reuse.
|
|
33
|
+
* Awaiting it here keeps invalidation ordered before the retry executor
|
|
34
|
+
* reruns the step; failures are swallowed so the original AUTH surfaces.
|
|
35
|
+
*/
|
|
36
|
+
onAuthFailure?: () => Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function routePiAiReplayState(value: unknown, route: string): unknown {
|
|
40
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return value;
|
|
41
|
+
const state = value as Record<string, unknown>;
|
|
42
|
+
if (state["kind"] !== "pi-ai" || state["provider"] === route) return value;
|
|
43
|
+
return { ...state, provider: route };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function normalizeReplayForRoute(
|
|
47
|
+
message: GenerateOptions["messages"][number],
|
|
48
|
+
route: string,
|
|
49
|
+
): GenerateOptions["messages"][number] {
|
|
50
|
+
if (message.role !== "assistant" || message.source.kind !== "model") return message;
|
|
51
|
+
if (message.source.provider !== route) {
|
|
52
|
+
if (message.source.replayState === undefined) return message;
|
|
53
|
+
const { replayState: _foreignReplay, ...source } = message.source;
|
|
54
|
+
return { ...message, source };
|
|
55
|
+
}
|
|
56
|
+
const replayState = routePiAiReplayState(message.source.replayState, route);
|
|
57
|
+
if (replayState === message.source.replayState) return message;
|
|
58
|
+
return { ...message, source: { ...message.source, replayState } };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Keeps pi-ai model.provider identities native while exposing collision-free
|
|
63
|
+
* Harness route names. Every public operation translates exactly once.
|
|
64
|
+
*/
|
|
65
|
+
export class AliasLlmAdapter extends LlmAdapter {
|
|
66
|
+
constructor(
|
|
67
|
+
private readonly inner: LlmAdapter,
|
|
68
|
+
private readonly aliases: ReadonlyMap<string, string>,
|
|
69
|
+
private readonly policies: ReadonlyMap<string, AliasLlmRoutePolicy> = new Map(),
|
|
70
|
+
) {
|
|
71
|
+
super();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
private nativeProvider(route: string): string {
|
|
75
|
+
const provider = this.aliases.get(route);
|
|
76
|
+
if (provider === undefined) throw new LlmError(`OAuth adapter does not own provider "${route}"`, "NO_ADAPTER");
|
|
77
|
+
return provider;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
providerInfo(provider: string): LlmProviderInfo {
|
|
81
|
+
const native = this.nativeProvider(provider);
|
|
82
|
+
const info = this.inner.providerInfo(native);
|
|
83
|
+
const displayName = this.policies.get(provider)?.displayName;
|
|
84
|
+
return { ...info, id: provider, ...(displayName === undefined ? {} : { name: displayName }) };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
providerRetryPolicy(provider: string): ResolvedRetryPolicy | undefined {
|
|
88
|
+
return this.inner.providerRetryPolicy(this.nativeProvider(provider));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async listModels(provider: string): Promise<readonly LlmModelInfo[]> {
|
|
92
|
+
const native = this.nativeProvider(provider);
|
|
93
|
+
const isAuthenticated = this.policies.get(provider)?.isAuthenticated;
|
|
94
|
+
if (isAuthenticated !== undefined) {
|
|
95
|
+
try {
|
|
96
|
+
if (!(await isAuthenticated())) return [];
|
|
97
|
+
} catch {
|
|
98
|
+
// A corrupt/unreadable credential must hide models instead of breaking
|
|
99
|
+
// the entire model picker or presenting a route that cannot be used.
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const listed = (await this.inner.listModels(native)).map((model) => ({ ...model, provider }));
|
|
104
|
+
const includeModel = this.policies.get(provider)?.includeModel;
|
|
105
|
+
return includeModel === undefined ? listed : listed.filter((model) => includeModel(model.id));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async resolveModel(provider: string, model: string, signal?: AbortSignal): Promise<LlmResolvedModelInfo> {
|
|
109
|
+
const native = this.nativeProvider(provider);
|
|
110
|
+
return { ...(await this.inner.resolveModel(native, model, signal)), provider };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
async *stream(options: GenerateOptions): AsyncIterable<StreamChunk> {
|
|
114
|
+
const route = options.provider;
|
|
115
|
+
const native = this.nativeProvider(route);
|
|
116
|
+
const messages = options.messages.map((message) => normalizeReplayForRoute(message, route));
|
|
117
|
+
let authFailureNotified = false;
|
|
118
|
+
for await (const raw of this.inner.stream({ ...options, provider: native, messages })) {
|
|
119
|
+
const chunk =
|
|
120
|
+
raw.type === "finish" && raw.reason.kind === "error"
|
|
121
|
+
? {
|
|
122
|
+
...raw,
|
|
123
|
+
reason: {
|
|
124
|
+
...raw.reason,
|
|
125
|
+
failure: remapXaiCapacityFailure(remapAuthFailureIfContextOverflow(raw.reason.failure)),
|
|
126
|
+
},
|
|
127
|
+
}
|
|
128
|
+
: raw;
|
|
129
|
+
if (
|
|
130
|
+
!authFailureNotified &&
|
|
131
|
+
chunk.type === "finish" &&
|
|
132
|
+
chunk.reason.kind === "error" &&
|
|
133
|
+
chunk.reason.failure.code === "AUTH"
|
|
134
|
+
) {
|
|
135
|
+
authFailureNotified = true;
|
|
136
|
+
const onAuthFailure = this.policies.get(route)?.onAuthFailure;
|
|
137
|
+
if (onAuthFailure !== undefined) {
|
|
138
|
+
try {
|
|
139
|
+
await onAuthFailure();
|
|
140
|
+
} catch {
|
|
141
|
+
// Invalidation is best-effort: the original AUTH failure must
|
|
142
|
+
// surface unchanged even when the credential store is unreadable.
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (chunk.type === "finish" && chunk.replayState !== undefined) {
|
|
147
|
+
yield { ...chunk, replayState: routePiAiReplayState(chunk.replayState, route) };
|
|
148
|
+
} else {
|
|
149
|
+
yield chunk;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|