Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
188be27
feat(codex): admit an account identity the import cannot infer
yyyr-p Aug 4, 2026
536ecff
feat(codex): import a credential from JSON, a callback, or typed fields
yyyr-p Aug 4, 2026
e384b04
feat(codex): serve a request from a credential that cannot renew
yyyr-p Aug 4, 2026
93e1977
test(codex): cover an unknown identity and a credential that cannot r…
yyyr-p Aug 4, 2026
60abbea
feat(gateway): open the Codex import API to three credential sources
yyyr-p Aug 4, 2026
c44c143
feat(web): import a Codex credential from any of its three sources
yyyr-p Aug 4, 2026
dcececb
docs: name the Codex credential sources in the upstream table
yyyr-p Aug 4, 2026
f942bfe
Merge branch 'main' into codex-flexible-import-port
yyyr-p Aug 14, 2026
4b2ea63
Merge branch 'main' of https://github.com/Menci/Floway into codex-fle…
yyyr-p Aug 15, 2026
e62f96c
refactor(web): route codex summary plan through centralized planLabel
yyyr-p Aug 16, 2026
0fa4477
refactor(provider-codex): consolidate duplicate plan-observation helper
yyyr-p Aug 16, 2026
5e5c82a
refactor(provider-codex): collapse redundant OAuth tokens alias
yyyr-p Aug 16, 2026
d8803e6
refactor(web): render codex card plan badge through planLabel
yyyr-p Aug 16, 2026
ccb6e00
refactor(web): share one OAuth-callback import flow across codex and …
yyyr-p Aug 16, 2026
8e0b0c1
refactor(web): share the heavy-or-active usage-status tail
yyyr-p Aug 16, 2026
971d3c7
refactor(gateway): delegate codex refresh persistence to provider hel…
yyyr-p Aug 16, 2026
2c7914d
refactor(provider-codex): extract the 401-refresh-retry gate
yyyr-p Aug 16, 2026
9314389
refactor(provider-codex): move quota snapshot types into state owner
yyyr-p Aug 16, 2026
9b7d3f4
refactor(provider-codex): fold persistAccessToken args into an option…
yyyr-p Aug 16, 2026
aa85c7b
chore(web): drop dead subscription-quota exports
yyyr-p Aug 16, 2026
c0c3b86
refactor(web): narrow oauth-callback-import props into a discriminate…
yyyr-p Aug 16, 2026
a5ffaa0
refactor(provider-codex): fold the 401-refresh-retry guard into retry…
yyyr-p Aug 16, 2026
003d1e3
refactor(provider-codex): merge the codex image call prepare steps
yyyr-p Aug 16, 2026
bad6ab6
refactor(provider-codex): extract the codex account state write scaffold
yyyr-p Aug 16, 2026
e023493
refactor(web): share the heavy-or-active account status type
yyyr-p Aug 16, 2026
d400432
refactor(web): narrow oauth-callback-import record to the mounted kinds
yyyr-p Aug 16, 2026
58d2f77
style(web): align oauth-callback-import union indentation with the li…
yyyr-p Aug 16, 2026
0770415
chore(provider-codex): drop dead modelKey from the image-call prepare…
yyyr-p Aug 16, 2026
51dd7f5
refactor(provider-codex): share the OAuth expires_in-to-ms expiry for…
yyyr-p Aug 16, 2026
fa2d2a3
refactor(provider-codex): fold dispatchCodexHttpCall args into a requ…
yyyr-p Aug 16, 2026
2455bd6
refactor(provider-codex): share one isUnsafeObjectKey guard
yyyr-p Aug 16, 2026
f7e86d7
refactor(web): extract the shared quota-window progress row
yyyr-p Aug 16, 2026
6f727af
refactor(gateway): delegate the codex access-only refresh guard to th…
yyyr-p Aug 16, 2026
62cd157
refactor(provider-codex): bundle performImageCall's fixed request des…
yyyr-p Aug 16, 2026
a6a8615
refactor(provider-codex): fold retryCodexAccess401 args into an optio…
yyyr-p Aug 16, 2026
e24f46d
refactor(provider-codex): route data-plane state writes through the s…
yyyr-p Aug 16, 2026
cf7cfab
refactor(provider-codex): share the assert-allowed-object-keys scaffold
yyyr-p Aug 16, 2026
987aa2e
style(web): order quota-progress-row imports per the lint rule
yyyr-p Aug 16, 2026
eb1f490
style(provider-codex): order config import per the lint rule
yyyr-p Aug 16, 2026
f7c3a3d
refactor(provider-codex): attach the 401-retry gate comment to its fu…
yyyr-p Aug 16, 2026
e033c3e
refactor(provider-codex): reuse identity allowlist and drop redundant…
yyyr-p Aug 16, 2026
e618161
refactor(provider-codex): drop the redundant prepareCodexCall roadmap…
yyyr-p Aug 16, 2026
2213b8e
refactor(provider-codex): fold persistCodexRefreshFailure into persis…
yyyr-p Aug 16, 2026
263d9c9
refactor(provider-codex): share the string-or-null assertion guard
yyyr-p Aug 16, 2026
eca190c
style(provider-codex): await the folded terminal-state write
yyyr-p Aug 16, 2026
025ea7d
refactor(provider-codex): route identity metadata patch through the s…
yyyr-p Aug 16, 2026
74585eb
refactor(provider-codex): share the POST and classify core between di…
yyyr-p Aug 16, 2026
7d73785
chore(provider-codex): drop redundant config allowlist comment and st…
yyyr-p Aug 16, 2026
a524ba6
refactor(gateway): share the OAuth authorize-url body schema
yyyr-p Aug 16, 2026
54f9679
refactor(provider-codex): extract the shared refresh-failed 503 result
yyyr-p Aug 16, 2026
820d0f3
refactor(provider-codex): fold image-call dispatch into a request des…
yyyr-p Aug 16, 2026
7df4dd1
refactor(provider-codex): drop stale plan constraint on image call
yyyr-p Aug 16, 2026
3a8e87a
refactor(provider-codex): rename parse-helpers module to guards
yyyr-p Aug 18, 2026
2f5a043
fix(provider-codex): order guards imports before jwt/oauth imports
yyyr-p Aug 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ responses retain their upstream wire shape.
| Provider | Connection | Model catalog |
| --- | --- | --- |
| GitHub Copilot | GitHub device OAuth on `github.com` or a `*.ghe.com` tenant | Fetched live from Copilot |
| Codex | ChatGPT subscription through the Codex CLI OAuth client | Live inference catalog plus the account's built-in GPT Image capability |
| Codex | ChatGPT subscription: the Codex CLI OAuth client, a pasted credential JSON, or typed token fields | Fetched live from the Codex backend, plus the account's built-in GPT Image capability |
| Claude Code | Claude.ai Pro, Max, Team, or Enterprise subscription through the Claude Code CLI OAuth client | Fetched live from Anthropic |
| Custom | Configurable multi-protocol HTTP endpoint, credential, and per-header ingress passthrough/overwrite rules | Live `/models` (OpenAI, Anthropic, or superset shapes), manual models, or both |
| Azure | Azure AI resource or Foundry project endpoint and API key | Configured models |
Expand Down
168 changes: 168 additions & 0 deletions apps/web/__tests__/components/upstream-editor/codex-import_test.tsx

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

39 changes: 38 additions & 1 deletion apps/web/__tests__/components/upstreams/codex-account_test.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 21 additions & 0 deletions apps/web/__tests__/setup.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { ArrowClockwiseRegular } from '@fluentui/react-icons';
import { fluentComponents } from '../../fluent';
import { useTranslation } from '../../i18n/translation';
import { dateTime, relativeTime } from '../../lib/format-time';
import { clampPercent, percentText } from '../../lib/percent';
import { useLocale } from '../../lib/use-locale';
import { useNow } from '../../lib/use-now';
import { StatusBadge } from '../ui/status-badge';
Expand All @@ -20,11 +19,12 @@ import {
subscriptionLabel,
} from '../upstreams/claude-code-account';
import { ProviderIcon } from '../upstreams/provider-badge';
import { quotaBarColor, WALL_CLOCK_REFRESH_MS } from '../upstreams/subscription-quota';
import { QuotaProgressRow } from '../upstreams/quota-progress-row';
import { WALL_CLOCK_REFRESH_MS } from '../upstreams/subscription-quota';

const {
Accordion, AccordionHeader, AccordionItem, AccordionPanel, Badge, Button,
MessageBar, MessageBarBody, ProgressBar, Spinner, Text, Tooltip,
MessageBar, MessageBarBody, Spinner, Text, Tooltip,
} = fluentComponents;

export function ClaudeCodeAccountCard({ onRefreshQuota, probing, record }: {
Expand Down Expand Up @@ -94,25 +94,20 @@ export function ClaudeCodeAccountCard({ onRefreshQuota, probing, record }: {

{windows.length > 0 && <div className="grid gap-3">
{windows.map(row => {
const percent = clampPercent(row.percent);
return <div key={row.key} className="grid gap-1">
<div className="flex items-baseline justify-between gap-3">
<Text size={200}>{t(`dashboard.upstreamEditor.claudeCode.window.${row.key}`)}</Text>
<div className="flex items-baseline gap-2">
<Text size={200} className="text-fui-fg2">{percentText(percent)}</Text>
{row.status && <Text size={200} className="text-fui-fg3">{row.status}</Text>}
</div>
</div>
<ProgressBar color={quotaBarColor(percent)} max={100} thickness="large" value={percent ?? undefined} />
<div className="flex flex-wrap items-baseline justify-between gap-x-3">
return <QuotaProgressRow
key={row.key}
label={t(`dashboard.upstreamEditor.claudeCode.window.${row.key}`)}
percent={row.percent}
right={row.status && <Text size={200} className="text-fui-fg3">{row.status}</Text>}
footer={<div className="flex flex-wrap items-baseline justify-between gap-x-3">
{row.resetAt && <Text size={200} className="text-fui-fg3">
{t('dashboard.upstreamEditor.claudeCode.resetsAt', { time: dateTime(row.resetAt, locale) })}
</Text>}
<Text size={200} className="text-fui-fg3">
{t('dashboard.upstreamEditor.claudeCode.observed', { time: dateTime(row.fetchedAt, locale) })}
</Text>
</div>
</div>;
</div>}
/>;
})}
</div>}

Expand Down
Loading