cartethyia 2.5.8 → 2.5.9
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/dist/dashboard/assets/{BannedPage-BKAI54IA.js → BannedPage-Brvuj_Eb.js} +1 -1
- package/dist/dashboard/assets/BannedPage-Brvuj_Eb.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolDetailPage-CkGvxrHu.js → CliToolDetailPage-CqfXtI3y.js} +1 -1
- package/dist/dashboard/assets/CliToolDetailPage-CqfXtI3y.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolsPage-Cj8MYpeY.js → CliToolsPage-GQeS91bg.js} +1 -1
- package/dist/dashboard/assets/CliToolsPage-GQeS91bg.js.gz +0 -0
- package/dist/dashboard/assets/{CombosPage-BDXBEbWT.js → CombosPage-BDRsTXBB.js} +1 -1
- package/dist/dashboard/assets/CombosPage-BDRsTXBB.js.gz +0 -0
- package/dist/dashboard/assets/{ConsoleLogPage-49KH4z3l.js → ConsoleLogPage-zP8AFHX0.js} +1 -1
- package/dist/dashboard/assets/ConsoleLogPage-zP8AFHX0.js.gz +0 -0
- package/dist/dashboard/assets/{CustomizationPage-EHjBmNBZ.js → CustomizationPage-BmfrNZ14.js} +1 -1
- package/dist/dashboard/assets/CustomizationPage-BmfrNZ14.js.gz +0 -0
- package/dist/dashboard/assets/{HealthEventsModal-ByUTtj7j.js → HealthEventsModal-Dn3M6WZc.js} +1 -1
- package/dist/dashboard/assets/HealthEventsModal-Dn3M6WZc.js.gz +0 -0
- package/dist/dashboard/assets/{LoginPage-CYSCKT8S.js → LoginPage-DoreIgm8.js} +1 -1
- package/dist/dashboard/assets/LoginPage-DoreIgm8.js.gz +0 -0
- package/dist/dashboard/assets/{OverviewPage-Bu3iqBMm.js → OverviewPage-CvvD1Ugk.js} +1 -1
- package/dist/dashboard/assets/OverviewPage-CvvD1Ugk.js.gz +0 -0
- package/dist/dashboard/assets/{ProviderDetailPage-FHdgmgjU.js → ProviderDetailPage-Clbn1gsW.js} +1 -1
- package/dist/dashboard/assets/ProviderDetailPage-Clbn1gsW.js.gz +0 -0
- package/dist/dashboard/assets/{ProvidersPage-CCvYS9CF.js → ProvidersPage-BnoPgA7w.js} +1 -1
- package/dist/dashboard/assets/ProvidersPage-BnoPgA7w.js.gz +0 -0
- package/dist/dashboard/assets/{ProxyPage-HOl9cjxl.js → ProxyPage-Bq_TGgdb.js} +1 -1
- package/dist/dashboard/assets/ProxyPage-Bq_TGgdb.js.gz +0 -0
- package/dist/dashboard/assets/{QuotaPage-MUGzIpTK.js → QuotaPage-D9DHXvom.js} +1 -1
- package/dist/dashboard/assets/QuotaPage-D9DHXvom.js.gz +0 -0
- package/dist/dashboard/assets/{SettingsPage-CTdF5TCa.js → SettingsPage-7xV8WkWL.js} +1 -1
- package/dist/dashboard/assets/SettingsPage-7xV8WkWL.js.gz +0 -0
- package/dist/dashboard/assets/{SetupPage-Bra7rkKx.js → SetupPage-Day3mCOn.js} +1 -1
- package/dist/dashboard/assets/SetupPage-Day3mCOn.js.gz +0 -0
- package/dist/dashboard/assets/{SortableList-BRscd-vl.js → SortableList-DQxllnB5.js} +1 -1
- package/dist/dashboard/assets/SortableList-DQxllnB5.js.gz +0 -0
- package/dist/dashboard/assets/{StudioPage-BeevnFtM.js → StudioPage-uMExoWu1.js} +1 -1
- package/dist/dashboard/assets/StudioPage-uMExoWu1.js.gz +0 -0
- package/dist/dashboard/assets/{UsagePage-BWik9fpu.js → UsagePage-DXa1oR-4.js} +1 -1
- package/dist/dashboard/assets/UsagePage-DXa1oR-4.js.gz +0 -0
- package/dist/dashboard/assets/{entry-BqZ5vrM7.js → entry-ByMGkR3C.js} +3 -3
- package/dist/dashboard/assets/entry-ByMGkR3C.js.gz +0 -0
- package/dist/dashboard/assets/{index-9ARd3FIs.js → index-z3zDOSMM.js} +2 -2
- package/dist/dashboard/assets/index-z3zDOSMM.js.gz +0 -0
- package/dist/dashboard/assets/{select-D_BBhBEF.js → select-C6MMiaio.js} +1 -1
- package/dist/dashboard/assets/select-C6MMiaio.js.gz +0 -0
- package/dist/dashboard/index.html +1 -1
- package/dist/dashboard/index.html.gz +0 -0
- package/dist/dashboard/precompressed-assets.json +21 -21
- package/package.json +1 -1
- package/src/console/backup/nine-router.ts +43 -9
- package/src/providers/discovery/openrouter-free-roster.ts +0 -1
- package/src/providers/integrations/buddy/buddy-catalog-shared.ts +3 -2
- package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +2 -1
- package/src/providers/integrations/opencode/provider.ts +0 -3
- package/src/providers/operations/provider-credential-service.ts +29 -3
- package/dist/dashboard/assets/BannedPage-BKAI54IA.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-CkGvxrHu.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-Cj8MYpeY.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-BDXBEbWT.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-49KH4z3l.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-EHjBmNBZ.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-ByUTtj7j.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-CYSCKT8S.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-Bu3iqBMm.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-FHdgmgjU.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-CCvYS9CF.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-HOl9cjxl.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-MUGzIpTK.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-CTdF5TCa.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-Bra7rkKx.js.gz +0 -0
- package/dist/dashboard/assets/SortableList-BRscd-vl.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-BeevnFtM.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-BWik9fpu.js.gz +0 -0
- package/dist/dashboard/assets/entry-BqZ5vrM7.js.gz +0 -0
- package/dist/dashboard/assets/index-9ARd3FIs.js.gz +0 -0
- package/dist/dashboard/assets/select-D_BBhBEF.js.gz +0 -0
|
@@ -152,14 +152,33 @@ export async function loadAccountWithFreshness(
|
|
|
152
152
|
const row = rows[0];
|
|
153
153
|
if (!row) return undefined;
|
|
154
154
|
const lead = skewMs ?? refreshLeadMs(row.providerId);
|
|
155
|
+
// A refresh-capable OAuth account with no stored expiry is unknown-liveness:
|
|
156
|
+
// we have no evidence the access token still works. The old rule left
|
|
157
|
+
// `dueAt` undefined for these, so `resolveCredentialForAccount` skipped the
|
|
158
|
+
// refresh branch and dispatch sent the pasted token as-is. For a token that
|
|
159
|
+
// had already expired on another installation (a 9router/Omniroute import
|
|
160
|
+
// carrying `accessToken` + `refreshToken` + a past `expiresAt` that was
|
|
161
|
+
// dropped by validation, a hand-pasted OAuth bundle with no expiry field,
|
|
162
|
+
// or an upstream that stopped minting expiries) that produced the exact
|
|
163
|
+
// "re-authenticate" refusal the refresh grant exists to prevent. Marking the
|
|
164
|
+
// token due immediately refreshes it on first use; the sweep handles the
|
|
165
|
+
// normal case where `expires_at` is populated.
|
|
166
|
+
const hasRefreshGrant = row.refreshCiphertext != null;
|
|
167
|
+
const kindOauth = row.credentialKind === "oauth";
|
|
168
|
+
const unknownExpiryButRefreshable =
|
|
169
|
+
kindOauth && !row.staticToken && hasRefreshGrant && row.expiresAt == null;
|
|
155
170
|
return {
|
|
156
171
|
row,
|
|
157
172
|
// A static token is never "due": it is used as issued and there is no
|
|
158
173
|
// refresh to run, so the dispatch path must not treat it as stale.
|
|
159
174
|
dueAt:
|
|
160
|
-
row.staticToken
|
|
175
|
+
row.staticToken
|
|
161
176
|
? undefined
|
|
162
|
-
: row.expiresAt
|
|
177
|
+
: row.expiresAt != null
|
|
178
|
+
? row.expiresAt.getTime() - lead
|
|
179
|
+
: unknownExpiryButRefreshable
|
|
180
|
+
? 0
|
|
181
|
+
: undefined,
|
|
163
182
|
};
|
|
164
183
|
}
|
|
165
184
|
|
|
@@ -223,7 +242,14 @@ export async function resolveCredentialForAccount(
|
|
|
223
242
|
if (row.credentialKind === "oauth" && oauth && dueAt !== undefined && dueAt <= Date.now()) {
|
|
224
243
|
const refresher = await oauth.resolveRefresher(row.providerId);
|
|
225
244
|
if (refresher) {
|
|
226
|
-
|
|
245
|
+
// Try to refresh. If it fails (refresh grant dead, upstream unreachable,
|
|
246
|
+
// etc.) keep the already-decrypted stale secret rather than wiping it:
|
|
247
|
+
// dispatch then sends the token we have, and the upstream's own 401 is
|
|
248
|
+
// the authoritative verdict. Wiping it here turned "token expired" into
|
|
249
|
+
// a credential-less GatewayError before the request ever left, which is
|
|
250
|
+
// worse than letting the server say so.
|
|
251
|
+
const refreshed = await oauth.refreshService.ensureFreshAccessToken(accountId, refresher);
|
|
252
|
+
if (refreshed) secret = refreshed;
|
|
227
253
|
}
|
|
228
254
|
}
|
|
229
255
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|