Skip to content

chore(api): sync OpenAPI contract - #2

Open
kong[bot] wants to merge 1 commit into
mainfrom
chore/sync-openapi
Open

kong[bot] wants to merge 1 commit into
mainfrom
chore/sync-openapi

Conversation

@kong

@kong kong Bot commented Aug 28, 2026 •

Copy link
Copy Markdown

Summary

API change report

Public API

New Endpoints: 3


GET /projects/{id}/autofix-runs
GET /projects/{id}/autofix-runs/{runId}
POST /projects/{id}/issues/{issueId}/autofix-runs

Deleted Endpoints: None


Modified Endpoints: 20


POST /auth/forgot-password

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • New response: 401

POST /auth/logout

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • New response: 401

POST /auth/oauth/exchange

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Missing or invalid project anon key' to 'Missing or invalid project anon key; or invalid auth proxy metadata'

GET /auth/password-policy

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Invalid, missing, or revoked anon key' to 'Invalid, missing, or revoked anon key; or invalid auth proxy metadata'

POST /auth/refresh

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Invalid or expired refresh token' to 'Invalid or expired refresh token; or invalid auth proxy metadata'

POST /auth/reset-password

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Invalid or expired token' to 'Invalid or expired token; or invalid auth proxy metadata'

POST /auth/signin

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Unauthorized - Invalid credentials, invalid/tampered/revoked anon key,
        or account banned/deleted
        ' to 'Unauthorized - Invalid credentials, invalid/tampered/revoked anon key,
        or account banned/deleted; or invalid auth proxy metadata
        '

POST /auth/signup

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Unauthorized - Invalid, tampered, revoked, or wrong-project anon key
        ' to 'Unauthorized - Invalid, tampered, revoked, or wrong-project anon key.
        Also returned for invalid, repeated, or under-scoped auth proxy metadata
        (invalid auth proxy metadata).
        '

POST /auth/signup-anonymous

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • New response: 401

POST /functions/{functionId}/invoke

  • Description changed from 'Invoke a function. The function's visibility decides which credentials
    may call it, and the function does not run for any other. A private
    function answers every credential but a service key exactly as a
    missing one, with 404, so its name and id cannot be discovered; an anon
    key on an authenticated function gets 403. An SDK calling by name
    resolves it first through GET /functions/resolve, which answers that
    anon key with 404 instead.

With Service Key (admin/background operations, every visibility):

  • Use for background jobs, webhooks, cron, admin operations
  • Function receives payload only (no user context)
  • Database queries bypass RLS (admin access)

With Auth User Token (user-facing, authenticated or public functions):

  • Use for user-initiated actions
  • Includes users from anonymous sign-ins
  • Function receives payload + __volcano_auth context:
    {
      user_id: "uuid",
      email: "user@example.com",
      project_id: "uuid",
      role: "authenticated" or "anonymous"
    }
  • Database queries enforce RLS (user-scoped data)

With Anon Key (public functions only):

  • Requires anon key permission: functions.invoke
  • Function must have visibility: public
  • Function receives payload only (no __volcano_auth)

Transport and CORS:

  • This operation is the authenticated direct RPC endpoint and always uses the
    POST {payload: ...} contract, including for functions whose DNS ingress is
    configured in HTTP mode.
  • The geo-routed DNS ingress is the function's invoke_url. It is on a
    different domain from this API, so it cannot be derived from the API host.
  • RPC-mode DNS ingress accepts POST at /. HTTP-mode DNS ingress accepts GET,
    HEAD, POST, PUT, PATCH, and DELETE at / and nested paths.
  • Direct and RPC-mode CORS preflight advertises POST, OPTIONS. HTTP-mode DNS
    preflight advertises GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS.
  • http_auth_mode: none applies only to public HTTP-mode DNS ingress; this
    direct operation always requires a Volcano credential.

Durable functions are not invocable here. A durable function's id
answers 404, whatever its visibility, because a synchronous call would
run it with no execution record, no idempotency and no concurrency
accounting. Start one with
POST /durable-functions/{functionId}/executions.
' to 'Invoke a function. The function's visibility decides which credentials
may call it, and the function does not run for any other. A private
function answers every credential but a service key exactly as a
missing one, with 404, so its name and id cannot be discovered; an anon
key on an authenticated function gets 403. An SDK calling by name
resolves it first through GET /functions/resolve, which answers that
anon key with 404 instead.

With Service Key (admin/background operations, every visibility):

  • Use for background jobs, webhooks, cron, admin operations
  • Function receives payload only (no user context)
  • Database queries bypass RLS (admin access)

With Auth User Token (user-facing, authenticated or public functions):

  • Use for user-initiated actions
  • Includes users from anonymous sign-ins
  • Function receives payload + __volcano_auth context:
    {
      user_id: "uuid",
      email: "user@example.com",
      project_id: "uuid",
      role: "authenticated" or "anonymous"
    }
  • Database queries enforce RLS (user-scoped data)

With Anon Key (public functions only):

  • Requires anon key permission: functions.invoke
  • Function must have visibility: public
  • Function receives payload only (no __volcano_auth)

Reserved payload keys: the top-level __volcano_auth and
__volcano_http keys are reserved. Volcano removes caller-supplied
values for both before the function runs; only an auth user token adds
a server-built __volcano_auth, and only HTTP-mode ingress sets
__volcano_http: true.

Transport and CORS:

  • This operation is the authenticated direct RPC endpoint and always uses the
    POST {payload: ...} contract, including for functions whose DNS ingress is
    configured in HTTP mode.
  • The geo-routed DNS ingress is the function's invoke_url. It is on a
    different domain from this API, so it cannot be derived from the API host.
  • RPC-mode DNS ingress accepts POST at /. HTTP-mode DNS ingress accepts GET,
    HEAD, POST, PUT, PATCH, and DELETE at / and nested paths.
  • Direct and RPC-mode CORS preflight advertises POST, OPTIONS. HTTP-mode DNS
    preflight advertises GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS.
  • http_auth_mode: none applies only to public HTTP-mode DNS ingress; this
    direct operation always requires a Volcano credential.

Durable functions are not invocable here. A durable function's id
answers 404, whatever its visibility, because a synchronous call would
run it with no execution record, no idempotency and no concurrency
accounting. Start one with
POST /durable-functions/{functionId}/executions.
'

  • Request body changed
    • Content changed
      • Modified media type: application/json
        • Schema changed
          • Properties changed
            • Modified property: payload
              • Description changed from 'Payload to send to the function.

If invoked with auth user token, Volcano automatically injects __volcano_auth context:

{
  ...yourPayload,
  __volcano_auth: {
    user_id: "uuid",
    email: "user@example.com",
    project_id: "uuid",
    role: "authenticated" | "anonymous"
  }
}

' to 'Payload to send to the function.

If invoked with auth user token, Volcano automatically injects __volcano_auth context:

{
  ...yourPayload,
  __volcano_auth: {
    user_id: "uuid",
    email: "user@example.com",
    project_id: "uuid",
    role: "authenticated" | "anonymous"
  }
}

The top-level __volcano_auth and __volcano_http keys are reserved;
Volcano removes caller-supplied values for both.
'

GET /projects

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: data
                • Items changed
                  • Properties changed
                    • Modified property: health
                    • Property 'AllOf' changed
                    • Modified schema: #/components/schemas/ProjectHealthSummary
                    • Properties changed
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]

POST /projects

  • Responses changed
    • Modified response: 201
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: health
                • Property 'AllOf' changed
                  • Modified schema: #/components/schemas/ProjectHealthSummary
                    • Properties changed
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]

GET /projects/{id}

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: health
                • Property 'AllOf' changed
                  • Modified schema: #/components/schemas/ProjectHealthSummary
                    • Properties changed
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]

PATCH /projects/{id}

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: health
                • Property 'AllOf' changed
                  • Modified schema: #/components/schemas/ProjectHealthSummary
                    • Properties changed
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]

POST /projects/{id}/frontends

  • Description changed from 'Creates and deploys a frontend for the project.
    If a frontend with the same name already exists in the project, this operation updates that
    frontend using the uploaded archive and starts a new deployment. A deployment that starts
    immediately returns status: provisioning, then transitions to active, degraded, or
    failed. If another deployment is running, the response preserves the frontend's current status
    and exposes the queued deployment through pending_deployment_id.
    Existing frontend traffic continues to use an available runtime while the new deployment builds
    and provisions. Each deployment publishes its own static assets before the runtimes switch to its
    build, and the live build's assets keep serving until the new deployment is live, so a page loaded
    mid-deployment resolves its assets whichever build served it. A failed redeploy puts the runtimes
    back on the build they were running, leaves the frontend active on the previous deployment, and
    records the attempted deployment as failed. degraded means the runtime remains available but
    edge synchronization requires recovery; Volcano retries the edge step without rebuilding. Only one deployment may run for a
    given frontend, while independent frontends and projects can deploy concurrently.
    For monorepos, provide app_root as a relative path from the uploaded archive root
    to the Next.js app that should be built. Omit it for single-app archives.
    Supported frontend environments are Next.js 15.x and 16.x with Node.js
    22.x or 24.x. The Node.js runtime is inferred from
    package.json engines.node; if omitted, Volcano uses Node.js 22.x.
    The selected Node.js family must also satisfy the installed Next.js package's
    engines.node constraint. Volcano tests Next 15.5.27 (^18.18.0 || ^19.8.0 || >=20.0.0) and Next 16.4.0 (>=20.9.0).
    Source archive size is enforced by the API with SOURCE_ARCHIVE_SIZE_LIMIT_MB; the CLI
    does not apply its own source archive size limit. After the final container images are
    built, the publish build enforces LAMBDA_TARGET_CONTAINER_SIZE_LIMIT_MB before pushing.
    This operation is limited by plan-based frontend deployment quotas (FREE_FRONTEND_DEPLOYMENTS, PRO_FRONTEND_DEPLOYMENTS).
    Each project can contain up to 10,000 frontends regardless of plan.
    ' to 'Creates and deploys a frontend for the project.
    If a frontend with the same name already exists in the project, this operation updates that
    frontend using the uploaded archive and starts a new deployment. A deployment that starts
    immediately returns status: provisioning, then transitions to active, degraded, or
    failed. If another deployment is running, the response preserves the frontend's current status
    and exposes the queued deployment through pending_deployment_id.
    Existing frontend traffic continues to use an available runtime while the new deployment builds
    and provisions. Each deployment publishes its own static assets before the runtimes switch to its
    build, and the live build's assets keep serving until the new deployment is live, so a page loaded
    mid-deployment resolves its assets whichever build served it. A failed redeploy puts the runtimes
    back on the build they were running, leaves the frontend active on the previous deployment, and
    records the attempted deployment as failed. degraded means the runtime remains available but
    edge synchronization requires recovery; Volcano retries the edge step without rebuilding. Only one deployment may run for a
    given frontend, while independent frontends and projects can deploy concurrently.
    For monorepos, provide app_root as a relative path from the uploaded archive root
    to the Next.js app that should be built. Omit it for single-app archives.
    Supported frontend environments are Next.js 15.x and 16.x with Node.js
    22.x or 24.x. The Node.js runtime is inferred from
    package.json engines.node; if omitted, Volcano uses Node.js 22.x.
    The selected Node.js family must also satisfy the installed Next.js package's
    engines.node constraint. Volcano tests Next 15.5.28 (^18.18.0 || ^19.8.0 || >=20.0.0) and Next 16.4.2 (>=20.9.0).
    Source archive size is enforced by the API with SOURCE_ARCHIVE_SIZE_LIMIT_MB; the CLI
    does not apply its own source archive size limit. After the final container images are
    built, the publish build enforces LAMBDA_TARGET_CONTAINER_SIZE_LIMIT_MB before pushing.
    This operation is limited by plan-based frontend deployment quotas (FREE_FRONTEND_DEPLOYMENTS, PRO_FRONTEND_DEPLOYMENTS).
    Each project can contain up to 10,000 frontends regardless of plan.
    '

GET /projects/{id}/health

  • Description changed from 'Returns a fast control-plane health snapshot for the project and its
    deployed resources. The endpoint does not run live provider probes.
    A successful request returns 200 even when the project status is
    unhealthy; transport and authorization failures use HTTP errors.
    ' to 'Returns a fast control-plane health snapshot for the project and its
    deployed resources. The endpoint does not run live provider probes.
    A successful request returns 200 even when the project status is
    degraded or critical; transport and authorization failures use HTTP
    errors.
    '
  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: checks
                • Items changed
                  • Properties changed
                    • Modified property: scope
                    • Properties changed
                    • Modified property: resource
                    • Properties changed
                    • Modified property: type
                    • New enum values: [database_branch]
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]
              • Modified property: findings
                • Items changed
                  • Properties changed
                    • Modified property: scope
                    • Properties changed
                    • Modified property: resource
                    • Properties changed
                    • Modified property: type
                    • New enum values: [database_branch]
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]
              • Modified property: status
                • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                • New enum values: [empty needs_attention]

DELETE /projects/{id}/logo

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: health
                • Property 'AllOf' changed
                  • Modified schema: #/components/schemas/ProjectHealthSummary
                    • Properties changed
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]

POST /projects/{id}/logo

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: health
                • Property 'AllOf' changed
                  • Modified schema: #/components/schemas/ProjectHealthSummary
                    • Properties changed
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]

POST /projects/{id}/service-keys

  • Request body changed
    • Content changed
      • Modified media type: application/json
        • Schema changed
          • Properties changed
            • Modified property: permissions
              • Description changed from 'Optional least-privilege scope for the key. When omitted, empty, or
                containing only blank strings, the key is granted full access ([""])
                for backward compatibility. Provide an explicit list (e.g.
                ["functions.invoke", "locks.manage"]) to restrict the key; "
                "
                grants everything. Scope enforcement applies to function invocation,
                storage object operations, and project locks.
                ' to 'Optional least-privilege scope for the key. When omitted, empty, or
                containing only blank strings, the key is granted full access ([""])
                for backward compatibility. Provide an explicit list (e.g.
                ["functions.invoke", "locks.manage"]) to restrict the key; "
                "
                grants everything. Scope enforcement applies to function invocation,
                storage object operations, project locks, and server-side auth proxy
                metadata (auth.signin, auth.signup, auth.refresh, auth.logout,
                auth.password_reset).
                '

DELETE /projects/{id}/storage/buckets/{bucketName}/policies/{policyId}

  • Responses changed
    • New response: 404

Validation

@kong
kong Bot force-pushed the chore/sync-openapi branch from 7cd039d to b69cdc1 Compare August 28, 2026 13:58
@kong
kong Bot force-pushed the chore/sync-openapi branch 4 times, most recently from ebe76ec to 5660716 Compare August 30, 2026 12:25
@kong
kong Bot force-pushed the chore/sync-openapi branch from 5660716 to 697020d Compare September 10, 2026 22:00
@CLAassistant

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

@kong
kong Bot force-pushed the chore/sync-openapi branch 13 times, most recently from ebaec87 to 2891cbb Compare September 17, 2026 18:04
@kong
kong Bot force-pushed the chore/sync-openapi branch 8 times, most recently from 2768536 to 0d69f5d Compare September 19, 2026 06:17
@kong
kong Bot force-pushed the chore/sync-openapi branch from 0d69f5d to b463e46 Compare October 5, 2026 22:54
@kong
kong Bot force-pushed the chore/sync-openapi branch 16 times, most recently from ae0ea59 to 22f5e73 Compare October 15, 2026 01:50
@chaser-kong
chaser-kong self-requested a review October 15, 2026 16:06
chaser-kong
chaser-kong previously approved these changes Oct 15, 2026

@tkkhq tkkhq left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Existing sandbox contract mismatches remain at this head:

  • Setting idle_timeout_seconds still adds that field to the create request at src/volcano_sdk/sandboxes.py:68–70, but CreateSandboxSessionRequest forbids extra properties and does not define it. Remove the option from SandboxCreateOptions and request construction, and update their tests. Existing discussion.
  • An unlimited local session returns expires_at: null, which the contract permits. Session construction and refresh still pass it to the timestamp decoder at src/volcano_sdk/sandbox_session.py:89,166; the decoder rejects None with TypeError. Accept None in the public session type and decoder, and add regression coverage. Existing discussion.

@kong
kong Bot force-pushed the chore/sync-openapi branch from 2390c31 to 2f166c8 Compare October 16, 2026 04:47
@marckong
marckong marked this pull request as ready for review October 16, 2026 05:36
@marckong
marckong requested a review from a team as a code owner October 16, 2026 05:36
@github-actions

Copy link
Copy Markdown

AI review: 1 P0-P2 finding(s)

Reviewed 2f166c8. Run log

Syncs the OpenAPI contract and generated client for autofix runs, auth-proxy headers, and health statuses. One logout regression can leave local credentials active after a failed sign-out.

🟡 P2

  • src/volcano_sdk/_generated/api/authentication/auth_logout.py:60 Preserve local sign-out cleanup when a 401 body cannot be parsed

⚪ P3

  • src/volcano_sdk/_generated/api/authentication/auth_logout.py:60 A logout 401 that doesn't match the Error schema now raises a raw exception from sign_out and leaves the local session set

Not checked: The AI review read the diff, the code, and the PR's text; it ran no tests or builds and read nothing outside this repository.

  • Whether the vendored openapi.yaml matches Kong/volcano-hosting@​a5141579a472 exactly.
  • Whether CI's regeneration-drift check (scripts/check_openapi.py) passes with the pinned generator and templates.
  • Verify in Kong/volcano-hosting that auth-proxy headers enforce the documented same-project and operation-scope restrictions.

Push a fix, or have a collaborator with write access (including the PR author) add the ai-review-override label to accept 2f166c8 as is. An override also needs a human review.

Human review: needed

  • Should service keys authorize assertions of browser client IPs across auth routes under the new AuthProxyAuthorization contract in openapi/openapi.yaml?

Decide the points above: approve to accept them, or request changes.

Suggested reviewer: swkeever (most commits to openapi.yaml and the generated auth/function clients). Any collaborator with write access other than the author can approve.

return response_204

if response.status_code == 401:
response_401 = Error.from_dict(response.json())

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚪ P3: A logout 401 that doesn't match the Error schema now raises a raw exception from sign_out and leaves the local session set

The regenerated auth_logout._parse_response now runs Error.from_dict(response.json()) on a 401. AuthIdentityTransport.auth_logout (src/volcano_sdk/_transport_auth_identity.py:365) still calls auth_logout.sync_detailed and passes the result to parsed_response.

If a 401 body is not JSON, or has no error key (for example a 401 from a gateway or proxy), the parser raises JSONDecodeError or KeyError. Before this change, a 401 had no parser: parsed was None and parsed_response decoded the body leniently.

_sign_out_captured (src/volcano_sdk/_auth_requests.py:229-240) only catches VolcanoError. The raw exception therefore skips clear_session_if_current, and client.auth.sign_out() fails without clearing the local session. Previously it raised AuthenticationError after clearing the session.

The documented contract says the Volcano server returns Error JSON on a 401, so the trigger needs a 401 that breaks that contract. The fix is to switch the logout adapter to generated_request(...) plus unparsed_response, the pattern auth_forgot_password, auth_reset_password, and auth_signup_anonymous already use.

Found by claude-opus-5-5

return response_204

if response.status_code == 401:
response_401 = Error.from_dict(response.json())

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 P2: Preserve local sign-out cleanup when a 401 body cannot be parsed

If an auth proxy returns HTTP 401 with an empty or HTML body, this new parser raises JSONDecodeError. AuthIdentityTransport.auth_logout() calls it directly, while AuthRequests._sign_out_captured() catches only VolcanoError, so client.auth.sign_out() skips clear_session_if_current() and retains local credentials, violating the cleanup guarantee in docs/authentication.md. Previously this response reached normal error handling and session cleanup. Preserve raw error handling in the handwritten logout adapter or translate parsing failures into TransportError.

Found by gpt-6.1-sol

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants