@jskit-ai/agent-docs 0.1.61 → 0.1.63

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.
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Database layer
4
4
 
5
- At the end of the previous chapter, the app could already authenticate real users through Supabase, but JSKIT was still using its no-database fallback for the app-side user mirror. In this chapter, we install the MySQL database runtime, add the migration tooling, and explain what that changes immediately and what it still does **not** change yet.
5
+ At the end of the previous chapter, the app could already authenticate real users through the local auth provider, without requiring Supabase or a database. In this chapter, we install the MySQL database runtime, add the migration tooling, and explain what that changes immediately and what it still does **not** change yet.
6
6
 
7
7
  This chapter is more infrastructural than the previous ones. That is intentional. There is no dramatic new screen in the browser. The important change is that the app gains a real database layer that later packages can depend on.
8
8
 
@@ -484,32 +484,31 @@ But the app still does **not** have:
484
484
  - workspace tables
485
485
  - CRUD tables of its own
486
486
 
487
- That means authentication is still only **partly** database-backed.
487
+ That means the app's account model still is not database-backed.
488
488
 
489
- - Supabase is still the real source of truth for auth users and sessions.
489
+ - local auth is still the real source of truth for auth users and sessions.
490
490
  - JSKIT still has a database runtime available.
491
- - But JSKIT still has **no installed package yet** that tells auth to switch from the standalone in-memory profile mirror to the persistent users-backed one.
491
+ - But JSKIT still has **no installed package yet** that projects auth identities into persistent users/account tables.
492
492
 
493
493
  So this chapter is an infrastructure step. It makes the database layer available, but it does not yet install the package that uses that layer for persistent JSKIT-side user data.
494
494
 
495
- **Important: Auth Is Still In Standalone Mode**
495
+ **Important: Auth Is Not Users-Backed Yet**
496
496
 
497
497
  This is the most important thing to keep straight:
498
498
 
499
- - adding `database-runtime-mysql` does **not** automatically make the auth chapter's temporary mirror disappear
499
+ - adding `database-runtime-mysql` does **not** automatically change where auth stores credentials or sessions
500
500
  - it also does **not** create JSKIT user rows yet
501
501
 
502
- That only changes later, when a package such as `users-core` is installed and tells auth to use the persistent users-backed profile sync mode.
502
+ That only changes later, when a package such as `users-core` is installed and registers the persistent users-backed `auth.profile.projector`.
503
503
 
504
504
  So after this chapter the app has a database layer, but authentication still behaves like:
505
505
 
506
- - real Supabase auth
507
- - temporary JSKIT-side mirror
506
+ - real local auth
507
+ - provider identity in the auth session
508
508
 
509
509
  not yet:
510
510
 
511
- - real Supabase auth
512
- - persistent JSKIT-side users layer
511
+ - real local auth plus a persistent JSKIT-side users layer
513
512
 
514
513
  ## Under the hood
515
514
 
@@ -702,43 +701,34 @@ Right now:
702
701
 
703
702
  - `shell-web` is still a shell/layout package
704
703
  - `auth-web` is still a web auth package
705
- - `auth-provider-supabase-core` is still talking to Supabase for the real auth work
704
+ - `auth-provider-local-core` is still handling credentials and sessions through `auth.local.backend`
706
705
 
707
706
  So the app has gained a new capability, but no visible part of the UI depends on that capability yet.
708
707
 
709
- ### Why auth still uses the standalone profile mirror
708
+ ### Why auth is not users-backed yet
710
709
 
711
710
  This is the most important code path to read in this chapter.
712
711
 
713
- Inside `AuthSupabaseServiceProvider`, auth resolves its profile mode from server app config:
712
+ Inside the local provider, auth only projects provider identities into the app users layer when something registers the provider-neutral `auth.profile.projector` token:
714
713
 
715
714
  ```js
716
- const authProfileMode = resolveAuthProfileMode(appConfig);
717
- let userProfileSyncService = fallbackStandaloneProfileSyncService;
718
-
719
- if (authProfileMode === PROFILE_MODE_USERS) {
720
- if (!scope.has("users.profile.sync.service")) {
721
- throw new Error(
722
- "AuthSupabaseServiceProvider requires users.profile.sync.service when config.auth.profileMode is \"users\"."
723
- );
724
- }
725
- userProfileSyncService = scope.make("users.profile.sync.service");
726
- }
715
+ const profileProjector = scope.has("auth.profile.projector")
716
+ ? scope.make("auth.profile.projector")
717
+ : null;
727
718
  ```
728
719
 
729
720
  That snippet explains the whole consequence of this chapter.
730
721
 
731
- - The auth provider's server config still sets `config.auth.profileMode = "standalone"`.
732
- - If `profileMode` is missing entirely, the runtime assumes `users`, but it is not missing in the auth-only scaffold.
733
- - The fallback service is still the in-memory profile sync service from the previous chapter.
734
- - Nothing in `database-runtime-mysql` changes `config.auth.profileMode`.
722
+ - The auth provider can authenticate users without an app database.
723
+ - Nothing in `database-runtime-mysql` registers `auth.profile.projector`.
735
724
  - Nothing in `database-runtime-mysql` provides `users.profile.sync.service`.
725
+ - The database runtime only provides the database foundation that later packages can use.
736
726
 
737
727
  So the auth layer keeps behaving the same way it did before:
738
728
 
739
- - Supabase still owns the real auth user and session
740
- - JSKIT still mirrors just enough profile data locally
741
- - that JSKIT-side mirror is still not persistent yet
729
+ - local auth still owns the auth user and session
730
+ - JSKIT can still display the provider identity from the auth session
731
+ - there is still no persistent JSKIT users/account model yet
742
732
 
743
733
  The database runtime is ready, but the users layer that will actually use it has not been installed yet.
744
734
 
@@ -765,12 +755,12 @@ This chapter did not make the app feel dramatically different in the browser, bu
765
755
 
766
756
  But just as importantly, this chapter also defined what has **not** changed yet:
767
757
 
768
- - auth still uses the standalone JSKIT-side mirror
758
+ - auth still uses the local provider's own backend
769
759
  - JSKIT still has no persistent users layer of its own
770
760
  - no feature package has started storing real app data yet
771
761
 
772
762
  So the right mental model at the end of this chapter is:
773
763
 
774
- - Supabase already handles real authentication
764
+ - local auth already handles real authentication
775
765
  - MySQL is wired up and ready
776
766
  - the persistent JSKIT-side user model arrives in the next chapter
@@ -43,8 +43,6 @@ Minimal apps can still install the standard shell later with `npx jskit add pack
43
43
  If you already know you want a small non-workspace baseline right after the scaffold, this is the shortest reproducible path:
44
44
 
45
45
  ```bash
46
- SUPABASE_URL=...
47
- SUPABASE_KEY=...
48
46
  DB_HOST=127.0.0.1
49
47
  DB_PORT=3306
50
48
  DB_NAME=exampleapp
@@ -55,12 +53,7 @@ npx @jskit-ai/create-app exampleapp --tenancy-mode none
55
53
  cd exampleapp
56
54
  npm install
57
55
 
58
- npx jskit add package auth-provider-supabase-core \
59
- --auth-supabase-url "$SUPABASE_URL" \
60
- --auth-supabase-publishable-key "$SUPABASE_KEY" \
61
- --app-public-url "http://localhost:5173"
62
-
63
- npx jskit add bundle auth-base
56
+ npx jskit add bundle auth-local
64
57
 
65
58
  npx jskit add package database-runtime-mysql \
66
59
  --db-host "$DB_HOST" \
@@ -76,6 +69,8 @@ npm install
76
69
  npm run db:migrate
77
70
  ```
78
71
 
72
+ The default auth install is intentionally local and simple. Do not start a new app by adding Supabase, OAuth, OTP, provider linking, or a users/profile projection unless that complexity is already part of the app you are building.
73
+
79
74
  If you want the larger workspace-enabled stack with the first assistant already configured, use [Quickstart](/guide/app-setup/quickstart) instead.
80
75
 
81
76
  **Try Bash Completion!**
@@ -15,7 +15,7 @@ The base flow below gives you:
15
15
  - users
16
16
  - console
17
17
  - MySQL
18
- - Supabase auth
18
+ - local auth with no external auth service
19
19
  - one `admin` assistant configured from `console`
20
20
 
21
21
  It also shows the first page-extension moves most apps need:
@@ -32,8 +32,6 @@ Set these values first:
32
32
 
33
33
  ```bash
34
34
  OPENAI_API_KEY=...
35
- SUPABASE_URL=...
36
- SUPABASE_KEY=...
37
35
  DB_HOST=127.0.0.1
38
36
  DB_PORT=3306
39
37
  DB_NAME=testapp
@@ -50,12 +48,7 @@ npx @jskit-ai/create-app testapp --tenancy-mode personal
50
48
  cd testapp
51
49
  npm install
52
50
 
53
- npx jskit add package auth-provider-supabase-core \
54
- --auth-supabase-url "$SUPABASE_URL" \
55
- --auth-supabase-publishable-key "$SUPABASE_KEY" \
56
- --app-public-url "http://localhost:5173"
57
-
58
- npx jskit add bundle auth-base
51
+ npx jskit add bundle auth-local
59
52
 
60
53
  npx jskit add package database-runtime-mysql \
61
54
  --db-host "$DB_HOST" \
@@ -89,6 +82,8 @@ npm install
89
82
  npm run db:migrate
90
83
  ```
91
84
 
85
+ Keep authentication deliberately basic while the product is still taking shape. Start with `auth-local`, build the app's core workflows, then add Supabase, OAuth, OTP, provider linking, app-user projection, or workspace/account complexity when the product actually needs those features.
86
+
92
87
  At this point you have:
93
88
 
94
89
  - a workspace-enabled app with `tenancyMode = "personal"`
@@ -2,15 +2,15 @@
2
2
 
3
3
  # Users
4
4
 
5
- At the end of the previous chapter, the app had a real database runtime, but it still did not have JSKIT's own persistent users layer. Authentication worked, but the app-side profile mirror was still only the temporary fallback from the auth chapter.
5
+ At the end of the previous chapter, the app had a real database runtime, but it still did not have JSKIT's own persistent users layer. Authentication worked, but signed-in people were still only provider identities from the auth layer.
6
6
 
7
- This chapter is where that changes. We install `users-web`, run the new migrations, and let JSKIT start treating authenticated people as persistent app users rather than only as Supabase identities.
7
+ This chapter is where that changes. We install `users-web`, run the new migrations, and let JSKIT start treating authenticated people as persistent app users rather than only as auth-provider identities.
8
8
 
9
9
  `users-web` sounds like a UI package, but it is actually the point where several layers arrive together:
10
10
 
11
11
  - the persistent users/account data model from `users-core`
12
12
  - the account surface and account settings UI
13
- - the switch from standalone auth profile sync to users-backed auth profile sync
13
+ - the switch from provider-only auth profiles to users-backed auth profile projection
14
14
 
15
15
  This is also the first chapter where the difference between "JSKIT wrote migration files into the app" and "Knex applied those files to the database" becomes important in practice.
16
16
 
@@ -39,10 +39,11 @@ This is the first chapter where the migration step is not just "nice to have."
39
39
 
40
40
  `users-core` writes:
41
41
 
42
+ - the provider-neutral `auth.profile.projector` service binding through its runtime provider
42
43
  - `config.auth.profileMode = "users"` into `config/server.js`
43
44
  - real users/account schema migrations into `migrations/`
44
45
 
45
- That means the app is expected to use the persistent users-backed profile sync service. If you skip `npm run db:migrate`, the code and routes are installed, but the required tables are still missing.
46
+ That means the app is expected to project authenticated identities into the persistent users-backed profile sync service. If you skip `npm run db:migrate`, the code and routes are installed, but the required tables are still missing.
46
47
 
47
48
  So the correct flow is:
48
49
 
@@ -63,14 +64,14 @@ This chapter is the real transition from "authentication exists" to "the app kno
63
64
 
64
65
  ### Authentication becomes users-backed
65
66
 
66
- In the database chapter, JSKIT used the standalone in-memory profile mirror. After installing `users-web`, JSKIT expects to synchronize authenticated users into real JSKIT tables.
67
+ In the database chapter, JSKIT still treated the signed-in person as an auth-provider identity. After installing `users-web`, JSKIT expects to synchronize authenticated users into real JSKIT tables.
67
68
 
68
69
  That is the biggest architectural change in this chapter.
69
70
 
70
- - Supabase still owns the real auth identity and session
71
+ - the selected auth provider still owns the auth identity and session
71
72
  - JSKIT owns a persistent users/account data model in MySQL
72
73
 
73
- So after this chapter, a signed-in user is not only "someone Supabase knows about." They are also a persistent JSKIT-side user with settings and profile state in the app database.
74
+ So after this chapter, a signed-in user is not only "someone the auth provider knows about." They are also a persistent JSKIT-side user with settings and profile state in the app database.
74
75
 
75
76
  ### The app gets an authenticated account surface
76
77
 
@@ -119,20 +120,28 @@ This is the first chapter where the app starts to feel like it has a real user m
119
120
 
120
121
  The most interesting files are spread across config, migrations, routing, and the app-owned account UI.
121
122
 
122
- ### `config/server.js` flips auth into users mode
123
+ ### `users-core` projects auth identities into app users
123
124
 
124
- The most important new server-only config line is:
125
+ The most important server-side change is the provider-neutral projector binding from `users-core`:
125
126
 
126
127
  ```js
127
- config.auth ||= {};
128
- config.auth.profileMode = "users";
128
+ if (!app.has("auth.profile.projector")) {
129
+ app.singleton("auth.profile.projector", (scope) => scope.make("users.profile.sync.service"));
130
+ }
129
131
  ```
130
132
 
131
- That one line explains the deepest change in the chapter.
133
+ That one binding explains the deepest change in the chapter.
132
134
 
133
- Before this chapter, auth used the standalone fallback profile sync service. After this chapter, auth is told to use the persistent users-backed profile sync flow instead.
135
+ Before this chapter, auth could authenticate a user without creating a persistent app-owned user row. After this chapter, auth providers can call `auth.profile.projector.syncIdentityProfile(...)` and get back a persistent users-backed profile.
134
136
 
135
- That only works because `users-core` also installs the required repositories, services, and tables.
137
+ `users-core` also writes this server-only config line for Supabase compatibility:
138
+
139
+ ```js
140
+ config.auth ||= {};
141
+ config.auth.profileMode = "users";
142
+ ```
143
+
144
+ The local provider uses the token directly. The Supabase provider also understands `config.auth.profileMode = "users"` and resolves the same users-backed sync service. In both cases, this only works because `users-core` installs the required repositories, services, and tables.
136
145
 
137
146
  ### `migrations/` stops being mostly empty
138
147
 
@@ -253,19 +262,19 @@ That is worth noticing because this is a higher level of scaffolding:
253
262
 
254
263
  ### Why auth uses the users layer
255
264
 
256
- In the previous chapter, auth was explicitly configured for the standalone profile sync fallback. The core logic in `AuthSupabaseServiceProvider` looks like this:
265
+ In the previous chapter, auth did not have a users-backed projector. The core logic in `registerUsersCore()` looks like this:
257
266
 
258
267
  ```js
259
- const authProfileMode = resolveAuthProfileMode(appConfig);
260
- let userProfileSyncService = fallbackStandaloneProfileSyncService;
261
-
262
- if (authProfileMode === PROFILE_MODE_USERS) {
263
- if (!scope.has("users.profile.sync.service")) {
264
- throw new Error(
265
- "AuthSupabaseServiceProvider requires users.profile.sync.service when config.auth.profileMode is \"users\"."
266
- );
267
- }
268
- userProfileSyncService = scope.make("users.profile.sync.service");
268
+ app.singleton("users.profile.sync.service", (scope) => {
269
+ return createAuthProfileSyncService({
270
+ userProfilesRepository: scope.make("internal.repository.user-profiles"),
271
+ userSettingsRepository: scope.make("internal.repository.user-settings"),
272
+ lifecycleContributors: resolveProfileSyncLifecycleContributors(scope)
273
+ });
274
+ });
275
+
276
+ if (!app.has("auth.profile.projector")) {
277
+ app.singleton("auth.profile.projector", (scope) => scope.make("users.profile.sync.service"));
269
278
  }
270
279
  ```
271
280
 
@@ -273,11 +282,11 @@ The important part is concrete.
273
282
 
274
283
  After `users-web`:
275
284
 
276
- - `config/server.js` sets `config.auth.profileMode = "users"`
277
- - `users-core` supplies the users-backed sync service
285
+ - `users-core` supplies `users.profile.sync.service`
286
+ - `users-core` aliases that service as `auth.profile.projector`
278
287
  - the migrations supply the required tables
279
288
 
280
- So auth has everything it needs to stop using the fallback mirror and start using the persistent users-backed one.
289
+ So auth has everything it needs to stop returning only provider-owned profile data and start using the persistent users-backed profile.
281
290
 
282
291
  That is the true point of this chapter. The app is not just authenticated. It has a real users layer.
283
292
 
@@ -354,11 +363,11 @@ That is not only a workspace-package concern. The generated `packages/users/...`
354
363
 
355
364
  ## Summary
356
365
 
357
- This chapter is where the app stopped treating signed-in people as only Supabase identities and started treating them as real JSKIT users.
366
+ This chapter is where the app stopped treating signed-in people as only auth-provider identities and started treating them as real JSKIT users.
358
367
 
359
368
  - `users-core` installed the persistent users/account schema and server layer
360
369
  - `users-web` installed the first real account surface and account settings UI
361
- - auth switched from the standalone fallback mirror to the users-backed sync flow
370
+ - auth switched from provider-only profile data to the users-backed projection flow
362
371
 
363
372
  That is why this chapter feels bigger than a normal page install. It changes both the browser experience and the server-side meaning of "a signed-in user."
364
373
 
@@ -28,7 +28,7 @@ The easiest way to understand `jskit` is to separate it from the other tools in
28
28
 
29
29
  That separation is crucial.
30
30
 
31
- When you run a command such as `npx jskit add package auth-provider-supabase-core`, JSKIT updates app-owned files and records what it changed. It does **not** replace npm, Vite, or Knex.
31
+ When you run a command such as `npx jskit add bundle auth-local`, JSKIT updates app-owned files and records what it changed. It does **not** replace npm, Vite, or Knex.
32
32
 
33
33
  The most important record of that managed state lives here:
34
34
 
@@ -153,7 +153,7 @@ That distinction matters.
153
153
 
154
154
  A bundle is a curated install shortcut for several runtime packages that are meant to go together.
155
155
 
156
- In the current catalog, `auth-base` is the obvious example. It is a single bundle id, but it expands to several real runtime packages.
156
+ In the current catalog, `auth-local` is the obvious example. It is a single bundle id, but it expands to several real runtime packages.
157
157
 
158
158
  #### Runtime packages
159
159
 
@@ -235,32 +235,34 @@ There are two especially common cases:
235
235
 
236
236
  That second case matters just as much as the first one. Later in the guide, chapters explain package behavior one feature at a time. `show --details` is the generic command that lets you inspect those same package contracts directly.
237
237
 
238
- ### A first example: what does `auth-base` actually install?
238
+ ### A first example: what does `auth-local` actually install?
239
239
 
240
240
  Run:
241
241
 
242
242
  ```bash
243
- npx jskit show auth-base --details
243
+ npx jskit show auth-local --details
244
244
  ```
245
245
 
246
246
  This output is short, but it already teaches something important:
247
247
 
248
- - `auth-base` is a **bundle**
248
+ - `auth-local` is a **bundle**
249
249
  - it is not a runtime package by itself
250
250
 
251
- It expands to two real runtime packages:
251
+ It expands to three real runtime packages:
252
252
 
253
253
  - `@jskit-ai/auth-core`
254
254
  - `@jskit-ai/auth-web`
255
+ - `@jskit-ai/auth-provider-local-core`
255
256
 
256
257
  That is exactly the kind of thing you want to know before you mutate the app. For a bundle, this is often the main question:
257
258
 
258
259
  - *what real packages am I about to get?*
259
260
 
260
- `auth-base` is a good example because the bundle name is short and convenient, but the detailed view makes the underlying install explicit. It also helps you keep the mental model straight:
261
+ `auth-local` is a good example because the bundle name is short and convenient, but the detailed view makes the underlying install explicit. It also helps you keep the mental model straight:
261
262
 
262
263
  - bundles are install shortcuts
263
264
  - runtime packages are the things that actually provide capabilities
265
+ - provider bundles also select one concrete `auth.provider`
264
266
 
265
267
  ### A richer example: what does `workspaces-web` contribute?
266
268
 
@@ -476,8 +478,8 @@ This is not required, but it is genuinely useful once you start using commands s
476
478
  The install command comes in two main forms:
477
479
 
478
480
  ```bash
479
- npx jskit add package auth-provider-supabase-core
480
- npx jskit add bundle auth-base
481
+ npx jskit add package users-web
482
+ npx jskit add bundle auth-local
481
483
  ```
482
484
 
483
485
  Those two examples look similar, but they do different things.
@@ -519,12 +521,12 @@ npm run devlinks
519
521
  Use this when the catalog already offers a sensible grouped install:
520
522
 
521
523
  ```bash
522
- npx jskit add bundle auth-base
524
+ npx jskit add bundle auth-local
523
525
  ```
524
526
 
525
527
  Bundles are a convenience layer. They save you from having to remember and install several related runtime packages one by one.
526
528
 
527
- This is why `show auth-base --details` is useful first: it lets you see what the bundle will actually install.
529
+ This is why `show auth-local --details` is useful first: it lets you see what the bundle will actually install. Lower-level bundles such as `auth-base` can still be useful when you are composing your own provider stack, but they require an installed selected provider such as `auth-provider-local-core` or `auth-provider-supabase-core`.
528
530
 
529
531
  ### Generator packages are different
530
532
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jskit-ai/agent-docs",
3
- "version": "0.1.61",
3
+ "version": "0.1.63",
4
4
  "description": "Distributed JSKIT agent references, prompts, guides, and generated reference maps.",
5
5
  "type": "module",
6
6
  "files": [
@@ -12,6 +12,7 @@ Startup navigation stays in `KERNEL_MAP.md`.
12
12
  - [assistant-core](/packages/agent-docs/reference/autogen/packages/assistant-core.md)
13
13
  - [assistant-runtime](/packages/agent-docs/reference/autogen/packages/assistant-runtime.md)
14
14
  - [auth-core](/packages/agent-docs/reference/autogen/packages/auth-core.md)
15
+ - [auth-provider-local-core](/packages/agent-docs/reference/autogen/packages/auth-provider-local-core.md)
15
16
  - [auth-provider-supabase-core](/packages/agent-docs/reference/autogen/packages/auth-provider-supabase-core.md)
16
17
  - [auth-web](/packages/agent-docs/reference/autogen/packages/auth-web.md)
17
18
  - [console-core](/packages/agent-docs/reference/autogen/packages/console-core.md)
@@ -35,6 +35,22 @@ Exports
35
35
  Exports
36
36
  - `runAuthSignOutFlow`
37
37
 
38
+ ### `src/server/actions/auth.contributor.js`
39
+ Exports
40
+ - `baseAuthActions`
41
+ - `buildAuthActions()`
42
+ - `requireRequestContext(context, actionId)`
43
+
44
+ ### `src/server/authActor.js`
45
+ Exports
46
+ - `createAuthIdentityId(provider, providerUserId)`
47
+ - `normalizeAuthActor(value = {}, options = {})`
48
+ - `buildLegacyProfileFromActor(actorLike)`
49
+ - `normalizeAuthResult(value = {}, options = {})`
50
+ Local functions
51
+ - `normalizeDisplayName(value, email = "")`
52
+ - `normalizeProviderUserId(value)`
53
+
38
54
  ### `src/server/authPolicyContextResolverRegistry.js`
39
55
  Exports
40
56
  - `AUTH_POLICY_CONTEXT_RESOLVER_TAG`
@@ -86,6 +102,14 @@ Exports
86
102
  - `authPolicyPlugin`
87
103
  - `withAuthPolicy`
88
104
  - `mergeAuthPolicy`
105
+ - `createAuthIdentityId`
106
+ - `normalizeAuthActor`
107
+ - `buildLegacyProfileFromActor`
108
+ - `normalizeAuthResult`
109
+ - `AUTH_OPERATION_UNSUPPORTED_CODE`
110
+ - `createUnsupportedAuthOperationError`
111
+ - `throwUnsupportedAuthOperation`
112
+ - `isUnsupportedAuthOperationError`
89
113
 
90
114
  ### `src/server/lib/objectUtils.js`
91
115
  Exports
@@ -129,6 +153,10 @@ Exports
129
153
  Exports
130
154
  - `AccessCoreServiceProvider`
131
155
 
156
+ ### `src/server/providers/AuthActionsServiceProvider.js`
157
+ Exports
158
+ - `AuthActionsServiceProvider`
159
+
132
160
  ### `src/server/providers/FastifyAuthPolicyServiceProvider.js`
133
161
  Exports
134
162
  - `FastifyAuthPolicyServiceProvider`
@@ -137,6 +165,19 @@ Local functions
137
165
  - `parseList(value)`
138
166
  - `defaultHasPermission({ permission, permissions = [] } = {})`
139
167
 
168
+ ### `src/server/services/authSessionEventsService.js`
169
+ Exports
170
+ - `createAuthSessionEventsService()`
171
+ Local functions
172
+ - `resolveActorId(context = {})`
173
+
174
+ ### `src/server/unsupportedOperation.js`
175
+ Exports
176
+ - `AUTH_OPERATION_UNSUPPORTED_CODE`
177
+ - `createUnsupportedAuthOperationError(operation, message = "")`
178
+ - `throwUnsupportedAuthOperation(operation, message = "")`
179
+ - `isUnsupportedAuthOperationError(error)`
180
+
140
181
  ### `src/server/utils.js`
141
182
  Exports
142
183
  - `normalizeEmail(value)`
@@ -163,6 +204,20 @@ Local functions
163
204
  Exports
164
205
  - `createApi({ request })`
165
206
 
207
+ ### `src/shared/authCapabilities.js`
208
+ Exports
209
+ - `AUTH_PASSWORD_RECOVERY_DELIVERIES`
210
+ - `AUTH_OPTIONAL_OPERATION_FEATURES`
211
+ - `normalizeAuthProviderId(value, { fallback = "unknown" } = {})`
212
+ - `normalizeAuthCapabilities(value = {})`
213
+ - `getCapabilityFeature(capabilities, path)`
214
+ - `isAuthOperationSupported(capabilities, operationName)`
215
+ Local functions
216
+ - `normalizeBoolean(value, fallback = false)`
217
+ - `normalizeProviderLabel(value, providerId)`
218
+ - `normalizeOAuthProviderEntries(value)`
219
+ - `normalizeRecoveryDelivery(value, { request = false, complete = false } = {})`
220
+
166
221
  ### `src/shared/authConstraints.js`
167
222
  Exports
168
223
  - `AUTH_EMAIL_PATTERN`
@@ -215,6 +270,16 @@ Exports
215
270
  - `AUTH_PATHS`
216
271
  - `buildAuthOauthStartPath(provider)`
217
272
 
273
+ ### `src/shared/authSecurityStatus.js`
274
+ Exports
275
+ - `normalizeAuthSecurityStatus(value = {})`
276
+ - `buildSecurityStatusFromAuthMethodsStatus(authMethodsStatus, { actions = {} } = {})`
277
+ Local functions
278
+ - `normalizeBoolean(value, fallback = false)`
279
+ - `countEnabledMethods(methods)`
280
+ - `normalizeAuthMethodStatus(entry)`
281
+ - `normalizeSecurityActions(value = {})`
282
+
218
283
  ### `src/shared/commands/authCommandValidators.js`
219
284
  Exports
220
285
  - `authEmailFieldDefinition`
@@ -367,6 +432,14 @@ Exports
367
432
  - `resolveAuthDeniedLoginMessage`
368
433
  - `AUTH_PATHS`
369
434
  - `buildAuthOauthStartPath`
435
+ - `AUTH_PASSWORD_RECOVERY_DELIVERIES`
436
+ - `AUTH_OPTIONAL_OPERATION_FEATURES`
437
+ - `normalizeAuthProviderId`
438
+ - `normalizeAuthCapabilities`
439
+ - `getCapabilityFeature`
440
+ - `isAuthOperationSupported`
441
+ - `normalizeAuthSecurityStatus`
442
+ - `buildSecurityStatusFromAuthMethodsStatus`
370
443
 
371
444
  ### `src/shared/inputNormalization.js`
372
445
  Exports