@jskit-ai/agent-docs 0.1.151 → 0.1.152

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.
Files changed (21) hide show
  1. package/guide/agent/app-extras/realtime.md +33 -1
  2. package/package.json +1 -1
  3. package/patterns/feature-package/example/booking-engine/package.json +1 -1
  4. package/patterns/minimal-foundation/example/package.json +4 -4
  5. package/patterns/shell-foundation/example/package.json +5 -5
  6. package/patterns/shell-foundation/example/packages/main/package.json +1 -1
  7. package/reference/autogen/PATTERN_INDEX.md +20 -20
  8. package/reference/autogen/packages/realtime.md +8 -3
  9. package/skills/jskit/references/pattern-index.md +20 -20
  10. package/skills/jskit/references/patterns/app/minimal-foundation/example/package.json +4 -4
  11. package/skills/jskit/references/patterns/app/shell-foundation/example/package.json +5 -5
  12. package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/package.json +1 -1
  13. package/skills/jskit/references/patterns/auth/supabase-auth/example/package.json +1 -1
  14. package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/package.json +2 -2
  15. package/skills/jskit/references/patterns/database/mysql-application/example/package.json +1 -1
  16. package/skills/jskit/references/patterns/database/postgres-application/example/package.json +1 -1
  17. package/skills/jskit/references/patterns/realtime/realtime-application/PATTERN.md +17 -0
  18. package/skills/jskit/references/patterns/realtime/realtime-application/example/package.json +2 -2
  19. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/package.json +1 -1
  20. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/package.json +2 -2
  21. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/package.json +3 -3
@@ -26,6 +26,37 @@ generic “something changed” escape hatch.
26
26
  Client features register listeners through `@jskit-ai/realtime`. Keep query
27
27
  invalidation close to the resource that owns the query keys.
28
28
 
29
+ When the entire realtime surface is authenticated, the selected `auth.service`
30
+ can expose `realtime.requireAuthentication: true`. The realtime server then
31
+ rejects unauthenticated handshakes before a socket joins any broadcast room.
32
+ Clients must disconnect and reconnect after their login identity changes so a
33
+ new handshake establishes the current actor.
34
+
35
+ When `auth.service.authenticateRequest()` is present, delivery reauthenticates
36
+ each socket before sending and rechecks idle sockets every 30 seconds. Revoked,
37
+ expired, or changed actors are disconnected. Workspace membership rooms are
38
+ refreshed from the current membership repository. Authentication lookup errors
39
+ fail closed.
40
+
41
+ For application-specific access rules, expose
42
+ `auth.service.realtime.authorizeEvent({ actor, event: { name, payload } })`.
43
+ Only an explicit `true` permits delivery. The actor is the current server-side
44
+ authentication result, so the application can reuse its HTTP read policy.
45
+ Audience rooms select candidates; they never bypass this authorization callback.
46
+ With Redis, each receiving server authorizes its own sockets before delivery.
47
+
48
+ Only the explicit realtime payload and canonical event fields (`type`, `source`,
49
+ `entity`, `operation`, `entityId`, `scope`, `actorId`, `commandId`,
50
+ `sourceClientId`, `occurredAt`) reach clients. Other domain metadata stays on the
51
+ server. Put intentional public fields in `realtime.payload`.
52
+
53
+ Realtime delivery errors are logged and do not reject the domain event or undo
54
+ a successful action. Domain listeners retain their own error semantics.
55
+ Refresh hints are best effort; use authoritative reads on reconnect to recover
56
+ missed events. There is no event journal, replay, or exactly-once guarantee.
57
+ Keep one completion publisher beside the mutation owner; lifecycle progress
58
+ events may still describe distinct intermediate states.
59
+
29
60
  ## Single process and Redis
30
61
 
31
62
  The in-process adapter is correct for one server process. Set
@@ -40,7 +71,8 @@ the shell.
40
71
 
41
72
  ## Verification
42
73
 
43
- Test in-process delivery, audience isolation, disconnect/reconnect recovery,
74
+ Test in-process delivery, audience isolation, authenticated-handshake rejection
75
+ when selected, login-identity reconnects, disconnect/reconnect recovery,
44
76
  duplicate listener cleanup, and live query refresh. When Redis is selected,
45
77
  exercise delivery between two server processes.
46
78
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jskit-ai/agent-docs",
3
- "version": "0.1.151",
3
+ "version": "0.1.152",
4
4
  "description": "Distributed JSKIT agent references, prompts, guides, and generated reference maps.",
5
5
  "type": "module",
6
6
  "files": [
@@ -5,7 +5,7 @@
5
5
  "private": true,
6
6
  "type": "module",
7
7
  "dependencies": {
8
- "@jskit-ai/kernel": "0.1.179",
8
+ "@jskit-ai/kernel": "0.1.180",
9
9
  "json-rest-schema": "^1.0.17"
10
10
  },
11
11
  "exports": {
@@ -34,7 +34,7 @@
34
34
  "dependencies": {
35
35
  "@local/main": "0.1.0",
36
36
  "@fastify/static": "^10.1.3",
37
- "@jskit-ai/kernel": "0.1.179",
37
+ "@jskit-ai/kernel": "0.1.180",
38
38
  "@tanstack/vue-query": "^5.101.0",
39
39
  "fastify": "^5.8.5",
40
40
  "json-rest-schema": "^1.0.17",
@@ -42,11 +42,11 @@
42
42
  "vue": "^3.5.38",
43
43
  "vue-router": "^5.1.0",
44
44
  "vuetify": "^4.1.2",
45
- "@jskit-ai/http-runtime": "0.1.177"
45
+ "@jskit-ai/http-runtime": "0.1.178"
46
46
  },
47
47
  "devDependencies": {
48
- "@jskit-ai/config-eslint": "0.1.176",
49
- "@jskit-ai/jskit-catalog": "0.1.204",
48
+ "@jskit-ai/config-eslint": "0.1.177",
49
+ "@jskit-ai/jskit-catalog": "0.1.205",
50
50
  "@playwright/test": "1.61.1",
51
51
  "@vitejs/plugin-vue": "^6.0.7",
52
52
  "eslint": "^10.8.0",
@@ -34,7 +34,7 @@
34
34
  "dependencies": {
35
35
  "@local/main": "0.1.0",
36
36
  "@fastify/static": "^10.1.3",
37
- "@jskit-ai/kernel": "0.1.179",
37
+ "@jskit-ai/kernel": "0.1.180",
38
38
  "@tanstack/vue-query": "^5.101.0",
39
39
  "fastify": "^5.8.5",
40
40
  "json-rest-schema": "^1.0.17",
@@ -42,13 +42,13 @@
42
42
  "vue": "^3.5.38",
43
43
  "vue-router": "^5.1.0",
44
44
  "vuetify": "^4.1.2",
45
- "@jskit-ai/http-runtime": "0.1.177",
45
+ "@jskit-ai/http-runtime": "0.1.178",
46
46
  "@mdi/js": "^7.4.47",
47
- "@jskit-ai/shell-web": "0.1.183"
47
+ "@jskit-ai/shell-web": "0.1.184"
48
48
  },
49
49
  "devDependencies": {
50
- "@jskit-ai/config-eslint": "0.1.176",
51
- "@jskit-ai/jskit-catalog": "0.1.204",
50
+ "@jskit-ai/config-eslint": "0.1.177",
51
+ "@jskit-ai/jskit-catalog": "0.1.205",
52
52
  "@playwright/test": "1.61.1",
53
53
  "@vitejs/plugin-vue": "^6.0.7",
54
54
  "eslint": "^10.8.0",
@@ -9,7 +9,7 @@
9
9
  },
10
10
  "description": "App-local runtime composition and lightweight glue.",
11
11
  "dependencies": {
12
- "@jskit-ai/kernel": "0.1.179"
12
+ "@jskit-ai/kernel": "0.1.180"
13
13
  },
14
14
  "jskit": {
15
15
  "kind": "runtime",
@@ -15,7 +15,7 @@ A concrete Fastify, Vue, and JSKIT application foundation for products that do n
15
15
 
16
16
  - Id: `app/minimal-foundation`
17
17
  - Keywords: `app`, `fastify`, `foundation`, `minimal`, `server`, `vite`, `vue`
18
- - Owner: `@jskit-ai/agent-docs@0.1.151`
18
+ - Owner: `@jskit-ai/agent-docs@0.1.152`
19
19
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/app/minimal-foundation/PATTERN.md)
20
20
  - Examples: [example/](../../skills/jskit/references/patterns/app/minimal-foundation/example/)
21
21
  - Requires: `@jskit-ai/http-runtime`, `@jskit-ai/kernel`
@@ -26,7 +26,7 @@ A concrete JSKIT web application foundation with responsive shell navigation, se
26
26
 
27
27
  - Id: `app/shell-foundation`
28
28
  - Keywords: `app`, `foundation`, `material`, `navigation`, `placements`, `shell`, `vite`, `vue`
29
- - Owner: `@jskit-ai/agent-docs@0.1.151`
29
+ - Owner: `@jskit-ai/agent-docs@0.1.152`
30
30
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/app/shell-foundation/PATTERN.md)
31
31
  - Examples: [example/](../../skills/jskit/references/patterns/app/shell-foundation/example/)
32
32
  - Requires: `@jskit-ai/http-runtime`, `@jskit-ai/kernel`, `@jskit-ai/shell-web`
@@ -37,7 +37,7 @@ Configure an assistant runtime for one application surface and expose its chat a
37
37
 
38
38
  - Id: `assistant/assistant-surface`
39
39
  - Keywords: `ai`, `assistant`, `chat`, `config`, `environment`, `page`, `placement`, `settings`, `surface`
40
- - Owner: `@jskit-ai/assistant-runtime@0.1.150`
40
+ - Owner: `@jskit-ai/assistant-runtime@0.1.151`
41
41
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/assistant/assistant-surface/PATTERN.md)
42
42
  - Examples: [example/](../../skills/jskit/references/patterns/assistant/assistant-surface/example/)
43
43
  - Requires: `@jskit-ai/assistant-runtime`, `@jskit-ai/shell-web`
@@ -48,7 +48,7 @@ Compose JSKIT authentication routes, views, profile controls, and public surface
48
48
 
49
49
  - Id: `auth/auth-surface`
50
50
  - Keywords: `account`, `auth`, `login`, `logout`, `password`, `placement`, `profile`, `reset`, `surface`
51
- - Owner: `@jskit-ai/auth-web@0.1.179`
51
+ - Owner: `@jskit-ai/auth-web@0.1.180`
52
52
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/auth/auth-surface/PATTERN.md)
53
53
  - Examples: [example/](../../skills/jskit/references/patterns/auth/auth-surface/example/)
54
54
  - Requires: `@jskit-ai/auth-core`, `@jskit-ai/auth-web`, `@jskit-ai/shell-web`
@@ -59,7 +59,7 @@ Add Supabase authentication through normal npm composition, explicit environment
59
59
 
60
60
  - Id: `auth/supabase-auth`
61
61
  - Keywords: `auth`, `authentication`, `oauth`, `sessions`, `supabase`
62
- - Owner: `@jskit-ai/auth-provider-supabase-core@0.1.176`
62
+ - Owner: `@jskit-ai/auth-provider-supabase-core@0.1.177`
63
63
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/auth/supabase-auth/PATTERN.md)
64
64
  - Examples: [example/](../../skills/jskit/references/patterns/auth/supabase-auth/example/)
65
65
  - Requires: `@jskit-ai/auth-provider-supabase-core`
@@ -70,7 +70,7 @@ Add a protected administration surface, settings shell, and semantic navigation
70
70
 
71
71
  - Id: `console/console-surface`
72
72
  - Keywords: `admin`, `console`, `navigation`, `owner`, `placement`, `settings`, `surface`
73
- - Owner: `@jskit-ai/console-web@0.1.147`
73
+ - Owner: `@jskit-ai/console-web@0.1.148`
74
74
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/console/console-surface/PATTERN.md)
75
75
  - Examples: [example/](../../skills/jskit/references/patterns/console/console-surface/example/)
76
76
  - Requires: `@jskit-ai/console-core`, `@jskit-ai/console-web`, `@jskit-ai/shell-web`
@@ -81,7 +81,7 @@ Build a routed CRUD user interface as thin application pages over JSKIT's shared
81
81
 
82
82
  - Id: `crud/crud-screen-set`
83
83
  - Keywords: `actions`, `add`, `crud`, `delete`, `edit`, `filters`, `list`, `material`, `routes`, `view`, `vue`
84
- - Owner: `@jskit-ai/http-web@0.1.24`
84
+ - Owner: `@jskit-ai/http-web@0.1.25`
85
85
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/crud/crud-screen-set/PATTERN.md)
86
86
  - Examples: [example/](../../skills/jskit/references/patterns/crud/crud-screen-set/example/)
87
87
  - Requires: `@jskit-ai/http-web`, `@jskit-ai/resource-crud-core`
@@ -92,7 +92,7 @@ Build a complete application-owned CRUD server package from a migration, resourc
92
92
 
93
93
  - Id: `crud/json-api-resource-package`
94
94
  - Keywords: `actions`, `crud`, `database`, `json-api`, `migration`, `permissions`, `provider`, `repository`, `routes`, `service`
95
- - Owner: `@jskit-ai/crud-core@0.1.190`
95
+ - Owner: `@jskit-ai/crud-core@0.1.191`
96
96
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/crud/json-api-resource-package/PATTERN.md)
97
97
  - Examples: [example/](../../skills/jskit/references/patterns/crud/json-api-resource-package/example/)
98
98
  - Requires: `@jskit-ai/crud-core`, `@jskit-ai/resource-crud-core`
@@ -103,7 +103,7 @@ Define an authenticated application resource whose records belong to the current
103
103
 
104
104
  - Id: `crud/resource-contract`
105
105
  - Keywords: `authenticated`, `crud`, `database`, `owner-scoped`, `resource`, `user`
106
- - Owner: `@jskit-ai/resource-crud-core@0.1.121`
106
+ - Owner: `@jskit-ai/resource-crud-core@0.1.122`
107
107
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/crud/resource-contract/PATTERN.md)
108
108
  - Examples: [example/](../../skills/jskit/references/patterns/crud/resource-contract/example/)
109
109
  - Requires: `@jskit-ai/resource-crud-core`
@@ -114,7 +114,7 @@ Configure a JSKIT application for MySQL with a fixed driver, ordinary environmen
114
114
 
115
115
  - Id: `database/mysql-application`
116
116
  - Keywords: `database`, `knex`, `mariadb`, `migrations`, `mysql`, `mysql2`
117
- - Owner: `@jskit-ai/database-runtime-mysql@0.1.177`
117
+ - Owner: `@jskit-ai/database-runtime-mysql@0.1.178`
118
118
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/database/mysql-application/PATTERN.md)
119
119
  - Examples: [example/](../../skills/jskit/references/patterns/database/mysql-application/example/)
120
120
  - Requires: `@jskit-ai/database-runtime-mysql`
@@ -125,7 +125,7 @@ Configure a JSKIT application for PostgreSQL with a fixed driver, ordinary envir
125
125
 
126
126
  - Id: `database/postgres-application`
127
127
  - Keywords: `database`, `knex`, `migrations`, `pg`, `postgres`, `postgresql`
128
- - Owner: `@jskit-ai/database-runtime-postgres@0.1.176`
128
+ - Owner: `@jskit-ai/database-runtime-postgres@0.1.177`
129
129
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/database/postgres-application/PATTERN.md)
130
130
  - Examples: [example/](../../skills/jskit/references/patterns/database/postgres-application/example/)
131
131
  - Requires: `@jskit-ai/database-runtime-postgres`
@@ -136,7 +136,7 @@ Wrap a JSKIT web application in a Capacitor Android shell using native Capacitor
136
136
 
137
137
  - Id: `mobile/android-application`
138
138
  - Keywords: `android`, `capacitor`, `device`, `mobile`, `native`, `shell`, `webview`
139
- - Owner: `@jskit-ai/mobile-capacitor@0.1.114`
139
+ - Owner: `@jskit-ai/mobile-capacitor@0.1.115`
140
140
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/mobile/android-application/PATTERN.md)
141
141
  - Examples: [example/](../../skills/jskit/references/patterns/mobile/android-application/example/)
142
142
  - Requires: `@capacitor/android`, `@capacitor/app`, `@capacitor/cli`, `@jskit-ai/mobile-capacitor`
@@ -147,7 +147,7 @@ Add JSKIT realtime events with an optional Redis backplane and an explicit shell
147
147
 
148
148
  - Id: `realtime/realtime-application`
149
149
  - Keywords: `realtime`, `redis`, `socket.io`, `sockets`, `status`, `websocket`
150
- - Owner: `@jskit-ai/realtime@0.1.176`
150
+ - Owner: `@jskit-ai/realtime@0.1.177`
151
151
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/realtime/realtime-application/PATTERN.md)
152
152
  - Examples: [example/](../../skills/jskit/references/patterns/realtime/realtime-application/example/)
153
153
  - Requires: `@jskit-ai/realtime`, `@jskit-ai/shell-web`
@@ -158,7 +158,7 @@ Define a server feature through explicit capabilities and first-class actions, a
158
158
 
159
159
  - Id: `server/feature-package`
160
160
  - Keywords: `actions`, `feature`, `json-rest`, `knex`, `orchestration`, `package`, `provider`, `repository`, `routes`, `server`
161
- - Owner: `@jskit-ai/agent-docs@0.1.151`
161
+ - Owner: `@jskit-ai/agent-docs@0.1.152`
162
162
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/server/feature-package/PATTERN.md)
163
163
  - Examples: [example/](../../skills/jskit/references/patterns/server/feature-package/example/)
164
164
  - Requires: `@jskit-ai/kernel`
@@ -169,7 +169,7 @@ Compose the JSKIT responsive shell, semantic placements, settings navigation, an
169
169
 
170
170
  - Id: `shell/application-shell`
171
171
  - Keywords: `adaptive`, `app`, `layout`, `navigation`, `placement`, `responsive`, `settings`, `shell`
172
- - Owner: `@jskit-ai/shell-web@0.1.183`
172
+ - Owner: `@jskit-ai/shell-web@0.1.184`
173
173
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/shell/application-shell/PATTERN.md)
174
174
  - Examples: [example/](../../skills/jskit/references/patterns/shell/application-shell/example/)
175
175
  - Requires: `@jskit-ai/kernel`, `@jskit-ai/shell-web`
@@ -180,7 +180,7 @@ Add product routes and shell extensions through file routing, semantic placement
180
180
 
181
181
  - Id: `ui/page-and-placement`
182
182
  - Keywords: `component`, `navigation`, `outlet`, `page`, `placement`, `routes`, `section`, `shell`, `subpages`, `vue`
183
- - Owner: `@jskit-ai/shell-web@0.1.183`
183
+ - Owner: `@jskit-ai/shell-web@0.1.184`
184
184
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/ui/page-and-placement/PATTERN.md)
185
185
  - Examples: [example/](../../skills/jskit/references/patterns/ui/page-and-placement/example/)
186
186
  - Requires: `@jskit-ai/kernel`, `@jskit-ai/shell-web`
@@ -191,7 +191,7 @@ Compose an account settings route and profile, preference, and notification sect
191
191
 
192
192
  - Id: `users/account-settings`
193
193
  - Keywords: `account`, `notifications`, `preferences`, `profile`, `settings`, `user`, `vue`
194
- - Owner: `@jskit-ai/users-web@0.1.197`
194
+ - Owner: `@jskit-ai/users-web@0.1.198`
195
195
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/users/account-settings/PATTERN.md)
196
196
  - Examples: [example/](../../skills/jskit/references/patterns/users/account-settings/example/)
197
197
  - Requires: `@jskit-ai/shell-web`, `@jskit-ai/users-core`, `@jskit-ai/users-web`
@@ -202,7 +202,7 @@ Expose user administration and workspace-scoped member operations through app-ow
202
202
 
203
203
  - Id: `users/user-administration-server`
204
204
  - Keywords: `account`, `admin`, `member`, `repository`, `resource`, `routes`, `service`, `user`, `workspace`
205
- - Owner: `@jskit-ai/users-core@0.1.192`
205
+ - Owner: `@jskit-ai/users-core@0.1.193`
206
206
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/users/user-administration-server/PATTERN.md)
207
207
  - Examples: [example/](../../skills/jskit/references/patterns/users/user-administration-server/example/)
208
208
  - Requires: `@jskit-ai/crud-core`, `@jskit-ai/users-core`
@@ -213,7 +213,7 @@ Configure roles, workspace access policy, invitations, and app-owned invitation
213
213
 
214
214
  - Id: `workspaces/workspace-server`
215
215
  - Keywords: `access`, `invite`, `membership`, `multitenancy`, `policy`, `role`, `tenancy`, `workspace`
216
- - Owner: `@jskit-ai/workspaces-core@0.1.157`
216
+ - Owner: `@jskit-ai/workspaces-core@0.1.158`
217
217
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/workspaces/workspace-server/PATTERN.md)
218
218
  - Examples: [example/](../../skills/jskit/references/patterns/workspaces/workspace-server/example/)
219
219
  - Requires: `@jskit-ai/users-core`, `@jskit-ai/workspaces-core`
@@ -224,7 +224,7 @@ Compose workspace selection, invitation, member administration, settings, and re
224
224
 
225
225
  - Id: `workspaces/workspace-surfaces`
226
226
  - Keywords: `admin`, `invite`, `member`, `navigation`, `settings`, `surface`, `switcher`, `workspace`
227
- - Owner: `@jskit-ai/workspaces-web@0.1.158`
227
+ - Owner: `@jskit-ai/workspaces-web@0.1.159`
228
228
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/workspaces/workspace-surfaces/PATTERN.md)
229
229
  - Examples: [example/](../../skills/jskit/references/patterns/workspaces/workspace-surfaces/example/)
230
230
  - Requires: `@jskit-ai/shell-web`, `@jskit-ai/workspaces-core`, `@jskit-ai/workspaces-web`
@@ -44,6 +44,8 @@ Exports
44
44
 
45
45
  ### `src/server/realtimeAudience.js`
46
46
  Exports
47
+ - `realtimeAuthenticationRequired(authService = null)`
48
+ - `revalidateSocket({ socket, authService, workspaces = null })`
47
49
  - `registerSocketAudienceBootstrap({ io, logger, authService = null, workspaces = null })`
48
50
  - `resolveAudienceTargets(audience, event, { database = null, logger })`
49
51
  Local functions
@@ -57,11 +59,14 @@ Local functions
57
59
  - `addAudienceRooms(selection, state)`
58
60
  - `collectUserIds(rows)`
59
61
  - `parseCookieHeader(value = "")`
60
- - `resolveSocketActorId(authService, socket)`
62
+ - `resolveSocketActor(authService, socket)`
63
+ - `authenticationRequiredError()`
64
+ - `rememberSocketActorId(socket, actorId)`
65
+ - `registerRequiredSocketAuthentication({ io, logger, authService })`
61
66
 
62
67
  ### `src/server/realtimeDelivery.js`
63
68
  Exports
64
- - `createRealtimeDelivery({ io, database = null, logger })`
69
+ - `createRealtimeDelivery({ io, database = null, logger, authService = null, workspaces = null })`
65
70
  Local functions
66
71
  - `publicRealtimePayload(event)`
67
72
 
@@ -81,7 +86,7 @@ Exports
81
86
  - `REDIS_NAMESPACE_ENV_KEY`
82
87
  - `resolveRealtimeRedisUrl(env = {})`
83
88
  - `resolveRealtimeRedisNamespace(env = {})`
84
- - `configureSocketIoRedisAdapter(io, { redisUrl = "", redisNamespace = "", createRedisAdapter = createSocketIoRedisAdapter, createRedisConnection = createRedisClient } = {})`
89
+ - `configureSocketIoRedisAdapter(io, { redisUrl = "", redisNamespace = "", logger = console, createRedisAdapter = createSocketIoRedisAdapter, createRedisConnection = createRedisClient } = {})`
85
90
  - `closeSocketIoRedisConnections({ pubClient = null, subClient = null } = {})`
86
91
  Local functions
87
92
  - `resolveHttpServer({ httpServer = null, fastify = null } = {})`
@@ -15,7 +15,7 @@ A concrete Fastify, Vue, and JSKIT application foundation for products that do n
15
15
 
16
16
  - Id: `app/minimal-foundation`
17
17
  - Keywords: `app`, `fastify`, `foundation`, `minimal`, `server`, `vite`, `vue`
18
- - Owner: `@jskit-ai/agent-docs@0.1.151`
18
+ - Owner: `@jskit-ai/agent-docs@0.1.152`
19
19
  - Read: [PATTERN.md](patterns/app/minimal-foundation/PATTERN.md)
20
20
  - Examples: [example/](patterns/app/minimal-foundation/example/)
21
21
  - Requires: `@jskit-ai/http-runtime`, `@jskit-ai/kernel`
@@ -26,7 +26,7 @@ A concrete JSKIT web application foundation with responsive shell navigation, se
26
26
 
27
27
  - Id: `app/shell-foundation`
28
28
  - Keywords: `app`, `foundation`, `material`, `navigation`, `placements`, `shell`, `vite`, `vue`
29
- - Owner: `@jskit-ai/agent-docs@0.1.151`
29
+ - Owner: `@jskit-ai/agent-docs@0.1.152`
30
30
  - Read: [PATTERN.md](patterns/app/shell-foundation/PATTERN.md)
31
31
  - Examples: [example/](patterns/app/shell-foundation/example/)
32
32
  - Requires: `@jskit-ai/http-runtime`, `@jskit-ai/kernel`, `@jskit-ai/shell-web`
@@ -37,7 +37,7 @@ Configure an assistant runtime for one application surface and expose its chat a
37
37
 
38
38
  - Id: `assistant/assistant-surface`
39
39
  - Keywords: `ai`, `assistant`, `chat`, `config`, `environment`, `page`, `placement`, `settings`, `surface`
40
- - Owner: `@jskit-ai/assistant-runtime@0.1.150`
40
+ - Owner: `@jskit-ai/assistant-runtime@0.1.151`
41
41
  - Read: [PATTERN.md](patterns/assistant/assistant-surface/PATTERN.md)
42
42
  - Examples: [example/](patterns/assistant/assistant-surface/example/)
43
43
  - Requires: `@jskit-ai/assistant-runtime`, `@jskit-ai/shell-web`
@@ -48,7 +48,7 @@ Compose JSKIT authentication routes, views, profile controls, and public surface
48
48
 
49
49
  - Id: `auth/auth-surface`
50
50
  - Keywords: `account`, `auth`, `login`, `logout`, `password`, `placement`, `profile`, `reset`, `surface`
51
- - Owner: `@jskit-ai/auth-web@0.1.179`
51
+ - Owner: `@jskit-ai/auth-web@0.1.180`
52
52
  - Read: [PATTERN.md](patterns/auth/auth-surface/PATTERN.md)
53
53
  - Examples: [example/](patterns/auth/auth-surface/example/)
54
54
  - Requires: `@jskit-ai/auth-core`, `@jskit-ai/auth-web`, `@jskit-ai/shell-web`
@@ -59,7 +59,7 @@ Add Supabase authentication through normal npm composition, explicit environment
59
59
 
60
60
  - Id: `auth/supabase-auth`
61
61
  - Keywords: `auth`, `authentication`, `oauth`, `sessions`, `supabase`
62
- - Owner: `@jskit-ai/auth-provider-supabase-core@0.1.176`
62
+ - Owner: `@jskit-ai/auth-provider-supabase-core@0.1.177`
63
63
  - Read: [PATTERN.md](patterns/auth/supabase-auth/PATTERN.md)
64
64
  - Examples: [example/](patterns/auth/supabase-auth/example/)
65
65
  - Requires: `@jskit-ai/auth-provider-supabase-core`
@@ -70,7 +70,7 @@ Add a protected administration surface, settings shell, and semantic navigation
70
70
 
71
71
  - Id: `console/console-surface`
72
72
  - Keywords: `admin`, `console`, `navigation`, `owner`, `placement`, `settings`, `surface`
73
- - Owner: `@jskit-ai/console-web@0.1.147`
73
+ - Owner: `@jskit-ai/console-web@0.1.148`
74
74
  - Read: [PATTERN.md](patterns/console/console-surface/PATTERN.md)
75
75
  - Examples: [example/](patterns/console/console-surface/example/)
76
76
  - Requires: `@jskit-ai/console-core`, `@jskit-ai/console-web`, `@jskit-ai/shell-web`
@@ -81,7 +81,7 @@ Build a routed CRUD user interface as thin application pages over JSKIT's shared
81
81
 
82
82
  - Id: `crud/crud-screen-set`
83
83
  - Keywords: `actions`, `add`, `crud`, `delete`, `edit`, `filters`, `list`, `material`, `routes`, `view`, `vue`
84
- - Owner: `@jskit-ai/http-web@0.1.24`
84
+ - Owner: `@jskit-ai/http-web@0.1.25`
85
85
  - Read: [PATTERN.md](patterns/crud/crud-screen-set/PATTERN.md)
86
86
  - Examples: [example/](patterns/crud/crud-screen-set/example/)
87
87
  - Requires: `@jskit-ai/http-web`, `@jskit-ai/resource-crud-core`
@@ -92,7 +92,7 @@ Build a complete application-owned CRUD server package from a migration, resourc
92
92
 
93
93
  - Id: `crud/json-api-resource-package`
94
94
  - Keywords: `actions`, `crud`, `database`, `json-api`, `migration`, `permissions`, `provider`, `repository`, `routes`, `service`
95
- - Owner: `@jskit-ai/crud-core@0.1.190`
95
+ - Owner: `@jskit-ai/crud-core@0.1.191`
96
96
  - Read: [PATTERN.md](patterns/crud/json-api-resource-package/PATTERN.md)
97
97
  - Examples: [example/](patterns/crud/json-api-resource-package/example/)
98
98
  - Requires: `@jskit-ai/crud-core`, `@jskit-ai/resource-crud-core`
@@ -103,7 +103,7 @@ Define an authenticated application resource whose records belong to the current
103
103
 
104
104
  - Id: `crud/resource-contract`
105
105
  - Keywords: `authenticated`, `crud`, `database`, `owner-scoped`, `resource`, `user`
106
- - Owner: `@jskit-ai/resource-crud-core@0.1.121`
106
+ - Owner: `@jskit-ai/resource-crud-core@0.1.122`
107
107
  - Read: [PATTERN.md](patterns/crud/resource-contract/PATTERN.md)
108
108
  - Examples: [example/](patterns/crud/resource-contract/example/)
109
109
  - Requires: `@jskit-ai/resource-crud-core`
@@ -114,7 +114,7 @@ Configure a JSKIT application for MySQL with a fixed driver, ordinary environmen
114
114
 
115
115
  - Id: `database/mysql-application`
116
116
  - Keywords: `database`, `knex`, `mariadb`, `migrations`, `mysql`, `mysql2`
117
- - Owner: `@jskit-ai/database-runtime-mysql@0.1.177`
117
+ - Owner: `@jskit-ai/database-runtime-mysql@0.1.178`
118
118
  - Read: [PATTERN.md](patterns/database/mysql-application/PATTERN.md)
119
119
  - Examples: [example/](patterns/database/mysql-application/example/)
120
120
  - Requires: `@jskit-ai/database-runtime-mysql`
@@ -125,7 +125,7 @@ Configure a JSKIT application for PostgreSQL with a fixed driver, ordinary envir
125
125
 
126
126
  - Id: `database/postgres-application`
127
127
  - Keywords: `database`, `knex`, `migrations`, `pg`, `postgres`, `postgresql`
128
- - Owner: `@jskit-ai/database-runtime-postgres@0.1.176`
128
+ - Owner: `@jskit-ai/database-runtime-postgres@0.1.177`
129
129
  - Read: [PATTERN.md](patterns/database/postgres-application/PATTERN.md)
130
130
  - Examples: [example/](patterns/database/postgres-application/example/)
131
131
  - Requires: `@jskit-ai/database-runtime-postgres`
@@ -136,7 +136,7 @@ Wrap a JSKIT web application in a Capacitor Android shell using native Capacitor
136
136
 
137
137
  - Id: `mobile/android-application`
138
138
  - Keywords: `android`, `capacitor`, `device`, `mobile`, `native`, `shell`, `webview`
139
- - Owner: `@jskit-ai/mobile-capacitor@0.1.114`
139
+ - Owner: `@jskit-ai/mobile-capacitor@0.1.115`
140
140
  - Read: [PATTERN.md](patterns/mobile/android-application/PATTERN.md)
141
141
  - Examples: [example/](patterns/mobile/android-application/example/)
142
142
  - Requires: `@capacitor/android`, `@capacitor/app`, `@capacitor/cli`, `@jskit-ai/mobile-capacitor`
@@ -147,7 +147,7 @@ Add JSKIT realtime events with an optional Redis backplane and an explicit shell
147
147
 
148
148
  - Id: `realtime/realtime-application`
149
149
  - Keywords: `realtime`, `redis`, `socket.io`, `sockets`, `status`, `websocket`
150
- - Owner: `@jskit-ai/realtime@0.1.176`
150
+ - Owner: `@jskit-ai/realtime@0.1.177`
151
151
  - Read: [PATTERN.md](patterns/realtime/realtime-application/PATTERN.md)
152
152
  - Examples: [example/](patterns/realtime/realtime-application/example/)
153
153
  - Requires: `@jskit-ai/realtime`, `@jskit-ai/shell-web`
@@ -158,7 +158,7 @@ Define a server feature through explicit capabilities and first-class actions, a
158
158
 
159
159
  - Id: `server/feature-package`
160
160
  - Keywords: `actions`, `feature`, `json-rest`, `knex`, `orchestration`, `package`, `provider`, `repository`, `routes`, `server`
161
- - Owner: `@jskit-ai/agent-docs@0.1.151`
161
+ - Owner: `@jskit-ai/agent-docs@0.1.152`
162
162
  - Read: [PATTERN.md](patterns/server/feature-package/PATTERN.md)
163
163
  - Examples: [example/](patterns/server/feature-package/example/)
164
164
  - Requires: `@jskit-ai/kernel`
@@ -169,7 +169,7 @@ Compose the JSKIT responsive shell, semantic placements, settings navigation, an
169
169
 
170
170
  - Id: `shell/application-shell`
171
171
  - Keywords: `adaptive`, `app`, `layout`, `navigation`, `placement`, `responsive`, `settings`, `shell`
172
- - Owner: `@jskit-ai/shell-web@0.1.183`
172
+ - Owner: `@jskit-ai/shell-web@0.1.184`
173
173
  - Read: [PATTERN.md](patterns/shell/application-shell/PATTERN.md)
174
174
  - Examples: [example/](patterns/shell/application-shell/example/)
175
175
  - Requires: `@jskit-ai/kernel`, `@jskit-ai/shell-web`
@@ -180,7 +180,7 @@ Add product routes and shell extensions through file routing, semantic placement
180
180
 
181
181
  - Id: `ui/page-and-placement`
182
182
  - Keywords: `component`, `navigation`, `outlet`, `page`, `placement`, `routes`, `section`, `shell`, `subpages`, `vue`
183
- - Owner: `@jskit-ai/shell-web@0.1.183`
183
+ - Owner: `@jskit-ai/shell-web@0.1.184`
184
184
  - Read: [PATTERN.md](patterns/ui/page-and-placement/PATTERN.md)
185
185
  - Examples: [example/](patterns/ui/page-and-placement/example/)
186
186
  - Requires: `@jskit-ai/kernel`, `@jskit-ai/shell-web`
@@ -191,7 +191,7 @@ Compose an account settings route and profile, preference, and notification sect
191
191
 
192
192
  - Id: `users/account-settings`
193
193
  - Keywords: `account`, `notifications`, `preferences`, `profile`, `settings`, `user`, `vue`
194
- - Owner: `@jskit-ai/users-web@0.1.197`
194
+ - Owner: `@jskit-ai/users-web@0.1.198`
195
195
  - Read: [PATTERN.md](patterns/users/account-settings/PATTERN.md)
196
196
  - Examples: [example/](patterns/users/account-settings/example/)
197
197
  - Requires: `@jskit-ai/shell-web`, `@jskit-ai/users-core`, `@jskit-ai/users-web`
@@ -202,7 +202,7 @@ Expose user administration and workspace-scoped member operations through app-ow
202
202
 
203
203
  - Id: `users/user-administration-server`
204
204
  - Keywords: `account`, `admin`, `member`, `repository`, `resource`, `routes`, `service`, `user`, `workspace`
205
- - Owner: `@jskit-ai/users-core@0.1.192`
205
+ - Owner: `@jskit-ai/users-core@0.1.193`
206
206
  - Read: [PATTERN.md](patterns/users/user-administration-server/PATTERN.md)
207
207
  - Examples: [example/](patterns/users/user-administration-server/example/)
208
208
  - Requires: `@jskit-ai/crud-core`, `@jskit-ai/users-core`
@@ -213,7 +213,7 @@ Configure roles, workspace access policy, invitations, and app-owned invitation
213
213
 
214
214
  - Id: `workspaces/workspace-server`
215
215
  - Keywords: `access`, `invite`, `membership`, `multitenancy`, `policy`, `role`, `tenancy`, `workspace`
216
- - Owner: `@jskit-ai/workspaces-core@0.1.157`
216
+ - Owner: `@jskit-ai/workspaces-core@0.1.158`
217
217
  - Read: [PATTERN.md](patterns/workspaces/workspace-server/PATTERN.md)
218
218
  - Examples: [example/](patterns/workspaces/workspace-server/example/)
219
219
  - Requires: `@jskit-ai/users-core`, `@jskit-ai/workspaces-core`
@@ -224,7 +224,7 @@ Compose workspace selection, invitation, member administration, settings, and re
224
224
 
225
225
  - Id: `workspaces/workspace-surfaces`
226
226
  - Keywords: `admin`, `invite`, `member`, `navigation`, `settings`, `surface`, `switcher`, `workspace`
227
- - Owner: `@jskit-ai/workspaces-web@0.1.158`
227
+ - Owner: `@jskit-ai/workspaces-web@0.1.159`
228
228
  - Read: [PATTERN.md](patterns/workspaces/workspace-surfaces/PATTERN.md)
229
229
  - Examples: [example/](patterns/workspaces/workspace-surfaces/example/)
230
230
  - Requires: `@jskit-ai/shell-web`, `@jskit-ai/workspaces-core`, `@jskit-ai/workspaces-web`
@@ -34,7 +34,7 @@
34
34
  "dependencies": {
35
35
  "@local/main": "0.1.0",
36
36
  "@fastify/static": "^10.1.3",
37
- "@jskit-ai/kernel": "0.1.179",
37
+ "@jskit-ai/kernel": "0.1.180",
38
38
  "@tanstack/vue-query": "^5.101.0",
39
39
  "fastify": "^5.8.5",
40
40
  "json-rest-schema": "^1.0.17",
@@ -42,11 +42,11 @@
42
42
  "vue": "^3.5.38",
43
43
  "vue-router": "^5.1.0",
44
44
  "vuetify": "^4.1.2",
45
- "@jskit-ai/http-runtime": "0.1.177"
45
+ "@jskit-ai/http-runtime": "0.1.178"
46
46
  },
47
47
  "devDependencies": {
48
- "@jskit-ai/config-eslint": "0.1.176",
49
- "@jskit-ai/jskit-catalog": "0.1.204",
48
+ "@jskit-ai/config-eslint": "0.1.177",
49
+ "@jskit-ai/jskit-catalog": "0.1.205",
50
50
  "@playwright/test": "1.61.1",
51
51
  "@vitejs/plugin-vue": "^6.0.7",
52
52
  "eslint": "^10.8.0",
@@ -34,7 +34,7 @@
34
34
  "dependencies": {
35
35
  "@local/main": "0.1.0",
36
36
  "@fastify/static": "^10.1.3",
37
- "@jskit-ai/kernel": "0.1.179",
37
+ "@jskit-ai/kernel": "0.1.180",
38
38
  "@tanstack/vue-query": "^5.101.0",
39
39
  "fastify": "^5.8.5",
40
40
  "json-rest-schema": "^1.0.17",
@@ -42,13 +42,13 @@
42
42
  "vue": "^3.5.38",
43
43
  "vue-router": "^5.1.0",
44
44
  "vuetify": "^4.1.2",
45
- "@jskit-ai/http-runtime": "0.1.177",
45
+ "@jskit-ai/http-runtime": "0.1.178",
46
46
  "@mdi/js": "^7.4.47",
47
- "@jskit-ai/shell-web": "0.1.183"
47
+ "@jskit-ai/shell-web": "0.1.184"
48
48
  },
49
49
  "devDependencies": {
50
- "@jskit-ai/config-eslint": "0.1.176",
51
- "@jskit-ai/jskit-catalog": "0.1.204",
50
+ "@jskit-ai/config-eslint": "0.1.177",
51
+ "@jskit-ai/jskit-catalog": "0.1.205",
52
52
  "@playwright/test": "1.61.1",
53
53
  "@vitejs/plugin-vue": "^6.0.7",
54
54
  "eslint": "^10.8.0",
@@ -9,7 +9,7 @@
9
9
  },
10
10
  "description": "App-local runtime composition and lightweight glue.",
11
11
  "dependencies": {
12
- "@jskit-ai/kernel": "0.1.179"
12
+ "@jskit-ai/kernel": "0.1.180"
13
13
  },
14
14
  "jskit": {
15
15
  "kind": "runtime",
@@ -2,6 +2,6 @@
2
2
  "private": true,
3
3
  "type": "module",
4
4
  "dependencies": {
5
- "@jskit-ai/auth-provider-supabase-core": "0.1.176"
5
+ "@jskit-ai/auth-provider-supabase-core": "0.1.177"
6
6
  }
7
7
  }
@@ -8,8 +8,8 @@
8
8
  "./shared": "./src/shared/index.js"
9
9
  },
10
10
  "dependencies": {
11
- "@jskit-ai/crud-core": "0.1.190",
12
- "@jskit-ai/resource-crud-core": "0.1.121"
11
+ "@jskit-ai/crud-core": "0.1.191",
12
+ "@jskit-ai/resource-crud-core": "0.1.122"
13
13
  },
14
14
  "jskit": {
15
15
  "kind": "runtime",
@@ -8,6 +8,6 @@
8
8
  "db:migrate:status": "knex --knexfile ./knexfile.js migrate:list"
9
9
  },
10
10
  "dependencies": {
11
- "@jskit-ai/database-runtime-mysql": "0.1.177"
11
+ "@jskit-ai/database-runtime-mysql": "0.1.178"
12
12
  }
13
13
  }
@@ -8,6 +8,6 @@
8
8
  "db:migrate:status": "knex --knexfile ./knexfile.js migrate:list"
9
9
  },
10
10
  "dependencies": {
11
- "@jskit-ai/database-runtime-postgres": "0.1.176"
11
+ "@jskit-ai/database-runtime-postgres": "0.1.177"
12
12
  }
13
13
  }
@@ -53,9 +53,26 @@ Omit the placement when the product does not need a visible connection state.
53
53
  Change event listeners, Redis provisioning, and client invalidation behavior to
54
54
  match the product. Keep transport retry policy in the realtime runtime.
55
55
 
56
+ When every realtime event belongs behind the application's authentication
57
+ boundary, let the selected `auth.service` opt in with
58
+ `realtime.requireAuthentication: true`. Socket.IO then rejects an
59
+ unauthenticated handshake before the client can join any broadcast room. A
60
+ browser whose login identity changes must disconnect and reconnect its socket
61
+ so the next handshake resolves the new actor.
62
+
63
+ Use `auth.service.realtime.authorizeEvent({ actor, event: { name, payload } })`
64
+ for resource-specific read authorization. Return `true` only when the current
65
+ actor can read that event's resource. Authentication is revalidated before
66
+ delivery and every 30 seconds while idle. Redis peers perform the same checks
67
+ locally. Realtime failures are logged without failing an already-successful
68
+ mutation; one mutation owner publishes each completion, while progress events
69
+ describe distinct lifecycle states.
70
+
56
71
  ## Verification
57
72
 
58
73
  - Test in-process delivery without Redis.
74
+ - When authenticated-client mode is selected, reject an anonymous handshake
75
+ and reconnect after login, logout, and identity changes.
59
76
  - When Redis is selected, test delivery across two server processes.
60
77
  - Disconnect and reconnect a browser and verify recovery behavior.
61
78
  - Confirm the status contribution renders in compact and expanded shells.
@@ -2,7 +2,7 @@
2
2
  "private": true,
3
3
  "type": "module",
4
4
  "dependencies": {
5
- "@jskit-ai/realtime": "0.1.176",
6
- "@jskit-ai/shell-web": "0.1.183"
5
+ "@jskit-ai/realtime": "0.1.177",
6
+ "@jskit-ai/shell-web": "0.1.184"
7
7
  }
8
8
  }
@@ -5,7 +5,7 @@
5
5
  "private": true,
6
6
  "type": "module",
7
7
  "dependencies": {
8
- "@jskit-ai/kernel": "0.1.179",
8
+ "@jskit-ai/kernel": "0.1.180",
9
9
  "json-rest-schema": "^1.0.17"
10
10
  },
11
11
  "exports": {
@@ -9,8 +9,8 @@
9
9
  "./shared": "./src/shared/index.js"
10
10
  },
11
11
  "dependencies": {
12
- "@jskit-ai/crud-core": "0.1.190",
13
- "@jskit-ai/resource-crud-core": "0.1.121"
12
+ "@jskit-ai/crud-core": "0.1.191",
13
+ "@jskit-ai/resource-crud-core": "0.1.122"
14
14
  },
15
15
  "jskit": {
16
16
  "kind": "runtime",
@@ -9,9 +9,9 @@
9
9
  "./shared": "./src/shared/index.js"
10
10
  },
11
11
  "dependencies": {
12
- "@jskit-ai/crud-core": "0.1.190",
13
- "@jskit-ai/resource-crud-core": "0.1.121",
14
- "@jskit-ai/workspaces-core": "0.1.157"
12
+ "@jskit-ai/crud-core": "0.1.191",
13
+ "@jskit-ai/resource-crud-core": "0.1.122",
14
+ "@jskit-ai/workspaces-core": "0.1.158"
15
15
  },
16
16
  "jskit": {
17
17
  "kind": "runtime",