@jskit-ai/agent-docs 0.1.205 → 0.1.206

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 (30) hide show
  1. package/guide/agent/app-setup/multi-homing.md +29 -0
  2. package/guide/agent/framework/crud-operations.md +89 -0
  3. package/package.json +1 -1
  4. package/patterns/feature-package/example/booking-engine/package.json +1 -1
  5. package/patterns/minimal-foundation/example/package.json +4 -4
  6. package/patterns/shell-foundation/example/package.json +5 -5
  7. package/patterns/shell-foundation/example/packages/main/package.json +1 -1
  8. package/reference/autogen/PATTERN_INDEX.md +35 -35
  9. package/reference/autogen/packages/workspaces-core.md +3 -3
  10. package/reference/autogen/packages/workspaces-web.md +11 -0
  11. package/skills/jskit/references/crud-operations.md +89 -0
  12. package/skills/jskit/references/multi-homing.md +29 -0
  13. package/skills/jskit/references/pattern-index.md +35 -35
  14. package/skills/jskit/references/patterns/app/minimal-foundation/example/package.json +4 -4
  15. package/skills/jskit/references/patterns/app/shell-foundation/example/package.json +5 -5
  16. package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/package.json +1 -1
  17. package/skills/jskit/references/patterns/auth/supabase-auth/example/package.json +1 -1
  18. package/skills/jskit/references/patterns/connectors/calendar-cli/example/package.json +4 -4
  19. package/skills/jskit/references/patterns/crud/crud-screen-set/PATTERN.md +15 -0
  20. package/skills/jskit/references/patterns/crud/crud-screen-set/example/books/BookEditPage.vue +1 -0
  21. package/skills/jskit/references/patterns/crud/crud-screen-set/example/books/BookNewPage.vue +1 -0
  22. package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/package.json +2 -2
  23. package/skills/jskit/references/patterns/database/mysql-application/example/package.json +1 -1
  24. package/skills/jskit/references/patterns/database/postgres-application/example/package.json +1 -1
  25. package/skills/jskit/references/patterns/realtime/realtime-application/example/package.json +2 -2
  26. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/package.json +1 -1
  27. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/package.json +2 -2
  28. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/package.json +3 -3
  29. package/skills/jskit/references/patterns/workspaces/workspace-server/PATTERN.md +20 -0
  30. package/skills/jskit/references/patterns/workspaces/workspace-server/example/config/roles.js +2 -0
@@ -39,6 +39,35 @@ before an operation discloses records or record existence.
39
39
  membership semantics exactly; do not synthesize memberships to compensate for
40
40
  a policy/runtime mismatch.
41
41
 
42
+ ## Role display labels
43
+
44
+ Set optional `label` strings in the existing `roleCatalog.roles` definitions,
45
+ usually exported by `config/roles.js` and composed into application config.
46
+ For example, the package-owned `workspaces/workspace-server` example labels
47
+ `admin` as **Administrator** and `member` as **Team member**. Any application
48
+ role id can have its own label.
49
+
50
+ Labels are trimmed; missing, blank or non-string labels use the previous
51
+ display fallback. Labels do not inherit. They survive catalogue creation,
52
+ cloning and descriptor listing, and the Members, Invitations and Workspace
53
+ Settings API response schemas preserve them. Descriptors have optional
54
+ `label`; pending/resolved invitation and workspace-list records have optional
55
+ `roleLabel` beside `roleSid`.
56
+
57
+ On **Members**, both the invitation **Role** selector and each member's role
58
+ selector display configured labels. Choose a label, enter the invite email
59
+ and select **Send invite**, or choose a member's new role. Requests and stored
60
+ memberships still use role ids. Reloading shows the selected role's label.
61
+ Pending invitation captions, workspace role captions and the default
62
+ invitation email use configured labels too. Custom email renderers receive
63
+ optional `roleLabel` in addition to `roleSid`.
64
+
65
+ Add labels without changing existing permissions, inheritance, assignability
66
+ or `workspace.defaultInviteRole`. This supports application-specific and
67
+ Training roles without renaming them. `owner` is never assignable. An
68
+ application whose default invitation role is `worker` keeps that default even
69
+ if its display label is **Member**. No database migration is needed.
70
+
42
71
  ## Transactional invitation participation
43
72
 
44
73
  Use `workspaces.core` to connect application records during the built-in
@@ -47,6 +47,95 @@ Add resource service methods with `decorateService`; expose commands such as
47
47
  services and hooks orchestrate. Use a transactional outbox for durable
48
48
  external work.
49
49
 
50
+ ## Choose ownership, API access and client access independently
51
+
52
+ These controls answer different questions:
53
+
54
+ | Control | Purpose | Public records | Owner-scoped records |
55
+ | --- | --- | --- | --- |
56
+ | Resource `autofilter` | Which rows belong to the request scope | `"public"`; no ownership column | `"user"`; real non-null `userId` column |
57
+ | Resource `apiAccess` | Who may call the API | `"public"` | `"authenticated"` |
58
+ | Feature `ownershipFilter` | Server route/action ownership scope | `"public"` | `"user"` |
59
+ | Client `access` | Whether to require bootstrap permissions | Default `"auto"` with no permission requirements | Default `"auto"`; declare permissions when required |
60
+
61
+ `access` accepts `auto`, `always`, or `never`, not `public`. With `auto`, a
62
+ screen with no permission requirements does not require a permissions bootstrap.
63
+ `always` does require it. Do not add authentication or workspace machinery to
64
+ compensate for an unnecessary `always` override. Server access and ownership
65
+ remain authoritative.
66
+
67
+ The Books source patterns demonstrate user ownership. For an intentionally
68
+ public create/list resource, use the same patterns with this resource contract:
69
+
70
+ ```js
71
+ const bookResource = defineCrudResource({
72
+ namespace: "books",
73
+ tableName: "books",
74
+ apiAccess: "public",
75
+ autofilter: "public",
76
+ crudOperations: ["list", "view", "create"],
77
+ schema: {
78
+ title: {
79
+ type: "string",
80
+ required: true,
81
+ minLength: 1,
82
+ maxLength: 255,
83
+ operations: {
84
+ output: { required: true },
85
+ create: { required: true }
86
+ }
87
+ }
88
+ }
89
+ });
90
+ ```
91
+
92
+ Import `defineCrudResource` from
93
+ `@jskit-ai/resource-crud-core/shared/crudResource`. Its app-owned migration
94
+ creates `books` with an integer primary key `id` and non-null `title`; omit
95
+ `userId` and its foreign key for this public variant. `list` requires `view`
96
+ in the shared resource contract, even when the UI has no detail page. A create
97
+ response uses the resource output contract. Keep operation names such as
98
+ `list`, `view` and `create`; do not invent output-operation aliases.
99
+
100
+ Bind `defineCrudJsonApiFeature()` with this resource, `ownershipFilter:
101
+ "public"`, `relativePath: "/books"` and the application's configured public
102
+ surface. Keep the existing package/provider and migration registration from
103
+ `crud/json-api-resource-package`.
104
+
105
+ For the list, keep `BookListPage.vue` thin: use `resourceNamespace: "books"`
106
+ in `useCrudListScreen()` on the configured public surface, remove unsupported
107
+ edit/delete actions and optional author/notes filters, and point **New** to
108
+ the create route. For the new page, use the title field only and set:
109
+
110
+ ```js
111
+ addEditOptions: {
112
+ apiSuffix: "/books",
113
+ ownershipFilter: "public",
114
+ queryKeyFactory: (surfaceId = "") => ["crud", "books", surfaceId, "new"],
115
+ readEnabled: false,
116
+ writeMethod: "POST",
117
+ listUrlTemplate: "/books"
118
+ },
119
+ saveSuccess: {
120
+ invalidateQueryKey: ["crud", "books"],
121
+ navigateToView: false,
122
+ listUrlTemplate: "/books"
123
+ }
124
+ ```
125
+
126
+ List/view screen wrappers derive request scope from the configured surface;
127
+ they do not expose an `ownershipFilter` option. Use a surface without workspace
128
+ route parameters for this public example. Form options and lower-level request
129
+ composables accept `ownershipFilter` explicitly.
130
+
131
+ New/Edit form runtimes require `queryKeyFactory` even with reads disabled.
132
+ For editing, include the reactive record id; for workspace-scoped resources,
133
+ include the route scope too. List/view screen wrappers derive standard keys
134
+ from `resourceNamespace`. Leave `access` at its default when no permissions
135
+ are declared. Verify create, list, blank-name rejection and reload persistence
136
+ without signing in for this public variant; owner-scoped variants additionally
137
+ need cross-owner denial tests.
138
+
50
139
  ## Record deletion
51
140
 
52
141
  Deletion requires an explicit shared `DELETE` operation and confirmation
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jskit-ai/agent-docs",
3
- "version": "0.1.205",
3
+ "version": "0.1.206",
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.233",
8
+ "@jskit-ai/kernel": "0.1.234",
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.233",
37
+ "@jskit-ai/kernel": "0.1.234",
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.43",
43
43
  "vue-router": "^5.3.1",
44
44
  "vuetify": "^4.1.2",
45
- "@jskit-ai/http-runtime": "0.1.231",
45
+ "@jskit-ai/http-runtime": "0.1.232",
46
46
  "@fastify/fast-json-stringify-compiler": "^5.1.0",
47
47
  "@vue/devtools-api": "^8.2.1"
48
48
  },
49
49
  "devDependencies": {
50
- "@jskit-ai/config-eslint": "0.1.230",
51
- "@jskit-ai/jskit-catalog": "0.1.258",
50
+ "@jskit-ai/config-eslint": "0.1.231",
51
+ "@jskit-ai/jskit-catalog": "0.1.259",
52
52
  "@playwright/test": "1.61.1",
53
53
  "@vitejs/plugin-vue": "^6.0.7",
54
54
  "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.233",
37
+ "@jskit-ai/kernel": "0.1.234",
38
38
  "@tanstack/vue-query": "^5.101.0",
39
39
  "fastify": "^5.8.5",
40
40
  "json-rest-schema": "^1.0.17",
@@ -42,15 +42,15 @@
42
42
  "vue": "^3.5.43",
43
43
  "vue-router": "^5.3.1",
44
44
  "vuetify": "^4.1.2",
45
- "@jskit-ai/http-runtime": "0.1.231",
45
+ "@jskit-ai/http-runtime": "0.1.232",
46
46
  "@mdi/js": "^7.4.47",
47
- "@jskit-ai/shell-web": "0.1.237",
47
+ "@jskit-ai/shell-web": "0.1.238",
48
48
  "@fastify/fast-json-stringify-compiler": "^5.1.0",
49
49
  "@vue/devtools-api": "^8.2.1"
50
50
  },
51
51
  "devDependencies": {
52
- "@jskit-ai/config-eslint": "0.1.230",
53
- "@jskit-ai/jskit-catalog": "0.1.258",
52
+ "@jskit-ai/config-eslint": "0.1.231",
53
+ "@jskit-ai/jskit-catalog": "0.1.259",
54
54
  "@playwright/test": "1.61.1",
55
55
  "@vitejs/plugin-vue": "^6.0.7",
56
56
  "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.233"
12
+ "@jskit-ai/kernel": "0.1.234"
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.205`
18
+ - Owner: `@jskit-ai/agent-docs@0.1.206`
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.205`
29
+ - Owner: `@jskit-ai/agent-docs@0.1.206`
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.204`
40
+ - Owner: `@jskit-ai/assistant-runtime@0.1.205`
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 @@ 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.233`
51
+ - Owner: `@jskit-ai/auth-web@0.1.234`
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.230`
62
+ - Owner: `@jskit-ai/auth-provider-supabase-core@0.1.231`
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 @@ Resolve an administrator environment key or an individual user's grant, then use
70
70
 
71
71
  - Id: `connectors/ai-connections`
72
72
  - Keywords: `ai`, `api-key`, `big-pickle`, `cli`, `environment`, `free`, `models`, `ownership`, `zai`, `zen`
73
- - Owner: `@jskit-ai/connectors-catalog@0.1.50`
73
+ - Owner: `@jskit-ai/connectors-catalog@0.1.51`
74
74
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/ai-connections/PATTERN.md)
75
75
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/ai-connections/example/)
76
76
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -81,7 +81,7 @@ Compose provider operations, authorization and encrypted file storage from a CLI
81
81
 
82
82
  - Id: `connectors/api-key-connection`
83
83
  - Keywords: `api-key`, `clay`, `cli`, `clickhouse`, `connectors`, `dbt`, `files`, `firecrawl`, `granola`, `integrations`, `metrics`, `prestashop`, `resend`, `semantic-layer`, `semrush`, `x-twitter`
84
- - Owner: `@jskit-ai/connectors-catalog@0.1.50`
84
+ - Owner: `@jskit-ai/connectors-catalog@0.1.51`
85
85
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/api-key-connection/PATTERN.md)
86
86
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/api-key-connection/example/)
87
87
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -92,7 +92,7 @@ Compose token-based MCP discovery and explicitly authorized tool calls using the
92
92
 
93
93
  - Id: `connectors/assistant-mcp`
94
94
  - Keywords: `assistant`, `cli`, `connectors`, `files`, `integrations`, `mcp`, `n8n`, `sanity`
95
- - Owner: `@jskit-ai/connectors-catalog@0.1.50`
95
+ - Owner: `@jskit-ai/connectors-catalog@0.1.51`
96
96
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/assistant-mcp/PATTERN.md)
97
97
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/assistant-mcp/example/)
98
98
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -103,7 +103,7 @@ Configure assistant OAuth clients, then compose existing state, encrypted file g
103
103
 
104
104
  - Id: `connectors/assistant-mcp-oauth`
105
105
  - Keywords: `amplitude`, `assistant`, `atlassian`, `canva`, `cli`, `client metadata`, `confidence`, `connectors`, `figma`, `files`, `granola`, `hex`, `mcp`, `miro`, `oauth`
106
- - Owner: `@jskit-ai/connectors-catalog@0.1.50`
106
+ - Owner: `@jskit-ai/connectors-catalog@0.1.51`
107
107
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/assistant-mcp-oauth/PATTERN.md)
108
108
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/assistant-mcp-oauth/example/)
109
109
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -114,7 +114,7 @@ Compose signed AWS operations, file configuration and application authorization
114
114
 
115
115
  - Id: `connectors/aws-storage-queries`
116
116
  - Keywords: `athena`, `aws`, `cli`, `connectors`, `files`, `iam`, `queries`, `s3`, `storage`, `sts`
117
- - Owner: `@jskit-ai/connectors-catalog@0.1.50`
117
+ - Owner: `@jskit-ai/connectors-catalog@0.1.51`
118
118
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/aws-storage-queries/PATTERN.md)
119
119
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/aws-storage-queries/example/)
120
120
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -125,7 +125,7 @@ Compose reusable connection libraries with portable configuration, application o
125
125
 
126
126
  - Id: `connectors/calendar-cli`
127
127
  - Keywords: `calendar`, `cli`, `connectors`, `google`, `integrations`, `oauth`, `permissions`
128
- - Owner: `@jskit-ai/connector-google-calendar@0.1.50`
128
+ - Owner: `@jskit-ai/connector-google-calendar@0.1.51`
129
129
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/calendar-cli/PATTERN.md)
130
130
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/calendar-cli/example/)
131
131
  - Requires: `@jskit-ai/connector-google-calendar`, `@jskit-ai/connectors-core`, `@jskit-ai/database-runtime-mysql`
@@ -136,7 +136,7 @@ Compose the shared connector runtime for event delivery while leaving workflow c
136
136
 
137
137
  - Id: `connectors/event-delivery`
138
138
  - Keywords: `cli`, `connectors`, `events`, `files`, `inngest`, `integrations`, `workflows`
139
- - Owner: `@jskit-ai/connectors-catalog@0.1.50`
139
+ - Owner: `@jskit-ai/connectors-catalog@0.1.51`
140
140
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/event-delivery/PATTERN.md)
141
141
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/event-delivery/example/)
142
142
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -147,7 +147,7 @@ Wire service-account grants, file storage, explicit message actions and public b
147
147
 
148
148
  - Id: `connectors/firebase-messaging`
149
149
  - Keywords: `cli`, `connectors`, `fcm`, `files`, `firebase`, `integrations`, `jwt`, `notifications`, `push`, `service-account`, `vapid`
150
- - Owner: `@jskit-ai/connectors-catalog@0.1.50`
150
+ - Owner: `@jskit-ai/connectors-catalog@0.1.51`
151
151
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/firebase-messaging/PATTERN.md)
152
152
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/firebase-messaging/example/)
153
153
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -158,7 +158,7 @@ Compose reviewed Search campaigns with project-owned Google OAuth and portable s
158
158
 
159
159
  - Id: `connectors/google-ads-search`
160
160
  - Keywords: `ads`, `campaigns`, `cli`, `connectors`, `conversion`, `google`, `search`
161
- - Owner: `@jskit-ai/connectors-catalog@0.1.50`
161
+ - Owner: `@jskit-ai/connectors-catalog@0.1.51`
162
162
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/google-ads-search/PATTERN.md)
163
163
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/google-ads-search/example/)
164
164
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -169,7 +169,7 @@ Compose provider consent, verification and encrypted file persistence from an ap
169
169
 
170
170
  - Id: `connectors/oauth-connection`
171
171
  - 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`
172
- - Owner: `@jskit-ai/connectors-catalog@0.1.50`
172
+ - Owner: `@jskit-ai/connectors-catalog@0.1.51`
173
173
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/oauth-connection/PATTERN.md)
174
174
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/oauth-connection/example/)
175
175
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -180,7 +180,7 @@ Compose a sequential catalogue batch and preserve partial success for applicatio
180
180
 
181
181
  - Id: `connectors/paddle-catalogue`
182
182
  - Keywords: `batch`, `paddle`, `payments`, `prices`, `products`
183
- - Owner: `@jskit-ai/connectors-catalog@0.1.50`
183
+ - Owner: `@jskit-ai/connectors-catalog@0.1.51`
184
184
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/paddle-catalogue/PATTERN.md)
185
185
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/paddle-catalogue/example/)
186
186
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -191,7 +191,7 @@ Resolve a publishable image key deliberately and use the shared URL library in a
191
191
 
192
192
  - Id: `connectors/public-image`
193
193
  - Keywords: `cli`, `connectors`, `files`, `images`, `integrations`, `logo-dev`, `public-key`
194
- - Owner: `@jskit-ai/connectors-catalog@0.1.50`
194
+ - Owner: `@jskit-ai/connectors-catalog@0.1.51`
195
195
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/public-image/PATTERN.md)
196
196
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/public-image/example/)
197
197
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -202,7 +202,7 @@ Compose file configuration, Redshift Data API operations and application query o
202
202
 
203
203
  - Id: `connectors/redshift-queries`
204
204
  - Keywords: `aws`, `cli`, `connectors`, `files`, `iam`, `provisioned`, `redshift`, `serverless`, `sql`, `warehouse`
205
- - Owner: `@jskit-ai/connectors-catalog@0.1.50`
205
+ - Owner: `@jskit-ai/connectors-catalog@0.1.51`
206
206
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/redshift-queries/PATTERN.md)
207
207
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/redshift-queries/example/)
208
208
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -213,7 +213,7 @@ Use the shared scanner runtime from a CLI or a host worker with portable configu
213
213
 
214
214
  - Id: `connectors/source-scanning`
215
215
  - Keywords: `cancellation`, `cli`, `connectors`, `integrations`, `scanning`, `security`, `source`, `wiz`, `worker`
216
- - Owner: `@jskit-ai/connectors-catalog@0.1.50`
216
+ - Owner: `@jskit-ai/connectors-catalog@0.1.51`
217
217
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/connectors/source-scanning/PATTERN.md)
218
218
  - Examples: [example/](../../skills/jskit/references/patterns/connectors/source-scanning/example/)
219
219
  - Requires: `@jskit-ai/connectors-catalog`, `@jskit-ai/connectors-core`
@@ -224,7 +224,7 @@ Add a protected administration surface, settings shell, and semantic navigation
224
224
 
225
225
  - Id: `console/console-surface`
226
226
  - Keywords: `admin`, `console`, `navigation`, `owner`, `placement`, `settings`, `surface`
227
- - Owner: `@jskit-ai/console-web@0.1.201`
227
+ - Owner: `@jskit-ai/console-web@0.1.202`
228
228
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/console/console-surface/PATTERN.md)
229
229
  - Examples: [example/](../../skills/jskit/references/patterns/console/console-surface/example/)
230
230
  - Requires: `@jskit-ai/console-core`, `@jskit-ai/console-web`, `@jskit-ai/shell-web`
@@ -235,7 +235,7 @@ Build a routed CRUD user interface as thin application pages over JSKIT's shared
235
235
 
236
236
  - Id: `crud/crud-screen-set`
237
237
  - Keywords: `actions`, `add`, `crud`, `delete`, `edit`, `filters`, `list`, `material`, `routes`, `view`, `vue`
238
- - Owner: `@jskit-ai/http-web@0.1.78`
238
+ - Owner: `@jskit-ai/http-web@0.1.79`
239
239
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/crud/crud-screen-set/PATTERN.md)
240
240
  - Examples: [example/](../../skills/jskit/references/patterns/crud/crud-screen-set/example/)
241
241
  - Requires: `@jskit-ai/http-web`, `@jskit-ai/resource-crud-core`
@@ -246,7 +246,7 @@ Build a complete application-owned CRUD server package from a migration, resourc
246
246
 
247
247
  - Id: `crud/json-api-resource-package`
248
248
  - Keywords: `actions`, `crud`, `database`, `json-api`, `migration`, `permissions`, `provider`, `repository`, `routes`, `service`
249
- - Owner: `@jskit-ai/crud-core@0.1.244`
249
+ - Owner: `@jskit-ai/crud-core@0.1.245`
250
250
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/crud/json-api-resource-package/PATTERN.md)
251
251
  - Examples: [example/](../../skills/jskit/references/patterns/crud/json-api-resource-package/example/)
252
252
  - Requires: `@jskit-ai/crud-core`, `@jskit-ai/resource-crud-core`
@@ -257,7 +257,7 @@ Define an authenticated application resource whose records belong to the current
257
257
 
258
258
  - Id: `crud/resource-contract`
259
259
  - Keywords: `authenticated`, `crud`, `database`, `owner-scoped`, `resource`, `user`
260
- - Owner: `@jskit-ai/resource-crud-core@0.1.175`
260
+ - Owner: `@jskit-ai/resource-crud-core@0.1.176`
261
261
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/crud/resource-contract/PATTERN.md)
262
262
  - Examples: [example/](../../skills/jskit/references/patterns/crud/resource-contract/example/)
263
263
  - Requires: `@jskit-ai/resource-crud-core`
@@ -268,7 +268,7 @@ Configure a JSKIT application for MySQL with a fixed driver, ordinary environmen
268
268
 
269
269
  - Id: `database/mysql-application`
270
270
  - Keywords: `database`, `knex`, `mariadb`, `migrations`, `mysql`, `mysql2`
271
- - Owner: `@jskit-ai/database-runtime-mysql@0.1.231`
271
+ - Owner: `@jskit-ai/database-runtime-mysql@0.1.232`
272
272
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/database/mysql-application/PATTERN.md)
273
273
  - Examples: [example/](../../skills/jskit/references/patterns/database/mysql-application/example/)
274
274
  - Requires: `@jskit-ai/database-runtime-mysql`
@@ -279,7 +279,7 @@ Configure a JSKIT application for PostgreSQL with a fixed driver, ordinary envir
279
279
 
280
280
  - Id: `database/postgres-application`
281
281
  - Keywords: `database`, `knex`, `migrations`, `pg`, `postgres`, `postgresql`
282
- - Owner: `@jskit-ai/database-runtime-postgres@0.1.230`
282
+ - Owner: `@jskit-ai/database-runtime-postgres@0.1.231`
283
283
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/database/postgres-application/PATTERN.md)
284
284
  - Examples: [example/](../../skills/jskit/references/patterns/database/postgres-application/example/)
285
285
  - Requires: `@jskit-ai/database-runtime-postgres`
@@ -290,7 +290,7 @@ Wrap a JSKIT web application in a Capacitor Android shell using native Capacitor
290
290
 
291
291
  - Id: `mobile/android-application`
292
292
  - Keywords: `android`, `capacitor`, `device`, `mobile`, `native`, `shell`, `webview`
293
- - Owner: `@jskit-ai/mobile-capacitor@0.1.168`
293
+ - Owner: `@jskit-ai/mobile-capacitor@0.1.169`
294
294
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/mobile/android-application/PATTERN.md)
295
295
  - Examples: [example/](../../skills/jskit/references/patterns/mobile/android-application/example/)
296
296
  - Requires: `@capacitor/android`, `@capacitor/app`, `@capacitor/cli`, `@jskit-ai/mobile-capacitor`
@@ -301,7 +301,7 @@ Add JSKIT realtime events with an optional Redis backplane and an explicit shell
301
301
 
302
302
  - Id: `realtime/realtime-application`
303
303
  - Keywords: `realtime`, `redis`, `socket.io`, `sockets`, `status`, `websocket`
304
- - Owner: `@jskit-ai/realtime@0.1.230`
304
+ - Owner: `@jskit-ai/realtime@0.1.231`
305
305
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/realtime/realtime-application/PATTERN.md)
306
306
  - Examples: [example/](../../skills/jskit/references/patterns/realtime/realtime-application/example/)
307
307
  - Requires: `@jskit-ai/realtime`, `@jskit-ai/shell-web`
@@ -312,7 +312,7 @@ Compose application-owned Google Publisher Tag delivery with the generic rewarde
312
312
 
313
313
  - Id: `rewards/google-rewarded`
314
314
  - Keywords: `ads`, `google`, `publisher tag`, `rewarded`, `unlock`
315
- - Owner: `@jskit-ai/rewarded-web@0.1.169`
315
+ - Owner: `@jskit-ai/rewarded-web@0.1.170`
316
316
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/rewards/google-rewarded/PATTERN.md)
317
317
  - Examples: [example/](../../skills/jskit/references/patterns/rewards/google-rewarded/example/)
318
318
  - Requires: `@jskit-ai/rewarded-web`
@@ -323,7 +323,7 @@ Define a server feature through explicit capabilities and first-class actions, a
323
323
 
324
324
  - Id: `server/feature-package`
325
325
  - Keywords: `actions`, `feature`, `json-rest`, `knex`, `orchestration`, `package`, `provider`, `repository`, `routes`, `server`
326
- - Owner: `@jskit-ai/agent-docs@0.1.205`
326
+ - Owner: `@jskit-ai/agent-docs@0.1.206`
327
327
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/server/feature-package/PATTERN.md)
328
328
  - Examples: [example/](../../skills/jskit/references/patterns/server/feature-package/example/)
329
329
  - Requires: `@jskit-ai/kernel`
@@ -334,7 +334,7 @@ Compose the JSKIT responsive shell, semantic placements, settings navigation, an
334
334
 
335
335
  - Id: `shell/application-shell`
336
336
  - Keywords: `adaptive`, `app`, `layout`, `navigation`, `placement`, `responsive`, `settings`, `shell`
337
- - Owner: `@jskit-ai/shell-web@0.1.237`
337
+ - Owner: `@jskit-ai/shell-web@0.1.238`
338
338
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/shell/application-shell/PATTERN.md)
339
339
  - Examples: [example/](../../skills/jskit/references/patterns/shell/application-shell/example/)
340
340
  - Requires: `@jskit-ai/kernel`, `@jskit-ai/shell-web`
@@ -345,7 +345,7 @@ Add product routes and shell extensions through file routing, semantic placement
345
345
 
346
346
  - Id: `ui/page-and-placement`
347
347
  - Keywords: `component`, `navigation`, `outlet`, `page`, `placement`, `routes`, `section`, `shell`, `subpages`, `vue`
348
- - Owner: `@jskit-ai/shell-web@0.1.237`
348
+ - Owner: `@jskit-ai/shell-web@0.1.238`
349
349
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/ui/page-and-placement/PATTERN.md)
350
350
  - Examples: [example/](../../skills/jskit/references/patterns/ui/page-and-placement/example/)
351
351
  - Requires: `@jskit-ai/kernel`, `@jskit-ai/shell-web`
@@ -356,7 +356,7 @@ Compose an account settings route and profile, preference, and notification sect
356
356
 
357
357
  - Id: `users/account-settings`
358
358
  - Keywords: `account`, `notifications`, `preferences`, `profile`, `settings`, `user`, `vue`
359
- - Owner: `@jskit-ai/users-web@0.1.251`
359
+ - Owner: `@jskit-ai/users-web@0.1.252`
360
360
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/users/account-settings/PATTERN.md)
361
361
  - Examples: [example/](../../skills/jskit/references/patterns/users/account-settings/example/)
362
362
  - Requires: `@jskit-ai/shell-web`, `@jskit-ai/users-core`, `@jskit-ai/users-web`
@@ -367,7 +367,7 @@ Expose user administration and workspace-scoped member operations through app-ow
367
367
 
368
368
  - Id: `users/user-administration-server`
369
369
  - Keywords: `account`, `admin`, `member`, `repository`, `resource`, `routes`, `service`, `user`, `workspace`
370
- - Owner: `@jskit-ai/users-core@0.1.246`
370
+ - Owner: `@jskit-ai/users-core@0.1.247`
371
371
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/users/user-administration-server/PATTERN.md)
372
372
  - Examples: [example/](../../skills/jskit/references/patterns/users/user-administration-server/example/)
373
373
  - Requires: `@jskit-ai/crud-core`, `@jskit-ai/users-core`
@@ -378,7 +378,7 @@ Configure roles, workspace access policy, invitations, and app-owned invitation
378
378
 
379
379
  - Id: `workspaces/workspace-server`
380
380
  - Keywords: `access`, `invite`, `membership`, `multitenancy`, `policy`, `role`, `tenancy`, `workspace`
381
- - Owner: `@jskit-ai/workspaces-core@0.1.211`
381
+ - Owner: `@jskit-ai/workspaces-core@0.1.212`
382
382
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/workspaces/workspace-server/PATTERN.md)
383
383
  - Examples: [example/](../../skills/jskit/references/patterns/workspaces/workspace-server/example/)
384
384
  - Requires: `@jskit-ai/users-core`, `@jskit-ai/workspaces-core`
@@ -389,7 +389,7 @@ Compose workspace selection, invitation, member administration, settings, and re
389
389
 
390
390
  - Id: `workspaces/workspace-surfaces`
391
391
  - Keywords: `admin`, `invite`, `member`, `navigation`, `settings`, `surface`, `switcher`, `workspace`
392
- - Owner: `@jskit-ai/workspaces-web@0.1.212`
392
+ - Owner: `@jskit-ai/workspaces-web@0.1.213`
393
393
  - Read: [PATTERN.md](../../skills/jskit/references/patterns/workspaces/workspace-surfaces/PATTERN.md)
394
394
  - Examples: [example/](../../skills/jskit/references/patterns/workspaces/workspace-surfaces/example/)
395
395
  - Requires: `@jskit-ai/shell-web`, `@jskit-ai/workspaces-core`, `@jskit-ai/workspaces-web`
@@ -34,7 +34,7 @@ Local functions
34
34
  Exports
35
35
  - `mapMembershipSummary(membership, workspace)`
36
36
  - `mapWorkspaceSettingsPublic(workspaceSettings, { workspaceInvitationsEnabled = true } = {})`
37
- - `mapWorkspaceSummary(workspace, membership)`
37
+ - `mapWorkspaceSummary(workspace, membership, roleCatalog = null)`
38
38
 
39
39
  ### `src/server/common/repositories/repositoryUtils.js`
40
40
  Exports
@@ -172,7 +172,7 @@ Local functions
172
172
 
173
173
  ### `src/server/workspaceMembers/defaultWorkspaceInviteEmail.js`
174
174
  Exports
175
- - `renderDefaultWorkspaceInviteEmail({ inviteUrl = "", workspace = {}, inviter = null, roleSid = "member", expiresAt = "" } = {})`
175
+ - `renderDefaultWorkspaceInviteEmail({ inviteUrl = "", workspace = {}, inviter = null, roleSid = "member", roleLabel = "", expiresAt = "" } = {})`
176
176
  Local functions
177
177
  - `escapeHtml(value = "")`
178
178
 
@@ -207,7 +207,7 @@ Exports
207
207
 
208
208
  ### `src/server/workspacePendingInvitations/workspacePendingInvitationsService.js`
209
209
  Exports
210
- - `createService({ workspaceInvitesRepository, workspaceMembershipsRepository } = {})`
210
+ - `createService({ workspaceInvitesRepository, workspaceMembershipsRepository, roleCatalog = null } = {})`
211
211
 
212
212
  ### `src/server/workspaceSettings/bootWorkspaceSettings.js`
213
213
  Exports
@@ -32,6 +32,7 @@ Exports
32
32
  Exports
33
33
  - None
34
34
  Local functions
35
+ - `formatRole(roleSid, fallback = roleSid)`
35
36
  - `formatDateTime(value)`
36
37
  - `showOwnerChip(member)`
37
38
  - `isMemberRoleLocked(member)`
@@ -299,6 +300,16 @@ Exports
299
300
  Exports
300
301
  - `ADMIN_COG_OUTLET`
301
302
 
303
+ ### fixtures
304
+
305
+ ### `fixtures/role-labels/main.js`
306
+ Exports
307
+ - None
308
+
309
+ ### `fixtures/role-labels/vite.config.mjs`
310
+ Exports
311
+ - None
312
+
302
313
  ### patterns
303
314
 
304
315
  ### `patterns/workspace-surfaces/example/packages/main/src/client/components/AccountPendingInvitesCue.vue`