@jskit-ai/agent-docs 0.1.15 → 0.1.17

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 (35) hide show
  1. package/guide/agent/app-extras/assistant.md +2 -2
  2. package/guide/agent/app-setup/initial-scaffolding.md +1 -3
  3. package/guide/agent/app-setup/multi-homing.md +21 -0
  4. package/guide/agent/generators/advanced-cruds.md +208 -110
  5. package/guide/agent/generators/crud-generators.md +4 -0
  6. package/guide/agent/index.md +1 -1
  7. package/package.json +1 -1
  8. package/patterns/INDEX.md +1 -1
  9. package/patterns/client-requests.md +3 -0
  10. package/patterns/crud-repository-mapping.md +45 -23
  11. package/patterns/filters.md +8 -8
  12. package/reference/autogen/KERNEL_MAP.md +94 -40
  13. package/reference/autogen/README.md +3 -0
  14. package/reference/autogen/packages/assistant-core.md +0 -12
  15. package/reference/autogen/packages/assistant-runtime.md +11 -3
  16. package/reference/autogen/packages/auth-core.md +34 -23
  17. package/reference/autogen/packages/auth-provider-supabase-core.md +4 -7
  18. package/reference/autogen/packages/auth-web.md +3 -0
  19. package/reference/autogen/packages/console-core.md +6 -29
  20. package/reference/autogen/packages/crud-core.md +35 -28
  21. package/reference/autogen/packages/crud-server-generator.md +28 -50
  22. package/reference/autogen/packages/crud-ui-generator.md +12 -7
  23. package/reference/autogen/packages/http-runtime.md +171 -21
  24. package/reference/autogen/packages/json-rest-api-core.md +54 -0
  25. package/reference/autogen/packages/kernel.md +118 -55
  26. package/reference/autogen/packages/realtime.md +1 -0
  27. package/reference/autogen/packages/resource-core.md +35 -0
  28. package/reference/autogen/packages/resource-crud-core.md +51 -0
  29. package/reference/autogen/packages/shell-web.md +31 -0
  30. package/reference/autogen/packages/users-core.md +34 -77
  31. package/reference/autogen/packages/users-web.md +29 -20
  32. package/reference/autogen/packages/workspaces-core.md +44 -76
  33. package/reference/autogen/packages/workspaces-web.md +1 -3
  34. package/reference/autogen/tooling/jskit-cli.md +5 -4
  35. package/workflow/feature-delivery.md +2 -1
@@ -112,7 +112,7 @@ Exports
112
112
  - `accountSettingsResponseFormatter({ profile, settings, securityStatus, authService })`
113
113
  Local functions
114
114
  - `resolveAuthProfileSettings(authService)`
115
- - `formatUserSettingsSection(section, settings = {})`
115
+ - `formatUserSettingsSection(fieldKeys, settings = {})`
116
116
 
117
117
  ### `src/server/common/registerCommonRepositories.js`
118
118
  Exports
@@ -140,35 +140,26 @@ Exports
140
140
 
141
141
  ### `src/server/common/repositories/userProfilesRepository.js`
142
142
  Exports
143
- - `createRepository(knex)`
143
+ - `createRepository({ api, knex } = {})`
144
144
  Local functions
145
- - `normalizeProfileRecord(payload)`
146
- - `normalizeCreatePayload(payload = {})`
147
145
  - `normalizeUsername(value)`
146
+ - `normalizeNullableString(value)`
147
+ - `normalizeNullableVersion(value)`
148
+ - `normalizeProfileRecord(payload = null)`
149
+ - `normalizeCreatePayload(payload = {})`
148
150
  - `usernameBaseFromEmail(email)`
149
151
  - `buildUsernameCandidate(baseUsername, suffix)`
150
152
  - `duplicateTargetsEmail(error)`
151
153
  - `duplicateTargetsUsername(error)`
152
154
  - `createDuplicateEmailConflictError()`
153
- - `resolveUniqueUsername(client, baseUsername, { excludeUserId = null } = {})`
155
+ - `resolveUniqueUsername(api, baseUsername, { excludeUserId = null, transaction = null } = {})`
154
156
 
155
157
  ### `src/server/common/repositories/userSettingsRepository.js`
156
158
  Exports
157
- - `createRepository(knex)`
158
- - `mapRow(row)`
159
+ - `createRepository({ api, knex } = {})`
159
160
  Local functions
160
- - `normalizeBoolean(value, fallback = false)`
161
- - `createInsertPayload(userId)`
162
-
163
- ### `src/server/common/resources/userProfilesResource.js`
164
- Exports
165
- - `resource`
166
- Local functions
167
- - `normalizeUsername(value)`
168
- - `normalizeNullableString(value)`
169
- - `normalizeNullableVersion(value)`
170
- - `normalizeProfileRecord(payload = {})`
171
- - `normalizeCreatePayload(payload = {})`
161
+ - `pickPatchFields(source = {})`
162
+ - `createDefaultUserSettingsCreatePayload(userId)`
172
163
 
173
164
  ### `src/server/common/services/accountContextService.js`
174
165
  Exports
@@ -185,6 +176,10 @@ Local functions
185
176
  - `requireSynchronizedProfile(profile)`
186
177
  - `normalizeLifecycleContributors(entries = [])`
187
178
 
179
+ ### `src/server/common/support/accountSettingsJsonApiTransport.js`
180
+ Exports
181
+ - `resolveAccountSettingsResourceId(_record, context = {})`
182
+
188
183
  ### `src/server/common/support/deepFreeze.js`
189
184
  Exports
190
185
  - `deepFreeze`
@@ -203,12 +198,6 @@ Local functions
203
198
  Exports
204
199
  - `resolveActionUser(context, input)`
205
200
 
206
- ### `src/server/common/validators/authenticatedUserValidator.js`
207
- Exports
208
- - `authenticatedUserValidator`
209
- Local functions
210
- - `normalizeAuthenticatedUser(input = {})`
211
-
212
201
  ### `src/server/profileSyncLifecycleContributorRegistry.js`
213
202
  Exports
214
203
  - `PROFILE_SYNC_LIFECYCLE_CONTRIBUTOR_TAG`
@@ -230,7 +219,7 @@ Exports
230
219
  - `createUsersBootstrapContributor({ userProfilesRepository, userSettingsRepository, appConfig = {}, authService } = {})`
231
220
  Local functions
232
221
  - `getOAuthProviderCatalogPayload(authService)`
233
- - `normalizeBoolean(value, fallback)`
222
+ - `resolveBooleanConfigValue(value, fallback)`
234
223
  - `resolveAppState(appConfig = {})`
235
224
  - `createAnonymousBootstrapPayload({ appState, surfaceAccess = {} })`
236
225
  - `mapUserSettingsBootstrap(settings = {})`
@@ -248,40 +237,31 @@ Exports
248
237
  Exports
249
238
  - `createOperationMessages({ validationMessage = "Validation failed.", apiValidationMessage = validationMessage } = {})`
250
239
 
251
- ### `src/shared/resources/resolveGlobalArrayRegistry.js`
240
+ ### `src/shared/resources/accountSettingsSchemas.js`
252
241
  Exports
253
- - `resolveGlobalArrayRegistry(symbolKey)`
242
+ - `accountAvatarOutputSchema`
243
+ - `userProfileOutputSchema`
244
+ - `accountSecurityStatusSchema`
254
245
 
255
246
  ### `src/shared/resources/userProfileResource.js`
256
247
  Exports
257
248
  - `userProfileResource`
258
249
  Local functions
259
- - `normalizeProfileInput(payload = {})`
260
-
261
- ### `src/shared/resources/userSettingsFields.js`
262
- Exports
263
- - `USER_SETTINGS_SECTIONS`
264
- - `defineField(field = {})`
265
- - `resetUserSettingsFields()`
266
- - `userSettingsFields`
250
+ - `normalizeUsername(value)`
251
+ - `normalizeNullableString(value)`
252
+ - `normalizeNullableVersion(value)`
267
253
 
268
254
  ### `src/shared/resources/userSettingsResource.js`
269
255
  Exports
256
+ - `USER_SETTINGS_ALL_KEYS`
257
+ - `USER_SETTINGS_BOOTSTRAP_KEYS`
258
+ - `USER_SETTINGS_NOTIFICATION_KEYS`
259
+ - `USER_SETTINGS_PREFERENCE_KEYS`
260
+ - `userSettingsOutputSchema`
261
+ - `userSettingsOutputValidator`
270
262
  - `userSettingsResource`
271
263
  Local functions
272
- - `pickPatchBody(schema, keys = [])`
273
- - `listFieldsBySection(section)`
274
- - `buildCreateBodySchema()`
275
- - `buildSectionOutputSchema(section)`
276
- - `normalizeInput(payload = {})`
277
- - `normalizeSectionOutput(section, sectionSource = {}, settings = {})`
278
- - `buildUserSettingsOutputSchema()`
279
- - `buildUserSettingsCreateBodySchema()`
280
- - `buildUserSettingsPatchBodySchema()`
281
- - `buildPreferencesUpdateBodySchema()`
282
- - `buildNotificationsUpdateBodySchema()`
283
- - `normalizeOAuthProviderParams(payload = {})`
284
- - `normalizeOAuthProviderQuery(payload = {})`
264
+ - `normalizePositiveInteger(value)`
285
265
 
286
266
  ### `src/shared/settings.js`
287
267
  Exports
@@ -302,21 +282,13 @@ Local functions
302
282
  - `buildUsernameCandidate(baseUsername, suffix)`
303
283
  - `resolveUniqueUsername(baseUsername, usedUsernames)`
304
284
 
305
- ### `templates/packages/main/src/shared/resources/userSettingsFields.js`
306
- Exports
307
- - None
308
- Local functions
309
- - `normalizePositiveInteger(value, fallback)`
310
-
311
285
  ### `templates/packages/users-workspace/package.descriptor.mjs`
312
286
  Exports
313
287
  - None
314
288
 
315
289
  ### `templates/packages/users-workspace/src/server/actions.js`
316
290
  Exports
317
- - `createActions({ surface = "" } = {})`
318
- Local functions
319
- - `requireActionSurface(surface = "")`
291
+ - `createActions({ surface } = {})`
320
292
 
321
293
  ### `templates/packages/users-workspace/src/server/registerRoutes.js`
322
294
  Exports
@@ -332,19 +304,9 @@ Local functions
332
304
  Exports
333
305
  - None
334
306
 
335
- ### `templates/packages/users/src/server/actionIds.js`
336
- Exports
337
- - `actionIds`
338
-
339
307
  ### `templates/packages/users/src/server/actions.js`
340
308
  Exports
341
- - `createActions({ surface = "" } = {})`
342
- Local functions
343
- - `requireActionSurface(surface = "")`
344
-
345
- ### `templates/packages/users/src/server/listConfig.js`
346
- Exports
347
- - `LIST_CONFIG`
309
+ - `createActions({ surface } = {})`
348
310
 
349
311
  ### `templates/packages/users/src/server/registerRoutes.js`
350
312
  Exports
@@ -352,12 +314,13 @@ Exports
352
314
 
353
315
  ### `templates/packages/users/src/server/repository.js`
354
316
  Exports
355
- - `createRepository(knex, options = {})`
317
+ - `createRepository({ api, knex } = {})`
356
318
 
357
319
  ### `templates/packages/users/src/server/service.js`
358
320
  Exports
359
321
  - `createService({ usersRepository } = {})`
360
- - `serviceEvents`
322
+ Local functions
323
+ - `return404IfNotFound(document = null)`
361
324
 
362
325
  ### `templates/packages/users/src/server/UsersProvider.js`
363
326
  Exports
@@ -378,9 +341,3 @@ Exports
378
341
  ### `package.descriptor.mjs`
379
342
  Exports
380
343
  - None
381
-
382
- ### test-support
383
-
384
- ### `test-support/registerDefaultSettingsFields.js`
385
- Exports
386
- - None
@@ -24,6 +24,11 @@ Exports
24
24
  - `sortAccountSettingsSections(entries = [])`
25
25
  - `useAccountSettingsSections()`
26
26
 
27
+ ### `src/client/bootstrap/user-bootstrap-handler.js`
28
+ Exports
29
+ - `createUsersBootstrapUserHandler()`
30
+ - `registerUsersBootstrapPayloadHandlers(app)`
31
+
27
32
  ### `src/client/components/ProfileClientElement.vue`
28
33
  Exports
29
34
  - None
@@ -98,7 +103,6 @@ Exports
98
103
  - `resolveCrudRouteBoundFieldValues(fields = [], routeParams = {})`
99
104
  - `applyCrudRouteBoundFieldValues(fields = [], target = {}, routeParams = {})`
100
105
  - `resolveCrudFieldErrors(fieldErrors = {}, fieldKey = "")`
101
- - `parseCrudResourceOperationInput({ resource = null, operationName = "", rawPayload = {}, context = {} } = {})`
102
106
  Local functions
103
107
  - `resolveStableFieldErrorList(fieldKey, message)`
104
108
  - `resolveFormFieldType(field = {})`
@@ -144,11 +148,11 @@ Local functions
144
148
 
145
149
  ### `src/client/composables/records/useAddEdit.js`
146
150
  Exports
147
- - `useAddEdit({ ownershipFilter = ROUTE_VISIBILITY_WORKSPACE, surfaceId = "", access = "auto", resource = null, apiSuffix = "", queryKeyFactory = null, viewPermissions = [], savePermissions = [], readMethod = "GET", readEnabled = true, writeMethod = "PATCH", placementSource = "users-web.add-edit", fallbackLoadError = "Unable to load resource.", fallbackSaveError = "Unable to save resource.", fieldErrorKeys = [], clearOnRouteChange = true, model, parseInput, mapLoadedToModel, buildRawPayload, buildSavePayload, onSaveSuccess, recordIdParam = "recordId", routeParams = null, routeRecordId = null, apiUrlTemplate = "", viewUrlTemplate = "", listUrlTemplate = "", saveRecordIdSelector = null, messages = {}, realtime = null, adapter = null } = {})`
151
+ - `useAddEdit({ ownershipFilter = ROUTE_VISIBILITY_WORKSPACE, surfaceId = "", access = "auto", resource = null, apiSuffix = "", queryKeyFactory = null, viewPermissions = [], savePermissions = [], readMethod = "GET", readEnabled = true, writeMethod = "PATCH", transport = null, placementSource = "users-web.add-edit", fallbackLoadError = "Unable to load resource.", fallbackSaveError = "Unable to save resource.", fieldErrorKeys = [], clearOnRouteChange = true, model, input, mapLoadedToModel, buildRawPayload, buildSavePayload, onSaveSuccess, requestQueryParams = null, recordIdParam = "recordId", routeParams = null, routeRecordId = null, apiUrlTemplate = "", viewUrlTemplate = "", listUrlTemplate = "", saveRecordIdSelector = null, messages = {}, realtime = null, adapter = null } = {})`
148
152
 
149
153
  ### `src/client/composables/records/useCrudAddEdit.js`
150
154
  Exports
151
- - `useCrudAddEdit({ resource = null, operationName = "", formFields = [], addEditOptions = {}, saveSuccess = {}, fieldBinding = null, createModel = null, buildPayload = null, mapPayloadToModel = null, parseInput = null } = {})`
155
+ - `useCrudAddEdit({ resource = null, operationName = "", formFields = [], addEditOptions = {}, saveSuccess = {}, fieldBinding = null, createModel = null, buildPayload = null, mapPayloadToModel = null, input = null } = {})`
152
156
  Local functions
153
157
  - `normalizeFieldErrorKeys(keys = [])`
154
158
  - `normalizeSaveSuccessOptions(options = {})`
@@ -166,11 +170,11 @@ Exports
166
170
 
167
171
  ### `src/client/composables/records/useList.js`
168
172
  Exports
169
- - `useList({ ownershipFilter = ROUTE_VISIBILITY_WORKSPACE, surfaceId = "", access = "auto", apiSuffix = "", queryKeyFactory = null, viewPermissions = [], readEnabled = true, placementSource = "users-web.list", fallbackLoadError = "Unable to load list.", initialPageParam = null, getNextPageParam, selectItems, requestOptions, queryOptions, realtime = null, adapter = null, recordIdParam = "recordId", recordIdSelector = null, viewUrlTemplate = "", editUrlTemplate = "", search = null, queryParams = null, requestQueryParams = null, syncToRoute = false } = {})`
173
+ - `useList({ ownershipFilter = ROUTE_VISIBILITY_WORKSPACE, surfaceId = "", access = "auto", apiSuffix = "", queryKeyFactory = null, viewPermissions = [], readEnabled = true, placementSource = "users-web.list", fallbackLoadError = "Unable to load list.", initialPageParam = null, getNextPageParam, selectItems, transport = null, requestOptions, queryOptions, realtime = null, adapter = null, recordIdParam = "recordId", recordIdSelector = null, viewUrlTemplate = "", editUrlTemplate = "", search = null, queryParams = null, requestQueryParams = null, syncToRoute = false } = {})`
170
174
 
171
175
  ### `src/client/composables/records/useView.js`
172
176
  Exports
173
- - `useView({ ownershipFilter = ROUTE_VISIBILITY_WORKSPACE, surfaceId = "", access = "auto", apiSuffix = "", queryKeyFactory = null, viewPermissions = [], readMethod = "GET", readEnabled = true, placementSource = "users-web.view", fallbackLoadError = "Unable to load resource.", notFoundStatuses = [404], notFoundMessage = "Record not found.", model, mapLoadedToModel, requestQueryParams = null, recordIdParam = "recordId", routeParams = null, routeRecordId = null, apiUrlTemplate = "", listUrlTemplate = "", editUrlTemplate = "", includeRecordIdInQueryKey = false, realtime = null, adapter = null } = {})`
177
+ - `useView({ ownershipFilter = ROUTE_VISIBILITY_WORKSPACE, surfaceId = "", access = "auto", apiSuffix = "", queryKeyFactory = null, viewPermissions = [], readMethod = "GET", readEnabled = true, transport = null, placementSource = "users-web.view", fallbackLoadError = "Unable to load resource.", notFoundStatuses = [404], notFoundMessage = "Record not found.", model, mapLoadedToModel, requestQueryParams = null, recordIdParam = "recordId", routeParams = null, routeRecordId = null, apiUrlTemplate = "", listUrlTemplate = "", editUrlTemplate = "", includeRecordIdInQueryKey = false, realtime = null, adapter = null } = {})`
174
178
 
175
179
  ### `src/client/composables/runtime/addEditUiRuntime.js`
176
180
  Exports
@@ -208,19 +212,23 @@ Local functions
208
212
 
209
213
  ### `src/client/composables/runtime/operationValidationHelpers.js`
210
214
  Exports
211
- - `validateOperationInput({ parseInput, rawPayload = {}, context = {}, fieldBag = null, feedback = null, validationMessage = "Validation failed." } = {})`
215
+ - `validateOperationInput({ input, rawPayload = {}, fieldBag = null, feedback = null, validationMessage = "Validation failed." } = {})`
212
216
 
213
217
  ### `src/client/composables/runtime/useAddEditCore.js`
214
218
  Exports
215
- - `useAddEditCore({ model, resource, queryKey, canSave, fieldBag, feedback, parseInput, mapLoadedToModel, buildRawPayload, buildSavePayload, onSaveSuccess, messages = {} } = {})`
219
+ - `useAddEditCore({ model, resource, queryKey, canSave, fieldBag, feedback, input, mapLoadedToModel, buildRawPayload, buildSavePayload, onSaveSuccess, messages = {} } = {})`
216
220
 
217
221
  ### `src/client/composables/runtime/useCommandCore.js`
218
222
  Exports
219
- - `useCommandCore({ model, resource, writeMethod = "POST", canRun, fieldBag, feedback, parseInput, buildRawPayload, buildCommandPayload, buildCommandOptions, onRunSuccess, onRunError, suppressSuccessMessage = false, messages = {} } = {})`
223
+ - `useCommandCore({ model, resource, writeMethod = "POST", canRun, fieldBag, feedback, input, buildRawPayload, buildCommandPayload, buildCommandOptions, onRunSuccess, onRunError, suppressSuccessMessage = false, messages = {} } = {})`
220
224
 
221
225
  ### `src/client/composables/runtime/useEndpointResource.js`
222
226
  Exports
223
- - `useEndpointResource({ queryKey, path = "", enabled = true, client = usersWebHttpClient, readMethod = "GET", writeMethod = "PATCH", queryOptions = null, mutationOptions = null, fallbackLoadError = "Unable to load resource.", fallbackSaveError = "Unable to save resource." } = {})`
227
+ - `buildEndpointReadRequestOptions({ method = "GET", query = null, transport = null } = {})`
228
+ - `buildEndpointWriteRequestOptions({ method = "PATCH", body = undefined, options = null, transport = null } = {})`
229
+ - `useEndpointResource({ queryKey, path = "", enabled = true, client = usersWebHttpClient, readMethod = "GET", writeMethod = "PATCH", readQuery = null, transport = null, queryOptions = null, mutationOptions = null, fallbackLoadError = "Unable to load resource.", fallbackSaveError = "Unable to save resource." } = {})`
230
+ Local functions
231
+ - `resolveRequestQuery(value = null)`
224
232
 
225
233
  ### `src/client/composables/runtime/useFieldErrorBag.js`
226
234
  Exports
@@ -230,9 +238,10 @@ Local functions
230
238
 
231
239
  ### `src/client/composables/runtime/useListCore.js`
232
240
  Exports
233
- - `useListCore({ queryKey, path = "", enabled = true, client = usersWebHttpClient, initialPageParam = null, getNextPageParam, selectItems, requestOptions = null, queryOptions = null, fallbackLoadError = "Unable to load list." } = {})`
241
+ - `buildListRequestOptions({ requestOptions = null, transport = null, pageParam = null } = {})`
242
+ - `useListCore({ queryKey, path = "", enabled = true, client = usersWebHttpClient, transport = null, initialPageParam = null, getNextPageParam, selectItems, requestOptions = null, queryOptions = null, fallbackLoadError = "Unable to load list." } = {})`
234
243
  Local functions
235
- - `appendPageParam(path, pageParam)`
244
+ - `resolveRequestOptionsObject(value = null)`
236
245
 
237
246
  ### `src/client/composables/runtime/useUiFeedback.js`
238
247
  Exports
@@ -297,9 +306,13 @@ Exports
297
306
  - `resolveEnabledRef(value)`
298
307
  - `resolveTextRef(value)`
299
308
 
300
- ### `src/client/composables/support/requestQueryPathSupport.js`
309
+ ### `src/client/composables/support/requestQueryRuntimeSupport.js`
301
310
  Exports
302
- - `appendRequestQueryEntriesToPath(path = "", entries = [])`
311
+ - `appendRequestQueryValue(target = {}, key = "", values = [])`
312
+ - `buildRequestQueryObject(entries = [])`
313
+ - `createRequestQueryRuntime({ requestQueryParams = null, context = null, sourceQueryKey = null } = {})`
314
+ - `resolveRequestQueryBaseKey(sourceQueryKey = null)`
315
+ - `resolveRequestQueryContext(context = null)`
303
316
 
304
317
  ### `src/client/composables/support/resourceLoadStateHelpers.js`
305
318
  Exports
@@ -353,7 +366,7 @@ Exports
353
366
 
354
367
  ### `src/client/composables/useCommand.js`
355
368
  Exports
356
- - `useCommand({ ownershipFilter = ROUTE_VISIBILITY_WORKSPACE, surfaceId = "", access = "auto", apiSuffix = "", runPermissions = [], writeMethod = "POST", placementSource = "users-web.command", fallbackRunError = "Unable to complete action.", fieldErrorKeys = [], clearOnRouteChange = true, model, parseInput, buildRawPayload, buildCommandPayload, buildCommandOptions, onRunSuccess, onRunError, suppressSuccessMessage = false, messages = {}, realtime = null } = {})`
369
+ - `useCommand({ ownershipFilter = ROUTE_VISIBILITY_WORKSPACE, surfaceId = "", access = "auto", apiSuffix = "", runPermissions = [], writeMethod = "POST", transport = null, placementSource = "users-web.command", fallbackRunError = "Unable to complete action.", fieldErrorKeys = [], clearOnRouteChange = true, model, input, buildRawPayload, buildCommandPayload, buildCommandOptions, onRunSuccess, onRunError, suppressSuccessMessage = false, messages = {}, realtime = null } = {})`
357
370
 
358
371
  ### `src/client/composables/useCrudListFilterLookups.js`
359
372
  Exports
@@ -364,18 +377,14 @@ Exports
364
377
  - `useCrudListFilters(definitions = {}, { labelResolvers = {}, chipLabels = {}, presets = [] } = {})`
365
378
  Local functions
366
379
  - `normalizeFunctionMap(value = {})`
367
- - `createInitialFilterValue(filter = {})`
368
380
  - `normalizePresetEntries(presets = [])`
369
381
  - `resolvePresetValues(preset = {}, { values = {}, filters = {} } = {})`
370
- - `normalizePresetFilterValue(filter = {}, rawValue)`
371
- - `normalizeCurrentManyFilterValues(value)`
372
- - `matchArrayValues(currentValue = [], expectedValue = [])`
373
- - `matchesPresetFilterValue(filter = {}, currentValue, rawExpectedValue)`
382
+ - `createRuntimeFilterValue(filter = {})`
383
+ - `assignFilterValue(values, filter = {}, rawValue)`
374
384
  - `resetFilterValue(values, filter = {})`
375
385
  - `applyPresetFilterValue(values, filter = {}, rawValue)`
376
386
  - `createQueryParams(values, filterEntries = [])`
377
387
  - `resolveAtomicValueLabel(filter = {}, value = "", labelResolvers = {})`
378
- - `defaultChipLabel(filter = {}, value, labelResolvers = {})`
379
388
 
380
389
  ### `src/client/composables/useCrudListParentTitle.js`
381
390
  Exports
@@ -54,48 +54,28 @@ Exports
54
54
 
55
55
  ### `src/server/common/repositories/workspaceInvitesRepository.js`
56
56
  Exports
57
- - `createRepository(knex)`
57
+ - `createRepository({ api, knex } = {})`
58
58
  - `normalizeInviteRecord(payload)`
59
59
  - `normalizeInviteWithWorkspace(payload = {})`
60
60
  Local functions
61
61
  - `normalizeInvitePatchPayload(payload = {})`
62
+ - `createInviteRelationships({ workspaceId = null, invitedByUserId = undefined } = {})`
62
63
 
63
64
  ### `src/server/common/repositories/workspaceMembershipsRepository.js`
64
65
  Exports
65
- - `createRepository(knex)`
66
+ - `createRepository({ api, knex } = {})`
66
67
  - `normalizeMembershipRecord(payload)`
67
68
  - `normalizeMemberSummaryRow(row)`
68
69
  Local functions
69
70
  - `normalizeMembershipPatchPayload(payload = {})`
71
+ - `createMembershipRelationships({ workspaceId = null, userId = null } = {})`
70
72
 
71
73
  ### `src/server/common/repositories/workspacesRepository.js`
72
74
  Exports
73
- - `createRepository(knex)`
74
- - `normalizeWorkspaceRecord(payload)`
75
- - `normalizeMembershipWorkspaceRow(row)`
75
+ - `createRepository({ api, knex } = {})`
76
76
  Local functions
77
- - `normalizeCreatePayload(payload = {})`
78
-
79
- ### `src/server/common/resources/workspaceInvitesResource.js`
80
- Exports
81
- - `workspaceInvitesResource`
82
- Local functions
83
- - `normalizeInviteRecord(payload = {})`
84
- - `normalizeInviteInput(payload = {})`
85
-
86
- ### `src/server/common/resources/workspaceMembershipsResource.js`
87
- Exports
88
- - `workspaceMembershipsResource`
89
- Local functions
90
- - `normalizeMembershipRecord(payload = {})`
91
- - `normalizeMembershipInput(payload = {})`
92
-
93
- ### `src/server/common/resources/workspacesResource.js`
94
- Exports
95
- - `workspacesResource`
96
- Local functions
97
- - `normalizeWorkspaceRecord(payload = {})`
98
- - `normalizeWorkspaceInput(payload = {})`
77
+ - `normalizeWorkspaceRecord(payload = null)`
78
+ - `createWorkspaceRelationships(source = {})`
99
79
 
100
80
  ### `src/server/common/services/workspaceContextService.js`
101
81
  Exports
@@ -129,19 +109,10 @@ Exports
129
109
  - `WORKSPACE_ROUTE_BASE_PATH`
130
110
  - `resolveWorkspaceRoutePath(relativePath = "/")`
131
111
 
132
- ### `src/server/common/validators/authenticatedUserValidator.js`
133
- Exports
134
- - `authenticatedUserValidator`
135
- Local functions
136
- - `normalizeAuthenticatedUser(input = {})`
137
-
138
112
  ### `src/server/common/validators/routeParamsValidator.js`
139
113
  Exports
140
114
  - `routeParamsValidator`
141
115
  - `workspaceSlugParamsValidator`
142
- Local functions
143
- - `normalizeRouteParams(input = {})`
144
- - `normalizeWorkspaceSlugParams(input = {})`
145
116
 
146
117
  ### `src/server/registerWorkspaceBootstrap.js`
147
118
  Exports
@@ -190,7 +161,6 @@ Exports
190
161
  Exports
191
162
  - `createWorkspaceBootstrapContributor({ workspaceService, workspacePendingInvitationsService, userProfilesRepository, workspaceInvitationsEnabled = false, appConfig = {}, tenancyProfile = null } = {})`
192
163
  Local functions
193
- - `normalizePendingInvites(invites)`
194
164
  - `normalizeQueryPayload(value = {})`
195
165
  - `resolveBootstrapWorkspaceSlug({ query = {}, request = null } = {})`
196
166
  - `normalizeRequestedWorkspaceStatus(value = "")`
@@ -201,6 +171,8 @@ Local functions
201
171
  ### `src/server/workspaceDirectory/bootWorkspaceDirectoryRoutes.js`
202
172
  Exports
203
173
  - `bootWorkspaceDirectoryRoutes(app)`
174
+ Local functions
175
+ - `resolveWorkspaceRecordId(record = {}, context = {})`
204
176
 
205
177
  ### `src/server/workspaceDirectory/registerWorkspaceDirectory.js`
206
178
  Exports
@@ -213,6 +185,8 @@ Exports
213
185
  ### `src/server/workspaceMembers/bootWorkspaceMembers.js`
214
186
  Exports
215
187
  - `bootWorkspaceMembers(app)`
188
+ Local functions
189
+ - `resolveWorkspaceAggregateRecordId(record = {}, context = {})`
216
190
 
217
191
  ### `src/server/workspaceMembers/registerWorkspaceMembers.js`
218
192
  Exports
@@ -231,6 +205,8 @@ Exports
231
205
  ### `src/server/workspacePendingInvitations/bootWorkspacePendingInvitations.js`
232
206
  Exports
233
207
  - `bootWorkspacePendingInvitations(app)`
208
+ Local functions
209
+ - `resolveAuthenticatedUserRecordId(_record, context = {})`
234
210
 
235
211
  ### `src/server/workspacePendingInvitations/registerWorkspacePendingInvitations.js`
236
212
  Exports
@@ -257,6 +233,8 @@ Exports
257
233
  ### `src/server/workspaceSettings/bootWorkspaceSettings.js`
258
234
  Exports
259
235
  - `bootWorkspaceSettings(app)`
236
+ Local functions
237
+ - `resolveWorkspaceSettingsRecordId(record = {}, context = {})`
260
238
 
261
239
  ### `src/server/workspaceSettings/registerWorkspaceSettings.js`
262
240
  Exports
@@ -270,65 +248,67 @@ Exports
270
248
 
271
249
  ### `src/server/workspaceSettings/workspaceSettingsRepository.js`
272
250
  Exports
273
- - `createRepository(knex, { defaultInvitesEnabled } = {})`
251
+ - `createRepository({ api, knex } = {})`
274
252
  Local functions
275
- - `resolveWorkspaceSettingsSeed(workspace = {}, { defaultInvitesEnabled = true } = {})`
253
+ - `pickPatchFields(source = {})`
254
+ - `createDefaultWorkspaceSettingsCreatePayload(workspaceId)`
276
255
 
277
256
  ### `src/server/workspaceSettings/workspaceSettingsService.js`
278
257
  Exports
279
258
  - `createService({ workspaceSettingsRepository, workspaceInvitationsEnabled = true, roleCatalog = null } = {})`
280
259
 
260
+ ### `src/shared/jsonApiTransports.js`
261
+ Exports
262
+ - `WORKSPACES_TRANSPORT`
263
+ - `WORKSPACES_COLLECTION_TRANSPORT`
264
+ - `WORKSPACE_SETTINGS_TRANSPORT`
265
+ - `WORKSPACE_ROLE_CATALOG_TRANSPORT`
266
+ - `WORKSPACE_MEMBERS_TRANSPORT`
267
+ - `WORKSPACE_MEMBER_ROLE_UPDATE_TRANSPORT`
268
+ - `WORKSPACE_INVITES_TRANSPORT`
269
+ - `WORKSPACE_INVITE_CREATE_TRANSPORT`
270
+ - `WORKSPACE_INVITE_REDEEM_TRANSPORT`
271
+ - `WORKSPACE_PENDING_INVITATIONS_TRANSPORT`
272
+
281
273
  ### `src/shared/operationMessages.js`
282
274
  Exports
283
275
  - `createOperationMessages({ validationMessage = "Validation failed.", apiValidationMessage = validationMessage } = {})`
284
276
 
285
- ### `src/shared/resources/resolveGlobalArrayRegistry.js`
277
+ ### `src/shared/resources/workspaceInvitesResource.js`
286
278
  Exports
287
- - `resolveGlobalArrayRegistry(symbolKey)`
279
+ - `workspaceInvitesResource`
280
+
281
+ ### `src/shared/resources/workspaceMembershipsResource.js`
282
+ Exports
283
+ - `workspaceMembershipsResource`
288
284
 
289
285
  ### `src/shared/resources/workspaceMembersResource.js`
290
286
  Exports
291
287
  - `workspaceMembersResource`
292
- Local functions
293
- - `normalizeWorkspaceAdminSummary(workspace)`
294
- - `normalizeMemberSummary(member, workspace)`
295
- - `normalizeInviteSummary(invite)`
296
- - `normalizeWorkspaceOutputEnvelope(payload = {}, { itemsKey, normalizeItem, includeInviteTokenPreview = false } = {})`
297
- - `normalizeWorkspaceMembersOutput(payload = {})`
298
- - `normalizeWorkspaceInvitesOutput(payload = {})`
299
288
 
300
289
  ### `src/shared/resources/workspacePendingInvitationsResource.js`
301
290
  Exports
302
291
  - `workspacePendingInvitationsResource`
303
- Local functions
304
- - `normalizePendingInvite(invite)`
305
- - `normalizePendingInviteList(invites)`
306
292
 
307
293
  ### `src/shared/resources/workspaceResource.js`
308
294
  Exports
309
295
  - `workspaceResource`
296
+ - `workspaceListItemOutputValidator`
310
297
  Local functions
311
298
  - `normalizeWorkspaceAvatarUrl(value)`
312
- - `normalizeWorkspaceInput(payload = {})`
313
- - `normalizeWorkspaceOutput(payload = {})`
314
- - `normalizeWorkspaceListItemOutput(payload = {})`
315
299
 
316
- ### `src/shared/resources/workspaceSettingsFields.js`
300
+ ### `src/shared/resources/workspaceRoleCatalogSchema.js`
317
301
  Exports
318
- - `defineField(field = {})`
319
- - `resetWorkspaceSettingsFields()`
320
- - `resolveWorkspaceSettingsFieldKeys()`
321
- - `workspaceSettingsFields`
302
+ - `workspaceRoleCatalogSchema`
303
+ - `workspaceRoleDescriptorSchema`
322
304
 
323
305
  ### `src/shared/resources/workspaceSettingsResource.js`
324
306
  Exports
307
+ - `WORKSPACE_SETTINGS_FIELD_KEYS`
308
+ - `workspaceSettingsOutputSchema`
325
309
  - `workspaceSettingsResource`
326
310
  Local functions
327
- - `buildCreateBodySchema()`
328
- - `buildSettingsOutputSchema()`
329
- - `buildResponseRecordSchema()`
330
- - `normalizeInput(payload = {})`
331
- - `normalizeOutput(payload = {})`
311
+ - `normalizeWorkspaceColorInput(value)`
332
312
 
333
313
  ### `src/shared/roles.js`
334
314
  Exports
@@ -428,20 +408,8 @@ Local functions
428
408
  - `hasColumn(knex, tableName, columnName)`
429
409
  - `normalizeHexColor(value)`
430
410
 
431
- ### `templates/packages/main/src/shared/resources/workspaceSettingsFields.js`
432
- Exports
433
- - None
434
- Local functions
435
- - `normalizeHexColor(value)`
436
-
437
411
  ### root
438
412
 
439
413
  ### `package.descriptor.mjs`
440
414
  Exports
441
415
  - None
442
-
443
- ### test-support
444
-
445
- ### `test-support/registerDefaultSettingsFields.js`
446
- Exports
447
- - None
@@ -270,7 +270,7 @@ Exports
270
270
  - `WORKSPACE_BOOTSTRAP_STATUS_FORBIDDEN`
271
271
  - `WORKSPACE_BOOTSTRAP_STATUS_UNAUTHENTICATED`
272
272
  - `WORKSPACE_BOOTSTRAP_STATUS_ERROR`
273
- - `createBootstrapPlacementRuntime({ app, logger = null, fetchBootstrap = fetchBootstrapPayload } = {})`
273
+ - `createBootstrapPlacementRuntime({ app, logger = null } = {})`
274
274
 
275
275
  ### `src/client/runtime/bootstrapPlacementRuntimeConstants.js`
276
276
  Exports
@@ -318,8 +318,6 @@ Exports
318
318
  - `WORKSPACES_WEB_SCOPE_SUPPORT_INJECTION_KEY`
319
319
  - `createWorkspaceScopeSupport()`
320
320
  - `readWorkspaceRouteScope(routeContext = {})`
321
- Local functions
322
- - `unwrapRefValue(value)`
323
321
 
324
322
  ### `src/shared/toolsOutletContracts.js`
325
323
  Exports
@@ -198,8 +198,6 @@ Exports
198
198
  - `partitionPreFileConfigTextMutations(textMutations = [])`
199
199
  - `resolvePositioningMutations(descriptorMutations = {})`
200
200
  Local functions
201
- - `resolveSettingsFieldsContractTarget(relativeFile = "")`
202
- - `validateSettingsFieldsContractMutationTarget({ appRoot, relativeFile, packageId } = {})`
203
201
  - `isPositioningTextMutation(value = {})`
204
202
  - `isPreFileConfigTextMutation(value = {})`
205
203
 
@@ -228,6 +226,9 @@ Local functions
228
226
  - `createManagedRecordBase(packageEntry, options)`
229
227
  - `cloneManagedMap(value = {})`
230
228
  - `cloneManagedArray(value = [])`
229
+ - `normalizeModeToken(value = "")`
230
+ - `isWorkspaceCapableTenancyMode(value = "")`
231
+ - `collectInstallWarnings({ packageEntry, appRoot, appPackageJson })`
231
232
  - `resolveManagedSourceRecord(packageEntry, existingInstall = {})`
232
233
 
233
234
  ### `src/server/cliRuntime/packageIntrospection.js`
@@ -351,8 +352,8 @@ Local functions
351
352
  ### `src/server/commandHandlers/appCommandCatalog.js`
352
353
  Exports
353
354
  - `APP_SCRIPT_WRAPPERS`
354
- - `LEGACY_APP_SCRIPT_VALUES`
355
- - `LEGACY_APP_SCRIPT_FILES`
355
+ - `COPIED_APP_SCRIPT_VALUES`
356
+ - `COPIED_APP_SCRIPT_FILES`
356
357
  - `APP_COMMAND_DEFINITIONS`
357
358
  - `listAppCommandDefinitions()`
358
359
  - `resolveAppCommandDefinition(rawName = "")`
@@ -32,7 +32,8 @@ For CRUD chunks:
32
32
  2. If `crud-server-generator` is going to own the CRUD schema, do not hand-write a separate migration for that CRUD table.
33
33
  3. Scaffold the server side first with `crud-server-generator`.
34
34
  4. Only after the shared resource file exists, scaffold the client side against that resource.
35
- 5. Do not guess CRUD operations or screen shape. Ask the developer:
35
+ 5. Treat that shared resource file as the canonical CRUD definition. Put field and ownership changes there instead of hand-duplicating derived CRUD validators elsewhere.
36
+ 6. Do not guess CRUD operations or screen shape. Ask the developer:
36
37
  - which operations are allowed
37
38
  - which fields belong in the list view if one exists
38
39
  - what the view form should look like