mirror of
https://github.com/openai/codex.git
synced 2026-10-27 18:48:37 +00:00
## What Adds an optional hosted login-success redirect path for app-server login requests. - Keeps the existing localhost success page as the default. - Lets app-server callers opt into a hosted success page with an optional protocol field. - Persists credentials before redirecting to the hosted success page. - Keeps org setup and existing CLI/device-code login flows on the local success page. - Accepts an optional typed `appBrand` value and forwards it to the hosted page as `app_brand` so web can select the correct asset. - Generates the app-server protocol schema updates for the new optional fields. ## Why This supports the hosted Codex login success page rollout without changing existing login behavior by default. The Codex Apps frontend can gate the opt-in with Statsig after the hosted web page. ## Rollout safety - Old callers omit the new field and continue using localhost. - New callers talking to old app-server builds remain safe because the Codex Apps side treats the field as optional and defaults the flag off. - Missing brand values default to Codex. - The hosted redirect always uses the app-login source so the hosted page can reopen Codex; the existing streamlined-login visual flag remains separate. ## Validation - `just fmt` - `just fix -p codex-login -p codex-app-server-protocol -p codex-app-server -p codex-app-server-test-client -p codex-tui` - `just test -p codex-login` - `just test -p codex-app-server-protocol` - `just write-app-server-schema` - `git diff HEAD --check` The focused login and protocol run passed all 380 tests. I also started the broader `just test -p codex-app-server`; it compiled successfully, then many tests failed on this machine because spawned test servers tried to use the ambient `/Users/rafaelj/.codex/sqlite` state DB, which is read-only in this sandbox. I stopped that run after confirming the failures shared that environment issue.
118 lines
2.9 KiB
JSON
Generated
118 lines
2.9 KiB
JSON
Generated
{
|
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
"definitions": {
|
|
"LoginAppBrand": {
|
|
"enum": [
|
|
"codex",
|
|
"chatgpt"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
"oneOf": [
|
|
{
|
|
"properties": {
|
|
"apiKey": {
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"enum": [
|
|
"apiKey"
|
|
],
|
|
"title": "ApiKeyv2::LoginAccountParamsType",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"apiKey",
|
|
"type"
|
|
],
|
|
"title": "ApiKeyv2::LoginAccountParams",
|
|
"type": "object"
|
|
},
|
|
{
|
|
"properties": {
|
|
"appBrand": {
|
|
"anyOf": [
|
|
{
|
|
"$ref": "#/definitions/LoginAppBrand"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"default": null
|
|
},
|
|
"codexStreamlinedLogin": {
|
|
"type": "boolean"
|
|
},
|
|
"type": {
|
|
"enum": [
|
|
"chatgpt"
|
|
],
|
|
"title": "Chatgptv2::LoginAccountParamsType",
|
|
"type": "string"
|
|
},
|
|
"useHostedLoginSuccessPage": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"required": [
|
|
"type"
|
|
],
|
|
"title": "Chatgptv2::LoginAccountParams",
|
|
"type": "object"
|
|
},
|
|
{
|
|
"properties": {
|
|
"type": {
|
|
"enum": [
|
|
"chatgptDeviceCode"
|
|
],
|
|
"title": "ChatgptDeviceCodev2::LoginAccountParamsType",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"type"
|
|
],
|
|
"title": "ChatgptDeviceCodev2::LoginAccountParams",
|
|
"type": "object"
|
|
},
|
|
{
|
|
"description": "[UNSTABLE] FOR OPENAI INTERNAL USE ONLY - DO NOT USE. The access token must contain the same scopes that Codex-managed ChatGPT auth tokens have.",
|
|
"properties": {
|
|
"accessToken": {
|
|
"description": "Access token (JWT) supplied by the client. This token is used for backend API requests and email extraction.",
|
|
"type": "string"
|
|
},
|
|
"chatgptAccountId": {
|
|
"description": "Workspace/account identifier supplied by the client.",
|
|
"type": "string"
|
|
},
|
|
"chatgptPlanType": {
|
|
"description": "Optional plan type supplied by the client.\n\nWhen `null`, Codex attempts to derive the plan type from access-token claims. If unavailable, the plan defaults to `unknown`.",
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"type": {
|
|
"enum": [
|
|
"chatgptAuthTokens"
|
|
],
|
|
"title": "ChatgptAuthTokensv2::LoginAccountParamsType",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"accessToken",
|
|
"chatgptAccountId",
|
|
"type"
|
|
],
|
|
"title": "ChatgptAuthTokensv2::LoginAccountParams",
|
|
"type": "object"
|
|
}
|
|
],
|
|
"title": "LoginAccountParams"
|
|
} |