@jskit-ai/jskit-catalog 0.1.41 → 0.1.43

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 (2) hide show
  1. package/catalog/packages.json +483 -233
  2. package/package.json +1 -1
@@ -6,11 +6,11 @@
6
6
  "packages": [
7
7
  {
8
8
  "packageId": "@jskit-ai/assistant",
9
- "version": "0.1.42",
9
+ "version": "0.1.44",
10
10
  "descriptor": {
11
11
  "packageVersion": 1,
12
12
  "packageId": "@jskit-ai/assistant",
13
- "version": "0.1.42",
13
+ "version": "0.1.44",
14
14
  "kind": "generator",
15
15
  "description": "Install assistant runtime/config for one surface and scaffold assistant pages at explicit target files.",
16
16
  "options": {
@@ -58,7 +58,7 @@
58
58
  "inputType": "text",
59
59
  "defaultValue": "",
60
60
  "promptLabel": "Link placement",
61
- "promptHint": "Optional host:position target for the generated page link placement."
61
+ "promptHint": "Optional target for the generated page link placement (format: host:position)."
62
62
  },
63
63
  "link-component-token": {
64
64
  "required": false,
@@ -171,6 +171,7 @@
171
171
  ]
172
172
  },
173
173
  "page": {
174
+ "requiresShellWeb": true,
174
175
  "entrypoint": "src/server/subcommands/page.js",
175
176
  "export": "runGeneratorSubcommand",
176
177
  "description": "Create an assistant runtime page at an explicit target file relative to src/pages/.",
@@ -213,6 +214,7 @@
213
214
  ]
214
215
  },
215
216
  "settings-page": {
217
+ "requiresShellWeb": true,
216
218
  "entrypoint": "src/server/subcommands/settingsPage.js",
217
219
  "export": "runGeneratorSubcommand",
218
220
  "description": "Create an assistant settings page at an explicit target file relative to src/pages/.",
@@ -354,11 +356,11 @@
354
356
  },
355
357
  {
356
358
  "packageId": "@jskit-ai/assistant-core",
357
- "version": "0.1.9",
359
+ "version": "0.1.11",
358
360
  "descriptor": {
359
361
  "packageVersion": 1,
360
362
  "packageId": "@jskit-ai/assistant-core",
361
- "version": "0.1.9",
363
+ "version": "0.1.11",
362
364
  "kind": "runtime",
363
365
  "description": "Reusable assistant client/server/shared primitives without surface-specific routes or settings ownership.",
364
366
  "dependsOn": [
@@ -404,9 +406,9 @@
404
406
  "mutations": {
405
407
  "dependencies": {
406
408
  "runtime": {
407
- "@jskit-ai/http-runtime": "0.1.32",
408
- "@jskit-ai/kernel": "0.1.33",
409
- "@jskit-ai/users-core": "0.1.43",
409
+ "@jskit-ai/http-runtime": "0.1.34",
410
+ "@jskit-ai/kernel": "0.1.35",
411
+ "@jskit-ai/users-core": "0.1.45",
410
412
  "@tanstack/vue-query": "^5.90.5",
411
413
  "dompurify": "^3.3.3",
412
414
  "marked": "^17.0.4",
@@ -427,11 +429,11 @@
427
429
  },
428
430
  {
429
431
  "packageId": "@jskit-ai/assistant-runtime",
430
- "version": "0.1.4",
432
+ "version": "0.1.6",
431
433
  "descriptor": {
432
434
  "packageVersion": 1,
433
435
  "packageId": "@jskit-ai/assistant-runtime",
434
- "version": "0.1.4",
436
+ "version": "0.1.6",
435
437
  "kind": "runtime",
436
438
  "description": "Shared assistant runtime with per-surface assistant registration.",
437
439
  "dependsOn": [
@@ -506,13 +508,13 @@
506
508
  "mutations": {
507
509
  "dependencies": {
508
510
  "runtime": {
509
- "@jskit-ai/assistant-core": "0.1.9",
510
- "@jskit-ai/database-runtime": "0.1.33",
511
- "@jskit-ai/http-runtime": "0.1.32",
512
- "@jskit-ai/kernel": "0.1.33",
513
- "@jskit-ai/shell-web": "0.1.32",
514
- "@jskit-ai/users-core": "0.1.43",
515
- "@jskit-ai/users-web": "0.1.48",
511
+ "@jskit-ai/assistant-core": "0.1.11",
512
+ "@jskit-ai/database-runtime": "0.1.35",
513
+ "@jskit-ai/http-runtime": "0.1.34",
514
+ "@jskit-ai/kernel": "0.1.35",
515
+ "@jskit-ai/shell-web": "0.1.34",
516
+ "@jskit-ai/users-core": "0.1.45",
517
+ "@jskit-ai/users-web": "0.1.50",
516
518
  "@tanstack/vue-query": "^5.90.5",
517
519
  "vuetify": "^4.0.0"
518
520
  },
@@ -569,11 +571,11 @@
569
571
  },
570
572
  {
571
573
  "packageId": "@jskit-ai/auth-core",
572
- "version": "0.1.32",
574
+ "version": "0.1.34",
573
575
  "descriptor": {
574
576
  "packageVersion": 1,
575
577
  "packageId": "@jskit-ai/auth-core",
576
- "version": "0.1.32",
578
+ "version": "0.1.34",
577
579
  "kind": "runtime",
578
580
  "dependsOn": [
579
581
  "@jskit-ai/value-app-config-shared"
@@ -641,7 +643,7 @@
641
643
  "mutations": {
642
644
  "dependencies": {
643
645
  "runtime": {
644
- "@jskit-ai/kernel": "0.1.33",
646
+ "@jskit-ai/kernel": "0.1.35",
645
647
  "@fastify/cookie": "^11.0.2",
646
648
  "@fastify/csrf-protection": "^7.1.0",
647
649
  "@fastify/rate-limit": "^10.3.0"
@@ -659,11 +661,11 @@
659
661
  },
660
662
  {
661
663
  "packageId": "@jskit-ai/auth-provider-supabase-core",
662
- "version": "0.1.32",
664
+ "version": "0.1.34",
663
665
  "descriptor": {
664
666
  "packageVersion": 1,
665
667
  "packageId": "@jskit-ai/auth-provider-supabase-core",
666
- "version": "0.1.32",
668
+ "version": "0.1.34",
667
669
  "kind": "runtime",
668
670
  "options": {
669
671
  "auth-supabase-url": {
@@ -745,8 +747,8 @@
745
747
  "mutations": {
746
748
  "dependencies": {
747
749
  "runtime": {
748
- "@jskit-ai/auth-core": "0.1.32",
749
- "@jskit-ai/kernel": "0.1.33",
750
+ "@jskit-ai/auth-core": "0.1.34",
751
+ "@jskit-ai/kernel": "0.1.35",
750
752
  "dotenv": "^16.4.5",
751
753
  "@supabase/supabase-js": "^2.57.4",
752
754
  "jose": "^6.1.0"
@@ -811,11 +813,11 @@
811
813
  },
812
814
  {
813
815
  "packageId": "@jskit-ai/auth-web",
814
- "version": "0.1.34",
816
+ "version": "0.1.36",
815
817
  "descriptor": {
816
818
  "packageVersion": 1,
817
819
  "packageId": "@jskit-ai/auth-web",
818
- "version": "0.1.34",
820
+ "version": "0.1.36",
819
821
  "kind": "runtime",
820
822
  "description": "Auth web module: Fastify auth routes plus web login/sign-out scaffolds.",
821
823
  "dependsOn": [
@@ -991,8 +993,8 @@
991
993
  "placements": {
992
994
  "outlets": [
993
995
  {
994
- "host": "auth-profile-menu",
995
- "position": "primary-menu",
996
+ "target": "auth-profile-menu:primary-menu",
997
+ "defaultLinkComponentToken": "auth.web.profile.menu.link-item",
996
998
  "surfaces": [
997
999
  "*"
998
1000
  ],
@@ -1002,8 +1004,7 @@
1002
1004
  "contributions": [
1003
1005
  {
1004
1006
  "id": "auth.profile.widget",
1005
- "host": "shell-layout",
1006
- "position": "top-right",
1007
+ "target": "shell-layout:top-right",
1007
1008
  "surfaces": [
1008
1009
  "*"
1009
1010
  ],
@@ -1013,8 +1014,7 @@
1013
1014
  },
1014
1015
  {
1015
1016
  "id": "auth.profile.menu.sign-in",
1016
- "host": "auth-profile-menu",
1017
- "position": "primary-menu",
1017
+ "target": "auth-profile-menu:primary-menu",
1018
1018
  "surfaces": [
1019
1019
  "*"
1020
1020
  ],
@@ -1025,8 +1025,7 @@
1025
1025
  },
1026
1026
  {
1027
1027
  "id": "auth.profile.menu.sign-out",
1028
- "host": "auth-profile-menu",
1029
- "position": "primary-menu",
1028
+ "target": "auth-profile-menu:primary-menu",
1030
1029
  "surfaces": [
1031
1030
  "*"
1032
1031
  ],
@@ -1045,10 +1044,10 @@
1045
1044
  "@tanstack/vue-query": "5.92.12",
1046
1045
  "@mdi/js": "^7.4.47",
1047
1046
  "@fastify/type-provider-typebox": "^6.1.0",
1048
- "@jskit-ai/auth-core": "0.1.32",
1049
- "@jskit-ai/http-runtime": "0.1.32",
1050
- "@jskit-ai/kernel": "0.1.33",
1051
- "@jskit-ai/shell-web": "0.1.32",
1047
+ "@jskit-ai/auth-core": "0.1.34",
1048
+ "@jskit-ai/http-runtime": "0.1.34",
1049
+ "@jskit-ai/kernel": "0.1.35",
1050
+ "@jskit-ai/shell-web": "0.1.34",
1052
1051
  "vuetify": "^4.0.0"
1053
1052
  },
1054
1053
  "dev": {}
@@ -1107,7 +1106,7 @@
1107
1106
  "file": "src/placement.js",
1108
1107
  "position": "bottom",
1109
1108
  "skipIfContains": "id: \"auth.profile.widget\"",
1110
- "value": "\naddPlacement({\n id: \"auth.profile.widget\",\n host: \"shell-layout\",\n position: \"top-right\",\n surfaces: [\"*\"],\n order: 1000,\n componentToken: \"auth.web.profile.widget\"\n});\n\naddPlacement({\n id: \"auth.profile.menu.sign-in\",\n host: \"auth-profile-menu\",\n position: \"primary-menu\",\n surfaces: [\"*\"],\n order: 200,\n componentToken: \"auth.web.profile.menu.link-item\",\n props: {\n label: \"Sign in\",\n to: \"/auth/login\"\n },\n when: ({ auth }) => !Boolean(auth?.authenticated)\n});\n\naddPlacement({\n id: \"auth.profile.menu.sign-out\",\n host: \"auth-profile-menu\",\n position: \"primary-menu\",\n surfaces: [\"*\"],\n order: 1000,\n componentToken: \"auth.web.profile.menu.link-item\",\n props: {\n label: \"Sign out\",\n to: \"/auth/signout\"\n },\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n",
1109
+ "value": "\naddPlacement({\n id: \"auth.profile.widget\",\n target: \"shell-layout:top-right\",\n surfaces: [\"*\"],\n order: 1000,\n componentToken: \"auth.web.profile.widget\"\n});\n\naddPlacement({\n id: \"auth.profile.menu.sign-in\",\n target: \"auth-profile-menu:primary-menu\",\n surfaces: [\"*\"],\n order: 200,\n componentToken: \"auth.web.profile.menu.link-item\",\n props: {\n label: \"Sign in\",\n to: \"/auth/login\"\n },\n when: ({ auth }) => !Boolean(auth?.authenticated)\n});\n\naddPlacement({\n id: \"auth.profile.menu.sign-out\",\n target: \"auth-profile-menu:primary-menu\",\n surfaces: [\"*\"],\n order: 1000,\n componentToken: \"auth.web.profile.menu.link-item\",\n props: {\n label: \"Sign out\",\n to: \"/auth/signout\"\n },\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n",
1111
1110
  "reason": "Append auth profile placement entries into app-owned placement registry.",
1112
1111
  "category": "auth-web",
1113
1112
  "id": "auth-web-placement-block"
@@ -1116,13 +1115,119 @@
1116
1115
  }
1117
1116
  }
1118
1117
  },
1118
+ {
1119
+ "packageId": "@jskit-ai/console-web",
1120
+ "version": "0.1.2",
1121
+ "descriptor": {
1122
+ "packageVersion": 1,
1123
+ "packageId": "@jskit-ai/console-web",
1124
+ "version": "0.1.2",
1125
+ "kind": "runtime",
1126
+ "description": "Authenticated console surface scaffold and surface policy wiring.",
1127
+ "dependsOn": [
1128
+ "@jskit-ai/auth-web",
1129
+ "@jskit-ai/shell-web",
1130
+ "@jskit-ai/users-core"
1131
+ ],
1132
+ "capabilities": {
1133
+ "provides": [
1134
+ "console.web"
1135
+ ],
1136
+ "requires": [
1137
+ "users.core"
1138
+ ]
1139
+ },
1140
+ "runtime": {
1141
+ "server": {
1142
+ "providers": []
1143
+ },
1144
+ "client": {
1145
+ "providers": []
1146
+ }
1147
+ },
1148
+ "metadata": {
1149
+ "apiSummary": {
1150
+ "surfaces": [
1151
+ {
1152
+ "subpath": "./client",
1153
+ "summary": "Exports no runtime API today (reserved console surface package entrypoint)."
1154
+ }
1155
+ ],
1156
+ "containerTokens": {
1157
+ "server": [],
1158
+ "client": []
1159
+ }
1160
+ }
1161
+ },
1162
+ "mutations": {
1163
+ "dependencies": {
1164
+ "runtime": {
1165
+ "@jskit-ai/auth-web": "0.1.36",
1166
+ "@jskit-ai/shell-web": "0.1.34",
1167
+ "@jskit-ai/users-core": "0.1.45"
1168
+ },
1169
+ "dev": {}
1170
+ },
1171
+ "packageJson": {
1172
+ "scripts": {
1173
+ "server:console": "SERVER_SURFACE=console node ./bin/server.js",
1174
+ "dev:console": "VITE_SURFACE=console vite",
1175
+ "build:console": "VITE_SURFACE=console vite build"
1176
+ }
1177
+ },
1178
+ "procfile": {},
1179
+ "files": [
1180
+ {
1181
+ "from": "templates/src/pages/console.vue",
1182
+ "toSurface": "console",
1183
+ "toSurfaceRoot": true,
1184
+ "ownership": "app",
1185
+ "reason": "Install shell-driven console wrapper page.",
1186
+ "category": "console-web",
1187
+ "id": "console-web-page-console-wrapper"
1188
+ },
1189
+ {
1190
+ "from": "templates/src/pages/console/index.vue",
1191
+ "toSurface": "console",
1192
+ "toSurfacePath": "index.vue",
1193
+ "ownership": "app",
1194
+ "reason": "Install shell-driven console page starter.",
1195
+ "category": "console-web",
1196
+ "id": "console-web-page-console"
1197
+ }
1198
+ ],
1199
+ "text": [
1200
+ {
1201
+ "op": "append-text",
1202
+ "file": "config/surfaceAccessPolicies.js",
1203
+ "position": "bottom",
1204
+ "skipIfContains": "surfaceAccessPolicies.console_owner = {",
1205
+ "value": "\nsurfaceAccessPolicies.console_owner = {\n requireAuth: true,\n requireFlagsAll: [\"console_owner\"]\n};\n",
1206
+ "reason": "Register console-owner surface access policy for the console surface.",
1207
+ "category": "console-web",
1208
+ "id": "console-web-surface-access-policies-console-owner"
1209
+ },
1210
+ {
1211
+ "op": "append-text",
1212
+ "file": "config/public.js",
1213
+ "position": "bottom",
1214
+ "skipIfContains": "config.surfaceDefinitions.console = {",
1215
+ "value": "\nconfig.surfaceDefinitions.console = {\n id: \"console\",\n label: \"Console\",\n pagesRoot: \"console\",\n enabled: true,\n requiresAuth: true,\n requiresWorkspace: false,\n accessPolicyId: \"console_owner\",\n origin: \"\"\n};\n",
1216
+ "reason": "Register console surface definition once console-web is installed.",
1217
+ "category": "console-web",
1218
+ "id": "console-web-surface-config-console"
1219
+ }
1220
+ ]
1221
+ }
1222
+ }
1223
+ },
1119
1224
  {
1120
1225
  "packageId": "@jskit-ai/crud-core",
1121
- "version": "0.1.41",
1226
+ "version": "0.1.43",
1122
1227
  "descriptor": {
1123
1228
  "packageVersion": 1,
1124
1229
  "packageId": "@jskit-ai/crud-core",
1125
- "version": "0.1.41",
1230
+ "version": "0.1.43",
1126
1231
  "kind": "runtime",
1127
1232
  "description": "Shared CRUD helpers used by CRUD modules.",
1128
1233
  "dependsOn": [
@@ -1149,7 +1254,7 @@
1149
1254
  "mutations": {
1150
1255
  "dependencies": {
1151
1256
  "runtime": {
1152
- "@jskit-ai/crud-core": "0.1.41"
1257
+ "@jskit-ai/crud-core": "0.1.43"
1153
1258
  },
1154
1259
  "dev": {}
1155
1260
  },
@@ -1163,11 +1268,11 @@
1163
1268
  },
1164
1269
  {
1165
1270
  "packageId": "@jskit-ai/crud-server-generator",
1166
- "version": "0.1.41",
1271
+ "version": "0.1.43",
1167
1272
  "descriptor": {
1168
1273
  "packageVersion": 1,
1169
1274
  "packageId": "@jskit-ai/crud-server-generator",
1170
- "version": "0.1.41",
1275
+ "version": "0.1.43",
1171
1276
  "kind": "generator",
1172
1277
  "description": "CRUD server generator with routes, actions, and persistence scaffolding.",
1173
1278
  "options": {
@@ -1179,16 +1284,24 @@
1179
1284
  "promptHint": "Required slug (example: customers, appointments, vendors)."
1180
1285
  },
1181
1286
  "surface": {
1182
- "required": true,
1287
+ "required": false,
1183
1288
  "inputType": "text",
1184
1289
  "validationType": "enabled-surface-id",
1185
1290
  "promptLabel": "Target surface",
1186
- "promptHint": "Must match an enabled surface id."
1291
+ "promptHint": "Optional for non-workspace apps; otherwise must match an enabled surface id."
1187
1292
  },
1188
1293
  "ownership-filter": {
1189
1294
  "required": true,
1190
1295
  "inputType": "text",
1191
1296
  "defaultValue": "auto",
1297
+ "validationType": "enum",
1298
+ "allowedValues": [
1299
+ "auto",
1300
+ "public",
1301
+ "user",
1302
+ "workspace",
1303
+ "workspace_user"
1304
+ ],
1192
1305
  "promptLabel": "Ownership filter",
1193
1306
  "promptHint": "auto | public | user | workspace | workspace_user"
1194
1307
  },
@@ -1200,11 +1313,12 @@
1200
1313
  "promptHint": "Optional subpath prepended to the CRUD route path (example: crm or ops/team-a)."
1201
1314
  },
1202
1315
  "table-name": {
1203
- "required": true,
1316
+ "required": false,
1204
1317
  "inputType": "text",
1205
1318
  "defaultValue": "",
1319
+ "defaultFromOptionTemplate": "${option:namespace}",
1206
1320
  "promptLabel": "Table name",
1207
- "promptHint": "Required existing MySQL table to introspect for CRUD schema generation."
1321
+ "promptHint": "Existing MySQL table to introspect for CRUD schema generation (defaults to namespace)."
1208
1322
  },
1209
1323
  "id-column": {
1210
1324
  "required": false,
@@ -1316,13 +1430,13 @@
1316
1430
  "mutations": {
1317
1431
  "dependencies": {
1318
1432
  "runtime": {
1319
- "@jskit-ai/auth-core": "0.1.32",
1320
- "@jskit-ai/crud-core": "0.1.41",
1321
- "@jskit-ai/database-runtime": "0.1.33",
1322
- "@jskit-ai/http-runtime": "0.1.32",
1323
- "@jskit-ai/kernel": "0.1.33",
1324
- "@jskit-ai/realtime": "0.1.32",
1325
- "@jskit-ai/users-core": "0.1.43",
1433
+ "@jskit-ai/auth-core": "0.1.34",
1434
+ "@jskit-ai/crud-core": "0.1.43",
1435
+ "@jskit-ai/database-runtime": "0.1.35",
1436
+ "@jskit-ai/http-runtime": "0.1.34",
1437
+ "@jskit-ai/kernel": "0.1.35",
1438
+ "@jskit-ai/realtime": "0.1.34",
1439
+ "@jskit-ai/users-core": "0.1.45",
1326
1440
  "@local/${option:namespace|kebab}": "file:packages/${option:namespace|kebab}",
1327
1441
  "typebox": "^1.0.81"
1328
1442
  },
@@ -1376,7 +1490,11 @@
1376
1490
  "to": "packages/${option:namespace|kebab}/src/server/actions.js",
1377
1491
  "reason": "Install app-local CRUD action definitions.",
1378
1492
  "category": "crud",
1379
- "id": "crud-local-package-server-actions-${option:namespace|snake}"
1493
+ "id": "crud-local-package-server-actions-${option:namespace|snake}",
1494
+ "templateContext": {
1495
+ "entrypoint": "src/server/buildTemplateContext.js",
1496
+ "export": "buildTemplateContext"
1497
+ }
1380
1498
  },
1381
1499
  {
1382
1500
  "from": "templates/src/local-package/server/actionIds.js",
@@ -1401,7 +1519,11 @@
1401
1519
  "to": "packages/${option:namespace|kebab}/src/server/registerRoutes.js",
1402
1520
  "reason": "Install app-local CRUD route registration.",
1403
1521
  "category": "crud",
1404
- "id": "crud-local-package-server-routes-${option:namespace|snake}"
1522
+ "id": "crud-local-package-server-routes-${option:namespace|snake}",
1523
+ "templateContext": {
1524
+ "entrypoint": "src/server/buildTemplateContext.js",
1525
+ "export": "buildTemplateContext"
1526
+ }
1405
1527
  },
1406
1528
  {
1407
1529
  "from": "templates/src/local-package/server/repository.js",
@@ -1446,10 +1568,14 @@
1446
1568
  "file": "config/roles.js",
1447
1569
  "position": "bottom",
1448
1570
  "skipIfContains": "\"crud.${option:namespace|snake}.list\"",
1449
- "value": "\nroleCatalog.roles.member.permissions.push(\n \"crud.${option:namespace|snake}.list\",\n \"crud.${option:namespace|snake}.view\",\n \"crud.${option:namespace|snake}.create\",\n \"crud.${option:namespace|snake}.update\",\n \"crud.${option:namespace|snake}.delete\"\n);\n",
1571
+ "value": "__JSKIT_CRUD_ROLE_CATALOG_PERMISSION_GRANTS__",
1450
1572
  "reason": "Grant generated CRUD action permissions to the default member role in the app-owned role catalog.",
1451
1573
  "category": "crud",
1452
- "id": "crud-role-catalog-permissions-${option:namespace|snake}"
1574
+ "id": "crud-role-catalog-permissions-${option:namespace|snake}",
1575
+ "templateContext": {
1576
+ "entrypoint": "src/server/buildTemplateContext.js",
1577
+ "export": "buildTemplateContext"
1578
+ }
1453
1579
  }
1454
1580
  ]
1455
1581
  }
@@ -1457,11 +1583,11 @@
1457
1583
  },
1458
1584
  {
1459
1585
  "packageId": "@jskit-ai/crud-ui-generator",
1460
- "version": "0.1.16",
1586
+ "version": "0.1.18",
1461
1587
  "descriptor": {
1462
1588
  "packageVersion": 1,
1463
1589
  "packageId": "@jskit-ai/crud-ui-generator",
1464
- "version": "0.1.16",
1590
+ "version": "0.1.18",
1465
1591
  "kind": "generator",
1466
1592
  "description": "Generate CRUD route trees from resource validators at an explicit route root relative to src/pages/.",
1467
1593
  "options": {
@@ -1484,6 +1610,13 @@
1484
1610
  "required": false,
1485
1611
  "inputType": "text",
1486
1612
  "defaultValue": "list,view,new,edit",
1613
+ "validationType": "csv-enum",
1614
+ "allowedValues": [
1615
+ "list",
1616
+ "view",
1617
+ "new",
1618
+ "edit"
1619
+ ],
1487
1620
  "promptLabel": "Operations",
1488
1621
  "promptHint": "Optional comma-separated values from: list, view, new, edit. Defaults to all four."
1489
1622
  },
@@ -1513,7 +1646,14 @@
1513
1646
  "inputType": "text",
1514
1647
  "defaultValue": "",
1515
1648
  "promptLabel": "Link placement",
1516
- "promptHint": "Optional host:position override for the generated list-page link placement."
1649
+ "promptHint": "Optional target override for the generated list-page link placement (format: host:position)."
1650
+ },
1651
+ "link-component-token": {
1652
+ "required": false,
1653
+ "inputType": "text",
1654
+ "defaultValue": "",
1655
+ "promptLabel": "Link component token",
1656
+ "promptHint": "Optional component token override for the generated list-page link placement (example: local.main.ui.tab-link-item)."
1517
1657
  },
1518
1658
  "namespace": {
1519
1659
  "required": false,
@@ -1542,10 +1682,11 @@
1542
1682
  "generatorPrimarySubcommand": "crud",
1543
1683
  "generatorSubcommands": {
1544
1684
  "crud": {
1685
+ "requiresShellWeb": true,
1545
1686
  "description": "Create CRUD pages at an explicit route root relative to src/pages/.",
1546
1687
  "longDescription": [
1547
1688
  "CRUD generation follows the same page-placement model as `ui-generator page`.",
1548
- "That means the generated list page link uses the same nearest-parent-host inference, tab-link inference, and relative `props.to` inference as a normal generated page. If you want the detailed host behavior, read `jskit generate ui-generator page help`."
1689
+ "That means the generated list page link uses the same nearest-parent-target inference, tab-link inference, and relative `props.to` inference as a normal generated page. If you want the detailed target behavior, read `jskit generate ui-generator page help`."
1549
1690
  ],
1550
1691
  "positionalArgs": [
1551
1692
  {
@@ -1560,6 +1701,7 @@
1560
1701
  "display-fields",
1561
1702
  "id-param",
1562
1703
  "link-placement",
1704
+ "link-component-token",
1563
1705
  "namespace",
1564
1706
  "force"
1565
1707
  ],
@@ -1599,6 +1741,7 @@
1599
1741
  ]
1600
1742
  },
1601
1743
  "field": {
1744
+ "requiresShellWeb": true,
1602
1745
  "entrypoint": "src/server/subcommands/addField.js",
1603
1746
  "export": "runGeneratorSubcommand"
1604
1747
  }
@@ -1619,7 +1762,7 @@
1619
1762
  "mutations": {
1620
1763
  "dependencies": {
1621
1764
  "runtime": {
1622
- "@jskit-ai/users-web": "0.1.48"
1765
+ "@jskit-ai/users-web": "0.1.50"
1623
1766
  },
1624
1767
  "dev": {}
1625
1768
  },
@@ -1831,7 +1974,7 @@
1831
1974
  "file": "src/placement.js",
1832
1975
  "position": "bottom",
1833
1976
  "skipIfContains": "__JSKIT_UI_MENU_MARKER__",
1834
- "value": "\n// __JSKIT_UI_MENU_MARKER__\n{\n addPlacement({\n id: \"__JSKIT_UI_MENU_PLACEMENT_ID__\",\n host: \"__JSKIT_UI_MENU_PLACEMENT_HOST__\",\n position: \"__JSKIT_UI_MENU_PLACEMENT_POSITION__\",\n surfaces: [\"__JSKIT_UI_SURFACE_ID__\"],\n order: 155,\n componentToken: \"__JSKIT_UI_MENU_COMPONENT_TOKEN__\",\n props: {\n label: \"__JSKIT_UI_MENU_LABEL__\",\n surface: \"__JSKIT_UI_SURFACE_ID__\",\n workspaceSuffix: \"__JSKIT_UI_MENU_WORKSPACE_SUFFIX__\",\n nonWorkspaceSuffix: \"__JSKIT_UI_MENU_NON_WORKSPACE_SUFFIX__\",\n__JSKIT_UI_MENU_TO_PROP_LINE__ },\n when: ({ auth }) => Boolean(auth?.authenticated)\n });\n}\n",
1977
+ "value": "\n// __JSKIT_UI_MENU_MARKER__\n{\n addPlacement({\n id: \"__JSKIT_UI_MENU_PLACEMENT_ID__\",\n target: \"__JSKIT_UI_MENU_PLACEMENT_TARGET__\",\n surfaces: [\"__JSKIT_UI_SURFACE_ID__\"],\n order: 155,\n componentToken: \"__JSKIT_UI_MENU_COMPONENT_TOKEN__\",\n props: {\n label: \"__JSKIT_UI_MENU_LABEL__\",\n surface: \"__JSKIT_UI_SURFACE_ID__\",\n workspaceSuffix: \"__JSKIT_UI_MENU_WORKSPACE_SUFFIX__\",\n nonWorkspaceSuffix: \"__JSKIT_UI_MENU_NON_WORKSPACE_SUFFIX__\",\n__JSKIT_UI_MENU_TO_PROP_LINE__ },\n__JSKIT_UI_MENU_WHEN_LINE__ });\n}\n",
1835
1978
  "reason": "Append generated CRUD list-page placement.",
1836
1979
  "category": "crud-ui-generator",
1837
1980
  "id": "crud-ui-placement-menu",
@@ -1852,11 +1995,11 @@
1852
1995
  },
1853
1996
  {
1854
1997
  "packageId": "@jskit-ai/database-runtime",
1855
- "version": "0.1.33",
1998
+ "version": "0.1.35",
1856
1999
  "descriptor": {
1857
2000
  "packageVersion": 1,
1858
2001
  "packageId": "@jskit-ai/database-runtime",
1859
- "version": "0.1.33",
2002
+ "version": "0.1.35",
1860
2003
  "kind": "runtime",
1861
2004
  "dependsOn": [
1862
2005
  "@jskit-ai/kernel"
@@ -1913,7 +2056,7 @@
1913
2056
  "mutations": {
1914
2057
  "dependencies": {
1915
2058
  "runtime": {
1916
- "@jskit-ai/kernel": "0.1.33",
2059
+ "@jskit-ai/kernel": "0.1.35",
1917
2060
  "dotenv": "^16.4.5",
1918
2061
  "knex": "^3.1.0"
1919
2062
  },
@@ -1948,11 +2091,11 @@
1948
2091
  },
1949
2092
  {
1950
2093
  "packageId": "@jskit-ai/database-runtime-mysql",
1951
- "version": "0.1.32",
2094
+ "version": "0.1.34",
1952
2095
  "descriptor": {
1953
2096
  "packageVersion": 1,
1954
2097
  "packageId": "@jskit-ai/database-runtime-mysql",
1955
- "version": "0.1.32",
2098
+ "version": "0.1.34",
1956
2099
  "kind": "runtime",
1957
2100
  "options": {
1958
2101
  "db-host": {
@@ -2042,7 +2185,7 @@
2042
2185
  "mutations": {
2043
2186
  "dependencies": {
2044
2187
  "runtime": {
2045
- "@jskit-ai/database-runtime": "0.1.33",
2188
+ "@jskit-ai/database-runtime": "0.1.35",
2046
2189
  "mysql2": "^3.11.2"
2047
2190
  },
2048
2191
  "dev": {}
@@ -2113,11 +2256,11 @@
2113
2256
  },
2114
2257
  {
2115
2258
  "packageId": "@jskit-ai/database-runtime-postgres",
2116
- "version": "0.1.32",
2259
+ "version": "0.1.34",
2117
2260
  "descriptor": {
2118
2261
  "packageVersion": 1,
2119
2262
  "packageId": "@jskit-ai/database-runtime-postgres",
2120
- "version": "0.1.32",
2263
+ "version": "0.1.34",
2121
2264
  "kind": "runtime",
2122
2265
  "options": {
2123
2266
  "db-host": {
@@ -2207,7 +2350,7 @@
2207
2350
  "mutations": {
2208
2351
  "dependencies": {
2209
2352
  "runtime": {
2210
- "@jskit-ai/database-runtime": "0.1.33",
2353
+ "@jskit-ai/database-runtime": "0.1.35",
2211
2354
  "pg": "^8.13.1"
2212
2355
  },
2213
2356
  "dev": {}
@@ -2278,11 +2421,11 @@
2278
2421
  },
2279
2422
  {
2280
2423
  "packageId": "@jskit-ai/http-runtime",
2281
- "version": "0.1.32",
2424
+ "version": "0.1.34",
2282
2425
  "descriptor": {
2283
2426
  "packageVersion": 1,
2284
2427
  "packageId": "@jskit-ai/http-runtime",
2285
- "version": "0.1.32",
2428
+ "version": "0.1.34",
2286
2429
  "kind": "runtime",
2287
2430
  "dependsOn": [],
2288
2431
  "capabilities": {
@@ -2348,7 +2491,7 @@
2348
2491
  "mutations": {
2349
2492
  "dependencies": {
2350
2493
  "runtime": {
2351
- "@jskit-ai/kernel": "0.1.33",
2494
+ "@jskit-ai/kernel": "0.1.35",
2352
2495
  "@fastify/type-provider-typebox": "^6.1.0",
2353
2496
  "typebox": "^1.0.81"
2354
2497
  },
@@ -2364,11 +2507,11 @@
2364
2507
  },
2365
2508
  {
2366
2509
  "packageId": "@jskit-ai/realtime",
2367
- "version": "0.1.32",
2510
+ "version": "0.1.34",
2368
2511
  "descriptor": {
2369
2512
  "packageVersion": 1,
2370
2513
  "packageId": "@jskit-ai/realtime",
2371
- "version": "0.1.32",
2514
+ "version": "0.1.34",
2372
2515
  "kind": "runtime",
2373
2516
  "description": "Thin, generic realtime runtime wrappers for socket.io server and client.",
2374
2517
  "options": {
@@ -2448,8 +2591,7 @@
2448
2591
  "contributions": [
2449
2592
  {
2450
2593
  "id": "realtime.connection.indicator",
2451
- "host": "shell-layout",
2452
- "position": "top-right",
2594
+ "target": "shell-layout:top-right",
2453
2595
  "surfaces": [
2454
2596
  "*"
2455
2597
  ],
@@ -2464,7 +2606,7 @@
2464
2606
  "mutations": {
2465
2607
  "dependencies": {
2466
2608
  "runtime": {
2467
- "@jskit-ai/kernel": "0.1.33",
2609
+ "@jskit-ai/kernel": "0.1.35",
2468
2610
  "@socket.io/redis-adapter": "^8.3.0",
2469
2611
  "redis": "^5.8.2",
2470
2612
  "socket.io": "^4.8.3",
@@ -2502,7 +2644,7 @@
2502
2644
  "file": "src/placement.js",
2503
2645
  "position": "bottom",
2504
2646
  "skipIfContains": "id: \"realtime.connection.indicator\"",
2505
- "value": "\naddPlacement({\n id: \"realtime.connection.indicator\",\n host: \"shell-layout\",\n position: \"top-right\",\n surfaces: [\"*\"],\n order: 950,\n componentToken: \"realtime.web.connection.indicator\"\n});\n",
2647
+ "value": "\naddPlacement({\n id: \"realtime.connection.indicator\",\n target: \"shell-layout:top-right\",\n surfaces: [\"*\"],\n order: 950,\n componentToken: \"realtime.web.connection.indicator\"\n});\n",
2506
2648
  "reason": "Append realtime connection indicator placement into app-owned placement registry.",
2507
2649
  "category": "realtime-web",
2508
2650
  "id": "realtime-placement-indicator"
@@ -2513,11 +2655,11 @@
2513
2655
  },
2514
2656
  {
2515
2657
  "packageId": "@jskit-ai/shell-web",
2516
- "version": "0.1.32",
2658
+ "version": "0.1.34",
2517
2659
  "descriptor": {
2518
2660
  "packageVersion": 1,
2519
2661
  "packageId": "@jskit-ai/shell-web",
2520
- "version": "0.1.32",
2662
+ "version": "0.1.34",
2521
2663
  "kind": "runtime",
2522
2664
  "description": "Web shell layout runtime with outlet-based placement contributions.",
2523
2665
  "dependsOn": [],
@@ -2546,7 +2688,7 @@
2546
2688
  "surfaces": [
2547
2689
  {
2548
2690
  "subpath": "./client",
2549
- "summary": "Exports shell layout/outlet/error-host components and ShellWebClientProvider."
2691
+ "summary": "Exports shell layout/outlet/outlet-menu/error-host components and ShellWebClientProvider."
2550
2692
  },
2551
2693
  {
2552
2694
  "subpath": "./client/placement",
@@ -2571,40 +2713,38 @@
2571
2713
  "placements": {
2572
2714
  "outlets": [
2573
2715
  {
2574
- "host": "shell-layout",
2575
- "position": "top-left",
2716
+ "target": "shell-layout:top-left",
2576
2717
  "surfaces": [
2577
2718
  "*"
2578
2719
  ],
2579
2720
  "source": "src/client/components/ShellLayout.vue"
2580
2721
  },
2581
2722
  {
2582
- "host": "shell-layout",
2583
- "position": "top-right",
2723
+ "target": "shell-layout:top-right",
2584
2724
  "surfaces": [
2585
2725
  "*"
2586
2726
  ],
2587
2727
  "source": "src/client/components/ShellLayout.vue"
2588
2728
  },
2589
2729
  {
2590
- "host": "shell-layout",
2591
- "position": "primary-menu",
2730
+ "target": "shell-layout:primary-menu",
2731
+ "defaultLinkComponentToken": "local.main.ui.surface-aware-menu-link-item",
2592
2732
  "surfaces": [
2593
2733
  "*"
2594
2734
  ],
2595
2735
  "source": "src/client/components/ShellLayout.vue"
2596
2736
  },
2597
2737
  {
2598
- "host": "shell-layout",
2599
- "position": "secondary-menu",
2738
+ "target": "shell-layout:secondary-menu",
2739
+ "defaultLinkComponentToken": "local.main.ui.surface-aware-menu-link-item",
2600
2740
  "surfaces": [
2601
2741
  "*"
2602
2742
  ],
2603
2743
  "source": "src/client/components/ShellLayout.vue"
2604
2744
  },
2605
2745
  {
2606
- "host": "home-settings",
2607
- "position": "primary-menu",
2746
+ "target": "home-settings:primary-menu",
2747
+ "defaultLinkComponentToken": "local.main.ui.surface-aware-menu-link-item",
2608
2748
  "surfaces": [
2609
2749
  "home"
2610
2750
  ],
@@ -2618,8 +2758,9 @@
2618
2758
  "mutations": {
2619
2759
  "dependencies": {
2620
2760
  "runtime": {
2761
+ "@mdi/js": "^7.4.47",
2621
2762
  "@tanstack/vue-query": "^5.90.5",
2622
- "@jskit-ai/kernel": "0.1.33",
2763
+ "@jskit-ai/kernel": "0.1.35",
2623
2764
  "vuetify": "^4.0.0"
2624
2765
  },
2625
2766
  "dev": {}
@@ -2627,16 +2768,78 @@
2627
2768
  "packageJson": {
2628
2769
  "scripts": {
2629
2770
  "dev:all": "vite",
2630
- "dev:home": "VITE_SURFACE=home vite",
2631
- "dev:console": "VITE_SURFACE=console vite"
2771
+ "dev:home": "VITE_SURFACE=home vite"
2632
2772
  }
2633
2773
  },
2634
2774
  "procfile": {},
2635
- "text": [],
2775
+ "text": [
2776
+ {
2777
+ "op": "append-text",
2778
+ "file": "packages/main/src/client/providers/MainClientProvider.js",
2779
+ "position": "top",
2780
+ "skipIfContains": "import MenuLinkItem from \"/src/components/menus/MenuLinkItem.vue\";",
2781
+ "value": "import MenuLinkItem from \"/src/components/menus/MenuLinkItem.vue\";\n",
2782
+ "reason": "Bind app-owned shell menu link-item scaffold into local main client provider imports.",
2783
+ "category": "shell-web",
2784
+ "id": "shell-web-main-client-provider-menu-link-item-import"
2785
+ },
2786
+ {
2787
+ "op": "append-text",
2788
+ "file": "packages/main/src/client/providers/MainClientProvider.js",
2789
+ "position": "top",
2790
+ "skipIfContains": "import SurfaceAwareMenuLinkItem from \"/src/components/menus/SurfaceAwareMenuLinkItem.vue\";",
2791
+ "value": "import SurfaceAwareMenuLinkItem from \"/src/components/menus/SurfaceAwareMenuLinkItem.vue\";\n",
2792
+ "reason": "Bind app-owned shell surface-aware menu link-item scaffold into local main client provider imports.",
2793
+ "category": "shell-web",
2794
+ "id": "shell-web-main-client-provider-surface-aware-menu-link-item-import"
2795
+ },
2796
+ {
2797
+ "op": "append-text",
2798
+ "file": "packages/main/src/client/providers/MainClientProvider.js",
2799
+ "position": "top",
2800
+ "skipIfContains": "import TabLinkItem from \"/src/components/menus/TabLinkItem.vue\";",
2801
+ "value": "import TabLinkItem from \"/src/components/menus/TabLinkItem.vue\";\n",
2802
+ "reason": "Bind app-owned shell tab link-item scaffold into local main client provider imports.",
2803
+ "category": "shell-web",
2804
+ "id": "shell-web-main-client-provider-tab-link-item-import"
2805
+ },
2806
+ {
2807
+ "op": "append-text",
2808
+ "file": "packages/main/src/client/providers/MainClientProvider.js",
2809
+ "position": "bottom",
2810
+ "skipIfContains": "registerMainClientComponent(\"local.main.ui.menu-link-item\", () => MenuLinkItem);",
2811
+ "value": "\nregisterMainClientComponent(\"local.main.ui.menu-link-item\", () => MenuLinkItem);\n",
2812
+ "reason": "Bind app-owned shell menu link-item token into local main client provider registry.",
2813
+ "category": "shell-web",
2814
+ "id": "shell-web-main-client-provider-menu-link-item-register"
2815
+ },
2816
+ {
2817
+ "op": "append-text",
2818
+ "file": "packages/main/src/client/providers/MainClientProvider.js",
2819
+ "position": "bottom",
2820
+ "skipIfContains": "registerMainClientComponent(\"local.main.ui.surface-aware-menu-link-item\", () => SurfaceAwareMenuLinkItem);",
2821
+ "value": "\nregisterMainClientComponent(\"local.main.ui.surface-aware-menu-link-item\", () => SurfaceAwareMenuLinkItem);\n",
2822
+ "reason": "Bind app-owned shell surface-aware menu link-item token into local main client provider registry.",
2823
+ "category": "shell-web",
2824
+ "id": "shell-web-main-client-provider-surface-aware-menu-link-item-register"
2825
+ },
2826
+ {
2827
+ "op": "append-text",
2828
+ "file": "packages/main/src/client/providers/MainClientProvider.js",
2829
+ "position": "bottom",
2830
+ "skipIfContains": "registerMainClientComponent(\"local.main.ui.tab-link-item\", () => TabLinkItem);",
2831
+ "value": "\nregisterMainClientComponent(\"local.main.ui.tab-link-item\", () => TabLinkItem);\n",
2832
+ "reason": "Bind app-owned shell tab link-item token into local main client provider registry.",
2833
+ "category": "shell-web",
2834
+ "id": "shell-web-main-client-provider-tab-link-item-register"
2835
+ }
2836
+ ],
2636
2837
  "files": [
2637
2838
  {
2638
2839
  "from": "templates/src/App.vue",
2639
2840
  "to": "src/App.vue",
2841
+ "ownership": "app",
2842
+ "expectedExistingFrom": "templates/expected-existing/src/App.vue",
2640
2843
  "reason": "Install full-width shell app root with shell-web error host and edge-to-edge layout.",
2641
2844
  "category": "shell-web",
2642
2845
  "id": "shell-web-app-root"
@@ -2644,13 +2847,39 @@
2644
2847
  {
2645
2848
  "from": "templates/src/components/ShellLayout.vue",
2646
2849
  "to": "src/components/ShellLayout.vue",
2850
+ "ownership": "app",
2647
2851
  "reason": "Install app-owned shell layout component so apps can customize structure and slots.",
2648
2852
  "category": "shell-web",
2649
2853
  "id": "shell-web-component-shell-layout"
2650
2854
  },
2855
+ {
2856
+ "from": "templates/src/components/menus/MenuLinkItem.vue",
2857
+ "to": "src/components/menus/MenuLinkItem.vue",
2858
+ "ownership": "app",
2859
+ "reason": "Install app-owned shell menu link-item scaffold for local placement customization.",
2860
+ "category": "shell-web",
2861
+ "id": "shell-web-component-menu-link-item"
2862
+ },
2863
+ {
2864
+ "from": "templates/src/components/menus/SurfaceAwareMenuLinkItem.vue",
2865
+ "to": "src/components/menus/SurfaceAwareMenuLinkItem.vue",
2866
+ "ownership": "app",
2867
+ "reason": "Install app-owned surface-aware shell menu link-item scaffold for local placement customization.",
2868
+ "category": "shell-web",
2869
+ "id": "shell-web-component-surface-aware-menu-link-item"
2870
+ },
2871
+ {
2872
+ "from": "templates/src/components/menus/TabLinkItem.vue",
2873
+ "to": "src/components/menus/TabLinkItem.vue",
2874
+ "ownership": "app",
2875
+ "reason": "Install app-owned shell tab link-item scaffold for local placement customization.",
2876
+ "category": "shell-web",
2877
+ "id": "shell-web-component-tab-link-item"
2878
+ },
2651
2879
  {
2652
2880
  "from": "templates/src/error.js",
2653
2881
  "to": "src/error.js",
2882
+ "ownership": "app",
2654
2883
  "reason": "Install app-owned error runtime policy and presenter config scaffold.",
2655
2884
  "category": "shell-web",
2656
2885
  "id": "shell-web-error-config"
@@ -2658,6 +2887,7 @@
2658
2887
  {
2659
2888
  "from": "templates/src/placement.js",
2660
2889
  "to": "src/placement.js",
2890
+ "ownership": "app",
2661
2891
  "reason": "Install app-owned placement registry scaffold used by shell-web placement runtime.",
2662
2892
  "category": "shell-web",
2663
2893
  "id": "shell-web-placement-registry"
@@ -2666,6 +2896,8 @@
2666
2896
  "from": "templates/src/pages/home.vue",
2667
2897
  "toSurface": "home",
2668
2898
  "toSurfaceRoot": true,
2899
+ "ownership": "app",
2900
+ "expectedExistingFrom": "templates/expected-existing/src/pages/home.vue",
2669
2901
  "reason": "Install shell-driven home wrapper page.",
2670
2902
  "category": "shell-web",
2671
2903
  "id": "shell-web-page-home-wrapper"
@@ -2674,6 +2906,8 @@
2674
2906
  "from": "templates/src/pages/home/index.vue",
2675
2907
  "toSurface": "home",
2676
2908
  "toSurfacePath": "index.vue",
2909
+ "ownership": "app",
2910
+ "expectedExistingFrom": "templates/expected-existing/src/pages/home/index.vue",
2677
2911
  "reason": "Install shell-driven home surface starter page.",
2678
2912
  "category": "shell-web",
2679
2913
  "id": "shell-web-page-home"
@@ -2682,6 +2916,7 @@
2682
2916
  "from": "templates/src/pages/home/settings.vue",
2683
2917
  "toSurface": "home",
2684
2918
  "toSurfacePath": "settings.vue",
2919
+ "ownership": "app",
2685
2920
  "reason": "Install shell-driven home settings shell route with section navigation.",
2686
2921
  "category": "shell-web",
2687
2922
  "id": "shell-web-page-home-settings-shell"
@@ -2690,25 +2925,10 @@
2690
2925
  "from": "templates/src/pages/home/settings/index.vue",
2691
2926
  "toSurface": "home",
2692
2927
  "toSurfacePath": "settings/index.vue",
2693
- "reason": "Install shell-driven home settings landing page scaffold.",
2928
+ "ownership": "app",
2929
+ "reason": "Install shell-driven home settings index stub scaffold for app-owned landing or redirect behavior.",
2694
2930
  "category": "shell-web",
2695
2931
  "id": "shell-web-page-home-settings"
2696
- },
2697
- {
2698
- "from": "templates/src/pages/console.vue",
2699
- "toSurface": "console",
2700
- "toSurfaceRoot": true,
2701
- "reason": "Install shell-driven console wrapper page.",
2702
- "category": "shell-web",
2703
- "id": "shell-web-page-console-wrapper"
2704
- },
2705
- {
2706
- "from": "templates/src/pages/console/index.vue",
2707
- "toSurface": "console",
2708
- "toSurfacePath": "index.vue",
2709
- "reason": "Install shell-driven console page starter.",
2710
- "category": "shell-web",
2711
- "id": "shell-web-page-console"
2712
2932
  }
2713
2933
  ]
2714
2934
  }
@@ -2716,11 +2936,11 @@
2716
2936
  },
2717
2937
  {
2718
2938
  "packageId": "@jskit-ai/storage-runtime",
2719
- "version": "0.1.32",
2939
+ "version": "0.1.34",
2720
2940
  "descriptor": {
2721
2941
  "packageVersion": 1,
2722
2942
  "packageId": "@jskit-ai/storage-runtime",
2723
- "version": "0.1.32",
2943
+ "version": "0.1.34",
2724
2944
  "kind": "runtime",
2725
2945
  "dependsOn": [
2726
2946
  "@jskit-ai/kernel"
@@ -2769,7 +2989,7 @@
2769
2989
  "mutations": {
2770
2990
  "dependencies": {
2771
2991
  "runtime": {
2772
- "@jskit-ai/kernel": "0.1.33",
2992
+ "@jskit-ai/kernel": "0.1.35",
2773
2993
  "unstorage": "^1.17.3"
2774
2994
  },
2775
2995
  "dev": {}
@@ -2785,11 +3005,11 @@
2785
3005
  },
2786
3006
  {
2787
3007
  "packageId": "@jskit-ai/ui-generator",
2788
- "version": "0.1.16",
3008
+ "version": "0.1.18",
2789
3009
  "descriptor": {
2790
3010
  "packageVersion": 1,
2791
3011
  "packageId": "@jskit-ai/ui-generator",
2792
- "version": "0.1.16",
3012
+ "version": "0.1.18",
2793
3013
  "kind": "generator",
2794
3014
  "description": "Create non-CRUD pages, reusable UI elements, and subpage hosts.",
2795
3015
  "options": {
@@ -2827,14 +3047,14 @@
2827
3047
  "inputType": "text",
2828
3048
  "defaultValue": "",
2829
3049
  "promptLabel": "Placement target",
2830
- "promptHint": "Optional host:position target for placed-element placement (defaults to shell-layout:top-right)."
3050
+ "promptHint": "Optional target for placed-element placement (format: host:position, default: shell-layout:top-right)."
2831
3051
  },
2832
3052
  "link-placement": {
2833
3053
  "required": false,
2834
3054
  "inputType": "text",
2835
3055
  "defaultValue": "",
2836
3056
  "promptLabel": "Link placement",
2837
- "promptHint": "Optional host:position target for the generated page link placement."
3057
+ "promptHint": "Optional target for the generated page link placement (format: host:position)."
2838
3058
  },
2839
3059
  "link-component-token": {
2840
3060
  "required": false,
@@ -2848,14 +3068,14 @@
2848
3068
  "inputType": "text",
2849
3069
  "defaultValue": "",
2850
3070
  "promptLabel": "Link to",
2851
- "promptHint": "Optional explicit props.to value for the generated page link placement (example: ./notes). If omitted for pages under a detected parent subpages host, it is inferred from the page path."
3071
+ "promptHint": "Optional explicit props.to value for the generated page link placement (example: ./notes). If omitted for pages under a detected parent subpages target, it is inferred from the page path."
2852
3072
  },
2853
3073
  "target": {
2854
3074
  "required": false,
2855
3075
  "inputType": "text",
2856
3076
  "defaultValue": "",
2857
3077
  "promptLabel": "Outlet target",
2858
- "promptHint": "Used by add-subpages and outlet. Accepts host or host:position. If only host is given, position defaults to sub-pages."
3078
+ "promptHint": "Used by add-subpages and outlet. Must be a target in host:position format."
2859
3079
  },
2860
3080
  "title": {
2861
3081
  "required": false,
@@ -2891,13 +3111,14 @@
2891
3111
  "generatorPrimarySubcommand": "page",
2892
3112
  "generatorSubcommands": {
2893
3113
  "page": {
3114
+ "requiresShellWeb": true,
2894
3115
  "entrypoint": "src/server/subcommands/page.js",
2895
3116
  "export": "runGeneratorSubcommand",
2896
3117
  "description": "Create a route page at an explicit target file and add a link placement entry for it.",
2897
3118
  "longDescription": [
2898
3119
  "This command always creates one route page file. By default, its page link is placed from the page path itself.",
2899
- "If an ancestor page has already been enhanced with sub-pages, JSKIT treats that ancestor as the real host. In that case the new page is linked into the nearest parent sub-pages outlet instead of the shell menu.",
2900
- "That means the generated link normally becomes a tab or child-page link under that ancestor host, and `props.to` is inferred relative to that host. If the host page is `index.vue`, child pages belong under `index/...` so the router keeps the parent page visible while the child route renders underneath it."
3120
+ "If an ancestor page has already been enhanced with sub-pages, JSKIT treats that ancestor outlet as the real placement target. In that case the new page is linked into the nearest parent sub-pages outlet instead of the shell menu.",
3121
+ "That means the generated link normally becomes a tab or child-page link under that ancestor target, and `props.to` is inferred relative to that target. If the outlet page is `index.vue`, child pages belong under `index/...` so the router keeps the parent page visible while the child route renders underneath it."
2901
3122
  ],
2902
3123
  "positionalArgs": [
2903
3124
  {
@@ -2914,8 +3135,8 @@
2914
3135
  "force"
2915
3136
  ],
2916
3137
  "notes": [
2917
- "If a nearest parent subpages host is found, placement, link component token, and props.to are inferred automatically.",
2918
- "If the parent host page is index.vue, child pages belong under index/...",
3138
+ "If a nearest parent subpages target is found, placement, link component token, and props.to are inferred automatically.",
3139
+ "If the parent target page is index.vue, child pages belong under index/...",
2919
3140
  "If the target page file already exists, rerun with --force to overwrite it."
2920
3141
  ],
2921
3142
  "examples": [
@@ -2939,6 +3160,7 @@
2939
3160
  ]
2940
3161
  },
2941
3162
  "placed-element": {
3163
+ "requiresShellWeb": true,
2942
3164
  "entrypoint": "src/server/subcommands/element.js",
2943
3165
  "export": "runGeneratorSubcommand",
2944
3166
  "description": "Create a Vue component file under the chosen component directory (default: src/components) and add a placement entry that renders it.",
@@ -2980,6 +3202,7 @@
2980
3202
  ]
2981
3203
  },
2982
3204
  "add-subpages": {
3205
+ "requiresShellWeb": true,
2983
3206
  "entrypoint": "src/server/subcommands/addSubpages.js",
2984
3207
  "export": "runGeneratorSubcommand",
2985
3208
  "description": "Upgrade an existing page into a routed subpage host with SectionContainerShell, ShellOutlet, and RouterView.",
@@ -2998,7 +3221,7 @@
2998
3221
  ],
2999
3222
  "notes": [
3000
3223
  "Use this when the page should render shared content plus child routes below it.",
3001
- "If the host page is index.vue, create child pages under index/..."
3224
+ "If the outlet page is index.vue, create child pages under index/..."
3002
3225
  ],
3003
3226
  "examples": [
3004
3227
  {
@@ -3024,13 +3247,14 @@
3024
3247
  ]
3025
3248
  },
3026
3249
  "outlet": {
3250
+ "requiresShellWeb": true,
3027
3251
  "entrypoint": "src/server/subcommands/outlet.js",
3028
3252
  "export": "runGeneratorSubcommand",
3029
3253
  "description": "Inject a generic ShellOutlet block into an existing Vue page/component.",
3030
3254
  "longDescription": [
3031
3255
  "A ShellOutlet creates a named placement target inside a Vue file. That target is what other parts of JSKIT render into later.",
3032
- "After an outlet exists, `jskit list-placements` will discover it and show it as `host:position`. That makes the target visible to humans and to generators that need a placement destination.",
3033
- "Commands that create placed UI, such as `ui-generator placed-element`, and commands that add page links can then target that outlet by writing placement entries that point at the same `host:position`."
3256
+ "After an outlet exists, `jskit list-placements` will discover it and show its `target`. That makes the outlet visible to humans and to generators that need a placement destination.",
3257
+ "Commands that create placed UI, such as `ui-generator placed-element`, and commands that add page links can then target that outlet by writing placement entries that point at the same target."
3034
3258
  ],
3035
3259
  "positionalArgs": [
3036
3260
  {
@@ -3046,7 +3270,7 @@
3046
3270
  "target"
3047
3271
  ],
3048
3272
  "notes": [
3049
- "Use --target host or --target host:position. If only host is given, position defaults to sub-pages."
3273
+ "Use --target host:position."
3050
3274
  ],
3051
3275
  "examples": [
3052
3276
  {
@@ -3054,7 +3278,7 @@
3054
3278
  "lines": [
3055
3279
  "npx jskit generate ui-generator outlet \\",
3056
3280
  " src/components/ContactSummaryCard.vue \\",
3057
- " --target contact-view"
3281
+ " --target contact-view:sub-pages"
3058
3282
  ]
3059
3283
  },
3060
3284
  {
@@ -3084,7 +3308,7 @@
3084
3308
  "mutations": {
3085
3309
  "dependencies": {
3086
3310
  "runtime": {
3087
- "@jskit-ai/users-web": "0.1.48"
3311
+ "@jskit-ai/users-web": "0.1.50"
3088
3312
  },
3089
3313
  "dev": {}
3090
3314
  },
@@ -3099,11 +3323,11 @@
3099
3323
  },
3100
3324
  {
3101
3325
  "packageId": "@jskit-ai/uploads-image-web",
3102
- "version": "0.1.11",
3326
+ "version": "0.1.13",
3103
3327
  "descriptor": {
3104
3328
  "packageVersion": 1,
3105
3329
  "packageId": "@jskit-ai/uploads-image-web",
3106
- "version": "0.1.11",
3330
+ "version": "0.1.13",
3107
3331
  "kind": "runtime",
3108
3332
  "description": "Reusable client-side image upload runtime with pre-upload image editing.",
3109
3333
  "dependsOn": [
@@ -3167,7 +3391,7 @@
3167
3391
  "mutations": {
3168
3392
  "dependencies": {
3169
3393
  "runtime": {
3170
- "@jskit-ai/uploads-runtime": "0.1.11",
3394
+ "@jskit-ai/uploads-runtime": "0.1.13",
3171
3395
  "@uppy/compressor": "^3.1.0",
3172
3396
  "@uppy/core": "^5.2.0",
3173
3397
  "@uppy/dashboard": "^5.1.1",
@@ -3187,11 +3411,11 @@
3187
3411
  },
3188
3412
  {
3189
3413
  "packageId": "@jskit-ai/uploads-runtime",
3190
- "version": "0.1.11",
3414
+ "version": "0.1.13",
3191
3415
  "descriptor": {
3192
3416
  "packageVersion": 1,
3193
3417
  "packageId": "@jskit-ai/uploads-runtime",
3194
- "version": "0.1.11",
3418
+ "version": "0.1.13",
3195
3419
  "kind": "runtime",
3196
3420
  "description": "Reusable upload runtime primitives for multipart parsing, policy validation, and blob storage.",
3197
3421
  "dependsOn": [
@@ -3261,7 +3485,7 @@
3261
3485
  "dependencies": {
3262
3486
  "runtime": {
3263
3487
  "@fastify/multipart": "^9.4.0",
3264
- "@jskit-ai/kernel": "0.1.33"
3488
+ "@jskit-ai/kernel": "0.1.35"
3265
3489
  },
3266
3490
  "dev": {}
3267
3491
  },
@@ -3276,11 +3500,11 @@
3276
3500
  },
3277
3501
  {
3278
3502
  "packageId": "@jskit-ai/users-core",
3279
- "version": "0.1.43",
3503
+ "version": "0.1.45",
3280
3504
  "descriptor": {
3281
3505
  "packageVersion": 1,
3282
3506
  "packageId": "@jskit-ai/users-core",
3283
- "version": "0.1.43",
3507
+ "version": "0.1.45",
3284
3508
  "kind": "runtime",
3285
3509
  "description": "Users/account runtime plus HTTP routes for account and console features.",
3286
3510
  "dependsOn": [
@@ -3416,11 +3640,11 @@
3416
3640
  "mutations": {
3417
3641
  "dependencies": {
3418
3642
  "runtime": {
3419
- "@jskit-ai/auth-core": "0.1.32",
3420
- "@jskit-ai/database-runtime": "0.1.33",
3421
- "@jskit-ai/http-runtime": "0.1.32",
3422
- "@jskit-ai/kernel": "0.1.33",
3423
- "@jskit-ai/uploads-runtime": "0.1.11",
3643
+ "@jskit-ai/auth-core": "0.1.34",
3644
+ "@jskit-ai/database-runtime": "0.1.35",
3645
+ "@jskit-ai/http-runtime": "0.1.34",
3646
+ "@jskit-ai/kernel": "0.1.35",
3647
+ "@jskit-ai/uploads-runtime": "0.1.13",
3424
3648
  "@fastify/type-provider-typebox": "^6.1.0",
3425
3649
  "typebox": "^1.0.81"
3426
3650
  },
@@ -3531,14 +3755,16 @@
3531
3755
  },
3532
3756
  {
3533
3757
  "packageId": "@jskit-ai/users-web",
3534
- "version": "0.1.48",
3758
+ "version": "0.1.50",
3535
3759
  "descriptor": {
3536
3760
  "packageVersion": 1,
3537
3761
  "packageId": "@jskit-ai/users-web",
3538
- "version": "0.1.48",
3762
+ "version": "0.1.50",
3539
3763
  "kind": "runtime",
3540
- "description": "Users web module: account/profile UI plus shared shell link components.",
3764
+ "description": "Users web module: account/profile UI plus shared users web widgets.",
3541
3765
  "dependsOn": [
3766
+ "@jskit-ai/auth-web",
3767
+ "@jskit-ai/console-web",
3542
3768
  "@jskit-ai/http-runtime",
3543
3769
  "@jskit-ai/shell-web",
3544
3770
  "@jskit-ai/uploads-image-web",
@@ -3581,14 +3807,6 @@
3581
3807
  "subpath": "./client/components/ProfileClientElement",
3582
3808
  "summary": "Exports profile settings client element scaffold component."
3583
3809
  },
3584
- {
3585
- "subpath": "./client/components/ConsoleSettingsClientElement",
3586
- "summary": "Exports console settings landing-page client element."
3587
- },
3588
- {
3589
- "subpath": "./client/components/WorkspaceSettingsClientElement",
3590
- "summary": "Exports workspace settings client element."
3591
- },
3592
3810
  {
3593
3811
  "subpath": "./client/composables/useAddEdit",
3594
3812
  "summary": "Exports add/edit operation composable."
@@ -3629,9 +3847,8 @@
3629
3847
  "containerTokens": {
3630
3848
  "server": [],
3631
3849
  "client": [
3632
- "users.web.shell.menu-link-item",
3633
- "users.web.shell.surface-aware-menu-link-item",
3634
3850
  "users.web.profile.menu.surface-switch-item",
3851
+ "users.web.home.tools.widget",
3635
3852
  "users.web.profile.element",
3636
3853
  "users.web.bootstrap-placement.runtime"
3637
3854
  ]
@@ -3641,8 +3858,24 @@
3641
3858
  "placements": {
3642
3859
  "outlets": [
3643
3860
  {
3644
- "host": "console-settings",
3645
- "position": "primary-menu",
3861
+ "target": "home-tools:primary-menu",
3862
+ "defaultLinkComponentToken": "local.main.ui.surface-aware-menu-link-item",
3863
+ "surfaces": [
3864
+ "home"
3865
+ ],
3866
+ "source": "src/client/components/UsersHomeToolsWidget.vue"
3867
+ },
3868
+ {
3869
+ "target": "workspace-tools:primary-menu",
3870
+ "defaultLinkComponentToken": "local.main.ui.surface-aware-menu-link-item",
3871
+ "surfaces": [
3872
+ "admin"
3873
+ ],
3874
+ "source": "src/client/components/UsersWorkspaceToolsWidget.vue"
3875
+ },
3876
+ {
3877
+ "target": "console-settings:primary-menu",
3878
+ "defaultLinkComponentToken": "local.main.ui.surface-aware-menu-link-item",
3646
3879
  "surfaces": [
3647
3880
  "console"
3648
3881
  ],
@@ -3652,8 +3885,7 @@
3652
3885
  "contributions": [
3653
3886
  {
3654
3887
  "id": "users.profile.menu.surface-switch",
3655
- "host": "auth-profile-menu",
3656
- "position": "primary-menu",
3888
+ "target": "auth-profile-menu:primary-menu",
3657
3889
  "surfaces": [
3658
3890
  "*"
3659
3891
  ],
@@ -3664,27 +3896,58 @@
3664
3896
  },
3665
3897
  {
3666
3898
  "id": "users.profile.menu.settings",
3667
- "host": "auth-profile-menu",
3668
- "position": "primary-menu",
3899
+ "target": "auth-profile-menu:primary-menu",
3669
3900
  "surfaces": [
3670
3901
  "*"
3671
3902
  ],
3672
3903
  "order": 500,
3673
- "componentToken": "users.web.shell.menu-link-item",
3904
+ "componentToken": "auth.web.profile.menu.link-item",
3674
3905
  "when": "auth.authenticated === true",
3675
3906
  "source": "mutations.text#users-web-profile-settings-placement"
3676
3907
  },
3908
+ {
3909
+ "id": "users.home.menu.home",
3910
+ "target": "shell-layout:primary-menu",
3911
+ "surfaces": [
3912
+ "*"
3913
+ ],
3914
+ "order": 50,
3915
+ "componentToken": "local.main.ui.surface-aware-menu-link-item",
3916
+ "when": "auth.authenticated === true",
3917
+ "source": "mutations.text#users-web-home-shell-menu-placement"
3918
+ },
3677
3919
  {
3678
3920
  "id": "users.console.menu.settings",
3679
- "host": "shell-layout",
3680
- "position": "primary-menu",
3921
+ "target": "shell-layout:primary-menu",
3681
3922
  "surfaces": [
3682
3923
  "console"
3683
3924
  ],
3684
3925
  "order": 100,
3685
- "componentToken": "users.web.shell.menu-link-item",
3926
+ "componentToken": "local.main.ui.menu-link-item",
3686
3927
  "when": "auth.authenticated === true",
3687
3928
  "source": "mutations.text#users-web-console-settings-placement"
3929
+ },
3930
+ {
3931
+ "id": "users.home.tools.widget",
3932
+ "target": "shell-layout:top-right",
3933
+ "surfaces": [
3934
+ "home"
3935
+ ],
3936
+ "order": 900,
3937
+ "componentToken": "users.web.home.tools.widget",
3938
+ "when": "auth.authenticated === true",
3939
+ "source": "mutations.text#users-web-home-tools-placement"
3940
+ },
3941
+ {
3942
+ "id": "users.home.menu.settings",
3943
+ "target": "home-tools:primary-menu",
3944
+ "surfaces": [
3945
+ "home"
3946
+ ],
3947
+ "order": 100,
3948
+ "componentToken": "local.main.ui.surface-aware-menu-link-item",
3949
+ "when": "auth.authenticated === true",
3950
+ "source": "mutations.text#users-web-home-tools-placement"
3688
3951
  }
3689
3952
  ]
3690
3953
  }
@@ -3695,12 +3958,13 @@
3695
3958
  "runtime": {
3696
3959
  "@tanstack/vue-query": "5.92.12",
3697
3960
  "@mdi/js": "^7.4.47",
3698
- "@jskit-ai/http-runtime": "0.1.32",
3699
- "@jskit-ai/realtime": "0.1.32",
3700
- "@jskit-ai/kernel": "0.1.33",
3701
- "@jskit-ai/shell-web": "0.1.32",
3702
- "@jskit-ai/uploads-image-web": "0.1.11",
3703
- "@jskit-ai/users-core": "0.1.43",
3961
+ "@jskit-ai/console-web": "0.1.2",
3962
+ "@jskit-ai/http-runtime": "0.1.34",
3963
+ "@jskit-ai/realtime": "0.1.34",
3964
+ "@jskit-ai/kernel": "0.1.35",
3965
+ "@jskit-ai/shell-web": "0.1.34",
3966
+ "@jskit-ai/uploads-image-web": "0.1.13",
3967
+ "@jskit-ai/users-core": "0.1.45",
3704
3968
  "vuetify": "^4.0.0"
3705
3969
  },
3706
3970
  "dev": {}
@@ -3768,7 +4032,7 @@
3768
4032
  "from": "templates/src/pages/console/settings/index.vue",
3769
4033
  "toSurface": "console",
3770
4034
  "toSurfacePath": "settings/index.vue",
3771
- "reason": "Install console settings landing page scaffold for users-web console UI.",
4035
+ "reason": "Install console settings index stub scaffold for app-owned landing or redirect behavior.",
3772
4036
  "category": "users-web",
3773
4037
  "id": "users-web-page-console-settings"
3774
4038
  }
@@ -3789,7 +4053,7 @@
3789
4053
  "file": "src/placement.js",
3790
4054
  "position": "bottom",
3791
4055
  "skipIfContains": "id: \"users.profile.menu.surface-switch\"",
3792
- "value": "\naddPlacement({\n id: \"users.profile.menu.surface-switch\",\n host: \"auth-profile-menu\",\n position: \"primary-menu\",\n surfaces: [\"*\"],\n order: 100,\n componentToken: \"users.web.profile.menu.surface-switch-item\",\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n",
4056
+ "value": "\naddPlacement({\n id: \"users.profile.menu.surface-switch\",\n target: \"auth-profile-menu:primary-menu\",\n surfaces: [\"*\"],\n order: 100,\n componentToken: \"users.web.profile.menu.surface-switch-item\",\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n",
3793
4057
  "reason": "Append users-web profile surface switch placement into app-owned placement registry.",
3794
4058
  "category": "users-web",
3795
4059
  "id": "users-web-profile-surface-switch-placement"
@@ -3799,20 +4063,40 @@
3799
4063
  "file": "src/placement.js",
3800
4064
  "position": "bottom",
3801
4065
  "skipIfContains": "id: \"users.profile.menu.settings\"",
3802
- "value": "\naddPlacement({\n id: \"users.profile.menu.settings\",\n host: \"auth-profile-menu\",\n position: \"primary-menu\",\n surfaces: [\"*\"],\n order: 500,\n componentToken: \"users.web.shell.menu-link-item\",\n props: {\n label: \"Settings\",\n to: \"/account\"\n },\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n",
4066
+ "value": "\naddPlacement({\n id: \"users.profile.menu.settings\",\n target: \"auth-profile-menu:primary-menu\",\n surfaces: [\"*\"],\n order: 500,\n componentToken: \"auth.web.profile.menu.link-item\",\n props: {\n label: \"Settings\",\n to: \"/account\"\n },\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n",
3803
4067
  "reason": "Append users-web profile settings menu placement into app-owned placement registry.",
3804
4068
  "category": "users-web",
3805
4069
  "id": "users-web-profile-settings-placement"
3806
4070
  },
4071
+ {
4072
+ "op": "append-text",
4073
+ "file": "src/placement.js",
4074
+ "position": "bottom",
4075
+ "skipIfContains": "id: \"users.home.menu.home\"",
4076
+ "value": "\naddPlacement({\n id: \"users.home.menu.home\",\n target: \"shell-layout:primary-menu\",\n surfaces: [\"*\"],\n order: 50,\n componentToken: \"local.main.ui.surface-aware-menu-link-item\",\n props: {\n label: \"Home\",\n surface: \"home\",\n workspaceSuffix: \"/\",\n nonWorkspaceSuffix: \"/\",\n exact: true\n },\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n",
4077
+ "reason": "Append users-web home shell menu placement into app-owned placement registry.",
4078
+ "category": "users-web",
4079
+ "id": "users-web-home-shell-menu-placement"
4080
+ },
3807
4081
  {
3808
4082
  "op": "append-text",
3809
4083
  "file": "src/placement.js",
3810
4084
  "position": "bottom",
3811
4085
  "skipIfContains": "id: \"users.console.menu.settings\"",
3812
- "value": "\naddPlacement({\n id: \"users.console.menu.settings\",\n host: \"shell-layout\",\n position: \"primary-menu\",\n surfaces: [\"console\"],\n order: 100,\n componentToken: \"users.web.shell.menu-link-item\",\n props: {\n label: \"Settings\",\n to: \"/console/settings\",\n icon: \"mdi-cog-outline\"\n },\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n",
4086
+ "value": "\naddPlacement({\n id: \"users.console.menu.settings\",\n target: \"shell-layout:primary-menu\",\n surfaces: [\"console\"],\n order: 100,\n componentToken: \"local.main.ui.menu-link-item\",\n props: {\n label: \"Settings\",\n to: \"/console/settings\",\n icon: \"mdi-cog-outline\"\n },\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n",
3813
4087
  "reason": "Append users-web console settings menu placement into app-owned placement registry.",
3814
4088
  "category": "users-web",
3815
4089
  "id": "users-web-console-settings-placement"
4090
+ },
4091
+ {
4092
+ "op": "append-text",
4093
+ "file": "src/placement.js",
4094
+ "position": "bottom",
4095
+ "skipIfContains": "id: \"users.home.tools.widget\"",
4096
+ "value": "\naddPlacement({\n id: \"users.home.tools.widget\",\n target: \"shell-layout:top-right\",\n surfaces: [\"home\"],\n order: 900,\n componentToken: \"users.web.home.tools.widget\",\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n\naddPlacement({\n id: \"users.home.menu.settings\",\n target: \"home-tools:primary-menu\",\n surfaces: [\"home\"],\n order: 100,\n componentToken: \"local.main.ui.surface-aware-menu-link-item\",\n props: {\n label: \"Settings\",\n surface: \"home\",\n workspaceSuffix: \"/settings\",\n nonWorkspaceSuffix: \"/settings\"\n },\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n",
4097
+ "reason": "Append users-web home tools widget and settings menu placements into app-owned placement registry.",
4098
+ "category": "users-web",
4099
+ "id": "users-web-home-tools-placement"
3816
4100
  }
3817
4101
  ]
3818
4102
  }
@@ -3820,11 +4104,11 @@
3820
4104
  },
3821
4105
  {
3822
4106
  "packageId": "@jskit-ai/workspaces-core",
3823
- "version": "0.1.9",
4107
+ "version": "0.1.11",
3824
4108
  "descriptor": {
3825
4109
  "packageVersion": 1,
3826
4110
  "packageId": "@jskit-ai/workspaces-core",
3827
- "version": "0.1.9",
4111
+ "version": "0.1.11",
3828
4112
  "kind": "runtime",
3829
4113
  "description": "Workspace tenancy runtime plus HTTP routes, role catalog, and workspace config scaffolding.",
3830
4114
  "dependsOn": [
@@ -3933,7 +4217,7 @@
3933
4217
  "mutations": {
3934
4218
  "dependencies": {
3935
4219
  "runtime": {
3936
- "@jskit-ai/users-core": "0.1.43"
4220
+ "@jskit-ai/users-core": "0.1.45"
3937
4221
  },
3938
4222
  "dev": {}
3939
4223
  },
@@ -4123,11 +4407,11 @@
4123
4407
  },
4124
4408
  {
4125
4409
  "packageId": "@jskit-ai/workspaces-web",
4126
- "version": "0.1.9",
4410
+ "version": "0.1.11",
4127
4411
  "descriptor": {
4128
4412
  "packageVersion": 1,
4129
4413
  "packageId": "@jskit-ai/workspaces-web",
4130
- "version": "0.1.9",
4414
+ "version": "0.1.11",
4131
4415
  "kind": "runtime",
4132
4416
  "description": "Workspace web module: workspace selector, tools widget, workspace surfaces, and members/settings UI.",
4133
4417
  "dependsOn": [
@@ -4171,8 +4455,7 @@
4171
4455
  "users.web.workspace.tools.widget",
4172
4456
  "users.web.workspace-settings.menu-item",
4173
4457
  "users.web.workspace-members.menu-item",
4174
- "users.web.members-admin.element",
4175
- "users.web.workspace-settings.element"
4458
+ "users.web.members-admin.element"
4176
4459
  ]
4177
4460
  }
4178
4461
  },
@@ -4180,8 +4463,8 @@
4180
4463
  "placements": {
4181
4464
  "outlets": [
4182
4465
  {
4183
- "host": "admin-settings",
4184
- "position": "primary-menu",
4466
+ "target": "admin-settings:primary-menu",
4467
+ "defaultLinkComponentToken": "local.main.ui.surface-aware-menu-link-item",
4185
4468
  "surfaces": [
4186
4469
  "admin"
4187
4470
  ],
@@ -4191,8 +4474,7 @@
4191
4474
  "contributions": [
4192
4475
  {
4193
4476
  "id": "users.workspace.selector",
4194
- "host": "shell-layout",
4195
- "position": "top-left",
4477
+ "target": "shell-layout:top-left",
4196
4478
  "surfaces": [
4197
4479
  "*"
4198
4480
  ],
@@ -4203,8 +4485,7 @@
4203
4485
  },
4204
4486
  {
4205
4487
  "id": "users.account.invites.cue",
4206
- "host": "shell-layout",
4207
- "position": "top-right",
4488
+ "target": "shell-layout:top-right",
4208
4489
  "surfaces": [
4209
4490
  "*"
4210
4491
  ],
@@ -4215,8 +4496,7 @@
4215
4496
  },
4216
4497
  {
4217
4498
  "id": "users.workspace.tools.widget",
4218
- "host": "shell-layout",
4219
- "position": "top-right",
4499
+ "target": "shell-layout:top-right",
4220
4500
  "surfaces": [
4221
4501
  "admin"
4222
4502
  ],
@@ -4226,8 +4506,7 @@
4226
4506
  },
4227
4507
  {
4228
4508
  "id": "users.workspace.menu.workspace-settings",
4229
- "host": "workspace-tools",
4230
- "position": "primary-menu",
4509
+ "target": "workspace-tools:primary-menu",
4231
4510
  "surfaces": [
4232
4511
  "admin"
4233
4512
  ],
@@ -4237,25 +4516,13 @@
4237
4516
  },
4238
4517
  {
4239
4518
  "id": "users.workspace.menu.members",
4240
- "host": "workspace-tools",
4241
- "position": "primary-menu",
4519
+ "target": "workspace-tools:primary-menu",
4242
4520
  "surfaces": [
4243
4521
  "admin"
4244
4522
  ],
4245
4523
  "order": 200,
4246
4524
  "componentToken": "users.web.workspace-members.menu-item",
4247
4525
  "source": "mutations.text#users-web-placement-block"
4248
- },
4249
- {
4250
- "id": "users.workspace.settings.general",
4251
- "host": "admin-settings",
4252
- "position": "primary-menu",
4253
- "surfaces": [
4254
- "admin"
4255
- ],
4256
- "order": 100,
4257
- "componentToken": "users.web.shell.surface-aware-menu-link-item",
4258
- "source": "mutations.text#users-web-workspace-settings-general-placement"
4259
4526
  }
4260
4527
  ]
4261
4528
  }
@@ -4264,8 +4531,8 @@
4264
4531
  "mutations": {
4265
4532
  "dependencies": {
4266
4533
  "runtime": {
4267
- "@jskit-ai/workspaces-core": "0.1.9",
4268
- "@jskit-ai/users-web": "0.1.48"
4534
+ "@jskit-ai/workspaces-core": "0.1.11",
4535
+ "@jskit-ai/users-web": "0.1.50"
4269
4536
  },
4270
4537
  "dev": {}
4271
4538
  },
@@ -4408,7 +4675,7 @@
4408
4675
  "from": "templates/src/pages/admin/workspace/settings/index.vue",
4409
4676
  "toSurface": "admin",
4410
4677
  "toSurfacePath": "workspace/settings/index.vue",
4411
- "reason": "Install workspace settings landing page scaffold for workspaces-web workspace admin UI.",
4678
+ "reason": "Install workspace settings index stub scaffold for app-owned landing or redirect behavior.",
4412
4679
  "category": "workspaces-web",
4413
4680
  "id": "users-web-page-admin-workspace-settings",
4414
4681
  "when": {
@@ -4426,7 +4693,7 @@
4426
4693
  "file": "src/placement.js",
4427
4694
  "position": "bottom",
4428
4695
  "skipIfContains": "id: \"users.workspace.selector\"",
4429
- "value": "\naddPlacement({\n id: \"users.workspace.selector\",\n host: \"shell-layout\",\n position: \"top-left\",\n surfaces: [\"*\"],\n order: 200,\n componentToken: \"users.web.workspace.selector\",\n props: {\n allowOnNonWorkspaceSurface: true,\n targetSurfaceId: \"app\"\n },\n when: ({ auth }) => {\n return Boolean(auth?.authenticated);\n }\n});\n\naddPlacement({\n id: \"users.account.invites.cue\",\n host: \"shell-layout\",\n position: \"top-right\",\n surfaces: [\"*\"],\n order: 850,\n componentToken: \"local.main.account.pending-invites.cue\",\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n\naddPlacement({\n id: \"users.workspace.tools.widget\",\n host: \"shell-layout\",\n position: \"top-right\",\n surfaces: [\"admin\"],\n order: 900,\n componentToken: \"users.web.workspace.tools.widget\"\n});\n\naddPlacement({\n id: \"users.workspace.menu.workspace-settings\",\n host: \"workspace-tools\",\n position: \"primary-menu\",\n surfaces: [\"admin\"],\n order: 100,\n componentToken: \"users.web.workspace-settings.menu-item\"\n});\n\naddPlacement({\n id: \"users.workspace.menu.members\",\n host: \"workspace-tools\",\n position: \"primary-menu\",\n surfaces: [\"admin\"],\n order: 200,\n componentToken: \"users.web.workspace-members.menu-item\"\n});\n",
4696
+ "value": "\naddPlacement({\n id: \"users.workspace.selector\",\n target: \"shell-layout:top-left\",\n surfaces: [\"*\"],\n order: 200,\n componentToken: \"users.web.workspace.selector\",\n props: {\n allowOnNonWorkspaceSurface: true,\n targetSurfaceId: \"app\"\n },\n when: ({ auth }) => {\n return Boolean(auth?.authenticated);\n }\n});\n\naddPlacement({\n id: \"users.account.invites.cue\",\n target: \"shell-layout:top-right\",\n surfaces: [\"*\"],\n order: 850,\n componentToken: \"local.main.account.pending-invites.cue\",\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n\naddPlacement({\n id: \"users.workspace.tools.widget\",\n target: \"shell-layout:top-right\",\n surfaces: [\"admin\"],\n order: 900,\n componentToken: \"users.web.workspace.tools.widget\"\n});\n\naddPlacement({\n id: \"users.workspace.menu.workspace-settings\",\n target: \"workspace-tools:primary-menu\",\n surfaces: [\"admin\"],\n order: 100,\n componentToken: \"users.web.workspace-settings.menu-item\"\n});\n\naddPlacement({\n id: \"users.workspace.menu.members\",\n target: \"workspace-tools:primary-menu\",\n surfaces: [\"admin\"],\n order: 200,\n componentToken: \"users.web.workspace-members.menu-item\"\n});\n",
4430
4697
  "reason": "Append workspace placement entries into app-owned placement registry.",
4431
4698
  "category": "workspaces-web",
4432
4699
  "id": "users-web-placement-block",
@@ -4457,23 +4724,6 @@
4457
4724
  "reason": "Bind app-owned account pending invites cue component token into local main client provider registry.",
4458
4725
  "category": "workspaces-web",
4459
4726
  "id": "users-web-main-client-provider-account-invites-register"
4460
- },
4461
- {
4462
- "op": "append-text",
4463
- "file": "src/placement.js",
4464
- "position": "bottom",
4465
- "skipIfContains": "id: \"users.workspace.settings.general\"",
4466
- "value": "\naddPlacement({\n id: \"users.workspace.settings.general\",\n host: \"admin-settings\",\n position: \"primary-menu\",\n surfaces: [\"admin\"],\n order: 100,\n componentToken: \"users.web.shell.surface-aware-menu-link-item\",\n props: {\n label: \"General\",\n surface: \"admin\",\n workspaceSuffix: \"/workspace/settings\",\n nonWorkspaceSuffix: \"/workspace/settings\"\n },\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n",
4467
- "reason": "Append workspace settings general-page placement into app-owned placement registry.",
4468
- "category": "workspaces-web",
4469
- "id": "users-web-workspace-settings-general-placement",
4470
- "when": {
4471
- "config": "tenancyMode",
4472
- "in": [
4473
- "personal",
4474
- "workspaces"
4475
- ]
4476
- }
4477
4727
  }
4478
4728
  ]
4479
4729
  }