@jskit-ai/agent-docs 0.1.310 → 0.1.311

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 (22) hide show
  1. package/guide/agent/app-setup/authentication.md +48 -0
  2. package/guide/agent/app-setup/multi-homing.md +7 -1
  3. package/guide/agent/framework/side-effects.md +5 -1
  4. package/package.json +1 -1
  5. package/patterns/minimal-foundation/example/package.json +1 -1
  6. package/patterns/shell-foundation/example/package.json +1 -1
  7. package/reference/autogen/PATTERN_INDEX.md +28 -28
  8. package/reference/autogen/packages/assistant-core.md +11 -1
  9. package/reference/autogen/packages/auth-provider-local-core.md +4 -2
  10. package/reference/autogen/packages/http-web.md +5 -1
  11. package/skills/jskit/references/heuristics/client-requests.md +2 -2
  12. package/skills/jskit/references/multi-homing.md +7 -1
  13. package/skills/jskit/references/pattern-index.md +28 -28
  14. package/skills/jskit/references/patterns/app/minimal-foundation/example/package.json +1 -1
  15. package/skills/jskit/references/patterns/app/shell-foundation/example/package.json +1 -1
  16. package/skills/jskit/references/patterns/auth/accounts-hub/example/package.json +1 -1
  17. package/skills/jskit/references/patterns/auth/oidc-sign-in/example/package.json +1 -1
  18. package/skills/jskit/references/patterns/connectors/calendar-cli/example/package.json +2 -2
  19. package/skills/jskit/references/patterns/crud/crud-feature-package/example/packages/books/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 +4 -4
  22. package/skills/jskit/references/side-effects.md +5 -1
@@ -210,6 +210,54 @@ composition, pass the sender as `confirmationSender` to
210
210
  `resolveLocalAuthConfig()`; without one, pass
211
211
  `createLoggedConfirmationSender(logger)`.
212
212
 
213
+ In a test copy (`SIDE_EFFECTS` is not `live`, see
214
+ [Side effects and test copies](/guide/framework/side-effects)), local auth puts
215
+ its own simulated sender in place of an installed
216
+ `auth.local.confirmation-sender`, whatever that sender does: it sends nothing,
217
+ logs each link for the person testing, and keeps the link out of the answer.
218
+ The application's sender never runs there, so no code may depend on it having
219
+ run, such as code that confirms a registration with the link its sender was
220
+ given: in a test copy that code gets no link.
221
+
222
+ An application that confirms new accounts at once while its email isn't set up
223
+ says so with the optional `auth.local.confirmation-mode` capability, a function
224
+ that receives `{ email }` for each registration that would wait for its link
225
+ and answers `"link"` (send the link, as without the capability) or
226
+ `"without-link"` (create the account and sign the person in at once, as a
227
+ confirmed registration does, with the `auth.local.user.registered` hook). The
228
+ account it creates has an address nobody proved, so answer `"without-link"`
229
+ only when the application accepts that. Any other answer means `"link"` and
230
+ logs a warning. Local auth asks only while email confirmation is on and the
231
+ address isn't proven already (an invitation or the first account's setup
232
+ code). The mode sends nothing, so a test copy keeps it and registers as the
233
+ live copy does, while the sender is still replaced. It does not stand in for a
234
+ sender: a production server still needs one, or
235
+ `AUTH_LOCAL_EMAIL_CONFIRMATION=false`, and `"link"` registrations are sent
236
+ through it. An application that never sends a link sets
237
+ `AUTH_LOCAL_EMAIL_CONFIRMATION=false` instead.
238
+
239
+ ```js
240
+ import { defineProvider } from "@jskit-ai/kernel/shared/capabilities";
241
+
242
+ // Beside the application's confirmation sender, which emails the link once email is set up.
243
+ export const ConfirmationModeProvider = defineProvider({
244
+ id: "app.confirmation-mode",
245
+ requires: { mail: "app.mail" },
246
+ provides: { confirmationMode: "auth.local.confirmation-mode" },
247
+ /** @param {{ mail: import("@local/mail/server/types").AppMail }} capabilities */
248
+ setup({ mail }) {
249
+ /** @type {import("@jskit-ai/auth-provider-local-core/server/types").AuthLocalConfirmationMode} */
250
+ async function confirmationMode() {
251
+ return (await mail.isSetUp()) ? "link" : "without-link";
252
+ }
253
+ return { confirmationMode };
254
+ }
255
+ });
256
+ ```
257
+
258
+ For direct library composition, pass it as `confirmationMode` to
259
+ `createLocalAuthService()`.
260
+
213
261
  | Env | Default | Meaning |
214
262
  | --- | --- | --- |
215
263
  | `AUTH_LOCAL_EMAIL_CONFIRMATION` | on | `false` registers and signs in at once, without confirming the email. |
@@ -226,7 +226,13 @@ grows with the workspace, and a lookup per row multiplies it.
226
226
 
227
227
  To send invitation email, provide the optional `workspaces.invite-mailer`
228
228
  capability from one of the application's providers. Without one, invitations
229
- are still created and delivery reports `mailer_unconfigured`. The mailer, typed
229
+ are still created and delivery reports `mailer_unconfigured`. After **Send
230
+ invite**, the Members panel's notice follows the delivery status: `sent` says
231
+ the invite was sent; `simulated` (a test copy, whose `SIDE_EFFECTS` is not
232
+ `live`) and `mailer_unconfigured` say no email was sent; `failed` is a warning
233
+ that the email failed. Each of those three points to the invite link, which
234
+ the panel shows under the form with its **Copy** button. A status the panel
235
+ does not know says only that the invite was created. The mailer, typed
230
236
  `WorkspaceInviteMailer` in `@jskit-ai/workspaces-core/server/types`, is an
231
237
  object whose `sendWorkspaceInvite(message, options)` receives `{ inviteId,
232
238
  email, inviteUrl, workspace, inviter, roleSid, expiresAt, locale, message }`,
@@ -31,7 +31,11 @@ purpose: any host can set it. The host sets it; a request never chooses it.
31
31
  - The server logs once at startup whether it acts for real. A production server
32
32
  that simulates logs a warning.
33
33
  - Local-password emails (confirmation and password reset) with an installed
34
- sender are logged, not sent.
34
+ sender are logged, not sent: local auth uses its own simulated sender in
35
+ place of the application's, which never runs in a test copy. An application
36
+ that confirms new accounts at once while its email isn't set up uses
37
+ `auth.local.confirmation-mode`, which a test copy keeps (see
38
+ [Authentication](/guide/app-setup/authentication)).
35
39
  - Workspace invitations with a provided mailer are logged. The invitation
36
40
  answers `status: "simulated"`, and the inviter copies the link.
37
41
  - Accounts-hub email is logged, not sent.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jskit-ai/agent-docs",
3
- "version": "0.1.310",
3
+ "version": "0.1.311",
4
4
  "description": "Distributed JSKIT agent references, prompts, guides, and generated reference maps.",
5
5
  "type": "module",
6
6
  "files": [
@@ -50,7 +50,7 @@
50
50
  },
51
51
  "devDependencies": {
52
52
  "@jskit-ai/config-eslint": "0.1.251",
53
- "@jskit-ai/jskit-catalog": "0.2.62",
53
+ "@jskit-ai/jskit-catalog": "0.2.63",
54
54
  "@playwright/test": "1.61.1",
55
55
  "@vitejs/plugin-vue": "^6.0.7",
56
56
  "eslint": "^10.8.0",
@@ -51,7 +51,7 @@
51
51
  },
52
52
  "devDependencies": {
53
53
  "@jskit-ai/config-eslint": "0.1.251",
54
- "@jskit-ai/jskit-catalog": "0.2.62",
54
+ "@jskit-ai/jskit-catalog": "0.2.63",
55
55
  "@playwright/test": "1.61.1",
56
56
  "@vitejs/plugin-vue": "^6.0.7",
57
57
  "eslint": "^10.8.0",
@@ -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.310`
18
+ - Owner: `@jskit-ai/agent-docs@0.1.311`
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.310`
29
+ - Owner: `@jskit-ai/agent-docs@0.1.311`
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.2.52`
40
+ - Owner: `@jskit-ai/assistant-runtime@0.2.53`
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/connectors-catalog`, `@jskit-ai/connectors-core`, `@jskit-ai/shell-web`
@@ -48,7 +48,7 @@ Run one OpenID Connect sign-in for all of an owner's apps as its own JSKIT proje
48
48
 
49
49
  - Id: `auth/accounts-hub`
50
50
  - Keywords: `accounts hub`, `auth`, `authentication`, `issuer`, `master login`, `oidc`, `openid connect`, `single sign-on`, `sso`
51
- - Owner: `@jskit-ai/oidc-issuer-core@0.1.30`
51
+ - Owner: `@jskit-ai/oidc-issuer-core@0.1.31`
52
52
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/auth/accounts-hub/PATTERN.md)
53
53
  - Examples: [example/](../../skills/jskit/references/patterns/auth/accounts-hub/example/)
54
54
  - Requires: `@jskit-ai/oidc-issuer-core`
@@ -70,7 +70,7 @@ Let people sign in with the accounts they already have in an accounts hub or ano
70
70
 
71
71
  - Id: `auth/oidc-sign-in`
72
72
  - Keywords: `accounts hub`, `auth`, `authentication`, `back-channel logout`, `dynamic client registration`, `issuer`, `master login`, `oidc`, `openid connect`, `single sign-on`, `sso`
73
- - Owner: `@jskit-ai/auth-provider-oidc-core@0.2.34`
73
+ - Owner: `@jskit-ai/auth-provider-oidc-core@0.2.35`
74
74
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/auth/oidc-sign-in/PATTERN.md)
75
75
  - Examples: [example/](../../skills/jskit/references/patterns/auth/oidc-sign-in/example/)
76
76
  - Requires: `@jskit-ai/auth-provider-oidc-core`, `@jskit-ai/auth-web`
@@ -92,7 +92,7 @@ Resolve an administrator environment key or an individual user's grant, then use
92
92
 
93
93
  - Id: `connectors/ai-connections`
94
94
  - Keywords: `ai`, `api-key`, `cli`, `environment`, `free`, `models`, `ownership`, `zai`, `zen`
95
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
95
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
96
96
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/ai-connections/PATTERN.md)
97
97
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/ai-connections/example/)
98
98
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -103,7 +103,7 @@ Compose provider operations, authorization and encrypted file storage from a CLI
103
103
 
104
104
  - Id: `connectors/api-key-connection`
105
105
  - Keywords: `api-key`, `clay`, `cli`, `clickhouse`, `connectors`, `dbt`, `files`, `firecrawl`, `granola`, `integrations`, `metrics`, `prestashop`, `resend`, `semantic-layer`, `semrush`, `x-twitter`
106
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
106
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
107
107
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/api-key-connection/PATTERN.md)
108
108
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/api-key-connection/example/)
109
109
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -114,7 +114,7 @@ Compose token-based MCP discovery and explicitly authorized tool calls using the
114
114
 
115
115
  - Id: `connectors/assistant-mcp`
116
116
  - Keywords: `assistant`, `cli`, `connectors`, `files`, `integrations`, `mcp`, `n8n`, `sanity`
117
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
117
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
118
118
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/assistant-mcp/PATTERN.md)
119
119
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/assistant-mcp/example/)
120
120
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -125,7 +125,7 @@ Configure assistant OAuth clients, then compose existing state, encrypted file g
125
125
 
126
126
  - Id: `connectors/assistant-mcp-oauth`
127
127
  - Keywords: `amplitude`, `assistant`, `atlassian`, `canva`, `cli`, `client metadata`, `confidence`, `connectors`, `figma`, `files`, `granola`, `hex`, `mcp`, `miro`, `oauth`
128
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
128
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
129
129
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/assistant-mcp-oauth/PATTERN.md)
130
130
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/assistant-mcp-oauth/example/)
131
131
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -136,7 +136,7 @@ Compose signed AWS operations, file configuration and application authorization
136
136
 
137
137
  - Id: `connectors/aws-storage-queries`
138
138
  - Keywords: `athena`, `aws`, `cli`, `connectors`, `files`, `iam`, `queries`, `s3`, `storage`, `sts`
139
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
139
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
140
140
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/aws-storage-queries/PATTERN.md)
141
141
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/aws-storage-queries/example/)
142
142
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -147,7 +147,7 @@ Compose reusable connection libraries with portable configuration, application o
147
147
 
148
148
  - Id: `connectors/calendar-cli`
149
149
  - Keywords: `calendar`, `cli`, `connectors`, `google`, `integrations`, `oauth`, `permissions`
150
- - Owner: `@jskit-ai/connector-google-calendar@0.2.29`
150
+ - Owner: `@jskit-ai/connector-google-calendar@0.2.30`
151
151
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/calendar-cli/PATTERN.md)
152
152
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/calendar-cli/example/)
153
153
  - Requires: `@jskit-ai/connector-google-calendar`, `@jskit-ai/connectors-core`, `@jskit-ai/database-runtime-mysql`
@@ -158,7 +158,7 @@ Compose the shared connector runtime for event delivery while leaving workflow c
158
158
 
159
159
  - Id: `connectors/event-delivery`
160
160
  - Keywords: `cli`, `connectors`, `events`, `files`, `inngest`, `integrations`, `workflows`
161
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
161
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
162
162
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/event-delivery/PATTERN.md)
163
163
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/event-delivery/example/)
164
164
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -169,7 +169,7 @@ Wire service-account grants, file storage, explicit message actions and public b
169
169
 
170
170
  - Id: `connectors/firebase-messaging`
171
171
  - Keywords: `cli`, `connectors`, `fcm`, `files`, `firebase`, `integrations`, `jwt`, `notifications`, `push`, `service-account`, `vapid`
172
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
172
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
173
173
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/firebase-messaging/PATTERN.md)
174
174
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/firebase-messaging/example/)
175
175
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -180,7 +180,7 @@ Compose reviewed Search campaigns with project-owned Google OAuth and portable s
180
180
 
181
181
  - Id: `connectors/google-ads-search`
182
182
  - Keywords: `ads`, `campaigns`, `cli`, `connectors`, `conversion`, `google`, `search`
183
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
183
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
184
184
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/google-ads-search/PATTERN.md)
185
185
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/google-ads-search/example/)
186
186
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -191,7 +191,7 @@ Compose provider consent, verification and encrypted file persistence from an ap
191
191
 
192
192
  - Id: `connectors/oauth-connection`
193
193
  - Keywords: `accounting`, `assistant permissions`, `books`, `cli`, `client credentials`, `connectors`, `consent`, `crm`, `databricks`, `developer token`, `fabric`, `files`, `gaql`, `google ads`, `graphql`, `integrations`, `linkedin`, `microsoft`, `oauth`, `powerpoint`, `salesforce`, `service principal`, `shopify`, `soql`, `staffing`, `tiktok`, `twitch`, `wave`, `word`, `wordpress`, `workday`, `xero`, `zoho`
194
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
194
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
195
195
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/oauth-connection/PATTERN.md)
196
196
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/oauth-connection/example/)
197
197
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -202,7 +202,7 @@ Compose a sequential catalogue batch and preserve partial success for applicatio
202
202
 
203
203
  - Id: `connectors/paddle-catalogue`
204
204
  - Keywords: `batch`, `paddle`, `payments`, `prices`, `products`
205
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
205
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
206
206
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/paddle-catalogue/PATTERN.md)
207
207
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/paddle-catalogue/example/)
208
208
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -213,7 +213,7 @@ Resolve a publishable image key deliberately and use the shared URL library in a
213
213
 
214
214
  - Id: `connectors/public-image`
215
215
  - Keywords: `cli`, `connectors`, `files`, `images`, `integrations`, `logo-dev`, `public-key`
216
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
216
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
217
217
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/public-image/PATTERN.md)
218
218
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/public-image/example/)
219
219
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -224,7 +224,7 @@ Compose file configuration, Redshift Data API operations and application query o
224
224
 
225
225
  - Id: `connectors/redshift-queries`
226
226
  - Keywords: `aws`, `cli`, `connectors`, `files`, `iam`, `provisioned`, `redshift`, `serverless`, `sql`, `warehouse`
227
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
227
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
228
228
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/redshift-queries/PATTERN.md)
229
229
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/redshift-queries/example/)
230
230
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -235,7 +235,7 @@ Use the shared scanner runtime from a CLI or a host worker with portable configu
235
235
 
236
236
  - Id: `connectors/source-scanning`
237
237
  - Keywords: `cancellation`, `cli`, `connectors`, `integrations`, `scanning`, `security`, `source`, `wiz`, `worker`
238
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
238
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
239
239
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/source-scanning/PATTERN.md)
240
240
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/source-scanning/example/)
241
241
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -246,7 +246,7 @@ Add a protected administration surface, settings shell, and semantic navigation
246
246
 
247
247
  - Id: `console/console-surface`
248
248
  - Keywords: `admin`, `console`, `navigation`, `owner`, `placement`, `settings`, `surface`
249
- - Owner: `@jskit-ai/console-web@0.1.261`
249
+ - Owner: `@jskit-ai/console-web@0.1.262`
250
250
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/console/console-surface/PATTERN.md)
251
251
  - Examples: [example/](../../skills/jskit/references/patterns/console/console-surface/example/)
252
252
  - Requires: `@jskit-ai/console-core`, `@jskit-ai/console-web`, `@jskit-ai/shell-web`
@@ -268,7 +268,7 @@ Build a complete application-owned CRUD server package from a migration, a table
268
268
 
269
269
  - Id: `crud/crud-feature-package`
270
270
  - Keywords: `actions`, `crud`, `database`, `defineCrudFeature`, `json-api`, `migration`, `owns`, `permissions`, `repository`, `routes`, `service`, `table resource`
271
- - Owner: `@jskit-ai/crud-core@0.2.29`
271
+ - Owner: `@jskit-ai/crud-core@0.2.30`
272
272
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/crud/crud-feature-package/PATTERN.md)
273
273
  - Examples: [example/](../../skills/jskit/references/patterns/crud/crud-feature-package/example/)
274
274
  - Requires: `@jskit-ai/crud-core`, `@jskit-ai/resource-core`, `@jskit-ai/resource-crud-core`
@@ -279,7 +279,7 @@ Build a routed CRUD user interface as thin application pages over JSKIT's shared
279
279
 
280
280
  - Id: `crud/crud-screen-set`
281
281
  - Keywords: `actions`, `add`, `crud`, `delete`, `edit`, `filters`, `list`, `material`, `routes`, `view`, `vue`
282
- - Owner: `@jskit-ai/http-web@0.2.35`
282
+ - Owner: `@jskit-ai/http-web@0.2.36`
283
283
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/crud/crud-screen-set/PATTERN.md)
284
284
  - Examples: [example/](../../skills/jskit/references/patterns/crud/crud-screen-set/example/)
285
285
  - Requires: `@jskit-ai/http-web`, `@jskit-ai/resource-core`, `@jskit-ai/resource-crud-core`
@@ -345,7 +345,7 @@ Compose application-owned Google Publisher Tag delivery with the generic rewarde
345
345
 
346
346
  - Id: `rewards/google-rewarded`
347
347
  - Keywords: `ads`, `google`, `publisher tag`, `rewarded`, `unlock`
348
- - Owner: `@jskit-ai/rewarded-web@0.2.39`
348
+ - Owner: `@jskit-ai/rewarded-web@0.2.40`
349
349
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/rewards/google-rewarded/PATTERN.md)
350
350
  - Examples: [example/](../../skills/jskit/references/patterns/rewards/google-rewarded/example/)
351
351
  - Requires: `@jskit-ai/rewarded-web`
@@ -356,7 +356,7 @@ Define a server feature through explicit capabilities and first-class actions, a
356
356
 
357
357
  - Id: `server/feature-package`
358
358
  - Keywords: `actions`, `aggregate`, `feature`, `handle`, `orchestration`, `owns`, `package`, `provider`, `repository`, `routes`, `server`, `table resource`
359
- - Owner: `@jskit-ai/agent-docs@0.1.310`
359
+ - Owner: `@jskit-ai/agent-docs@0.1.311`
360
360
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/server/feature-package/PATTERN.md)
361
361
  - Examples: [example/](../../skills/jskit/references/patterns/server/feature-package/example/)
362
362
  - Requires: `@jskit-ai/kernel`
@@ -389,7 +389,7 @@ Compose an account settings route and profile, preference, notification, and sig
389
389
 
390
390
  - Id: `users/account-settings`
391
391
  - Keywords: `account`, `link provider`, `notifications`, `oauth`, `preferences`, `profile`, `settings`, `sign-in methods`, `user`, `vue`
392
- - Owner: `@jskit-ai/users-web@0.2.44`
392
+ - Owner: `@jskit-ai/users-web@0.2.45`
393
393
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/users/account-settings/PATTERN.md)
394
394
  - Examples: [example/](../../skills/jskit/references/patterns/users/account-settings/example/)
395
395
  - Requires: `@jskit-ai/shell-web`, `@jskit-ai/users-core`, `@jskit-ai/users-web`
@@ -400,7 +400,7 @@ Expose user administration and workspace-scoped member operations through app-ow
400
400
 
401
401
  - Id: `users/user-administration-server`
402
402
  - Keywords: `account`, `admin`, `member`, `repository`, `resource`, `routes`, `service`, `user`, `workspace`
403
- - Owner: `@jskit-ai/users-core@0.2.33`
403
+ - Owner: `@jskit-ai/users-core@0.2.34`
404
404
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/users/user-administration-server/PATTERN.md)
405
405
  - Examples: [example/](../../skills/jskit/references/patterns/users/user-administration-server/example/)
406
406
  - Requires: `@jskit-ai/crud-core`, `@jskit-ai/users-core`
@@ -411,7 +411,7 @@ Configure roles, workspace access policy, invitations, and app-owned invitation
411
411
 
412
412
  - Id: `workspaces/workspace-server`
413
413
  - Keywords: `access`, `invite`, `membership`, `multitenancy`, `policy`, `role`, `tenancy`, `workspace`
414
- - Owner: `@jskit-ai/workspaces-core@0.2.33`
414
+ - Owner: `@jskit-ai/workspaces-core@0.2.34`
415
415
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/workspaces/workspace-server/PATTERN.md)
416
416
  - Examples: [example/](../../skills/jskit/references/patterns/workspaces/workspace-server/example/)
417
417
  - Requires: `@jskit-ai/users-core`, `@jskit-ai/workspaces-core`
@@ -422,7 +422,7 @@ Compose workspace selection, invitation, member administration, settings, and re
422
422
 
423
423
  - Id: `workspaces/workspace-surfaces`
424
424
  - Keywords: `admin`, `invite`, `member`, `navigation`, `settings`, `surface`, `switcher`, `workspace`
425
- - Owner: `@jskit-ai/workspaces-web@0.2.44`
425
+ - Owner: `@jskit-ai/workspaces-web@0.2.45`
426
426
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/workspaces/workspace-surfaces/PATTERN.md)
427
427
  - Examples: [example/](../../skills/jskit/references/patterns/workspaces/workspace-surfaces/example/)
428
428
  - Requires: `@jskit-ai/shell-web`, `@jskit-ai/workspaces-core`, `@jskit-ai/workspaces-web`
@@ -370,6 +370,11 @@ Local functions
370
370
  Exports
371
371
  - `createClaudeCommandRun({ bound, preparation, send, interrupt })`
372
372
 
373
+ ### `src/server/conversation/claudeEntryStop.js`
374
+ Exports
375
+ - `setClaudeTurnState(entry, state, message = "")`
376
+ - `stopClaudeEntryProcess(turn, reason = "", { preparing = false } = {})`
377
+
373
378
  ### `src/server/conversation/claudeHistory.js`
374
379
  Exports
375
380
  - `claudeNativeMessageId(id)`
@@ -399,7 +404,7 @@ Exports
399
404
  - `type ClaudeTurnProcess`
400
405
  Local functions
401
406
  - `steeringRefusal(message, { messageCode, finished })`
402
- - `setClaudeTurnState(entry, state, message = "")`
407
+ - `unsentDelivery(error)`
403
408
  - `claudeTurnResult(entry, current)`
404
409
  - `claudeProviderChange(frame)`
405
410
  - `continuesClaudeTurn(frame)`
@@ -444,6 +449,8 @@ Exports
444
449
  ### `src/server/conversation/claudePromptDelivery.js`
445
450
  Exports
446
451
  - `createClaudePromptDelivery({ store, preparation, createError, onEvent, readHistory, bindAccount, ensureProcess, snapshot })`
452
+ Local functions
453
+ - `rememberPromptProcess(entry, uuid)`
447
454
 
448
455
  ### `src/server/conversation/claudeSessionCleanup.js`
449
456
  Exports
@@ -476,6 +483,7 @@ Exports
476
483
  - `type ClaudeConversationErrorFactory`
477
484
  Local functions
478
485
  - `nativeWorkSettled(entry)`
486
+ - `promptCanStillArrive(entry, uuid)`
479
487
  - `runsNativeWork(entry)`
480
488
 
481
489
  ### `src/server/conversation/codexAccountReader.js`
@@ -1220,6 +1228,8 @@ Exports
1220
1228
  - `type ConversationEntry`
1221
1229
  - `type ConversationRequest`
1222
1230
  - `type ConversationDelivery`
1231
+ Local functions
1232
+ - `nativeAdmission(observation)`
1223
1233
 
1224
1234
  ### `src/server/conversation/conversationEntries.js`
1225
1235
  Exports
@@ -59,7 +59,8 @@ Local functions
59
59
  ### `src/server/lib/emailConfirmation.js`
60
60
  Exports
61
61
  - `CONFIRMATION_TOKEN_TTL_SECONDS`
62
- - `createLocalEmailConfirmation({ backend, config, confirmationSender, firstAccountSetup, invitationContextResolver, passwords, profileProjector, sessions })`
62
+ - `confirmEveryRegistrationByLink()`
63
+ - `createLocalEmailConfirmation({ backend, config, confirmationMode, confirmationSender, firstAccountSetup, invitationContextResolver, logger, passwords, profileProjector, sessions })`
63
64
  - `createLoggedConfirmationSender(logger)`
64
65
  - `createSimulatedConfirmationSender(logger)`
65
66
  Local functions
@@ -184,7 +185,7 @@ Exports
184
185
 
185
186
  ### `src/server/lib/service.js`
186
187
  Exports
187
- - `createLocalAuthService({ backend, config, confirmationSender, firstAccountSetup: givenFirstAccountSetup = null, invitationContextResolver, logger, passwordStrategy, profileProjector, recoverySender })`
188
+ - `createLocalAuthService({ backend, config, confirmationMode = confirmEveryRegistrationByLink, confirmationSender, firstAccountSetup: givenFirstAccountSetup = null, invitationContextResolver, logger, passwordStrategy, profileProjector, recoverySender })`
188
189
 
189
190
  ### `src/server/lib/sessions.js`
190
191
  Exports
@@ -235,6 +236,7 @@ Exports
235
236
  - `type AuthLocalPasswordStrategy`
236
237
  - `type AuthLocalRecoverySender`
237
238
  - `type AuthLocalConfirmationSender`
239
+ - `type AuthLocalConfirmationMode`
238
240
  - `type AuthLocalConfig`
239
241
  - `type AuthLocalOAuthProvider`
240
242
  - `type AuthLocalFirstAccountSetup`
@@ -268,6 +268,7 @@ Local functions
268
268
 
269
269
  ### `src/client/composables/runtime/operationUiHelpers.js`
270
270
  Exports
271
+ - `createLoadRetryActionFactory({ errorStatus, retry, enabled = true })`
271
272
  - `setupRouteChangeCleanup({ enabled = true, route, feedback, onClear })`
272
273
  - `setupOperationErrorReporting({ enabled = true, source = "http-web.operation", loadError = null, notFoundError = null, loadActionFactory = noRetryAction, notFoundActionFactory = noRetryAction, loadChannel = "", notFoundChannel = "", loadSeverity = "error", notFoundSeverity = "warning", dedupeWindowMs = 2000 } = {})`
273
274
  Local functions
@@ -311,7 +312,7 @@ Local functions
311
312
 
312
313
  ### `src/client/composables/runtime/useUiFeedback.js`
313
314
  Exports
314
- - `useUiFeedback({ initialType = "success", source = "http-web.ui-feedback", successChannel = "", errorChannel = "", dedupeWindowMs = 2000 } = {})`
315
+ - `useUiFeedback({ initialType = "success", source = "http-web.ui-feedback", successChannel = "", warningChannel = "", errorChannel = "", dedupeWindowMs = 2000 } = {})`
315
316
 
316
317
  ### `src/client/composables/runtime/useViewCore.js`
317
318
  Exports
@@ -325,6 +326,7 @@ Exports
325
326
 
326
327
  ### `src/client/composables/support/errorMessageHelpers.js`
327
328
  Exports
329
+ - `toLoadRefusalMessage(error)`
328
330
  - `toQueryErrorMessage(error, fallbackMessage = "", defaultMessage = "")`
329
331
  - `toUiErrorMessage(error, fallbackMessage = "", defaultMessage = "")`
330
332
  - `toUiFieldErrors(error)`
@@ -384,8 +386,10 @@ Local functions
384
386
  Exports
385
387
  - `buildRequestRecoveryMeta(requestRecovery = null, defaults = {})`
386
388
  - `hasResolvedQueryData({ query = null, data = null } = {})`
389
+ - `isRetryableLoadStatus(status)`
387
390
  - `mergeQueryMeta(queryOptions = null, meta = {})`
388
391
  - `mergeRequestRecoveryQueryMeta(queryOptions = null, requestRecovery = null, defaults = {})`
392
+ - `resolveLoadErrorStatus(error)`
389
393
  Local functions
390
394
  - `normalizeRequestRecoveryInput(requestRecovery = null)`
391
395
  - `normalizeRequestRecoveryValue(name, value)`
@@ -93,14 +93,14 @@ Why this is the standard JSKIT shape:
93
93
 
94
94
  Error presentation rules:
95
95
 
96
- - Resource load failures should stay local to the screen with the runtime's `loadError` state and a retry action.
96
+ - Resource load failures should stay local to the screen with the runtime's `loadError` state and a retry action when trying again can help. The load notices of `useList()`, `useView()` and `useAddEdit()`, and the Retry buttons of `CrudListScreen`, `CrudViewScreen` and `CrudAddEditScreen`, offer Retry only after a network failure (no status), 408, 429 or a 5xx; a refusal (401, 403, 404, 422 and other 4xx) gets none. The three runtimes expose the status as `errorStatus` (0 for a network failure), so a custom screen can tell a refusal from a network failure and hide its own Retry the same way. After a refusal a screen says why rather than suggesting the connection: the runtimes' `loadRefusalMessage` is the server's own message when the error carries one, otherwise a neutral text for the kind of refusal (401, 403, 404, another 4xx), and empty when trying again can help; the three CRUD screens show it.
97
97
  - Do not force global banners for ordinary list/view/add-edit load failures; the shell error policy treats `resource-load` as `silent` by default.
98
98
  - Transport/connectivity failures are different from ordinary resource-load errors. `shell-web` observes the app QueryClient and reports active safe-read query failures such as `Network request failed.` or `Failed to fetch` through request recovery with a `Retry` action that calls `query.refetch()`.
99
99
  - User-visible reads should be TanStack Query-backed through `useEndpointResource()`, `useList()`, `useView()`, `useAddEdit()`, or CRUD screen composables. Do not load panel data with raw `fetch(...)` plus manual request recovery reporting.
100
100
  - Automatic shell request recovery is for `GET` and `HEAD` read refetches. Do not use it to replay `POST`, `PATCH`, `PUT`, or `DELETE`; saving and command screens own their mutation state and feedback.
101
101
  - JSKIT read composables mark their Query entries with `jskit.requestRecoveryMethod`. For hand-written TanStack Query reads outside those composables, set `meta.jskit.requestRecoveryMethod` to `GET` or `HEAD`.
102
102
  - Use `requestRecoveryLabel` on JSKIT read composables, or query meta `jskit.requestRecoveryLabel`, when the recovery banner needs a better label. Use `jskit.requestRecovery = false` only when a query owns its full connectivity recovery UI.
103
- - Use `useUiFeedback()` or `useCommand()` for user-triggered action feedback. Those flows report `action-feedback`, and the app-owned shell error policy decides the channel.
103
+ - Use `useUiFeedback()` or `useCommand()` for user-triggered action feedback. Those flows report `action-feedback`, and the app-owned shell error policy decides the channel. An action that did its work with a catch the person must act on (an invitation created but not emailed) reports through `useUiFeedback().warning()`, not `success()`.
104
104
  - Use explicit shell error intents only for exceptional app-level cases: `app-recoverable` for recoverable shell/runtime failures and `blocking` for failures that require user attention.
105
105
 
106
106
  Avoid:
@@ -226,7 +226,13 @@ grows with the workspace, and a lookup per row multiplies it.
226
226
 
227
227
  To send invitation email, provide the optional `workspaces.invite-mailer`
228
228
  capability from one of the application's providers. Without one, invitations
229
- are still created and delivery reports `mailer_unconfigured`. The mailer, typed
229
+ are still created and delivery reports `mailer_unconfigured`. After **Send
230
+ invite**, the Members panel's notice follows the delivery status: `sent` says
231
+ the invite was sent; `simulated` (a test copy, whose `SIDE_EFFECTS` is not
232
+ `live`) and `mailer_unconfigured` say no email was sent; `failed` is a warning
233
+ that the email failed. Each of those three points to the invite link, which
234
+ the panel shows under the form with its **Copy** button. A status the panel
235
+ does not know says only that the invite was created. The mailer, typed
230
236
  `WorkspaceInviteMailer` in `@jskit-ai/workspaces-core/server/types`, is an
231
237
  object whose `sendWorkspaceInvite(message, options)` receives `{ inviteId,
232
238
  email, inviteUrl, workspace, inviter, roleSid, expiresAt, locale, message }`,
@@ -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.310`
18
+ - Owner: `@jskit-ai/agent-docs@0.1.311`
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.310`
29
+ - Owner: `@jskit-ai/agent-docs@0.1.311`
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.2.52`
40
+ - Owner: `@jskit-ai/assistant-runtime@0.2.53`
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/connectors-catalog`, `@jskit-ai/connectors-core`, `@jskit-ai/shell-web`
@@ -48,7 +48,7 @@ Run one OpenID Connect sign-in for all of an owner's apps as its own JSKIT proje
48
48
 
49
49
  - Id: `auth/accounts-hub`
50
50
  - Keywords: `accounts hub`, `auth`, `authentication`, `issuer`, `master login`, `oidc`, `openid connect`, `single sign-on`, `sso`
51
- - Owner: `@jskit-ai/oidc-issuer-core@0.1.30`
51
+ - Owner: `@jskit-ai/oidc-issuer-core@0.1.31`
52
52
  - Read: [PATTERN.md](patterns/auth/accounts-hub/PATTERN.md)
53
53
  - Examples: [example/](patterns/auth/accounts-hub/example/)
54
54
  - Requires: `@jskit-ai/oidc-issuer-core`
@@ -70,7 +70,7 @@ Let people sign in with the accounts they already have in an accounts hub or ano
70
70
 
71
71
  - Id: `auth/oidc-sign-in`
72
72
  - Keywords: `accounts hub`, `auth`, `authentication`, `back-channel logout`, `dynamic client registration`, `issuer`, `master login`, `oidc`, `openid connect`, `single sign-on`, `sso`
73
- - Owner: `@jskit-ai/auth-provider-oidc-core@0.2.34`
73
+ - Owner: `@jskit-ai/auth-provider-oidc-core@0.2.35`
74
74
  - Read: [PATTERN.md](patterns/auth/oidc-sign-in/PATTERN.md)
75
75
  - Examples: [example/](patterns/auth/oidc-sign-in/example/)
76
76
  - Requires: `@jskit-ai/auth-provider-oidc-core`, `@jskit-ai/auth-web`
@@ -92,7 +92,7 @@ Resolve an administrator environment key or an individual user's grant, then use
92
92
 
93
93
  - Id: `connectors/ai-connections`
94
94
  - Keywords: `ai`, `api-key`, `cli`, `environment`, `free`, `models`, `ownership`, `zai`, `zen`
95
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
95
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
96
96
  - Read: [PATTERN.md](patterns/connectors/ai-connections/PATTERN.md)
97
97
  - Examples: [example/](patterns/connectors/ai-connections/example/)
98
98
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -103,7 +103,7 @@ Compose provider operations, authorization and encrypted file storage from a CLI
103
103
 
104
104
  - Id: `connectors/api-key-connection`
105
105
  - Keywords: `api-key`, `clay`, `cli`, `clickhouse`, `connectors`, `dbt`, `files`, `firecrawl`, `granola`, `integrations`, `metrics`, `prestashop`, `resend`, `semantic-layer`, `semrush`, `x-twitter`
106
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
106
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
107
107
  - Read: [PATTERN.md](patterns/connectors/api-key-connection/PATTERN.md)
108
108
  - Examples: [example/](patterns/connectors/api-key-connection/example/)
109
109
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -114,7 +114,7 @@ Compose token-based MCP discovery and explicitly authorized tool calls using the
114
114
 
115
115
  - Id: `connectors/assistant-mcp`
116
116
  - Keywords: `assistant`, `cli`, `connectors`, `files`, `integrations`, `mcp`, `n8n`, `sanity`
117
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
117
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
118
118
  - Read: [PATTERN.md](patterns/connectors/assistant-mcp/PATTERN.md)
119
119
  - Examples: [example/](patterns/connectors/assistant-mcp/example/)
120
120
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -125,7 +125,7 @@ Configure assistant OAuth clients, then compose existing state, encrypted file g
125
125
 
126
126
  - Id: `connectors/assistant-mcp-oauth`
127
127
  - Keywords: `amplitude`, `assistant`, `atlassian`, `canva`, `cli`, `client metadata`, `confidence`, `connectors`, `figma`, `files`, `granola`, `hex`, `mcp`, `miro`, `oauth`
128
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
128
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
129
129
  - Read: [PATTERN.md](patterns/connectors/assistant-mcp-oauth/PATTERN.md)
130
130
  - Examples: [example/](patterns/connectors/assistant-mcp-oauth/example/)
131
131
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -136,7 +136,7 @@ Compose signed AWS operations, file configuration and application authorization
136
136
 
137
137
  - Id: `connectors/aws-storage-queries`
138
138
  - Keywords: `athena`, `aws`, `cli`, `connectors`, `files`, `iam`, `queries`, `s3`, `storage`, `sts`
139
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
139
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
140
140
  - Read: [PATTERN.md](patterns/connectors/aws-storage-queries/PATTERN.md)
141
141
  - Examples: [example/](patterns/connectors/aws-storage-queries/example/)
142
142
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -147,7 +147,7 @@ Compose reusable connection libraries with portable configuration, application o
147
147
 
148
148
  - Id: `connectors/calendar-cli`
149
149
  - Keywords: `calendar`, `cli`, `connectors`, `google`, `integrations`, `oauth`, `permissions`
150
- - Owner: `@jskit-ai/connector-google-calendar@0.2.29`
150
+ - Owner: `@jskit-ai/connector-google-calendar@0.2.30`
151
151
  - Read: [PATTERN.md](patterns/connectors/calendar-cli/PATTERN.md)
152
152
  - Examples: [example/](patterns/connectors/calendar-cli/example/)
153
153
  - Requires: `@jskit-ai/connector-google-calendar`, `@jskit-ai/connectors-core`, `@jskit-ai/database-runtime-mysql`
@@ -158,7 +158,7 @@ Compose the shared connector runtime for event delivery while leaving workflow c
158
158
 
159
159
  - Id: `connectors/event-delivery`
160
160
  - Keywords: `cli`, `connectors`, `events`, `files`, `inngest`, `integrations`, `workflows`
161
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
161
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
162
162
  - Read: [PATTERN.md](patterns/connectors/event-delivery/PATTERN.md)
163
163
  - Examples: [example/](patterns/connectors/event-delivery/example/)
164
164
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -169,7 +169,7 @@ Wire service-account grants, file storage, explicit message actions and public b
169
169
 
170
170
  - Id: `connectors/firebase-messaging`
171
171
  - Keywords: `cli`, `connectors`, `fcm`, `files`, `firebase`, `integrations`, `jwt`, `notifications`, `push`, `service-account`, `vapid`
172
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
172
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
173
173
  - Read: [PATTERN.md](patterns/connectors/firebase-messaging/PATTERN.md)
174
174
  - Examples: [example/](patterns/connectors/firebase-messaging/example/)
175
175
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -180,7 +180,7 @@ Compose reviewed Search campaigns with project-owned Google OAuth and portable s
180
180
 
181
181
  - Id: `connectors/google-ads-search`
182
182
  - Keywords: `ads`, `campaigns`, `cli`, `connectors`, `conversion`, `google`, `search`
183
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
183
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
184
184
  - Read: [PATTERN.md](patterns/connectors/google-ads-search/PATTERN.md)
185
185
  - Examples: [example/](patterns/connectors/google-ads-search/example/)
186
186
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -191,7 +191,7 @@ Compose provider consent, verification and encrypted file persistence from an ap
191
191
 
192
192
  - Id: `connectors/oauth-connection`
193
193
  - Keywords: `accounting`, `assistant permissions`, `books`, `cli`, `client credentials`, `connectors`, `consent`, `crm`, `databricks`, `developer token`, `fabric`, `files`, `gaql`, `google ads`, `graphql`, `integrations`, `linkedin`, `microsoft`, `oauth`, `powerpoint`, `salesforce`, `service principal`, `shopify`, `soql`, `staffing`, `tiktok`, `twitch`, `wave`, `word`, `wordpress`, `workday`, `xero`, `zoho`
194
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
194
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
195
195
  - Read: [PATTERN.md](patterns/connectors/oauth-connection/PATTERN.md)
196
196
  - Examples: [example/](patterns/connectors/oauth-connection/example/)
197
197
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -202,7 +202,7 @@ Compose a sequential catalogue batch and preserve partial success for applicatio
202
202
 
203
203
  - Id: `connectors/paddle-catalogue`
204
204
  - Keywords: `batch`, `paddle`, `payments`, `prices`, `products`
205
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
205
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
206
206
  - Read: [PATTERN.md](patterns/connectors/paddle-catalogue/PATTERN.md)
207
207
  - Examples: [example/](patterns/connectors/paddle-catalogue/example/)
208
208
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -213,7 +213,7 @@ Resolve a publishable image key deliberately and use the shared URL library in a
213
213
 
214
214
  - Id: `connectors/public-image`
215
215
  - Keywords: `cli`, `connectors`, `files`, `images`, `integrations`, `logo-dev`, `public-key`
216
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
216
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
217
217
  - Read: [PATTERN.md](patterns/connectors/public-image/PATTERN.md)
218
218
  - Examples: [example/](patterns/connectors/public-image/example/)
219
219
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -224,7 +224,7 @@ Compose file configuration, Redshift Data API operations and application query o
224
224
 
225
225
  - Id: `connectors/redshift-queries`
226
226
  - Keywords: `aws`, `cli`, `connectors`, `files`, `iam`, `provisioned`, `redshift`, `serverless`, `sql`, `warehouse`
227
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
227
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
228
228
  - Read: [PATTERN.md](patterns/connectors/redshift-queries/PATTERN.md)
229
229
  - Examples: [example/](patterns/connectors/redshift-queries/example/)
230
230
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -235,7 +235,7 @@ Use the shared scanner runtime from a CLI or a host worker with portable configu
235
235
 
236
236
  - Id: `connectors/source-scanning`
237
237
  - Keywords: `cancellation`, `cli`, `connectors`, `integrations`, `scanning`, `security`, `source`, `wiz`, `worker`
238
- - Owner: `@jskit-ai/connectors-catalog@0.2.29`
238
+ - Owner: `@jskit-ai/connectors-catalog@0.2.30`
239
239
  - Read: [PATTERN.md](patterns/connectors/source-scanning/PATTERN.md)
240
240
  - Examples: [example/](patterns/connectors/source-scanning/example/)
241
241
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -246,7 +246,7 @@ Add a protected administration surface, settings shell, and semantic navigation
246
246
 
247
247
  - Id: `console/console-surface`
248
248
  - Keywords: `admin`, `console`, `navigation`, `owner`, `placement`, `settings`, `surface`
249
- - Owner: `@jskit-ai/console-web@0.1.261`
249
+ - Owner: `@jskit-ai/console-web@0.1.262`
250
250
  - Read: [PATTERN.md](patterns/console/console-surface/PATTERN.md)
251
251
  - Examples: [example/](patterns/console/console-surface/example/)
252
252
  - Requires: `@jskit-ai/console-core`, `@jskit-ai/console-web`, `@jskit-ai/shell-web`
@@ -268,7 +268,7 @@ Build a complete application-owned CRUD server package from a migration, a table
268
268
 
269
269
  - Id: `crud/crud-feature-package`
270
270
  - Keywords: `actions`, `crud`, `database`, `defineCrudFeature`, `json-api`, `migration`, `owns`, `permissions`, `repository`, `routes`, `service`, `table resource`
271
- - Owner: `@jskit-ai/crud-core@0.2.29`
271
+ - Owner: `@jskit-ai/crud-core@0.2.30`
272
272
  - Read: [PATTERN.md](patterns/crud/crud-feature-package/PATTERN.md)
273
273
  - Examples: [example/](patterns/crud/crud-feature-package/example/)
274
274
  - Requires: `@jskit-ai/crud-core`, `@jskit-ai/resource-core`, `@jskit-ai/resource-crud-core`
@@ -279,7 +279,7 @@ Build a routed CRUD user interface as thin application pages over JSKIT's shared
279
279
 
280
280
  - Id: `crud/crud-screen-set`
281
281
  - Keywords: `actions`, `add`, `crud`, `delete`, `edit`, `filters`, `list`, `material`, `routes`, `view`, `vue`
282
- - Owner: `@jskit-ai/http-web@0.2.35`
282
+ - Owner: `@jskit-ai/http-web@0.2.36`
283
283
  - Read: [PATTERN.md](patterns/crud/crud-screen-set/PATTERN.md)
284
284
  - Examples: [example/](patterns/crud/crud-screen-set/example/)
285
285
  - Requires: `@jskit-ai/http-web`, `@jskit-ai/resource-core`, `@jskit-ai/resource-crud-core`
@@ -345,7 +345,7 @@ Compose application-owned Google Publisher Tag delivery with the generic rewarde
345
345
 
346
346
  - Id: `rewards/google-rewarded`
347
347
  - Keywords: `ads`, `google`, `publisher tag`, `rewarded`, `unlock`
348
- - Owner: `@jskit-ai/rewarded-web@0.2.39`
348
+ - Owner: `@jskit-ai/rewarded-web@0.2.40`
349
349
  - Read: [PATTERN.md](patterns/rewards/google-rewarded/PATTERN.md)
350
350
  - Examples: [example/](patterns/rewards/google-rewarded/example/)
351
351
  - Requires: `@jskit-ai/rewarded-web`
@@ -356,7 +356,7 @@ Define a server feature through explicit capabilities and first-class actions, a
356
356
 
357
357
  - Id: `server/feature-package`
358
358
  - Keywords: `actions`, `aggregate`, `feature`, `handle`, `orchestration`, `owns`, `package`, `provider`, `repository`, `routes`, `server`, `table resource`
359
- - Owner: `@jskit-ai/agent-docs@0.1.310`
359
+ - Owner: `@jskit-ai/agent-docs@0.1.311`
360
360
  - Read: [PATTERN.md](patterns/server/feature-package/PATTERN.md)
361
361
  - Examples: [example/](patterns/server/feature-package/example/)
362
362
  - Requires: `@jskit-ai/kernel`
@@ -389,7 +389,7 @@ Compose an account settings route and profile, preference, notification, and sig
389
389
 
390
390
  - Id: `users/account-settings`
391
391
  - Keywords: `account`, `link provider`, `notifications`, `oauth`, `preferences`, `profile`, `settings`, `sign-in methods`, `user`, `vue`
392
- - Owner: `@jskit-ai/users-web@0.2.44`
392
+ - Owner: `@jskit-ai/users-web@0.2.45`
393
393
  - Read: [PATTERN.md](patterns/users/account-settings/PATTERN.md)
394
394
  - Examples: [example/](patterns/users/account-settings/example/)
395
395
  - Requires: `@jskit-ai/shell-web`, `@jskit-ai/users-core`, `@jskit-ai/users-web`
@@ -400,7 +400,7 @@ Expose user administration and workspace-scoped member operations through app-ow
400
400
 
401
401
  - Id: `users/user-administration-server`
402
402
  - Keywords: `account`, `admin`, `member`, `repository`, `resource`, `routes`, `service`, `user`, `workspace`
403
- - Owner: `@jskit-ai/users-core@0.2.33`
403
+ - Owner: `@jskit-ai/users-core@0.2.34`
404
404
  - Read: [PATTERN.md](patterns/users/user-administration-server/PATTERN.md)
405
405
  - Examples: [example/](patterns/users/user-administration-server/example/)
406
406
  - Requires: `@jskit-ai/crud-core`, `@jskit-ai/users-core`
@@ -411,7 +411,7 @@ Configure roles, workspace access policy, invitations, and app-owned invitation
411
411
 
412
412
  - Id: `workspaces/workspace-server`
413
413
  - Keywords: `access`, `invite`, `membership`, `multitenancy`, `policy`, `role`, `tenancy`, `workspace`
414
- - Owner: `@jskit-ai/workspaces-core@0.2.33`
414
+ - Owner: `@jskit-ai/workspaces-core@0.2.34`
415
415
  - Read: [PATTERN.md](patterns/workspaces/workspace-server/PATTERN.md)
416
416
  - Examples: [example/](patterns/workspaces/workspace-server/example/)
417
417
  - Requires: `@jskit-ai/users-core`, `@jskit-ai/workspaces-core`
@@ -422,7 +422,7 @@ Compose workspace selection, invitation, member administration, settings, and re
422
422
 
423
423
  - Id: `workspaces/workspace-surfaces`
424
424
  - Keywords: `admin`, `invite`, `member`, `navigation`, `settings`, `surface`, `switcher`, `workspace`
425
- - Owner: `@jskit-ai/workspaces-web@0.2.44`
425
+ - Owner: `@jskit-ai/workspaces-web@0.2.45`
426
426
  - Read: [PATTERN.md](patterns/workspaces/workspace-surfaces/PATTERN.md)
427
427
  - Examples: [example/](patterns/workspaces/workspace-surfaces/example/)
428
428
  - Requires: `@jskit-ai/shell-web`, `@jskit-ai/workspaces-core`, `@jskit-ai/workspaces-web`
@@ -50,7 +50,7 @@
50
50
  },
51
51
  "devDependencies": {
52
52
  "@jskit-ai/config-eslint": "0.1.251",
53
- "@jskit-ai/jskit-catalog": "0.2.62",
53
+ "@jskit-ai/jskit-catalog": "0.2.63",
54
54
  "@playwright/test": "1.61.1",
55
55
  "@vitejs/plugin-vue": "^6.0.7",
56
56
  "eslint": "^10.8.0",
@@ -51,7 +51,7 @@
51
51
  },
52
52
  "devDependencies": {
53
53
  "@jskit-ai/config-eslint": "0.1.251",
54
- "@jskit-ai/jskit-catalog": "0.2.62",
54
+ "@jskit-ai/jskit-catalog": "0.2.63",
55
55
  "@playwright/test": "1.61.1",
56
56
  "@vitejs/plugin-vue": "^6.0.7",
57
57
  "eslint": "^10.8.0",
@@ -4,6 +4,6 @@
4
4
  "dependencies": {
5
5
  "@jskit-ai/database-runtime": "0.1.270",
6
6
  "@jskit-ai/database-runtime-mysql": "0.1.268",
7
- "@jskit-ai/oidc-issuer-core": "0.1.30"
7
+ "@jskit-ai/oidc-issuer-core": "0.1.31"
8
8
  }
9
9
  }
@@ -2,7 +2,7 @@
2
2
  "private": true,
3
3
  "type": "module",
4
4
  "dependencies": {
5
- "@jskit-ai/auth-provider-oidc-core": "0.2.34",
5
+ "@jskit-ai/auth-provider-oidc-core": "0.2.35",
6
6
  "@jskit-ai/auth-web": "0.2.32"
7
7
  }
8
8
  }
@@ -7,8 +7,8 @@
7
7
  "db:migrate:status": "knex --knexfile ./knexfile.js migrate:list"
8
8
  },
9
9
  "dependencies": {
10
- "@jskit-ai/connectors-core": "0.2.29",
11
- "@jskit-ai/connector-google-calendar": "0.2.29",
10
+ "@jskit-ai/connectors-core": "0.2.30",
11
+ "@jskit-ai/connector-google-calendar": "0.2.30",
12
12
  "@jskit-ai/database-runtime": "0.1.270",
13
13
  "@jskit-ai/database-runtime-mysql": "0.1.268",
14
14
  "knex": "^3.1.0"
@@ -9,7 +9,7 @@
9
9
  "./shared": "./src/shared/index.js"
10
10
  },
11
11
  "dependencies": {
12
- "@jskit-ai/crud-core": "0.2.29",
12
+ "@jskit-ai/crud-core": "0.2.30",
13
13
  "@jskit-ai/resource-core": "0.1.212",
14
14
  "@jskit-ai/resource-crud-core": "0.1.214"
15
15
  },
@@ -10,9 +10,9 @@
10
10
  "./shared": "./src/shared/index.js"
11
11
  },
12
12
  "dependencies": {
13
- "@jskit-ai/crud-core": "0.2.29",
13
+ "@jskit-ai/crud-core": "0.2.30",
14
14
  "@jskit-ai/resource-crud-core": "0.1.214",
15
- "@jskit-ai/users-core": "0.2.33"
15
+ "@jskit-ai/users-core": "0.2.34"
16
16
  },
17
17
  "jskit": {
18
18
  "kind": "runtime",
@@ -10,14 +10,14 @@
10
10
  "./shared": "./src/shared/index.js"
11
11
  },
12
12
  "dependencies": {
13
- "@jskit-ai/crud-core": "0.2.29",
13
+ "@jskit-ai/crud-core": "0.2.30",
14
14
  "@jskit-ai/resource-crud-core": "0.1.214",
15
- "@jskit-ai/users-core": "0.2.33",
16
- "@jskit-ai/workspaces-core": "0.2.33"
15
+ "@jskit-ai/users-core": "0.2.34",
16
+ "@jskit-ai/workspaces-core": "0.2.34"
17
17
  },
18
18
  "peerDependencies": {
19
19
  "@jskit-ai/kernel": "0.2.21",
20
- "@jskit-ai/resource-runtime": "0.2.26"
20
+ "@jskit-ai/resource-runtime": "0.2.27"
21
21
  },
22
22
  "jskit": {
23
23
  "kind": "runtime",
@@ -26,7 +26,11 @@ purpose: any host can set it. The host sets it; a request never chooses it.
26
26
  - The server logs once at startup whether it acts for real. A production server
27
27
  that simulates logs a warning.
28
28
  - Local-password emails (confirmation and password reset) with an installed
29
- sender are logged, not sent.
29
+ sender are logged, not sent: local auth uses its own simulated sender in
30
+ place of the application's, which never runs in a test copy. An application
31
+ that confirms new accounts at once while its email isn't set up uses
32
+ `auth.local.confirmation-mode`, which a test copy keeps (see
33
+ [Authentication](/guide/app-setup/authentication)).
30
34
  - Workspace invitations with a provided mailer are logged. The invitation
31
35
  answers `status: "simulated"`, and the inviter copies the link.
32
36
  - Accounts-hub email is logged, not sent.