Skip to content

Commit 3d35bf4

Browse files
authored
Merge branch 'main' into claude/ci-affected-rung2
2 parents 49ef07a + f33164d commit 3d35bf4

323 files changed

Lines changed: 30194 additions & 24331 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@zitadel/server": minor
3+
---
4+
5+
Add a team delete endpoint to the API. Deleting a team deactivates it and cascades to its memberships and lifecycle-owned users.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@zitadel/server": minor
3+
"@zitadel/api": minor
4+
---
5+
6+
Add the project claim lifecycle endpoints to the API: `POST /projects/{project_id}/claim/init`, `GET /projects/{project_id}/claim/status`, and `POST /projects/{project_id}/claim/complete`, with matching methods on the generated `@zitadel/api` client. These let a developer start a claim from the CLI, poll its status, and finish it from the browser. The status response is modelled as discriminated `pending`/`completed` variants, and the contract carries the `proj.already_claimed` (409) and `proj.claim_expired` (410) error codes plus `429` rate-limit responses on polling and completion. The server handlers arrive separately, so the operations currently respond `501 Not Implemented`.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@zitadel/server": patch
3+
---
4+
5+
Add claim challenge storage statements (create, get, mark completed) and the personal-team lookup across Postgres, Spanner, and SQLite, groundwork for the claim lifecycle (ADR 046).

.changeset/cli-claim-command.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
"@zitadel/cli": minor
3+
---
4+
5+
Add `zitadel claim`, which attaches a project to a team so it becomes permanent. The command mints a short-lived link with the project secret, opens it in a browser, and blocks until the developer finishes signing in there, then records `claimed_at` and `team_id` in `.zitadel/secret`.
6+
7+
Nothing about the project changes: the issuer, users, passkeys, and applications keep working, and the project secret is not rotated. Running it again once the project belongs to a team is a clean `status: "skipped"` with `reason: "already-claimed"`, whether that is known locally or learned from the platform, so agents can retry safely. Links last 10 minutes; once one lapses the command exits `E_VALIDATION` and points at a fresh run.
8+
9+
`--dry-run` stops before anything is minted and reports `status: "skipped"`, `reason: "dry-run"`. There is nothing to preview, because a claim is decided in a browser rather than by anything the CLI computes.
10+
11+
The link is always printed before any browser opens, so headless machines, SSH sessions, and `--no-open` need no special handling. Where a browser can be launched, `BROWSER`, macOS, Windows, WSL, and the usual Linux openers (`xdg-open`, `gio open`, `x-www-browser`, `sensible-browser`, `gnome-open`, `kde-open`) are all handled. `--timeout <seconds>` stops waiting sooner than the link's own expiry.

.changeset/components-orval-wireup.md

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,14 @@ Removed attributes/properties on `<zitadel-login>`:
4848
or use the new `api-base` attribute for declarative setups. A new
4949
`resume-flow-id` attribute resumes an existing flow handle.
5050

51-
Removed attribute on `<zitadel-logout>`:
51+
Removed attributes on `<zitadel-logout>`:
5252

53-
- `proxy-base`. The element now calls the typed `endSession`
54-
operation (`GET /auth/end-session`) and forwards `client-id` /
55-
`post-sign-out-url` as query parameters.
53+
- `proxy-base`.
54+
- `client-id`. The OIDC end-session surface is not part of the
55+
OpenAPI contract, so the element no longer exposes
56+
`getEndSessionUrl()`. Sign-out calls the typed `revokeMySession`
57+
operation (`DELETE /sessions/me`) and then navigates to
58+
`post-sign-out-url`.
5659

5760
Behaviour changes:
5861

.changeset/console-user-detail.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@zitadel/server": minor
3+
---
4+
5+
The console's user detail screen now shows a user's profile as their schema defines it, split across Overview and Authentication tabs, with their registered passkeys and an action to delete the user. Profile values are read-only for now, because the API has no endpoint for updating a user.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
---
2+
"@zitadel/api": minor
3+
"@zitadel/server": patch
4+
---
5+
6+
Drop the OIDC/OAuth surface from the OpenAPI contract. The spec described
7+
discovery, authorize, token, keys, userinfo, revoke, introspect, device
8+
authorization, and end-session endpoints that this server does not serve,
9+
so the generated clients advertised operations that could never succeed.
10+
11+
Removed operations from the generated `@zitadel/api` client:
12+
13+
- `getOpenIDConfiguration`, `authorizeGet`, `authorizeDevice`, `getToken`,
14+
`getUserInfo`, `getKeys`, `revokeToken`, `introspect`, `endSession`
15+
- `submitFlowEvent` (`POST /flow/{id}/event`)
16+
- `activateFlowDefinition` / `deactivateFlowDefinition`
17+
(`POST /flow_definitions/{id}/activate` and `/deactivate`)
18+
19+
The `usernamePassword` security scheme is gone with them; `oauth2` and
20+
`nextgenSession` are unchanged.
21+
22+
Sign-out is the `revokeMySession` operation (`DELETE /sessions/me`). JWKS
23+
for local development is still served by `@zitadel/api-mock` at
24+
`/auth/keys`, but as a mock-only route rather than a contract operation.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@zitadel/server": patch
3+
---
4+
5+
A session's `state` is now one of `building`, `active`, or `expired`. The `revoked` state is gone from the session response and from the `state` filter of `POST /sessions/query`.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
---
2+
"@zitadel/server": minor
3+
"@zitadel/api": minor
4+
---
5+
6+
New endpoint `GET /users/{user_id}/teams` serves a user's team roster, so a
7+
client can finally get from a user to the teams they belong to.
8+
9+
Each entry is `{ id, name, membership_status, created_at, updated_at }`. The
10+
team's **name** travels with the entry, so a page of the roster renders without
11+
a follow-up `POST /teams/query` per row. Entries come back ordered by team name
12+
and page with `limit` / `page_token` like the other list endpoints;
13+
memberships the user was removed from are not returned. An unknown user is a
14+
404, which is a different answer from a user with an empty roster.
15+
16+
The user read endpoints (`GET /users`, `GET /users/{user_id}`,
17+
`GET /users/me`) also gain `metadata.lifecycle_owner_team_id` — the single team
18+
that owns the user's identity lifecycle, or `null` when the user is self-owned.
19+
That is a different concept from the roster and the two need not agree
20+
(ADR 024): roster membership is collaboration, lifecycle ownership decides who
21+
may deprovision the user. The roster itself stays out of the user payload; it
22+
is unbounded, so it gets its own paginated resource.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
---
2+
"@zitadel/server": minor
3+
---
4+
5+
Rename the last camelCase wire fields in the OpenAPI spec to snake_case, so the whole API uses one convention.
6+
7+
**Breaking:** every renamed property changes on the wire. An unknown property is dropped rather than rejected, so a client left on the old names sends and reads silently empty values instead of failing loudly — update all of them together.
8+
Dropped request fields fall back to their schema default, not to empty. `seed_defaults`
9+
defaults to `true` and `is_change_required` to `false`, so an old client gets the project
10+
resources it opted out of and loses the forced password change it asked for.
11+
12+
Request and response properties:
13+
14+
- `POST /projects` request: `previewOrigins``preview_origins`, `seedDefaults``seed_defaults`
15+
- `POST /projects` response: `projectSecret``project_secret`, `previewSecret``preview_secret`, `previewOrigins``preview_origins`, `createdAt``created_at`
16+
- `GET /projects/{project_id}` and the project query response: `previewOrigins``preview_origins`, `createdAt``created_at`, `updatedAt``updated_at`
17+
- Team responses: `createdAt``created_at`, `updatedAt``updated_at`
18+
- User `metadata`: `createdAt``created_at`, `updatedAt``updated_at`
19+
- `PUT /users/{user_id}/password` request: `isChangeRequired``is_change_required`
20+
- `GET /schemas` response items: `createdAt``created_at`
21+
22+
Filter and sort field values (the enum value, not the property name): `POST /projects/query` and `POST /teams/query` take `created_at` instead of `createdAt` in `filter[].field` and `sorting.field`. An old `createdAt` value is now rejected as an invalid enum value.
23+
24+
Stored user-schema documents are unaffected: `objectType` and `metaSchema` keep their names, since they are schema content rather than envelope fields.

0 commit comments

Comments
 (0)